Codebase list libvpx / 558165f
Update upstream source from tag 'upstream/1.10.0' Update to upstream version '1.10.0' with Debian dir 5583d8988553e0dc02f5066a827764ba75d48f44 Sebastian Ramacher 2 years ago
158 changed file(s) with 5191 addition(s) and 5563 deletion(s). Raw diff Collapse all Expand all
1111 Elliott Karpilovsky <elliottk@google.com>
1212 Erik Niemeyer <erik.a.niemeyer@intel.com> <erik.a.niemeyer@gmail.com>
1313 Fyodor Kyslov <kyslov@google.com>
14 Gregor Jasny <gjasny@gmail.com>
15 Gregor Jasny <gjasny@gmail.com> <gjasny@googlemail.com>
1416 Guillaume Martres <gmartres@google.com> <smarter3@gmail.com>
1517 Hangyu Kuang <hkuang@google.com>
1618 Hui Su <huisu@google.com>
3636 Clement Courbet <courbet@google.com>
3737 Daniele Castagna <dcastagna@chromium.org>
3838 Daniel Kang <ddkang@google.com>
39 Daniel Sommermann <dcsommer@gmail.com>
3940 Dan Zhu <zxdan@google.com>
4041 Deb Mukherjee <debargha@google.com>
4142 Deepa K G <deepa.kg@ittiam.com>
7273 Jacek Caban <cjacek@gmail.com>
7374 Jacky Chen <jackychen@google.com>
7475 James Berry <jamesberry@google.com>
76 James Touton <bekenn@gmail.com>
7577 James Yu <james.yu@linaro.org>
7678 James Zern <jzern@google.com>
7779 Jan Gerber <j@mailb.org>
8183 Jeff Faust <jfaust@google.com>
8284 Jeff Muizelaar <jmuizelaar@mozilla.com>
8385 Jeff Petkau <jpet@chromium.org>
86 Jeremy Leconte <jleconte@google.com>
8487 Jerome Jiang <jianj@google.com>
8588 Jia Jia <jia.jia@linaro.org>
8689 Jian Zhou <zhoujian@google.com>
8790 Jim Bankoski <jimbankoski@google.com>
91 jinbo <jinbo-hf@loongson.cn>
8892 Jingning Han <jingning@google.com>
93 Joel Fernandes <joelaf@google.com>
8994 Joey Parrish <joeyparrish@google.com>
9095 Johann Koenig <johannkoenig@google.com>
9196 John Koleszar <jkoleszar@google.com>
0 2021-03-09 v1.10.0 "Ruddy Duck"
1 This maintenance release adds support for darwin20 and new codec controls, as
2 well as numerous bug fixes.
3
4 - Upgrading:
5 New codec control is added to disable loopfilter for VP9.
6
7 New encoder control is added to disable feature to increase Q on overshoot
8 detection for CBR.
9
10 Configure support for darwin20 is added.
11
12 New codec control is added for VP9 rate control. The control ID of this
13 interface is VP9E_SET_EXTERNAL_RATE_CONTROL. To make VP9 use a customized
14 external rate control model, users will have to implement each callback
15 function in vpx_rc_funcs_t and register them using libvpx API
16 vpx_codec_control_() with the control ID.
17
18 - Enhancement:
19 Use -std=gnu++11 instead of -std=c++11 for c++ files.
20
21 - Bug fixes:
22 Override assembler with --as option of configure for MSVS.
23 Fix several compilation issues with gcc 4.8.5.
24 Fix to resetting rate control for temporal layers.
25 Fix to the rate control stats of SVC example encoder when number of spatial
26 layers is 1.
27 Fix to reusing motion vectors from the base spatial layer in SVC.
28 2 pass related flags removed from SVC example encoder.
29
030 2020-07-29 v1.9.0 "Quacking Duck"
131 This release adds support for NV12, a separate library for rate control, as
232 well as incremental improvements.
0 README - 20 July 2020
0 README - 08 March 2021
11
22 Welcome to the WebM VP8/VP9 Codec SDK!
33
99 1. Prerequisites
1010
1111 * All x86 targets require the Yasm[1] assembler be installed[2].
12 * All Windows builds require that Cygwin[3] be installed.
13 * Building the documentation requires Doxygen[4]. If you do not
12 * All Windows builds require that Cygwin[3] or MSYS2[4] be installed.
13 * Building the documentation requires Doxygen[5]. If you do not
1414 have this package, the install-docs option will be disabled.
15 * Downloading the data for the unit tests requires curl[5] and sha1sum.
15 * Downloading the data for the unit tests requires curl[6] and sha1sum.
1616 sha1sum is provided via the GNU coreutils, installed by default on
1717 many *nix platforms, as well as MinGW and Cygwin. If coreutils is not
1818 available, a compatible version of sha1sum can be built from
19 source[6]. These requirements are optional if not running the unit
19 source[7]. These requirements are optional if not running the unit
2020 tests.
2121
2222 [1]: http://www.tortall.net/projects/yasm
2525 yasm-<version>-<arch>.exe to yasm.exe and place it in:
2626 Program Files (x86)/Microsoft Visual Studio/2017/<level>/Common7/Tools/
2727 [3]: http://www.cygwin.com
28 [4]: http://www.doxygen.org
29 [5]: http://curl.haxx.se
30 [6]: http://www.microbrew.org/tools/md5sha1sum/
28 [4]: http://www.msys2.org/
29 [5]: http://www.doxygen.org
30 [6]: http://curl.haxx.se
31 [7]: http://www.microbrew.org/tools/md5sha1sum/
3132
3233 2. Out-of-tree builds
3334 Out of tree builds are a supported method of building the application. For
6162
6263 arm64-android-gcc
6364 arm64-darwin-gcc
65 arm64-darwin20-gcc
6466 arm64-linux-gcc
6567 arm64-win64-gcc
6668 arm64-win64-vs15
112114 x86_64-darwin17-gcc
113115 x86_64-darwin18-gcc
114116 x86_64-darwin19-gcc
117 x86_64-darwin20-gcc
115118 x86_64-iphonesimulator-gcc
116119 x86_64-linux-gcc
117120 x86_64-linux-icc
146146 $(BUILD_PFX)%_vsx.c.d: CFLAGS += -maltivec -mvsx
147147 $(BUILD_PFX)%_vsx.c.o: CFLAGS += -maltivec -mvsx
148148
149 # MIPS
150 $(BUILD_PFX)%_msa.c.d: CFLAGS += -mmsa
151 $(BUILD_PFX)%_msa.c.o: CFLAGS += -mmsa
152
149153 $(BUILD_PFX)%.c.d: %.c
150154 $(if $(quiet),@echo " [DEP] $@")
151155 $(qexec)mkdir -p $(dir $@)
261261 source_path="`pwd`"
262262 disable_feature source_path_used
263263 fi
264 # Makefiles greedily process the '#' character as a comment, even if it is
265 # inside quotes. So, this character must be escaped in all paths in Makefiles.
266 source_path_mk=$(echo $source_path | sed -e 's;\#;\\\#;g')
264267
265268 if test ! -z "$TMPDIR" ; then
266269 TMPDIRx="${TMPDIR}"
480483
481484 cat >> $1 << EOF
482485 # This file automatically generated by configure. Do not edit!
483 SRC_PATH="$source_path"
484 SRC_PATH_BARE=$source_path
486 SRC_PATH="$source_path_mk"
487 SRC_PATH_BARE=$source_path_mk
485488 BUILD_PFX=${BUILD_PFX}
486489 TOOLCHAIN=${toolchain}
487 ASM_CONVERSION=${asm_conversion_cmd:-${source_path}/build/make/ads2gas.pl}
490 ASM_CONVERSION=${asm_conversion_cmd:-${source_path_mk}/build/make/ads2gas.pl}
488491 GEN_VCPROJ=${gen_vcproj_cmd}
489492 MSVS_ARCH_DIR=${msvs_arch_dir}
490493
770773 tgt_isa=x86_64
771774 tgt_os=`echo $gcctarget | sed 's/.*\(darwin1[0-9]\).*/\1/'`
772775 ;;
776 *darwin20*)
777 tgt_isa=`uname -m`
778 tgt_os=`echo $gcctarget | sed 's/.*\(darwin2[0-9]\).*/\1/'`
779 ;;
773780 x86_64*mingw32*)
774781 tgt_os=win64
775782 ;;
844851 # Handle darwin variants. Newer SDKs allow targeting older
845852 # platforms, so use the newest one available.
846853 case ${toolchain} in
847 arm*-darwin*)
854 arm*-darwin-*)
848855 add_cflags "-miphoneos-version-min=${IOS_VERSION_MIN}"
849856 iphoneos_sdk_dir="$(show_darwin_sdk_path iphoneos)"
850857 if [ -d "${iphoneos_sdk_dir}" ]; then
852859 add_ldflags "-isysroot ${iphoneos_sdk_dir}"
853860 fi
854861 ;;
855 x86*-darwin*)
862 *-darwin*)
856863 osx_sdk_dir="$(show_darwin_sdk_path macosx)"
857864 if [ -d "${osx_sdk_dir}" ]; then
858865 add_cflags "-isysroot ${osx_sdk_dir}"
909916 *-darwin19-*)
910917 add_cflags "-mmacosx-version-min=10.15"
911918 add_ldflags "-mmacosx-version-min=10.15"
919 ;;
920 *-darwin20-*)
921 add_cflags "-mmacosx-version-min=10.16 -arch ${toolchain%%-*}"
922 add_ldflags "-mmacosx-version-min=10.16 -arch ${toolchain%%-*}"
912923 ;;
913924 *-iphonesimulator-*)
914925 add_cflags "-miphoneos-version-min=${IOS_VERSION_MIN}"
983994 fi
984995
985996 enabled debug && add_asflags -g
986 asm_conversion_cmd="${source_path}/build/make/ads2gas.pl"
997 asm_conversion_cmd="${source_path_mk}/build/make/ads2gas.pl"
987998
988999 case ${tgt_os} in
9891000 win*)
10051016 # respective SDKs' limitations. Fortunately, these are all 32-bit ABIs
10061017 # and so can be selected as 'win32'.
10071018 if [ ${tgt_os} = "win32" ]; then
1008 asm_conversion_cmd="${source_path}/build/make/ads2armasm_ms.pl"
1019 asm_conversion_cmd="${source_path_mk}/build/make/ads2armasm_ms.pl"
10091020 AS_SFX=.S
10101021 msvs_arch_dir=arm-msvs
10111022 disable_feature multithread
10831094 soft_enable unit_tests
10841095 ;;
10851096
1086 darwin*)
1097 darwin)
10871098 if ! enabled external_build; then
10881099 XCRUN_FIND="xcrun --sdk iphoneos --find"
10891100 CXX="$(${XCRUN_FIND} clang++)"
11401151 fi
11411152 fi
11421153
1143 asm_conversion_cmd="${source_path}/build/make/ads2gas_apple.pl"
1154 asm_conversion_cmd="${source_path_mk}/build/make/ads2gas_apple.pl"
11441155 ;;
11451156
11461157 linux*)
11941205 check_add_asflags -mips64r6 -mabi=64 -mhard-float -mfp64
11951206 check_add_ldflags -mips64r6 -mabi=64 -mfp64
11961207 ;;
1208 loongson3*)
1209 check_cflags -march=loongson3a && soft_enable mmi \
1210 || disable_feature mmi
1211 check_cflags -mmsa && soft_enable msa \
1212 || disable_feature msa
1213 tgt_isa=loongson3a
1214 ;;
11971215 esac
1216
1217 if enabled mmi || enabled msa; then
1218 soft_enable runtime_cpu_detect
1219 fi
11981220
11991221 if enabled msa; then
12001222 # TODO(libyuv:793)
12011223 # The new mips functions in libyuv do not build
12021224 # with the toolchains we currently use for testing.
12031225 soft_disable libyuv
1204
1205 add_cflags -mmsa
1206 add_asflags -mmsa
1207 add_ldflags -mmsa
12081226 fi
1209 fi
1210
1211 if enabled mmi; then
1212 tgt_isa=loongson3a
1213 check_add_ldflags -march=loongson3a
12141227 fi
12151228
12161229 check_add_cflags -march=${tgt_isa}
12821295 enabled optimizations && disabled gprof && check_add_cflags -fomit-frame-pointer
12831296 ;;
12841297 vs*)
1285 # When building with Microsoft Visual Studio the assembler is
1286 # invoked directly. Checking at configure time is unnecessary.
1287 # Skip the check by setting AS arbitrarily
1288 AS=msvs
12891298 msvs_arch_dir=x86-msvs
12901299 case ${tgt_cc##vs} in
12911300 14)
156156 ;;
157157 --lib) proj_kind="lib"
158158 ;;
159 --as=*) as="${optval}"
160 ;;
159161 --src-path-bare=*)
160162 src_path_bare=$(fix_path "$optval")
161163 src_path_bare=${src_path_bare%/}
246248 case "$target" in
247249 x86_64*)
248250 platforms[0]="x64"
249 asm_Debug_cmdline="yasm -Xvc -g cv8 -f win64 ${yasmincs} &quot;%(FullPath)&quot;"
250 asm_Release_cmdline="yasm -Xvc -f win64 ${yasmincs} &quot;%(FullPath)&quot;"
251 asm_Debug_cmdline="${as} -Xvc -gcv8 -f win64 ${yasmincs} &quot;%(FullPath)&quot;"
252 asm_Release_cmdline="${as} -Xvc -f win64 ${yasmincs} &quot;%(FullPath)&quot;"
251253 ;;
252254 x86*)
253255 platforms[0]="Win32"
254 asm_Debug_cmdline="yasm -Xvc -g cv8 -f win32 ${yasmincs} &quot;%(FullPath)&quot;"
255 asm_Release_cmdline="yasm -Xvc -f win32 ${yasmincs} &quot;%(FullPath)&quot;"
256 asm_Debug_cmdline="${as} -Xvc -gcv8 -f win32 ${yasmincs} &quot;%(FullPath)&quot;"
257 asm_Release_cmdline="${as} -Xvc -f win32 ${yasmincs} &quot;%(FullPath)&quot;"
256258 ;;
257259 arm64*)
258260 platforms[0]="ARM64"
88 ## be found in the AUTHORS file in the root of the source tree.
99 ##
1010
11 if [ "$(uname -o 2>/dev/null)" = "Cygwin" ] \
11 shell_name="$(uname -o 2>/dev/null)"
12 if [[ "$shell_name" = "Cygwin" || "$shell_name" = "Msys" ]] \
1213 && cygpath --help >/dev/null 2>&1; then
1314 FIXPATH='cygpath -m'
1415 else
314314
315315 sub mips() {
316316 determine_indirection("c", @ALL_ARCHS);
317
318 # Assign the helper variable for each enabled extension
319 foreach my $opt (@ALL_ARCHS) {
320 my $opt_uc = uc $opt;
321 eval "\$have_${opt}=\"flags & HAS_${opt_uc}\"";
322 }
323
317324 common_top;
318325
319326 print <<EOF;
320327 #include "vpx_config.h"
321328
322329 #ifdef RTCD_C
330 #include "vpx_ports/mips.h"
323331 static void setup_rtcd_internal(void)
324332 {
333 int flags = mips_cpu_caps();
334
335 (void)flags;
336
325337 EOF
326338
327339 set_function_pointers("c", @ALL_ARCHS);
409421 &require(@REQUIRES);
410422 x86;
411423 } elsif ($opts{arch} eq 'mips32' || $opts{arch} eq 'mips64') {
424 my $have_dspr2 = 0;
425 my $have_msa = 0;
426 my $have_mmi = 0;
412427 @ALL_ARCHS = filter("$opts{arch}");
413428 open CONFIG_FILE, $opts{config} or
414429 die "Error opening config file '$opts{config}': $!\n";
415430 while (<CONFIG_FILE>) {
416431 if (/HAVE_DSPR2=yes/) {
417 @ALL_ARCHS = filter("$opts{arch}", qw/dspr2/);
418 last;
432 $have_dspr2 = 1;
419433 }
420434 if (/HAVE_MSA=yes/) {
421 @ALL_ARCHS = filter("$opts{arch}", qw/msa/);
422 last;
435 $have_msa = 1;
423436 }
424437 if (/HAVE_MMI=yes/) {
425 @ALL_ARCHS = filter("$opts{arch}", qw/mmi/);
426 last;
438 $have_mmi = 1;
427439 }
428440 }
429441 close CONFIG_FILE;
442 if ($have_dspr2 == 1) {
443 @ALL_ARCHS = filter("$opts{arch}", qw/dspr2/);
444 } elsif ($have_msa == 1 && $have_mmi == 1) {
445 @ALL_ARCHS = filter("$opts{arch}", qw/mmi msa/);
446 } elsif ($have_msa == 1) {
447 @ALL_ARCHS = filter("$opts{arch}", qw/msa/);
448 } elsif ($have_mmi == 1) {
449 @ALL_ARCHS = filter("$opts{arch}", qw/mmi/);
450 } else {
451 unoptimized;
452 }
430453 mips;
431454 } elsif ($opts{arch} =~ /armv7\w?/) {
432455 @ALL_ARCHS = filter(qw/neon_asm neon/);
9898 # alphabetically by architecture, generic-gnu last.
9999 all_platforms="${all_platforms} arm64-android-gcc"
100100 all_platforms="${all_platforms} arm64-darwin-gcc"
101 all_platforms="${all_platforms} arm64-darwin20-gcc"
101102 all_platforms="${all_platforms} arm64-linux-gcc"
102103 all_platforms="${all_platforms} arm64-win64-gcc"
103104 all_platforms="${all_platforms} arm64-win64-vs15"
149150 all_platforms="${all_platforms} x86_64-darwin17-gcc"
150151 all_platforms="${all_platforms} x86_64-darwin18-gcc"
151152 all_platforms="${all_platforms} x86_64-darwin19-gcc"
153 all_platforms="${all_platforms} x86_64-darwin20-gcc"
152154 all_platforms="${all_platforms} x86_64-iphonesimulator-gcc"
153155 all_platforms="${all_platforms} x86_64-linux-gcc"
154156 all_platforms="${all_platforms} x86_64-linux-icc"
728730 soft_enable libyuv
729731 ;;
730732 *-android-*)
731 check_add_cxxflags -std=c++11 && soft_enable webm_io
733 check_add_cxxflags -std=gnu++11 && soft_enable webm_io
732734 soft_enable libyuv
733735 # GTestLog must be modified to use Android logging utilities.
734736 ;;
735737 *-darwin-*)
736 check_add_cxxflags -std=c++11
738 check_add_cxxflags -std=gnu++11
737739 # iOS/ARM builds do not work with gtest. This does not match
738740 # x86 targets.
739741 ;;
740742 *-iphonesimulator-*)
741 check_add_cxxflags -std=c++11 && soft_enable webm_io
743 check_add_cxxflags -std=gnu++11 && soft_enable webm_io
742744 soft_enable libyuv
743745 ;;
744746 *-win*)
745747 # Some mingw toolchains don't have pthread available by default.
746748 # Treat these more like visual studio where threading in gtest
747749 # would be disabled for the same reason.
748 check_add_cxxflags -std=c++11 && soft_enable unit_tests \
750 check_add_cxxflags -std=gnu++11 && soft_enable unit_tests \
749751 && soft_enable webm_io
750752 check_cxx "$@" <<EOF && soft_enable libyuv
751753 int z;
752754 EOF
753755 ;;
754756 *)
755 enabled pthread_h && check_add_cxxflags -std=c++11 \
757 enabled pthread_h && check_add_cxxflags -std=gnu++11 \
756758 && soft_enable unit_tests
757 check_add_cxxflags -std=c++11 && soft_enable webm_io
759 check_add_cxxflags -std=gnu++11 && soft_enable webm_io
758760 check_cxx "$@" <<EOF && soft_enable libyuv
759761 int z;
760762 EOF
6565 ARG_DEF("k", "kf-dist", 1, "number of frames between keyframes");
6666 static const arg_def_t scale_factors_arg =
6767 ARG_DEF("r", "scale-factors", 1, "scale factors (lowest to highest layer)");
68 static const arg_def_t passes_arg =
69 ARG_DEF("p", "passes", 1, "Number of passes (1/2)");
70 static const arg_def_t pass_arg =
71 ARG_DEF(NULL, "pass", 1, "Pass to execute (1/2)");
72 static const arg_def_t fpf_name_arg =
73 ARG_DEF(NULL, "fpf", 1, "First pass statistics file name");
7468 static const arg_def_t min_q_arg =
7569 ARG_DEF(NULL, "min-q", 1, "Minimum quantizer");
7670 static const arg_def_t max_q_arg =
124118 &spatial_layers_arg,
125119 &kf_dist_arg,
126120 &scale_factors_arg,
127 &passes_arg,
128 &pass_arg,
129 &fpf_name_arg,
130121 &min_q_arg,
131122 &max_q_arg,
132123 &min_bitrate_arg,
172163 uint32_t frames_to_skip;
173164 struct VpxInputContext input_ctx;
174165 stats_io_t rc_stats;
175 int passes;
176 int pass;
177166 int tune_content;
178167 int inter_layer_pred;
179168 } AppInput;
196185 char **argi = NULL;
197186 char **argj = NULL;
198187 vpx_codec_err_t res;
199 int passes = 0;
200 int pass = 0;
201 const char *fpf_file_name = NULL;
202188 unsigned int min_bitrate = 0;
203189 unsigned int max_bitrate = 0;
204190 char string_options[1024] = { 0 };
288274 sizeof(string_options) - strlen(string_options) - 1);
289275 strncat(string_options, arg.val,
290276 sizeof(string_options) - strlen(string_options) - 1);
291 } else if (arg_match(&arg, &passes_arg, argi)) {
292 passes = arg_parse_uint(&arg);
293 if (passes < 1 || passes > 2) {
294 die("Error: Invalid number of passes (%d)\n", passes);
295 }
296 } else if (arg_match(&arg, &pass_arg, argi)) {
297 pass = arg_parse_uint(&arg);
298 if (pass < 1 || pass > 2) {
299 die("Error: Invalid pass selected (%d)\n", pass);
300 }
301 } else if (arg_match(&arg, &fpf_name_arg, argi)) {
302 fpf_file_name = arg.val;
303277 } else if (arg_match(&arg, &min_q_arg, argi)) {
304278 strncat(string_options, " min-quantizers=",
305279 sizeof(string_options) - strlen(string_options) - 1);
354328 if (strlen(string_options) > 0)
355329 vpx_svc_set_options(svc_ctx, string_options + 1);
356330
357 if (passes == 0 || passes == 1) {
358 if (pass) {
359 fprintf(stderr, "pass is ignored since there's only one pass\n");
360 }
361 enc_cfg->g_pass = VPX_RC_ONE_PASS;
362 } else {
363 if (pass == 0) {
364 die("pass must be specified when passes is 2\n");
365 }
366
367 if (fpf_file_name == NULL) {
368 die("fpf must be specified when passes is 2\n");
369 }
370
371 if (pass == 1) {
372 enc_cfg->g_pass = VPX_RC_FIRST_PASS;
373 if (!stats_open_file(&app_input->rc_stats, fpf_file_name, 0)) {
374 fatal("Failed to open statistics store");
375 }
376 } else {
377 enc_cfg->g_pass = VPX_RC_LAST_PASS;
378 if (!stats_open_file(&app_input->rc_stats, fpf_file_name, 1)) {
379 fatal("Failed to open statistics store");
380 }
381 enc_cfg->rc_twopass_stats_in = stats_get(&app_input->rc_stats);
382 }
383 app_input->passes = passes;
384 app_input->pass = pass;
385 }
331 enc_cfg->g_pass = VPX_RC_ONE_PASS;
386332
387333 if (enc_cfg->rc_target_bitrate > 0) {
388334 if (min_bitrate > 0) {
827773 vpx_codec_control(codec, VP9E_GET_SVC_LAYER_ID, layer_id);
828774 parse_superframe_index(cx_pkt->data.frame.buf, cx_pkt->data.frame.sz,
829775 sizes_parsed, &count);
830 if (enc_cfg->ss_number_layers == 1) sizes[0] = cx_pkt->data.frame.sz;
831 for (sl = 0; sl < enc_cfg->ss_number_layers; ++sl) {
832 sizes[sl] = 0;
833 if (cx_pkt->data.frame.spatial_layer_encoded[sl]) {
834 sizes[sl] = sizes_parsed[num_layers_encoded];
835 num_layers_encoded++;
776 if (enc_cfg->ss_number_layers == 1) {
777 sizes[0] = cx_pkt->data.frame.sz;
778 } else {
779 for (sl = 0; sl < enc_cfg->ss_number_layers; ++sl) {
780 sizes[sl] = 0;
781 if (cx_pkt->data.frame.spatial_layer_encoded[sl]) {
782 sizes[sl] = sizes_parsed[num_layers_encoded];
783 num_layers_encoded++;
784 }
836785 }
837786 }
838787 for (sl = 0; sl < enc_cfg->ss_number_layers; ++sl) {
1000949 info.time_base.numerator = enc_cfg.g_timebase.num;
1001950 info.time_base.denominator = enc_cfg.g_timebase.den;
1002951
1003 if (!(app_input.passes == 2 && app_input.pass == 1)) {
1004 // We don't save the bitstream for the 1st pass on two pass rate control
1005 writer =
1006 vpx_video_writer_open(app_input.output_filename, kContainerIVF, &info);
1007 if (!writer)
1008 die("Failed to open %s for writing\n", app_input.output_filename);
1009 }
952 writer =
953 vpx_video_writer_open(app_input.output_filename, kContainerIVF, &info);
954 if (!writer)
955 die("Failed to open %s for writing\n", app_input.output_filename);
956
1010957 #if OUTPUT_RC_STATS
1011958 // Write out spatial layer stream.
1012959 // TODO(marpan/jianj): allow for writing each spatial and temporal stream.
1048995 vpx_codec_control(&encoder, VP9E_SET_NOISE_SENSITIVITY, 0);
1049996
1050997 vpx_codec_control(&encoder, VP9E_SET_TUNE_CONTENT, app_input.tune_content);
998
999 vpx_codec_control(&encoder, VP9E_SET_DISABLE_OVERSHOOT_MAXQ_CBR, 0);
1000 vpx_codec_control(&encoder, VP9E_SET_DISABLE_LOOPFILTER, 0);
10511001
10521002 svc_drop_frame.framedrop_mode = FULL_SUPERFRAME_DROP;
10531003 for (sl = 0; sl < (unsigned int)svc_ctx.spatial_layers; ++sl)
12231173 #endif
12241174 if (vpx_codec_destroy(&encoder))
12251175 die_codec(&encoder, "Failed to destroy codec");
1226 if (app_input.passes == 2) stats_close(&app_input.rc_stats, 1);
12271176 if (writer) {
12281177 vpx_video_writer_close(writer);
12291178 }
4040 $make -j32
4141
4242 * Build vp9 fuzzer
43 $ $CXX $CXXFLAGS -std=c++11 -DDECODER=vp9 \
43 $ $CXX $CXXFLAGS -std=gnu++11 -DDECODER=vp9 \
4444 -fsanitize=fuzzer -I../libvpx -I. -Wl,--start-group \
4545 ../libvpx/examples/vpx_dec_fuzzer.cc -o ./vpx_dec_fuzzer_vp9 \
4646 ./libvpx.a -Wl,--end-group
830830 } else if (strncmp(encoder->name, "vp9", 3) == 0) {
831831 vpx_svc_extra_cfg_t svc_params;
832832 memset(&svc_params, 0, sizeof(svc_params));
833 vpx_codec_control(&codec, VP9E_SET_DISABLE_OVERSHOOT_MAXQ_CBR, 0);
833834 vpx_codec_control(&codec, VP8E_SET_CPUUSED, speed);
834835 vpx_codec_control(&codec, VP9E_SET_AQ_MODE, 3);
835836 vpx_codec_control(&codec, VP9E_SET_GF_CBR_BOOST_PCT, 0);
839840 vpx_codec_control(&codec, VP8E_SET_STATIC_THRESHOLD, 1);
840841 vpx_codec_control(&codec, VP9E_SET_TUNE_CONTENT, 0);
841842 vpx_codec_control(&codec, VP9E_SET_TILE_COLUMNS, get_msb(cfg.g_threads));
843 vpx_codec_control(&codec, VP9E_SET_DISABLE_LOOPFILTER, 0);
842844 #if ROI_MAP
843845 set_roi_map(encoder->name, &cfg, &roi);
844846 if (vpx_codec_control(&codec, VP9E_SET_ROI_MAP, &roi))
927929 // Update for short-time encoding bitrate states, for moving window
928930 // of size rc->window, shifted by rc->window / 2.
929931 // Ignore first window segment, due to key frame.
932 if (rc.window_size == 0) rc.window_size = 15;
930933 if (frame_cnt > rc.window_size) {
931934 sum_bitrate += 0.001 * 8.0 * pkt->data.frame.sz * framerate;
932935 if (frame_cnt % rc.window_size == 0) {
375375 --ver=$$(CONFIG_VS_VERSION)\
376376 --proj-guid=$$($$(@:.$(VCPROJ_SFX)=).GUID)\
377377 --src-path-bare="$(SRC_PATH_BARE)" \
378 --as=$$(AS) \
378379 $$(if $$(CONFIG_STATIC_MSVCRT),--static-crt) \
379380 --out=$$@ $$(INTERNAL_CFLAGS) $$(CFLAGS) \
380381 $$(INTERNAL_LDFLAGS) $$(LDFLAGS) -l$$(CODEC_LIB) $$^
6262 CODEC_SRCS-yes += $(addprefix $(VP8_PREFIX),$(call enabled,VP8_CX_SRCS))
6363 CODEC_EXPORTS-yes += $(addprefix $(VP8_PREFIX),$(VP8_CX_EXPORTS))
6464 INSTALL-LIBS-yes += include/vpx/vp8.h include/vpx/vp8cx.h
65 INSTALL-LIBS-yes += include/vpx/vpx_ext_ratectrl.h
6566 INSTALL_MAPS += include/vpx/% $(SRC_PATH_BARE)/$(VP8_PREFIX)/%
6667 CODEC_DOC_SECTIONS += vp8 vp8_encoder
6768 endif
8687 CODEC_SRCS-yes += $(addprefix $(VP9_PREFIX),$(call enabled,VP9_CX_SRCS))
8788 CODEC_EXPORTS-yes += $(addprefix $(VP9_PREFIX),$(VP9_CX_EXPORTS))
8889 CODEC_SRCS-yes += $(VP9_PREFIX)vp9cx.mk vpx/vp8.h vpx/vp8cx.h
90 CODEC_SRCS-yes += vpx/vpx_ext_ratectrl.h
8991 INSTALL-LIBS-yes += include/vpx/vp8.h include/vpx/vp8cx.h
92 INSTALL-LIBS-yes += include/vpx/vpx_ext_ratectrl.h
9093 INSTALL_MAPS += include/vpx/% $(SRC_PATH_BARE)/$(VP9_PREFIX)/%
91 CODEC_DOC_SRCS += vpx/vp8.h vpx/vp8cx.h
94 CODEC_DOC_SRCS += vpx/vp8.h vpx/vp8cx.h vpx/vpx_ext_ratectrl.h
9295 CODEC_DOC_SECTIONS += vp9 vp9_encoder
9396
9497 RC_RTC_SRCS := $(addprefix $(VP9_PREFIX),$(call enabled,VP9_CX_SRCS))
9598 RC_RTC_SRCS += $(VP9_PREFIX)vp9cx.mk vpx/vp8.h vpx/vp8cx.h
99 RC_RTC_SRCS += vpx/vpx_ext_ratectrl.h
96100 RC_RTC_SRCS += $(VP9_PREFIX)ratectrl_rtc.cc
97101 RC_RTC_SRCS += $(VP9_PREFIX)ratectrl_rtc.h
98102 INSTALL-SRCS-$(CONFIG_CODEC_SRCS) += $(VP9_PREFIX)ratectrl_rtc.cc
227231 --ver=$(CONFIG_VS_VERSION) \
228232 --src-path-bare="$(SRC_PATH_BARE)" \
229233 --out=$@ $(CFLAGS) \
234 --as=$(AS) \
230235 $(filter $(SRC_PATH_BARE)/vp8/%.c, $(VCPROJ_SRCS)) \
231236 $(filter $(SRC_PATH_BARE)/vp8/%.h, $(VCPROJ_SRCS)) \
232237 $(filter $(SRC_PATH_BARE)/vp9/%.c, $(VCPROJ_SRCS)) \
257262 --ver=$(CONFIG_VS_VERSION) \
258263 --src-path-bare="$(SRC_PATH_BARE)" \
259264 --out=$@ $(CFLAGS) \
265 --as=$(AS) \
260266 $(filter $(SRC_PATH_BARE)/vp9/%.c, $(VCPROJ_SRCS)) \
261267 $(filter $(SRC_PATH_BARE)/vp9/%.cc, $(VCPROJ_SRCS)) \
262268 $(filter $(SRC_PATH_BARE)/vp9/%.h, $(VCPROJ_SRCS)) \
280286 LIBS-$(if yes,$(CONFIG_STATIC)) += $(BUILD_PFX)libvpx.a $(BUILD_PFX)libvpx_g.a
281287 $(BUILD_PFX)libvpx_g.a: $(LIBVPX_OBJS)
282288
289 # Updating version info.
290 # https://www.gnu.org/software/libtool/manual/libtool.html#Updating-version-info
291 # For libtool: c=<current>, a=<age>, r=<revision>
292 # libtool generates .so file as .so.[c-a].a.r, while -version-info c:r:a is
293 # passed to libtool.
294 #
295 # libvpx library file is generated as libvpx.so.<MAJOR>.<MINOR>.<PATCH>
296 # MAJOR = c-a, MINOR = a, PATCH = r
297 #
298 # To determine SO_VERSION_{MAJOR,MINOR,PATCH}, calculate c,a,r with current
299 # SO_VERSION_* then follow the rules in the link to detemine the new version
300 # (c1, a1, r1) and set MAJOR to [c1-a1], MINOR to a1 and PATCH to r1
283301 SO_VERSION_MAJOR := 6
284 SO_VERSION_MINOR := 3
302 SO_VERSION_MINOR := 4
285303 SO_VERSION_PATCH := 0
286304 ifeq ($(filter darwin%,$(TGT_OS)),$(TGT_OS))
287305 LIBVPX_SO := libvpx.$(SO_VERSION_MAJOR).dylib
415433 # YASM
416434 $(BUILD_PFX)vpx_config.asm: $(BUILD_PFX)vpx_config.h
417435 @echo " [CREATE] $@"
418 @egrep "#define [A-Z0-9_]+ [01]" $< \
436 @LC_ALL=C egrep "#define [A-Z0-9_]+ [01]" $< \
419437 | awk '{print $$2 " equ " $$3}' > $@
420438 else
421439 ADS2GAS=$(if $(filter yes,$(CONFIG_GCC)),| $(ASM_CONVERSION))
422440 $(BUILD_PFX)vpx_config.asm: $(BUILD_PFX)vpx_config.h
423441 @echo " [CREATE] $@"
424 @egrep "#define [A-Z0-9_]+ [01]" $< \
442 @LC_ALL=C egrep "#define [A-Z0-9_]+ [01]" $< \
425443 | awk '{print $$2 " EQU " $$3}' $(ADS2GAS) > $@
426444 @echo " END" $(ADS2GAS) >> $@
427445 CLEAN-OBJS += $(BUILD_PFX)vpx_config.asm
489507 @echo $(LIBVPX_TEST_SRCS) | xargs -n1 echo | LC_ALL=C sort -u > $@
490508 CLEAN-OBJS += libvpx_test_srcs.txt
491509
510 # Attempt to download the file using curl, retrying once if it fails for a
511 # partial file (18).
492512 $(LIBVPX_TEST_DATA): $(SRC_PATH_BARE)/test/test-data.sha1
493513 @echo " [DOWNLOAD] $@"
494 # Attempt to download the file using curl, retrying once if it fails for a
495 # partial file (18).
496514 $(qexec)( \
497515 trap 'rm -f $@' INT TERM; \
498 curl="curl --retry 1 -L -o $@ $(call libvpx_test_data_url,$(@F))"; \
499 $$curl; \
500 case "$$?" in \
501 18) $$curl -C -;; \
516 curl="curl -S -s --retry 1 -L -o $@ $(call libvpx_test_data_url,$(@F))"; \
517 $$curl; ret=$$?; \
518 case "$$ret" in \
519 18) $$curl -C - ;; \
520 *) exit $$ret ;; \
502521 esac \
503522 )
504523
530549 --proj-guid=EC00E1EC-AF68-4D92-A255-181690D1C9B1 \
531550 --ver=$(CONFIG_VS_VERSION) \
532551 --src-path-bare="$(SRC_PATH_BARE)" \
552 --as=$(AS) \
533553 -D_VARIADIC_MAX=10 \
534554 --out=gtest.$(VCPROJ_SFX) $(SRC_PATH_BARE)/third_party/googletest/src/src/gtest-all.cc \
535555 -I. -I"$(SRC_PATH_BARE)/third_party/googletest/src/include" -I"$(SRC_PATH_BARE)/third_party/googletest/src"
546566 --proj-guid=CD837F5F-52D8-4314-A370-895D614166A7 \
547567 --ver=$(CONFIG_VS_VERSION) \
548568 --src-path-bare="$(SRC_PATH_BARE)" \
569 --as=$(AS) \
549570 $(if $(CONFIG_STATIC_MSVCRT),--static-crt) \
550571 --out=$@ $(INTERNAL_CFLAGS) $(CFLAGS) \
551572 -I. -I"$(SRC_PATH_BARE)/third_party/googletest/src/include" \
568589 --proj-guid=CD837F5F-52D8-4314-A370-895D614166A7 \
569590 --ver=$(CONFIG_VS_VERSION) \
570591 --src-path-bare="$(SRC_PATH_BARE)" \
592 --as=$(AS) \
571593 $(if $(CONFIG_STATIC_MSVCRT),--static-crt) \
572594 --out=$@ $(INTERNAL_CFLAGS) $(CFLAGS) \
573595 -I. -I"$(SRC_PATH_BARE)/third_party/googletest/src/include" \
586608 -D_VARIADIC_MAX=10 \
587609 --proj-guid=30458F88-1BC6-4689-B41C-50F3737AAB27 \
588610 --ver=$(CONFIG_VS_VERSION) \
611 --as=$(AS) \
589612 --src-path-bare="$(SRC_PATH_BARE)" \
590613 $(if $(CONFIG_STATIC_MSVCRT),--static-crt) \
591614 --out=$@ $(INTERNAL_CFLAGS) $(CFLAGS) \
7979 } else if (video->frame() >= 2 && video->img()) {
8080 vpx_image_t *current = video->img();
8181 vpx_image_t *previous = y4m_holder_->img();
82 ASSERT_TRUE(previous != NULL);
82 ASSERT_NE(previous, nullptr);
8383 vpx_active_map_t map = vpx_active_map_t();
8484 const int width = static_cast<int>(current->d_w);
8585 const int height = static_cast<int>(current->d_h);
6161 vpx_active_map_t map = vpx_active_map_t();
6262 map.cols = (kWidth + 15) / 16;
6363 map.rows = (kHeight + 15) / 16;
64 map.active_map = NULL;
64 map.active_map = nullptr;
6565 encoder->Control(VP8E_SET_ACTIVEMAP, &map);
6666 }
6767 }
5252 const int clamp = vpx_setup_noise(GET_PARAM(0), noise, kNoiseSize);
5353 uint8_t *const s =
5454 reinterpret_cast<uint8_t *>(vpx_calloc(image_size, sizeof(*s)));
55 ASSERT_TRUE(s != NULL);
55 ASSERT_NE(s, nullptr);
5656 memset(s, 99, image_size * sizeof(*s));
5757
5858 ASM_REGISTER_STATE_CHECK(
105105
106106 uint8_t *const s = reinterpret_cast<uint8_t *>(vpx_calloc(image_size, 1));
107107 uint8_t *const d = reinterpret_cast<uint8_t *>(vpx_calloc(image_size, 1));
108 ASSERT_TRUE(s != NULL);
109 ASSERT_TRUE(d != NULL);
108 ASSERT_NE(s, nullptr);
109 ASSERT_NE(d, nullptr);
110110
111111 memset(s, 99, image_size);
112112 memset(d, 99, image_size);
1515
1616 3) Run get_files.py to download the test files:
1717 python get_files.py -i /path/to/test-data.sha1 -o /path/to/put/files \
18 -u http://downloads.webmproject.org/test_data/libvpx
18 -u https://storage.googleapis.com/downloads.webmproject.org/test_data/libvpx
1919
2020 4) Transfer files to device using adb. Ensure you have proper permissions for
2121 the target
3434 class AverageTestBase : public ::testing::Test {
3535 public:
3636 AverageTestBase(int width, int height)
37 : width_(width), height_(height), source_data_(NULL), source_stride_(0),
38 bit_depth_(8) {}
37 : width_(width), height_(height), source_data_(nullptr),
38 source_stride_(0), bit_depth_(8) {}
3939
4040 virtual void TearDown() {
4141 vpx_free(source_data_);
42 source_data_ = NULL;
42 source_data_ = nullptr;
4343 libvpx_test::ClearSystemState();
4444 }
4545
5151 virtual void SetUp() {
5252 source_data_ = reinterpret_cast<Pixel *>(
5353 vpx_memalign(kDataAlignment, kDataBlockSize * sizeof(source_data_[0])));
54 ASSERT_TRUE(source_data_ != NULL);
54 ASSERT_NE(source_data_, nullptr);
5555 source_stride_ = (width_ + 31) & ~31;
5656 bit_depth_ = 8;
5757 rnd_.Reset(ACMRandom::DeterministicSeed());
151151 };
152152 #endif // CONFIG_VP9_HIGHBITDEPTH
153153
154 #if HAVE_NEON || HAVE_SSE2 || HAVE_MSA
154155 typedef void (*IntProRowFunc)(int16_t hbuf[16], uint8_t const *ref,
155156 const int ref_stride, const int height);
156157
160161 public ::testing::WithParamInterface<IntProRowParam> {
161162 public:
162163 IntProRowTest()
163 : AverageTestBase(16, GET_PARAM(0)), hbuf_asm_(NULL), hbuf_c_(NULL) {
164 : AverageTestBase(16, GET_PARAM(0)), hbuf_asm_(nullptr),
165 hbuf_c_(nullptr) {
164166 asm_func_ = GET_PARAM(1);
165167 c_func_ = GET_PARAM(2);
166168 }
169171 virtual void SetUp() {
170172 source_data_ = reinterpret_cast<uint8_t *>(
171173 vpx_memalign(kDataAlignment, kDataBlockSize * sizeof(source_data_[0])));
172 ASSERT_TRUE(source_data_ != NULL);
174 ASSERT_NE(source_data_, nullptr);
173175
174176 hbuf_asm_ = reinterpret_cast<int16_t *>(
175177 vpx_memalign(kDataAlignment, sizeof(*hbuf_asm_) * 16));
179181
180182 virtual void TearDown() {
181183 vpx_free(source_data_);
182 source_data_ = NULL;
184 source_data_ = nullptr;
183185 vpx_free(hbuf_c_);
184 hbuf_c_ = NULL;
186 hbuf_c_ = nullptr;
185187 vpx_free(hbuf_asm_);
186 hbuf_asm_ = NULL;
188 hbuf_asm_ = nullptr;
187189 }
188190
189191 void RunComparison() {
199201 int16_t *hbuf_asm_;
200202 int16_t *hbuf_c_;
201203 };
204 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(IntProRowTest);
202205
203206 typedef int16_t (*IntProColFunc)(uint8_t const *ref, const int width);
204207
225228 int16_t sum_asm_;
226229 int16_t sum_c_;
227230 };
231 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(IntProColTest);
232 #endif // HAVE_NEON || HAVE_SSE2 || HAVE_MSA
228233
229234 typedef int (*SatdFunc)(const tran_low_t *coeffs, int length);
230235 typedef std::tuple<int, SatdFunc> SatdTestParam;
238243 rnd_.Reset(ACMRandom::DeterministicSeed());
239244 src_ = reinterpret_cast<tran_low_t *>(
240245 vpx_memalign(16, sizeof(*src_) * satd_size_));
241 ASSERT_TRUE(src_ != NULL);
246 ASSERT_NE(src_, nullptr);
242247 }
243248
244249 virtual void TearDown() {
294299 vpx_memalign(16, sizeof(*coeff_) * txfm_size_));
295300 dqcoeff_ = reinterpret_cast<tran_low_t *>(
296301 vpx_memalign(16, sizeof(*dqcoeff_) * txfm_size_));
297 ASSERT_TRUE(coeff_ != NULL);
298 ASSERT_TRUE(dqcoeff_ != NULL);
302 ASSERT_NE(coeff_, nullptr);
303 ASSERT_NE(dqcoeff_, nullptr);
299304 }
300305
301306 virtual void TearDown() {
377382 }
378383 #endif // CONFIG_VP9_HIGHBITDEPTH
379384
385 #if HAVE_NEON || HAVE_SSE2 || HAVE_MSA
380386 TEST_P(IntProRowTest, MinValue) {
381387 FillConstant(0);
382388 RunComparison();
406412 FillRandom();
407413 RunComparison();
408414 }
415 #endif
409416
410417 TEST_P(SatdLowbdTest, MinValue) {
411418 const int kMin = -32640;
4343
4444 static void TearDownTestSuite() {
4545 vpx_free(source_data_);
46 source_data_ = NULL;
46 source_data_ = nullptr;
4747 vpx_free(reference_data_);
48 reference_data_ = NULL;
48 reference_data_ = nullptr;
4949 }
5050
5151 virtual void TearDown() { libvpx_test::ClearSystemState(); }
153153 };
154154 #endif // CONFIG_VP9_ENCODER
155155
156 uint8_t *BlockinessTestBase::source_data_ = NULL;
157 uint8_t *BlockinessTestBase::reference_data_ = NULL;
156 uint8_t *BlockinessTestBase::source_data_ = nullptr;
157 uint8_t *BlockinessTestBase::reference_data_ = nullptr;
158158
159159 #if CONFIG_VP9_ENCODER
160160 TEST_P(BlockinessVP9Test, SourceBlockierThanReference) {
5454 class ByteAlignmentTest
5555 : public ::testing::TestWithParam<ByteAlignmentTestParam> {
5656 protected:
57 ByteAlignmentTest() : video_(NULL), decoder_(NULL), md5_file_(NULL) {}
57 ByteAlignmentTest()
58 : video_(nullptr), decoder_(nullptr), md5_file_(nullptr) {}
5859
5960 virtual void SetUp() {
6061 video_ = new libvpx_test::WebMVideoSource(kVP9TestFile);
61 ASSERT_TRUE(video_ != NULL);
62 ASSERT_NE(video_, nullptr);
6263 video_->Init();
6364 video_->Begin();
6465
6566 const vpx_codec_dec_cfg_t cfg = vpx_codec_dec_cfg_t();
6667 decoder_ = new libvpx_test::VP9Decoder(cfg, 0);
67 ASSERT_TRUE(decoder_ != NULL);
68 ASSERT_NE(decoder_, nullptr);
6869
6970 OpenMd5File(kVP9Md5File);
7071 }
7172
7273 virtual void TearDown() {
73 if (md5_file_ != NULL) fclose(md5_file_);
74 if (md5_file_ != nullptr) fclose(md5_file_);
7475
7576 delete decoder_;
7677 delete video_;
8990 }
9091
9192 vpx_codec_err_t DecodeRemainingFrames(int byte_alignment_to_check) {
92 for (; video_->cxdata() != NULL; video_->Next()) {
93 for (; video_->cxdata() != nullptr; video_->Next()) {
9394 const vpx_codec_err_t res =
9495 decoder_->DecodeFrame(video_->cxdata(), video_->frame_size());
9596 if (res != VPX_CODEC_OK) return res;
112113 const vpx_image_t *img;
113114
114115 // Get decompressed data
115 while ((img = dec_iter.Next()) != NULL) {
116 while ((img = dec_iter.Next()) != nullptr) {
116117 if (byte_alignment_to_check == kLegacyByteAlignment) {
117118 CheckByteAlignment(img->planes[0], kLegacyYPlaneByteAlignment);
118119 } else {
127128 // TODO(fgalligan): Move the MD5 testing code into another class.
128129 void OpenMd5File(const std::string &md5_file_name_) {
129130 md5_file_ = libvpx_test::OpenTestDataFile(md5_file_name_);
130 ASSERT_TRUE(md5_file_ != NULL)
131 ASSERT_NE(md5_file_, nullptr)
131132 << "MD5 file open failed. Filename: " << md5_file_name_;
132133 }
133134
134135 void CheckMd5(const vpx_image_t &img) {
135 ASSERT_TRUE(md5_file_ != NULL);
136 ASSERT_NE(md5_file_, nullptr);
136137 char expected_md5[33];
137138 char junk[128];
138139
2828
2929 void reference_pred(const Buffer<uint8_t> &pred, const Buffer<uint8_t> &ref,
3030 int width, int height, Buffer<uint8_t> *avg) {
31 ASSERT_TRUE(avg->TopLeftPixel() != NULL);
32 ASSERT_TRUE(pred.TopLeftPixel() != NULL);
33 ASSERT_TRUE(ref.TopLeftPixel() != NULL);
31 ASSERT_NE(avg->TopLeftPixel(), nullptr);
32 ASSERT_NE(pred.TopLeftPixel(), nullptr);
33 ASSERT_NE(ref.TopLeftPixel(), nullptr);
3434
3535 for (int y = 0; y < height; ++y) {
3636 for (int x = 0; x < width; ++x) {
5353 static void ClearSsim() { memset(ssim_array_, 0, kDataBufferSize / 16); }
5454 static void TearDownTestSuite() {
5555 vpx_free(source_data_[0]);
56 source_data_[0] = NULL;
56 source_data_[0] = nullptr;
5757 vpx_free(reference_data_[0]);
58 reference_data_[0] = NULL;
58 reference_data_[0] = nullptr;
5959 vpx_free(source_data_[1]);
60 source_data_[1] = NULL;
60 source_data_[1] = nullptr;
6161 vpx_free(reference_data_[1]);
62 reference_data_[1] = NULL;
62 reference_data_[1] = nullptr;
6363
6464 delete[] ssim_array_;
6565 }
144144 };
145145 #endif // CONFIG_VP9_ENCODER
146146
147 uint8_t *ConsistencyTestBase::source_data_[2] = { NULL, NULL };
148 uint8_t *ConsistencyTestBase::reference_data_[2] = { NULL, NULL };
149 Ssimv *ConsistencyTestBase::ssim_array_ = NULL;
147 uint8_t *ConsistencyTestBase::source_data_[2] = { nullptr, nullptr };
148 uint8_t *ConsistencyTestBase::reference_data_[2] = { nullptr, nullptr };
149 Ssimv *ConsistencyTestBase::ssim_array_ = nullptr;
150150
151151 #if CONFIG_VP9_ENCODER
152152 TEST_P(ConsistencyVP9Test, ConsistencyIsZero) {
364364
365365 static void TearDownTestSuite() {
366366 vpx_free(input_ - 1);
367 input_ = NULL;
367 input_ = nullptr;
368368 vpx_free(output_);
369 output_ = NULL;
369 output_ = nullptr;
370370 vpx_free(output_ref_);
371 output_ref_ = NULL;
371 output_ref_ = nullptr;
372372 #if CONFIG_VP9_HIGHBITDEPTH
373373 vpx_free(input16_ - 1);
374 input16_ = NULL;
374 input16_ = nullptr;
375375 vpx_free(output16_);
376 output16_ = NULL;
376 output16_ = nullptr;
377377 vpx_free(output16_ref_);
378 output16_ref_ = NULL;
378 output16_ref_ = nullptr;
379379 #endif
380380 }
381381
540540 #endif
541541 };
542542
543 uint8_t *ConvolveTest::input_ = NULL;
544 uint8_t *ConvolveTest::output_ = NULL;
545 uint8_t *ConvolveTest::output_ref_ = NULL;
546 #if CONFIG_VP9_HIGHBITDEPTH
547 uint16_t *ConvolveTest::input16_ = NULL;
548 uint16_t *ConvolveTest::output16_ = NULL;
549 uint16_t *ConvolveTest::output16_ref_ = NULL;
543 uint8_t *ConvolveTest::input_ = nullptr;
544 uint8_t *ConvolveTest::output_ = nullptr;
545 uint8_t *ConvolveTest::output_ref_ = nullptr;
546 #if CONFIG_VP9_HIGHBITDEPTH
547 uint16_t *ConvolveTest::input16_ = nullptr;
548 uint16_t *ConvolveTest::output16_ = nullptr;
549 uint16_t *ConvolveTest::output16_ref_ = nullptr;
550550 #endif
551551
552552 TEST_P(ConvolveTest, GuardBlocks) { CheckGuardBlocks(); }
561561
562562 vpx_usec_timer_start(&timer);
563563 for (int n = 0; n < kNumTests; ++n) {
564 UUT_->copy_[0](in, kInputStride, out, kOutputStride, NULL, 0, 0, 0, 0,
564 UUT_->copy_[0](in, kInputStride, out, kOutputStride, nullptr, 0, 0, 0, 0,
565565 width, height);
566566 }
567567 vpx_usec_timer_mark(&timer);
581581
582582 vpx_usec_timer_start(&timer);
583583 for (int n = 0; n < kNumTests; ++n) {
584 UUT_->copy_[1](in, kInputStride, out, kOutputStride, NULL, 0, 0, 0, 0,
584 UUT_->copy_[1](in, kInputStride, out, kOutputStride, nullptr, 0, 0, 0, 0,
585585 width, height);
586586 }
587587 vpx_usec_timer_mark(&timer);
779779 uint8_t *const out = output();
780780
781781 ASM_REGISTER_STATE_CHECK(UUT_->copy_[0](in, kInputStride, out, kOutputStride,
782 NULL, 0, 0, 0, 0, Width(), Height()));
782 nullptr, 0, 0, 0, 0, Width(),
783 Height()));
783784
784785 CheckGuardBlocks();
785786
798799 CopyOutputToRef();
799800
800801 ASM_REGISTER_STATE_CHECK(UUT_->copy_[1](in, kInputStride, out, kOutputStride,
801 NULL, 0, 0, 0, 0, Width(), Height()));
802 nullptr, 0, 0, 0, 0, Width(),
803 Height()));
802804
803805 CheckGuardBlocks();
804806
954956 UUT_->h8_[i](in, kInputStride, out, kOutputStride, filters,
955957 filter_x, 16, 0, 16, Width(), Height()));
956958 else
957 ASM_REGISTER_STATE_CHECK(UUT_->copy_[i](in, kInputStride, out,
958 kOutputStride, NULL, 0, 0,
959 0, 0, Width(), Height()));
959 ASM_REGISTER_STATE_CHECK(
960 UUT_->copy_[i](in, kInputStride, out, kOutputStride, nullptr, 0,
961 0, 0, 0, Width(), Height()));
960962
961963 CheckGuardBlocks();
962964
10521054 UUT_->h8_[0](in, kInputStride, out, kOutputStride, filters,
10531055 filter_x, 16, 0, 16, Width(), Height()));
10541056 else
1055 ASM_REGISTER_STATE_CHECK(UUT_->copy_[0](in, kInputStride, out,
1056 kOutputStride, NULL, 0, 0,
1057 0, 0, Width(), Height()));
1057 ASM_REGISTER_STATE_CHECK(
1058 UUT_->copy_[0](in, kInputStride, out, kOutputStride, nullptr,
1059 0, 0, 0, 0, Width(), Height()));
10581060
10591061 for (int y = 0; y < Height(); ++y) {
10601062 for (int x = 0; x < Width(); ++x)
713713 RunQuantCheck(429, 729);
714714 }
715715
716 #if HAVE_SSE2 && CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
716717 class InvTrans16x16DCT : public Trans16x16TestBase,
717718 public ::testing::TestWithParam<Idct16x16Param> {
718719 public:
738739 IdctFunc inv_txfm_;
739740 int thresh_;
740741 };
742 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(InvTrans16x16DCT);
741743
742744 TEST_P(InvTrans16x16DCT, CompareReference) {
743745 CompareInvReference(ref_txfm_, thresh_);
744746 }
747 #endif // HAVE_SSE2 && CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
745748
746749 using std::make_tuple;
747750
3838
3939 tran_low_t partial_fdct_ref(const Buffer<int16_t> &in, int size) {
4040 int64_t sum = 0;
41 if (in.TopLeftPixel() != NULL) {
41 if (in.TopLeftPixel() != nullptr) {
4242 for (int y = 0; y < size; ++y) {
4343 for (int x = 0; x < size; ++x) {
4444 sum += in.TopLeftPixel()[y * in.stride() + x];
8080 Buffer<tran_low_t> output_block = Buffer<tran_low_t>(size_, size_, 0, 16);
8181 ASSERT_TRUE(output_block.Init());
8282
83 if (output_block.TopLeftPixel() != NULL) {
83 if (output_block.TopLeftPixel() != nullptr) {
8484 for (int i = 0; i < 100; ++i) {
8585 if (i == 0) {
8686 input_block.Set(maxvalue);
159159
160160 src_ = reinterpret_cast<uint8_t *>(
161161 vpx_memalign(16, pixel_size_ * block_size_));
162 ASSERT_TRUE(src_ != NULL);
162 ASSERT_NE(src_, nullptr);
163163 dst_ = reinterpret_cast<uint8_t *>(
164164 vpx_memalign(16, pixel_size_ * block_size_));
165 ASSERT_TRUE(dst_ != NULL);
165 ASSERT_NE(dst_, nullptr);
166166 }
167167
168168 virtual void TearDown() {
169169 vpx_free(src_);
170 src_ = NULL;
170 src_ = nullptr;
171171 vpx_free(dst_);
172 dst_ = NULL;
172 dst_ = nullptr;
173173 libvpx_test::ClearSystemState();
174174 }
175175
210210 Buffer<int16_t> test_input_block =
211211 Buffer<int16_t>(size_, size_, 8, size_ == 4 ? 0 : 16);
212212 ASSERT_TRUE(test_input_block.Init());
213 ASSERT_TRUE(test_input_block.TopLeftPixel() != NULL);
213 ASSERT_NE(test_input_block.TopLeftPixel(), nullptr);
214214 Buffer<tran_low_t> test_temp_block =
215215 Buffer<tran_low_t>(size_, size_, 0, 16);
216216 ASSERT_TRUE(test_temp_block.Init());
315315 } else if (i == 1) {
316316 input_extreme_block.Set(-max_pixel_value_);
317317 } else {
318 ASSERT_TRUE(input_extreme_block.TopLeftPixel() != NULL);
318 ASSERT_NE(input_extreme_block.TopLeftPixel(), nullptr);
319319 for (int h = 0; h < size_; ++h) {
320320 for (int w = 0; w < size_; ++w) {
321321 input_extreme_block
330330
331331 // The minimum quant value is 4.
332332 EXPECT_TRUE(output_block.CheckValues(output_ref_block));
333 ASSERT_TRUE(output_block.TopLeftPixel() != NULL);
333 ASSERT_NE(output_block.TopLeftPixel(), nullptr);
334334 for (int h = 0; h < size_; ++h) {
335335 for (int w = 0; w < size_; ++w) {
336336 EXPECT_GE(
368368
369369 for (int i = 0; i < count_test_block; ++i) {
370370 InitMem();
371 ASSERT_TRUE(in.TopLeftPixel() != NULL);
371 ASSERT_NE(in.TopLeftPixel(), nullptr);
372372 // Initialize a test block with input range [-max_pixel_value_,
373373 // max_pixel_value_].
374374 for (int h = 0; h < size_; ++h) {
8686 vpx_usec_timer t;
8787 vpx_usec_timer_start(&t);
8888
89 for (video.Begin(); video.cxdata() != NULL; video.Next()) {
89 for (video.Begin(); video.cxdata() != nullptr; video.Next()) {
9090 decoder.DecodeFrame(video.cxdata(), video.frame_size());
9191 }
9292
149149 const std::string data_path = getenv("LIBVPX_TEST_DATA_PATH");
150150 const std::string path_to_source = data_path + "/" + kNewEncodeOutputFile;
151151 outfile_ = fopen(path_to_source.c_str(), "wb");
152 ASSERT_TRUE(outfile_ != NULL);
152 ASSERT_NE(outfile_, nullptr);
153153 }
154154
155155 virtual void EndPassHook() {
156 if (outfile_ != NULL) {
156 if (outfile_ != nullptr) {
157157 if (!fseek(outfile_, 0, SEEK_SET)) {
158158 ivf_write_file_header(outfile_, &cfg_, VP9_FOURCC, out_frames_);
159159 }
160160 fclose(outfile_);
161 outfile_ = NULL;
161 outfile_ = nullptr;
162162 }
163163 }
164164
235235 vpx_usec_timer t;
236236 vpx_usec_timer_start(&t);
237237
238 for (decode_video.Begin(); decode_video.cxdata() != NULL;
238 for (decode_video.Begin(); decode_video.cxdata() != nullptr;
239239 decode_video.Next()) {
240240 decoder.DecodeFrame(decode_video.cxdata(), decode_video.frame_size());
241241 }
5555 const std::string filename = GET_PARAM(1);
5656 std::unique_ptr<libvpx_test::CompressedVideoSource> video;
5757 video.reset(new libvpx_test::IVFVideoSource(filename));
58 ASSERT_TRUE(video.get() != NULL);
58 ASSERT_NE(video.get(), nullptr);
5959 video->Init();
6060 total_frames_ = 0;
6161 spatial_layer_ = 0;
7272 const std::string filename = GET_PARAM(1);
7373 std::unique_ptr<libvpx_test::CompressedVideoSource> video;
7474 video.reset(new libvpx_test::IVFVideoSource(filename));
75 ASSERT_TRUE(video.get() != NULL);
75 ASSERT_NE(video.get(), nullptr);
7676 video->Init();
7777 total_frames_ = 0;
7878 spatial_layer_ = 1;
8989 const std::string filename = GET_PARAM(1);
9090 std::unique_ptr<libvpx_test::CompressedVideoSource> video;
9191 video.reset(new libvpx_test::IVFVideoSource(filename));
92 ASSERT_TRUE(video.get() != NULL);
92 ASSERT_NE(video.get(), nullptr);
9393 video->Init();
9494 total_frames_ = 0;
9595 spatial_layer_ = 2;
107107 const std::string filename = GET_PARAM(1);
108108 std::unique_ptr<libvpx_test::CompressedVideoSource> video;
109109 video.reset(new libvpx_test::IVFVideoSource(filename));
110 ASSERT_TRUE(video.get() != NULL);
110 ASSERT_NE(video.get(), nullptr);
111111 video->Init();
112112 total_frames_ = 0;
113113 spatial_layer_ = 10;
2525 }
2626
2727 vpx_codec_err_t Decoder::DecodeFrame(const uint8_t *cxdata, size_t size) {
28 return DecodeFrame(cxdata, size, NULL);
28 return DecodeFrame(cxdata, size, nullptr);
2929 }
3030
3131 vpx_codec_err_t Decoder::DecodeFrame(const uint8_t *cxdata, size_t size,
6666 void DecoderTest::RunLoop(CompressedVideoSource *video,
6767 const vpx_codec_dec_cfg_t &dec_cfg) {
6868 Decoder *const decoder = codec_->CreateDecoder(dec_cfg, flags_);
69 ASSERT_TRUE(decoder != NULL);
69 ASSERT_NE(decoder, nullptr);
7070 bool end_of_file = false;
7171
7272 // Decode frames.
7777 vpx_codec_stream_info_t stream_info;
7878 stream_info.sz = sizeof(stream_info);
7979
80 if (video->cxdata() != NULL) {
80 if (video->cxdata() != nullptr) {
8181 const vpx_codec_err_t res_peek = decoder->PeekStream(
8282 video->cxdata(), video->frame_size(), &stream_info);
8383 HandlePeekResult(decoder, video, res_peek);
8888 if (!HandleDecodeResult(res_dec, *video, decoder)) break;
8989 } else {
9090 // Signal end of the file to the decoder.
91 const vpx_codec_err_t res_dec = decoder->DecodeFrame(NULL, 0);
91 const vpx_codec_err_t res_dec = decoder->DecodeFrame(nullptr, 0);
9292 ASSERT_EQ(VPX_CODEC_OK, res_dec) << decoder->DecodeError();
9393 end_of_file = true;
9494 }
9595
9696 DxDataIterator dec_iter = decoder->GetDxData();
97 const vpx_image_t *img = NULL;
97 const vpx_image_t *img = nullptr;
9898
9999 // Get decompressed data
100100 while (!::testing::Test::HasFailure() && (img = dec_iter.Next())) {
3333
3434 EXPECT_EQ(&img, vpx_img_wrap(&img, VPX_IMG_FMT_I420, 1, 1, 1, buf));
3535
36 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, vpx_codec_enc_init(NULL, NULL, NULL, 0));
37 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, vpx_codec_enc_init(&enc, NULL, NULL, 0));
38 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, vpx_codec_encode(NULL, NULL, 0, 0, 0, 0));
39 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, vpx_codec_encode(NULL, &img, 0, 0, 0, 0));
40 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, vpx_codec_destroy(NULL));
4136 EXPECT_EQ(VPX_CODEC_INVALID_PARAM,
42 vpx_codec_enc_config_default(NULL, NULL, 0));
37 vpx_codec_enc_init(nullptr, nullptr, nullptr, 0));
4338 EXPECT_EQ(VPX_CODEC_INVALID_PARAM,
44 vpx_codec_enc_config_default(NULL, &cfg, 0));
45 EXPECT_TRUE(vpx_codec_error(NULL) != NULL);
39 vpx_codec_enc_init(&enc, nullptr, nullptr, 0));
40 EXPECT_EQ(VPX_CODEC_INVALID_PARAM,
41 vpx_codec_encode(nullptr, nullptr, 0, 0, 0, 0));
42 EXPECT_EQ(VPX_CODEC_INVALID_PARAM,
43 vpx_codec_encode(nullptr, &img, 0, 0, 0, 0));
44 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, vpx_codec_destroy(nullptr));
45 EXPECT_EQ(VPX_CODEC_INVALID_PARAM,
46 vpx_codec_enc_config_default(nullptr, nullptr, 0));
47 EXPECT_EQ(VPX_CODEC_INVALID_PARAM,
48 vpx_codec_enc_config_default(nullptr, &cfg, 0));
49 EXPECT_NE(vpx_codec_error(nullptr), nullptr);
4650
4751 for (int i = 0; i < NELEMENTS(kCodecs); ++i) {
4852 SCOPED_TRACE(vpx_codec_iface_name(kCodecs[i]));
4953 EXPECT_EQ(VPX_CODEC_INVALID_PARAM,
50 vpx_codec_enc_init(NULL, kCodecs[i], NULL, 0));
54 vpx_codec_enc_init(nullptr, kCodecs[i], nullptr, 0));
5155 EXPECT_EQ(VPX_CODEC_INVALID_PARAM,
52 vpx_codec_enc_init(&enc, kCodecs[i], NULL, 0));
56 vpx_codec_enc_init(&enc, kCodecs[i], nullptr, 0));
5357 EXPECT_EQ(VPX_CODEC_INVALID_PARAM,
5458 vpx_codec_enc_config_default(kCodecs[i], &cfg, 1));
5559
5660 EXPECT_EQ(VPX_CODEC_OK, vpx_codec_enc_config_default(kCodecs[i], &cfg, 0));
5761 EXPECT_EQ(VPX_CODEC_OK, vpx_codec_enc_init(&enc, kCodecs[i], &cfg, 0));
58 EXPECT_EQ(VPX_CODEC_OK, vpx_codec_encode(&enc, NULL, 0, 0, 0, 0));
62 EXPECT_EQ(VPX_CODEC_OK, vpx_codec_encode(&enc, nullptr, 0, 0, 0, 0));
5963
6064 EXPECT_EQ(VPX_CODEC_OK, vpx_codec_destroy(&enc));
6165 }
9090
9191 void Encoder::Flush() {
9292 const vpx_codec_err_t res =
93 vpx_codec_encode(&encoder_, NULL, 0, 0, 0, deadline_);
93 vpx_codec_encode(&encoder_, nullptr, 0, 0, 0, deadline_);
9494 if (!encoder_.priv)
9595 ASSERT_EQ(VPX_CODEC_ERROR, res) << EncoderError();
9696 else
181181 BeginPassHook(pass);
182182 std::unique_ptr<Encoder> encoder(
183183 codec_->CreateEncoder(cfg_, deadline_, init_flags_, &stats_));
184 ASSERT_TRUE(encoder.get() != NULL);
184 ASSERT_NE(encoder.get(), nullptr);
185185
186186 ASSERT_NO_FATAL_FAILURE(video->Begin());
187187 encoder->InitEncoder(video);
197197 codec_->CreateDecoder(dec_cfg, dec_init_flags));
198198 bool again;
199199 for (again = true; again; video->Next()) {
200 again = (video->img() != NULL);
200 again = (video->img() != nullptr);
201201
202202 PreEncodeFrameHook(video);
203203 PreEncodeFrameHook(video, encoder.get());
215215 switch (pkt->kind) {
216216 case VPX_CODEC_CX_FRAME_PKT:
217217 has_cxdata = true;
218 if (decoder.get() != NULL && DoDecode()) {
218 if (decoder != nullptr && DoDecode()) {
219219 PreDecodeFrameHook(video, decoder.get());
220220 vpx_codec_err_t res_dec = decoder->DecodeFrame(
221221 (const uint8_t *)pkt->data.frame.buf, pkt->data.frame.sz);
239239
240240 // Flush the decoder when there are no more fragments.
241241 if ((init_flags_ & VPX_CODEC_USE_OUTPUT_PARTITION) && has_dxdata) {
242 const vpx_codec_err_t res_dec = decoder->DecodeFrame(NULL, 0);
242 const vpx_codec_err_t res_dec = decoder->DecodeFrame(nullptr, 0);
243243 if (!HandleDecodeResult(res_dec, *video, decoder.get())) break;
244244 }
245245
146146 const vpx_codec_err_t res = vpx_codec_control_(&encoder_, ctrl_id, arg);
147147 ASSERT_EQ(VPX_CODEC_OK, res) << EncoderError();
148148 }
149
150 #if CONFIG_VP9_ENCODER
151 void Control(int ctrl_id, vpx_rc_funcs_t *arg) {
152 const vpx_codec_err_t res = vpx_codec_control_(&encoder_, ctrl_id, arg);
153 ASSERT_EQ(VPX_CODEC_OK, res) << EncoderError();
154 }
155 #endif // CONFIG_VP9_ENCODER
149156
150157 #if CONFIG_VP8_ENCODER || CONFIG_VP9_ENCODER
151158 void Control(int ctrl_id, vpx_active_map_t *arg) {
3535 class ExternalFrameBufferList {
3636 public:
3737 ExternalFrameBufferList()
38 : num_buffers_(0), num_used_buffers_(0), ext_fb_list_(NULL) {}
38 : num_buffers_(0), num_used_buffers_(0), ext_fb_list_(nullptr) {}
3939
4040 virtual ~ExternalFrameBufferList() {
4141 for (int i = 0; i < num_buffers_; ++i) {
5050
5151 num_buffers_ = num_buffers;
5252 ext_fb_list_ = new ExternalFrameBuffer[num_buffers_];
53 EXPECT_TRUE(ext_fb_list_ != NULL);
53 EXPECT_NE(ext_fb_list_, nullptr);
5454 memset(ext_fb_list_, 0, sizeof(ext_fb_list_[0]) * num_buffers_);
5555 return true;
5656 }
6060 // frame buffer is in use by libvpx. Finally sets |fb| to point to the
6161 // external frame buffer. Returns < 0 on an error.
6262 int GetFreeFrameBuffer(size_t min_size, vpx_codec_frame_buffer_t *fb) {
63 EXPECT_TRUE(fb != NULL);
63 EXPECT_NE(fb, nullptr);
6464 const int idx = FindFreeBufferIndex();
6565 if (idx == num_buffers_) return -1;
6666
8080 // Test function that will not allocate any data for the frame buffer.
8181 // Returns < 0 on an error.
8282 int GetZeroFrameBuffer(size_t min_size, vpx_codec_frame_buffer_t *fb) {
83 EXPECT_TRUE(fb != NULL);
83 EXPECT_NE(fb, nullptr);
8484 const int idx = FindFreeBufferIndex();
8585 if (idx == num_buffers_) return -1;
8686
8787 if (ext_fb_list_[idx].size < min_size) {
8888 delete[] ext_fb_list_[idx].data;
89 ext_fb_list_[idx].data = NULL;
89 ext_fb_list_[idx].data = nullptr;
9090 ext_fb_list_[idx].size = min_size;
9191 }
9292
9797 // Marks the external frame buffer that |fb| is pointing to as free.
9898 // Returns < 0 on an error.
9999 int ReturnFrameBuffer(vpx_codec_frame_buffer_t *fb) {
100 if (fb == NULL) {
101 EXPECT_TRUE(fb != NULL);
100 if (fb == nullptr) {
101 EXPECT_NE(fb, nullptr);
102102 return -1;
103103 }
104104 ExternalFrameBuffer *const ext_fb =
105105 reinterpret_cast<ExternalFrameBuffer *>(fb->priv);
106 if (ext_fb == NULL) {
107 EXPECT_TRUE(ext_fb != NULL);
106 if (ext_fb == nullptr) {
107 EXPECT_NE(ext_fb, nullptr);
108108 return -1;
109109 }
110110 EXPECT_EQ(1, ext_fb->in_use);
116116 // Checks that the vpx_image_t data is contained within the external frame
117117 // buffer private data passed back in the vpx_image_t.
118118 void CheckImageFrameBuffer(const vpx_image_t *img) {
119 if (img->fb_priv != NULL) {
119 if (img->fb_priv != nullptr) {
120120 const struct ExternalFrameBuffer *const ext_fb =
121121 reinterpret_cast<ExternalFrameBuffer *>(img->fb_priv);
122122
142142 // Sets |fb| to an external frame buffer. idx is the index into the frame
143143 // buffer list.
144144 void SetFrameBuffer(int idx, vpx_codec_frame_buffer_t *fb) {
145 ASSERT_TRUE(fb != NULL);
145 ASSERT_NE(fb, nullptr);
146146 fb->data = ext_fb_list_[idx].data;
147147 fb->size = ext_fb_list_[idx].size;
148148 ASSERT_EQ(0, ext_fb_list_[idx].in_use);
207207 protected:
208208 ExternalFrameBufferMD5Test()
209209 : DecoderTest(GET_PARAM(::libvpx_test::kCodecFactoryParam)),
210 md5_file_(NULL), num_buffers_(0) {}
210 md5_file_(nullptr), num_buffers_(0) {}
211211
212212 virtual ~ExternalFrameBufferMD5Test() {
213 if (md5_file_ != NULL) fclose(md5_file_);
213 if (md5_file_ != nullptr) fclose(md5_file_);
214214 }
215215
216216 virtual void PreDecodeFrameHook(
227227
228228 void OpenMD5File(const std::string &md5_file_name_) {
229229 md5_file_ = libvpx_test::OpenTestDataFile(md5_file_name_);
230 ASSERT_TRUE(md5_file_ != NULL)
230 ASSERT_NE(md5_file_, nullptr)
231231 << "Md5 file open failed. Filename: " << md5_file_name_;
232232 }
233233
234234 virtual void DecompressedFrameHook(const vpx_image_t &img,
235235 const unsigned int frame_number) {
236 ASSERT_TRUE(md5_file_ != NULL);
236 ASSERT_NE(md5_file_, nullptr);
237237 char expected_md5[33];
238238 char junk[128];
239239
285285 // Class for testing passing in external frame buffers to libvpx.
286286 class ExternalFrameBufferTest : public ::testing::Test {
287287 protected:
288 ExternalFrameBufferTest() : video_(NULL), decoder_(NULL), num_buffers_(0) {}
288 ExternalFrameBufferTest()
289 : video_(nullptr), decoder_(nullptr), num_buffers_(0) {}
289290
290291 virtual void SetUp() {
291292 video_ = new libvpx_test::WebMVideoSource(kVP9TestFile);
292 ASSERT_TRUE(video_ != NULL);
293 ASSERT_NE(video_, nullptr);
293294 video_->Init();
294295 video_->Begin();
295296
296297 vpx_codec_dec_cfg_t cfg = vpx_codec_dec_cfg_t();
297298 decoder_ = new libvpx_test::VP9Decoder(cfg, 0);
298 ASSERT_TRUE(decoder_ != NULL);
299 ASSERT_NE(decoder_, nullptr);
299300 }
300301
301302 virtual void TearDown() {
302303 delete decoder_;
303 decoder_ = NULL;
304 decoder_ = nullptr;
304305 delete video_;
305 video_ = NULL;
306 video_ = nullptr;
306307 }
307308
308309 // Passes the external frame buffer information to libvpx.
326327 }
327328
328329 vpx_codec_err_t DecodeRemainingFrames() {
329 for (; video_->cxdata() != NULL; video_->Next()) {
330 for (; video_->cxdata() != nullptr; video_->Next()) {
330331 const vpx_codec_err_t res =
331332 decoder_->DecodeFrame(video_->cxdata(), video_->frame_size());
332333 if (res != VPX_CODEC_OK) return res;
337338
338339 void CheckDecodedFrames() {
339340 libvpx_test::DxDataIterator dec_iter = decoder_->GetDxData();
340 const vpx_image_t *img = NULL;
341 const vpx_image_t *img = nullptr;
341342
342343 // Get decompressed data
343 while ((img = dec_iter.Next()) != NULL) {
344 while ((img = dec_iter.Next()) != nullptr) {
344345 fb_list_.CheckImageFrameBuffer(img);
345346 }
346347 }
355356 protected:
356357 virtual void SetUp() {
357358 video_ = new libvpx_test::WebMVideoSource(kVP9NonRefTestFile);
358 ASSERT_TRUE(video_ != NULL);
359 ASSERT_NE(video_, nullptr);
359360 video_->Init();
360361 video_->Begin();
361362
362363 vpx_codec_dec_cfg_t cfg = vpx_codec_dec_cfg_t();
363364 decoder_ = new libvpx_test::VP9Decoder(cfg, 0);
364 ASSERT_TRUE(decoder_ != NULL);
365 ASSERT_NE(decoder_, nullptr);
365366 }
366367
367368 virtual void CheckFrameBufferRelease() {
404405 return;
405406 #endif
406407 }
407 ASSERT_TRUE(video.get() != NULL);
408 ASSERT_NE(video.get(), nullptr);
408409 video->Init();
409410
410411 // Construct md5 file name.
481482 const int num_buffers = VP9_MAXIMUM_REF_BUFFERS + VPX_MAXIMUM_WORK_BUFFERS;
482483 ASSERT_EQ(
483484 VPX_CODEC_INVALID_PARAM,
484 SetFrameBufferFunctions(num_buffers, NULL, release_vp9_frame_buffer));
485 SetFrameBufferFunctions(num_buffers, nullptr, release_vp9_frame_buffer));
485486 }
486487
487488 TEST_F(ExternalFrameBufferTest, NullReleaseFunction) {
488489 const int num_buffers = VP9_MAXIMUM_REF_BUFFERS + VPX_MAXIMUM_WORK_BUFFERS;
489 ASSERT_EQ(VPX_CODEC_INVALID_PARAM,
490 SetFrameBufferFunctions(num_buffers, get_vp9_frame_buffer, NULL));
490 ASSERT_EQ(
491 VPX_CODEC_INVALID_PARAM,
492 SetFrameBufferFunctions(num_buffers, get_vp9_frame_buffer, nullptr));
491493 }
492494
493495 TEST_F(ExternalFrameBufferTest, SetAfterDecode) {
597597
598598 TEST_P(FwdTrans8x8HT, ExtremalCheck) { RunExtremalCheck(); }
599599
600 #if HAVE_SSE2 && CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
600601 class InvTrans8x8DCT : public FwdTrans8x8TestBase,
601602 public ::testing::TestWithParam<Idct8x8Param> {
602603 public:
623624 IdctFunc inv_txfm_;
624625 int thresh_;
625626 };
627 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(InvTrans8x8DCT);
626628
627629 TEST_P(InvTrans8x8DCT, CompareReference) {
628630 CompareInvReference(ref_txfm_, thresh_);
629631 }
632 #endif // HAVE_SSE2 && CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
630633
631634 using std::make_tuple;
632635
6868 #if CONFIG_VP9_ENCODER
6969 return &vpx_codec_vp9_cx_algo;
7070 #else
71 return NULL;
71 return nullptr;
7272 #endif
7373 }
7474 };
129129 encoder->InitEncoder(video);
130130 ASSERT_FALSE(::testing::Test::HasFatalFailure());
131131 for (bool again = true; again; video->Next()) {
132 again = (video->img() != NULL);
132 again = (video->img() != nullptr);
133133
134134 PreEncodeFrameHook(video, encoder.get());
135135 encoder->EncodeFrame(video, frame_flags_, expected_err);
3030 UUT = GetParam();
3131
3232 input = new Buffer<int16_t>(4, 4, 0);
33 ASSERT_TRUE(input != NULL);
33 ASSERT_NE(input, nullptr);
3434 ASSERT_TRUE(input->Init());
3535 predict = new Buffer<uint8_t>(4, 4, 3);
36 ASSERT_TRUE(predict != NULL);
36 ASSERT_NE(predict, nullptr);
3737 ASSERT_TRUE(predict->Init());
3838 output = new Buffer<uint8_t>(4, 4, 3);
39 ASSERT_TRUE(output != NULL);
39 ASSERT_NE(output, nullptr);
4040 ASSERT_TRUE(output->Init());
4141 }
4242
7171
7272 TEST_P(IDCTTest, TestAllOnes) {
7373 input->Set(0);
74 ASSERT_TRUE(input->TopLeftPixel() != NULL);
74 ASSERT_NE(input->TopLeftPixel(), nullptr);
7575 // When the first element is '4' it will fill the output buffer with '1'.
7676 input->TopLeftPixel()[0] = 4;
7777 predict->Set(0);
8989 // Set the transform output to '1' and make sure it gets added to the
9090 // prediction buffer.
9191 input->Set(0);
92 ASSERT_TRUE(input->TopLeftPixel() != NULL);
92 ASSERT_NE(input->TopLeftPixel(), nullptr);
9393 input->TopLeftPixel()[0] = 4;
9494 output->Set(0);
9595
3737 class InvalidFileTest : public ::libvpx_test::DecoderTest,
3838 public ::libvpx_test::CodecTestWithParam<DecodeParam> {
3939 protected:
40 InvalidFileTest() : DecoderTest(GET_PARAM(0)), res_file_(NULL) {}
40 InvalidFileTest() : DecoderTest(GET_PARAM(0)), res_file_(nullptr) {}
4141
4242 virtual ~InvalidFileTest() {
43 if (res_file_ != NULL) fclose(res_file_);
43 if (res_file_ != nullptr) fclose(res_file_);
4444 }
4545
4646 void OpenResFile(const std::string &res_file_name_) {
4747 res_file_ = libvpx_test::OpenTestDataFile(res_file_name_);
48 ASSERT_TRUE(res_file_ != NULL)
48 ASSERT_NE(res_file_, nullptr)
4949 << "Result file open failed. Filename: " << res_file_name_;
5050 }
5151
5353 const vpx_codec_err_t res_dec,
5454 const libvpx_test::CompressedVideoSource &video,
5555 libvpx_test::Decoder *decoder) {
56 EXPECT_TRUE(res_file_ != NULL);
56 EXPECT_NE(res_file_, nullptr);
5757 int expected_res_dec;
5858
5959 // Read integer result.
101101 return;
102102 #endif
103103 }
104 ASSERT_TRUE(video.get() != NULL);
104 ASSERT_NE(video.get(), nullptr);
105105 video->Init();
106106
107107 // Construct result file name. The file holds a list of expected integer
144144 loop_op_t loopfilter_op_;
145145 loop_op_t ref_loopfilter_op_;
146146 };
147
147 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(Loop8Test6Param);
148
149 #if HAVE_NEON || HAVE_SSE2 || \
150 (HAVE_DSPR2 || HAVE_MSA && !CONFIG_VP9_HIGHBITDEPTH)
148151 class Loop8Test9Param : public ::testing::TestWithParam<dualloop8_param_t> {
149152 public:
150153 virtual ~Loop8Test9Param() {}
163166 dual_loop_op_t loopfilter_op_;
164167 dual_loop_op_t ref_loopfilter_op_;
165168 };
169 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(Loop8Test9Param);
170 #endif // HAVE_NEON || HAVE_SSE2 || (HAVE_DSPR2 || HAVE_MSA &&
171 // (!CONFIG_VP9_HIGHBITDEPTH))
166172
167173 TEST_P(Loop8Test6Param, OperationCheck) {
168174 ACMRandom rnd(ACMRandom::DeterministicSeed());
274280 << "First failed at test case " << first_failure;
275281 }
276282
283 #if HAVE_NEON || HAVE_SSE2 || \
284 (HAVE_DSPR2 || HAVE_MSA && (!CONFIG_VP9_HIGHBITDEPTH))
277285 TEST_P(Loop8Test9Param, OperationCheck) {
278286 ACMRandom rnd(ACMRandom::DeterministicSeed());
279287 const int count_test_block = number_of_iterations;
401409 "loopfilter output. "
402410 << "First failed at test case " << first_failure;
403411 }
412 #endif // HAVE_NEON || HAVE_SSE2 || (HAVE_DSPR2 || HAVE_MSA &&
413 // (!CONFIG_VP9_HIGHBITDEPTH))
404414
405415 using std::make_tuple;
406416
128128 const char *ground_truth_file =
129129 "non_greedy_mv_test_files/ground_truth_16x16.txt";
130130 BLOCK_SIZE bsize = BLOCK_32X32;
131 MV *search_mf = NULL;
132 MV *smooth_mf = NULL;
133 MV *estimation = NULL;
134 MV *ground_truth = NULL;
135 int(*local_var)[MF_LOCAL_STRUCTURE_SIZE] = NULL;
131 MV *search_mf = nullptr;
132 MV *smooth_mf = nullptr;
133 MV *estimation = nullptr;
134 MV *ground_truth = nullptr;
135 int(*local_var)[MF_LOCAL_STRUCTURE_SIZE] = nullptr;
136136 int rows = 0, cols = 0;
137137
138138 int alpha = 100, max_iter = 100;
168168 const char *gt_local_var_file = "non_greedy_mv_test_files/localVar_16x16.txt";
169169 const char *search_mf_file = "non_greedy_mv_test_files/exhaust_16x16.txt";
170170 BLOCK_SIZE bsize = BLOCK_16X16;
171 int(*gt_local_var)[MF_LOCAL_STRUCTURE_SIZE] = NULL;
172 int(*est_local_var)[MF_LOCAL_STRUCTURE_SIZE] = NULL;
171 int(*gt_local_var)[MF_LOCAL_STRUCTURE_SIZE] = nullptr;
172 int(*est_local_var)[MF_LOCAL_STRUCTURE_SIZE] = nullptr;
173173 YV12_BUFFER_CONFIG ref_frame, cur_frame;
174174 int rows, cols;
175175 MV *search_mf;
101101
102102 virtual void TearDown() {
103103 vpx_free(input_block_);
104 input_block_ = NULL;
104 input_block_ = nullptr;
105105 vpx_free(output_block_);
106 output_block_ = NULL;
106 output_block_ = nullptr;
107107 vpx_free(output_block_ref_);
108 output_block_ref_ = NULL;
108 output_block_ref_ = nullptr;
109109 libvpx_test::ClearSystemState();
110110 }
111111
458458 SetRows(src_c_.TopLeftPixel(), rows_, cols_, src_c_.stride());
459459
460460 unsigned char *expected_output = new unsigned char[rows_ * cols_];
461 ASSERT_TRUE(expected_output != NULL);
461 ASSERT_NE(expected_output, nullptr);
462462 SetRows(expected_output, rows_, cols_, cols_);
463463
464464 RunFilterLevel(src_c_.TopLeftPixel(), rows_, cols_, src_c_.stride(), q2mbl(0),
4040 public:
4141 PredictTestBase()
4242 : width_(GET_PARAM(0)), height_(GET_PARAM(1)), predict_(GET_PARAM(2)),
43 src_(NULL), padded_dst_(NULL), dst_(NULL), dst_c_(NULL) {}
43 src_(nullptr), padded_dst_(nullptr), dst_(nullptr), dst_c_(nullptr) {}
4444
4545 virtual void SetUp() {
4646 src_ = new uint8_t[kSrcSize];
47 ASSERT_TRUE(src_ != NULL);
47 ASSERT_NE(src_, nullptr);
4848
4949 // padded_dst_ provides a buffer of kBorderSize around the destination
5050 // memory to facilitate detecting out of bounds writes.
5252 padded_dst_size_ = dst_stride_ * (kBorderSize + height_ + kBorderSize);
5353 padded_dst_ =
5454 reinterpret_cast<uint8_t *>(vpx_memalign(16, padded_dst_size_));
55 ASSERT_TRUE(padded_dst_ != NULL);
55 ASSERT_NE(padded_dst_, nullptr);
5656 dst_ = padded_dst_ + (kBorderSize * dst_stride_) + kBorderSize;
5757
5858 dst_c_ = new uint8_t[16 * 16];
59 ASSERT_TRUE(dst_c_ != NULL);
59 ASSERT_NE(dst_c_, nullptr);
6060
6161 memset(src_, 0, kSrcSize);
6262 memset(padded_dst_, 128, padded_dst_size_);
6565
6666 virtual void TearDown() {
6767 delete[] src_;
68 src_ = NULL;
68 src_ = nullptr;
6969 vpx_free(padded_dst_);
70 padded_dst_ = NULL;
71 dst_ = NULL;
70 padded_dst_ = nullptr;
71 dst_ = nullptr;
7272 delete[] dst_c_;
73 dst_c_ = NULL;
73 dst_c_ = nullptr;
7474 libvpx_test::ClearSystemState();
7575 }
7676
4545 public:
4646 virtual ~QuantizeTestBase() {
4747 vp8_remove_compressor(&vp8_comp_);
48 vp8_comp_ = NULL;
48 vp8_comp_ = nullptr;
4949 vpx_free(macroblockd_dst_);
50 macroblockd_dst_ = NULL;
50 macroblockd_dst_ = nullptr;
5151 libvpx_test::ClearSystemState();
5252 }
5353
145145 VP8Quantize asm_quant_;
146146 VP8Quantize c_quant_;
147147 };
148 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(QuantizeTest);
148149
149150 TEST_P(QuantizeTest, TestZeroInput) {
150151 FillCoeffConstant(0);
7878 protected:
7979 void RunOneLayer() {
8080 SetConfigOneLayer();
81 rc_api_->Create(rc_cfg_);
81 rc_api_ = libvpx::VP9RateControlRTC::Create(rc_cfg_);
8282 FrameInfo frame_info;
8383 libvpx::VP9FrameParamsQpRTC frame_params;
8484 frame_params.frame_type = KEY_FRAME;
8787 std::ifstream one_layer_file;
8888 one_layer_file.open(libvpx_test::GetDataPath() +
8989 "/rc_interface_test_one_layer");
90 ASSERT_EQ(one_layer_file.rdstate() & std::ifstream::failbit, 0);
90 ASSERT_TRUE(one_layer_file.good());
9191 for (size_t i = 0; i < kNumFrame; i++) {
9292 one_layer_file >> frame_info;
9393 if (frame_info.frame_id > 0) frame_params.frame_type = INTER_FRAME;
109109
110110 void RunSVC() {
111111 SetConfigSVC();
112 rc_api_->Create(rc_cfg_);
112 rc_api_ = libvpx::VP9RateControlRTC::Create(rc_cfg_);
113113 FrameInfo frame_info;
114114 libvpx::VP9FrameParamsQpRTC frame_params;
115115 frame_params.frame_type = KEY_FRAME;
116116 std::ifstream svc_file;
117117 svc_file.open(std::string(std::getenv("LIBVPX_TEST_DATA_PATH")) +
118118 "/rc_interface_test_svc");
119 ASSERT_EQ(svc_file.rdstate() & std::ifstream::failbit, 0);
119 ASSERT_TRUE(svc_file.good());
120120 for (size_t i = 0; i < kNumFrame * rc_cfg_.ss_number_layers; i++) {
121121 svc_file >> frame_info;
122122 if (frame_info.frame_id > 0) frame_params.frame_type = INTER_FRAME;
270270 protected:
271271 virtual void Next() {
272272 ++frame_;
273 unsigned int width;
274 unsigned int height;
273 unsigned int width = 0;
274 unsigned int height = 0;
275275 ScaleForFrameNumber(frame_, kInitialWidth, kInitialHeight, &width, &height,
276276 flag_codec_, smaller_width_larger_size_);
277277 SetSize(width, height);
349349 protected:
350350 #if WRITE_COMPRESSED_STREAM
351351 ResizeInternalTest()
352 : ResizeTest(), frame0_psnr_(0.0), outfile_(NULL), out_frames_(0) {}
352 : ResizeTest(), frame0_psnr_(0.0), outfile_(nullptr), out_frames_(0) {}
353353 #else
354354 ResizeInternalTest() : ResizeTest(), frame0_psnr_(0.0) {}
355355 #endif
368368 if (!fseek(outfile_, 0, SEEK_SET))
369369 write_ivf_file_header(&cfg_, out_frames_, outfile_);
370370 fclose(outfile_);
371 outfile_ = NULL;
371 outfile_ = nullptr;
372372 }
373373 #endif
374374 }
671671 ASSERT_EQ(info->h, GetFrameHeight(idx));
672672 if (info->w != last_w || info->h != last_h) {
673673 resize_count++;
674 if (resize_count == 1) {
674 if (resize_count <= 2) {
675675 // Verify that resize down occurs.
676676 ASSERT_LT(info->w, last_w);
677677 ASSERT_LT(info->h, last_h);
678 } else if (resize_count == 2) {
678 } else if (resize_count > 2) {
679679 // Verify that resize up occurs.
680680 ASSERT_GT(info->w, last_w);
681681 ASSERT_GT(info->h, last_h);
686686 }
687687
688688 #if CONFIG_VP9_DECODER
689 // Verify that we get 2 resize events in this test.
690 ASSERT_EQ(resize_count, 2) << "Resizing should occur twice.";
689 // Verify that we get 4 resize events in this test.
690 ASSERT_EQ(resize_count, 4) << "Resizing should occur twice.";
691691 EXPECT_EQ(static_cast<unsigned int>(0), GetMismatchFrames());
692692 #else
693693 printf("Warning: VP9 decoder unavailable, unable to check resize count!\n");
704704 protected:
705705 #if WRITE_COMPRESSED_STREAM
706706 ResizeCspTest()
707 : ResizeTest(), frame0_psnr_(0.0), outfile_(NULL), out_frames_(0) {}
707 : ResizeTest(), frame0_psnr_(0.0), outfile_(nullptr), out_frames_(0) {}
708708 #else
709709 ResizeCspTest() : ResizeTest(), frame0_psnr_(0.0) {}
710710 #endif
723723 if (!fseek(outfile_, 0, SEEK_SET))
724724 write_ivf_file_header(&cfg_, out_frames_, outfile_);
725725 fclose(outfile_);
726 outfile_ = NULL;
726 outfile_ = nullptr;
727727 }
728728 #endif
729729 }
2424 #include "vpx_ports/mem.h"
2525 #include "vpx_ports/msvc.h"
2626 #include "vpx_ports/vpx_timer.h"
27
28 // const[expr] should be sufficient for DECLARE_ALIGNED but early
29 // implementations of c++11 appear to have some issues with it.
30 #define kDataAlignment 32
2731
2832 template <typename Function>
2933 struct TestParams {
98102
99103 virtual void TearDown() {
100104 vpx_free(source_data8_);
101 source_data8_ = NULL;
105 source_data8_ = nullptr;
102106 vpx_free(reference_data8_);
103 reference_data8_ = NULL;
107 reference_data8_ = nullptr;
104108 vpx_free(second_pred8_);
105 second_pred8_ = NULL;
109 second_pred8_ = nullptr;
106110 vpx_free(source_data16_);
107 source_data16_ = NULL;
111 source_data16_ = nullptr;
108112 vpx_free(reference_data16_);
109 reference_data16_ = NULL;
113 reference_data16_ = nullptr;
110114 vpx_free(second_pred16_);
111 second_pred16_ = NULL;
115 second_pred16_ = nullptr;
112116
113117 libvpx_test::ClearSystemState();
114118 }
116120 protected:
117121 // Handle blocks up to 4 blocks 64x64 with stride up to 128
118122 // crbug.com/webm/1660
119 // const[expr] should be sufficient for DECLARE_ALIGNED but early
120 // implementations of c++11 appear to have some issues with it.
121 enum { kDataAlignment = 32 };
122123 static const int kDataBlockSize = 64 * 128;
123124 static const int kDataBufferSize = 4 * kDataBlockSize;
124125
99
1010 #include <math.h>
1111 #include <memory>
12 #include <string>
1213 #include <vector>
1314 #include "third_party/googletest/src/include/gtest/gtest.h"
1415 #include "vp9/simple_encode.h"
1516
1617 namespace vp9 {
1718 namespace {
18
19 // TODO(angirbid): Find a better way to construct encode info
20 const int w = 352;
21 const int h = 288;
22 const int frame_rate_num = 30;
23 const int frame_rate_den = 1;
24 const int target_bitrate = 1000;
25 const int num_frames = 17;
26 const char infile_path[] = "bus_352x288_420_f20_b8.yuv";
2719
2820 double GetBitrateInKbps(size_t bit_size, int num_frames, int frame_rate_num,
2921 int frame_rate_den) {
3527 // For example, if size is 7, return 2.
3628 int GetNumUnit4x4(int size) { return (size + 3) >> 2; }
3729
38 TEST(SimpleEncode, ComputeFirstPassStats) {
39 SimpleEncode simple_encode(w, h, frame_rate_num, frame_rate_den,
40 target_bitrate, num_frames, infile_path);
30 class SimpleEncodeTest : public ::testing::Test {
31 protected:
32 const int width_ = 352;
33 const int height_ = 288;
34 const int frame_rate_num_ = 30;
35 const int frame_rate_den_ = 1;
36 const int target_bitrate_ = 1000;
37 const int num_frames_ = 17;
38 const std::string in_file_path_str_ = "bus_352x288_420_f20_b8.yuv";
39 };
40
41 TEST_F(SimpleEncodeTest, ComputeFirstPassStats) {
42 SimpleEncode simple_encode(width_, height_, frame_rate_num_, frame_rate_den_,
43 target_bitrate_, num_frames_,
44 in_file_path_str_.c_str());
4145 simple_encode.ComputeFirstPassStats();
4246 std::vector<std::vector<double>> frame_stats =
4347 simple_encode.ObserveFirstPassStats();
44 EXPECT_EQ(frame_stats.size(), static_cast<size_t>(num_frames));
45 size_t data_num = frame_stats[0].size();
48 EXPECT_EQ(frame_stats.size(), static_cast<size_t>(num_frames_));
49 const size_t data_num = frame_stats[0].size();
4650 // Read ObserveFirstPassStats before changing FIRSTPASS_STATS.
4751 EXPECT_EQ(data_num, static_cast<size_t>(25));
4852 for (size_t i = 0; i < frame_stats.size(); ++i) {
5559 }
5660 }
5761
58 TEST(SimpleEncode, GetCodingFrameNum) {
59 SimpleEncode simple_encode(w, h, frame_rate_num, frame_rate_den,
60 target_bitrate, num_frames, infile_path);
62 TEST_F(SimpleEncodeTest, ObserveFirstPassMotionVectors) {
63 SimpleEncode simple_encode(width_, height_, frame_rate_num_, frame_rate_den_,
64 target_bitrate_, num_frames_,
65 in_file_path_str_.c_str());
66 simple_encode.ComputeFirstPassStats();
67 std::vector<std::vector<MotionVectorInfo>> fps_motion_vectors =
68 simple_encode.ObserveFirstPassMotionVectors();
69 EXPECT_EQ(fps_motion_vectors.size(), static_cast<size_t>(num_frames_));
70 const size_t num_blocks = ((width_ + 15) >> 4) * ((height_ + 15) >> 4);
71 EXPECT_EQ(num_blocks, fps_motion_vectors[0].size());
72 for (size_t i = 0; i < fps_motion_vectors.size(); ++i) {
73 EXPECT_EQ(num_blocks, fps_motion_vectors[i].size());
74 for (size_t j = 0; j < num_blocks; ++j) {
75 const int mv_count = fps_motion_vectors[i][j].mv_count;
76 const int ref_count =
77 (fps_motion_vectors[i][j].ref_frame[0] != kRefFrameTypeNone) +
78 (fps_motion_vectors[i][j].ref_frame[1] != kRefFrameTypeNone);
79 EXPECT_EQ(mv_count, ref_count);
80 }
81 }
82 }
83
84 TEST_F(SimpleEncodeTest, GetCodingFrameNum) {
85 SimpleEncode simple_encode(width_, height_, frame_rate_num_, frame_rate_den_,
86 target_bitrate_, num_frames_,
87 in_file_path_str_.c_str());
88 simple_encode.ComputeFirstPassStats();
89 const int num_coding_frames = simple_encode.GetCodingFrameNum();
90 EXPECT_EQ(num_coding_frames, 19);
91 }
92
93 TEST_F(SimpleEncodeTest, EncodeFrame) {
94 SimpleEncode simple_encode(width_, height_, frame_rate_num_, frame_rate_den_,
95 target_bitrate_, num_frames_,
96 in_file_path_str_.c_str());
6197 simple_encode.ComputeFirstPassStats();
6298 int num_coding_frames = simple_encode.GetCodingFrameNum();
63 EXPECT_EQ(num_coding_frames, 19);
64 }
65
66 TEST(SimpleEncode, EncodeFrame) {
67 SimpleEncode simple_encode(w, h, frame_rate_num, frame_rate_den,
68 target_bitrate, num_frames, infile_path);
69 simple_encode.ComputeFirstPassStats();
70 int num_coding_frames = simple_encode.GetCodingFrameNum();
71 EXPECT_GE(num_coding_frames, num_frames);
99 EXPECT_GE(num_coding_frames, num_frames_);
72100 simple_encode.StartEncode();
73101 size_t total_data_bit_size = 0;
74102 int coded_show_frame_count = 0;
75103 int frame_coding_index = 0;
76 while (coded_show_frame_count < num_frames) {
104 while (coded_show_frame_count < num_frames_) {
77105 const GroupOfPicture group_of_picture =
78106 simple_encode.ObserveGroupOfPicture();
79107 const std::vector<EncodeFrameInfo> &encode_frame_list =
98126 }
99127 coded_show_frame_count += group_of_picture.show_frame_count;
100128 }
101 const double bitrate = GetBitrateInKbps(total_data_bit_size, num_frames,
102 frame_rate_num, frame_rate_den);
129 const double bitrate = GetBitrateInKbps(total_data_bit_size, num_frames_,
130 frame_rate_num_, frame_rate_den_);
103131 const double off_target_threshold = 150;
104 EXPECT_LE(fabs(target_bitrate - bitrate), off_target_threshold);
105 simple_encode.EndEncode();
106 }
107
108 TEST(SimpleEncode, ObserveKeyFrameMap) {
109 SimpleEncode simple_encode(w, h, frame_rate_num, frame_rate_den,
110 target_bitrate, num_frames, infile_path);
132 EXPECT_LE(fabs(target_bitrate_ - bitrate), off_target_threshold);
133 simple_encode.EndEncode();
134 }
135
136 TEST_F(SimpleEncodeTest, ObserveKeyFrameMap) {
137 SimpleEncode simple_encode(width_, height_, frame_rate_num_, frame_rate_den_,
138 target_bitrate_, num_frames_,
139 in_file_path_str_.c_str());
111140 simple_encode.ComputeFirstPassStats();
112141 std::vector<int> key_frame_map = simple_encode.ObserveKeyFrameMap();
113 EXPECT_EQ(key_frame_map.size(), static_cast<size_t>(num_frames));
142 EXPECT_EQ(key_frame_map.size(), static_cast<size_t>(num_frames_));
114143 simple_encode.StartEncode();
115144 int coded_show_frame_count = 0;
116 while (coded_show_frame_count < num_frames) {
145 while (coded_show_frame_count < num_frames_) {
117146 const GroupOfPicture group_of_picture =
118147 simple_encode.ObserveGroupOfPicture();
119148 const std::vector<EncodeFrameInfo> &encode_frame_list =
133162 simple_encode.EndEncode();
134163 }
135164
136 TEST(SimpleEncode, EncodeFrameWithQuantizeIndex) {
137 SimpleEncode simple_encode(w, h, frame_rate_num, frame_rate_den,
138 target_bitrate, num_frames, infile_path);
139 simple_encode.ComputeFirstPassStats();
140 int num_coding_frames = simple_encode.GetCodingFrameNum();
165 TEST_F(SimpleEncodeTest, EncodeFrameWithTargetFrameBits) {
166 SimpleEncode simple_encode(width_, height_, frame_rate_num_, frame_rate_den_,
167 target_bitrate_, num_frames_,
168 in_file_path_str_.c_str());
169 simple_encode.ComputeFirstPassStats();
170 const int num_coding_frames = simple_encode.GetCodingFrameNum();
171 simple_encode.StartEncode();
172 for (int i = 0; i < num_coding_frames; ++i) {
173 EncodeFrameInfo encode_frame_info = simple_encode.GetNextEncodeFrameInfo();
174 int target_frame_bits;
175 switch (encode_frame_info.frame_type) {
176 case kFrameTypeInter: target_frame_bits = 20000; break;
177 case kFrameTypeKey:
178 case kFrameTypeAltRef:
179 case kFrameTypeGolden: target_frame_bits = 100000; break;
180 case kFrameTypeOverlay: target_frame_bits = 2000; break;
181 default: target_frame_bits = 20000;
182 }
183
184 double percent_diff = 15;
185 if (encode_frame_info.frame_type == kFrameTypeOverlay) {
186 percent_diff = 100;
187 }
188 EncodeFrameResult encode_frame_result;
189 simple_encode.EncodeFrameWithTargetFrameBits(
190 &encode_frame_result, target_frame_bits, percent_diff);
191 const int recode_count = encode_frame_result.recode_count;
192 // TODO(angiebird): Replace 7 by RATE_CTRL_MAX_RECODE_NUM
193 EXPECT_LE(recode_count, 7);
194 EXPECT_GE(recode_count, 1);
195
196 const double diff = fabs((double)encode_frame_result.coding_data_bit_size -
197 target_frame_bits);
198 EXPECT_LE(diff * 100 / target_frame_bits, percent_diff);
199 }
200 simple_encode.EndEncode();
201 }
202
203 TEST_F(SimpleEncodeTest, EncodeFrameWithQuantizeIndex) {
204 SimpleEncode simple_encode(width_, height_, frame_rate_num_, frame_rate_den_,
205 target_bitrate_, num_frames_,
206 in_file_path_str_.c_str());
207 simple_encode.ComputeFirstPassStats();
208 const int num_coding_frames = simple_encode.GetCodingFrameNum();
141209 simple_encode.StartEncode();
142210 for (int i = 0; i < num_coding_frames; ++i) {
143211 const int assigned_quantize_index = 100 + i;
149217 simple_encode.EndEncode();
150218 }
151219
152 TEST(SimpleEncode, EncodeConsistencyTest) {
220 // This test encodes the video using EncodeFrame(), where quantize indexes
221 // are selected by vp9 rate control.
222 // Encode stats and the quantize_indexes are collected.
223 // Then the test encodes the video again using EncodeFrameWithQuantizeIndex()
224 // using the quantize indexes collected from the first run.
225 // Then test whether the encode stats of the two encoding runs match.
226 TEST_F(SimpleEncodeTest, EncodeConsistencyTest) {
153227 std::vector<int> quantize_index_list;
154228 std::vector<uint64_t> ref_sse_list;
155229 std::vector<double> ref_psnr_list;
156230 std::vector<size_t> ref_bit_size_list;
231 std::vector<FrameType> ref_frame_type_list;
232 std::vector<int> ref_show_idx_list;
157233 {
158234 // The first encode.
159 SimpleEncode simple_encode(w, h, frame_rate_num, frame_rate_den,
160 target_bitrate, num_frames, infile_path);
235 SimpleEncode simple_encode(width_, height_, frame_rate_num_,
236 frame_rate_den_, target_bitrate_, num_frames_,
237 in_file_path_str_.c_str());
161238 simple_encode.ComputeFirstPassStats();
162239 const int num_coding_frames = simple_encode.GetCodingFrameNum();
163240 simple_encode.StartEncode();
168245 ref_sse_list.push_back(encode_frame_result.sse);
169246 ref_psnr_list.push_back(encode_frame_result.psnr);
170247 ref_bit_size_list.push_back(encode_frame_result.coding_data_bit_size);
248 ref_frame_type_list.push_back(encode_frame_result.frame_type);
249 ref_show_idx_list.push_back(encode_frame_result.show_idx);
171250 }
172251 simple_encode.EndEncode();
173252 }
174253 {
175254 // The second encode with quantize index got from the first encode.
176 SimpleEncode simple_encode(w, h, frame_rate_num, frame_rate_den,
177 target_bitrate, num_frames, infile_path);
255 SimpleEncode simple_encode(width_, height_, frame_rate_num_,
256 frame_rate_den_, target_bitrate_, num_frames_,
257 in_file_path_str_.c_str());
178258 simple_encode.ComputeFirstPassStats();
179259 const int num_coding_frames = simple_encode.GetCodingFrameNum();
180260 EXPECT_EQ(static_cast<size_t>(num_coding_frames),
188268 EXPECT_EQ(encode_frame_result.sse, ref_sse_list[i]);
189269 EXPECT_DOUBLE_EQ(encode_frame_result.psnr, ref_psnr_list[i]);
190270 EXPECT_EQ(encode_frame_result.coding_data_bit_size, ref_bit_size_list[i]);
271 EXPECT_EQ(encode_frame_result.frame_type, ref_frame_type_list[i]);
272 EXPECT_EQ(encode_frame_result.show_idx, ref_show_idx_list[i]);
191273 }
192274 simple_encode.EndEncode();
193275 }
195277
196278 // Test the information (partition info and motion vector info) stored in
197279 // encoder is the same between two encode runs.
198 TEST(SimpleEncode, EncodeConsistencyTest2) {
199 const int num_rows_4x4 = GetNumUnit4x4(w);
200 const int num_cols_4x4 = GetNumUnit4x4(h);
280 TEST_F(SimpleEncodeTest, EncodeConsistencyTest2) {
281 const int num_rows_4x4 = GetNumUnit4x4(width_);
282 const int num_cols_4x4 = GetNumUnit4x4(height_);
201283 const int num_units_4x4 = num_rows_4x4 * num_cols_4x4;
202284 // The first encode.
203 SimpleEncode simple_encode(w, h, frame_rate_num, frame_rate_den,
204 target_bitrate, num_frames, infile_path);
285 SimpleEncode simple_encode(width_, height_, frame_rate_num_, frame_rate_den_,
286 target_bitrate_, num_frames_,
287 in_file_path_str_.c_str());
205288 simple_encode.ComputeFirstPassStats();
206289 const int num_coding_frames = simple_encode.GetCodingFrameNum();
207290 std::vector<PartitionInfo> partition_info_list(num_units_4x4 *
221304 }
222305 simple_encode.EndEncode();
223306 // The second encode.
224 SimpleEncode simple_encode_2(w, h, frame_rate_num, frame_rate_den,
225 target_bitrate, num_frames, infile_path);
307 SimpleEncode simple_encode_2(width_, height_, frame_rate_num_,
308 frame_rate_den_, target_bitrate_, num_frames_,
309 in_file_path_str_.c_str());
226310 simple_encode_2.ComputeFirstPassStats();
227311 const int num_coding_frames_2 = simple_encode_2.GetCodingFrameNum();
228312 simple_encode_2.StartEncode();
263347 }
264348
265349 // Test the information stored in encoder is the same between two encode runs.
266 TEST(SimpleEncode, EncodeConsistencyTest3) {
350 TEST_F(SimpleEncodeTest, EncodeConsistencyTest3) {
267351 std::vector<int> quantize_index_list;
268 const int num_rows_4x4 = GetNumUnit4x4(w);
269 const int num_cols_4x4 = GetNumUnit4x4(h);
352 const int num_rows_4x4 = GetNumUnit4x4(width_);
353 const int num_cols_4x4 = GetNumUnit4x4(height_);
270354 const int num_units_4x4 = num_rows_4x4 * num_cols_4x4;
271355 // The first encode.
272 SimpleEncode simple_encode(w, h, frame_rate_num, frame_rate_den,
273 target_bitrate, num_frames, infile_path);
356 SimpleEncode simple_encode(width_, height_, frame_rate_num_, frame_rate_den_,
357 target_bitrate_, num_frames_,
358 in_file_path_str_.c_str());
274359 simple_encode.ComputeFirstPassStats();
275360 const int num_coding_frames = simple_encode.GetCodingFrameNum();
276361 std::vector<PartitionInfo> partition_info_list(num_units_4x4 *
287372 }
288373 simple_encode.EndEncode();
289374 // The second encode.
290 SimpleEncode simple_encode_2(w, h, frame_rate_num, frame_rate_den,
291 target_bitrate, num_frames, infile_path);
375 SimpleEncode simple_encode_2(width_, height_, frame_rate_num_,
376 frame_rate_den_, target_bitrate_, num_frames_,
377 in_file_path_str_.c_str());
292378 simple_encode_2.ComputeFirstPassStats();
293379 const int num_coding_frames_2 = simple_encode_2.GetCodingFrameNum();
294380 simple_encode_2.StartEncode();
318404 // Get QPs and arf locations from the first encode.
319405 // Set external arfs and QPs for the second encode.
320406 // Expect to get matched results.
321 TEST(SimpleEncode, EncodeConsistencySetExternalGroupOfPicturesMap) {
407 TEST_F(SimpleEncodeTest, EncodeConsistencySetExternalGroupOfPicturesMap) {
322408 std::vector<int> quantize_index_list;
323409 std::vector<uint64_t> ref_sse_list;
324410 std::vector<double> ref_psnr_list;
325411 std::vector<size_t> ref_bit_size_list;
326 std::vector<int> gop_map(num_frames, 0);
412 std::vector<int> gop_map(num_frames_, 0);
327413 {
328414 // The first encode.
329 SimpleEncode simple_encode(w, h, frame_rate_num, frame_rate_den,
330 target_bitrate, num_frames, infile_path);
415 SimpleEncode simple_encode(width_, height_, frame_rate_num_,
416 frame_rate_den_, target_bitrate_, num_frames_,
417 in_file_path_str_.c_str());
331418 simple_encode.ComputeFirstPassStats();
332419 simple_encode.StartEncode();
333420
334421 int coded_show_frame_count = 0;
335 while (coded_show_frame_count < num_frames) {
422 while (coded_show_frame_count < num_frames_) {
336423 const GroupOfPicture group_of_picture =
337424 simple_encode.ObserveGroupOfPicture();
338425 gop_map[coded_show_frame_count] |= kGopMapFlagStart;
357444 {
358445 // The second encode with quantize index got from the first encode.
359446 // The external arfs are the same as the first encode.
360 SimpleEncode simple_encode(w, h, frame_rate_num, frame_rate_den,
361 target_bitrate, num_frames, infile_path);
447 SimpleEncode simple_encode(width_, height_, frame_rate_num_,
448 frame_rate_den_, target_bitrate_, num_frames_,
449 in_file_path_str_.c_str());
362450 simple_encode.ComputeFirstPassStats();
363 simple_encode.SetExternalGroupOfPicturesMap(gop_map);
451 simple_encode.SetExternalGroupOfPicturesMap(gop_map.data(), gop_map.size());
364452 const int num_coding_frames = simple_encode.GetCodingFrameNum();
365453 EXPECT_EQ(static_cast<size_t>(num_coding_frames),
366454 quantize_index_list.size());
378466 }
379467 }
380468
381 TEST(SimpleEncode, SetExternalGroupOfPicturesMap) {
382 SimpleEncode simple_encode(w, h, frame_rate_num, frame_rate_den,
383 target_bitrate, num_frames, infile_path);
384 simple_encode.ComputeFirstPassStats();
385
386 std::vector<int> gop_map(num_frames, 0);
469 TEST_F(SimpleEncodeTest, SetExternalGroupOfPicturesMap) {
470 SimpleEncode simple_encode(width_, height_, frame_rate_num_, frame_rate_den_,
471 target_bitrate_, num_frames_,
472 in_file_path_str_.c_str());
473 simple_encode.ComputeFirstPassStats();
474
475 std::vector<int> gop_map(num_frames_, 0);
387476
388477 // Should be the first gop group.
389478 gop_map[0] = 0;
397486 // Last gop group.
398487 gop_map[14] |= kGopMapFlagStart | kGopMapFlagUseAltRef;
399488
400 simple_encode.SetExternalGroupOfPicturesMap(gop_map);
489 simple_encode.SetExternalGroupOfPicturesMap(gop_map.data(), gop_map.size());
401490
402491 std::vector<int> observed_gop_map =
403492 simple_encode.ObserveExternalGroupOfPicturesMap();
424513
425514 simple_encode.StartEncode();
426515 int coded_show_frame_count = 0;
427 while (coded_show_frame_count < num_frames) {
516 while (coded_show_frame_count < num_frames_) {
428517 const GroupOfPicture group_of_picture =
429518 simple_encode.ObserveGroupOfPicture();
430519 const std::vector<EncodeFrameInfo> &encode_frame_list =
445534 simple_encode.EndEncode();
446535 }
447536
448 TEST(SimpleEncode, GetEncodeFrameInfo) {
537 TEST_F(SimpleEncodeTest, GetEncodeFrameInfo) {
449538 // Makes sure that the encode_frame_info obtained from GetEncodeFrameInfo()
450539 // matches the counterpart in encode_frame_result obtained from EncodeFrame()
451 SimpleEncode simple_encode(w, h, frame_rate_num, frame_rate_den,
452 target_bitrate, num_frames, infile_path);
540 SimpleEncode simple_encode(width_, height_, frame_rate_num_, frame_rate_den_,
541 target_bitrate_, num_frames_,
542 in_file_path_str_.c_str());
453543 simple_encode.ComputeFirstPassStats();
454544 const int num_coding_frames = simple_encode.GetCodingFrameNum();
455545 simple_encode.StartEncode();
463553 simple_encode.EndEncode();
464554 }
465555
466 TEST(SimpleEncode, GetFramePixelCount) {
467 SimpleEncode simple_encode(w, h, frame_rate_num, frame_rate_den,
468 target_bitrate, num_frames, infile_path);
556 TEST_F(SimpleEncodeTest, GetFramePixelCount) {
557 SimpleEncode simple_encode(width_, height_, frame_rate_num_, frame_rate_den_,
558 target_bitrate_, num_frames_,
559 in_file_path_str_.c_str());
469560 EXPECT_EQ(simple_encode.GetFramePixelCount(),
470 static_cast<uint64_t>(w * h * 3 / 2));
561 static_cast<uint64_t>(width_ * height_ * 3 / 2));
471562 }
472563
473564 } // namespace
1717 YUV="${LIBVPX_TEST_DATA_PATH}/niklas_1280_720_30.yuv"
1818 VP8="${LIBVPX_TEST_DATA_PATH}/tos_vp8.webm"
1919 VP9="${LIBVPX_TEST_DATA_PATH}/vp90-2-sintel_1920x818_tile_1x4_fpm_2279kbps.webm"
20 DATA_URL="http://downloads.webmproject.org/test_data/libvpx/"
20 DATA_URL="https://storage.googleapis.com/downloads.webmproject.org/test_data/libvpx/"
2121 SHA1_FILE="$(dirname $0)/test-data.sha1"
2222
2323 # Set sha1sum to proper sha program (sha1sum, shasum, sha1). This code is
4444 SSI16Func ref_func_;
4545 SSI16Func tst_func_;
4646 };
47 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(SumSquaresTest);
4748
4849 TEST_P(SumSquaresTest, OperationCheck) {
4950 ACMRandom rnd(ACMRandom::DeterministicSeed());
2626 public ::libvpx_test::CodecTestWithParam<SuperframeTestParam> {
2727 protected:
2828 SuperframeTest()
29 : EncoderTest(GET_PARAM(0)), modified_buf_(NULL), last_sf_pts_(0) {}
29 : EncoderTest(GET_PARAM(0)), modified_buf_(nullptr), last_sf_pts_(0) {}
3030 virtual ~SuperframeTest() {}
3131
3232 virtual void SetUp() {
8383 prev_frame_width[i] = 320;
8484 prev_frame_height[i] = 240;
8585 }
86 ksvc_flex_noupd_tlenh_ = false;
8687 }
8788 virtual void BeginPassHook(unsigned int /*pass*/) {}
8889
9091 // bypass/flexible mode. The pattern corresponds to the pattern
9192 // VP9E_TEMPORAL_LAYERING_MODE_0101 (temporal_layering_mode == 2) used in
9293 // non-flexible mode, except that we disable inter-layer prediction.
93 void set_frame_flags_bypass_mode(
94 int tl, int num_spatial_layers, int is_key_frame,
95 vpx_svc_ref_frame_config_t *ref_frame_config) {
94 void set_frame_flags_bypass_mode(int tl, int num_spatial_layers,
95 int is_key_frame,
96 vpx_svc_ref_frame_config_t *ref_frame_config,
97 int noupdate_tlenh) {
9698 for (int sl = 0; sl < num_spatial_layers; ++sl)
9799 ref_frame_config->update_buffer_slot[sl] = 0;
98100
150152 ref_frame_config->reference_last[sl] = 1;
151153 ref_frame_config->reference_golden[sl] = 0;
152154 ref_frame_config->reference_alt_ref[sl] = 0;
153 ref_frame_config->update_buffer_slot[sl] |=
154 1 << ref_frame_config->alt_fb_idx[sl];
155 // Non reference frame on top temporal top spatial.
156 ref_frame_config->update_buffer_slot[sl] = 0;
155157 }
158 // Force no update on all spatial layers for temporal enhancement layer
159 // frames.
160 if (noupdate_tlenh) ref_frame_config->update_buffer_slot[sl] = 0;
156161 }
157162 }
158163 }
243248 }
244249 }
245250
251 if (ksvc_flex_noupd_tlenh_) {
252 vpx_svc_layer_id_t layer_id;
253 layer_id.spatial_layer_id = 0;
254 layer_id.temporal_layer_id = (video->frame() % 2 != 0);
255 temporal_layer_id_ = layer_id.temporal_layer_id;
256 for (int i = 0; i < number_spatial_layers_; i++) {
257 layer_id.temporal_layer_id_per_spatial[i] = temporal_layer_id_;
258 ref_frame_config.duration[i] = 1;
259 }
260 encoder->Control(VP9E_SET_SVC_LAYER_ID, &layer_id);
261 set_frame_flags_bypass_mode(layer_id.temporal_layer_id,
262 number_spatial_layers_, 0, &ref_frame_config,
263 1);
264 encoder->Control(VP9E_SET_SVC_REF_FRAME_CONFIG, &ref_frame_config);
265 }
266
246267 if (update_pattern_ && video->frame() >= 100) {
247268 vpx_svc_layer_id_t layer_id;
248269 if (video->frame() == 100) {
253274 layer_id.spatial_layer_id = 0;
254275 layer_id.temporal_layer_id = (video->frame() % 2 != 0);
255276 temporal_layer_id_ = layer_id.temporal_layer_id;
256 for (int i = 0; i < number_spatial_layers_; i++)
277 for (int i = 0; i < number_spatial_layers_; i++) {
257278 layer_id.temporal_layer_id_per_spatial[i] = temporal_layer_id_;
279 ref_frame_config.duration[i] = 1;
280 }
258281 encoder->Control(VP9E_SET_SVC_LAYER_ID, &layer_id);
259282 set_frame_flags_bypass_mode(layer_id.temporal_layer_id,
260 number_spatial_layers_, 0, &ref_frame_config);
283 number_spatial_layers_, 0, &ref_frame_config,
284 0);
261285 encoder->Control(VP9E_SET_SVC_REF_FRAME_CONFIG, &ref_frame_config);
262286 }
263287
556580 }
557581
558582 virtual void MismatchHook(const vpx_image_t *img1, const vpx_image_t *img2) {
559 double mismatch_psnr = compute_psnr(img1, img2);
560 mismatch_psnr_ += mismatch_psnr;
561 ++mismatch_nframes_;
583 // TODO(marpan): Look into why an assert is triggered in compute_psnr
584 // for mismatch frames for the special test case: ksvc_flex_noupd_tlenh.
585 // Has to do with dropped frames in bypass/flexible svc mode.
586 if (!ksvc_flex_noupd_tlenh_) {
587 double mismatch_psnr = compute_psnr(img1, img2);
588 mismatch_psnr_ += mismatch_psnr;
589 ++mismatch_nframes_;
590 }
562591 }
563592
564593 unsigned int GetMismatchFrames() { return mismatch_nframes_; }
603632 int num_resize_down_;
604633 unsigned int prev_frame_width[VPX_MAX_LAYERS];
605634 unsigned int prev_frame_height[VPX_MAX_LAYERS];
635 bool ksvc_flex_noupd_tlenh_;
606636
607637 private:
608638 virtual void SetConfig(const int num_temporal_layer) {
721751 cfg_.g_threads = 1;
722752 cfg_.rc_dropframe_thresh = 30;
723753 cfg_.kf_max_dist = 9999;
724 // Change SVC pattern on the fly.
725 update_pattern_ = 1;
726754 ::libvpx_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30, 1,
727755 0, 400);
728756 top_sl_width_ = 640;
729757 top_sl_height_ = 480;
730758 cfg_.rc_target_bitrate = 800;
731759 ResetModel();
760 // Change SVC pattern on the fly.
761 update_pattern_ = 1;
732762 AssignLayerBitrates();
733763 ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
734764 CheckLayerRateTargeting(number_spatial_layers_, number_temporal_layers_, 0.78,
11051135 #endif
11061136 }
11071137
1138 // Check basic rate targeting for 1 pass CBR SVC: 3 spatial layers and
1139 // 2 temporal layers, for KSVC in flexible mode with no update of reference
1140 // frames for all spatial layers on TL > 0 superframes.
1141 // Run HD clip with 4 threads.
1142 TEST_P(DatarateOnePassCbrSvcFrameDropMultiBR, OnePassCbrSvc3SL2TL4ThKSVCFlex) {
1143 SetSvcConfig(3, 2);
1144 cfg_.rc_buf_initial_sz = 500;
1145 cfg_.rc_buf_optimal_sz = 500;
1146 cfg_.rc_buf_sz = 1000;
1147 cfg_.rc_min_quantizer = 0;
1148 cfg_.rc_max_quantizer = 63;
1149 cfg_.g_threads = 4;
1150 cfg_.rc_dropframe_thresh = 30;
1151 cfg_.kf_max_dist = 9999;
1152 ::libvpx_test::Y4mVideoSource video("niklas_1280_720_30.y4m", 0, 60);
1153 top_sl_width_ = 1280;
1154 top_sl_height_ = 720;
1155 layer_framedrop_ = 0;
1156 const int bitrates[3] = { 200, 400, 600 };
1157 cfg_.rc_target_bitrate = bitrates[GET_PARAM(3)];
1158 ResetModel();
1159 layer_framedrop_ = GET_PARAM(2);
1160 AssignLayerBitrates();
1161 ksvc_flex_noupd_tlenh_ = true;
1162 cfg_.temporal_layering_mode = VP9E_TEMPORAL_LAYERING_MODE_BYPASS;
1163 ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
1164 CheckLayerRateTargeting(number_spatial_layers_, number_temporal_layers_, 0.58,
1165 1.2);
1166 }
1167
11081168 // Params: speed setting, inter-layer prediction mode.
11091169 class DatarateOnePassCbrSvcInterLayerPredSingleBR
11101170 : public DatarateOnePassCbrSvc,
120120 frame_to_start_decode_(0), frame_to_sync_(0),
121121 inter_layer_pred_mode_(GET_PARAM(1)), decode_to_layer_before_sync_(-1),
122122 decode_to_layer_after_sync_(-1), denoiser_on_(0),
123 intra_only_test_(false), mismatch_nframes_(0), num_nonref_frames_(0) {
123 intra_only_test_(false), loopfilter_off_(0), mismatch_nframes_(0),
124 num_nonref_frames_(0) {
124125 SetMode(::libvpx_test::kRealTime);
125126 memset(&svc_layer_sync_, 0, sizeof(svc_layer_sync_));
126127 }
153154 // So set it here in these tess to avoid encoder-decoder
154155 // mismatch check on color space setting.
155156 encoder->Control(VP9E_SET_COLOR_SPACE, VPX_CS_BT_601);
157
158 encoder->Control(VP9E_SET_DISABLE_LOOPFILTER, loopfilter_off_);
156159 }
157160 if (video->frame() == frame_to_sync_) {
158161 encoder->Control(VP9E_SET_SVC_SPATIAL_LAYER_SYNC, &svc_layer_sync_);
213216 int decode_to_layer_after_sync_;
214217 int denoiser_on_;
215218 bool intra_only_test_;
219 int loopfilter_off_;
216220 vpx_svc_spatial_layer_sync_t svc_layer_sync_;
221 unsigned int mismatch_nframes_;
222 unsigned int num_nonref_frames_;
217223
218224 private:
219225 virtual void SetConfig(const int num_temporal_layer) {
242248 cfg_.temporal_layering_mode = 1;
243249 }
244250 }
245
246 unsigned int mismatch_nframes_;
247 unsigned int num_nonref_frames_;
248251 };
249252
250253 // Test for sync layer for 1 pass CBR SVC: 3 spatial layers and
469472 #endif
470473 }
471474
475 // Params: Loopfilter modes.
476 class LoopfilterOnePassCbrSvc : public OnePassCbrSvc,
477 public ::libvpx_test::CodecTestWithParam<int> {
478 public:
479 LoopfilterOnePassCbrSvc()
480 : OnePassCbrSvc(GET_PARAM(0)), loopfilter_off_(GET_PARAM(1)),
481 mismatch_nframes_(0), num_nonref_frames_(0) {
482 SetMode(::libvpx_test::kRealTime);
483 }
484
485 protected:
486 virtual ~LoopfilterOnePassCbrSvc() {}
487
488 virtual void SetUp() {
489 InitializeConfig();
490 speed_setting_ = 7;
491 }
492
493 virtual void PreEncodeFrameHook(::libvpx_test::VideoSource *video,
494 ::libvpx_test::Encoder *encoder) {
495 PreEncodeFrameHookSetup(video, encoder);
496 if (number_temporal_layers_ > 1 || number_spatial_layers_ > 1) {
497 // Consider 3 cases:
498 if (loopfilter_off_ == 0) {
499 // loopfilter is on for all spatial layers on every superrframe.
500 for (int i = 0; i < VPX_SS_MAX_LAYERS; ++i) {
501 svc_params_.loopfilter_ctrl[i] = 0;
502 }
503 } else if (loopfilter_off_ == 1) {
504 // loopfilter is off for non-reference frames for all spatial layers.
505 for (int i = 0; i < VPX_SS_MAX_LAYERS; ++i) {
506 svc_params_.loopfilter_ctrl[i] = 1;
507 }
508 } else {
509 // loopfilter is off for all SL0 frames, and off only for non-reference
510 // frames for SL > 0.
511 svc_params_.loopfilter_ctrl[0] = 2;
512 for (int i = 1; i < VPX_SS_MAX_LAYERS; ++i) {
513 svc_params_.loopfilter_ctrl[i] = 1;
514 }
515 }
516 encoder->Control(VP9E_SET_SVC_PARAMETERS, &svc_params_);
517 } else if (number_temporal_layers_ == 1 && number_spatial_layers_ == 1) {
518 // For non-SVC mode use the single layer control.
519 encoder->Control(VP9E_SET_DISABLE_LOOPFILTER, loopfilter_off_);
520 }
521 }
522
523 virtual void FramePktHook(const vpx_codec_cx_pkt_t *pkt) {
524 // Keep track of number of non-reference frames, needed for mismatch check.
525 // Non-reference frames are top spatial and temporal layer frames,
526 // for TL > 0.
527 if (temporal_layer_id_ == number_temporal_layers_ - 1 &&
528 temporal_layer_id_ > 0 &&
529 pkt->data.frame.spatial_layer_encoded[number_spatial_layers_ - 1])
530 num_nonref_frames_++;
531 }
532
533 virtual void MismatchHook(const vpx_image_t * /*img1*/,
534 const vpx_image_t * /*img2*/) {
535 ++mismatch_nframes_;
536 }
537
538 virtual void SetConfig(const int /*num_temporal_layer*/) {}
539
540 int GetMismatchFrames() const { return mismatch_nframes_; }
541 int GetNonRefFrames() const { return num_nonref_frames_; }
542
543 int loopfilter_off_;
544
545 private:
546 int mismatch_nframes_;
547 int num_nonref_frames_;
548 };
549
550 TEST_P(LoopfilterOnePassCbrSvc, OnePassCbrSvc1SL1TLLoopfilterOff) {
551 SetSvcConfig(1, 1);
552 cfg_.rc_buf_initial_sz = 500;
553 cfg_.rc_buf_optimal_sz = 500;
554 cfg_.rc_buf_sz = 1000;
555 cfg_.rc_min_quantizer = 0;
556 cfg_.rc_max_quantizer = 63;
557 cfg_.g_threads = 1;
558 cfg_.rc_dropframe_thresh = 0;
559 cfg_.rc_target_bitrate = 800;
560 cfg_.kf_max_dist = 9999;
561 cfg_.rc_end_usage = VPX_CBR;
562 cfg_.g_lag_in_frames = 0;
563 cfg_.g_error_resilient = 1;
564 cfg_.ts_rate_decimator[0] = 1;
565 cfg_.temporal_layering_mode = 0;
566 ::libvpx_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30, 1,
567 0, 400);
568 cfg_.rc_target_bitrate = 600;
569 AssignLayerBitrates();
570 ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
571 #if CONFIG_VP9_DECODER
572 if (loopfilter_off_ == 0)
573 EXPECT_EQ(GetNonRefFrames(), GetMismatchFrames());
574 else
575 EXPECT_EQ(GetMismatchFrames(), 0);
576 #endif
577 }
578
579 TEST_P(LoopfilterOnePassCbrSvc, OnePassCbrSvc1SL3TLLoopfilterOff) {
580 SetSvcConfig(1, 3);
581 cfg_.rc_buf_initial_sz = 500;
582 cfg_.rc_buf_optimal_sz = 500;
583 cfg_.rc_buf_sz = 1000;
584 cfg_.rc_min_quantizer = 0;
585 cfg_.rc_max_quantizer = 63;
586 cfg_.g_threads = 1;
587 cfg_.rc_dropframe_thresh = 0;
588 cfg_.rc_target_bitrate = 800;
589 cfg_.kf_max_dist = 9999;
590 cfg_.rc_end_usage = VPX_CBR;
591 cfg_.g_lag_in_frames = 0;
592 cfg_.g_error_resilient = 1;
593 cfg_.ts_rate_decimator[0] = 4;
594 cfg_.ts_rate_decimator[1] = 2;
595 cfg_.ts_rate_decimator[2] = 1;
596 cfg_.temporal_layering_mode = 3;
597 ::libvpx_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30, 1,
598 0, 400);
599 cfg_.rc_target_bitrate = 600;
600 AssignLayerBitrates();
601 ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
602 #if CONFIG_VP9_DECODER
603 if (loopfilter_off_ == 0)
604 EXPECT_EQ(GetNonRefFrames(), GetMismatchFrames());
605 else
606 EXPECT_EQ(GetMismatchFrames(), 0);
607 #endif
608 }
609
610 TEST_P(LoopfilterOnePassCbrSvc, OnePassCbrSvc3SL3TLLoopfilterOff) {
611 SetSvcConfig(3, 3);
612 cfg_.rc_buf_initial_sz = 500;
613 cfg_.rc_buf_optimal_sz = 500;
614 cfg_.rc_buf_sz = 1000;
615 cfg_.rc_min_quantizer = 0;
616 cfg_.rc_max_quantizer = 63;
617 cfg_.g_threads = 1;
618 cfg_.rc_dropframe_thresh = 0;
619 cfg_.rc_target_bitrate = 800;
620 cfg_.kf_max_dist = 9999;
621 cfg_.rc_end_usage = VPX_CBR;
622 cfg_.g_lag_in_frames = 0;
623 cfg_.g_error_resilient = 1;
624 cfg_.ts_rate_decimator[0] = 4;
625 cfg_.ts_rate_decimator[1] = 2;
626 cfg_.ts_rate_decimator[2] = 1;
627 cfg_.temporal_layering_mode = 3;
628 ::libvpx_test::I420VideoSource video("niklas_640_480_30.yuv", 640, 480, 30, 1,
629 0, 400);
630 cfg_.rc_target_bitrate = 600;
631 AssignLayerBitrates();
632 ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
633 #if CONFIG_VP9_DECODER
634 if (loopfilter_off_ == 0)
635 EXPECT_EQ(GetNonRefFrames(), GetMismatchFrames());
636 else
637 EXPECT_EQ(GetMismatchFrames(), 0);
638 #endif
639 }
640
472641 VP9_INSTANTIATE_TEST_SUITE(SyncFrameOnePassCbrSvc, ::testing::Range(0, 3));
642
643 VP9_INSTANTIATE_TEST_SUITE(LoopfilterOnePassCbrSvc, ::testing::Range(0, 3));
473644
474645 INSTANTIATE_TEST_SUITE_P(
475646 VP9, ScalePartitionOnePassCbrSvc,
4242 svc_params_.max_quantizers[i] = 63;
4343 svc_params_.min_quantizers[i] = 0;
4444 }
45 svc_params_.speed_per_layer[0] = base_speed_setting_;
46 for (int i = 1; i < VPX_SS_MAX_LAYERS; ++i) {
47 svc_params_.speed_per_layer[i] = speed_setting_;
45 if (number_temporal_layers_ > 1 || number_spatial_layers_ > 1) {
46 svc_params_.speed_per_layer[0] = base_speed_setting_;
47 for (int i = 1; i < VPX_SS_MAX_LAYERS; ++i) {
48 svc_params_.speed_per_layer[i] = speed_setting_;
49 }
50 encoder->Control(VP9E_SET_SVC, 1);
51 encoder->Control(VP9E_SET_SVC_PARAMETERS, &svc_params_);
4852 }
49
50 encoder->Control(VP9E_SET_SVC, 1);
51 encoder->Control(VP9E_SET_SVC_PARAMETERS, &svc_params_);
5253 encoder->Control(VP8E_SET_CPUUSED, speed_setting_);
5354 encoder->Control(VP9E_SET_AQ_MODE, 3);
5455 encoder->Control(VP8E_SET_MAX_INTRA_BITRATE_PCT, 300);
2626 LIBVPX_TEST_DATA-$(CONFIG_VP9_ENCODER) += rush_hour_444.y4m
2727 LIBVPX_TEST_DATA-$(CONFIG_VP9_ENCODER) += screendata.y4m
2828 LIBVPX_TEST_DATA-$(CONFIG_VP9_ENCODER) += niklas_640_480_30.yuv
29 LIBVPX_TEST_DATA-$(CONFIG_RATE_CTRL) += bus_352x288_420_f20_b8.yuv
29 LIBVPX_TEST_DATA-$(CONFIG_VP9_ENCODER) += rc_interface_test_one_layer
30 LIBVPX_TEST_DATA-$(CONFIG_VP9_ENCODER) += rc_interface_test_svc
31 LIBVPX_TEST_DATA-$(CONFIG_VP9_ENCODER) += bus_352x288_420_f20_b8.yuv
3032
3133 # Test vectors
3234 LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-00-comprehensive-001.ivf
868868 518a0be998afece76d3df76047d51e256c591ff2 *invalid-bug-148271109.ivf
869869 d3964f9dad9f60363c81b688324d95b4ec7c8038 *invalid-bug-148271109.ivf.res
870870 ad18ca16f0a249fb3b7c38de0d9b327fed273f96 *hantro_collage_w352h288_nv12.yuv
871 03f827c0e36ff9a6e23c5cc11936924e4f1827ab *rc_interface_test_one_layer
872 99e4f4c2961d46dc286db230090a39d78460b25d *rc_interface_test_svc
5757 LIBVPX_TEST_SRCS-$(CONFIG_VP9_ENCODER) += svc_test.h
5858 LIBVPX_TEST_SRCS-$(CONFIG_VP9_ENCODER) += svc_end_to_end_test.cc
5959 LIBVPX_TEST_SRCS-$(CONFIG_VP9_ENCODER) += timestamp_test.cc
60 LIBVPX_TEST_SRCS-$(CONFIG_VP9_ENCODER) += vp9_ext_ratectrl_test.cc
6061
6162 LIBVPX_TEST_SRCS-yes += decode_test_driver.cc
6263 LIBVPX_TEST_SRCS-yes += decode_test_driver.h
120121 LIBVPX_TEST_SRCS-yes += vp8_boolcoder_test.cc
121122 LIBVPX_TEST_SRCS-yes += vp8_fragments_test.cc
122123 endif
123
124124 LIBVPX_TEST_SRCS-$(CONFIG_POSTPROC) += add_noise_test.cc
125125 LIBVPX_TEST_SRCS-$(CONFIG_POSTPROC) += pp_filter_test.cc
126126 LIBVPX_TEST_SRCS-$(CONFIG_VP8_DECODER) += vp8_decrypt_test.cc
127 ifneq (, $(filter yes, $(HAVE_SSE2) $(HAVE_SSSE3) $(HAVE_SSE4_1) $(HAVE_NEON) \
128 $(HAVE_MSA) $(HAVE_MMI)))
127129 LIBVPX_TEST_SRCS-$(CONFIG_VP8_ENCODER) += quantize_test.cc
130 endif
128131 LIBVPX_TEST_SRCS-$(CONFIG_VP8_ENCODER) += set_roi.cc
129132 LIBVPX_TEST_SRCS-$(CONFIG_VP8_ENCODER) += variance_test.cc
130133 LIBVPX_TEST_SRCS-$(CONFIG_VP8_ENCODER) += vp8_fdct4x4_test.cc
173176 LIBVPX_TEST_SRCS-$(CONFIG_VP9_ENCODER) += yuv_temporal_filter_test.cc
174177 endif
175178 LIBVPX_TEST_SRCS-$(CONFIG_VP9_ENCODER) += variance_test.cc
179 ifneq (, $(filter yes, $(HAVE_SSE2) $(HAVE_AVX2)))
176180 LIBVPX_TEST_SRCS-$(CONFIG_VP9_ENCODER) += vp9_block_error_test.cc
181 endif
177182 LIBVPX_TEST_SRCS-$(CONFIG_VP9_ENCODER) += vp9_quantize_test.cc
178183 LIBVPX_TEST_SRCS-$(CONFIG_VP9_ENCODER) += vp9_subtract_test.cc
179184
187192 endif
188193
189194 ifeq ($(CONFIG_VP9_ENCODER)$(CONFIG_VP9_TEMPORAL_DENOISING),yesyes)
195 ifneq (, $(filter yes, $(HAVE_SSE2) $(HAVE_AVX2)))
190196 LIBVPX_TEST_SRCS-yes += vp9_denoiser_test.cc
197 endif
191198 endif
192199 LIBVPX_TEST_SRCS-$(CONFIG_VP9_ENCODER) += vp9_arf_freq_test.cc
193200
200207 ## Multi-codec / unconditional whitebox tests.
201208
202209 LIBVPX_TEST_SRCS-$(CONFIG_ENCODERS) += sad_test.cc
210 ifneq (, $(filter yes, $(HAVE_NEON) $(HAVE_SSE2) $(HAVE_MSA)))
203211 LIBVPX_TEST_SRCS-$(CONFIG_ENCODERS) += sum_squares_test.cc
212 endif
204213
205214 TEST_INTRA_PRED_SPEED_SRCS-yes := test_intra_pred_speed.cc
206215 TEST_INTRA_PRED_SPEED_SRCS-yes += ../md5_utils.h ../md5_utils.c
8484 intra_pred_test_mem.Init(block_size, 8);
8585
8686 for (int k = 0; k < kNumVp9IntraPredFuncs; ++k) {
87 if (pred_funcs[k] == NULL) continue;
87 if (pred_funcs[k] == nullptr) continue;
8888 memcpy(intra_pred_test_mem.src, intra_pred_test_mem.ref_src,
8989 sizeof(intra_pred_test_mem.src));
9090 vpx_usec_timer timer;
205205 INTRA_PRED_TEST(SSE2, TestIntraPred4, vpx_dc_predictor_4x4_sse2,
206206 vpx_dc_left_predictor_4x4_sse2, vpx_dc_top_predictor_4x4_sse2,
207207 vpx_dc_128_predictor_4x4_sse2, vpx_v_predictor_4x4_sse2,
208 vpx_h_predictor_4x4_sse2, vpx_d45_predictor_4x4_sse2, NULL,
209 NULL, NULL, vpx_d207_predictor_4x4_sse2, NULL,
208 vpx_h_predictor_4x4_sse2, vpx_d45_predictor_4x4_sse2, nullptr,
209 nullptr, nullptr, vpx_d207_predictor_4x4_sse2, nullptr,
210210 vpx_tm_predictor_4x4_sse2)
211211
212212 INTRA_PRED_TEST(SSE2, TestIntraPred8, vpx_dc_predictor_8x8_sse2,
213213 vpx_dc_left_predictor_8x8_sse2, vpx_dc_top_predictor_8x8_sse2,
214214 vpx_dc_128_predictor_8x8_sse2, vpx_v_predictor_8x8_sse2,
215 vpx_h_predictor_8x8_sse2, vpx_d45_predictor_8x8_sse2, NULL,
216 NULL, NULL, NULL, NULL, vpx_tm_predictor_8x8_sse2)
215 vpx_h_predictor_8x8_sse2, vpx_d45_predictor_8x8_sse2, nullptr,
216 nullptr, nullptr, nullptr, nullptr, vpx_tm_predictor_8x8_sse2)
217217
218218 INTRA_PRED_TEST(SSE2, TestIntraPred16, vpx_dc_predictor_16x16_sse2,
219219 vpx_dc_left_predictor_16x16_sse2,
220220 vpx_dc_top_predictor_16x16_sse2,
221221 vpx_dc_128_predictor_16x16_sse2, vpx_v_predictor_16x16_sse2,
222 vpx_h_predictor_16x16_sse2, NULL, NULL, NULL, NULL, NULL, NULL,
223 vpx_tm_predictor_16x16_sse2)
222 vpx_h_predictor_16x16_sse2, nullptr, nullptr, nullptr, nullptr,
223 nullptr, nullptr, vpx_tm_predictor_16x16_sse2)
224224
225225 INTRA_PRED_TEST(SSE2, TestIntraPred32, vpx_dc_predictor_32x32_sse2,
226226 vpx_dc_left_predictor_32x32_sse2,
227227 vpx_dc_top_predictor_32x32_sse2,
228228 vpx_dc_128_predictor_32x32_sse2, vpx_v_predictor_32x32_sse2,
229 vpx_h_predictor_32x32_sse2, NULL, NULL, NULL, NULL, NULL, NULL,
230 vpx_tm_predictor_32x32_sse2)
229 vpx_h_predictor_32x32_sse2, nullptr, nullptr, nullptr, nullptr,
230 nullptr, nullptr, vpx_tm_predictor_32x32_sse2)
231231 #endif // HAVE_SSE2
232232
233233 #if HAVE_SSSE3
234 INTRA_PRED_TEST(SSSE3, TestIntraPred4, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
235 NULL, NULL, vpx_d153_predictor_4x4_ssse3, NULL,
236 vpx_d63_predictor_4x4_ssse3, NULL)
237 INTRA_PRED_TEST(SSSE3, TestIntraPred8, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
238 NULL, NULL, vpx_d153_predictor_8x8_ssse3,
239 vpx_d207_predictor_8x8_ssse3, vpx_d63_predictor_8x8_ssse3, NULL)
240 INTRA_PRED_TEST(SSSE3, TestIntraPred16, NULL, NULL, NULL, NULL, NULL, NULL,
241 vpx_d45_predictor_16x16_ssse3, NULL, NULL,
242 vpx_d153_predictor_16x16_ssse3, vpx_d207_predictor_16x16_ssse3,
243 vpx_d63_predictor_16x16_ssse3, NULL)
244 INTRA_PRED_TEST(SSSE3, TestIntraPred32, NULL, NULL, NULL, NULL, NULL, NULL,
245 vpx_d45_predictor_32x32_ssse3, NULL, NULL,
246 vpx_d153_predictor_32x32_ssse3, vpx_d207_predictor_32x32_ssse3,
247 vpx_d63_predictor_32x32_ssse3, NULL)
234 INTRA_PRED_TEST(SSSE3, TestIntraPred4, nullptr, nullptr, nullptr, nullptr,
235 nullptr, nullptr, nullptr, nullptr, nullptr,
236 vpx_d153_predictor_4x4_ssse3, nullptr,
237 vpx_d63_predictor_4x4_ssse3, nullptr)
238 INTRA_PRED_TEST(SSSE3, TestIntraPred8, nullptr, nullptr, nullptr, nullptr,
239 nullptr, nullptr, nullptr, nullptr, nullptr,
240 vpx_d153_predictor_8x8_ssse3, vpx_d207_predictor_8x8_ssse3,
241 vpx_d63_predictor_8x8_ssse3, nullptr)
242 INTRA_PRED_TEST(SSSE3, TestIntraPred16, nullptr, nullptr, nullptr, nullptr,
243 nullptr, nullptr, vpx_d45_predictor_16x16_ssse3, nullptr,
244 nullptr, vpx_d153_predictor_16x16_ssse3,
245 vpx_d207_predictor_16x16_ssse3, vpx_d63_predictor_16x16_ssse3,
246 nullptr)
247 INTRA_PRED_TEST(SSSE3, TestIntraPred32, nullptr, nullptr, nullptr, nullptr,
248 nullptr, nullptr, vpx_d45_predictor_32x32_ssse3, nullptr,
249 nullptr, vpx_d153_predictor_32x32_ssse3,
250 vpx_d207_predictor_32x32_ssse3, vpx_d63_predictor_32x32_ssse3,
251 nullptr)
248252 #endif // HAVE_SSSE3
249253
250254 #if HAVE_DSPR2
251 INTRA_PRED_TEST(DSPR2, TestIntraPred4, vpx_dc_predictor_4x4_dspr2, NULL, NULL,
252 NULL, NULL, vpx_h_predictor_4x4_dspr2, NULL, NULL, NULL, NULL,
253 NULL, NULL, vpx_tm_predictor_4x4_dspr2)
254 INTRA_PRED_TEST(DSPR2, TestIntraPred8, vpx_dc_predictor_8x8_dspr2, NULL, NULL,
255 NULL, NULL, vpx_h_predictor_8x8_dspr2, NULL, NULL, NULL, NULL,
256 NULL, NULL, vpx_tm_predictor_8x8_c)
257 INTRA_PRED_TEST(DSPR2, TestIntraPred16, vpx_dc_predictor_16x16_dspr2, NULL,
258 NULL, NULL, NULL, vpx_h_predictor_16x16_dspr2, NULL, NULL, NULL,
259 NULL, NULL, NULL, NULL)
255 INTRA_PRED_TEST(DSPR2, TestIntraPred4, vpx_dc_predictor_4x4_dspr2, nullptr,
256 nullptr, nullptr, nullptr, vpx_h_predictor_4x4_dspr2, nullptr,
257 nullptr, nullptr, nullptr, nullptr, nullptr,
258 vpx_tm_predictor_4x4_dspr2)
259 INTRA_PRED_TEST(DSPR2, TestIntraPred8, vpx_dc_predictor_8x8_dspr2, nullptr,
260 nullptr, nullptr, nullptr, vpx_h_predictor_8x8_dspr2, nullptr,
261 nullptr, nullptr, nullptr, nullptr, nullptr,
262 vpx_tm_predictor_8x8_c)
263 INTRA_PRED_TEST(DSPR2, TestIntraPred16, vpx_dc_predictor_16x16_dspr2, nullptr,
264 nullptr, nullptr, nullptr, vpx_h_predictor_16x16_dspr2, nullptr,
265 nullptr, nullptr, nullptr, nullptr, nullptr, nullptr)
260266 #endif // HAVE_DSPR2
261267
262268 #if HAVE_NEON
264270 vpx_dc_left_predictor_4x4_neon, vpx_dc_top_predictor_4x4_neon,
265271 vpx_dc_128_predictor_4x4_neon, vpx_v_predictor_4x4_neon,
266272 vpx_h_predictor_4x4_neon, vpx_d45_predictor_4x4_neon,
267 vpx_d135_predictor_4x4_neon, NULL, NULL, NULL, NULL,
273 vpx_d135_predictor_4x4_neon, nullptr, nullptr, nullptr, nullptr,
268274 vpx_tm_predictor_4x4_neon)
269275 INTRA_PRED_TEST(NEON, TestIntraPred8, vpx_dc_predictor_8x8_neon,
270276 vpx_dc_left_predictor_8x8_neon, vpx_dc_top_predictor_8x8_neon,
271277 vpx_dc_128_predictor_8x8_neon, vpx_v_predictor_8x8_neon,
272278 vpx_h_predictor_8x8_neon, vpx_d45_predictor_8x8_neon,
273 vpx_d135_predictor_8x8_neon, NULL, NULL, NULL, NULL,
279 vpx_d135_predictor_8x8_neon, nullptr, nullptr, nullptr, nullptr,
274280 vpx_tm_predictor_8x8_neon)
275281 INTRA_PRED_TEST(NEON, TestIntraPred16, vpx_dc_predictor_16x16_neon,
276282 vpx_dc_left_predictor_16x16_neon,
277283 vpx_dc_top_predictor_16x16_neon,
278284 vpx_dc_128_predictor_16x16_neon, vpx_v_predictor_16x16_neon,
279285 vpx_h_predictor_16x16_neon, vpx_d45_predictor_16x16_neon,
280 vpx_d135_predictor_16x16_neon, NULL, NULL, NULL, NULL,
281 vpx_tm_predictor_16x16_neon)
286 vpx_d135_predictor_16x16_neon, nullptr, nullptr, nullptr,
287 nullptr, vpx_tm_predictor_16x16_neon)
282288 INTRA_PRED_TEST(NEON, TestIntraPred32, vpx_dc_predictor_32x32_neon,
283289 vpx_dc_left_predictor_32x32_neon,
284290 vpx_dc_top_predictor_32x32_neon,
285291 vpx_dc_128_predictor_32x32_neon, vpx_v_predictor_32x32_neon,
286292 vpx_h_predictor_32x32_neon, vpx_d45_predictor_32x32_neon,
287 vpx_d135_predictor_32x32_neon, NULL, NULL, NULL, NULL,
288 vpx_tm_predictor_32x32_neon)
293 vpx_d135_predictor_32x32_neon, nullptr, nullptr, nullptr,
294 nullptr, vpx_tm_predictor_32x32_neon)
289295 #endif // HAVE_NEON
290296
291297 #if HAVE_MSA
292298 INTRA_PRED_TEST(MSA, TestIntraPred4, vpx_dc_predictor_4x4_msa,
293299 vpx_dc_left_predictor_4x4_msa, vpx_dc_top_predictor_4x4_msa,
294300 vpx_dc_128_predictor_4x4_msa, vpx_v_predictor_4x4_msa,
295 vpx_h_predictor_4x4_msa, NULL, NULL, NULL, NULL, NULL, NULL,
296 vpx_tm_predictor_4x4_msa)
301 vpx_h_predictor_4x4_msa, nullptr, nullptr, nullptr, nullptr,
302 nullptr, nullptr, vpx_tm_predictor_4x4_msa)
297303 INTRA_PRED_TEST(MSA, TestIntraPred8, vpx_dc_predictor_8x8_msa,
298304 vpx_dc_left_predictor_8x8_msa, vpx_dc_top_predictor_8x8_msa,
299305 vpx_dc_128_predictor_8x8_msa, vpx_v_predictor_8x8_msa,
300 vpx_h_predictor_8x8_msa, NULL, NULL, NULL, NULL, NULL, NULL,
301 vpx_tm_predictor_8x8_msa)
306 vpx_h_predictor_8x8_msa, nullptr, nullptr, nullptr, nullptr,
307 nullptr, nullptr, vpx_tm_predictor_8x8_msa)
302308 INTRA_PRED_TEST(MSA, TestIntraPred16, vpx_dc_predictor_16x16_msa,
303309 vpx_dc_left_predictor_16x16_msa, vpx_dc_top_predictor_16x16_msa,
304310 vpx_dc_128_predictor_16x16_msa, vpx_v_predictor_16x16_msa,
305 vpx_h_predictor_16x16_msa, NULL, NULL, NULL, NULL, NULL, NULL,
306 vpx_tm_predictor_16x16_msa)
311 vpx_h_predictor_16x16_msa, nullptr, nullptr, nullptr, nullptr,
312 nullptr, nullptr, vpx_tm_predictor_16x16_msa)
307313 INTRA_PRED_TEST(MSA, TestIntraPred32, vpx_dc_predictor_32x32_msa,
308314 vpx_dc_left_predictor_32x32_msa, vpx_dc_top_predictor_32x32_msa,
309315 vpx_dc_128_predictor_32x32_msa, vpx_v_predictor_32x32_msa,
310 vpx_h_predictor_32x32_msa, NULL, NULL, NULL, NULL, NULL, NULL,
311 vpx_tm_predictor_32x32_msa)
316 vpx_h_predictor_32x32_msa, nullptr, nullptr, nullptr, nullptr,
317 nullptr, nullptr, vpx_tm_predictor_32x32_msa)
312318 #endif // HAVE_MSA
313319
314320 #if HAVE_VSX
315321 // TODO(crbug.com/webm/1522): Fix test failures.
316322 #if 0
317 INTRA_PRED_TEST(VSX, TestIntraPred4, NULL, NULL, NULL, NULL, NULL,
318 vpx_h_predictor_4x4_vsx, NULL, NULL, NULL, NULL, NULL, NULL,
319 vpx_tm_predictor_4x4_vsx)
320
321 INTRA_PRED_TEST(VSX, TestIntraPred8, vpx_dc_predictor_8x8_vsx, NULL, NULL, NULL,
322 NULL, vpx_h_predictor_8x8_vsx, vpx_d45_predictor_8x8_vsx, NULL,
323 NULL, NULL, NULL, vpx_d63_predictor_8x8_vsx,
324 vpx_tm_predictor_8x8_vsx)
323 INTRA_PRED_TEST(VSX, TestIntraPred4, nullptr, nullptr, nullptr, nullptr,
324 nullptr, vpx_h_predictor_4x4_vsx, nullptr, nullptr, nullptr,
325 nullptr, nullptr, nullptr, vpx_tm_predictor_4x4_vsx)
326
327 INTRA_PRED_TEST(VSX, TestIntraPred8, vpx_dc_predictor_8x8_vsx, nullptr, nullptr,
328 nullptr, nullptr, vpx_h_predictor_8x8_vsx,
329 vpx_d45_predictor_8x8_vsx, nullptr, nullptr, nullptr, nullptr,
330 vpx_d63_predictor_8x8_vsx, vpx_tm_predictor_8x8_vsx)
325331 #endif
326332
327333 INTRA_PRED_TEST(VSX, TestIntraPred16, vpx_dc_predictor_16x16_vsx,
328334 vpx_dc_left_predictor_16x16_vsx, vpx_dc_top_predictor_16x16_vsx,
329335 vpx_dc_128_predictor_16x16_vsx, vpx_v_predictor_16x16_vsx,
330 vpx_h_predictor_16x16_vsx, vpx_d45_predictor_16x16_vsx, NULL,
331 NULL, NULL, NULL, vpx_d63_predictor_16x16_vsx,
336 vpx_h_predictor_16x16_vsx, vpx_d45_predictor_16x16_vsx, nullptr,
337 nullptr, nullptr, nullptr, vpx_d63_predictor_16x16_vsx,
332338 vpx_tm_predictor_16x16_vsx)
333339
334340 INTRA_PRED_TEST(VSX, TestIntraPred32, vpx_dc_predictor_32x32_vsx,
335341 vpx_dc_left_predictor_32x32_vsx, vpx_dc_top_predictor_32x32_vsx,
336342 vpx_dc_128_predictor_32x32_vsx, vpx_v_predictor_32x32_vsx,
337 vpx_h_predictor_32x32_vsx, vpx_d45_predictor_32x32_vsx, NULL,
338 NULL, NULL, NULL, vpx_d63_predictor_32x32_vsx,
343 vpx_h_predictor_32x32_vsx, vpx_d45_predictor_32x32_vsx, nullptr,
344 nullptr, nullptr, nullptr, vpx_d63_predictor_32x32_vsx,
339345 vpx_tm_predictor_32x32_vsx)
340346 #endif // HAVE_VSX
341347
360366 intra_pred_test_mem.Init(block_size, 12);
361367
362368 for (int k = 0; k < kNumVp9IntraPredFuncs; ++k) {
363 if (pred_funcs[k] == NULL) continue;
369 if (pred_funcs[k] == nullptr) continue;
364370 memcpy(intra_pred_test_mem.src, intra_pred_test_mem.ref_src,
365371 sizeof(intra_pred_test_mem.src));
366372 vpx_usec_timer timer;
486492 SSE2, TestHighbdIntraPred4, vpx_highbd_dc_predictor_4x4_sse2,
487493 vpx_highbd_dc_left_predictor_4x4_sse2, vpx_highbd_dc_top_predictor_4x4_sse2,
488494 vpx_highbd_dc_128_predictor_4x4_sse2, vpx_highbd_v_predictor_4x4_sse2,
489 vpx_highbd_h_predictor_4x4_sse2, NULL, vpx_highbd_d135_predictor_4x4_sse2,
490 vpx_highbd_d117_predictor_4x4_sse2, vpx_highbd_d153_predictor_4x4_sse2,
491 vpx_highbd_d207_predictor_4x4_sse2, vpx_highbd_d63_predictor_4x4_sse2,
492 vpx_highbd_tm_predictor_4x4_c)
493
494 HIGHBD_INTRA_PRED_TEST(SSE2, TestHighbdIntraPred8,
495 vpx_highbd_dc_predictor_8x8_sse2,
496 vpx_highbd_dc_left_predictor_8x8_sse2,
497 vpx_highbd_dc_top_predictor_8x8_sse2,
498 vpx_highbd_dc_128_predictor_8x8_sse2,
499 vpx_highbd_v_predictor_8x8_sse2,
500 vpx_highbd_h_predictor_8x8_sse2, NULL, NULL, NULL, NULL,
501 NULL, NULL, vpx_highbd_tm_predictor_8x8_sse2)
495 vpx_highbd_h_predictor_4x4_sse2, nullptr,
496 vpx_highbd_d135_predictor_4x4_sse2, vpx_highbd_d117_predictor_4x4_sse2,
497 vpx_highbd_d153_predictor_4x4_sse2, vpx_highbd_d207_predictor_4x4_sse2,
498 vpx_highbd_d63_predictor_4x4_sse2, vpx_highbd_tm_predictor_4x4_c)
499
500 HIGHBD_INTRA_PRED_TEST(
501 SSE2, TestHighbdIntraPred8, vpx_highbd_dc_predictor_8x8_sse2,
502 vpx_highbd_dc_left_predictor_8x8_sse2, vpx_highbd_dc_top_predictor_8x8_sse2,
503 vpx_highbd_dc_128_predictor_8x8_sse2, vpx_highbd_v_predictor_8x8_sse2,
504 vpx_highbd_h_predictor_8x8_sse2, nullptr, nullptr, nullptr, nullptr,
505 nullptr, nullptr, vpx_highbd_tm_predictor_8x8_sse2)
502506
503507 HIGHBD_INTRA_PRED_TEST(SSE2, TestHighbdIntraPred16,
504508 vpx_highbd_dc_predictor_16x16_sse2,
506510 vpx_highbd_dc_top_predictor_16x16_sse2,
507511 vpx_highbd_dc_128_predictor_16x16_sse2,
508512 vpx_highbd_v_predictor_16x16_sse2,
509 vpx_highbd_h_predictor_16x16_sse2, NULL, NULL, NULL,
510 NULL, NULL, NULL, vpx_highbd_tm_predictor_16x16_sse2)
513 vpx_highbd_h_predictor_16x16_sse2, nullptr, nullptr,
514 nullptr, nullptr, nullptr, nullptr,
515 vpx_highbd_tm_predictor_16x16_sse2)
511516
512517 HIGHBD_INTRA_PRED_TEST(SSE2, TestHighbdIntraPred32,
513518 vpx_highbd_dc_predictor_32x32_sse2,
515520 vpx_highbd_dc_top_predictor_32x32_sse2,
516521 vpx_highbd_dc_128_predictor_32x32_sse2,
517522 vpx_highbd_v_predictor_32x32_sse2,
518 vpx_highbd_h_predictor_32x32_sse2, NULL, NULL, NULL,
519 NULL, NULL, NULL, vpx_highbd_tm_predictor_32x32_sse2)
523 vpx_highbd_h_predictor_32x32_sse2, nullptr, nullptr,
524 nullptr, nullptr, nullptr, nullptr,
525 vpx_highbd_tm_predictor_32x32_sse2)
520526 #endif // HAVE_SSE2
521527
522528 #if HAVE_SSSE3
523 HIGHBD_INTRA_PRED_TEST(SSSE3, TestHighbdIntraPred4, NULL, NULL, NULL, NULL,
524 NULL, NULL, vpx_highbd_d45_predictor_4x4_ssse3, NULL,
525 NULL, NULL, NULL, NULL, NULL)
526 HIGHBD_INTRA_PRED_TEST(SSSE3, TestHighbdIntraPred8, NULL, NULL, NULL, NULL,
527 NULL, NULL, vpx_highbd_d45_predictor_8x8_ssse3,
529 HIGHBD_INTRA_PRED_TEST(SSSE3, TestHighbdIntraPred4, nullptr, nullptr, nullptr,
530 nullptr, nullptr, nullptr,
531 vpx_highbd_d45_predictor_4x4_ssse3, nullptr, nullptr,
532 nullptr, nullptr, nullptr, nullptr)
533 HIGHBD_INTRA_PRED_TEST(SSSE3, TestHighbdIntraPred8, nullptr, nullptr, nullptr,
534 nullptr, nullptr, nullptr,
535 vpx_highbd_d45_predictor_8x8_ssse3,
528536 vpx_highbd_d135_predictor_8x8_ssse3,
529537 vpx_highbd_d117_predictor_8x8_ssse3,
530538 vpx_highbd_d153_predictor_8x8_ssse3,
531539 vpx_highbd_d207_predictor_8x8_ssse3,
532 vpx_highbd_d63_predictor_8x8_ssse3, NULL)
533 HIGHBD_INTRA_PRED_TEST(SSSE3, TestHighbdIntraPred16, NULL, NULL, NULL, NULL,
534 NULL, NULL, vpx_highbd_d45_predictor_16x16_ssse3,
540 vpx_highbd_d63_predictor_8x8_ssse3, nullptr)
541 HIGHBD_INTRA_PRED_TEST(SSSE3, TestHighbdIntraPred16, nullptr, nullptr, nullptr,
542 nullptr, nullptr, nullptr,
543 vpx_highbd_d45_predictor_16x16_ssse3,
535544 vpx_highbd_d135_predictor_16x16_ssse3,
536545 vpx_highbd_d117_predictor_16x16_ssse3,
537546 vpx_highbd_d153_predictor_16x16_ssse3,
538547 vpx_highbd_d207_predictor_16x16_ssse3,
539 vpx_highbd_d63_predictor_16x16_ssse3, NULL)
540 HIGHBD_INTRA_PRED_TEST(SSSE3, TestHighbdIntraPred32, NULL, NULL, NULL, NULL,
541 NULL, NULL, vpx_highbd_d45_predictor_32x32_ssse3,
548 vpx_highbd_d63_predictor_16x16_ssse3, nullptr)
549 HIGHBD_INTRA_PRED_TEST(SSSE3, TestHighbdIntraPred32, nullptr, nullptr, nullptr,
550 nullptr, nullptr, nullptr,
551 vpx_highbd_d45_predictor_32x32_ssse3,
542552 vpx_highbd_d135_predictor_32x32_ssse3,
543553 vpx_highbd_d117_predictor_32x32_ssse3,
544554 vpx_highbd_d153_predictor_32x32_ssse3,
545555 vpx_highbd_d207_predictor_32x32_ssse3,
546 vpx_highbd_d63_predictor_32x32_ssse3, NULL)
556 vpx_highbd_d63_predictor_32x32_ssse3, nullptr)
547557 #endif // HAVE_SSSE3
548558
549559 #if HAVE_NEON
552562 vpx_highbd_dc_left_predictor_4x4_neon, vpx_highbd_dc_top_predictor_4x4_neon,
553563 vpx_highbd_dc_128_predictor_4x4_neon, vpx_highbd_v_predictor_4x4_neon,
554564 vpx_highbd_h_predictor_4x4_neon, vpx_highbd_d45_predictor_4x4_neon,
555 vpx_highbd_d135_predictor_4x4_neon, NULL, NULL, NULL, NULL,
565 vpx_highbd_d135_predictor_4x4_neon, nullptr, nullptr, nullptr, nullptr,
556566 vpx_highbd_tm_predictor_4x4_neon)
557567 HIGHBD_INTRA_PRED_TEST(
558568 NEON, TestHighbdIntraPred8, vpx_highbd_dc_predictor_8x8_neon,
559569 vpx_highbd_dc_left_predictor_8x8_neon, vpx_highbd_dc_top_predictor_8x8_neon,
560570 vpx_highbd_dc_128_predictor_8x8_neon, vpx_highbd_v_predictor_8x8_neon,
561571 vpx_highbd_h_predictor_8x8_neon, vpx_highbd_d45_predictor_8x8_neon,
562 vpx_highbd_d135_predictor_8x8_neon, NULL, NULL, NULL, NULL,
572 vpx_highbd_d135_predictor_8x8_neon, nullptr, nullptr, nullptr, nullptr,
563573 vpx_highbd_tm_predictor_8x8_neon)
564574 HIGHBD_INTRA_PRED_TEST(NEON, TestHighbdIntraPred16,
565575 vpx_highbd_dc_predictor_16x16_neon,
569579 vpx_highbd_v_predictor_16x16_neon,
570580 vpx_highbd_h_predictor_16x16_neon,
571581 vpx_highbd_d45_predictor_16x16_neon,
572 vpx_highbd_d135_predictor_16x16_neon, NULL, NULL, NULL,
573 NULL, vpx_highbd_tm_predictor_16x16_neon)
582 vpx_highbd_d135_predictor_16x16_neon, nullptr, nullptr,
583 nullptr, nullptr, vpx_highbd_tm_predictor_16x16_neon)
574584 HIGHBD_INTRA_PRED_TEST(NEON, TestHighbdIntraPred32,
575585 vpx_highbd_dc_predictor_32x32_neon,
576586 vpx_highbd_dc_left_predictor_32x32_neon,
579589 vpx_highbd_v_predictor_32x32_neon,
580590 vpx_highbd_h_predictor_32x32_neon,
581591 vpx_highbd_d45_predictor_32x32_neon,
582 vpx_highbd_d135_predictor_32x32_neon, NULL, NULL, NULL,
583 NULL, vpx_highbd_tm_predictor_32x32_neon)
592 vpx_highbd_d135_predictor_32x32_neon, nullptr, nullptr,
593 nullptr, nullptr, vpx_highbd_tm_predictor_32x32_neon)
584594 #endif // HAVE_NEON
585595
586596 #endif // CONFIG_VP9_HIGHBITDEPTH
3939 class TestVectorTest : public ::libvpx_test::DecoderTest,
4040 public ::libvpx_test::CodecTestWithParam<DecodeParam> {
4141 protected:
42 TestVectorTest() : DecoderTest(GET_PARAM(0)), md5_file_(NULL) {
42 TestVectorTest() : DecoderTest(GET_PARAM(0)), md5_file_(nullptr) {
4343 #if CONFIG_VP9_DECODER
4444 resize_clips_.insert(::libvpx_test::kVP9TestVectorsResize,
4545 ::libvpx_test::kVP9TestVectorsResize +
5353
5454 void OpenMD5File(const std::string &md5_file_name_) {
5555 md5_file_ = libvpx_test::OpenTestDataFile(md5_file_name_);
56 ASSERT_TRUE(md5_file_ != NULL)
56 ASSERT_NE(md5_file_, nullptr)
5757 << "Md5 file open failed. Filename: " << md5_file_name_;
5858 }
5959
7878
7979 virtual void DecompressedFrameHook(const vpx_image_t &img,
8080 const unsigned int frame_number) {
81 ASSERT_TRUE(md5_file_ != NULL);
81 ASSERT_NE(md5_file_, nullptr);
8282 char expected_md5[33];
8383 char junk[128];
8484
136136 return;
137137 #endif
138138 }
139 ASSERT_TRUE(video.get() != NULL);
139 ASSERT_NE(video.get(), nullptr);
140140 video->Init();
141141
142142 // Construct md5 file name.
5656 void *user_priv = reinterpret_cast<void *>(&frame_num);
5757 const vpx_codec_err_t res =
5858 decoder.DecodeFrame(video.cxdata(), video.frame_size(),
59 (frame_num == 0) ? NULL : user_priv);
59 (frame_num == 0) ? nullptr : user_priv);
6060 if (res != VPX_CODEC_OK) {
6161 EXPECT_EQ(VPX_CODEC_OK, res) << decoder.DecodeError();
6262 break;
6363 }
6464 libvpx_test::DxDataIterator dec_iter = decoder.GetDxData();
65 const vpx_image_t *img = NULL;
65 const vpx_image_t *img = nullptr;
6666
6767 // Get decompressed data.
6868 while ((img = dec_iter.Next())) {
6969 if (frame_num == 0) {
70 CheckUserPrivateData(img->user_priv, NULL);
70 CheckUserPrivateData(img->user_priv, nullptr);
7171 } else {
7272 CheckUserPrivateData(img->user_priv, &frame_num);
7373
7777 ref.idx = rnd.Rand8() % 3;
7878 decoder.Control(VP9_GET_REFERENCE, &ref);
7979
80 CheckUserPrivateData(ref.img.user_priv, NULL);
80 CheckUserPrivateData(ref.img.user_priv, nullptr);
8181 }
8282 md5.Add(img);
8383 }
252252
253253 template <typename Func>
254254 struct TestParams {
255 TestParams(int log2w = 0, int log2h = 0, Func function = NULL,
255 TestParams(int log2w = 0, int log2h = 0, Func function = nullptr,
256256 int bit_depth_value = 0)
257257 : log2width(log2w), log2height(log2h), func(function) {
258258 use_high_bit_depth = (bit_depth_value > 0);
296296 use_high_bit_depth() ? sizeof(uint16_t) : sizeof(uint8_t);
297297 src_ = reinterpret_cast<uint8_t *>(vpx_memalign(16, block_size() * unit));
298298 ref_ = new uint8_t[block_size() * unit];
299 ASSERT_TRUE(src_ != NULL);
300 ASSERT_TRUE(ref_ != NULL);
299 ASSERT_NE(src_, nullptr);
300 ASSERT_NE(ref_, nullptr);
301301 #if CONFIG_VP9_HIGHBITDEPTH
302302 if (use_high_bit_depth()) {
303303 // TODO(skal): remove!
318318
319319 vpx_free(src_);
320320 delete[] ref_;
321 src_ = NULL;
322 ref_ = NULL;
321 src_ = nullptr;
322 ref_ = nullptr;
323323 libvpx_test::ClearSystemState();
324324 }
325325
572572 (block_size() + width() + height() + 1) * sizeof(uint16_t))));
573573 #endif // CONFIG_VP9_HIGHBITDEPTH
574574 }
575 ASSERT_TRUE(src_ != NULL);
576 ASSERT_TRUE(sec_ != NULL);
577 ASSERT_TRUE(ref_ != NULL);
575 ASSERT_NE(src_, nullptr);
576 ASSERT_NE(sec_, nullptr);
577 ASSERT_NE(ref_, nullptr);
578578 }
579579
580580 virtual void TearDown() {
806806 SubpelAvgVarianceParams(2, 2, &vpx_sub_pixel_avg_variance4x4_c, 0)));
807807
808808 #if CONFIG_VP9_HIGHBITDEPTH
809 typedef MainTestClass<vpx_variance_fn_t> VpxHBDMseTest;
810809 typedef MainTestClass<vpx_variance_fn_t> VpxHBDVarianceTest;
811810 typedef SubpelVarianceTest<vpx_subpixvariance_fn_t> VpxHBDSubpelVarianceTest;
812811 typedef SubpelVarianceTest<vpx_subp_avg_variance_fn_t>
813812 VpxHBDSubpelAvgVarianceTest;
814813
815 TEST_P(VpxHBDMseTest, RefMse) { RefTestMse(); }
816 TEST_P(VpxHBDMseTest, MaxMse) { MaxTestMse(); }
817814 TEST_P(VpxHBDVarianceTest, Zero) { ZeroTest(); }
818815 TEST_P(VpxHBDVarianceTest, Ref) { RefTest(); }
819816 TEST_P(VpxHBDVarianceTest, RefStride) { RefStrideTest(); }
824821 TEST_P(VpxHBDSubpelAvgVarianceTest, Ref) { RefTest(); }
825822
826823 /* TODO(debargha): This test does not support the highbd version
824 typedef MainTestClass<vpx_variance_fn_t> VpxHBDMseTest;
825 TEST_P(VpxHBDMseTest, RefMse) { RefTestMse(); }
826 TEST_P(VpxHBDMseTest, MaxMse) { MaxTestMse(); }
827827 INSTANTIATE_TEST_SUITE_P(
828828 C, VpxHBDMseTest,
829829 ::testing::Values(MseParams(4, 4, &vpx_highbd_12_mse16x16_c),
839839 MseParams(4, 4, &vpx_highbd_8_mse8x16_c),
840840 MseParams(4, 4, &vpx_highbd_8_mse8x8_c)));
841841 */
842 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(VpxHBDMseTest);
842843
843844 INSTANTIATE_TEST_SUITE_P(
844845 C, VpxHBDVarianceTest,
3939 int increase_denoising_;
4040 };
4141
42 // TODO(https://crbug.com/webm/1718): This test fails with gcc 8-10.
43 #if defined(__GNUC__) && __GNUC__ >= 8
44 TEST_P(VP8DenoiserTest, DISABLED_BitexactCheck) {
45 #else
4246 TEST_P(VP8DenoiserTest, BitexactCheck) {
47 #endif
4348 ACMRandom rnd(ACMRandom::DeterministicSeed());
4449 const int count_test_block = 4000;
4550 const int stride = 16;
8691 // Check bitexactness.
8792 for (int h = 0; h < 16; ++h) {
8893 for (int w = 0; w < 16; ++w) {
89 EXPECT_EQ(avg_block_c[h * stride + w], avg_block_sse2[h * stride + w]);
94 ASSERT_EQ(avg_block_c[h * stride + w], avg_block_sse2[h * stride + w]);
9095 }
9196 }
9297
102107 // Check bitexactness.
103108 for (int h = 0; h < 16; ++h) {
104109 for (int w = 0; w < 16; ++w) {
105 EXPECT_EQ(avg_block_c[h * stride + w], avg_block_sse2[h * stride + w]);
110 ASSERT_EQ(avg_block_c[h * stride + w], avg_block_sse2[h * stride + w]);
106111 }
107112 }
108113 }
6666 HBDBlockErrorFunc error_block_op_;
6767 HBDBlockErrorFunc ref_error_block_op_;
6868 };
69 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(BlockErrorTest);
6970
7071 TEST_P(BlockErrorTest, OperationCheck) {
7172 ACMRandom rnd(ACMRandom::DeterministicSeed());
7373 GTEST_ASSERT_EQ(bw_buffer[0] & 0x80, 0);
7474
7575 vpx_reader br;
76 vpx_reader_init(&br, bw_buffer, kBufferSize, NULL, NULL);
76 vpx_reader_init(&br, bw_buffer, kBufferSize, nullptr, nullptr);
7777 bit_rnd.Reset(random_seed);
7878 for (int i = 0; i < kBitsToTest; ++i) {
7979 if (bit_method == 2) {
700700 // Use 2 states: 1 is center square, 0 is the rest.
701701 roi_.roi_map = reinterpret_cast<uint8_t *>(
702702 calloc(roi_.rows * roi_.cols, sizeof(*roi_.roi_map)));
703 ASSERT_TRUE(roi_.roi_map != NULL);
703 ASSERT_NE(roi_.roi_map, nullptr);
704704
705705 for (unsigned int i = 0; i < roi_.rows; ++i) {
706706 for (unsigned int j = 0; j < roi_.cols; ++j) {
5050 protected:
5151 BLOCK_SIZE bs_;
5252 };
53 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(VP9DenoiserTest);
5354
5455 TEST_P(VP9DenoiserTest, BitexactCheck) {
5556 ACMRandom rnd(ACMRandom::DeterministicSeed());
141141
142142 std::unique_ptr<libvpx_test::VideoSource> video(
143143 new libvpx_test::Y4mVideoSource(test_video_.name, 0, test_video_.frames));
144 ASSERT_TRUE(video.get() != NULL);
144 ASSERT_NE(video.get(), nullptr);
145145
146146 ASSERT_NO_FATAL_FAILURE(RunLoop(video.get()));
147147 }
256256 video.reset(new libvpx_test::YUVVideoSource(test_video_param_.filename,
257257 test_video_param_.fmt, 352, 288,
258258 30, 1, 0, 100));
259 ASSERT_TRUE(video.get() != NULL);
259 ASSERT_NE(video.get(), nullptr);
260260
261261 ASSERT_NO_FATAL_FAILURE(RunLoop(video.get()));
262262 }
279279 test_video_param_.filename, test_video_param_.fmt, kWidth, kHeight,
280280 kFramerate, 1, 0, kFrames));
281281 }
282 ASSERT_TRUE(video.get() != NULL);
282 ASSERT_NE(video.get(), nullptr);
283283
284284 ASSERT_NO_FATAL_FAILURE(RunLoop(video.get()));
285285 const double psnr = GetAveragePsnr();
306306 test_video_param_.filename, test_video_param_.fmt, kWidth, kHeight,
307307 kFramerate, 1, 0, kFrames));
308308 }
309 ASSERT_TRUE(video.get() != NULL);
309 ASSERT_NE(video.get(), nullptr);
310310
311311 ASSERT_NO_FATAL_FAILURE(RunLoop(video.get()));
312312 const double psnr = GetAveragePsnr();
341341 VP9_INSTANTIATE_TEST_SUITE(EndToEndNV12,
342342 ::testing::Values(::libvpx_test::kRealTime),
343343 ::testing::ValuesIn(kTestVectorsNv12),
344 ::testing::ValuesIn({ 6, 7, 8 }));
344 ::testing::Values(6, 7, 8));
345345
346346 VP9_INSTANTIATE_TEST_SUITE(EndToEndTestAdaptiveRDThresh,
347347 ::testing::Values(5, 6, 7), ::testing::Values(8, 9));
4040
4141 row_mt_mode_ = 1;
4242 first_pass_only_ = true;
43 firstpass_stats_.buf = NULL;
43 firstpass_stats_.buf = nullptr;
4444 firstpass_stats_.sz = 0;
4545 }
4646 virtual ~VPxFirstPassEncoderThreadTest() { free(firstpass_stats_.buf); }
0 /*
1 * Copyright (c) 2020 The WebM project authors. All Rights Reserved.
2 *
3 * Use of this source code is governed by a BSD-style license
4 * that can be found in the LICENSE file in the root of the source
5 * tree. An additional intellectual property rights grant can be found
6 * in the file PATENTS. All contributing project authors may
7 * be found in the AUTHORS file in the root of the source tree.
8 */
9
10 #include <new>
11
12 #include "test/codec_factory.h"
13 #include "test/encode_test_driver.h"
14 #include "test/util.h"
15 #include "test/yuv_video_source.h"
16 #include "third_party/googletest/src/include/gtest/gtest.h"
17 #include "vpx/vpx_ext_ratectrl.h"
18
19 namespace {
20
21 constexpr int kModelMagicNumber = 51396;
22 constexpr unsigned int PrivMagicNumber = 5566;
23 constexpr int kFrameNum = 5;
24 constexpr int kLosslessCodingIndex = 2;
25
26 struct ToyRateCtrl {
27 int magic_number;
28 int coding_index;
29 };
30
31 vpx_rc_status_t rc_create_model(void *priv,
32 const vpx_rc_config_t *ratectrl_config,
33 vpx_rc_model_t *rate_ctrl_model_pt) {
34 ToyRateCtrl *toy_rate_ctrl = new (std::nothrow) ToyRateCtrl;
35 EXPECT_NE(toy_rate_ctrl, nullptr);
36 toy_rate_ctrl->magic_number = kModelMagicNumber;
37 toy_rate_ctrl->coding_index = -1;
38 *rate_ctrl_model_pt = toy_rate_ctrl;
39 EXPECT_EQ(priv, reinterpret_cast<void *>(PrivMagicNumber));
40 EXPECT_EQ(ratectrl_config->frame_width, 352);
41 EXPECT_EQ(ratectrl_config->frame_height, 288);
42 EXPECT_EQ(ratectrl_config->show_frame_count, kFrameNum);
43 EXPECT_EQ(ratectrl_config->target_bitrate_kbps, 24000);
44 EXPECT_EQ(ratectrl_config->frame_rate_num, 30);
45 EXPECT_EQ(ratectrl_config->frame_rate_den, 1);
46 return VPX_RC_OK;
47 }
48
49 vpx_rc_status_t rc_send_firstpass_stats(
50 vpx_rc_model_t rate_ctrl_model,
51 const vpx_rc_firstpass_stats_t *first_pass_stats) {
52 const ToyRateCtrl *toy_rate_ctrl =
53 static_cast<ToyRateCtrl *>(rate_ctrl_model);
54 EXPECT_EQ(toy_rate_ctrl->magic_number, kModelMagicNumber);
55 EXPECT_EQ(first_pass_stats->num_frames, kFrameNum);
56 for (int i = 0; i < first_pass_stats->num_frames; ++i) {
57 EXPECT_DOUBLE_EQ(first_pass_stats->frame_stats[i].frame, i);
58 }
59 return VPX_RC_OK;
60 }
61
62 vpx_rc_status_t rc_get_encodeframe_decision(
63 vpx_rc_model_t rate_ctrl_model,
64 const vpx_rc_encodeframe_info_t *encode_frame_info,
65 vpx_rc_encodeframe_decision_t *frame_decision) {
66 ToyRateCtrl *toy_rate_ctrl = static_cast<ToyRateCtrl *>(rate_ctrl_model);
67 toy_rate_ctrl->coding_index += 1;
68
69 EXPECT_EQ(toy_rate_ctrl->magic_number, kModelMagicNumber);
70
71 EXPECT_LT(encode_frame_info->show_index, kFrameNum);
72 EXPECT_EQ(encode_frame_info->coding_index, toy_rate_ctrl->coding_index);
73
74 if (encode_frame_info->coding_index == 0) {
75 EXPECT_EQ(encode_frame_info->show_index, 0);
76 EXPECT_EQ(encode_frame_info->gop_index, 0);
77 EXPECT_EQ(encode_frame_info->frame_type, 0 /*kFrameTypeKey*/);
78 EXPECT_EQ(encode_frame_info->ref_frame_valid_list[0],
79 0); // kRefFrameTypeLast
80 EXPECT_EQ(encode_frame_info->ref_frame_valid_list[1],
81 0); // kRefFrameTypePast
82 EXPECT_EQ(encode_frame_info->ref_frame_valid_list[2],
83 0); // kRefFrameTypeFuture
84 }
85
86 if (encode_frame_info->coding_index == 1) {
87 EXPECT_EQ(encode_frame_info->show_index, 4);
88 EXPECT_EQ(encode_frame_info->gop_index, 1);
89 EXPECT_EQ(encode_frame_info->frame_type, 2 /*kFrameTypeAltRef*/);
90 EXPECT_EQ(encode_frame_info->ref_frame_valid_list[0],
91 1); // kRefFrameTypeLast
92 EXPECT_EQ(encode_frame_info->ref_frame_valid_list[1],
93 0); // kRefFrameTypePast
94 EXPECT_EQ(encode_frame_info->ref_frame_valid_list[2],
95 0); // kRefFrameTypeFuture
96 EXPECT_EQ(encode_frame_info->ref_frame_coding_indexes[0],
97 0); // kRefFrameTypeLast
98 }
99
100 if (encode_frame_info->coding_index >= 2 &&
101 encode_frame_info->coding_index < 5) {
102 // In the first group of pictures, coding_index and gop_index are equal.
103 EXPECT_EQ(encode_frame_info->gop_index, encode_frame_info->coding_index);
104 EXPECT_EQ(encode_frame_info->frame_type, 1 /*kFrameTypeInter*/);
105 }
106
107 if (encode_frame_info->coding_index == 5) {
108 EXPECT_EQ(encode_frame_info->show_index, 4);
109 EXPECT_EQ(encode_frame_info->gop_index, 0);
110 EXPECT_EQ(encode_frame_info->frame_type, 3 /*kFrameTypeOverlay*/);
111 EXPECT_EQ(encode_frame_info->ref_frame_valid_list[0],
112 1); // kRefFrameTypeLast
113 EXPECT_EQ(encode_frame_info->ref_frame_valid_list[1],
114 1); // kRefFrameTypePast
115 EXPECT_EQ(encode_frame_info->ref_frame_valid_list[2],
116 1); // kRefFrameTypeFuture
117 EXPECT_EQ(encode_frame_info->ref_frame_coding_indexes[0],
118 4); // kRefFrameTypeLast
119 EXPECT_EQ(encode_frame_info->ref_frame_coding_indexes[1],
120 0); // kRefFrameTypePast
121 EXPECT_EQ(encode_frame_info->ref_frame_coding_indexes[2],
122 1); // kRefFrameTypeFuture
123 }
124 if (encode_frame_info->coding_index == kLosslessCodingIndex) {
125 // We should get sse == 0 at rc_update_encodeframe_result()
126 frame_decision->q_index = 0;
127 } else {
128 frame_decision->q_index = 100;
129 }
130 frame_decision->max_frame_size = 0;
131 return VPX_RC_OK;
132 }
133
134 vpx_rc_status_t rc_update_encodeframe_result(
135 vpx_rc_model_t rate_ctrl_model,
136 const vpx_rc_encodeframe_result_t *encode_frame_result) {
137 const ToyRateCtrl *toy_rate_ctrl =
138 static_cast<ToyRateCtrl *>(rate_ctrl_model);
139 EXPECT_EQ(toy_rate_ctrl->magic_number, kModelMagicNumber);
140
141 const int64_t ref_pixel_count = 352 * 288 * 3 / 2;
142 EXPECT_EQ(encode_frame_result->pixel_count, ref_pixel_count);
143 if (toy_rate_ctrl->coding_index == kLosslessCodingIndex) {
144 EXPECT_EQ(encode_frame_result->sse, 0);
145 }
146 if (toy_rate_ctrl->coding_index == kLosslessCodingIndex) {
147 EXPECT_EQ(encode_frame_result->actual_encoding_qindex, 0);
148 } else {
149 EXPECT_EQ(encode_frame_result->actual_encoding_qindex, 100);
150 }
151 return VPX_RC_OK;
152 }
153
154 vpx_rc_status_t rc_delete_model(vpx_rc_model_t rate_ctrl_model) {
155 ToyRateCtrl *toy_rate_ctrl = static_cast<ToyRateCtrl *>(rate_ctrl_model);
156 EXPECT_EQ(toy_rate_ctrl->magic_number, kModelMagicNumber);
157 delete toy_rate_ctrl;
158 return VPX_RC_OK;
159 }
160
161 class ExtRateCtrlTest : public ::libvpx_test::EncoderTest,
162 public ::testing::Test {
163 protected:
164 ExtRateCtrlTest() : EncoderTest(&::libvpx_test::kVP9) {}
165
166 ~ExtRateCtrlTest() override = default;
167
168 void SetUp() override {
169 InitializeConfig();
170 SetMode(::libvpx_test::kTwoPassGood);
171 }
172
173 void PreEncodeFrameHook(::libvpx_test::VideoSource *video,
174 ::libvpx_test::Encoder *encoder) override {
175 if (video->frame() == 0) {
176 vpx_rc_funcs_t rc_funcs;
177 rc_funcs.create_model = rc_create_model;
178 rc_funcs.send_firstpass_stats = rc_send_firstpass_stats;
179 rc_funcs.get_encodeframe_decision = rc_get_encodeframe_decision;
180 rc_funcs.update_encodeframe_result = rc_update_encodeframe_result;
181 rc_funcs.delete_model = rc_delete_model;
182 rc_funcs.priv = reinterpret_cast<void *>(PrivMagicNumber);
183 encoder->Control(VP9E_SET_EXTERNAL_RATE_CONTROL, &rc_funcs);
184 }
185 }
186 };
187
188 TEST_F(ExtRateCtrlTest, EncodeTest) {
189 cfg_.rc_target_bitrate = 24000;
190
191 std::unique_ptr<libvpx_test::VideoSource> video;
192 video.reset(new (std::nothrow) libvpx_test::YUVVideoSource(
193 "bus_352x288_420_f20_b8.yuv", VPX_IMG_FMT_I420, 352, 288, 30, 1, 0,
194 kFrameNum));
195
196 ASSERT_NE(video.get(), nullptr);
197 ASSERT_NO_FATAL_FAILURE(RunLoop(video.get()));
198 }
199
200 } // namespace
3131 const uint8_t *above, const uint8_t *left);
3232
3333 struct IntraPredParam {
34 IntraPredParam(IntraPredFunc pred = NULL, IntraPredFunc ref = NULL,
34 IntraPredParam(IntraPredFunc pred = nullptr, IntraPredFunc ref = nullptr,
3535 int block_size_value = 0, int bit_depth_value = 0)
3636 : pred_fn(pred), ref_fn(ref), block_size(block_size_value),
3737 bit_depth(bit_depth_value) {}
445445 const uint16_t *above, const uint16_t *left,
446446 int bps);
447447 struct HighbdIntraPredParam {
448 HighbdIntraPredParam(HighbdIntraPred pred = NULL, HighbdIntraPred ref = NULL,
449 int block_size_value = 0, int bit_depth_value = 0)
448 HighbdIntraPredParam(HighbdIntraPred pred = nullptr,
449 HighbdIntraPred ref = nullptr, int block_size_value = 0,
450 int bit_depth_value = 0)
450451 : pred_fn(pred), ref_fn(ref), block_size(block_size_value),
451452 bit_depth(bit_depth_value) {}
452453
456457 int bit_depth;
457458 };
458459
460 #if HAVE_SSSE3 || HAVE_NEON || HAVE_SSE2
459461 template <>
460462 void IntraPredTest<uint16_t, HighbdIntraPredParam>::Predict() {
461463 const int bit_depth = params_.bit_depth;
465467 }
466468
467469 typedef IntraPredTest<uint16_t, HighbdIntraPredParam> VP9HighbdIntraPredTest;
470 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(VP9HighbdIntraPredTest);
468471
469472 TEST_P(VP9HighbdIntraPredTest, HighbdIntraPredTests) {
470473 // max block size is 32
474477 DECLARE_ALIGNED(16, uint16_t, ref_dst[3 * 32 * 32]);
475478 RunTest(left_col, above_data, dst, ref_dst);
476479 }
480 #endif
477481
478482 #if HAVE_SSSE3
479483 INSTANTIATE_TEST_SUITE_P(
8787 "niklas_640_480_30.yuv", VPX_IMG_FMT_I420, 3840, 2160, // 2048, 1080,
8888 30, 1, 0, 5));
8989
90 ASSERT_TRUE(video.get() != NULL);
90 ASSERT_NE(video.get(), nullptr);
9191 ASSERT_NO_FATAL_FAILURE(RunLoop(video.get()));
9292 }
9393
109109 vpx_free(quant_ptr_);
110110 vpx_free(quant_shift_ptr_);
111111 vpx_free(dequant_ptr_);
112 zbin_ptr_ = NULL;
113 round_fp_ptr_ = NULL;
114 quant_fp_ptr_ = NULL;
115 round_ptr_ = NULL;
116 quant_ptr_ = NULL;
117 quant_shift_ptr_ = NULL;
118 dequant_ptr_ = NULL;
112 zbin_ptr_ = nullptr;
113 round_fp_ptr_ = nullptr;
114 quant_fp_ptr_ = nullptr;
115 round_ptr_ = nullptr;
116 quant_ptr_ = nullptr;
117 quant_shift_ptr_ = nullptr;
118 dequant_ptr_ = nullptr;
119119 libvpx_test::ClearSystemState();
120120 }
121121
2323 // Class for testing shutting off the loop filter.
2424 class SkipLoopFilterTest {
2525 public:
26 SkipLoopFilterTest() : video_(NULL), decoder_(NULL), md5_file_(NULL) {}
26 SkipLoopFilterTest()
27 : video_(nullptr), decoder_(nullptr), md5_file_(nullptr) {}
2728
2829 ~SkipLoopFilterTest() {
29 if (md5_file_ != NULL) fclose(md5_file_);
30 if (md5_file_ != nullptr) fclose(md5_file_);
3031 delete decoder_;
3132 delete video_;
3233 }
3637 expected_md5_[0] = '\0';
3738 junk_[0] = '\0';
3839 video_ = new libvpx_test::WebMVideoSource(kVp9TestFile);
39 if (video_ == NULL) {
40 EXPECT_TRUE(video_ != NULL);
40 if (video_ == nullptr) {
41 EXPECT_NE(video_, nullptr);
4142 return false;
4243 }
4344 video_->Init();
4647 vpx_codec_dec_cfg_t cfg = vpx_codec_dec_cfg_t();
4748 if (num_threads > 0) cfg.threads = num_threads;
4849 decoder_ = new libvpx_test::VP9Decoder(cfg, 0);
49 if (decoder_ == NULL) {
50 EXPECT_TRUE(decoder_ != NULL);
50 if (decoder_ == nullptr) {
51 EXPECT_NE(decoder_, nullptr);
5152 return false;
5253 }
5354
7273 }
7374
7475 vpx_codec_err_t DecodeRemainingFrames() {
75 for (; video_->cxdata() != NULL; video_->Next()) {
76 for (; video_->cxdata() != nullptr; video_->Next()) {
7677 const vpx_codec_err_t res =
7778 decoder_->DecodeFrame(video_->cxdata(), video_->frame_size());
7879 if (res != VPX_CODEC_OK) return res;
9293 // TODO(fgalligan): Move the MD5 testing code into another class.
9394 void OpenMd5File(const std::string &md5_file_name) {
9495 md5_file_ = libvpx_test::OpenTestDataFile(md5_file_name);
95 ASSERT_TRUE(md5_file_ != NULL)
96 ASSERT_NE(md5_file_, nullptr)
9697 << "MD5 file open failed. Filename: " << md5_file_name;
9798 }
9899
99100 // Reads the next line of the MD5 file.
100101 void ReadMd5() {
101 ASSERT_TRUE(md5_file_ != NULL);
102 ASSERT_NE(md5_file_, nullptr);
102103 const int res = fscanf(md5_file_, "%s %s", expected_md5_, junk_);
103104 ASSERT_NE(EOF, res) << "Read md5 data failed";
104105 expected_md5_[32] = '\0';
127127 }
128128
129129 TEST(VPxWorkerThreadTest, TestInterfaceAPI) {
130 EXPECT_EQ(0, vpx_set_worker_interface(NULL));
131 EXPECT_TRUE(vpx_get_worker_interface() != NULL);
130 EXPECT_EQ(0, vpx_set_worker_interface(nullptr));
131 EXPECT_NE(vpx_get_worker_interface(), nullptr);
132132 for (int i = 0; i < 6; ++i) {
133133 VPxWorkerInterface winterface = *vpx_get_worker_interface();
134134 switch (i) {
135135 default:
136 case 0: winterface.init = NULL; break;
137 case 1: winterface.reset = NULL; break;
138 case 2: winterface.sync = NULL; break;
139 case 3: winterface.launch = NULL; break;
140 case 4: winterface.execute = NULL; break;
141 case 5: winterface.end = NULL; break;
136 case 0: winterface.init = nullptr; break;
137 case 1: winterface.reset = nullptr; break;
138 case 2: winterface.sync = nullptr; break;
139 case 3: winterface.launch = nullptr; break;
140 case 4: winterface.execute = nullptr; break;
141 case 5: winterface.end = nullptr; break;
142142 }
143143 EXPECT_EQ(0, vpx_set_worker_interface(&winterface));
144144 }
171171 }
172172
173173 libvpx_test::DxDataIterator dec_iter = decoder.GetDxData();
174 const vpx_image_t *img = NULL;
174 const vpx_image_t *img = nullptr;
175175
176176 // Get decompressed data
177177 while ((img = dec_iter.Next())) {
182182 }
183183
184184 void DecodeFiles(const FileList files[]) {
185 for (const FileList *iter = files; iter->name != NULL; ++iter) {
185 for (const FileList *iter = files; iter->name != nullptr; ++iter) {
186186 SCOPED_TRACE(iter->name);
187187 for (int t = 1; t <= 8; ++t) {
188188 EXPECT_EQ(iter->expected_md5, DecodeFile(iter->name, t))
244244 "368ebc6ebf3a5e478d85b2c3149b2848" },
245245 { "vp90-2-08-tile_1x8_frame_parallel.webm",
246246 "17e439da2388aff3a0f69cb22579c6c1" },
247 { NULL, NULL } };
247 { nullptr, nullptr } };
248248
249249 DecodeFiles(files);
250250 }
295295 "ae96f21f21b6370cc0125621b441fc52" },
296296 { "vp90-2-14-resize-fp-tiles-8-4.webm",
297297 "3eb4f24f10640d42218f7fd7b9fd30d4" },
298 { NULL, NULL }
298 { nullptr, nullptr }
299299 };
300300
301301 DecodeFiles(files);
308308 { "vp90-2-08-tile_1x8.webm", "0941902a52e9092cb010905eab16364c" },
309309 { "vp90-2-08-tile-4x1.webm", "06505aade6647c583c8e00a2f582266f" },
310310 { "vp90-2-08-tile-4x4.webm", "85c2299892460d76e2c600502d52bfe2" },
311 { NULL, NULL }
311 { nullptr, nullptr }
312312 };
313313
314314 DecodeFiles(files);
8989
9090 // Checks y4m header information
9191 void HeaderChecks(unsigned int bit_depth, vpx_img_fmt_t fmt) {
92 ASSERT_TRUE(input_file_ != NULL);
92 ASSERT_NE(input_file_, nullptr);
9393 ASSERT_EQ(y4m_.pic_w, (int)kWidth);
9494 ASSERT_EQ(y4m_.pic_h, (int)kHeight);
9595 ASSERT_EQ(img()->d_w, kWidth);
115115
116116 // Checks MD5 of the raw frame data
117117 void Md5Check(const string &expected_md5) {
118 ASSERT_TRUE(input_file_ != NULL);
118 ASSERT_NE(input_file_, nullptr);
119119 libvpx_test::MD5 md5;
120120 for (unsigned int i = start_; i < limit_; i++) {
121121 md5.Add(img());
137137
138138 class Y4mVideoWriteTest : public Y4mVideoSourceTest {
139139 protected:
140 Y4mVideoWriteTest() : tmpfile_(NULL) {}
140 Y4mVideoWriteTest() : tmpfile_(nullptr) {}
141141
142142 virtual ~Y4mVideoWriteTest() {
143143 delete tmpfile_;
144 input_file_ = NULL;
144 input_file_ = nullptr;
145145 }
146146
147147 void ReplaceInputFile(FILE *input_file) {
154154
155155 // Writes out a y4m file and then reads it back
156156 void WriteY4mAndReadBack() {
157 ASSERT_TRUE(input_file_ != NULL);
157 ASSERT_NE(input_file_, nullptr);
158158 char buf[Y4M_BUFFER_SIZE] = { 0 };
159159 const struct VpxRational framerate = { y4m_.fps_n, y4m_.fps_d };
160160 tmpfile_ = new libvpx_test::TempOutFile;
161 ASSERT_TRUE(tmpfile_->file() != NULL);
161 ASSERT_NE(tmpfile_->file(), nullptr);
162162 y4m_write_file_header(buf, sizeof(buf), kWidth, kHeight, &framerate,
163163 y4m_.vpx_fmt, y4m_.bit_depth);
164164 fputs(buf, tmpfile_->file());
187187
188188 INSTANTIATE_TEST_SUITE_P(C, Y4mVideoWriteTest,
189189 ::testing::ValuesIn(kY4mTestVectors));
190
191 static const char kY4MRegularHeader[] =
192 "YUV4MPEG2 W4 H4 F30:1 Ip A0:0 C420jpeg XYSCSS=420JPEG\n"
193 "FRAME\n"
194 "012345678912345601230123";
195
196 TEST(Y4MHeaderTest, RegularHeader) {
197 libvpx_test::TempOutFile f;
198 fwrite(kY4MRegularHeader, 1, sizeof(kY4MRegularHeader), f.file());
199 fflush(f.file());
200 EXPECT_EQ(0, fseek(f.file(), 0, 0));
201
202 y4m_input y4m;
203 EXPECT_EQ(y4m_input_open(&y4m, f.file(), /*skip_buffer=*/NULL,
204 /*num_skip=*/0, /*only_420=*/0),
205 0);
206 EXPECT_EQ(y4m.pic_w, 4);
207 EXPECT_EQ(y4m.pic_h, 4);
208 EXPECT_EQ(y4m.fps_n, 30);
209 EXPECT_EQ(y4m.fps_d, 1);
210 EXPECT_EQ(y4m.interlace, 'p');
211 EXPECT_EQ(strcmp("420jpeg", y4m.chroma_type), 0);
212 y4m_input_close(&y4m);
213 }
214
215 // Testing that headers over 100 characters can be parsed.
216 static const char kY4MLongHeader[] =
217 "YUV4MPEG2 W4 H4 F30:1 Ip A0:0 C420jpeg XYSCSS=420JPEG "
218 "XCOLORRANGE=LIMITED XSOME_UNKNOWN_METADATA XOTHER_UNKNOWN_METADATA\n"
219 "FRAME\n"
220 "012345678912345601230123";
221
222 TEST(Y4MHeaderTest, LongHeader) {
223 libvpx_test::TempOutFile f;
224 fwrite(kY4MLongHeader, 1, sizeof(kY4MLongHeader), f.file());
225 fflush(f.file());
226 EXPECT_EQ(fseek(f.file(), 0, 0), 0);
227
228 y4m_input y4m;
229 EXPECT_EQ(y4m_input_open(&y4m, f.file(), /*skip_buffer=*/NULL,
230 /*num_skip=*/0, /*only_420=*/0),
231 0);
232 EXPECT_EQ(y4m.pic_w, 4);
233 EXPECT_EQ(y4m.pic_h, 4);
234 EXPECT_EQ(y4m.fps_n, 30);
235 EXPECT_EQ(y4m.fps_d, 1);
236 EXPECT_EQ(y4m.interlace, 'p');
237 EXPECT_EQ(strcmp("420jpeg", y4m.chroma_type), 0);
238 y4m_input_close(&y4m);
239 }
240
190241 } // namespace
00 URL: https://github.com/google/googletest.git
1 Version: release-1.10.0
1 Version: release-1.10.0-224-g23b2a3b1
22 License: BSD
33 License File: LICENSE
44
1212
1313 Local Modifications:
1414 - Remove everything but:
15 googletest-release-1.10.0/googletest/
16 CHANGES
15 googletest/
1716 CONTRIBUTORS
1817 include
1918 LICENSE
2019 README.md
2120 src
21 - Enable kErrorOnUninstantiatedParameterizedTest and
22 kErrorOnUninstantiatedTypeParameterizedTest in gtest.cc
+0
-157
third_party/googletest/src/CHANGES less more
0 Changes for 1.7.0:
1
2 * New feature: death tests are supported on OpenBSD and in iOS
3 simulator now.
4 * New feature: Google Test now implements a protocol to allow
5 a test runner to detect that a test program has exited
6 prematurely and report it as a failure (before it would be
7 falsely reported as a success if the exit code is 0).
8 * New feature: Test::RecordProperty() can now be used outside of the
9 lifespan of a test method, in which case it will be attributed to
10 the current test case or the test program in the XML report.
11 * New feature (potentially breaking): --gtest_list_tests now prints
12 the type parameters and value parameters for each test.
13 * Improvement: char pointers and char arrays are now escaped properly
14 in failure messages.
15 * Improvement: failure summary in XML reports now includes file and
16 line information.
17 * Improvement: the <testsuites> XML element now has a timestamp attribute.
18 * Improvement: When --gtest_filter is specified, XML report now doesn't
19 contain information about tests that are filtered out.
20 * Fixed the bug where long --gtest_filter flag values are truncated in
21 death tests.
22 * Potentially breaking change: RUN_ALL_TESTS() is now implemented as a
23 function instead of a macro in order to work better with Clang.
24 * Compatibility fixes with C++ 11 and various platforms.
25 * Bug/warning fixes.
26
27 Changes for 1.6.0:
28
29 * New feature: ADD_FAILURE_AT() for reporting a test failure at the
30 given source location -- useful for writing testing utilities.
31 * New feature: the universal value printer is moved from Google Mock
32 to Google Test.
33 * New feature: type parameters and value parameters are reported in
34 the XML report now.
35 * A gtest_disable_pthreads CMake option.
36 * Colored output works in GNU Screen sessions now.
37 * Parameters of value-parameterized tests are now printed in the
38 textual output.
39 * Failures from ad hoc test assertions run before RUN_ALL_TESTS() are
40 now correctly reported.
41 * Arguments of ASSERT_XY and EXPECT_XY no longer need to support << to
42 ostream.
43 * More complete handling of exceptions.
44 * GTEST_ASSERT_XY can be used instead of ASSERT_XY in case the latter
45 name is already used by another library.
46 * --gtest_catch_exceptions is now true by default, allowing a test
47 program to continue after an exception is thrown.
48 * Value-parameterized test fixtures can now derive from Test and
49 WithParamInterface<T> separately, easing conversion of legacy tests.
50 * Death test messages are clearly marked to make them more
51 distinguishable from other messages.
52 * Compatibility fixes for Android, Google Native Client, MinGW, HP UX,
53 PowerPC, Lucid autotools, libCStd, Sun C++, Borland C++ Builder (Code Gear),
54 IBM XL C++ (Visual Age C++), and C++0x.
55 * Bug fixes and implementation clean-ups.
56 * Potentially incompatible changes: disables the harmful 'make install'
57 command in autotools.
58
59 Changes for 1.5.0:
60
61 * New feature: assertions can be safely called in multiple threads
62 where the pthreads library is available.
63 * New feature: predicates used inside EXPECT_TRUE() and friends
64 can now generate custom failure messages.
65 * New feature: Google Test can now be compiled as a DLL.
66 * New feature: fused source files are included.
67 * New feature: prints help when encountering unrecognized Google Test flags.
68 * Experimental feature: CMake build script (requires CMake 2.6.4+).
69 * Experimental feature: the Pump script for meta programming.
70 * double values streamed to an assertion are printed with enough precision
71 to differentiate any two different values.
72 * Google Test now works on Solaris and AIX.
73 * Build and test script improvements.
74 * Bug fixes and implementation clean-ups.
75
76 Potentially breaking changes:
77
78 * Stopped supporting VC++ 7.1 with exceptions disabled.
79 * Dropped support for 'make install'.
80
81 Changes for 1.4.0:
82
83 * New feature: the event listener API
84 * New feature: test shuffling
85 * New feature: the XML report format is closer to junitreport and can
86 be parsed by Hudson now.
87 * New feature: when a test runs under Visual Studio, its failures are
88 integrated in the IDE.
89 * New feature: /MD(d) versions of VC++ projects.
90 * New feature: elapsed time for the tests is printed by default.
91 * New feature: comes with a TR1 tuple implementation such that Boost
92 is no longer needed for Combine().
93 * New feature: EXPECT_DEATH_IF_SUPPORTED macro and friends.
94 * New feature: the Xcode project can now produce static gtest
95 libraries in addition to a framework.
96 * Compatibility fixes for Solaris, Cygwin, minGW, Windows Mobile,
97 Symbian, gcc, and C++Builder.
98 * Bug fixes and implementation clean-ups.
99
100 Changes for 1.3.0:
101
102 * New feature: death tests on Windows, Cygwin, and Mac.
103 * New feature: ability to use Google Test assertions in other testing
104 frameworks.
105 * New feature: ability to run disabled test via
106 --gtest_also_run_disabled_tests.
107 * New feature: the --help flag for printing the usage.
108 * New feature: access to Google Test flag values in user code.
109 * New feature: a script that packs Google Test into one .h and one
110 .cc file for easy deployment.
111 * New feature: support for distributing test functions to multiple
112 machines (requires support from the test runner).
113 * Bug fixes and implementation clean-ups.
114
115 Changes for 1.2.1:
116
117 * Compatibility fixes for Linux IA-64 and IBM z/OS.
118 * Added support for using Boost and other TR1 implementations.
119 * Changes to the build scripts to support upcoming release of Google C++
120 Mocking Framework.
121 * Added Makefile to the distribution package.
122 * Improved build instructions in README.
123
124 Changes for 1.2.0:
125
126 * New feature: value-parameterized tests.
127 * New feature: the ASSERT/EXPECT_(NON)FATAL_FAILURE(_ON_ALL_THREADS)
128 macros.
129 * Changed the XML report format to match JUnit/Ant's.
130 * Added tests to the Xcode project.
131 * Added scons/SConscript for building with SCons.
132 * Added src/gtest-all.cc for building Google Test from a single file.
133 * Fixed compatibility with Solaris and z/OS.
134 * Enabled running Python tests on systems with python 2.3 installed,
135 e.g. Mac OS X 10.4.
136 * Bug fixes.
137
138 Changes for 1.1.0:
139
140 * New feature: type-parameterized tests.
141 * New feature: exception assertions.
142 * New feature: printing elapsed time of tests.
143 * Improved the robustness of death tests.
144 * Added an Xcode project and samples.
145 * Adjusted the output format on Windows to be understandable by Visual Studio.
146 * Minor bug fixes.
147
148 Changes for 1.0.1:
149
150 * Added project files for Visual Studio 7.1.
151 * Fixed issues with compiling on Mac OS X.
152 * Fixed issues with compiling on Cygwin.
153
154 Changes for 1.0.0:
155
156 * Initial Open Source release of Google Test
1616 Keir Mierle <mierle@gmail.com>
1717 Keith Ray <keith.ray@gmail.com>
1818 Kenton Varda <kenton@google.com>
19 Krystian Kuzniarek <krystian.kuzniarek@gmail.com>
1920 Manuel Klimek <klimek@google.com>
2021 Markus Heule <markus.heule@gmail.com>
2122 Mika Raento <mikie@iki.fi>
77
88 ### Build with CMake
99
10 Google Test comes with a CMake build script (
11 [CMakeLists.txt](https://github.com/google/googletest/blob/master/CMakeLists.txt))
10 Google Test comes with a CMake build script
11 ([CMakeLists.txt](https://github.com/google/googletest/blob/master/CMakeLists.txt))
1212 that can be used on a wide range of platforms ("C" stands for cross-platform.).
1313 If you don't have CMake installed already, you can download it for free from
1414 <http://www.cmake.org/>.
383383 Matcher(const char* s); // NOLINT
384384 };
385385
386 #if GTEST_HAS_ABSL
386 #if GTEST_INTERNAL_HAS_STRING_VIEW
387387 // The following two specializations allow the user to write str
388388 // instead of Eq(str) and "foo" instead of Eq("foo") when a absl::string_view
389389 // matcher is expected.
390390 template <>
391 class GTEST_API_ Matcher<const absl::string_view&>
392 : public internal::MatcherBase<const absl::string_view&> {
391 class GTEST_API_ Matcher<const internal::StringView&>
392 : public internal::MatcherBase<const internal::StringView&> {
393393 public:
394394 Matcher() {}
395395
396 explicit Matcher(const MatcherInterface<const absl::string_view&>* impl)
397 : internal::MatcherBase<const absl::string_view&>(impl) {}
396 explicit Matcher(const MatcherInterface<const internal::StringView&>* impl)
397 : internal::MatcherBase<const internal::StringView&>(impl) {}
398398
399399 // Allows the user to write str instead of Eq(str) sometimes, where
400400 // str is a std::string object.
403403 // Allows the user to write "foo" instead of Eq("foo") sometimes.
404404 Matcher(const char* s); // NOLINT
405405
406 // Allows the user to pass absl::string_views directly.
407 Matcher(absl::string_view s); // NOLINT
406 // Allows the user to pass absl::string_views or std::string_views directly.
407 Matcher(internal::StringView s); // NOLINT
408408 };
409409
410410 template <>
411 class GTEST_API_ Matcher<absl::string_view>
412 : public internal::MatcherBase<absl::string_view> {
411 class GTEST_API_ Matcher<internal::StringView>
412 : public internal::MatcherBase<internal::StringView> {
413413 public:
414414 Matcher() {}
415415
416 explicit Matcher(const MatcherInterface<const absl::string_view&>* impl)
417 : internal::MatcherBase<absl::string_view>(impl) {}
418 explicit Matcher(const MatcherInterface<absl::string_view>* impl)
419 : internal::MatcherBase<absl::string_view>(impl) {}
416 explicit Matcher(const MatcherInterface<const internal::StringView&>* impl)
417 : internal::MatcherBase<internal::StringView>(impl) {}
418 explicit Matcher(const MatcherInterface<internal::StringView>* impl)
419 : internal::MatcherBase<internal::StringView>(impl) {}
420420
421421 // Allows the user to write str instead of Eq(str) sometimes, where
422422 // str is a std::string object.
425425 // Allows the user to write "foo" instead of Eq("foo") sometimes.
426426 Matcher(const char* s); // NOLINT
427427
428 // Allows the user to pass absl::string_views directly.
429 Matcher(absl::string_view s); // NOLINT
430 };
431 #endif // GTEST_HAS_ABSL
428 // Allows the user to pass absl::string_views or std::string_views directly.
429 Matcher(internal::StringView s); // NOLINT
430 };
431 #endif // GTEST_INTERNAL_HAS_STRING_VIEW
432432
433433 // Prints a matcher in a human-readable format.
434434 template <typename T>
473473 public:
474474 explicit MonomorphicImpl(const Impl& impl) : impl_(impl) {}
475475
476 virtual void DescribeTo(::std::ostream* os) const { impl_.DescribeTo(os); }
477
478 virtual void DescribeNegationTo(::std::ostream* os) const {
476 void DescribeTo(::std::ostream* os) const override { impl_.DescribeTo(os); }
477
478 void DescribeNegationTo(::std::ostream* os) const override {
479479 impl_.DescribeNegationTo(os);
480480 }
481481
482 virtual bool MatchAndExplain(T x, MatchResultListener* listener) const {
482 bool MatchAndExplain(T x, MatchResultListener* listener) const override {
483483 return impl_.MatchAndExplain(x, listener);
484484 }
485485
619619 MatchesRegexMatcher(const RE* regex, bool full_match)
620620 : regex_(regex), full_match_(full_match) {}
621621
622 #if GTEST_HAS_ABSL
623 bool MatchAndExplain(const absl::string_view& s,
622 #if GTEST_INTERNAL_HAS_STRING_VIEW
623 bool MatchAndExplain(const internal::StringView& s,
624624 MatchResultListener* listener) const {
625625 return MatchAndExplain(std::string(s), listener);
626626 }
627 #endif // GTEST_HAS_ABSL
627 #endif // GTEST_INTERNAL_HAS_STRING_VIEW
628628
629629 // Accepts pointer types, particularly:
630630 // const char*
4848
4949 #include <limits>
5050 #include <memory>
51 #include <sstream>
5152
5253 #include "gtest/internal/gtest-port.h"
5354
415415 : public test_suite_name { \
416416 public: \
417417 GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)() {} \
418 virtual void TestBody(); \
418 void TestBody() override; \
419419 \
420420 private: \
421421 static int AddToRegistry() { \
422422 ::testing::UnitTest::GetInstance() \
423423 ->parameterized_test_registry() \
424424 .GetTestSuitePatternHolder<test_suite_name>( \
425 #test_suite_name, \
425 GTEST_STRINGIFY_(test_suite_name), \
426426 ::testing::internal::CodeLocation(__FILE__, __LINE__)) \
427427 ->AddTestPattern( \
428428 GTEST_STRINGIFY_(test_suite_name), GTEST_STRINGIFY_(test_name), \
482482 ::testing::UnitTest::GetInstance() \
483483 ->parameterized_test_registry() \
484484 .GetTestSuitePatternHolder<test_suite_name>( \
485 #test_suite_name, \
485 GTEST_STRINGIFY_(test_suite_name), \
486486 ::testing::internal::CodeLocation(__FILE__, __LINE__)) \
487487 ->AddTestSuiteInstantiation( \
488 #prefix, &gtest_##prefix##test_suite_name##_EvalGenerator_, \
488 GTEST_STRINGIFY_(prefix), \
489 &gtest_##prefix##test_suite_name##_EvalGenerator_, \
489490 &gtest_##prefix##test_suite_name##_EvalGenerateName_, \
490491 __FILE__, __LINE__)
492
493
494 // Allow Marking a Parameterized test class as not needing to be instantiated.
495 #define GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(T) \
496 namespace gtest_do_not_use_outside_namespace_scope {} \
497 static const ::testing::internal::MarkAsIgnored gtest_allow_ignore_##T( \
498 GTEST_STRINGIFY_(T))
491499
492500 // Legacy API is deprecated but still available
493501 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
134134 kProtobuf, // a protobuf type
135135 kConvertibleToInteger, // a type implicitly convertible to BiggestInt
136136 // (e.g. a named or unnamed enum type)
137 #if GTEST_HAS_ABSL
137 #if GTEST_INTERNAL_HAS_STRING_VIEW
138138 kConvertibleToStringView, // a type implicitly convertible to
139 // absl::string_view
139 // absl::string_view or std::string_view
140140 #endif
141141 kOtherType // anything else
142142 };
190190 }
191191 };
192192
193 #if GTEST_HAS_ABSL
193 #if GTEST_INTERNAL_HAS_STRING_VIEW
194194 template <typename T>
195195 class TypeWithoutFormatter<T, kConvertibleToStringView> {
196196 public:
197197 // Since T has neither operator<< nor PrintTo() but can be implicitly
198 // converted to absl::string_view, we print it as a absl::string_view.
198 // converted to absl::string_view, we print it as a absl::string_view
199 // (or std::string_view).
199200 //
200201 // Note: the implementation is further below, as it depends on
201202 // internal::PrintTo symbol which is defined later in the file.
236237 const T&, internal::BiggestInt>::value
237238 ? kConvertibleToInteger
238239 :
239 #if GTEST_HAS_ABSL
240 #if GTEST_INTERNAL_HAS_STRING_VIEW
240241 std::is_convertible<
241 const T&, absl::string_view>::value
242 const T&, internal::StringView>::value
242243 ? kConvertibleToStringView
243244 :
244245 #endif
265266 // 7.3.4-1 [namespace.udir]. This allows us to fall back onto
266267 // testing::internal2::operator<< in case T doesn't come with a <<
267268 // operator.
268 //
269 // We cannot write 'using ::testing::internal2::operator<<;', which
270 // gcc 3.3 fails to compile due to a compiler bug.
271 using namespace ::testing::internal2; // NOLINT
269
270 using ::testing::internal2::operator<<;
272271
273272 // Assuming T is defined in namespace foo, in the next statement,
274273 // the compiler will consider all of:
602601 }
603602 #endif // GTEST_HAS_STD_WSTRING
604603
605 #if GTEST_HAS_ABSL
606 // Overload for absl::string_view.
607 inline void PrintTo(absl::string_view sp, ::std::ostream* os) {
604 #if GTEST_INTERNAL_HAS_STRING_VIEW
605 // Overload for internal::StringView.
606 inline void PrintTo(internal::StringView sp, ::std::ostream* os) {
608607 PrintTo(::std::string(sp), os);
609608 }
610 #endif // GTEST_HAS_ABSL
609 #endif // GTEST_INTERNAL_HAS_STRING_VIEW
611610
612611 inline void PrintTo(std::nullptr_t, ::std::ostream* os) { *os << "(nullptr)"; }
613612
900899
901900 } // namespace internal
902901
903 #if GTEST_HAS_ABSL
902 #if GTEST_INTERNAL_HAS_STRING_VIEW
904903 namespace internal2 {
905904 template <typename T>
906905 void TypeWithoutFormatter<T, kConvertibleToStringView>::PrintValue(
907906 const T& value, ::std::ostream* os) {
908 internal::PrintTo(absl::string_view(value), os);
907 internal::PrintTo(internal::StringView(value), os);
909908 }
910909 } // namespace internal2
911910 #endif
2626 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2727 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2828
29
3029 // GOOGLETEST_CM0001 DO NOT DELETE
3130
3231 #ifndef GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
169168
170169 #endif // 0
171170
171 #include "gtest/internal/gtest-internal.h"
172172 #include "gtest/internal/gtest-port.h"
173173 #include "gtest/internal/gtest-type-util.h"
174174
187187 #define GTEST_NAME_GENERATOR_(TestSuiteName) \
188188 gtest_type_params_##TestSuiteName##_NameGenerator
189189
190 #define TYPED_TEST_SUITE(CaseName, Types, ...) \
191 typedef ::testing::internal::TypeList<Types>::type GTEST_TYPE_PARAMS_( \
192 CaseName); \
193 typedef ::testing::internal::NameGeneratorSelector<__VA_ARGS__>::type \
190 #define TYPED_TEST_SUITE(CaseName, Types, ...) \
191 typedef ::testing::internal::GenerateTypeList<Types>::type \
192 GTEST_TYPE_PARAMS_(CaseName); \
193 typedef ::testing::internal::NameGeneratorSelector<__VA_ARGS__>::type \
194194 GTEST_NAME_GENERATOR_(CaseName)
195195
196 # define TYPED_TEST(CaseName, TestName) \
196 #define TYPED_TEST(CaseName, TestName) \
197 static_assert(sizeof(GTEST_STRINGIFY_(TestName)) > 1, \
198 "test-name must not be empty"); \
197199 template <typename gtest_TypeParam_> \
198200 class GTEST_TEST_CLASS_NAME_(CaseName, TestName) \
199201 : public CaseName<gtest_TypeParam_> { \
200202 private: \
201203 typedef CaseName<gtest_TypeParam_> TestFixture; \
202204 typedef gtest_TypeParam_ TypeParam; \
203 virtual void TestBody(); \
205 void TestBody() override; \
204206 }; \
205207 static bool gtest_##CaseName##_##TestName##_registered_ \
206 GTEST_ATTRIBUTE_UNUSED_ = \
207 ::testing::internal::TypeParameterizedTest< \
208 GTEST_ATTRIBUTE_UNUSED_ = ::testing::internal::TypeParameterizedTest< \
208209 CaseName, \
209210 ::testing::internal::TemplateSel<GTEST_TEST_CLASS_NAME_(CaseName, \
210211 TestName)>, \
212213 CaseName)>::Register("", \
213214 ::testing::internal::CodeLocation( \
214215 __FILE__, __LINE__), \
215 #CaseName, #TestName, 0, \
216 GTEST_STRINGIFY_(CaseName), \
217 GTEST_STRINGIFY_(TestName), 0, \
216218 ::testing::internal::GenerateNames< \
217219 GTEST_NAME_GENERATOR_(CaseName), \
218220 GTEST_TYPE_PARAMS_(CaseName)>()); \
275277 private: \
276278 typedef SuiteName<gtest_TypeParam_> TestFixture; \
277279 typedef gtest_TypeParam_ TypeParam; \
278 virtual void TestBody(); \
280 void TestBody() override; \
279281 }; \
280282 static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \
281283 GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName).AddTestName( \
282 __FILE__, __LINE__, #SuiteName, #TestName); \
284 __FILE__, __LINE__, GTEST_STRINGIFY_(SuiteName), \
285 GTEST_STRINGIFY_(TestName)); \
283286 } \
284287 template <typename gtest_TypeParam_> \
285288 void GTEST_SUITE_NAMESPACE_( \
286289 SuiteName)::TestName<gtest_TypeParam_>::TestBody()
287290
288 #define REGISTER_TYPED_TEST_SUITE_P(SuiteName, ...) \
289 namespace GTEST_SUITE_NAMESPACE_(SuiteName) { \
290 typedef ::testing::internal::Templates<__VA_ARGS__>::type gtest_AllTests_; \
291 } \
292 static const char* const GTEST_REGISTERED_TEST_NAMES_( \
293 SuiteName) GTEST_ATTRIBUTE_UNUSED_ = \
294 GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName).VerifyRegisteredTestNames( \
295 __FILE__, __LINE__, #__VA_ARGS__)
291 // Note: this won't work correctly if the trailing arguments are macros.
292 #define REGISTER_TYPED_TEST_SUITE_P(SuiteName, ...) \
293 namespace GTEST_SUITE_NAMESPACE_(SuiteName) { \
294 typedef ::testing::internal::Templates<__VA_ARGS__> gtest_AllTests_; \
295 } \
296 static const char* const GTEST_REGISTERED_TEST_NAMES_( \
297 SuiteName) GTEST_ATTRIBUTE_UNUSED_ = \
298 GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName).VerifyRegisteredTestNames( \
299 GTEST_STRINGIFY_(SuiteName), __FILE__, __LINE__, #__VA_ARGS__)
296300
297301 // Legacy API is deprecated but still available
298302 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
303307 #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
304308
305309 #define INSTANTIATE_TYPED_TEST_SUITE_P(Prefix, SuiteName, Types, ...) \
310 static_assert(sizeof(GTEST_STRINGIFY_(Prefix)) > 1, \
311 "test-suit-prefix must not be empty"); \
306312 static bool gtest_##Prefix##_##SuiteName GTEST_ATTRIBUTE_UNUSED_ = \
307313 ::testing::internal::TypeParameterizedTestSuite< \
308314 SuiteName, GTEST_SUITE_NAMESPACE_(SuiteName)::gtest_AllTests_, \
309 ::testing::internal::TypeList<Types>::type>:: \
310 Register(#Prefix, \
315 ::testing::internal::GenerateTypeList<Types>::type>:: \
316 Register(GTEST_STRINGIFY_(Prefix), \
311317 ::testing::internal::CodeLocation(__FILE__, __LINE__), \
312 &GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName), #SuiteName, \
318 &GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName), \
319 GTEST_STRINGIFY_(SuiteName), \
313320 GTEST_REGISTERED_TEST_NAMES_(SuiteName), \
314321 ::testing::internal::GenerateNames< \
315322 ::testing::internal::NameGeneratorSelector< \
316323 __VA_ARGS__>::type, \
317 ::testing::internal::TypeList<Types>::type>())
324 ::testing::internal::GenerateTypeList<Types>::type>())
318325
319326 // Legacy API is deprecated but still available
320327 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
176176 class UnitTestImpl* GetUnitTestImpl();
177177 void ReportFailureInUnknownLocation(TestPartResult::Type result_type,
178178 const std::string& message);
179 std::set<std::string>* GetIgnoredParameterizedTestSuites();
179180
180181 } // namespace internal
181182
277278 // Used in EXPECT_TRUE/FALSE(assertion_result).
278279 AssertionResult(const AssertionResult& other);
279280
280 #if defined(_MSC_VER) && _MSC_VER < 1910
281 // C4800 is a level 3 warning in Visual Studio 2015 and earlier.
282 // This warning is not emitted in Visual Studio 2017.
283 // This warning is off by default starting in Visual Studio 2019 but can be
284 // enabled with command-line options.
285 #if defined(_MSC_VER) && (_MSC_VER < 1910 || _MSC_VER >= 1920)
281286 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4800 /* forcing value to bool */)
282287 #endif
283288
297302 = nullptr)
298303 : success_(success) {}
299304
300 #if defined(_MSC_VER) && _MSC_VER < 1910
305 #if defined(_MSC_VER) && (_MSC_VER < 1910 || _MSC_VER >= 1920)
301306 GTEST_DISABLE_MSC_WARNINGS_POP_()
302307 #endif
303308
411416 // test in test case Foo. Hence a sub-class can define its own
412417 // SetUpTestSuite() method to shadow the one defined in the super
413418 // class.
414 // Failures that happen during SetUpTestSuite are logged but otherwise
415 // ignored.
416419 static void SetUpTestSuite() {}
417420
418421 // Tears down the stuff shared by all tests in this test suite.
421424 // test in test case Foo. Hence a sub-class can define its own
422425 // TearDownTestSuite() method to shadow the one defined in the super
423426 // class.
424 // Failures that happen during TearDownTestSuite are logged but otherwise
425 // ignored.
426427 static void TearDownTestSuite() {}
427428
428429 // Legacy API is deprecated but still available
888889 bool Passed() const { return !Failed(); }
889890
890891 // Returns true if and only if the test suite failed.
891 bool Failed() const { return failed_test_count() > 0; }
892 bool Failed() const {
893 return failed_test_count() > 0 || ad_hoc_test_result().Failed();
894 }
892895
893896 // Returns the elapsed time, in milliseconds.
894897 TimeInMillis elapsed_time() const { return elapsed_time_; }
14191422 friend class internal::StreamingListenerTest;
14201423 friend class internal::UnitTestRecordPropertyTestHelper;
14211424 friend Environment* AddGlobalTestEnvironment(Environment* env);
1425 friend std::set<std::string>* internal::GetIgnoredParameterizedTestSuites();
14221426 friend internal::UnitTestImpl* internal::GetUnitTestImpl();
14231427 friend void internal::ReportFailureInUnknownLocation(
14241428 TestPartResult::Type result_type,
18881892 // Skips test in runtime.
18891893 // Skipping test aborts current function.
18901894 // Skipped tests are neither successful nor failed.
1891 #define GTEST_SKIP() GTEST_SKIP_("Skipped")
1895 #define GTEST_SKIP() GTEST_SKIP_("")
18921896
18931897 // ADD_FAILURE unconditionally adds a failure to the current test.
18941898 // SUCCEED generates a success - it doesn't automatically make the
22972301 // to cause a compiler error.
22982302 template <typename T1, typename T2>
22992303 constexpr bool StaticAssertTypeEq() noexcept {
2300 static_assert(std::is_same<T1, T2>::value,
2301 "type1 and type2 are not the same type");
2304 static_assert(std::is_same<T1, T2>::value, "T1 and T2 are not the same type");
23022305 return true;
23032306 }
23042307
23642367 // }
23652368 //
23662369 // GOOGLETEST_CM0011 DO NOT DELETE
2370 #if !GTEST_DONT_DEFINE_TEST
23672371 #define TEST_F(test_fixture, test_name)\
23682372 GTEST_TEST_(test_fixture, test_name, test_fixture, \
23692373 ::testing::internal::GetTypeId<test_fixture>())
2374 #endif // !GTEST_DONT_DEFINE_TEST
23702375
23712376 // Returns a path to temporary directory.
23722377 // Tries to determine an appropriate directory for the platform.
5252 #include <ctype.h>
5353 #include <float.h>
5454 #include <string.h>
55 #include <cstdint>
5556 #include <iomanip>
5657 #include <limits>
5758 #include <map>
7778 #define GTEST_CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar
7879
7980 // Stringifies its argument.
80 #define GTEST_STRINGIFY_(name) #name
81 // Work around a bug in visual studio which doesn't accept code like this:
82 //
83 // #define GTEST_STRINGIFY_(name) #name
84 // #define MACRO(a, b, c) ... GTEST_STRINGIFY_(a) ...
85 // MACRO(, x, y)
86 //
87 // Complaining about the argument to GTEST_STRINGIFY_ being empty.
88 // This is allowed by the spec.
89 #define GTEST_STRINGIFY_HELPER_(name, ...) #name
90 #define GTEST_STRINGIFY_(...) GTEST_STRINGIFY_HELPER_(__VA_ARGS__, )
8191
8292 namespace proto2 { class Message; }
8393
606616 // Verifies that registered_tests match the test names in
607617 // defined_test_names_; returns registered_tests if successful, or
608618 // aborts the program otherwise.
609 const char* VerifyRegisteredTestNames(
610 const char* file, int line, const char* registered_tests);
619 const char* VerifyRegisteredTestNames(const char* test_suite_name,
620 const char* file, int line,
621 const char* registered_tests);
611622
612623 private:
613624 typedef ::std::map<std::string, CodeLocation> RegisteredTestsMap;
661672 };
662673
663674 template <typename NameGenerator>
664 void GenerateNamesRecursively(Types0, std::vector<std::string>*, int) {}
675 void GenerateNamesRecursively(internal::None, std::vector<std::string>*, int) {}
665676
666677 template <typename NameGenerator, typename Types>
667678 void GenerateNamesRecursively(Types, std::vector<std::string>* result, int i) {
728739
729740 // The base case for the compile time recursion.
730741 template <GTEST_TEMPLATE_ Fixture, class TestSel>
731 class TypeParameterizedTest<Fixture, TestSel, Types0> {
742 class TypeParameterizedTest<Fixture, TestSel, internal::None> {
732743 public:
733744 static bool Register(const char* /*prefix*/, const CodeLocation&,
734745 const char* /*case_name*/, const char* /*test_names*/,
738749 return true;
739750 }
740751 };
752
753 GTEST_API_ void RegisterTypeParameterizedTestSuite(const char* test_suite_name,
754 CodeLocation code_location);
755 GTEST_API_ void RegisterTypeParameterizedTestSuiteInstantiation(
756 const char* case_name);
741757
742758 // TypeParameterizedTestSuite<Fixture, Tests, Types>::Register()
743759 // registers *all combinations* of 'Tests' and 'Types' with Google
751767 const char* test_names,
752768 const std::vector<std::string>& type_names =
753769 GenerateNames<DefaultNameGenerator, Types>()) {
770 RegisterTypeParameterizedTestSuiteInstantiation(case_name);
754771 std::string test_name = StripTrailingSpaces(
755772 GetPrefixUntilComma(test_names));
756773 if (!state->TestExists(test_name)) {
780797
781798 // The base case for the compile time recursion.
782799 template <GTEST_TEMPLATE_ Fixture, typename Types>
783 class TypeParameterizedTestSuite<Fixture, Templates0, Types> {
800 class TypeParameterizedTestSuite<Fixture, internal::None, Types> {
784801 public:
785802 static bool Register(const char* /*prefix*/, const CodeLocation&,
786803 const TypedTestSuitePState* /*state*/,
824841 const char* value;
825842 };
826843
844 // Helper for declaring std::string within 'if' statement
845 // in pre C++17 build environment.
846 struct TrueWithString {
847 TrueWithString() = default;
848 explicit TrueWithString(const char* str) : value(str) {}
849 explicit TrueWithString(const std::string& str) : value(str) {}
850 explicit operator bool() const { return true; }
851 std::string value;
852 };
853
827854 // A simple Linear Congruential Generator for generating random
828855 // numbers with a uniform distribution. Unlike rand() and srand(), it
829856 // doesn't use global state (and therefore can't interfere with user
831858 // but it's good enough for our purposes.
832859 class GTEST_API_ Random {
833860 public:
834 static const UInt32 kMaxRange = 1u << 31;
835
836 explicit Random(UInt32 seed) : state_(seed) {}
837
838 void Reseed(UInt32 seed) { state_ = seed; }
861 static const uint32_t kMaxRange = 1u << 31;
862
863 explicit Random(uint32_t seed) : state_(seed) {}
864
865 void Reseed(uint32_t seed) { state_ = seed; }
839866
840867 // Generates a random number from [0, range). Crashes if 'range' is
841868 // 0 or greater than kMaxRange.
842 UInt32 Generate(UInt32 range);
869 uint32_t Generate(uint32_t range);
843870
844871 private:
845 UInt32 state_;
872 uint32_t state_;
846873 GTEST_DISALLOW_COPY_AND_ASSIGN_(Random);
847874 };
848875
854881 // true if and only if T is type proto2::Message or a subclass of it.
855882 template <typename T>
856883 struct IsAProtocolMessage
857 : public bool_constant<
858 std::is_convertible<const T*, const ::proto2::Message*>::value> {};
884 : public std::is_convertible<const T*, const ::proto2::Message*> {};
859885
860886 // When the compiler sees expression IsContainerTest<C>(0), if C is an
861887 // STL-style container class, the first overload of IsContainerTest
11231149 template <>
11241150 struct MakeIndexSequence<0> : IndexSequence<> {};
11251151
1126 // FIXME: This implementation of ElemFromList is O(1) in instantiation depth,
1127 // but it is O(N^2) in total instantiations. Not sure if this is the best
1128 // tradeoff, as it will make it somewhat slow to compile.
1129 template <typename T, size_t, size_t>
1130 struct ElemFromListImpl {};
1131
1132 template <typename T, size_t I>
1133 struct ElemFromListImpl<T, I, I> {
1134 using type = T;
1135 };
1136
1137 // Get the Nth element from T...
1138 // It uses O(1) instantiation depth.
1139 template <size_t N, typename I, typename... T>
1140 struct ElemFromList;
1141
1142 template <size_t N, size_t... I, typename... T>
1143 struct ElemFromList<N, IndexSequence<I...>, T...>
1144 : ElemFromListImpl<T, N, I>... {};
1152 template <size_t>
1153 struct Ignore {
1154 Ignore(...); // NOLINT
1155 };
1156
1157 template <typename>
1158 struct ElemFromListImpl;
1159 template <size_t... I>
1160 struct ElemFromListImpl<IndexSequence<I...>> {
1161 // We make Ignore a template to solve a problem with MSVC.
1162 // A non-template Ignore would work fine with `decltype(Ignore(I))...`, but
1163 // MSVC doesn't understand how to deal with that pack expansion.
1164 // Use `0 * I` to have a single instantiation of Ignore.
1165 template <typename R>
1166 static R Apply(Ignore<0 * I>..., R (*)(), ...);
1167 };
1168
1169 template <size_t N, typename... T>
1170 struct ElemFromList {
1171 using type =
1172 decltype(ElemFromListImpl<typename MakeIndexSequence<N>::type>::Apply(
1173 static_cast<T (*)()>(nullptr)...));
1174 };
11451175
11461176 template <typename... T>
11471177 class FlatTuple;
11511181
11521182 template <typename... T, size_t I>
11531183 struct FlatTupleElemBase<FlatTuple<T...>, I> {
1154 using value_type =
1155 typename ElemFromList<I, typename MakeIndexSequence<sizeof...(T)>::type,
1156 T...>::type;
1184 using value_type = typename ElemFromList<I, T...>::type;
11571185 FlatTupleElemBase() = default;
11581186 explicit FlatTupleElemBase(value_type t) : value(std::move(t)) {}
11591187 value_type value;
11731201
11741202 // Analog to std::tuple but with different tradeoffs.
11751203 // This class minimizes the template instantiation depth, thus allowing more
1176 // elements that std::tuple would. std::tuple has been seen to require an
1204 // elements than std::tuple would. std::tuple has been seen to require an
11771205 // instantiation depth of more than 10x the number of elements in some
11781206 // implementations.
11791207 // FlatTuple and ElemFromList are not recursive and have a fixed depth
11841212 class FlatTuple
11851213 : private FlatTupleBase<FlatTuple<T...>,
11861214 typename MakeIndexSequence<sizeof...(T)>::type> {
1187 using Indices = typename FlatTuple::FlatTupleBase::Indices;
1215 using Indices = typename FlatTupleBase<
1216 FlatTuple<T...>, typename MakeIndexSequence<sizeof...(T)>::type>::Indices;
11881217
11891218 public:
11901219 FlatTuple() = default;
11911220 explicit FlatTuple(T... t) : FlatTuple::FlatTupleBase(std::move(t)...) {}
11921221
11931222 template <size_t I>
1194 const typename ElemFromList<I, Indices, T...>::type& Get() const {
1223 const typename ElemFromList<I, T...>::type& Get() const {
11951224 return static_cast<const FlatTupleElemBase<FlatTuple, I>*>(this)->value;
11961225 }
11971226
11981227 template <size_t I>
1199 typename ElemFromList<I, Indices, T...>::type& Get() {
1228 typename ElemFromList<I, T...>::type& Get() {
12001229 return static_cast<FlatTupleElemBase<FlatTuple, I>*>(this)->value;
12011230 }
12021231 };
12821311 GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__): \
12831312 fail(gtest_msg.value)
12841313
1314 #if GTEST_HAS_EXCEPTIONS
1315
1316 #define GTEST_TEST_NO_THROW_CATCH_STD_EXCEPTION_() \
1317 catch (std::exception const& e) { \
1318 gtest_msg.value = ( \
1319 "it throws std::exception-derived exception with description: \"" \
1320 ); \
1321 gtest_msg.value += e.what(); \
1322 gtest_msg.value += "\"."; \
1323 goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \
1324 }
1325
1326 #else // GTEST_HAS_EXCEPTIONS
1327
1328 #define GTEST_TEST_NO_THROW_CATCH_STD_EXCEPTION_()
1329
1330 #endif // GTEST_HAS_EXCEPTIONS
1331
12851332 #define GTEST_TEST_NO_THROW_(statement, fail) \
12861333 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
1287 if (::testing::internal::AlwaysTrue()) { \
1334 if (::testing::internal::TrueWithString gtest_msg{}) { \
12881335 try { \
12891336 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
12901337 } \
1338 GTEST_TEST_NO_THROW_CATCH_STD_EXCEPTION_() \
12911339 catch (...) { \
1340 gtest_msg.value = "it throws."; \
12921341 goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \
12931342 } \
12941343 } else \
12951344 GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__): \
1296 fail("Expected: " #statement " doesn't throw an exception.\n" \
1297 " Actual: it throws.")
1345 fail(("Expected: " #statement " doesn't throw an exception.\n" \
1346 " Actual: " + gtest_msg.value).c_str())
12981347
12991348 #define GTEST_TEST_ANY_THROW_(statement, fail) \
13001349 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
13551404 : public parent_class { \
13561405 public: \
13571406 GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)() {} \
1407 ~GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)() override = default; \
1408 GTEST_DISALLOW_COPY_AND_ASSIGN_(GTEST_TEST_CLASS_NAME_(test_suite_name, \
1409 test_name)); \
1410 GTEST_DISALLOW_MOVE_AND_ASSIGN_(GTEST_TEST_CLASS_NAME_(test_suite_name, \
1411 test_name)); \
13581412 \
13591413 private: \
1360 virtual void TestBody(); \
1414 void TestBody() override; \
13611415 static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_; \
1362 GTEST_DISALLOW_COPY_AND_ASSIGN_(GTEST_TEST_CLASS_NAME_(test_suite_name, \
1363 test_name)); \
13641416 }; \
13651417 \
13661418 ::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_suite_name, \
4141 #include <memory>
4242 #include <set>
4343 #include <tuple>
44 #include <type_traits>
4445 #include <utility>
4546 #include <vector>
4647
4748 #include "gtest/internal/gtest-internal.h"
4849 #include "gtest/internal/gtest-port.h"
4950 #include "gtest/gtest-printers.h"
51 #include "gtest/gtest-test-part.h"
5052
5153 namespace testing {
5254 // Input to a parameterized test name generator, describing a test parameter.
473475
474476 // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
475477 //
478 // Report a the name of a test_suit as safe to ignore
479 // as the side effect of construction of this type.
480 struct MarkAsIgnored {
481 explicit MarkAsIgnored(const char* test_suite);
482 };
483
484 GTEST_API_ void InsertSyntheticTestCase(const std::string& name,
485 CodeLocation location, bool has_test_p);
486
487 // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
488 //
476489 // ParameterizedTestSuiteInfo accumulates tests obtained from TEST_P
477490 // macro invocations for a particular test suite and generators
478491 // obtained from INSTANTIATE_TEST_SUITE_P macro invocations for that
521534 return 0; // Return value used only to run this method in namespace scope.
522535 }
523536 // UnitTest class invokes this method to register tests in this test suite
524 // test suites right before running tests in RUN_ALL_TESTS macro.
537 // right before running tests in RUN_ALL_TESTS macro.
525538 // This method should not be called more than once on any single
526539 // instance of a ParameterizedTestSuiteInfoBase derived class.
527540 // UnitTest has a guard to prevent from calling this method more than once.
528541 void RegisterTests() override {
542 bool generated_instantiations = false;
543
529544 for (typename TestInfoContainer::iterator test_it = tests_.begin();
530545 test_it != tests_.end(); ++test_it) {
531546 std::shared_ptr<TestInfo> test_info = *test_it;
548563 for (typename ParamGenerator<ParamType>::iterator param_it =
549564 generator.begin();
550565 param_it != generator.end(); ++param_it, ++i) {
566 generated_instantiations = true;
567
551568 Message test_name_stream;
552569
553570 std::string param_name = name_func(
579596 } // for param_it
580597 } // for gen_it
581598 } // for test_it
599
600 if (!generated_instantiations) {
601 // There are no generaotrs, or they all generate nothing ...
602 InsertSyntheticTestCase(GetTestSuiteName(), code_location_,
603 !tests_.empty());
604 }
582605 } // RegisterTests
583606
584607 private:
716739 GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestSuiteRegistry);
717740 };
718741
742 // Keep track of what type-parameterized test suite are defined and
743 // where as well as which are intatiated. This allows susequently
744 // identifying suits that are defined but never used.
745 class TypeParameterizedTestSuiteRegistry {
746 public:
747 // Add a suite definition
748 void RegisterTestSuite(const char* test_suite_name,
749 CodeLocation code_location);
750
751 // Add an instantiation of a suit.
752 void RegisterInstantiation(const char* test_suite_name);
753
754 // For each suit repored as defined but not reported as instantiation,
755 // emit a test that reports that fact (configurably, as an error).
756 void CheckForInstantiations();
757
758 private:
759 struct TypeParameterizedTestSuiteInfo {
760 explicit TypeParameterizedTestSuiteInfo(CodeLocation c)
761 : code_location(c), instantiated(false) {}
762
763 CodeLocation code_location;
764 bool instantiated;
765 };
766
767 std::map<std::string, TypeParameterizedTestSuiteInfo> suites_;
768 };
769
719770 } // namespace internal
720771
721772 // Forward declarations of ValuesIn(), which is implemented in
101101 # define GTEST_OS_QNX 1
102102 #elif defined(__HAIKU__)
103103 #define GTEST_OS_HAIKU 1
104 #elif defined ESP8266
105 #define GTEST_OS_ESP8266 1
106 #elif defined ESP32
107 #define GTEST_OS_ESP32 1
104108 #endif // __CYGWIN__
105109
106110 #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_
189189 // GTEST_AMBIGUOUS_ELSE_BLOCKER_ - for disabling a gcc warning.
190190 // GTEST_ATTRIBUTE_UNUSED_ - declares that a class' instances or a
191191 // variable don't have to be used.
192 // GTEST_DISALLOW_ASSIGN_ - disables operator=.
192 // GTEST_DISALLOW_ASSIGN_ - disables copy operator=.
193193 // GTEST_DISALLOW_COPY_AND_ASSIGN_ - disables copy ctor and operator=.
194 // GTEST_DISALLOW_MOVE_ASSIGN_ - disables move operator=.
195 // GTEST_DISALLOW_MOVE_AND_ASSIGN_ - disables move ctor and operator=.
194196 // GTEST_MUST_USE_RESULT_ - declares that a function's result must be used.
195197 // GTEST_INTENTIONAL_CONST_COND_PUSH_ - start code section where MSVC C4127 is
196198 // suppressed (constant conditional).
197199 // GTEST_INTENTIONAL_CONST_COND_POP_ - finish code section where MSVC C4127
198200 // is suppressed.
201 // GTEST_INTERNAL_HAS_STRING_VIEW - for enabling Matcher<std::string_view> or
202 // Matcher<absl::string_view>
203 // specializations.
199204 //
200205 // Synchronization:
201206 // Mutex, MutexLock, ThreadLocal, GetThreadCount()
222227 //
223228 // Integer types:
224229 // TypeWithSize - maps an integer to a int type.
225 // Int32, UInt32, Int64, UInt64, TimeInMillis
226 // - integers of known sizes.
230 // TimeInMillis - integers of known sizes.
227231 // BiggestInt - the biggest signed integer type.
228232 //
229233 // Command-line utilities:
234238 // Environment variable utilities:
235239 // GetEnv() - gets the value of an environment variable.
236240 // BoolFromGTestEnv() - parses a bool environment variable.
237 // Int32FromGTestEnv() - parses an Int32 environment variable.
241 // Int32FromGTestEnv() - parses an int32_t environment variable.
238242 // StringFromGTestEnv() - parses a string environment variable.
239243 //
240244 // Deprecation warnings:
247251 #include <stdio.h>
248252 #include <stdlib.h>
249253 #include <string.h>
250 #include <memory>
254 #include <cstdint>
255 #include <limits>
251256 #include <type_traits>
252257
253258 #ifndef _WIN32_WCE
260265 # include <TargetConditionals.h>
261266 #endif
262267
263 #include <algorithm> // NOLINT
264 #include <iostream> // NOLINT
265 #include <sstream> // NOLINT
266 #include <string> // NOLINT
268 #include <iostream> // NOLINT
269 #include <memory>
270 #include <string> // NOLINT
267271 #include <tuple>
268 #include <utility>
269272 #include <vector> // NOLINT
270273
274 #include "gtest/internal/custom/gtest-port.h"
271275 #include "gtest/internal/gtest-port-arch.h"
272 #include "gtest/internal/custom/gtest-port.h"
273276
274277 #if !defined(GTEST_DEV_EMAIL_)
275278 # define GTEST_DEV_EMAIL_ "googletestframework@@googlegroups.com"
440443 # endif // defined(_MSC_VER) || defined(__BORLANDC__)
441444 #endif // GTEST_HAS_EXCEPTIONS
442445
443 #if !defined(GTEST_HAS_STD_STRING)
444 // Even though we don't use this macro any longer, we keep it in case
445 // some clients still depend on it.
446 # define GTEST_HAS_STD_STRING 1
447 #elif !GTEST_HAS_STD_STRING
448 // The user told us that ::std::string isn't available.
449 # error "::std::string isn't available."
450 #endif // !defined(GTEST_HAS_STD_STRING)
451
452446 #ifndef GTEST_HAS_STD_WSTRING
453447 // The user didn't tell us whether ::std::wstring is available, so we need
454448 // to figure it out.
457451 // no support for it at least as recent as Froyo (2.2).
458452 #define GTEST_HAS_STD_WSTRING \
459453 (!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \
460 GTEST_OS_HAIKU))
454 GTEST_OS_HAIKU || GTEST_OS_ESP32 || GTEST_OS_ESP8266))
461455
462456 #endif // GTEST_HAS_STD_WSTRING
463457
581575 #ifndef GTEST_HAS_STREAM_REDIRECTION
582576 // By default, we assume that stream redirection is supported on all
583577 // platforms except known mobile ones.
584 # if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT
578 #if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || \
579 GTEST_OS_WINDOWS_RT || GTEST_OS_ESP8266
585580 # define GTEST_HAS_STREAM_REDIRECTION 0
586581 # else
587582 # define GTEST_HAS_STREAM_REDIRECTION 1
675670 #endif
676671
677672
678 // A macro to disallow operator=
673 // A macro to disallow copy operator=
679674 // This should be used in the private: declarations for a class.
680675 #define GTEST_DISALLOW_ASSIGN_(type) \
681 void operator=(type const &) = delete
676 type& operator=(type const &) = delete
682677
683678 // A macro to disallow copy constructor and operator=
684679 // This should be used in the private: declarations for a class.
685680 #define GTEST_DISALLOW_COPY_AND_ASSIGN_(type) \
686681 type(type const &) = delete; \
687682 GTEST_DISALLOW_ASSIGN_(type)
683
684 // A macro to disallow move operator=
685 // This should be used in the private: declarations for a class.
686 #define GTEST_DISALLOW_MOVE_ASSIGN_(type) \
687 type& operator=(type &&) noexcept = delete
688
689 // A macro to disallow move constructor and operator=
690 // This should be used in the private: declarations for a class.
691 #define GTEST_DISALLOW_MOVE_AND_ASSIGN_(type) \
692 type(type &&) noexcept = delete; \
693 GTEST_DISALLOW_MOVE_ASSIGN_(type)
688694
689695 // Tell the compiler to warn about unused return values for functions declared
690696 // with this macro. The macro should be used on function declarations
854860 // The second argument to the macro must be a valid C++ identifier. If the
855861 // expression is false, compiler will issue an error containing this identifier.
856862 #define GTEST_COMPILE_ASSERT_(expr, msg) static_assert(expr, #msg)
857
858 // Evaluates to the number of elements in 'array'.
859 #define GTEST_ARRAY_SIZE_(array) (sizeof(array) / sizeof(array[0]))
860863
861864 // A helper for suppressing warnings on constant condition. It just
862865 // returns 'condition'.
15981601 class DefaultValueHolderFactory : public ValueHolderFactory {
15991602 public:
16001603 DefaultValueHolderFactory() {}
1601 virtual ValueHolder* MakeNewHolder() const { return new ValueHolder(); }
1604 ValueHolder* MakeNewHolder() const override { return new ValueHolder(); }
16021605
16031606 private:
16041607 GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultValueHolderFactory);
16071610 class InstanceValueHolderFactory : public ValueHolderFactory {
16081611 public:
16091612 explicit InstanceValueHolderFactory(const T& value) : value_(value) {}
1610 virtual ValueHolder* MakeNewHolder() const {
1613 ValueHolder* MakeNewHolder() const override {
16111614 return new ValueHolder(value_);
16121615 }
16131616
18071810 class DefaultValueHolderFactory : public ValueHolderFactory {
18081811 public:
18091812 DefaultValueHolderFactory() {}
1810 virtual ValueHolder* MakeNewHolder() const { return new ValueHolder(); }
1813 ValueHolder* MakeNewHolder() const override { return new ValueHolder(); }
18111814
18121815 private:
18131816 GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultValueHolderFactory);
18161819 class InstanceValueHolderFactory : public ValueHolderFactory {
18171820 public:
18181821 explicit InstanceValueHolderFactory(const T& value) : value_(value) {}
1819 virtual ValueHolder* MakeNewHolder() const {
1822 ValueHolder* MakeNewHolder() const override {
18201823 return new ValueHolder(value_);
18211824 }
18221825
18861889 // we cannot detect it.
18871890 GTEST_API_ size_t GetThreadCount();
18881891
1889 template <bool B>
1890 using bool_constant = std::integral_constant<bool, B>;
1891
18921892 #if GTEST_OS_WINDOWS
18931893 # define GTEST_PATH_SEP_ "\\"
18941894 # define GTEST_HAS_ALT_PATH_SEP_ 1
1895 // The biggest signed integer type the compiler supports.
1896 typedef __int64 BiggestInt;
18971895 #else
18981896 # define GTEST_PATH_SEP_ "/"
18991897 # define GTEST_HAS_ALT_PATH_SEP_ 0
1900 typedef long long BiggestInt; // NOLINT
19011898 #endif // GTEST_OS_WINDOWS
19021899
19031900 // Utilities for char.
19921989 }
19931990 # endif // GTEST_OS_WINDOWS_MOBILE
19941991
1992 #elif GTEST_OS_ESP8266
1993 typedef struct stat StatStruct;
1994
1995 inline int FileNo(FILE* file) { return fileno(file); }
1996 inline int IsATTY(int fd) { return isatty(fd); }
1997 inline int Stat(const char* path, StatStruct* buf) {
1998 // stat function not implemented on ESP8266
1999 return 0;
2000 }
2001 inline int StrCaseCmp(const char* s1, const char* s2) {
2002 return strcasecmp(s1, s2);
2003 }
2004 inline char* StrDup(const char* src) { return strdup(src); }
2005 inline int RmDir(const char* dir) { return rmdir(dir); }
2006 inline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); }
2007
19952008 #else
19962009
19972010 typedef struct stat StatStruct;
20122025
20132026 GTEST_DISABLE_MSC_DEPRECATED_PUSH_()
20142027
2015 inline const char* StrNCpy(char* dest, const char* src, size_t n) {
2016 return strncpy(dest, src, n);
2017 }
2018
20192028 // ChDir(), FReopen(), FDOpen(), Read(), Write(), Close(), and
20202029 // StrError() aren't needed on Windows CE at this time and thus not
20212030 // defined there.
20442053 inline const char* StrError(int errnum) { return strerror(errnum); }
20452054 #endif
20462055 inline const char* GetEnv(const char* name) {
2047 #if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT
2048 // We are on Windows CE, which has no environment variables.
2056 #if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || \
2057 GTEST_OS_WINDOWS_RT || GTEST_OS_ESP8266
2058 // We are on an embedded platform, which has no environment variables.
20492059 static_cast<void>(name); // To prevent 'unused argument' warning.
20502060 return nullptr;
20512061 #elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9)
20872097 # define GTEST_SNPRINTF_ snprintf
20882098 #endif
20892099
2090 // The maximum number a BiggestInt can represent. This definition
2091 // works no matter BiggestInt is represented in one's complement or
2092 // two's complement.
2093 //
2094 // We cannot rely on numeric_limits in STL, as __int64 and long long
2095 // are not part of standard C++ and numeric_limits doesn't need to be
2096 // defined for them.
2097 const BiggestInt kMaxBiggestInt =
2098 ~(static_cast<BiggestInt>(1) << (8*sizeof(BiggestInt) - 1));
2100 // The biggest signed integer type the compiler supports.
2101 //
2102 // long long is guaranteed to be at least 64-bits in C++11.
2103 using BiggestInt = long long; // NOLINT
2104
2105 // The maximum number a BiggestInt can represent.
2106 constexpr BiggestInt kMaxBiggestInt = (std::numeric_limits<BiggestInt>::max)();
20992107
21002108 // This template class serves as a compile-time function from size to
21012109 // type. It maps a size in bytes to a primitive type with that
21202128 public:
21212129 // This prevents the user from using TypeWithSize<N> with incorrect
21222130 // values of N.
2123 typedef void UInt;
2131 using UInt = void;
21242132 };
21252133
21262134 // The specialization for size 4.
21272135 template <>
21282136 class TypeWithSize<4> {
21292137 public:
2130 // unsigned int has size 4 in both gcc and MSVC.
2131 //
2132 // As base/basictypes.h doesn't compile on Windows, we cannot use
2133 // uint32, uint64, and etc here.
2134 typedef int Int;
2135 typedef unsigned int UInt;
2138 using Int = std::int32_t;
2139 using UInt = std::uint32_t;
21362140 };
21372141
21382142 // The specialization for size 8.
21392143 template <>
21402144 class TypeWithSize<8> {
21412145 public:
2142 #if GTEST_OS_WINDOWS
2143 typedef __int64 Int;
2144 typedef unsigned __int64 UInt;
2145 #else
2146 typedef long long Int; // NOLINT
2147 typedef unsigned long long UInt; // NOLINT
2148 #endif // GTEST_OS_WINDOWS
2146 using Int = std::int64_t;
2147 using UInt = std::uint64_t;
21492148 };
21502149
21512150 // Integer types of known sizes.
2152 typedef TypeWithSize<4>::Int Int32;
2153 typedef TypeWithSize<4>::UInt UInt32;
2154 typedef TypeWithSize<8>::Int Int64;
2155 typedef TypeWithSize<8>::UInt UInt64;
2156 typedef TypeWithSize<8>::Int TimeInMillis; // Represents time in milliseconds.
2151 using TimeInMillis = int64_t; // Represents time in milliseconds.
21572152
21582153 // Utilities for command line flags and environment variables.
21592154
21722167 // Macros for declaring flags.
21732168 # define GTEST_DECLARE_bool_(name) GTEST_API_ extern bool GTEST_FLAG(name)
21742169 # define GTEST_DECLARE_int32_(name) \
2175 GTEST_API_ extern ::testing::internal::Int32 GTEST_FLAG(name)
2170 GTEST_API_ extern std::int32_t GTEST_FLAG(name)
21762171 # define GTEST_DECLARE_string_(name) \
21772172 GTEST_API_ extern ::std::string GTEST_FLAG(name)
21782173
21802175 # define GTEST_DEFINE_bool_(name, default_val, doc) \
21812176 GTEST_API_ bool GTEST_FLAG(name) = (default_val)
21822177 # define GTEST_DEFINE_int32_(name, default_val, doc) \
2183 GTEST_API_ ::testing::internal::Int32 GTEST_FLAG(name) = (default_val)
2178 GTEST_API_ std::int32_t GTEST_FLAG(name) = (default_val)
21842179 # define GTEST_DEFINE_string_(name, default_val, doc) \
21852180 GTEST_API_ ::std::string GTEST_FLAG(name) = (default_val)
21862181
21952190 // Parses 'str' for a 32-bit signed integer. If successful, writes the result
21962191 // to *value and returns true; otherwise leaves *value unchanged and returns
21972192 // false.
2198 bool ParseInt32(const Message& src_text, const char* str, Int32* value);
2199
2200 // Parses a bool/Int32/string from the environment variable
2193 bool ParseInt32(const Message& src_text, const char* str, int32_t* value);
2194
2195 // Parses a bool/int32_t/string from the environment variable
22012196 // corresponding to the given Google Test flag.
22022197 bool BoolFromGTestEnv(const char* flag, bool default_val);
2203 GTEST_API_ Int32 Int32FromGTestEnv(const char* flag, Int32 default_val);
2198 GTEST_API_ int32_t Int32FromGTestEnv(const char* flag, int32_t default_val);
22042199 std::string OutputFlagAlsoCheckEnvVar();
22052200 const char* StringFromGTestEnv(const char* flag, const char* default_val);
22062201
22272222
22282223 #endif // !defined(GTEST_INTERNAL_DEPRECATED)
22292224
2225 #if GTEST_HAS_ABSL
2226 // Always use absl::string_view for Matcher<> specializations if googletest
2227 // is built with absl support.
2228 # define GTEST_INTERNAL_HAS_STRING_VIEW 1
2229 #include "absl/strings/string_view.h"
2230 namespace testing {
2231 namespace internal {
2232 using StringView = ::absl::string_view;
2233 } // namespace internal
2234 } // namespace testing
2235 #else
2236 # ifdef __has_include
2237 # if __has_include(<string_view>) && __cplusplus >= 201703L
2238 // Otherwise for C++17 and higher use std::string_view for Matcher<>
2239 // specializations.
2240 # define GTEST_INTERNAL_HAS_STRING_VIEW 1
2241 #include <string_view>
2242 namespace testing {
2243 namespace internal {
2244 using StringView = ::std::string_view;
2245 } // namespace internal
2246 } // namespace testing
2247 // The case where absl is configured NOT to alias std::string_view is not
2248 // supported.
2249 # endif // __has_include(<string_view>) && __cplusplus >= 201703L
2250 # endif // __has_include
2251 #endif // GTEST_HAS_ABSL
2252
22302253 #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
4646 #endif
4747
4848 #include <string.h>
49 #include <cstdint>
4950 #include <string>
5051
5152 #include "gtest/internal/gtest-port.h"
151152 static std::string FormatHexInt(int value);
152153
153154 // Formats an int value as "%X".
154 static std::string FormatHexUInt32(UInt32 value);
155 static std::string FormatHexUInt32(uint32_t value);
155156
156157 // Formats a byte as "%02X".
157158 static std::string FormatByte(unsigned char value);
0 // This file was GENERATED by command:
1 // pump.py gtest-type-util.h.pump
2 // DO NOT EDIT BY HAND!!!
3
40 // Copyright 2008 Google Inc.
51 // All Rights Reserved.
62 //
3127 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3228
3329 // Type utilities needed for implementing typed and type-parameterized
34 // tests. This file is generated by a SCRIPT. DO NOT EDIT BY HAND!
35 //
36 // Currently we support at most 50 types in a list, and at most 50
37 // type-parameterized tests in one type-parameterized test suite.
38 // Please contact googletestframework@googlegroups.com if you need
39 // more.
30 // tests.
4031
4132 // GOOGLETEST_CM0001 DO NOT DELETE
4233
10495
10596 #if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
10697
107 // A unique type used as the default value for the arguments of class
108 // template Types. This allows us to simulate variadic templates
109 // (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't
110 // support directly.
98 // A unique type indicating an empty node
11199 struct None {};
112
113 // The following family of struct and struct templates are used to
114 // represent type lists. In particular, TypesN<T1, T2, ..., TN>
115 // represents a type list with N types (T1, T2, ..., and TN) in it.
116 // Except for Types0, every struct in the family has two member types:
117 // Head for the first type in the list, and Tail for the rest of the
118 // list.
119
120 // The empty type list.
121 struct Types0 {};
122
123 // Type lists of length 1, 2, 3, and so on.
124
125 template <typename T1>
126 struct Types1 {
127 typedef T1 Head;
128 typedef Types0 Tail;
129 };
130 template <typename T1, typename T2>
131 struct Types2 {
132 typedef T1 Head;
133 typedef Types1<T2> Tail;
134 };
135
136 template <typename T1, typename T2, typename T3>
137 struct Types3 {
138 typedef T1 Head;
139 typedef Types2<T2, T3> Tail;
140 };
141
142 template <typename T1, typename T2, typename T3, typename T4>
143 struct Types4 {
144 typedef T1 Head;
145 typedef Types3<T2, T3, T4> Tail;
146 };
147
148 template <typename T1, typename T2, typename T3, typename T4, typename T5>
149 struct Types5 {
150 typedef T1 Head;
151 typedef Types4<T2, T3, T4, T5> Tail;
152 };
153
154 template <typename T1, typename T2, typename T3, typename T4, typename T5,
155 typename T6>
156 struct Types6 {
157 typedef T1 Head;
158 typedef Types5<T2, T3, T4, T5, T6> Tail;
159 };
160
161 template <typename T1, typename T2, typename T3, typename T4, typename T5,
162 typename T6, typename T7>
163 struct Types7 {
164 typedef T1 Head;
165 typedef Types6<T2, T3, T4, T5, T6, T7> Tail;
166 };
167
168 template <typename T1, typename T2, typename T3, typename T4, typename T5,
169 typename T6, typename T7, typename T8>
170 struct Types8 {
171 typedef T1 Head;
172 typedef Types7<T2, T3, T4, T5, T6, T7, T8> Tail;
173 };
174
175 template <typename T1, typename T2, typename T3, typename T4, typename T5,
176 typename T6, typename T7, typename T8, typename T9>
177 struct Types9 {
178 typedef T1 Head;
179 typedef Types8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
180 };
181
182 template <typename T1, typename T2, typename T3, typename T4, typename T5,
183 typename T6, typename T7, typename T8, typename T9, typename T10>
184 struct Types10 {
185 typedef T1 Head;
186 typedef Types9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
187 };
188
189 template <typename T1, typename T2, typename T3, typename T4, typename T5,
190 typename T6, typename T7, typename T8, typename T9, typename T10,
191 typename T11>
192 struct Types11 {
193 typedef T1 Head;
194 typedef Types10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
195 };
196
197 template <typename T1, typename T2, typename T3, typename T4, typename T5,
198 typename T6, typename T7, typename T8, typename T9, typename T10,
199 typename T11, typename T12>
200 struct Types12 {
201 typedef T1 Head;
202 typedef Types11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
203 };
204
205 template <typename T1, typename T2, typename T3, typename T4, typename T5,
206 typename T6, typename T7, typename T8, typename T9, typename T10,
207 typename T11, typename T12, typename T13>
208 struct Types13 {
209 typedef T1 Head;
210 typedef Types12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
211 };
212
213 template <typename T1, typename T2, typename T3, typename T4, typename T5,
214 typename T6, typename T7, typename T8, typename T9, typename T10,
215 typename T11, typename T12, typename T13, typename T14>
216 struct Types14 {
217 typedef T1 Head;
218 typedef Types13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> Tail;
219 };
220
221 template <typename T1, typename T2, typename T3, typename T4, typename T5,
222 typename T6, typename T7, typename T8, typename T9, typename T10,
223 typename T11, typename T12, typename T13, typename T14, typename T15>
224 struct Types15 {
225 typedef T1 Head;
226 typedef Types14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
227 T15> Tail;
228 };
229
230 template <typename T1, typename T2, typename T3, typename T4, typename T5,
231 typename T6, typename T7, typename T8, typename T9, typename T10,
232 typename T11, typename T12, typename T13, typename T14, typename T15,
233 typename T16>
234 struct Types16 {
235 typedef T1 Head;
236 typedef Types15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
237 T16> Tail;
238 };
239
240 template <typename T1, typename T2, typename T3, typename T4, typename T5,
241 typename T6, typename T7, typename T8, typename T9, typename T10,
242 typename T11, typename T12, typename T13, typename T14, typename T15,
243 typename T16, typename T17>
244 struct Types17 {
245 typedef T1 Head;
246 typedef Types16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
247 T16, T17> Tail;
248 };
249
250 template <typename T1, typename T2, typename T3, typename T4, typename T5,
251 typename T6, typename T7, typename T8, typename T9, typename T10,
252 typename T11, typename T12, typename T13, typename T14, typename T15,
253 typename T16, typename T17, typename T18>
254 struct Types18 {
255 typedef T1 Head;
256 typedef Types17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
257 T16, T17, T18> Tail;
258 };
259
260 template <typename T1, typename T2, typename T3, typename T4, typename T5,
261 typename T6, typename T7, typename T8, typename T9, typename T10,
262 typename T11, typename T12, typename T13, typename T14, typename T15,
263 typename T16, typename T17, typename T18, typename T19>
264 struct Types19 {
265 typedef T1 Head;
266 typedef Types18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
267 T16, T17, T18, T19> Tail;
268 };
269
270 template <typename T1, typename T2, typename T3, typename T4, typename T5,
271 typename T6, typename T7, typename T8, typename T9, typename T10,
272 typename T11, typename T12, typename T13, typename T14, typename T15,
273 typename T16, typename T17, typename T18, typename T19, typename T20>
274 struct Types20 {
275 typedef T1 Head;
276 typedef Types19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
277 T16, T17, T18, T19, T20> Tail;
278 };
279
280 template <typename T1, typename T2, typename T3, typename T4, typename T5,
281 typename T6, typename T7, typename T8, typename T9, typename T10,
282 typename T11, typename T12, typename T13, typename T14, typename T15,
283 typename T16, typename T17, typename T18, typename T19, typename T20,
284 typename T21>
285 struct Types21 {
286 typedef T1 Head;
287 typedef Types20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
288 T16, T17, T18, T19, T20, T21> Tail;
289 };
290
291 template <typename T1, typename T2, typename T3, typename T4, typename T5,
292 typename T6, typename T7, typename T8, typename T9, typename T10,
293 typename T11, typename T12, typename T13, typename T14, typename T15,
294 typename T16, typename T17, typename T18, typename T19, typename T20,
295 typename T21, typename T22>
296 struct Types22 {
297 typedef T1 Head;
298 typedef Types21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
299 T16, T17, T18, T19, T20, T21, T22> Tail;
300 };
301
302 template <typename T1, typename T2, typename T3, typename T4, typename T5,
303 typename T6, typename T7, typename T8, typename T9, typename T10,
304 typename T11, typename T12, typename T13, typename T14, typename T15,
305 typename T16, typename T17, typename T18, typename T19, typename T20,
306 typename T21, typename T22, typename T23>
307 struct Types23 {
308 typedef T1 Head;
309 typedef Types22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
310 T16, T17, T18, T19, T20, T21, T22, T23> Tail;
311 };
312
313 template <typename T1, typename T2, typename T3, typename T4, typename T5,
314 typename T6, typename T7, typename T8, typename T9, typename T10,
315 typename T11, typename T12, typename T13, typename T14, typename T15,
316 typename T16, typename T17, typename T18, typename T19, typename T20,
317 typename T21, typename T22, typename T23, typename T24>
318 struct Types24 {
319 typedef T1 Head;
320 typedef Types23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
321 T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;
322 };
323
324 template <typename T1, typename T2, typename T3, typename T4, typename T5,
325 typename T6, typename T7, typename T8, typename T9, typename T10,
326 typename T11, typename T12, typename T13, typename T14, typename T15,
327 typename T16, typename T17, typename T18, typename T19, typename T20,
328 typename T21, typename T22, typename T23, typename T24, typename T25>
329 struct Types25 {
330 typedef T1 Head;
331 typedef Types24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
332 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;
333 };
334
335 template <typename T1, typename T2, typename T3, typename T4, typename T5,
336 typename T6, typename T7, typename T8, typename T9, typename T10,
337 typename T11, typename T12, typename T13, typename T14, typename T15,
338 typename T16, typename T17, typename T18, typename T19, typename T20,
339 typename T21, typename T22, typename T23, typename T24, typename T25,
340 typename T26>
341 struct Types26 {
342 typedef T1 Head;
343 typedef Types25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
344 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;
345 };
346
347 template <typename T1, typename T2, typename T3, typename T4, typename T5,
348 typename T6, typename T7, typename T8, typename T9, typename T10,
349 typename T11, typename T12, typename T13, typename T14, typename T15,
350 typename T16, typename T17, typename T18, typename T19, typename T20,
351 typename T21, typename T22, typename T23, typename T24, typename T25,
352 typename T26, typename T27>
353 struct Types27 {
354 typedef T1 Head;
355 typedef Types26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
356 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;
357 };
358
359 template <typename T1, typename T2, typename T3, typename T4, typename T5,
360 typename T6, typename T7, typename T8, typename T9, typename T10,
361 typename T11, typename T12, typename T13, typename T14, typename T15,
362 typename T16, typename T17, typename T18, typename T19, typename T20,
363 typename T21, typename T22, typename T23, typename T24, typename T25,
364 typename T26, typename T27, typename T28>
365 struct Types28 {
366 typedef T1 Head;
367 typedef Types27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
368 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28> Tail;
369 };
370
371 template <typename T1, typename T2, typename T3, typename T4, typename T5,
372 typename T6, typename T7, typename T8, typename T9, typename T10,
373 typename T11, typename T12, typename T13, typename T14, typename T15,
374 typename T16, typename T17, typename T18, typename T19, typename T20,
375 typename T21, typename T22, typename T23, typename T24, typename T25,
376 typename T26, typename T27, typename T28, typename T29>
377 struct Types29 {
378 typedef T1 Head;
379 typedef Types28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
380 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
381 T29> Tail;
382 };
383
384 template <typename T1, typename T2, typename T3, typename T4, typename T5,
385 typename T6, typename T7, typename T8, typename T9, typename T10,
386 typename T11, typename T12, typename T13, typename T14, typename T15,
387 typename T16, typename T17, typename T18, typename T19, typename T20,
388 typename T21, typename T22, typename T23, typename T24, typename T25,
389 typename T26, typename T27, typename T28, typename T29, typename T30>
390 struct Types30 {
391 typedef T1 Head;
392 typedef Types29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
393 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
394 T30> Tail;
395 };
396
397 template <typename T1, typename T2, typename T3, typename T4, typename T5,
398 typename T6, typename T7, typename T8, typename T9, typename T10,
399 typename T11, typename T12, typename T13, typename T14, typename T15,
400 typename T16, typename T17, typename T18, typename T19, typename T20,
401 typename T21, typename T22, typename T23, typename T24, typename T25,
402 typename T26, typename T27, typename T28, typename T29, typename T30,
403 typename T31>
404 struct Types31 {
405 typedef T1 Head;
406 typedef Types30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
407 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
408 T30, T31> Tail;
409 };
410
411 template <typename T1, typename T2, typename T3, typename T4, typename T5,
412 typename T6, typename T7, typename T8, typename T9, typename T10,
413 typename T11, typename T12, typename T13, typename T14, typename T15,
414 typename T16, typename T17, typename T18, typename T19, typename T20,
415 typename T21, typename T22, typename T23, typename T24, typename T25,
416 typename T26, typename T27, typename T28, typename T29, typename T30,
417 typename T31, typename T32>
418 struct Types32 {
419 typedef T1 Head;
420 typedef Types31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
421 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
422 T30, T31, T32> Tail;
423 };
424
425 template <typename T1, typename T2, typename T3, typename T4, typename T5,
426 typename T6, typename T7, typename T8, typename T9, typename T10,
427 typename T11, typename T12, typename T13, typename T14, typename T15,
428 typename T16, typename T17, typename T18, typename T19, typename T20,
429 typename T21, typename T22, typename T23, typename T24, typename T25,
430 typename T26, typename T27, typename T28, typename T29, typename T30,
431 typename T31, typename T32, typename T33>
432 struct Types33 {
433 typedef T1 Head;
434 typedef Types32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
435 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
436 T30, T31, T32, T33> Tail;
437 };
438
439 template <typename T1, typename T2, typename T3, typename T4, typename T5,
440 typename T6, typename T7, typename T8, typename T9, typename T10,
441 typename T11, typename T12, typename T13, typename T14, typename T15,
442 typename T16, typename T17, typename T18, typename T19, typename T20,
443 typename T21, typename T22, typename T23, typename T24, typename T25,
444 typename T26, typename T27, typename T28, typename T29, typename T30,
445 typename T31, typename T32, typename T33, typename T34>
446 struct Types34 {
447 typedef T1 Head;
448 typedef Types33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
449 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
450 T30, T31, T32, T33, T34> Tail;
451 };
452
453 template <typename T1, typename T2, typename T3, typename T4, typename T5,
454 typename T6, typename T7, typename T8, typename T9, typename T10,
455 typename T11, typename T12, typename T13, typename T14, typename T15,
456 typename T16, typename T17, typename T18, typename T19, typename T20,
457 typename T21, typename T22, typename T23, typename T24, typename T25,
458 typename T26, typename T27, typename T28, typename T29, typename T30,
459 typename T31, typename T32, typename T33, typename T34, typename T35>
460 struct Types35 {
461 typedef T1 Head;
462 typedef Types34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
463 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
464 T30, T31, T32, T33, T34, T35> Tail;
465 };
466
467 template <typename T1, typename T2, typename T3, typename T4, typename T5,
468 typename T6, typename T7, typename T8, typename T9, typename T10,
469 typename T11, typename T12, typename T13, typename T14, typename T15,
470 typename T16, typename T17, typename T18, typename T19, typename T20,
471 typename T21, typename T22, typename T23, typename T24, typename T25,
472 typename T26, typename T27, typename T28, typename T29, typename T30,
473 typename T31, typename T32, typename T33, typename T34, typename T35,
474 typename T36>
475 struct Types36 {
476 typedef T1 Head;
477 typedef Types35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
478 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
479 T30, T31, T32, T33, T34, T35, T36> Tail;
480 };
481
482 template <typename T1, typename T2, typename T3, typename T4, typename T5,
483 typename T6, typename T7, typename T8, typename T9, typename T10,
484 typename T11, typename T12, typename T13, typename T14, typename T15,
485 typename T16, typename T17, typename T18, typename T19, typename T20,
486 typename T21, typename T22, typename T23, typename T24, typename T25,
487 typename T26, typename T27, typename T28, typename T29, typename T30,
488 typename T31, typename T32, typename T33, typename T34, typename T35,
489 typename T36, typename T37>
490 struct Types37 {
491 typedef T1 Head;
492 typedef Types36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
493 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
494 T30, T31, T32, T33, T34, T35, T36, T37> Tail;
495 };
496
497 template <typename T1, typename T2, typename T3, typename T4, typename T5,
498 typename T6, typename T7, typename T8, typename T9, typename T10,
499 typename T11, typename T12, typename T13, typename T14, typename T15,
500 typename T16, typename T17, typename T18, typename T19, typename T20,
501 typename T21, typename T22, typename T23, typename T24, typename T25,
502 typename T26, typename T27, typename T28, typename T29, typename T30,
503 typename T31, typename T32, typename T33, typename T34, typename T35,
504 typename T36, typename T37, typename T38>
505 struct Types38 {
506 typedef T1 Head;
507 typedef Types37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
508 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
509 T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;
510 };
511
512 template <typename T1, typename T2, typename T3, typename T4, typename T5,
513 typename T6, typename T7, typename T8, typename T9, typename T10,
514 typename T11, typename T12, typename T13, typename T14, typename T15,
515 typename T16, typename T17, typename T18, typename T19, typename T20,
516 typename T21, typename T22, typename T23, typename T24, typename T25,
517 typename T26, typename T27, typename T28, typename T29, typename T30,
518 typename T31, typename T32, typename T33, typename T34, typename T35,
519 typename T36, typename T37, typename T38, typename T39>
520 struct Types39 {
521 typedef T1 Head;
522 typedef Types38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
523 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
524 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;
525 };
526
527 template <typename T1, typename T2, typename T3, typename T4, typename T5,
528 typename T6, typename T7, typename T8, typename T9, typename T10,
529 typename T11, typename T12, typename T13, typename T14, typename T15,
530 typename T16, typename T17, typename T18, typename T19, typename T20,
531 typename T21, typename T22, typename T23, typename T24, typename T25,
532 typename T26, typename T27, typename T28, typename T29, typename T30,
533 typename T31, typename T32, typename T33, typename T34, typename T35,
534 typename T36, typename T37, typename T38, typename T39, typename T40>
535 struct Types40 {
536 typedef T1 Head;
537 typedef Types39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
538 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
539 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;
540 };
541
542 template <typename T1, typename T2, typename T3, typename T4, typename T5,
543 typename T6, typename T7, typename T8, typename T9, typename T10,
544 typename T11, typename T12, typename T13, typename T14, typename T15,
545 typename T16, typename T17, typename T18, typename T19, typename T20,
546 typename T21, typename T22, typename T23, typename T24, typename T25,
547 typename T26, typename T27, typename T28, typename T29, typename T30,
548 typename T31, typename T32, typename T33, typename T34, typename T35,
549 typename T36, typename T37, typename T38, typename T39, typename T40,
550 typename T41>
551 struct Types41 {
552 typedef T1 Head;
553 typedef Types40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
554 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
555 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;
556 };
557
558 template <typename T1, typename T2, typename T3, typename T4, typename T5,
559 typename T6, typename T7, typename T8, typename T9, typename T10,
560 typename T11, typename T12, typename T13, typename T14, typename T15,
561 typename T16, typename T17, typename T18, typename T19, typename T20,
562 typename T21, typename T22, typename T23, typename T24, typename T25,
563 typename T26, typename T27, typename T28, typename T29, typename T30,
564 typename T31, typename T32, typename T33, typename T34, typename T35,
565 typename T36, typename T37, typename T38, typename T39, typename T40,
566 typename T41, typename T42>
567 struct Types42 {
568 typedef T1 Head;
569 typedef Types41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
570 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
571 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42> Tail;
572 };
573
574 template <typename T1, typename T2, typename T3, typename T4, typename T5,
575 typename T6, typename T7, typename T8, typename T9, typename T10,
576 typename T11, typename T12, typename T13, typename T14, typename T15,
577 typename T16, typename T17, typename T18, typename T19, typename T20,
578 typename T21, typename T22, typename T23, typename T24, typename T25,
579 typename T26, typename T27, typename T28, typename T29, typename T30,
580 typename T31, typename T32, typename T33, typename T34, typename T35,
581 typename T36, typename T37, typename T38, typename T39, typename T40,
582 typename T41, typename T42, typename T43>
583 struct Types43 {
584 typedef T1 Head;
585 typedef Types42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
586 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
587 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
588 T43> Tail;
589 };
590
591 template <typename T1, typename T2, typename T3, typename T4, typename T5,
592 typename T6, typename T7, typename T8, typename T9, typename T10,
593 typename T11, typename T12, typename T13, typename T14, typename T15,
594 typename T16, typename T17, typename T18, typename T19, typename T20,
595 typename T21, typename T22, typename T23, typename T24, typename T25,
596 typename T26, typename T27, typename T28, typename T29, typename T30,
597 typename T31, typename T32, typename T33, typename T34, typename T35,
598 typename T36, typename T37, typename T38, typename T39, typename T40,
599 typename T41, typename T42, typename T43, typename T44>
600 struct Types44 {
601 typedef T1 Head;
602 typedef Types43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
603 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
604 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
605 T44> Tail;
606 };
607
608 template <typename T1, typename T2, typename T3, typename T4, typename T5,
609 typename T6, typename T7, typename T8, typename T9, typename T10,
610 typename T11, typename T12, typename T13, typename T14, typename T15,
611 typename T16, typename T17, typename T18, typename T19, typename T20,
612 typename T21, typename T22, typename T23, typename T24, typename T25,
613 typename T26, typename T27, typename T28, typename T29, typename T30,
614 typename T31, typename T32, typename T33, typename T34, typename T35,
615 typename T36, typename T37, typename T38, typename T39, typename T40,
616 typename T41, typename T42, typename T43, typename T44, typename T45>
617 struct Types45 {
618 typedef T1 Head;
619 typedef Types44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
620 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
621 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
622 T44, T45> Tail;
623 };
624
625 template <typename T1, typename T2, typename T3, typename T4, typename T5,
626 typename T6, typename T7, typename T8, typename T9, typename T10,
627 typename T11, typename T12, typename T13, typename T14, typename T15,
628 typename T16, typename T17, typename T18, typename T19, typename T20,
629 typename T21, typename T22, typename T23, typename T24, typename T25,
630 typename T26, typename T27, typename T28, typename T29, typename T30,
631 typename T31, typename T32, typename T33, typename T34, typename T35,
632 typename T36, typename T37, typename T38, typename T39, typename T40,
633 typename T41, typename T42, typename T43, typename T44, typename T45,
634 typename T46>
635 struct Types46 {
636 typedef T1 Head;
637 typedef Types45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
638 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
639 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
640 T44, T45, T46> Tail;
641 };
642
643 template <typename T1, typename T2, typename T3, typename T4, typename T5,
644 typename T6, typename T7, typename T8, typename T9, typename T10,
645 typename T11, typename T12, typename T13, typename T14, typename T15,
646 typename T16, typename T17, typename T18, typename T19, typename T20,
647 typename T21, typename T22, typename T23, typename T24, typename T25,
648 typename T26, typename T27, typename T28, typename T29, typename T30,
649 typename T31, typename T32, typename T33, typename T34, typename T35,
650 typename T36, typename T37, typename T38, typename T39, typename T40,
651 typename T41, typename T42, typename T43, typename T44, typename T45,
652 typename T46, typename T47>
653 struct Types47 {
654 typedef T1 Head;
655 typedef Types46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
656 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
657 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
658 T44, T45, T46, T47> Tail;
659 };
660
661 template <typename T1, typename T2, typename T3, typename T4, typename T5,
662 typename T6, typename T7, typename T8, typename T9, typename T10,
663 typename T11, typename T12, typename T13, typename T14, typename T15,
664 typename T16, typename T17, typename T18, typename T19, typename T20,
665 typename T21, typename T22, typename T23, typename T24, typename T25,
666 typename T26, typename T27, typename T28, typename T29, typename T30,
667 typename T31, typename T32, typename T33, typename T34, typename T35,
668 typename T36, typename T37, typename T38, typename T39, typename T40,
669 typename T41, typename T42, typename T43, typename T44, typename T45,
670 typename T46, typename T47, typename T48>
671 struct Types48 {
672 typedef T1 Head;
673 typedef Types47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
674 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
675 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
676 T44, T45, T46, T47, T48> Tail;
677 };
678
679 template <typename T1, typename T2, typename T3, typename T4, typename T5,
680 typename T6, typename T7, typename T8, typename T9, typename T10,
681 typename T11, typename T12, typename T13, typename T14, typename T15,
682 typename T16, typename T17, typename T18, typename T19, typename T20,
683 typename T21, typename T22, typename T23, typename T24, typename T25,
684 typename T26, typename T27, typename T28, typename T29, typename T30,
685 typename T31, typename T32, typename T33, typename T34, typename T35,
686 typename T36, typename T37, typename T38, typename T39, typename T40,
687 typename T41, typename T42, typename T43, typename T44, typename T45,
688 typename T46, typename T47, typename T48, typename T49>
689 struct Types49 {
690 typedef T1 Head;
691 typedef Types48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
692 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
693 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
694 T44, T45, T46, T47, T48, T49> Tail;
695 };
696
697 template <typename T1, typename T2, typename T3, typename T4, typename T5,
698 typename T6, typename T7, typename T8, typename T9, typename T10,
699 typename T11, typename T12, typename T13, typename T14, typename T15,
700 typename T16, typename T17, typename T18, typename T19, typename T20,
701 typename T21, typename T22, typename T23, typename T24, typename T25,
702 typename T26, typename T27, typename T28, typename T29, typename T30,
703 typename T31, typename T32, typename T33, typename T34, typename T35,
704 typename T36, typename T37, typename T38, typename T39, typename T40,
705 typename T41, typename T42, typename T43, typename T44, typename T45,
706 typename T46, typename T47, typename T48, typename T49, typename T50>
707 struct Types50 {
708 typedef T1 Head;
709 typedef Types49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
710 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
711 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
712 T44, T45, T46, T47, T48, T49, T50> Tail;
713 };
714
715
716 } // namespace internal
717
718 // We don't want to require the users to write TypesN<...> directly,
719 // as that would require them to count the length. Types<...> is much
720 // easier to write, but generates horrible messages when there is a
721 // compiler error, as gcc insists on printing out each template
722 // argument, even if it has the default value (this means Types<int>
723 // will appear as Types<int, None, None, ..., None> in the compiler
724 // errors).
725 //
726 // Our solution is to combine the best part of the two approaches: a
727 // user would write Types<T1, ..., TN>, and Google Test will translate
728 // that to TypesN<T1, ..., TN> internally to make error messages
729 // readable. The translation is done by the 'type' member of the
730 // Types template.
731 template <typename T1 = internal::None, typename T2 = internal::None,
732 typename T3 = internal::None, typename T4 = internal::None,
733 typename T5 = internal::None, typename T6 = internal::None,
734 typename T7 = internal::None, typename T8 = internal::None,
735 typename T9 = internal::None, typename T10 = internal::None,
736 typename T11 = internal::None, typename T12 = internal::None,
737 typename T13 = internal::None, typename T14 = internal::None,
738 typename T15 = internal::None, typename T16 = internal::None,
739 typename T17 = internal::None, typename T18 = internal::None,
740 typename T19 = internal::None, typename T20 = internal::None,
741 typename T21 = internal::None, typename T22 = internal::None,
742 typename T23 = internal::None, typename T24 = internal::None,
743 typename T25 = internal::None, typename T26 = internal::None,
744 typename T27 = internal::None, typename T28 = internal::None,
745 typename T29 = internal::None, typename T30 = internal::None,
746 typename T31 = internal::None, typename T32 = internal::None,
747 typename T33 = internal::None, typename T34 = internal::None,
748 typename T35 = internal::None, typename T36 = internal::None,
749 typename T37 = internal::None, typename T38 = internal::None,
750 typename T39 = internal::None, typename T40 = internal::None,
751 typename T41 = internal::None, typename T42 = internal::None,
752 typename T43 = internal::None, typename T44 = internal::None,
753 typename T45 = internal::None, typename T46 = internal::None,
754 typename T47 = internal::None, typename T48 = internal::None,
755 typename T49 = internal::None, typename T50 = internal::None>
756 struct Types {
757 typedef internal::Types50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
758 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
759 T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
760 T41, T42, T43, T44, T45, T46, T47, T48, T49, T50> type;
761 };
762
763 template <>
764 struct Types<internal::None, internal::None, internal::None, internal::None,
765 internal::None, internal::None, internal::None, internal::None,
766 internal::None, internal::None, internal::None, internal::None,
767 internal::None, internal::None, internal::None, internal::None,
768 internal::None, internal::None, internal::None, internal::None,
769 internal::None, internal::None, internal::None, internal::None,
770 internal::None, internal::None, internal::None, internal::None,
771 internal::None, internal::None, internal::None, internal::None,
772 internal::None, internal::None, internal::None, internal::None,
773 internal::None, internal::None, internal::None, internal::None,
774 internal::None, internal::None, internal::None, internal::None,
775 internal::None, internal::None, internal::None, internal::None,
776 internal::None, internal::None> {
777 typedef internal::Types0 type;
778 };
779 template <typename T1>
780 struct Types<T1, internal::None, internal::None, internal::None,
781 internal::None, internal::None, internal::None, internal::None,
782 internal::None, internal::None, internal::None, internal::None,
783 internal::None, internal::None, internal::None, internal::None,
784 internal::None, internal::None, internal::None, internal::None,
785 internal::None, internal::None, internal::None, internal::None,
786 internal::None, internal::None, internal::None, internal::None,
787 internal::None, internal::None, internal::None, internal::None,
788 internal::None, internal::None, internal::None, internal::None,
789 internal::None, internal::None, internal::None, internal::None,
790 internal::None, internal::None, internal::None, internal::None,
791 internal::None, internal::None, internal::None, internal::None,
792 internal::None, internal::None> {
793 typedef internal::Types1<T1> type;
794 };
795 template <typename T1, typename T2>
796 struct Types<T1, T2, internal::None, internal::None, internal::None,
797 internal::None, internal::None, internal::None, internal::None,
798 internal::None, internal::None, internal::None, internal::None,
799 internal::None, internal::None, internal::None, internal::None,
800 internal::None, internal::None, internal::None, internal::None,
801 internal::None, internal::None, internal::None, internal::None,
802 internal::None, internal::None, internal::None, internal::None,
803 internal::None, internal::None, internal::None, internal::None,
804 internal::None, internal::None, internal::None, internal::None,
805 internal::None, internal::None, internal::None, internal::None,
806 internal::None, internal::None, internal::None, internal::None,
807 internal::None, internal::None, internal::None, internal::None,
808 internal::None> {
809 typedef internal::Types2<T1, T2> type;
810 };
811 template <typename T1, typename T2, typename T3>
812 struct Types<T1, T2, T3, internal::None, internal::None, internal::None,
813 internal::None, internal::None, internal::None, internal::None,
814 internal::None, internal::None, internal::None, internal::None,
815 internal::None, internal::None, internal::None, internal::None,
816 internal::None, internal::None, internal::None, internal::None,
817 internal::None, internal::None, internal::None, internal::None,
818 internal::None, internal::None, internal::None, internal::None,
819 internal::None, internal::None, internal::None, internal::None,
820 internal::None, internal::None, internal::None, internal::None,
821 internal::None, internal::None, internal::None, internal::None,
822 internal::None, internal::None, internal::None, internal::None,
823 internal::None, internal::None, internal::None, internal::None> {
824 typedef internal::Types3<T1, T2, T3> type;
825 };
826 template <typename T1, typename T2, typename T3, typename T4>
827 struct Types<T1, T2, T3, T4, internal::None, internal::None, internal::None,
828 internal::None, internal::None, internal::None, internal::None,
829 internal::None, internal::None, internal::None, internal::None,
830 internal::None, internal::None, internal::None, internal::None,
831 internal::None, internal::None, internal::None, internal::None,
832 internal::None, internal::None, internal::None, internal::None,
833 internal::None, internal::None, internal::None, internal::None,
834 internal::None, internal::None, internal::None, internal::None,
835 internal::None, internal::None, internal::None, internal::None,
836 internal::None, internal::None, internal::None, internal::None,
837 internal::None, internal::None, internal::None, internal::None,
838 internal::None, internal::None, internal::None> {
839 typedef internal::Types4<T1, T2, T3, T4> type;
840 };
841 template <typename T1, typename T2, typename T3, typename T4, typename T5>
842 struct Types<T1, T2, T3, T4, T5, internal::None, internal::None,
843 internal::None, internal::None, internal::None, internal::None,
844 internal::None, internal::None, internal::None, internal::None,
845 internal::None, internal::None, internal::None, internal::None,
846 internal::None, internal::None, internal::None, internal::None,
847 internal::None, internal::None, internal::None, internal::None,
848 internal::None, internal::None, internal::None, internal::None,
849 internal::None, internal::None, internal::None, internal::None,
850 internal::None, internal::None, internal::None, internal::None,
851 internal::None, internal::None, internal::None, internal::None,
852 internal::None, internal::None, internal::None, internal::None,
853 internal::None, internal::None, internal::None> {
854 typedef internal::Types5<T1, T2, T3, T4, T5> type;
855 };
856 template <typename T1, typename T2, typename T3, typename T4, typename T5,
857 typename T6>
858 struct Types<T1, T2, T3, T4, T5, T6, internal::None, internal::None,
859 internal::None, internal::None, internal::None, internal::None,
860 internal::None, internal::None, internal::None, internal::None,
861 internal::None, internal::None, internal::None, internal::None,
862 internal::None, internal::None, internal::None, internal::None,
863 internal::None, internal::None, internal::None, internal::None,
864 internal::None, internal::None, internal::None, internal::None,
865 internal::None, internal::None, internal::None, internal::None,
866 internal::None, internal::None, internal::None, internal::None,
867 internal::None, internal::None, internal::None, internal::None,
868 internal::None, internal::None, internal::None, internal::None,
869 internal::None, internal::None> {
870 typedef internal::Types6<T1, T2, T3, T4, T5, T6> type;
871 };
872 template <typename T1, typename T2, typename T3, typename T4, typename T5,
873 typename T6, typename T7>
874 struct Types<T1, T2, T3, T4, T5, T6, T7, internal::None, internal::None,
875 internal::None, internal::None, internal::None, internal::None,
876 internal::None, internal::None, internal::None, internal::None,
877 internal::None, internal::None, internal::None, internal::None,
878 internal::None, internal::None, internal::None, internal::None,
879 internal::None, internal::None, internal::None, internal::None,
880 internal::None, internal::None, internal::None, internal::None,
881 internal::None, internal::None, internal::None, internal::None,
882 internal::None, internal::None, internal::None, internal::None,
883 internal::None, internal::None, internal::None, internal::None,
884 internal::None, internal::None, internal::None, internal::None,
885 internal::None> {
886 typedef internal::Types7<T1, T2, T3, T4, T5, T6, T7> type;
887 };
888 template <typename T1, typename T2, typename T3, typename T4, typename T5,
889 typename T6, typename T7, typename T8>
890 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, internal::None, internal::None,
891 internal::None, internal::None, internal::None, internal::None,
892 internal::None, internal::None, internal::None, internal::None,
893 internal::None, internal::None, internal::None, internal::None,
894 internal::None, internal::None, internal::None, internal::None,
895 internal::None, internal::None, internal::None, internal::None,
896 internal::None, internal::None, internal::None, internal::None,
897 internal::None, internal::None, internal::None, internal::None,
898 internal::None, internal::None, internal::None, internal::None,
899 internal::None, internal::None, internal::None, internal::None,
900 internal::None, internal::None, internal::None, internal::None> {
901 typedef internal::Types8<T1, T2, T3, T4, T5, T6, T7, T8> type;
902 };
903 template <typename T1, typename T2, typename T3, typename T4, typename T5,
904 typename T6, typename T7, typename T8, typename T9>
905 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, internal::None,
906 internal::None, internal::None, internal::None, internal::None,
907 internal::None, internal::None, internal::None, internal::None,
908 internal::None, internal::None, internal::None, internal::None,
909 internal::None, internal::None, internal::None, internal::None,
910 internal::None, internal::None, internal::None, internal::None,
911 internal::None, internal::None, internal::None, internal::None,
912 internal::None, internal::None, internal::None, internal::None,
913 internal::None, internal::None, internal::None, internal::None,
914 internal::None, internal::None, internal::None, internal::None,
915 internal::None, internal::None, internal::None, internal::None> {
916 typedef internal::Types9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;
917 };
918 template <typename T1, typename T2, typename T3, typename T4, typename T5,
919 typename T6, typename T7, typename T8, typename T9, typename T10>
920 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, internal::None,
921 internal::None, internal::None, internal::None, internal::None,
922 internal::None, internal::None, internal::None, internal::None,
923 internal::None, internal::None, internal::None, internal::None,
924 internal::None, internal::None, internal::None, internal::None,
925 internal::None, internal::None, internal::None, internal::None,
926 internal::None, internal::None, internal::None, internal::None,
927 internal::None, internal::None, internal::None, internal::None,
928 internal::None, internal::None, internal::None, internal::None,
929 internal::None, internal::None, internal::None, internal::None,
930 internal::None, internal::None, internal::None> {
931 typedef internal::Types10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;
932 };
933 template <typename T1, typename T2, typename T3, typename T4, typename T5,
934 typename T6, typename T7, typename T8, typename T9, typename T10,
935 typename T11>
936 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, internal::None,
937 internal::None, internal::None, internal::None, internal::None,
938 internal::None, internal::None, internal::None, internal::None,
939 internal::None, internal::None, internal::None, internal::None,
940 internal::None, internal::None, internal::None, internal::None,
941 internal::None, internal::None, internal::None, internal::None,
942 internal::None, internal::None, internal::None, internal::None,
943 internal::None, internal::None, internal::None, internal::None,
944 internal::None, internal::None, internal::None, internal::None,
945 internal::None, internal::None, internal::None, internal::None,
946 internal::None, internal::None> {
947 typedef internal::Types11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;
948 };
949 template <typename T1, typename T2, typename T3, typename T4, typename T5,
950 typename T6, typename T7, typename T8, typename T9, typename T10,
951 typename T11, typename T12>
952 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, internal::None,
953 internal::None, internal::None, internal::None, internal::None,
954 internal::None, internal::None, internal::None, internal::None,
955 internal::None, internal::None, internal::None, internal::None,
956 internal::None, internal::None, internal::None, internal::None,
957 internal::None, internal::None, internal::None, internal::None,
958 internal::None, internal::None, internal::None, internal::None,
959 internal::None, internal::None, internal::None, internal::None,
960 internal::None, internal::None, internal::None, internal::None,
961 internal::None, internal::None, internal::None, internal::None,
962 internal::None> {
963 typedef internal::Types12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
964 T12> type;
965 };
966 template <typename T1, typename T2, typename T3, typename T4, typename T5,
967 typename T6, typename T7, typename T8, typename T9, typename T10,
968 typename T11, typename T12, typename T13>
969 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
970 internal::None, internal::None, internal::None, internal::None,
971 internal::None, internal::None, internal::None, internal::None,
972 internal::None, internal::None, internal::None, internal::None,
973 internal::None, internal::None, internal::None, internal::None,
974 internal::None, internal::None, internal::None, internal::None,
975 internal::None, internal::None, internal::None, internal::None,
976 internal::None, internal::None, internal::None, internal::None,
977 internal::None, internal::None, internal::None, internal::None,
978 internal::None, internal::None, internal::None, internal::None,
979 internal::None> {
980 typedef internal::Types13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
981 T13> type;
982 };
983 template <typename T1, typename T2, typename T3, typename T4, typename T5,
984 typename T6, typename T7, typename T8, typename T9, typename T10,
985 typename T11, typename T12, typename T13, typename T14>
986 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
987 internal::None, internal::None, internal::None, internal::None,
988 internal::None, internal::None, internal::None, internal::None,
989 internal::None, internal::None, internal::None, internal::None,
990 internal::None, internal::None, internal::None, internal::None,
991 internal::None, internal::None, internal::None, internal::None,
992 internal::None, internal::None, internal::None, internal::None,
993 internal::None, internal::None, internal::None, internal::None,
994 internal::None, internal::None, internal::None, internal::None,
995 internal::None, internal::None, internal::None, internal::None> {
996 typedef internal::Types14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
997 T13, T14> type;
998 };
999 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1000 typename T6, typename T7, typename T8, typename T9, typename T10,
1001 typename T11, typename T12, typename T13, typename T14, typename T15>
1002 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1003 internal::None, internal::None, internal::None, internal::None,
1004 internal::None, internal::None, internal::None, internal::None,
1005 internal::None, internal::None, internal::None, internal::None,
1006 internal::None, internal::None, internal::None, internal::None,
1007 internal::None, internal::None, internal::None, internal::None,
1008 internal::None, internal::None, internal::None, internal::None,
1009 internal::None, internal::None, internal::None, internal::None,
1010 internal::None, internal::None, internal::None, internal::None,
1011 internal::None, internal::None, internal::None> {
1012 typedef internal::Types15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1013 T13, T14, T15> type;
1014 };
1015 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1016 typename T6, typename T7, typename T8, typename T9, typename T10,
1017 typename T11, typename T12, typename T13, typename T14, typename T15,
1018 typename T16>
1019 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1020 T16, internal::None, internal::None, internal::None, internal::None,
1021 internal::None, internal::None, internal::None, internal::None,
1022 internal::None, internal::None, internal::None, internal::None,
1023 internal::None, internal::None, internal::None, internal::None,
1024 internal::None, internal::None, internal::None, internal::None,
1025 internal::None, internal::None, internal::None, internal::None,
1026 internal::None, internal::None, internal::None, internal::None,
1027 internal::None, internal::None, internal::None, internal::None,
1028 internal::None, internal::None> {
1029 typedef internal::Types16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1030 T13, T14, T15, T16> type;
1031 };
1032 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1033 typename T6, typename T7, typename T8, typename T9, typename T10,
1034 typename T11, typename T12, typename T13, typename T14, typename T15,
1035 typename T16, typename T17>
1036 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1037 T16, T17, internal::None, internal::None, internal::None, internal::None,
1038 internal::None, internal::None, internal::None, internal::None,
1039 internal::None, internal::None, internal::None, internal::None,
1040 internal::None, internal::None, internal::None, internal::None,
1041 internal::None, internal::None, internal::None, internal::None,
1042 internal::None, internal::None, internal::None, internal::None,
1043 internal::None, internal::None, internal::None, internal::None,
1044 internal::None, internal::None, internal::None, internal::None,
1045 internal::None> {
1046 typedef internal::Types17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1047 T13, T14, T15, T16, T17> type;
1048 };
1049 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1050 typename T6, typename T7, typename T8, typename T9, typename T10,
1051 typename T11, typename T12, typename T13, typename T14, typename T15,
1052 typename T16, typename T17, typename T18>
1053 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1054 T16, T17, T18, internal::None, internal::None, internal::None,
1055 internal::None, internal::None, internal::None, internal::None,
1056 internal::None, internal::None, internal::None, internal::None,
1057 internal::None, internal::None, internal::None, internal::None,
1058 internal::None, internal::None, internal::None, internal::None,
1059 internal::None, internal::None, internal::None, internal::None,
1060 internal::None, internal::None, internal::None, internal::None,
1061 internal::None, internal::None, internal::None, internal::None,
1062 internal::None> {
1063 typedef internal::Types18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1064 T13, T14, T15, T16, T17, T18> type;
1065 };
1066 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1067 typename T6, typename T7, typename T8, typename T9, typename T10,
1068 typename T11, typename T12, typename T13, typename T14, typename T15,
1069 typename T16, typename T17, typename T18, typename T19>
1070 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1071 T16, T17, T18, T19, internal::None, internal::None, internal::None,
1072 internal::None, internal::None, internal::None, internal::None,
1073 internal::None, internal::None, internal::None, internal::None,
1074 internal::None, internal::None, internal::None, internal::None,
1075 internal::None, internal::None, internal::None, internal::None,
1076 internal::None, internal::None, internal::None, internal::None,
1077 internal::None, internal::None, internal::None, internal::None,
1078 internal::None, internal::None, internal::None, internal::None> {
1079 typedef internal::Types19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1080 T13, T14, T15, T16, T17, T18, T19> type;
1081 };
1082 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1083 typename T6, typename T7, typename T8, typename T9, typename T10,
1084 typename T11, typename T12, typename T13, typename T14, typename T15,
1085 typename T16, typename T17, typename T18, typename T19, typename T20>
1086 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1087 T16, T17, T18, T19, T20, internal::None, internal::None, internal::None,
1088 internal::None, internal::None, internal::None, internal::None,
1089 internal::None, internal::None, internal::None, internal::None,
1090 internal::None, internal::None, internal::None, internal::None,
1091 internal::None, internal::None, internal::None, internal::None,
1092 internal::None, internal::None, internal::None, internal::None,
1093 internal::None, internal::None, internal::None, internal::None,
1094 internal::None, internal::None, internal::None> {
1095 typedef internal::Types20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1096 T13, T14, T15, T16, T17, T18, T19, T20> type;
1097 };
1098 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1099 typename T6, typename T7, typename T8, typename T9, typename T10,
1100 typename T11, typename T12, typename T13, typename T14, typename T15,
1101 typename T16, typename T17, typename T18, typename T19, typename T20,
1102 typename T21>
1103 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1104 T16, T17, T18, T19, T20, T21, internal::None, internal::None,
1105 internal::None, internal::None, internal::None, internal::None,
1106 internal::None, internal::None, internal::None, internal::None,
1107 internal::None, internal::None, internal::None, internal::None,
1108 internal::None, internal::None, internal::None, internal::None,
1109 internal::None, internal::None, internal::None, internal::None,
1110 internal::None, internal::None, internal::None, internal::None,
1111 internal::None, internal::None, internal::None> {
1112 typedef internal::Types21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1113 T13, T14, T15, T16, T17, T18, T19, T20, T21> type;
1114 };
1115 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1116 typename T6, typename T7, typename T8, typename T9, typename T10,
1117 typename T11, typename T12, typename T13, typename T14, typename T15,
1118 typename T16, typename T17, typename T18, typename T19, typename T20,
1119 typename T21, typename T22>
1120 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1121 T16, T17, T18, T19, T20, T21, T22, internal::None, internal::None,
1122 internal::None, internal::None, internal::None, internal::None,
1123 internal::None, internal::None, internal::None, internal::None,
1124 internal::None, internal::None, internal::None, internal::None,
1125 internal::None, internal::None, internal::None, internal::None,
1126 internal::None, internal::None, internal::None, internal::None,
1127 internal::None, internal::None, internal::None, internal::None,
1128 internal::None, internal::None> {
1129 typedef internal::Types22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1130 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22> type;
1131 };
1132 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1133 typename T6, typename T7, typename T8, typename T9, typename T10,
1134 typename T11, typename T12, typename T13, typename T14, typename T15,
1135 typename T16, typename T17, typename T18, typename T19, typename T20,
1136 typename T21, typename T22, typename T23>
1137 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1138 T16, T17, T18, T19, T20, T21, T22, T23, internal::None, internal::None,
1139 internal::None, internal::None, internal::None, internal::None,
1140 internal::None, internal::None, internal::None, internal::None,
1141 internal::None, internal::None, internal::None, internal::None,
1142 internal::None, internal::None, internal::None, internal::None,
1143 internal::None, internal::None, internal::None, internal::None,
1144 internal::None, internal::None, internal::None, internal::None,
1145 internal::None> {
1146 typedef internal::Types23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1147 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;
1148 };
1149 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1150 typename T6, typename T7, typename T8, typename T9, typename T10,
1151 typename T11, typename T12, typename T13, typename T14, typename T15,
1152 typename T16, typename T17, typename T18, typename T19, typename T20,
1153 typename T21, typename T22, typename T23, typename T24>
1154 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1155 T16, T17, T18, T19, T20, T21, T22, T23, T24, internal::None,
1156 internal::None, internal::None, internal::None, internal::None,
1157 internal::None, internal::None, internal::None, internal::None,
1158 internal::None, internal::None, internal::None, internal::None,
1159 internal::None, internal::None, internal::None, internal::None,
1160 internal::None, internal::None, internal::None, internal::None,
1161 internal::None, internal::None, internal::None, internal::None,
1162 internal::None> {
1163 typedef internal::Types24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1164 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;
1165 };
1166 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1167 typename T6, typename T7, typename T8, typename T9, typename T10,
1168 typename T11, typename T12, typename T13, typename T14, typename T15,
1169 typename T16, typename T17, typename T18, typename T19, typename T20,
1170 typename T21, typename T22, typename T23, typename T24, typename T25>
1171 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1172 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, internal::None,
1173 internal::None, internal::None, internal::None, internal::None,
1174 internal::None, internal::None, internal::None, internal::None,
1175 internal::None, internal::None, internal::None, internal::None,
1176 internal::None, internal::None, internal::None, internal::None,
1177 internal::None, internal::None, internal::None, internal::None,
1178 internal::None, internal::None, internal::None, internal::None> {
1179 typedef internal::Types25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1180 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;
1181 };
1182 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1183 typename T6, typename T7, typename T8, typename T9, typename T10,
1184 typename T11, typename T12, typename T13, typename T14, typename T15,
1185 typename T16, typename T17, typename T18, typename T19, typename T20,
1186 typename T21, typename T22, typename T23, typename T24, typename T25,
1187 typename T26>
1188 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1189 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, internal::None,
1190 internal::None, internal::None, internal::None, internal::None,
1191 internal::None, internal::None, internal::None, internal::None,
1192 internal::None, internal::None, internal::None, internal::None,
1193 internal::None, internal::None, internal::None, internal::None,
1194 internal::None, internal::None, internal::None, internal::None,
1195 internal::None, internal::None, internal::None> {
1196 typedef internal::Types26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1197 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
1198 T26> type;
1199 };
1200 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1201 typename T6, typename T7, typename T8, typename T9, typename T10,
1202 typename T11, typename T12, typename T13, typename T14, typename T15,
1203 typename T16, typename T17, typename T18, typename T19, typename T20,
1204 typename T21, typename T22, typename T23, typename T24, typename T25,
1205 typename T26, typename T27>
1206 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1207 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, internal::None,
1208 internal::None, internal::None, internal::None, internal::None,
1209 internal::None, internal::None, internal::None, internal::None,
1210 internal::None, internal::None, internal::None, internal::None,
1211 internal::None, internal::None, internal::None, internal::None,
1212 internal::None, internal::None, internal::None, internal::None,
1213 internal::None, internal::None> {
1214 typedef internal::Types27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1215 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1216 T27> type;
1217 };
1218 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1219 typename T6, typename T7, typename T8, typename T9, typename T10,
1220 typename T11, typename T12, typename T13, typename T14, typename T15,
1221 typename T16, typename T17, typename T18, typename T19, typename T20,
1222 typename T21, typename T22, typename T23, typename T24, typename T25,
1223 typename T26, typename T27, typename T28>
1224 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1225 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
1226 internal::None, internal::None, internal::None, internal::None,
1227 internal::None, internal::None, internal::None, internal::None,
1228 internal::None, internal::None, internal::None, internal::None,
1229 internal::None, internal::None, internal::None, internal::None,
1230 internal::None, internal::None, internal::None, internal::None,
1231 internal::None, internal::None> {
1232 typedef internal::Types28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1233 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1234 T27, T28> type;
1235 };
1236 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1237 typename T6, typename T7, typename T8, typename T9, typename T10,
1238 typename T11, typename T12, typename T13, typename T14, typename T15,
1239 typename T16, typename T17, typename T18, typename T19, typename T20,
1240 typename T21, typename T22, typename T23, typename T24, typename T25,
1241 typename T26, typename T27, typename T28, typename T29>
1242 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1243 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
1244 internal::None, internal::None, internal::None, internal::None,
1245 internal::None, internal::None, internal::None, internal::None,
1246 internal::None, internal::None, internal::None, internal::None,
1247 internal::None, internal::None, internal::None, internal::None,
1248 internal::None, internal::None, internal::None, internal::None,
1249 internal::None> {
1250 typedef internal::Types29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1251 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1252 T27, T28, T29> type;
1253 };
1254 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1255 typename T6, typename T7, typename T8, typename T9, typename T10,
1256 typename T11, typename T12, typename T13, typename T14, typename T15,
1257 typename T16, typename T17, typename T18, typename T19, typename T20,
1258 typename T21, typename T22, typename T23, typename T24, typename T25,
1259 typename T26, typename T27, typename T28, typename T29, typename T30>
1260 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1261 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1262 internal::None, internal::None, internal::None, internal::None,
1263 internal::None, internal::None, internal::None, internal::None,
1264 internal::None, internal::None, internal::None, internal::None,
1265 internal::None, internal::None, internal::None, internal::None,
1266 internal::None, internal::None, internal::None, internal::None> {
1267 typedef internal::Types30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1268 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1269 T27, T28, T29, T30> type;
1270 };
1271 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1272 typename T6, typename T7, typename T8, typename T9, typename T10,
1273 typename T11, typename T12, typename T13, typename T14, typename T15,
1274 typename T16, typename T17, typename T18, typename T19, typename T20,
1275 typename T21, typename T22, typename T23, typename T24, typename T25,
1276 typename T26, typename T27, typename T28, typename T29, typename T30,
1277 typename T31>
1278 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1279 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1280 T31, internal::None, internal::None, internal::None, internal::None,
1281 internal::None, internal::None, internal::None, internal::None,
1282 internal::None, internal::None, internal::None, internal::None,
1283 internal::None, internal::None, internal::None, internal::None,
1284 internal::None, internal::None, internal::None> {
1285 typedef internal::Types31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1286 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1287 T27, T28, T29, T30, T31> type;
1288 };
1289 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1290 typename T6, typename T7, typename T8, typename T9, typename T10,
1291 typename T11, typename T12, typename T13, typename T14, typename T15,
1292 typename T16, typename T17, typename T18, typename T19, typename T20,
1293 typename T21, typename T22, typename T23, typename T24, typename T25,
1294 typename T26, typename T27, typename T28, typename T29, typename T30,
1295 typename T31, typename T32>
1296 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1297 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1298 T31, T32, internal::None, internal::None, internal::None, internal::None,
1299 internal::None, internal::None, internal::None, internal::None,
1300 internal::None, internal::None, internal::None, internal::None,
1301 internal::None, internal::None, internal::None, internal::None,
1302 internal::None, internal::None> {
1303 typedef internal::Types32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1304 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1305 T27, T28, T29, T30, T31, T32> type;
1306 };
1307 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1308 typename T6, typename T7, typename T8, typename T9, typename T10,
1309 typename T11, typename T12, typename T13, typename T14, typename T15,
1310 typename T16, typename T17, typename T18, typename T19, typename T20,
1311 typename T21, typename T22, typename T23, typename T24, typename T25,
1312 typename T26, typename T27, typename T28, typename T29, typename T30,
1313 typename T31, typename T32, typename T33>
1314 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1315 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1316 T31, T32, T33, internal::None, internal::None, internal::None,
1317 internal::None, internal::None, internal::None, internal::None,
1318 internal::None, internal::None, internal::None, internal::None,
1319 internal::None, internal::None, internal::None, internal::None,
1320 internal::None, internal::None> {
1321 typedef internal::Types33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1322 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1323 T27, T28, T29, T30, T31, T32, T33> type;
1324 };
1325 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1326 typename T6, typename T7, typename T8, typename T9, typename T10,
1327 typename T11, typename T12, typename T13, typename T14, typename T15,
1328 typename T16, typename T17, typename T18, typename T19, typename T20,
1329 typename T21, typename T22, typename T23, typename T24, typename T25,
1330 typename T26, typename T27, typename T28, typename T29, typename T30,
1331 typename T31, typename T32, typename T33, typename T34>
1332 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1333 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1334 T31, T32, T33, T34, internal::None, internal::None, internal::None,
1335 internal::None, internal::None, internal::None, internal::None,
1336 internal::None, internal::None, internal::None, internal::None,
1337 internal::None, internal::None, internal::None, internal::None,
1338 internal::None> {
1339 typedef internal::Types34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1340 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1341 T27, T28, T29, T30, T31, T32, T33, T34> type;
1342 };
1343 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1344 typename T6, typename T7, typename T8, typename T9, typename T10,
1345 typename T11, typename T12, typename T13, typename T14, typename T15,
1346 typename T16, typename T17, typename T18, typename T19, typename T20,
1347 typename T21, typename T22, typename T23, typename T24, typename T25,
1348 typename T26, typename T27, typename T28, typename T29, typename T30,
1349 typename T31, typename T32, typename T33, typename T34, typename T35>
1350 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1351 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1352 T31, T32, T33, T34, T35, internal::None, internal::None, internal::None,
1353 internal::None, internal::None, internal::None, internal::None,
1354 internal::None, internal::None, internal::None, internal::None,
1355 internal::None, internal::None, internal::None, internal::None> {
1356 typedef internal::Types35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1357 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1358 T27, T28, T29, T30, T31, T32, T33, T34, T35> type;
1359 };
1360 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1361 typename T6, typename T7, typename T8, typename T9, typename T10,
1362 typename T11, typename T12, typename T13, typename T14, typename T15,
1363 typename T16, typename T17, typename T18, typename T19, typename T20,
1364 typename T21, typename T22, typename T23, typename T24, typename T25,
1365 typename T26, typename T27, typename T28, typename T29, typename T30,
1366 typename T31, typename T32, typename T33, typename T34, typename T35,
1367 typename T36>
1368 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1369 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1370 T31, T32, T33, T34, T35, T36, internal::None, internal::None,
1371 internal::None, internal::None, internal::None, internal::None,
1372 internal::None, internal::None, internal::None, internal::None,
1373 internal::None, internal::None, internal::None, internal::None> {
1374 typedef internal::Types36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1375 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1376 T27, T28, T29, T30, T31, T32, T33, T34, T35, T36> type;
1377 };
1378 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1379 typename T6, typename T7, typename T8, typename T9, typename T10,
1380 typename T11, typename T12, typename T13, typename T14, typename T15,
1381 typename T16, typename T17, typename T18, typename T19, typename T20,
1382 typename T21, typename T22, typename T23, typename T24, typename T25,
1383 typename T26, typename T27, typename T28, typename T29, typename T30,
1384 typename T31, typename T32, typename T33, typename T34, typename T35,
1385 typename T36, typename T37>
1386 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1387 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1388 T31, T32, T33, T34, T35, T36, T37, internal::None, internal::None,
1389 internal::None, internal::None, internal::None, internal::None,
1390 internal::None, internal::None, internal::None, internal::None,
1391 internal::None, internal::None, internal::None> {
1392 typedef internal::Types37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1393 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1394 T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;
1395 };
1396 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1397 typename T6, typename T7, typename T8, typename T9, typename T10,
1398 typename T11, typename T12, typename T13, typename T14, typename T15,
1399 typename T16, typename T17, typename T18, typename T19, typename T20,
1400 typename T21, typename T22, typename T23, typename T24, typename T25,
1401 typename T26, typename T27, typename T28, typename T29, typename T30,
1402 typename T31, typename T32, typename T33, typename T34, typename T35,
1403 typename T36, typename T37, typename T38>
1404 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1405 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1406 T31, T32, T33, T34, T35, T36, T37, T38, internal::None, internal::None,
1407 internal::None, internal::None, internal::None, internal::None,
1408 internal::None, internal::None, internal::None, internal::None,
1409 internal::None, internal::None> {
1410 typedef internal::Types38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1411 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1412 T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;
1413 };
1414 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1415 typename T6, typename T7, typename T8, typename T9, typename T10,
1416 typename T11, typename T12, typename T13, typename T14, typename T15,
1417 typename T16, typename T17, typename T18, typename T19, typename T20,
1418 typename T21, typename T22, typename T23, typename T24, typename T25,
1419 typename T26, typename T27, typename T28, typename T29, typename T30,
1420 typename T31, typename T32, typename T33, typename T34, typename T35,
1421 typename T36, typename T37, typename T38, typename T39>
1422 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1423 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1424 T31, T32, T33, T34, T35, T36, T37, T38, T39, internal::None,
1425 internal::None, internal::None, internal::None, internal::None,
1426 internal::None, internal::None, internal::None, internal::None,
1427 internal::None, internal::None> {
1428 typedef internal::Types39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1429 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1430 T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;
1431 };
1432 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1433 typename T6, typename T7, typename T8, typename T9, typename T10,
1434 typename T11, typename T12, typename T13, typename T14, typename T15,
1435 typename T16, typename T17, typename T18, typename T19, typename T20,
1436 typename T21, typename T22, typename T23, typename T24, typename T25,
1437 typename T26, typename T27, typename T28, typename T29, typename T30,
1438 typename T31, typename T32, typename T33, typename T34, typename T35,
1439 typename T36, typename T37, typename T38, typename T39, typename T40>
1440 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1441 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1442 T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, internal::None,
1443 internal::None, internal::None, internal::None, internal::None,
1444 internal::None, internal::None, internal::None, internal::None,
1445 internal::None> {
1446 typedef internal::Types40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1447 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1448 T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
1449 T40> type;
1450 };
1451 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1452 typename T6, typename T7, typename T8, typename T9, typename T10,
1453 typename T11, typename T12, typename T13, typename T14, typename T15,
1454 typename T16, typename T17, typename T18, typename T19, typename T20,
1455 typename T21, typename T22, typename T23, typename T24, typename T25,
1456 typename T26, typename T27, typename T28, typename T29, typename T30,
1457 typename T31, typename T32, typename T33, typename T34, typename T35,
1458 typename T36, typename T37, typename T38, typename T39, typename T40,
1459 typename T41>
1460 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1461 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1462 T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, internal::None,
1463 internal::None, internal::None, internal::None, internal::None,
1464 internal::None, internal::None, internal::None, internal::None> {
1465 typedef internal::Types41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1466 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1467 T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
1468 T41> type;
1469 };
1470 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1471 typename T6, typename T7, typename T8, typename T9, typename T10,
1472 typename T11, typename T12, typename T13, typename T14, typename T15,
1473 typename T16, typename T17, typename T18, typename T19, typename T20,
1474 typename T21, typename T22, typename T23, typename T24, typename T25,
1475 typename T26, typename T27, typename T28, typename T29, typename T30,
1476 typename T31, typename T32, typename T33, typename T34, typename T35,
1477 typename T36, typename T37, typename T38, typename T39, typename T40,
1478 typename T41, typename T42>
1479 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1480 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1481 T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, internal::None,
1482 internal::None, internal::None, internal::None, internal::None,
1483 internal::None, internal::None, internal::None> {
1484 typedef internal::Types42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1485 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1486 T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
1487 T41, T42> type;
1488 };
1489 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1490 typename T6, typename T7, typename T8, typename T9, typename T10,
1491 typename T11, typename T12, typename T13, typename T14, typename T15,
1492 typename T16, typename T17, typename T18, typename T19, typename T20,
1493 typename T21, typename T22, typename T23, typename T24, typename T25,
1494 typename T26, typename T27, typename T28, typename T29, typename T30,
1495 typename T31, typename T32, typename T33, typename T34, typename T35,
1496 typename T36, typename T37, typename T38, typename T39, typename T40,
1497 typename T41, typename T42, typename T43>
1498 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1499 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1500 T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
1501 internal::None, internal::None, internal::None, internal::None,
1502 internal::None, internal::None, internal::None> {
1503 typedef internal::Types43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1504 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1505 T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
1506 T41, T42, T43> type;
1507 };
1508 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1509 typename T6, typename T7, typename T8, typename T9, typename T10,
1510 typename T11, typename T12, typename T13, typename T14, typename T15,
1511 typename T16, typename T17, typename T18, typename T19, typename T20,
1512 typename T21, typename T22, typename T23, typename T24, typename T25,
1513 typename T26, typename T27, typename T28, typename T29, typename T30,
1514 typename T31, typename T32, typename T33, typename T34, typename T35,
1515 typename T36, typename T37, typename T38, typename T39, typename T40,
1516 typename T41, typename T42, typename T43, typename T44>
1517 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1518 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1519 T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
1520 internal::None, internal::None, internal::None, internal::None,
1521 internal::None, internal::None> {
1522 typedef internal::Types44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1523 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1524 T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
1525 T41, T42, T43, T44> type;
1526 };
1527 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1528 typename T6, typename T7, typename T8, typename T9, typename T10,
1529 typename T11, typename T12, typename T13, typename T14, typename T15,
1530 typename T16, typename T17, typename T18, typename T19, typename T20,
1531 typename T21, typename T22, typename T23, typename T24, typename T25,
1532 typename T26, typename T27, typename T28, typename T29, typename T30,
1533 typename T31, typename T32, typename T33, typename T34, typename T35,
1534 typename T36, typename T37, typename T38, typename T39, typename T40,
1535 typename T41, typename T42, typename T43, typename T44, typename T45>
1536 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1537 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1538 T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
1539 internal::None, internal::None, internal::None, internal::None,
1540 internal::None> {
1541 typedef internal::Types45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1542 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1543 T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
1544 T41, T42, T43, T44, T45> type;
1545 };
1546 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1547 typename T6, typename T7, typename T8, typename T9, typename T10,
1548 typename T11, typename T12, typename T13, typename T14, typename T15,
1549 typename T16, typename T17, typename T18, typename T19, typename T20,
1550 typename T21, typename T22, typename T23, typename T24, typename T25,
1551 typename T26, typename T27, typename T28, typename T29, typename T30,
1552 typename T31, typename T32, typename T33, typename T34, typename T35,
1553 typename T36, typename T37, typename T38, typename T39, typename T40,
1554 typename T41, typename T42, typename T43, typename T44, typename T45,
1555 typename T46>
1556 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1557 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1558 T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
1559 T46, internal::None, internal::None, internal::None, internal::None> {
1560 typedef internal::Types46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1561 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1562 T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
1563 T41, T42, T43, T44, T45, T46> type;
1564 };
1565 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1566 typename T6, typename T7, typename T8, typename T9, typename T10,
1567 typename T11, typename T12, typename T13, typename T14, typename T15,
1568 typename T16, typename T17, typename T18, typename T19, typename T20,
1569 typename T21, typename T22, typename T23, typename T24, typename T25,
1570 typename T26, typename T27, typename T28, typename T29, typename T30,
1571 typename T31, typename T32, typename T33, typename T34, typename T35,
1572 typename T36, typename T37, typename T38, typename T39, typename T40,
1573 typename T41, typename T42, typename T43, typename T44, typename T45,
1574 typename T46, typename T47>
1575 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1576 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1577 T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
1578 T46, T47, internal::None, internal::None, internal::None> {
1579 typedef internal::Types47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1580 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1581 T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
1582 T41, T42, T43, T44, T45, T46, T47> type;
1583 };
1584 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1585 typename T6, typename T7, typename T8, typename T9, typename T10,
1586 typename T11, typename T12, typename T13, typename T14, typename T15,
1587 typename T16, typename T17, typename T18, typename T19, typename T20,
1588 typename T21, typename T22, typename T23, typename T24, typename T25,
1589 typename T26, typename T27, typename T28, typename T29, typename T30,
1590 typename T31, typename T32, typename T33, typename T34, typename T35,
1591 typename T36, typename T37, typename T38, typename T39, typename T40,
1592 typename T41, typename T42, typename T43, typename T44, typename T45,
1593 typename T46, typename T47, typename T48>
1594 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1595 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1596 T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
1597 T46, T47, T48, internal::None, internal::None> {
1598 typedef internal::Types48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1599 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1600 T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
1601 T41, T42, T43, T44, T45, T46, T47, T48> type;
1602 };
1603 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1604 typename T6, typename T7, typename T8, typename T9, typename T10,
1605 typename T11, typename T12, typename T13, typename T14, typename T15,
1606 typename T16, typename T17, typename T18, typename T19, typename T20,
1607 typename T21, typename T22, typename T23, typename T24, typename T25,
1608 typename T26, typename T27, typename T28, typename T29, typename T30,
1609 typename T31, typename T32, typename T33, typename T34, typename T35,
1610 typename T36, typename T37, typename T38, typename T39, typename T40,
1611 typename T41, typename T42, typename T43, typename T44, typename T45,
1612 typename T46, typename T47, typename T48, typename T49>
1613 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1614 T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1615 T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
1616 T46, T47, T48, T49, internal::None> {
1617 typedef internal::Types49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1618 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1619 T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
1620 T41, T42, T43, T44, T45, T46, T47, T48, T49> type;
1621 };
1622
1623 namespace internal {
1624100
1625101 # define GTEST_TEMPLATE_ template <typename T> class
1626102
1643119 # define GTEST_BIND_(TmplSel, T) \
1644120 TmplSel::template Bind<T>::type
1645121
1646 // A unique struct template used as the default value for the
1647 // arguments of class template Templates. This allows us to simulate
1648 // variadic templates (e.g. Templates<int>, Templates<int, double>,
1649 // and etc), which C++ doesn't support directly.
1650 template <typename T>
1651 struct NoneT {};
1652
1653 // The following family of struct and struct templates are used to
1654 // represent template lists. In particular, TemplatesN<T1, T2, ...,
1655 // TN> represents a list of N templates (T1, T2, ..., and TN). Except
1656 // for Templates0, every struct in the family has two member types:
1657 // Head for the selector of the first template in the list, and Tail
1658 // for the rest of the list.
1659
1660 // The empty template list.
1661 struct Templates0 {};
1662
1663 // Template lists of length 1, 2, 3, and so on.
1664
1665 template <GTEST_TEMPLATE_ T1>
1666 struct Templates1 {
1667 typedef TemplateSel<T1> Head;
1668 typedef Templates0 Tail;
1669 };
1670 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>
1671 struct Templates2 {
1672 typedef TemplateSel<T1> Head;
1673 typedef Templates1<T2> Tail;
122 template <GTEST_TEMPLATE_ Head_, GTEST_TEMPLATE_... Tail_>
123 struct Templates {
124 using Head = TemplateSel<Head_>;
125 using Tail = Templates<Tail_...>;
1674126 };
1675127
1676 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>
1677 struct Templates3 {
1678 typedef TemplateSel<T1> Head;
1679 typedef Templates2<T2, T3> Tail;
128 template <GTEST_TEMPLATE_ Head_>
129 struct Templates<Head_> {
130 using Head = TemplateSel<Head_>;
131 using Tail = None;
1680132 };
1681133
1682 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1683 GTEST_TEMPLATE_ T4>
1684 struct Templates4 {
1685 typedef TemplateSel<T1> Head;
1686 typedef Templates3<T2, T3, T4> Tail;
134 // Tuple-like type lists
135 template <typename Head_, typename... Tail_>
136 struct Types {
137 using Head = Head_;
138 using Tail = Types<Tail_...>;
1687139 };
1688140
1689 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1690 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>
1691 struct Templates5 {
1692 typedef TemplateSel<T1> Head;
1693 typedef Templates4<T2, T3, T4, T5> Tail;
141 template <typename Head_>
142 struct Types<Head_> {
143 using Head = Head_;
144 using Tail = None;
1694145 };
1695146
1696 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1697 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>
1698 struct Templates6 {
1699 typedef TemplateSel<T1> Head;
1700 typedef Templates5<T2, T3, T4, T5, T6> Tail;
147 // Helper metafunctions to tell apart a single type from types
148 // generated by ::testing::Types
149 template <typename... Ts>
150 struct ProxyTypeList {
151 using type = Types<Ts...>;
1701152 };
1702153
1703 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1704 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1705 GTEST_TEMPLATE_ T7>
1706 struct Templates7 {
1707 typedef TemplateSel<T1> Head;
1708 typedef Templates6<T2, T3, T4, T5, T6, T7> Tail;
1709 };
154 template <typename>
155 struct is_proxy_type_list : std::false_type {};
1710156
1711 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1712 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1713 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>
1714 struct Templates8 {
1715 typedef TemplateSel<T1> Head;
1716 typedef Templates7<T2, T3, T4, T5, T6, T7, T8> Tail;
1717 };
157 template <typename... Ts>
158 struct is_proxy_type_list<ProxyTypeList<Ts...>> : std::true_type {};
1718159
1719 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1720 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1721 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>
1722 struct Templates9 {
1723 typedef TemplateSel<T1> Head;
1724 typedef Templates8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
1725 };
160 // Generator which conditionally creates type lists.
161 // It recognizes if a requested type list should be created
162 // and prevents creating a new type list nested within another one.
163 template <typename T>
164 struct GenerateTypeList {
165 private:
166 using proxy = typename std::conditional<is_proxy_type_list<T>::value, T,
167 ProxyTypeList<T>>::type;
1726168
1727 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1728 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1729 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1730 GTEST_TEMPLATE_ T10>
1731 struct Templates10 {
1732 typedef TemplateSel<T1> Head;
1733 typedef Templates9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
1734 };
1735
1736 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1737 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1738 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1739 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>
1740 struct Templates11 {
1741 typedef TemplateSel<T1> Head;
1742 typedef Templates10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
1743 };
1744
1745 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1746 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1747 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1748 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>
1749 struct Templates12 {
1750 typedef TemplateSel<T1> Head;
1751 typedef Templates11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
1752 };
1753
1754 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1755 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1756 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1757 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1758 GTEST_TEMPLATE_ T13>
1759 struct Templates13 {
1760 typedef TemplateSel<T1> Head;
1761 typedef Templates12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
1762 };
1763
1764 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1765 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1766 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1767 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1768 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>
1769 struct Templates14 {
1770 typedef TemplateSel<T1> Head;
1771 typedef Templates13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
1772 T14> Tail;
1773 };
1774
1775 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1776 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1777 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1778 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1779 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>
1780 struct Templates15 {
1781 typedef TemplateSel<T1> Head;
1782 typedef Templates14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1783 T15> Tail;
1784 };
1785
1786 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1787 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1788 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1789 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1790 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1791 GTEST_TEMPLATE_ T16>
1792 struct Templates16 {
1793 typedef TemplateSel<T1> Head;
1794 typedef Templates15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1795 T15, T16> Tail;
1796 };
1797
1798 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1799 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1800 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1801 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1802 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1803 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>
1804 struct Templates17 {
1805 typedef TemplateSel<T1> Head;
1806 typedef Templates16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1807 T15, T16, T17> Tail;
1808 };
1809
1810 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1811 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1812 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1813 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1814 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1815 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>
1816 struct Templates18 {
1817 typedef TemplateSel<T1> Head;
1818 typedef Templates17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1819 T15, T16, T17, T18> Tail;
1820 };
1821
1822 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1823 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1824 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1825 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1826 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1827 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
1828 GTEST_TEMPLATE_ T19>
1829 struct Templates19 {
1830 typedef TemplateSel<T1> Head;
1831 typedef Templates18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1832 T15, T16, T17, T18, T19> Tail;
1833 };
1834
1835 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1836 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1837 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1838 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1839 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1840 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
1841 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>
1842 struct Templates20 {
1843 typedef TemplateSel<T1> Head;
1844 typedef Templates19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1845 T15, T16, T17, T18, T19, T20> Tail;
1846 };
1847
1848 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1849 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1850 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1851 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1852 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1853 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
1854 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>
1855 struct Templates21 {
1856 typedef TemplateSel<T1> Head;
1857 typedef Templates20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1858 T15, T16, T17, T18, T19, T20, T21> Tail;
1859 };
1860
1861 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1862 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1863 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1864 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1865 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1866 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
1867 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
1868 GTEST_TEMPLATE_ T22>
1869 struct Templates22 {
1870 typedef TemplateSel<T1> Head;
1871 typedef Templates21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1872 T15, T16, T17, T18, T19, T20, T21, T22> Tail;
1873 };
1874
1875 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1876 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1877 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1878 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1879 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1880 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
1881 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
1882 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>
1883 struct Templates23 {
1884 typedef TemplateSel<T1> Head;
1885 typedef Templates22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1886 T15, T16, T17, T18, T19, T20, T21, T22, T23> Tail;
1887 };
1888
1889 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1890 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1891 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1892 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1893 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1894 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
1895 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
1896 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>
1897 struct Templates24 {
1898 typedef TemplateSel<T1> Head;
1899 typedef Templates23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1900 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;
1901 };
1902
1903 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1904 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1905 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1906 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1907 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1908 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
1909 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
1910 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
1911 GTEST_TEMPLATE_ T25>
1912 struct Templates25 {
1913 typedef TemplateSel<T1> Head;
1914 typedef Templates24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1915 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;
1916 };
1917
1918 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1919 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1920 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1921 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1922 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1923 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
1924 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
1925 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
1926 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>
1927 struct Templates26 {
1928 typedef TemplateSel<T1> Head;
1929 typedef Templates25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1930 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;
1931 };
1932
1933 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1934 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1935 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1936 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1937 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1938 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
1939 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
1940 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
1941 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>
1942 struct Templates27 {
1943 typedef TemplateSel<T1> Head;
1944 typedef Templates26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1945 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;
1946 };
1947
1948 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1949 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1950 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1951 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1952 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1953 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
1954 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
1955 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
1956 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
1957 GTEST_TEMPLATE_ T28>
1958 struct Templates28 {
1959 typedef TemplateSel<T1> Head;
1960 typedef Templates27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1961 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
1962 T28> Tail;
1963 };
1964
1965 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1966 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1967 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1968 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1969 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1970 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
1971 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
1972 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
1973 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
1974 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>
1975 struct Templates29 {
1976 typedef TemplateSel<T1> Head;
1977 typedef Templates28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1978 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
1979 T29> Tail;
1980 };
1981
1982 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1983 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1984 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1985 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1986 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1987 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
1988 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
1989 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
1990 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
1991 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>
1992 struct Templates30 {
1993 typedef TemplateSel<T1> Head;
1994 typedef Templates29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1995 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
1996 T29, T30> Tail;
1997 };
1998
1999 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2000 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2001 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2002 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2003 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2004 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2005 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2006 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2007 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2008 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2009 GTEST_TEMPLATE_ T31>
2010 struct Templates31 {
2011 typedef TemplateSel<T1> Head;
2012 typedef Templates30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2013 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2014 T29, T30, T31> Tail;
2015 };
2016
2017 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2018 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2019 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2020 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2021 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2022 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2023 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2024 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2025 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2026 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2027 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>
2028 struct Templates32 {
2029 typedef TemplateSel<T1> Head;
2030 typedef Templates31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2031 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2032 T29, T30, T31, T32> Tail;
2033 };
2034
2035 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2036 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2037 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2038 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2039 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2040 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2041 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2042 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2043 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2044 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2045 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>
2046 struct Templates33 {
2047 typedef TemplateSel<T1> Head;
2048 typedef Templates32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2049 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2050 T29, T30, T31, T32, T33> Tail;
2051 };
2052
2053 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2054 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2055 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2056 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2057 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2058 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2059 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2060 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2061 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2062 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2063 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2064 GTEST_TEMPLATE_ T34>
2065 struct Templates34 {
2066 typedef TemplateSel<T1> Head;
2067 typedef Templates33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2068 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2069 T29, T30, T31, T32, T33, T34> Tail;
2070 };
2071
2072 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2073 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2074 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2075 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2076 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2077 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2078 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2079 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2080 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2081 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2082 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2083 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>
2084 struct Templates35 {
2085 typedef TemplateSel<T1> Head;
2086 typedef Templates34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2087 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2088 T29, T30, T31, T32, T33, T34, T35> Tail;
2089 };
2090
2091 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2092 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2093 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2094 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2095 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2096 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2097 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2098 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2099 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2100 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2101 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2102 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>
2103 struct Templates36 {
2104 typedef TemplateSel<T1> Head;
2105 typedef Templates35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2106 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2107 T29, T30, T31, T32, T33, T34, T35, T36> Tail;
2108 };
2109
2110 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2111 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2112 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2113 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2114 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2115 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2116 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2117 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2118 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2119 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2120 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2121 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
2122 GTEST_TEMPLATE_ T37>
2123 struct Templates37 {
2124 typedef TemplateSel<T1> Head;
2125 typedef Templates36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2126 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2127 T29, T30, T31, T32, T33, T34, T35, T36, T37> Tail;
2128 };
2129
2130 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2131 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2132 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2133 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2134 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2135 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2136 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2137 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2138 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2139 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2140 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2141 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
2142 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>
2143 struct Templates38 {
2144 typedef TemplateSel<T1> Head;
2145 typedef Templates37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2146 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2147 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;
2148 };
2149
2150 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2151 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2152 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2153 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2154 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2155 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2156 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2157 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2158 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2159 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2160 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2161 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
2162 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>
2163 struct Templates39 {
2164 typedef TemplateSel<T1> Head;
2165 typedef Templates38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2166 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2167 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;
2168 };
2169
2170 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2171 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2172 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2173 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2174 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2175 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2176 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2177 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2178 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2179 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2180 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2181 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
2182 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
2183 GTEST_TEMPLATE_ T40>
2184 struct Templates40 {
2185 typedef TemplateSel<T1> Head;
2186 typedef Templates39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2187 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2188 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;
2189 };
2190
2191 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2192 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2193 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2194 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2195 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2196 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2197 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2198 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2199 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2200 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2201 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2202 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
2203 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
2204 GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>
2205 struct Templates41 {
2206 typedef TemplateSel<T1> Head;
2207 typedef Templates40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2208 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2209 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;
2210 };
2211
2212 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2213 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2214 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2215 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2216 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2217 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2218 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2219 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2220 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2221 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2222 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2223 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
2224 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
2225 GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>
2226 struct Templates42 {
2227 typedef TemplateSel<T1> Head;
2228 typedef Templates41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2229 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2230 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
2231 T42> Tail;
2232 };
2233
2234 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2235 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2236 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2237 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2238 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2239 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2240 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2241 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2242 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2243 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2244 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2245 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
2246 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
2247 GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
2248 GTEST_TEMPLATE_ T43>
2249 struct Templates43 {
2250 typedef TemplateSel<T1> Head;
2251 typedef Templates42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2252 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2253 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
2254 T43> Tail;
2255 };
2256
2257 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2258 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2259 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2260 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2261 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2262 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2263 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2264 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2265 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2266 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2267 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2268 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
2269 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
2270 GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
2271 GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>
2272 struct Templates44 {
2273 typedef TemplateSel<T1> Head;
2274 typedef Templates43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2275 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2276 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
2277 T43, T44> Tail;
2278 };
2279
2280 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2281 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2282 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2283 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2284 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2285 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2286 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2287 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2288 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2289 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2290 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2291 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
2292 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
2293 GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
2294 GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>
2295 struct Templates45 {
2296 typedef TemplateSel<T1> Head;
2297 typedef Templates44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2298 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2299 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
2300 T43, T44, T45> Tail;
2301 };
2302
2303 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2304 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2305 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2306 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2307 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2308 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2309 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2310 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2311 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2312 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2313 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2314 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
2315 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
2316 GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
2317 GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
2318 GTEST_TEMPLATE_ T46>
2319 struct Templates46 {
2320 typedef TemplateSel<T1> Head;
2321 typedef Templates45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2322 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2323 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
2324 T43, T44, T45, T46> Tail;
2325 };
2326
2327 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2328 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2329 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2330 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2331 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2332 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2333 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2334 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2335 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2336 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2337 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2338 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
2339 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
2340 GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
2341 GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
2342 GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>
2343 struct Templates47 {
2344 typedef TemplateSel<T1> Head;
2345 typedef Templates46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2346 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2347 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
2348 T43, T44, T45, T46, T47> Tail;
2349 };
2350
2351 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2352 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2353 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2354 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2355 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2356 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2357 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2358 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2359 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2360 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2361 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2362 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
2363 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
2364 GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
2365 GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
2366 GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>
2367 struct Templates48 {
2368 typedef TemplateSel<T1> Head;
2369 typedef Templates47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2370 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2371 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
2372 T43, T44, T45, T46, T47, T48> Tail;
2373 };
2374
2375 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2376 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2377 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2378 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2379 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2380 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2381 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2382 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2383 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2384 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2385 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2386 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
2387 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
2388 GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
2389 GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
2390 GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
2391 GTEST_TEMPLATE_ T49>
2392 struct Templates49 {
2393 typedef TemplateSel<T1> Head;
2394 typedef Templates48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2395 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2396 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
2397 T43, T44, T45, T46, T47, T48, T49> Tail;
2398 };
2399
2400 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2401 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2402 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2403 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2404 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2405 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2406 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2407 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2408 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2409 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2410 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2411 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
2412 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
2413 GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
2414 GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
2415 GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
2416 GTEST_TEMPLATE_ T49, GTEST_TEMPLATE_ T50>
2417 struct Templates50 {
2418 typedef TemplateSel<T1> Head;
2419 typedef Templates49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2420 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2421 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
2422 T43, T44, T45, T46, T47, T48, T49, T50> Tail;
2423 };
2424
2425
2426 // We don't want to require the users to write TemplatesN<...> directly,
2427 // as that would require them to count the length. Templates<...> is much
2428 // easier to write, but generates horrible messages when there is a
2429 // compiler error, as gcc insists on printing out each template
2430 // argument, even if it has the default value (this means Templates<list>
2431 // will appear as Templates<list, NoneT, NoneT, ..., NoneT> in the compiler
2432 // errors).
2433 //
2434 // Our solution is to combine the best part of the two approaches: a
2435 // user would write Templates<T1, ..., TN>, and Google Test will translate
2436 // that to TemplatesN<T1, ..., TN> internally to make error messages
2437 // readable. The translation is done by the 'type' member of the
2438 // Templates template.
2439 template <GTEST_TEMPLATE_ T1 = NoneT, GTEST_TEMPLATE_ T2 = NoneT,
2440 GTEST_TEMPLATE_ T3 = NoneT, GTEST_TEMPLATE_ T4 = NoneT,
2441 GTEST_TEMPLATE_ T5 = NoneT, GTEST_TEMPLATE_ T6 = NoneT,
2442 GTEST_TEMPLATE_ T7 = NoneT, GTEST_TEMPLATE_ T8 = NoneT,
2443 GTEST_TEMPLATE_ T9 = NoneT, GTEST_TEMPLATE_ T10 = NoneT,
2444 GTEST_TEMPLATE_ T11 = NoneT, GTEST_TEMPLATE_ T12 = NoneT,
2445 GTEST_TEMPLATE_ T13 = NoneT, GTEST_TEMPLATE_ T14 = NoneT,
2446 GTEST_TEMPLATE_ T15 = NoneT, GTEST_TEMPLATE_ T16 = NoneT,
2447 GTEST_TEMPLATE_ T17 = NoneT, GTEST_TEMPLATE_ T18 = NoneT,
2448 GTEST_TEMPLATE_ T19 = NoneT, GTEST_TEMPLATE_ T20 = NoneT,
2449 GTEST_TEMPLATE_ T21 = NoneT, GTEST_TEMPLATE_ T22 = NoneT,
2450 GTEST_TEMPLATE_ T23 = NoneT, GTEST_TEMPLATE_ T24 = NoneT,
2451 GTEST_TEMPLATE_ T25 = NoneT, GTEST_TEMPLATE_ T26 = NoneT,
2452 GTEST_TEMPLATE_ T27 = NoneT, GTEST_TEMPLATE_ T28 = NoneT,
2453 GTEST_TEMPLATE_ T29 = NoneT, GTEST_TEMPLATE_ T30 = NoneT,
2454 GTEST_TEMPLATE_ T31 = NoneT, GTEST_TEMPLATE_ T32 = NoneT,
2455 GTEST_TEMPLATE_ T33 = NoneT, GTEST_TEMPLATE_ T34 = NoneT,
2456 GTEST_TEMPLATE_ T35 = NoneT, GTEST_TEMPLATE_ T36 = NoneT,
2457 GTEST_TEMPLATE_ T37 = NoneT, GTEST_TEMPLATE_ T38 = NoneT,
2458 GTEST_TEMPLATE_ T39 = NoneT, GTEST_TEMPLATE_ T40 = NoneT,
2459 GTEST_TEMPLATE_ T41 = NoneT, GTEST_TEMPLATE_ T42 = NoneT,
2460 GTEST_TEMPLATE_ T43 = NoneT, GTEST_TEMPLATE_ T44 = NoneT,
2461 GTEST_TEMPLATE_ T45 = NoneT, GTEST_TEMPLATE_ T46 = NoneT,
2462 GTEST_TEMPLATE_ T47 = NoneT, GTEST_TEMPLATE_ T48 = NoneT,
2463 GTEST_TEMPLATE_ T49 = NoneT, GTEST_TEMPLATE_ T50 = NoneT>
2464 struct Templates {
2465 typedef Templates50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2466 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
2467 T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
2468 T42, T43, T44, T45, T46, T47, T48, T49, T50> type;
2469 };
2470
2471 template <>
2472 struct Templates<NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2473 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2474 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2475 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2476 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2477 NoneT> {
2478 typedef Templates0 type;
2479 };
2480 template <GTEST_TEMPLATE_ T1>
2481 struct Templates<T1, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2482 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2483 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2484 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2485 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2486 NoneT> {
2487 typedef Templates1<T1> type;
2488 };
2489 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>
2490 struct Templates<T1, T2, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2491 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2492 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2493 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2494 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2495 NoneT> {
2496 typedef Templates2<T1, T2> type;
2497 };
2498 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>
2499 struct Templates<T1, T2, T3, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2500 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2501 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2502 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2503 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
2504 typedef Templates3<T1, T2, T3> type;
2505 };
2506 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2507 GTEST_TEMPLATE_ T4>
2508 struct Templates<T1, T2, T3, T4, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2509 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2510 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2511 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2512 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
2513 typedef Templates4<T1, T2, T3, T4> type;
2514 };
2515 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2516 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>
2517 struct Templates<T1, T2, T3, T4, T5, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2518 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2519 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2520 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2521 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
2522 typedef Templates5<T1, T2, T3, T4, T5> type;
2523 };
2524 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2525 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>
2526 struct Templates<T1, T2, T3, T4, T5, T6, NoneT, NoneT, NoneT, NoneT, NoneT,
2527 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2528 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2529 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2530 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
2531 typedef Templates6<T1, T2, T3, T4, T5, T6> type;
2532 };
2533 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2534 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2535 GTEST_TEMPLATE_ T7>
2536 struct Templates<T1, T2, T3, T4, T5, T6, T7, NoneT, NoneT, NoneT, NoneT, NoneT,
2537 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2538 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2539 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2540 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
2541 typedef Templates7<T1, T2, T3, T4, T5, T6, T7> type;
2542 };
2543 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2544 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2545 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>
2546 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, NoneT, NoneT, NoneT, NoneT,
2547 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2548 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2549 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2550 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
2551 typedef Templates8<T1, T2, T3, T4, T5, T6, T7, T8> type;
2552 };
2553 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2554 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2555 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>
2556 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, NoneT, NoneT, NoneT,
2557 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2558 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2559 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2560 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
2561 typedef Templates9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;
2562 };
2563 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2564 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2565 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2566 GTEST_TEMPLATE_ T10>
2567 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, NoneT, NoneT, NoneT,
2568 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2569 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2570 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2571 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
2572 typedef Templates10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;
2573 };
2574 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2575 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2576 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2577 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>
2578 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, NoneT, NoneT,
2579 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2580 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2581 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2582 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
2583 typedef Templates11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;
2584 };
2585 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2586 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2587 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2588 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>
2589 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, NoneT,
2590 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2591 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2592 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2593 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
2594 typedef Templates12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> type;
2595 };
2596 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2597 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2598 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2599 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2600 GTEST_TEMPLATE_ T13>
2601 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, NoneT,
2602 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2603 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2604 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2605 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
2606 typedef Templates13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
2607 T13> type;
2608 };
2609 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2610 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2611 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2612 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2613 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>
2614 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2615 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2616 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2617 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2618 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
2619 typedef Templates14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2620 T14> type;
2621 };
2622 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2623 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2624 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2625 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2626 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>
2627 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2628 T15, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2629 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2630 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2631 NoneT, NoneT, NoneT, NoneT, NoneT> {
2632 typedef Templates15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2633 T14, T15> type;
2634 };
2635 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2636 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2637 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2638 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2639 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2640 GTEST_TEMPLATE_ T16>
2641 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2642 T15, T16, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2643 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2644 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2645 NoneT, NoneT, NoneT, NoneT, NoneT> {
2646 typedef Templates16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2647 T14, T15, T16> type;
2648 };
2649 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2650 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2651 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2652 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2653 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2654 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>
2655 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2656 T15, T16, T17, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2657 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2658 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2659 NoneT, NoneT, NoneT, NoneT, NoneT> {
2660 typedef Templates17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2661 T14, T15, T16, T17> type;
2662 };
2663 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2664 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2665 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2666 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2667 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2668 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>
2669 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2670 T15, T16, T17, T18, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2671 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2672 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2673 NoneT, NoneT, NoneT, NoneT> {
2674 typedef Templates18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2675 T14, T15, T16, T17, T18> type;
2676 };
2677 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2678 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2679 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2680 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2681 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2682 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2683 GTEST_TEMPLATE_ T19>
2684 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2685 T15, T16, T17, T18, T19, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2686 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2687 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2688 NoneT, NoneT, NoneT, NoneT> {
2689 typedef Templates19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2690 T14, T15, T16, T17, T18, T19> type;
2691 };
2692 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2693 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2694 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2695 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2696 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2697 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2698 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>
2699 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2700 T15, T16, T17, T18, T19, T20, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2701 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2702 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2703 NoneT, NoneT, NoneT, NoneT> {
2704 typedef Templates20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2705 T14, T15, T16, T17, T18, T19, T20> type;
2706 };
2707 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2708 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2709 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2710 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2711 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2712 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2713 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>
2714 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2715 T15, T16, T17, T18, T19, T20, T21, NoneT, NoneT, NoneT, NoneT, NoneT,
2716 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2717 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2718 NoneT, NoneT, NoneT, NoneT> {
2719 typedef Templates21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2720 T14, T15, T16, T17, T18, T19, T20, T21> type;
2721 };
2722 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2723 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2724 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2725 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2726 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2727 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2728 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2729 GTEST_TEMPLATE_ T22>
2730 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2731 T15, T16, T17, T18, T19, T20, T21, T22, NoneT, NoneT, NoneT, NoneT, NoneT,
2732 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2733 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2734 NoneT, NoneT, NoneT> {
2735 typedef Templates22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2736 T14, T15, T16, T17, T18, T19, T20, T21, T22> type;
2737 };
2738 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2739 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2740 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2741 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2742 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2743 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2744 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2745 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>
2746 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2747 T15, T16, T17, T18, T19, T20, T21, T22, T23, NoneT, NoneT, NoneT, NoneT,
2748 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2749 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2750 NoneT, NoneT, NoneT> {
2751 typedef Templates23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2752 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;
2753 };
2754 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2755 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2756 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2757 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2758 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2759 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2760 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2761 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>
2762 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2763 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, NoneT, NoneT, NoneT,
2764 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2765 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2766 NoneT, NoneT, NoneT> {
2767 typedef Templates24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2768 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;
2769 };
2770 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2771 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2772 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2773 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2774 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2775 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2776 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2777 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2778 GTEST_TEMPLATE_ T25>
2779 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2780 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, NoneT, NoneT, NoneT,
2781 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2782 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2783 NoneT, NoneT> {
2784 typedef Templates25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2785 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;
2786 };
2787 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2788 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2789 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2790 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2791 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2792 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2793 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2794 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2795 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>
2796 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2797 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, NoneT, NoneT,
2798 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2799 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2800 NoneT, NoneT> {
2801 typedef Templates26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2802 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> type;
2803 };
2804 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2805 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2806 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2807 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2808 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2809 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2810 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2811 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2812 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>
2813 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2814 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, NoneT,
2815 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2816 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2817 NoneT, NoneT> {
2818 typedef Templates27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2819 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
2820 T27> type;
2821 };
2822 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2823 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2824 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2825 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2826 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2827 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2828 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2829 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2830 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2831 GTEST_TEMPLATE_ T28>
2832 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2833 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2834 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2835 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2836 NoneT, NoneT> {
2837 typedef Templates28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2838 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
2839 T28> type;
2840 };
2841 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2842 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2843 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2844 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2845 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2846 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2847 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2848 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2849 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2850 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>
2851 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2852 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
2853 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2854 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2855 NoneT> {
2856 typedef Templates29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2857 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
2858 T28, T29> type;
2859 };
2860 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2861 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2862 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2863 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2864 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2865 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2866 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2867 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2868 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2869 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>
2870 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2871 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
2872 T30, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2873 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
2874 typedef Templates30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2875 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
2876 T28, T29, T30> type;
2877 };
2878 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2879 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2880 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2881 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2882 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2883 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2884 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2885 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2886 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2887 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2888 GTEST_TEMPLATE_ T31>
2889 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2890 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
2891 T30, T31, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2892 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
2893 typedef Templates31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2894 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
2895 T28, T29, T30, T31> type;
2896 };
2897 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2898 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2899 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2900 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2901 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2902 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2903 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2904 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2905 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2906 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2907 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>
2908 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2909 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
2910 T30, T31, T32, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2911 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
2912 typedef Templates32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2913 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
2914 T28, T29, T30, T31, T32> type;
2915 };
2916 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2917 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2918 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2919 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2920 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2921 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2922 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2923 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2924 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2925 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2926 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>
2927 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2928 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
2929 T30, T31, T32, T33, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2930 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
2931 typedef Templates33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2932 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
2933 T28, T29, T30, T31, T32, T33> type;
2934 };
2935 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2936 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2937 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2938 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2939 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2940 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2941 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2942 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2943 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2944 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2945 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2946 GTEST_TEMPLATE_ T34>
2947 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2948 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
2949 T30, T31, T32, T33, T34, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2950 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
2951 typedef Templates34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2952 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
2953 T28, T29, T30, T31, T32, T33, T34> type;
2954 };
2955 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2956 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2957 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2958 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2959 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2960 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2961 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2962 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2963 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2964 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2965 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2966 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>
2967 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2968 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
2969 T30, T31, T32, T33, T34, T35, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2970 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
2971 typedef Templates35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2972 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
2973 T28, T29, T30, T31, T32, T33, T34, T35> type;
2974 };
2975 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2976 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2977 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2978 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2979 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2980 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2981 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2982 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2983 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2984 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2985 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2986 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>
2987 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2988 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
2989 T30, T31, T32, T33, T34, T35, T36, NoneT, NoneT, NoneT, NoneT, NoneT,
2990 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
2991 typedef Templates36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2992 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
2993 T28, T29, T30, T31, T32, T33, T34, T35, T36> type;
2994 };
2995 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2996 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2997 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2998 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2999 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
3000 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
3001 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
3002 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
3003 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
3004 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
3005 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
3006 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
3007 GTEST_TEMPLATE_ T37>
3008 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
3009 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
3010 T30, T31, T32, T33, T34, T35, T36, T37, NoneT, NoneT, NoneT, NoneT, NoneT,
3011 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
3012 typedef Templates37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
3013 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
3014 T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;
3015 };
3016 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
3017 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
3018 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
3019 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
3020 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
3021 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
3022 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
3023 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
3024 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
3025 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
3026 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
3027 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
3028 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>
3029 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
3030 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
3031 T30, T31, T32, T33, T34, T35, T36, T37, T38, NoneT, NoneT, NoneT, NoneT,
3032 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
3033 typedef Templates38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
3034 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
3035 T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;
3036 };
3037 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
3038 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
3039 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
3040 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
3041 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
3042 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
3043 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
3044 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
3045 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
3046 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
3047 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
3048 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
3049 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>
3050 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
3051 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
3052 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, NoneT, NoneT, NoneT,
3053 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
3054 typedef Templates39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
3055 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
3056 T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;
3057 };
3058 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
3059 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
3060 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
3061 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
3062 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
3063 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
3064 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
3065 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
3066 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
3067 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
3068 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
3069 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
3070 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
3071 GTEST_TEMPLATE_ T40>
3072 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
3073 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
3074 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, NoneT, NoneT, NoneT,
3075 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
3076 typedef Templates40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
3077 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
3078 T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> type;
3079 };
3080 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
3081 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
3082 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
3083 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
3084 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
3085 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
3086 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
3087 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
3088 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
3089 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
3090 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
3091 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
3092 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
3093 GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>
3094 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
3095 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
3096 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, NoneT, NoneT,
3097 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
3098 typedef Templates41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
3099 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
3100 T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
3101 T41> type;
3102 };
3103 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
3104 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
3105 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
3106 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
3107 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
3108 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
3109 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
3110 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
3111 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
3112 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
3113 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
3114 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
3115 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
3116 GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>
3117 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
3118 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
3119 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, NoneT,
3120 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
3121 typedef Templates42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
3122 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
3123 T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
3124 T42> type;
3125 };
3126 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
3127 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
3128 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
3129 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
3130 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
3131 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
3132 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
3133 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
3134 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
3135 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
3136 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
3137 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
3138 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
3139 GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
3140 GTEST_TEMPLATE_ T43>
3141 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
3142 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
3143 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
3144 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
3145 typedef Templates43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
3146 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
3147 T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
3148 T42, T43> type;
3149 };
3150 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
3151 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
3152 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
3153 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
3154 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
3155 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
3156 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
3157 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
3158 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
3159 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
3160 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
3161 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
3162 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
3163 GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
3164 GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>
3165 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
3166 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
3167 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
3168 NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
3169 typedef Templates44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
3170 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
3171 T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
3172 T42, T43, T44> type;
3173 };
3174 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
3175 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
3176 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
3177 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
3178 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
3179 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
3180 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
3181 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
3182 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
3183 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
3184 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
3185 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
3186 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
3187 GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
3188 GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>
3189 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
3190 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
3191 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
3192 T45, NoneT, NoneT, NoneT, NoneT, NoneT> {
3193 typedef Templates45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
3194 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
3195 T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
3196 T42, T43, T44, T45> type;
3197 };
3198 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
3199 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
3200 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
3201 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
3202 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
3203 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
3204 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
3205 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
3206 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
3207 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
3208 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
3209 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
3210 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
3211 GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
3212 GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
3213 GTEST_TEMPLATE_ T46>
3214 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
3215 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
3216 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
3217 T45, T46, NoneT, NoneT, NoneT, NoneT> {
3218 typedef Templates46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
3219 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
3220 T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
3221 T42, T43, T44, T45, T46> type;
3222 };
3223 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
3224 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
3225 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
3226 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
3227 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
3228 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
3229 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
3230 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
3231 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
3232 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
3233 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
3234 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
3235 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
3236 GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
3237 GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
3238 GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>
3239 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
3240 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
3241 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
3242 T45, T46, T47, NoneT, NoneT, NoneT> {
3243 typedef Templates47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
3244 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
3245 T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
3246 T42, T43, T44, T45, T46, T47> type;
3247 };
3248 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
3249 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
3250 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
3251 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
3252 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
3253 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
3254 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
3255 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
3256 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
3257 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
3258 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
3259 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
3260 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
3261 GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
3262 GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
3263 GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>
3264 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
3265 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
3266 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
3267 T45, T46, T47, T48, NoneT, NoneT> {
3268 typedef Templates48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
3269 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
3270 T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
3271 T42, T43, T44, T45, T46, T47, T48> type;
3272 };
3273 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
3274 GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
3275 GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
3276 GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
3277 GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
3278 GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
3279 GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
3280 GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
3281 GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
3282 GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
3283 GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
3284 GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
3285 GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
3286 GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
3287 GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
3288 GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
3289 GTEST_TEMPLATE_ T49>
3290 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
3291 T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
3292 T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
3293 T45, T46, T47, T48, T49, NoneT> {
3294 typedef Templates49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
3295 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
3296 T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
3297 T42, T43, T44, T45, T46, T47, T48, T49> type;
3298 };
3299
3300 // The TypeList template makes it possible to use either a single type
3301 // or a Types<...> list in TYPED_TEST_SUITE() and
3302 // INSTANTIATE_TYPED_TEST_SUITE_P().
3303
3304 template <typename T>
3305 struct TypeList {
3306 typedef Types1<T> type;
3307 };
3308
3309 template <typename T1, typename T2, typename T3, typename T4, typename T5,
3310 typename T6, typename T7, typename T8, typename T9, typename T10,
3311 typename T11, typename T12, typename T13, typename T14, typename T15,
3312 typename T16, typename T17, typename T18, typename T19, typename T20,
3313 typename T21, typename T22, typename T23, typename T24, typename T25,
3314 typename T26, typename T27, typename T28, typename T29, typename T30,
3315 typename T31, typename T32, typename T33, typename T34, typename T35,
3316 typename T36, typename T37, typename T38, typename T39, typename T40,
3317 typename T41, typename T42, typename T43, typename T44, typename T45,
3318 typename T46, typename T47, typename T48, typename T49, typename T50>
3319 struct TypeList<Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
3320 T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
3321 T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
3322 T44, T45, T46, T47, T48, T49, T50> > {
3323 typedef typename Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
3324 T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
3325 T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
3326 T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>::type type;
169 public:
170 using type = typename proxy::type;
3327171 };
3328172
3329173 #endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
3330174
3331175 } // namespace internal
176
177 template <typename... Ts>
178 using Types = internal::ProxyTypeList<Ts...>;
179
3332180 } // namespace testing
3333181
3334182 #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
+0
-302
third_party/googletest/src/include/gtest/internal/gtest-type-util.h.pump less more
0 $$ -*- mode: c++; -*-
1 $var n = 50 $$ Maximum length of type lists we want to support.
2 // Copyright 2008 Google Inc.
3 // All Rights Reserved.
4 //
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are
7 // met:
8 //
9 // * Redistributions of source code must retain the above copyright
10 // notice, this list of conditions and the following disclaimer.
11 // * Redistributions in binary form must reproduce the above
12 // copyright notice, this list of conditions and the following disclaimer
13 // in the documentation and/or other materials provided with the
14 // distribution.
15 // * Neither the name of Google Inc. nor the names of its
16 // contributors may be used to endorse or promote products derived from
17 // this software without specific prior written permission.
18 //
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
31
32 // Type utilities needed for implementing typed and type-parameterized
33 // tests. This file is generated by a SCRIPT. DO NOT EDIT BY HAND!
34 //
35 // Currently we support at most $n types in a list, and at most $n
36 // type-parameterized tests in one type-parameterized test suite.
37 // Please contact googletestframework@googlegroups.com if you need
38 // more.
39
40 // GOOGLETEST_CM0001 DO NOT DELETE
41
42 #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
43 #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
44
45 #include "gtest/internal/gtest-port.h"
46
47 // #ifdef __GNUC__ is too general here. It is possible to use gcc without using
48 // libstdc++ (which is where cxxabi.h comes from).
49 # if GTEST_HAS_CXXABI_H_
50 # include <cxxabi.h>
51 # elif defined(__HP_aCC)
52 # include <acxx_demangle.h>
53 # endif // GTEST_HASH_CXXABI_H_
54
55 namespace testing {
56 namespace internal {
57
58 // Canonicalizes a given name with respect to the Standard C++ Library.
59 // This handles removing the inline namespace within `std` that is
60 // used by various standard libraries (e.g., `std::__1`). Names outside
61 // of namespace std are returned unmodified.
62 inline std::string CanonicalizeForStdLibVersioning(std::string s) {
63 static const char prefix[] = "std::__";
64 if (s.compare(0, strlen(prefix), prefix) == 0) {
65 std::string::size_type end = s.find("::", strlen(prefix));
66 if (end != s.npos) {
67 // Erase everything between the initial `std` and the second `::`.
68 s.erase(strlen("std"), end - strlen("std"));
69 }
70 }
71 return s;
72 }
73
74 // GetTypeName<T>() returns a human-readable name of type T.
75 // NB: This function is also used in Google Mock, so don't move it inside of
76 // the typed-test-only section below.
77 template <typename T>
78 std::string GetTypeName() {
79 # if GTEST_HAS_RTTI
80
81 const char* const name = typeid(T).name();
82 # if GTEST_HAS_CXXABI_H_ || defined(__HP_aCC)
83 int status = 0;
84 // gcc's implementation of typeid(T).name() mangles the type name,
85 // so we have to demangle it.
86 # if GTEST_HAS_CXXABI_H_
87 using abi::__cxa_demangle;
88 # endif // GTEST_HAS_CXXABI_H_
89 char* const readable_name = __cxa_demangle(name, nullptr, nullptr, &status);
90 const std::string name_str(status == 0 ? readable_name : name);
91 free(readable_name);
92 return CanonicalizeForStdLibVersioning(name_str);
93 # else
94 return name;
95 # endif // GTEST_HAS_CXXABI_H_ || __HP_aCC
96
97 # else
98
99 return "<type>";
100
101 # endif // GTEST_HAS_RTTI
102 }
103
104 #if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
105
106 // A unique type used as the default value for the arguments of class
107 // template Types. This allows us to simulate variadic templates
108 // (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't
109 // support directly.
110 struct None {};
111
112 // The following family of struct and struct templates are used to
113 // represent type lists. In particular, TypesN<T1, T2, ..., TN>
114 // represents a type list with N types (T1, T2, ..., and TN) in it.
115 // Except for Types0, every struct in the family has two member types:
116 // Head for the first type in the list, and Tail for the rest of the
117 // list.
118
119 // The empty type list.
120 struct Types0 {};
121
122 // Type lists of length 1, 2, 3, and so on.
123
124 template <typename T1>
125 struct Types1 {
126 typedef T1 Head;
127 typedef Types0 Tail;
128 };
129
130 $range i 2..n
131
132 $for i [[
133 $range j 1..i
134 $range k 2..i
135 template <$for j, [[typename T$j]]>
136 struct Types$i {
137 typedef T1 Head;
138 typedef Types$(i-1)<$for k, [[T$k]]> Tail;
139 };
140
141
142 ]]
143
144 } // namespace internal
145
146 // We don't want to require the users to write TypesN<...> directly,
147 // as that would require them to count the length. Types<...> is much
148 // easier to write, but generates horrible messages when there is a
149 // compiler error, as gcc insists on printing out each template
150 // argument, even if it has the default value (this means Types<int>
151 // will appear as Types<int, None, None, ..., None> in the compiler
152 // errors).
153 //
154 // Our solution is to combine the best part of the two approaches: a
155 // user would write Types<T1, ..., TN>, and Google Test will translate
156 // that to TypesN<T1, ..., TN> internally to make error messages
157 // readable. The translation is done by the 'type' member of the
158 // Types template.
159
160 $range i 1..n
161 template <$for i, [[typename T$i = internal::None]]>
162 struct Types {
163 typedef internal::Types$n<$for i, [[T$i]]> type;
164 };
165
166 template <>
167 struct Types<$for i, [[internal::None]]> {
168 typedef internal::Types0 type;
169 };
170
171 $range i 1..n-1
172 $for i [[
173 $range j 1..i
174 $range k i+1..n
175 template <$for j, [[typename T$j]]>
176 struct Types<$for j, [[T$j]]$for k[[, internal::None]]> {
177 typedef internal::Types$i<$for j, [[T$j]]> type;
178 };
179
180 ]]
181
182 namespace internal {
183
184 # define GTEST_TEMPLATE_ template <typename T> class
185
186 // The template "selector" struct TemplateSel<Tmpl> is used to
187 // represent Tmpl, which must be a class template with one type
188 // parameter, as a type. TemplateSel<Tmpl>::Bind<T>::type is defined
189 // as the type Tmpl<T>. This allows us to actually instantiate the
190 // template "selected" by TemplateSel<Tmpl>.
191 //
192 // This trick is necessary for simulating typedef for class templates,
193 // which C++ doesn't support directly.
194 template <GTEST_TEMPLATE_ Tmpl>
195 struct TemplateSel {
196 template <typename T>
197 struct Bind {
198 typedef Tmpl<T> type;
199 };
200 };
201
202 # define GTEST_BIND_(TmplSel, T) \
203 TmplSel::template Bind<T>::type
204
205 // A unique struct template used as the default value for the
206 // arguments of class template Templates. This allows us to simulate
207 // variadic templates (e.g. Templates<int>, Templates<int, double>,
208 // and etc), which C++ doesn't support directly.
209 template <typename T>
210 struct NoneT {};
211
212 // The following family of struct and struct templates are used to
213 // represent template lists. In particular, TemplatesN<T1, T2, ...,
214 // TN> represents a list of N templates (T1, T2, ..., and TN). Except
215 // for Templates0, every struct in the family has two member types:
216 // Head for the selector of the first template in the list, and Tail
217 // for the rest of the list.
218
219 // The empty template list.
220 struct Templates0 {};
221
222 // Template lists of length 1, 2, 3, and so on.
223
224 template <GTEST_TEMPLATE_ T1>
225 struct Templates1 {
226 typedef TemplateSel<T1> Head;
227 typedef Templates0 Tail;
228 };
229
230 $range i 2..n
231
232 $for i [[
233 $range j 1..i
234 $range k 2..i
235 template <$for j, [[GTEST_TEMPLATE_ T$j]]>
236 struct Templates$i {
237 typedef TemplateSel<T1> Head;
238 typedef Templates$(i-1)<$for k, [[T$k]]> Tail;
239 };
240
241
242 ]]
243
244 // We don't want to require the users to write TemplatesN<...> directly,
245 // as that would require them to count the length. Templates<...> is much
246 // easier to write, but generates horrible messages when there is a
247 // compiler error, as gcc insists on printing out each template
248 // argument, even if it has the default value (this means Templates<list>
249 // will appear as Templates<list, NoneT, NoneT, ..., NoneT> in the compiler
250 // errors).
251 //
252 // Our solution is to combine the best part of the two approaches: a
253 // user would write Templates<T1, ..., TN>, and Google Test will translate
254 // that to TemplatesN<T1, ..., TN> internally to make error messages
255 // readable. The translation is done by the 'type' member of the
256 // Templates template.
257
258 $range i 1..n
259 template <$for i, [[GTEST_TEMPLATE_ T$i = NoneT]]>
260 struct Templates {
261 typedef Templates$n<$for i, [[T$i]]> type;
262 };
263
264 template <>
265 struct Templates<$for i, [[NoneT]]> {
266 typedef Templates0 type;
267 };
268
269 $range i 1..n-1
270 $for i [[
271 $range j 1..i
272 $range k i+1..n
273 template <$for j, [[GTEST_TEMPLATE_ T$j]]>
274 struct Templates<$for j, [[T$j]]$for k[[, NoneT]]> {
275 typedef Templates$i<$for j, [[T$j]]> type;
276 };
277
278 ]]
279
280 // The TypeList template makes it possible to use either a single type
281 // or a Types<...> list in TYPED_TEST_SUITE() and
282 // INSTANTIATE_TYPED_TEST_SUITE_P().
283
284 template <typename T>
285 struct TypeList {
286 typedef Types1<T> type;
287 };
288
289
290 $range i 1..n
291 template <$for i, [[typename T$i]]>
292 struct TypeList<Types<$for i, [[T$i]]> > {
293 typedef typename Types<$for i, [[T$i]]>::type type;
294 };
295
296 #endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
297
298 } // namespace internal
299 } // namespace testing
300
301 #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
13631363
13641364 if (!use_fork) {
13651365 static const bool stack_grows_down = StackGrowsDown();
1366 const auto stack_size = static_cast<size_t>(getpagesize());
1366 const auto stack_size = static_cast<size_t>(getpagesize() * 2);
13671367 // MMAP_ANONYMOUS is not defined on Mac, so we use MAP_ANON instead.
13681368 void* const stack = mmap(nullptr, stack_size, PROT_READ | PROT_WRITE,
13691369 MAP_ANON | MAP_PRIVATE, -1, 0);
9292 // Returns the current working directory, or "" if unsuccessful.
9393 FilePath FilePath::GetCurrentDir() {
9494 #if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || \
95 GTEST_OS_WINDOWS_RT || ARDUINO || defined(ESP_PLATFORM)
95 GTEST_OS_WINDOWS_RT || GTEST_OS_ESP8266 || GTEST_OS_ESP32
9696 // These platforms do not have a current directory, so we just return
9797 // something reasonable.
9898 return FilePath(kCurrentDirectoryString);
322322 delete [] unicode;
323323 #elif GTEST_OS_WINDOWS
324324 int result = _mkdir(pathname_.c_str());
325 #elif GTEST_OS_ESP8266
326 // do nothing
327 int result = 0;
325328 #else
326329 int result = mkdir(pathname_.c_str(), 0777);
327330 #endif // GTEST_OS_WINDOWS_MOBILE
4141 #include <string.h> // For memmove.
4242
4343 #include <algorithm>
44 #include <cstdint>
4445 #include <memory>
4546 #include <string>
4647 #include <vector>
122123 // On success, stores the value of the flag in *value, and returns
123124 // true. On failure, returns false without changing *value.
124125 GTEST_API_ bool ParseInt32Flag(
125 const char* str, const char* flag, Int32* value);
126 const char* str, const char* flag, int32_t* value);
126127
127128 // Returns a random seed in range [1, kMaxRandomSeed] based on the
128129 // given --gtest_random_seed flag value.
129 inline int GetRandomSeedFromFlag(Int32 random_seed_flag) {
130 inline int GetRandomSeedFromFlag(int32_t random_seed_flag) {
130131 const unsigned int raw_seed = (random_seed_flag == 0) ?
131132 static_cast<unsigned int>(GetTimeInMillis()) :
132133 static_cast<unsigned int>(random_seed_flag);
212213 std::string output_;
213214 bool print_time_;
214215 bool print_utf8_;
215 internal::Int32 random_seed_;
216 internal::Int32 repeat_;
216 int32_t random_seed_;
217 int32_t repeat_;
217218 bool shuffle_;
218 internal::Int32 stack_trace_depth_;
219 int32_t stack_trace_depth_;
219220 std::string stream_result_to_;
220221 bool throw_on_failure_;
221222 } GTEST_ATTRIBUTE_UNUSED_;
226227 // If the code_point is not a valid Unicode code point
227228 // (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted
228229 // to "(Invalid Unicode 0xXXXXXXXX)".
229 GTEST_API_ std::string CodePointToUtf8(UInt32 code_point);
230 GTEST_API_ std::string CodePointToUtf8(uint32_t code_point);
230231
231232 // Converts a wide string to a narrow string in UTF-8 encoding.
232233 // The wide string is assumed to have the following encoding:
259260 const char* shard_index_str,
260261 bool in_subprocess_for_death_test);
261262
262 // Parses the environment variable var as an Int32. If it is unset,
263 // returns default_val. If it is not an Int32, prints an error and
263 // Parses the environment variable var as a 32-bit integer. If it is unset,
264 // returns default_val. If it is not a 32-bit integer, prints an error and
264265 // and aborts.
265 GTEST_API_ Int32 Int32FromEnvOrDie(const char* env_var, Int32 default_val);
266 GTEST_API_ int32_t Int32FromEnvOrDie(const char* env_var, int32_t default_val);
266267
267268 // Given the total number of shards, the shard index, and the test id,
268269 // returns true if and only if the test should be run on this shard. The test id
322323 const int last_in_range = begin + range_width - 1;
323324 const int selected =
324325 begin +
325 static_cast<int>(random->Generate(static_cast<UInt32>(range_width)));
326 static_cast<int>(random->Generate(static_cast<uint32_t>(range_width)));
326327 std::swap((*v)[static_cast<size_t>(selected)],
327328 (*v)[static_cast<size_t>(last_in_range)]);
328329 }
696697 return parameterized_test_registry_;
697698 }
698699
700 std::set<std::string>* ignored_parameterized_test_suites() {
701 return &ignored_parameterized_test_suites_;
702 }
703
704 // Returns TypeParameterizedTestSuiteRegistry object used to keep track of
705 // type-parameterized tests and instantiations of them.
706 internal::TypeParameterizedTestSuiteRegistry&
707 type_parameterized_test_registry() {
708 return type_parameterized_test_registry_;
709 }
710
699711 // Sets the TestSuite object for the test that's currently running.
700712 void set_current_test_suite(TestSuite* a_current_test_suite) {
701713 current_test_suite_ = a_current_test_suite;
872884 // ParameterizedTestRegistry object used to register value-parameterized
873885 // tests.
874886 internal::ParameterizedTestSuiteRegistry parameterized_test_registry_;
887 internal::TypeParameterizedTestSuiteRegistry
888 type_parameterized_test_registry_;
889
890 // The set holding the name of parameterized
891 // test suites that may go uninstantiated.
892 std::set<std::string> ignored_parameterized_test_suites_;
875893
876894 // Indicates whether RegisterParameterizedTests() has been called already.
877895 bool parameterized_tests_registered_;
9981016 char* end;
9991017 // BiggestConvertible is the largest integer type that system-provided
10001018 // string-to-number conversion routines can return.
1001
1002 # if GTEST_OS_WINDOWS && !defined(__GNUC__)
1003
1004 // MSVC and C++ Builder define __int64 instead of the standard long long.
1005 typedef unsigned __int64 BiggestConvertible;
1006 const BiggestConvertible parsed = _strtoui64(str.c_str(), &end, 10);
1007
1008 # else
1009
1010 typedef unsigned long long BiggestConvertible; // NOLINT
1011 const BiggestConvertible parsed = strtoull(str.c_str(), &end, 10);
1012
1013 # endif // GTEST_OS_WINDOWS && !defined(__GNUC__)
1014
1019 using BiggestConvertible = unsigned long long; // NOLINT
1020
1021 const BiggestConvertible parsed = strtoull(str.c_str(), &end, 10); // NOLINT
10151022 const bool parse_success = *end == '\0' && errno == 0;
10161023
10171024 GTEST_CHECK_(sizeof(Integer) <= sizeof(parsed));
5757 // s.
5858 Matcher<std::string>::Matcher(const char* s) { *this = Eq(std::string(s)); }
5959
60 #if GTEST_HAS_ABSL
61 // Constructs a matcher that matches a const absl::string_view& whose value is
60 #if GTEST_INTERNAL_HAS_STRING_VIEW
61 // Constructs a matcher that matches a const StringView& whose value is
6262 // equal to s.
63 Matcher<const absl::string_view&>::Matcher(const std::string& s) {
63 Matcher<const internal::StringView&>::Matcher(const std::string& s) {
6464 *this = Eq(s);
6565 }
6666
67 // Constructs a matcher that matches a const absl::string_view& whose value is
67 // Constructs a matcher that matches a const StringView& whose value is
6868 // equal to s.
69 Matcher<const absl::string_view&>::Matcher(const char* s) {
69 Matcher<const internal::StringView&>::Matcher(const char* s) {
7070 *this = Eq(std::string(s));
7171 }
7272
73 // Constructs a matcher that matches a const absl::string_view& whose value is
73 // Constructs a matcher that matches a const StringView& whose value is
7474 // equal to s.
75 Matcher<const absl::string_view&>::Matcher(absl::string_view s) {
75 Matcher<const internal::StringView&>::Matcher(internal::StringView s) {
7676 *this = Eq(std::string(s));
7777 }
7878
79 // Constructs a matcher that matches a absl::string_view whose value is equal to
79 // Constructs a matcher that matches a StringView whose value is equal to
8080 // s.
81 Matcher<absl::string_view>::Matcher(const std::string& s) { *this = Eq(s); }
81 Matcher<internal::StringView>::Matcher(const std::string& s) { *this = Eq(s); }
8282
83 // Constructs a matcher that matches a absl::string_view whose value is equal to
83 // Constructs a matcher that matches a StringView whose value is equal to
8484 // s.
85 Matcher<absl::string_view>::Matcher(const char* s) {
85 Matcher<internal::StringView>::Matcher(const char* s) {
8686 *this = Eq(std::string(s));
8787 }
8888
89 // Constructs a matcher that matches a absl::string_view whose value is equal to
89 // Constructs a matcher that matches a StringView whose value is equal to
9090 // s.
91 Matcher<absl::string_view>::Matcher(absl::string_view s) {
91 Matcher<internal::StringView>::Matcher(internal::StringView s) {
9292 *this = Eq(std::string(s));
9393 }
94 #endif // GTEST_HAS_ABSL
94 #endif // GTEST_INTERNAL_HAS_STRING_VIEW
9595
9696 } // namespace testing
3333 #include <stdio.h>
3434 #include <stdlib.h>
3535 #include <string.h>
36 #include <cstdint>
3637 #include <fstream>
3738 #include <memory>
3839
535536 // Returns a value that can be used to identify the thread from other threads.
536537 static ThreadLocalValueHolderBase* GetValueOnCurrentThread(
537538 const ThreadLocalBase* thread_local_instance) {
539 #ifdef _MSC_VER
540 MemoryIsNotDeallocated memory_is_not_deallocated;
541 #endif // _MSC_VER
538542 DWORD current_thread = ::GetCurrentThreadId();
539543 MutexLock lock(&mutex_);
540544 ThreadIdToThreadLocals* const thread_to_thread_locals =
12851289 // Parses 'str' for a 32-bit signed integer. If successful, writes
12861290 // the result to *value and returns true; otherwise leaves *value
12871291 // unchanged and returns false.
1288 bool ParseInt32(const Message& src_text, const char* str, Int32* value) {
1292 bool ParseInt32(const Message& src_text, const char* str, int32_t* value) {
12891293 // Parses the environment variable as a decimal integer.
12901294 char* end = nullptr;
12911295 const long long_value = strtol(str, &end, 10); // NOLINT
13021306 return false;
13031307 }
13041308
1305 // Is the parsed value in the range of an Int32?
1306 const Int32 result = static_cast<Int32>(long_value);
1309 // Is the parsed value in the range of an int32_t?
1310 const auto result = static_cast<int32_t>(long_value);
13071311 if (long_value == LONG_MAX || long_value == LONG_MIN ||
13081312 // The parsed value overflows as a long. (strtol() returns
13091313 // LONG_MAX or LONG_MIN when the input overflows.)
13101314 result != long_value
1311 // The parsed value overflows as an Int32.
1315 // The parsed value overflows as an int32_t.
13121316 ) {
13131317 Message msg;
13141318 msg << "WARNING: " << src_text
13411345 // Reads and returns a 32-bit integer stored in the environment
13421346 // variable corresponding to the given flag; if it isn't set or
13431347 // doesn't represent a valid 32-bit integer, returns default_value.
1344 Int32 Int32FromGTestEnv(const char* flag, Int32 default_value) {
1348 int32_t Int32FromGTestEnv(const char* flag, int32_t default_value) {
13451349 #if defined(GTEST_GET_INT32_FROM_ENV_)
13461350 return GTEST_GET_INT32_FROM_ENV_(flag, default_value);
13471351 #else
13521356 return default_value;
13531357 }
13541358
1355 Int32 result = default_value;
1359 int32_t result = default_value;
13561360 if (!ParseInt32(Message() << "Environment variable " << env_var,
13571361 string_value, &result)) {
13581362 printf("The default value %s is used.\n",
3030 // The Google C++ Testing and Mocking Framework (Google Test)
3131
3232 #include "gtest/gtest-test-part.h"
33
34 #include "gtest/internal/gtest-port.h"
3335 #include "src/gtest-internal-inl.h"
3436
3537 namespace testing {
4547
4648 // Prints a TestPartResult object.
4749 std::ostream& operator<<(std::ostream& os, const TestPartResult& result) {
48 return os << result.file_name() << ":" << result.line_number() << ": "
50 return os << internal::FormatFileLocation(result.file_name(),
51 result.line_number())
52 << " "
4953 << (result.type() == TestPartResult::kSuccess
5054 ? "Success"
5155 : result.type() == TestPartResult::kSkip
5757 // registered_tests_; returns registered_tests if successful, or
5858 // aborts the program otherwise.
5959 const char* TypedTestSuitePState::VerifyRegisteredTestNames(
60 const char* file, int line, const char* registered_tests) {
60 const char* test_suite_name, const char* file, int line,
61 const char* registered_tests) {
62 RegisterTypeParameterizedTestSuite(test_suite_name, CodeLocation(file, line));
63
6164 typedef RegisteredTestsMap::const_iterator RegisteredTestIter;
6265 registered_ = true;
6366
4343 #include <wctype.h>
4444
4545 #include <algorithm>
46 #include <cstdint>
4647 #include <iomanip>
4748 #include <limits>
4849 #include <list>
8283 # include <windows.h> // NOLINT
8384 # undef min
8485
86 #ifdef _MSC_VER
8587 # include <crtdbg.h> // NOLINT
8688 # include <debugapi.h> // NOLINT
89 #endif
90
8791 # include <io.h> // NOLINT
8892 # include <sys/timeb.h> // NOLINT
8993 # include <sys/types.h> // NOLINT
329333 // Generates a random number from [0, range), using a Linear
330334 // Congruential Generator (LCG). Crashes if 'range' is 0 or greater
331335 // than kMaxRange.
332 UInt32 Random::Generate(UInt32 range) {
336 uint32_t Random::Generate(uint32_t range) {
333337 // These constants are the same as are used in glibc's rand(3).
334338 // Use wider types than necessary to prevent unsigned overflow diagnostics.
335 state_ = static_cast<UInt32>(1103515245ULL*state_ + 12345U) % kMaxRange;
339 state_ = static_cast<uint32_t>(1103515245ULL*state_ + 12345U) % kMaxRange;
336340
337341 GTEST_CHECK_(range > 0)
338342 << "Cannot generate a number in the range [0, 0).";
400404 ->CurrentOsStackTraceExceptTop(1)
401405 // Skips the stack frame for this function itself.
402406 ); // NOLINT
407 }
408
409 namespace {
410
411 // When TEST_P is found without a matching INSTANTIATE_TEST_SUITE_P
412 // to creates test cases for it, a syntetic test case is
413 // inserted to report ether an error or a log message.
414 //
415 // This configuration bit will likely be removed at some point.
416 constexpr bool kErrorOnUninstantiatedParameterizedTest = true;
417 constexpr bool kErrorOnUninstantiatedTypeParameterizedTest = true;
418
419 // A test that fails at a given file/line location with a given message.
420 class FailureTest : public Test {
421 public:
422 explicit FailureTest(const CodeLocation& loc, std::string error_message,
423 bool as_error)
424 : loc_(loc),
425 error_message_(std::move(error_message)),
426 as_error_(as_error) {}
427
428 void TestBody() override {
429 if (as_error_) {
430 AssertHelper(TestPartResult::kNonFatalFailure, loc_.file.c_str(),
431 loc_.line, "") = Message() << error_message_;
432 } else {
433 std::cout << error_message_ << std::endl;
434 }
435 }
436
437 private:
438 const CodeLocation loc_;
439 const std::string error_message_;
440 const bool as_error_;
441 };
442
443
444 } // namespace
445
446 std::set<std::string>* GetIgnoredParameterizedTestSuites() {
447 return UnitTest::GetInstance()->impl()->ignored_parameterized_test_suites();
448 }
449
450 // Add a given test_suit to the list of them allow to go un-instantiated.
451 MarkAsIgnored::MarkAsIgnored(const char* test_suite) {
452 GetIgnoredParameterizedTestSuites()->insert(test_suite);
453 }
454
455 // If this parameterized test suite has no instantiations (and that
456 // has not been marked as okay), emit a test case reporting that.
457 void InsertSyntheticTestCase(const std::string& name, CodeLocation location,
458 bool has_test_p) {
459 const auto& ignored = *GetIgnoredParameterizedTestSuites();
460 if (ignored.find(name) != ignored.end()) return;
461
462 const char kMissingInstantiation[] = //
463 " is defined via TEST_P, but never instantiated. None of the test cases "
464 "will run. Either no INSTANTIATE_TEST_SUITE_P is provided or the only "
465 "ones provided expand to nothing."
466 "\n\n"
467 "Ideally, TEST_P definitions should only ever be included as part of "
468 "binaries that intend to use them. (As opposed to, for example, being "
469 "placed in a library that may be linked in to get other utilities.)";
470
471 const char kMissingTestCase[] = //
472 " is instantiated via INSTANTIATE_TEST_SUITE_P, but no tests are "
473 "defined via TEST_P . No test cases will run."
474 "\n\n"
475 "Ideally, INSTANTIATE_TEST_SUITE_P should only ever be invoked from "
476 "code that always depend on code that provides TEST_P. Failing to do "
477 "so is often an indication of dead code, e.g. the last TEST_P was "
478 "removed but the rest got left behind.";
479
480 std::string message =
481 "Paramaterized test suite " + name +
482 (has_test_p ? kMissingInstantiation : kMissingTestCase) +
483 "\n\n"
484 "To suppress this error for this test suite, insert the following line "
485 "(in a non-header) in the namespace it is defined in:"
486 "\n\n"
487 "GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(" + name + ");";
488
489 std::string full_name = "UninstantiatedParamaterizedTestSuite<" + name + ">";
490 RegisterTest( //
491 "GoogleTestVerification", full_name.c_str(),
492 nullptr, // No type parameter.
493 nullptr, // No value parameter.
494 location.file.c_str(), location.line, [message, location] {
495 return new FailureTest(location, message,
496 kErrorOnUninstantiatedParameterizedTest);
497 });
498 }
499
500 void RegisterTypeParameterizedTestSuite(const char* test_suite_name,
501 CodeLocation code_location) {
502 GetUnitTestImpl()->type_parameterized_test_registry().RegisterTestSuite(
503 test_suite_name, code_location);
504 }
505
506 void RegisterTypeParameterizedTestSuiteInstantiation(const char* case_name) {
507 GetUnitTestImpl()
508 ->type_parameterized_test_registry()
509 .RegisterInstantiation(case_name);
510 }
511
512 void TypeParameterizedTestSuiteRegistry::RegisterTestSuite(
513 const char* test_suite_name, CodeLocation code_location) {
514 suites_.emplace(std::string(test_suite_name),
515 TypeParameterizedTestSuiteInfo(code_location));
516 }
517
518 void TypeParameterizedTestSuiteRegistry::RegisterInstantiation(
519 const char* test_suite_name) {
520 auto it = suites_.find(std::string(test_suite_name));
521 if (it != suites_.end()) {
522 it->second.instantiated = true;
523 } else {
524 GTEST_LOG_(ERROR) << "Unknown type parameterized test suit '"
525 << test_suite_name << "'";
526 }
527 }
528
529 void TypeParameterizedTestSuiteRegistry::CheckForInstantiations() {
530 const auto& ignored = *GetIgnoredParameterizedTestSuites();
531 for (const auto& testcase : suites_) {
532 if (testcase.second.instantiated) continue;
533 if (ignored.find(testcase.first) != ignored.end()) continue;
534
535 std::string message =
536 "Type paramaterized test suite " + testcase.first +
537 " is defined via REGISTER_TYPED_TEST_SUITE_P, but never instantiated "
538 "via INSTANTIATE_TYPED_TEST_SUITE_P. None of the test cases will run."
539 "\n\n"
540 "Ideally, TYPED_TEST_P definitions should only ever be included as "
541 "part of binaries that intend to use them. (As opposed to, for "
542 "example, being placed in a library that may be linked in to get other "
543 "utilities.)"
544 "\n\n"
545 "To suppress this error for this test suite, insert the following line "
546 "(in a non-header) in the namespace it is definedin in:"
547 "\n\n"
548 "GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(" +
549 testcase.first + ");";
550
551 std::string full_name =
552 "UninstantiatedTypeParamaterizedTestSuite<" + testcase.first + ">";
553 RegisterTest( //
554 "GoogleTestVerification", full_name.c_str(),
555 nullptr, // No type parameter.
556 nullptr, // No value parameter.
557 testcase.second.code_location.file.c_str(),
558 testcase.second.code_location.line, [message, testcase] {
559 return new FailureTest(testcase.second.code_location, message,
560 kErrorOnUninstantiatedTypeParameterizedTest);
561 });
562 }
403563 }
404564
405565 // A copy of all command line arguments. Set by InitGoogleTest().
17341894 // 17 - 21 bits 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
17351895
17361896 // The maximum code-point a one-byte UTF-8 sequence can represent.
1737 const UInt32 kMaxCodePoint1 = (static_cast<UInt32>(1) << 7) - 1;
1897 constexpr uint32_t kMaxCodePoint1 = (static_cast<uint32_t>(1) << 7) - 1;
17381898
17391899 // The maximum code-point a two-byte UTF-8 sequence can represent.
1740 const UInt32 kMaxCodePoint2 = (static_cast<UInt32>(1) << (5 + 6)) - 1;
1900 constexpr uint32_t kMaxCodePoint2 = (static_cast<uint32_t>(1) << (5 + 6)) - 1;
17411901
17421902 // The maximum code-point a three-byte UTF-8 sequence can represent.
1743 const UInt32 kMaxCodePoint3 = (static_cast<UInt32>(1) << (4 + 2*6)) - 1;
1903 constexpr uint32_t kMaxCodePoint3 = (static_cast<uint32_t>(1) << (4 + 2*6)) - 1;
17441904
17451905 // The maximum code-point a four-byte UTF-8 sequence can represent.
1746 const UInt32 kMaxCodePoint4 = (static_cast<UInt32>(1) << (3 + 3*6)) - 1;
1906 constexpr uint32_t kMaxCodePoint4 = (static_cast<uint32_t>(1) << (3 + 3*6)) - 1;
17471907
17481908 // Chops off the n lowest bits from a bit pattern. Returns the n
17491909 // lowest bits. As a side effect, the original bit pattern will be
17501910 // shifted to the right by n bits.
1751 inline UInt32 ChopLowBits(UInt32* bits, int n) {
1752 const UInt32 low_bits = *bits & ((static_cast<UInt32>(1) << n) - 1);
1911 inline uint32_t ChopLowBits(uint32_t* bits, int n) {
1912 const uint32_t low_bits = *bits & ((static_cast<uint32_t>(1) << n) - 1);
17531913 *bits >>= n;
17541914 return low_bits;
17551915 }
17561916
17571917 // Converts a Unicode code point to a narrow string in UTF-8 encoding.
1758 // code_point parameter is of type UInt32 because wchar_t may not be
1918 // code_point parameter is of type uint32_t because wchar_t may not be
17591919 // wide enough to contain a code point.
17601920 // If the code_point is not a valid Unicode code point
17611921 // (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted
17621922 // to "(Invalid Unicode 0xXXXXXXXX)".
1763 std::string CodePointToUtf8(UInt32 code_point) {
1923 std::string CodePointToUtf8(uint32_t code_point) {
17641924 if (code_point > kMaxCodePoint4) {
17651925 return "(Invalid Unicode 0x" + String::FormatHexUInt32(code_point) + ")";
17661926 }
18011961 }
18021962
18031963 // Creates a Unicode code point from UTF16 surrogate pair.
1804 inline UInt32 CreateCodePointFromUtf16SurrogatePair(wchar_t first,
1805 wchar_t second) {
1806 const auto first_u = static_cast<UInt32>(first);
1807 const auto second_u = static_cast<UInt32>(second);
1808 const UInt32 mask = (1 << 10) - 1;
1964 inline uint32_t CreateCodePointFromUtf16SurrogatePair(wchar_t first,
1965 wchar_t second) {
1966 const auto first_u = static_cast<uint32_t>(first);
1967 const auto second_u = static_cast<uint32_t>(second);
1968 const uint32_t mask = (1 << 10) - 1;
18091969 return (sizeof(wchar_t) == 2)
18101970 ? (((first_u & mask) << 10) | (second_u & mask)) + 0x10000
18111971 :
18331993
18341994 ::std::stringstream stream;
18351995 for (int i = 0; i < num_chars; ++i) {
1836 UInt32 unicode_code_point;
1996 uint32_t unicode_code_point;
18371997
18381998 if (str[i] == L'\0') {
18391999 break;
18422002 str[i + 1]);
18432003 i++;
18442004 } else {
1845 unicode_code_point = static_cast<UInt32>(str[i]);
2005 unicode_code_point = static_cast<uint32_t>(str[i]);
18462006 }
18472007
18482008 stream << CodePointToUtf8(unicode_code_point);
19682128 }
19692129
19702130 // Formats an int value as "%X".
1971 std::string String::FormatHexUInt32(UInt32 value) {
2131 std::string String::FormatHexUInt32(uint32_t value) {
19722132 std::stringstream ss;
19732133 ss << std::hex << std::uppercase << value;
19742134 return ss.str();
19762136
19772137 // Formats an int value as "%X".
19782138 std::string String::FormatHexInt(int value) {
1979 return FormatHexUInt32(static_cast<UInt32>(value));
2139 return FormatHexUInt32(static_cast<uint32_t>(value));
19802140 }
19812141
19822142 // Formats a byte as "%02X".
26452805 void UnitTestImpl::RegisterParameterizedTests() {
26462806 if (!parameterized_tests_registered_) {
26472807 parameterized_test_registry_.RegisterTests();
2808 type_parameterized_test_registry_.CheckForInstantiations();
26482809 parameterized_tests_registered_ = true;
26492810 }
26502811 }
31333294
31343295 private:
31353296 static void PrintFailedTests(const UnitTest& unit_test);
3297 static void PrintFailedTestSuites(const UnitTest& unit_test);
31363298 static void PrintSkippedTests(const UnitTest& unit_test);
31373299 };
31383300
31523314 }
31533315
31543316 if (internal::ShouldShard(kTestTotalShards, kTestShardIndex, false)) {
3155 const Int32 shard_index = Int32FromEnvOrDie(kTestShardIndex, -1);
3317 const int32_t shard_index = Int32FromEnvOrDie(kTestShardIndex, -1);
31563318 ColoredPrintf(COLOR_YELLOW,
31573319 "Note: This is test shard %d of %s.\n",
31583320 static_cast<int>(shard_index) + 1,
32193381 void PrettyUnitTestResultPrinter::OnTestPartResult(
32203382 const TestPartResult& result) {
32213383 switch (result.type()) {
3222 // If the test part succeeded, or was skipped,
3223 // we don't need to do anything.
3224 case TestPartResult::kSkip:
3384 // If the test part succeeded, we don't need to do anything.
32253385 case TestPartResult::kSuccess:
32263386 return;
32273387 default:
32873447 // Internal helper for printing the list of failed tests.
32883448 void PrettyUnitTestResultPrinter::PrintFailedTests(const UnitTest& unit_test) {
32893449 const int failed_test_count = unit_test.failed_test_count();
3290 if (failed_test_count == 0) {
3291 return;
3292 }
3450 ColoredPrintf(COLOR_RED, "[ FAILED ] ");
3451 printf("%s, listed below:\n", FormatTestCount(failed_test_count).c_str());
32933452
32943453 for (int i = 0; i < unit_test.total_test_suite_count(); ++i) {
32953454 const TestSuite& test_suite = *unit_test.GetTestSuite(i);
33073466 printf("\n");
33083467 }
33093468 }
3469 printf("\n%2d FAILED %s\n", failed_test_count,
3470 failed_test_count == 1 ? "TEST" : "TESTS");
3471 }
3472
3473 // Internal helper for printing the list of test suite failures not covered by
3474 // PrintFailedTests.
3475 void PrettyUnitTestResultPrinter::PrintFailedTestSuites(
3476 const UnitTest& unit_test) {
3477 int suite_failure_count = 0;
3478 for (int i = 0; i < unit_test.total_test_suite_count(); ++i) {
3479 const TestSuite& test_suite = *unit_test.GetTestSuite(i);
3480 if (!test_suite.should_run()) {
3481 continue;
3482 }
3483 if (test_suite.ad_hoc_test_result().Failed()) {
3484 ColoredPrintf(COLOR_RED, "[ FAILED ] ");
3485 printf("%s: SetUpTestSuite or TearDownTestSuite\n", test_suite.name());
3486 ++suite_failure_count;
3487 }
3488 }
3489 if (suite_failure_count > 0) {
3490 printf("\n%2d FAILED TEST %s\n", suite_failure_count,
3491 suite_failure_count == 1 ? "SUITE" : "SUITES");
3492 }
33103493 }
33113494
33123495 // Internal helper for printing the list of skipped tests.
33543537 PrintSkippedTests(unit_test);
33553538 }
33563539
3357 int num_failures = unit_test.failed_test_count();
33583540 if (!unit_test.Passed()) {
3359 const int failed_test_count = unit_test.failed_test_count();
3360 ColoredPrintf(COLOR_RED, "[ FAILED ] ");
3361 printf("%s, listed below:\n", FormatTestCount(failed_test_count).c_str());
33623541 PrintFailedTests(unit_test);
3363 printf("\n%2d FAILED %s\n", num_failures,
3364 num_failures == 1 ? "TEST" : "TESTS");
3542 PrintFailedTestSuites(unit_test);
33653543 }
33663544
33673545 int num_disabled = unit_test.reportable_disabled_test_count();
33683546 if (num_disabled && !GTEST_FLAG(also_run_disabled_tests)) {
3369 if (!num_failures) {
3547 if (unit_test.Passed()) {
33703548 printf("\n"); // Add a spacer if no FAILURE banner is displayed.
33713549 }
33723550 ColoredPrintf(COLOR_YELLOW,
45074685 }
45084686
45094687 ~ScopedPrematureExitFile() {
4688 #if !defined GTEST_OS_ESP8266
45104689 if (!premature_exit_filepath_.empty()) {
45114690 int retval = remove(premature_exit_filepath_.c_str());
45124691 if (retval) {
45154694 << retval;
45164695 }
45174696 }
4697 #endif
45184698 }
45194699
45204700 private:
49075087 _set_abort_behavior(
49085088 0x0, // Clear the following flags:
49095089 _WRITE_ABORT_MSG | _CALL_REPORTFAULT); // pop-up window, core dump.
4910 # endif
49115090
49125091 // In debug mode, the Windows CRT can crash with an assertion over invalid
49135092 // input (e.g. passing an invalid file descriptor). The default handling
49185097 _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
49195098 (void)_CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);
49205099 }
5100 # endif
49215101 }
49225102 #endif // GTEST_OS_WINDOWS
49235103
52985478
52995479 // Shuffles test suites and tests if requested.
53005480 if (has_tests_to_run && GTEST_FLAG(shuffle)) {
5301 random()->Reseed(static_cast<UInt32>(random_seed_));
5481 random()->Reseed(static_cast<uint32_t>(random_seed_));
53025482 // This should be done before calling OnTestIterationStart(),
53035483 // such that a test event listener can see the actual test order
53045484 // in the event.
54215601 return false;
54225602 }
54235603
5424 const Int32 total_shards = Int32FromEnvOrDie(total_shards_env, -1);
5425 const Int32 shard_index = Int32FromEnvOrDie(shard_index_env, -1);
5604 const int32_t total_shards = Int32FromEnvOrDie(total_shards_env, -1);
5605 const int32_t shard_index = Int32FromEnvOrDie(shard_index_env, -1);
54265606
54275607 if (total_shards == -1 && shard_index == -1) {
54285608 return false;
54595639 // Parses the environment variable var as an Int32. If it is unset,
54605640 // returns default_val. If it is not an Int32, prints an error
54615641 // and aborts.
5462 Int32 Int32FromEnvOrDie(const char* var, Int32 default_val) {
5642 int32_t Int32FromEnvOrDie(const char* var, int32_t default_val) {
54635643 const char* str_val = posix::GetEnv(var);
54645644 if (str_val == nullptr) {
54655645 return default_val;
54665646 }
54675647
5468 Int32 result;
5648 int32_t result;
54695649 if (!ParseInt32(Message() << "The value of environment variable " << var,
54705650 str_val, &result)) {
54715651 exit(EXIT_FAILURE);
54895669 // https://github.com/google/googletest/blob/master/googletest/docs/advanced.md
54905670 // . Returns the number of tests that should run.
54915671 int UnitTestImpl::FilterTests(ReactionToSharding shard_tests) {
5492 const Int32 total_shards = shard_tests == HONOR_SHARDING_PROTOCOL ?
5672 const int32_t total_shards = shard_tests == HONOR_SHARDING_PROTOCOL ?
54935673 Int32FromEnvOrDie(kTestTotalShards, -1) : -1;
5494 const Int32 shard_index = shard_tests == HONOR_SHARDING_PROTOCOL ?
5674 const int32_t shard_index = shard_tests == HONOR_SHARDING_PROTOCOL ?
54955675 Int32FromEnvOrDie(kTestShardIndex, -1) : -1;
54965676
54975677 // num_runnable_tests are the number of tests that will
57805960 return true;
57815961 }
57825962
5783 // Parses a string for an Int32 flag, in the form of
5784 // "--flag=value".
5963 // Parses a string for an int32_t flag, in the form of "--flag=value".
57855964 //
57865965 // On success, stores the value of the flag in *value, and returns
57875966 // true. On failure, returns false without changing *value.
5788 bool ParseInt32Flag(const char* str, const char* flag, Int32* value) {
5967 bool ParseInt32Flag(const char* str, const char* flag, int32_t* value) {
57895968 // Gets the value of the flag as a string.
57905969 const char* const value_str = ParseFlagValue(str, flag, false);
57915970
57975976 value_str, value);
57985977 }
57995978
5800 // Parses a string for a string flag, in the form of
5801 // "--flag=value".
5979 // Parses a string for a string flag, in the form of "--flag=value".
58025980 //
58035981 // On success, stores the value of the flag in *value, and returns
58045982 // true. On failure, returns false without changing *value.
61486326 else
61496327 return std::string(temp_dir) + "\\";
61506328 #elif GTEST_OS_LINUX_ANDROID
6151 return "/sdcard/";
6329 const char* temp_dir = internal::posix::GetEnv("TEST_TMPDIR");
6330 if (temp_dir == nullptr || temp_dir[0] == '\0')
6331 return "/data/local/tmp/";
6332 else
6333 return temp_dir;
61526334 #else
61536335 return "/tmp/";
61546336 #endif // GTEST_OS_WINDOWS_MOBILE
2929 #include <cstdio>
3030 #include "gtest/gtest.h"
3131
32 #ifdef ARDUINO
32 #if GTEST_OS_ESP8266 || GTEST_OS_ESP32
33 #if GTEST_OS_ESP8266
34 extern "C" {
35 #endif
3336 void setup() {
3437 testing::InitGoogleTest();
3538 }
3639
3740 void loop() { RUN_ALL_TESTS(); }
41
42 #if GTEST_OS_ESP8266
43 }
44 #endif
3845
3946 #else
4047
22 include $(CLEAR_VARS)
33 LOCAL_MODULE:= libwebm
44 LOCAL_CPPFLAGS:=-D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS
5 LOCAL_CPPFLAGS+=-D__STDC_LIMIT_MACROS -std=c++11
5 LOCAL_CPPFLAGS+=-D__STDC_LIMIT_MACROS -std=gnu++11
66 LOCAL_C_INCLUDES:= $(LOCAL_PATH)
77 LOCAL_EXPORT_C_INCLUDES:= $(LOCAL_PATH)
88
105105 for filename, affected_lines in file_affected_line_map.iteritems():
106106 if filename.split(".")[-1] not in ("c", "h", "cc"):
107107 continue
108 if filename.startswith("third_party"):
109 continue
108110
109111 if args:
110112 # File contents come from git
7878 --ver=$$(CONFIG_VS_VERSION)\
7979 --proj-guid=$$($$(@:.$(VCPROJ_SFX)=).GUID)\
8080 --src-path-bare="$(SRC_PATH_BARE)" \
81 --as=$$(AS) \
8182 $$(if $$(CONFIG_STATIC_MSVCRT),--static-crt) \
8283 --out=$$@ $$(INTERNAL_CFLAGS) $$(CFLAGS) \
8384 $$(INTERNAL_LDFLAGS) $$(LDFLAGS) $$^
1515 #include "vpx_ports/x86.h"
1616 #elif VPX_ARCH_PPC
1717 #include "vpx_ports/ppc.h"
18 #elif VPX_ARCH_MIPS
19 #include "vpx_ports/mips.h"
1820 #endif
1921 #include "vp8/common/onyxc_int.h"
2022 #include "vp8/common/systemdependent.h"
9597 ctx->cpu_caps = x86_simd_caps();
9698 #elif VPX_ARCH_PPC
9799 ctx->cpu_caps = ppc_simd_caps();
100 #elif VPX_ARCH_MIPS
101 ctx->cpu_caps = mips_cpu_caps();
98102 #else
99103 // generic-gnu targets.
100104 ctx->cpu_caps = 0;
9999 vp8_short_idct4x4llm_mmi(input, dest, stride, dest, stride);
100100
101101 __asm__ volatile(
102 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
102 "pxor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
103103 "gssdlc1 %[ftmp0], 0x07(%[input]) \n\t"
104104 "gssdrc1 %[ftmp0], 0x00(%[input]) \n\t"
105105 "sdl $0, 0x0f(%[input]) \n\t"
1212 #include "vpx_ports/asmdefs_mmi.h"
1313
1414 #define TRANSPOSE_4H \
15 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t" \
15 "pxor %[ftmp0], %[ftmp0], %[ftmp0] \n\t" \
1616 MMI_LI(%[tmp0], 0x93) \
1717 "mtc1 %[tmp0], %[ftmp10] \n\t" \
1818 "punpcklhw %[ftmp5], %[ftmp1], %[ftmp0] \n\t" \
1919 "punpcklhw %[ftmp9], %[ftmp2], %[ftmp0] \n\t" \
2020 "pshufh %[ftmp9], %[ftmp9], %[ftmp10] \n\t" \
21 "or %[ftmp5], %[ftmp5], %[ftmp9] \n\t" \
21 "por %[ftmp5], %[ftmp5], %[ftmp9] \n\t" \
2222 "punpckhhw %[ftmp6], %[ftmp1], %[ftmp0] \n\t" \
2323 "punpckhhw %[ftmp9], %[ftmp2], %[ftmp0] \n\t" \
2424 "pshufh %[ftmp9], %[ftmp9], %[ftmp10] \n\t" \
25 "or %[ftmp6], %[ftmp6], %[ftmp9] \n\t" \
25 "por %[ftmp6], %[ftmp6], %[ftmp9] \n\t" \
2626 "punpcklhw %[ftmp7], %[ftmp3], %[ftmp0] \n\t" \
2727 "punpcklhw %[ftmp9], %[ftmp4], %[ftmp0] \n\t" \
2828 "pshufh %[ftmp9], %[ftmp9], %[ftmp10] \n\t" \
29 "or %[ftmp7], %[ftmp7], %[ftmp9] \n\t" \
29 "por %[ftmp7], %[ftmp7], %[ftmp9] \n\t" \
3030 "punpckhhw %[ftmp8], %[ftmp3], %[ftmp0] \n\t" \
3131 "punpckhhw %[ftmp9], %[ftmp4], %[ftmp0] \n\t" \
3232 "pshufh %[ftmp9], %[ftmp9], %[ftmp10] \n\t" \
33 "or %[ftmp8], %[ftmp8], %[ftmp9] \n\t" \
33 "por %[ftmp8], %[ftmp8], %[ftmp9] \n\t" \
3434 "punpcklwd %[ftmp1], %[ftmp5], %[ftmp7] \n\t" \
3535 "punpckhwd %[ftmp2], %[ftmp5], %[ftmp7] \n\t" \
3636 "punpcklwd %[ftmp3], %[ftmp6], %[ftmp8] \n\t" \
4040 int pred_stride, unsigned char *dst_ptr,
4141 int dst_stride) {
4242 double ftmp[12];
43 uint32_t tmp[0];
44 DECLARE_ALIGNED(8, const uint64_t, ff_ph_04) = { 0x0004000400040004ULL };
45 DECLARE_ALIGNED(8, const uint64_t, ff_ph_4e7b) = { 0x4e7b4e7b4e7b4e7bULL };
46 DECLARE_ALIGNED(8, const uint64_t, ff_ph_22a3) = { 0x22a322a322a322a3ULL };
43 uint64_t tmp[1];
44 double ff_ph_04, ff_ph_4e7b, ff_ph_22a3;
4745
4846 __asm__ volatile (
47 "dli %[tmp0], 0x0004000400040004 \n\t"
48 "dmtc1 %[tmp0], %[ff_ph_04] \n\t"
49 "dli %[tmp0], 0x4e7b4e7b4e7b4e7b \n\t"
50 "dmtc1 %[tmp0], %[ff_ph_4e7b] \n\t"
51 "dli %[tmp0], 0x22a322a322a322a3 \n\t"
52 "dmtc1 %[tmp0], %[ff_ph_22a3] \n\t"
4953 MMI_LI(%[tmp0], 0x02)
50 "mtc1 %[tmp0], %[ftmp11] \n\t"
51 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
54 "dmtc1 %[tmp0], %[ftmp11] \n\t"
55 "pxor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
5256
5357 "gsldlc1 %[ftmp1], 0x07(%[ip]) \n\t"
5458 "gsldrc1 %[ftmp1], 0x00(%[ip]) \n\t"
185189 [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]), [ftmp8]"=&f"(ftmp[8]),
186190 [ftmp9]"=&f"(ftmp[9]), [ftmp10]"=&f"(ftmp[10]),
187191 [ftmp11]"=&f"(ftmp[11]), [tmp0]"=&r"(tmp[0]),
188 [pred_ptr]"+&r"(pred_ptr), [dst_ptr]"+&r"(dst_ptr)
189 : [ip]"r"(input), [ff_ph_22a3]"f"(ff_ph_22a3),
190 [ff_ph_4e7b]"f"(ff_ph_4e7b), [ff_ph_04]"f"(ff_ph_04),
192 [pred_ptr]"+&r"(pred_ptr), [dst_ptr]"+&r"(dst_ptr),
193 [ff_ph_4e7b]"=&f"(ff_ph_4e7b), [ff_ph_04]"=&f"(ff_ph_04),
194 [ff_ph_22a3]"=&f"(ff_ph_22a3)
195 : [ip]"r"(input),
191196 [pred_stride]"r"((mips_reg)pred_stride),
192197 [dst_stride]"r"((mips_reg)dst_stride)
193198 : "memory"
197202 void vp8_dc_only_idct_add_mmi(int16_t input_dc, unsigned char *pred_ptr,
198203 int pred_stride, unsigned char *dst_ptr,
199204 int dst_stride) {
200 int a1 = ((input_dc + 4) >> 3);
201 double ftmp[5];
205 int a0 = ((input_dc + 4) >> 3);
206 double a1, ftmp[5];
202207 int low32;
203208
204209 __asm__ volatile (
205 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
210 "pxor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
211 "dmtc1 %[a0], %[a1] \n\t"
206212 "pshufh %[a1], %[a1], %[ftmp0] \n\t"
207213 "ulw %[low32], 0x00(%[pred_ptr]) \n\t"
208214 "mtc1 %[low32], %[ftmp1] \n\t"
243249 "gsswrc1 %[ftmp1], 0x00(%[dst_ptr]) \n\t"
244250 : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]), [ftmp2]"=&f"(ftmp[2]),
245251 [ftmp3]"=&f"(ftmp[3]), [ftmp4]"=&f"(ftmp[4]), [low32]"=&r"(low32),
246 [dst_ptr]"+&r"(dst_ptr), [pred_ptr]"+&r"(pred_ptr)
252 [dst_ptr]"+&r"(dst_ptr), [pred_ptr]"+&r"(pred_ptr), [a1]"=&f"(a1)
247253 : [dst_stride]"r"((mips_reg)dst_stride),
248 [pred_stride]"r"((mips_reg)pred_stride), [a1]"f"(a1)
254 [pred_stride]"r"((mips_reg)pred_stride), [a0]"r"(a0)
249255 : "memory"
250256 );
251257 }
253259 void vp8_short_inv_walsh4x4_mmi(int16_t *input, int16_t *mb_dqcoeff) {
254260 int i;
255261 int16_t output[16];
256 double ftmp[12];
257 uint32_t tmp[1];
258 DECLARE_ALIGNED(8, const uint64_t, ff_ph_03) = { 0x0003000300030003ULL };
262 double ff_ph_03, ftmp[12];
263 uint64_t tmp[1];
259264
260265 __asm__ volatile (
266 "dli %[tmp0], 0x0003000300030003 \n\t"
267 "dmtc1 %[tmp0], %[ff_ph_03] \n\t"
261268 MMI_LI(%[tmp0], 0x03)
262 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
263 "mtc1 %[tmp0], %[ftmp11] \n\t"
269 "pxor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
270 "dmtc1 %[tmp0], %[ftmp11] \n\t"
264271 "gsldlc1 %[ftmp1], 0x07(%[ip]) \n\t"
265272 "gsldrc1 %[ftmp1], 0x00(%[ip]) \n\t"
266273 "gsldlc1 %[ftmp2], 0x0f(%[ip]) \n\t"
316323 [ftmp3]"=&f"(ftmp[3]), [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),
317324 [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]), [ftmp8]"=&f"(ftmp[8]),
318325 [ftmp9]"=&f"(ftmp[9]), [ftmp10]"=&f"(ftmp[10]),
319 [ftmp11]"=&f"(ftmp[11]), [tmp0]"=&r"(tmp[0])
320 : [ip]"r"(input), [op]"r"(output), [ff_ph_03]"f"(ff_ph_03)
326 [ftmp11]"=&f"(ftmp[11]), [tmp0]"=&r"(tmp[0]), [ff_ph_03]"=&f"(ff_ph_03)
327 : [ip]"r"(input), [op]"r"(output)
321328 : "memory"
322329 );
323330
1212 #include "vp8/common/onyxc_int.h"
1313 #include "vpx_ports/asmdefs_mmi.h"
1414
15 DECLARE_ALIGNED(8, static const uint64_t, ff_ph_01) = { 0x0001000100010001ULL };
16 DECLARE_ALIGNED(8, static const uint64_t,
17 ff_ph_003f) = { 0x003f003f003f003fULL };
18 DECLARE_ALIGNED(8, static const uint64_t,
19 ff_ph_0900) = { 0x0900090009000900ULL };
20 DECLARE_ALIGNED(8, static const uint64_t,
21 ff_ph_1200) = { 0x1200120012001200ULL };
22 DECLARE_ALIGNED(8, static const uint64_t,
23 ff_ph_1b00) = { 0x1b001b001b001b00ULL };
24 DECLARE_ALIGNED(8, static const uint64_t, ff_pb_fe) = { 0xfefefefefefefefeULL };
25 DECLARE_ALIGNED(8, static const uint64_t, ff_pb_80) = { 0x8080808080808080ULL };
26 DECLARE_ALIGNED(8, static const uint64_t, ff_pb_04) = { 0x0404040404040404ULL };
27 DECLARE_ALIGNED(8, static const uint64_t, ff_pb_03) = { 0x0303030303030303ULL };
28 DECLARE_ALIGNED(8, static const uint64_t, ff_pb_01) = { 0x0101010101010101ULL };
29
3015 void vp8_loop_filter_horizontal_edge_mmi(
3116 unsigned char *src_ptr, int src_pixel_step, const unsigned char *blimit,
3217 const unsigned char *limit, const unsigned char *thresh, int count) {
33 uint32_t tmp[1];
18 uint64_t tmp[1];
3419 mips_reg addr[2];
3520 double ftmp[12];
21 double ff_ph_01, ff_pb_fe, ff_pb_80, ff_pb_04, ff_pb_03;
22 /* clang-format off */
3623 __asm__ volatile (
24 "dli %[tmp0], 0x0001000100010001 \n\t"
25 "dmtc1 %[tmp0], %[ff_ph_01] \n\t"
26 "dli %[tmp0], 0xfefefefefefefefe \n\t"
27 "dmtc1 %[tmp0], %[ff_pb_fe] \n\t"
28 "dli %[tmp0], 0x8080808080808080 \n\t"
29 "dmtc1 %[tmp0], %[ff_pb_80] \n\t"
30 "dli %[tmp0], 0x0404040404040404 \n\t"
31 "dmtc1 %[tmp0], %[ff_pb_04] \n\t"
32 "dli %[tmp0], 0x0303030303030303 \n\t"
33 "dmtc1 %[tmp0], %[ff_pb_03] \n\t"
3734 "1: \n\t"
3835 "gsldlc1 %[ftmp10], 0x07(%[limit]) \n\t"
3936 "gsldrc1 %[ftmp10], 0x00(%[limit]) \n\t"
5552 "gsldrc1 %[ftmp4], 0x00(%[addr1]) \n\t"
5653 "pasubub %[ftmp1], %[ftmp3], %[ftmp4] \n\t"
5754 "psubusb %[ftmp1], %[ftmp1], %[ftmp10] \n\t"
58 "or %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
55 "por %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
5956
6057 MMI_SUBU(%[addr1], %[src_ptr], %[src_pixel_step])
6158 "gsldlc1 %[ftmp5], 0x07(%[addr1]) \n\t"
6259 "gsldrc1 %[ftmp5], 0x00(%[addr1]) \n\t"
6360 "pasubub %[ftmp9], %[ftmp4], %[ftmp5] \n\t"
6461 "psubusb %[ftmp1], %[ftmp9], %[ftmp10] \n\t"
65 "or %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
62 "por %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
6663
6764 "gsldlc1 %[ftmp6], 0x07(%[src_ptr]) \n\t"
6865 "gsldrc1 %[ftmp6], 0x00(%[src_ptr]) \n\t"
7168 "gsldrc1 %[ftmp7], 0x00(%[addr0]) \n\t"
7269 "pasubub %[ftmp11], %[ftmp7], %[ftmp6] \n\t"
7370 "psubusb %[ftmp1], %[ftmp11], %[ftmp10] \n\t"
74 "or %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
71 "por %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
7572
7673 MMI_ADDU(%[addr1], %[src_ptr], %[src_pixel_step_x2])
7774 "gsldlc1 %[ftmp8], 0x07(%[addr1]) \n\t"
7875 "gsldrc1 %[ftmp8], 0x00(%[addr1]) \n\t"
7976 "pasubub %[ftmp1], %[ftmp8], %[ftmp7] \n\t"
8077 "psubusb %[ftmp1], %[ftmp1], %[ftmp10] \n\t"
81 "or %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
78 "por %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
8279
8380 MMI_ADDU(%[addr1], %[addr0], %[src_pixel_step_x2])
8481 "gsldlc1 %[ftmp2], 0x07(%[addr1]) \n\t"
8582 "gsldrc1 %[ftmp2], 0x00(%[addr1]) \n\t"
8683 "pasubub %[ftmp1], %[ftmp2], %[ftmp8] \n\t"
8784 "psubusb %[ftmp1], %[ftmp1], %[ftmp10] \n\t"
88 "or %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
85 "por %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
8986
9087 "pasubub %[ftmp1], %[ftmp5], %[ftmp6] \n\t"
9188 "paddusb %[ftmp1], %[ftmp1], %[ftmp1] \n\t"
9289 "pasubub %[ftmp2], %[ftmp4], %[ftmp7] \n\t"
93 "and %[ftmp2], %[ftmp2], %[ff_pb_fe] \n\t"
94 "li %[tmp0], 0x01 \n\t"
95 "mtc1 %[tmp0], %[ftmp10] \n\t"
90 "pand %[ftmp2], %[ftmp2], %[ff_pb_fe] \n\t"
91 "dli %[tmp0], 0x01 \n\t"
92 "dmtc1 %[tmp0], %[ftmp10] \n\t"
9693 "psrlh %[ftmp2], %[ftmp2], %[ftmp10] \n\t"
9794 "paddusb %[ftmp1], %[ftmp1], %[ftmp2] \n\t"
9895 "gsldlc1 %[ftmp10], 0x07(%[blimit]) \n\t"
9996 "gsldrc1 %[ftmp10], 0x00(%[blimit]) \n\t"
10097 "psubusb %[ftmp1], %[ftmp1], %[ftmp10] \n\t"
101 "or %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
102 "xor %[ftmp10], %[ftmp10], %[ftmp10] \n\t"
98 "por %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
99 "pxor %[ftmp10], %[ftmp10], %[ftmp10] \n\t"
103100 "pcmpeqb %[ftmp0], %[ftmp0], %[ftmp10] \n\t"
104101
105102 "gsldlc1 %[ftmp10], 0x07(%[thresh]) \n\t"
107104 "psubusb %[ftmp1], %[ftmp9], %[ftmp10] \n\t"
108105 "psubusb %[ftmp2], %[ftmp11], %[ftmp10] \n\t"
109106 "paddb %[ftmp1], %[ftmp1], %[ftmp2] \n\t"
110 "xor %[ftmp2], %[ftmp2], %[ftmp2] \n\t"
107 "pxor %[ftmp2], %[ftmp2], %[ftmp2] \n\t"
111108 "pcmpeqb %[ftmp1], %[ftmp1], %[ftmp2] \n\t"
112109 "pcmpeqb %[ftmp2], %[ftmp2], %[ftmp2] \n\t"
113 "xor %[ftmp1], %[ftmp1], %[ftmp2] \n\t"
114
115 "xor %[ftmp4], %[ftmp4], %[ff_pb_80] \n\t"
116 "xor %[ftmp5], %[ftmp5], %[ff_pb_80] \n\t"
117 "xor %[ftmp6], %[ftmp6], %[ff_pb_80] \n\t"
118 "xor %[ftmp7], %[ftmp7], %[ff_pb_80] \n\t"
110 "pxor %[ftmp1], %[ftmp1], %[ftmp2] \n\t"
111
112 "pxor %[ftmp4], %[ftmp4], %[ff_pb_80] \n\t"
113 "pxor %[ftmp5], %[ftmp5], %[ff_pb_80] \n\t"
114 "pxor %[ftmp6], %[ftmp6], %[ff_pb_80] \n\t"
115 "pxor %[ftmp7], %[ftmp7], %[ff_pb_80] \n\t"
119116
120117 "psubsb %[ftmp2], %[ftmp4], %[ftmp7] \n\t"
121 "and %[ftmp2], %[ftmp2], %[ftmp1] \n\t"
118 "pand %[ftmp2], %[ftmp2], %[ftmp1] \n\t"
122119 "psubsb %[ftmp3], %[ftmp6], %[ftmp5] \n\t"
123120 "paddsb %[ftmp2], %[ftmp2], %[ftmp3] \n\t"
124121 "paddsb %[ftmp2], %[ftmp2], %[ftmp3] \n\t"
125122 "paddsb %[ftmp2], %[ftmp2], %[ftmp3] \n\t"
126 "and %[ftmp2], %[ftmp2], %[ftmp0] \n\t"
123 "pand %[ftmp2], %[ftmp2], %[ftmp0] \n\t"
127124
128125 "paddsb %[ftmp8], %[ftmp2], %[ff_pb_03] \n\t"
129126 "paddsb %[ftmp9], %[ftmp2], %[ff_pb_04] \n\t"
130127
131 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
132 "xor %[ftmp11], %[ftmp11], %[ftmp11] \n\t"
128 "pxor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
129 "pxor %[ftmp11], %[ftmp11], %[ftmp11] \n\t"
133130 "punpcklbh %[ftmp0], %[ftmp0], %[ftmp8] \n\t"
134131 "punpckhbh %[ftmp11], %[ftmp11], %[ftmp8] \n\t"
135132
136 "li %[tmp0], 0x0b \n\t"
137 "mtc1 %[tmp0], %[ftmp10] \n\t"
133 "dli %[tmp0], 0x0b \n\t"
134 "dmtc1 %[tmp0], %[ftmp10] \n\t"
138135 "psrah %[ftmp0], %[ftmp0], %[ftmp10] \n\t"
139136 "psrah %[ftmp11], %[ftmp11], %[ftmp10] \n\t"
140137 "packsshb %[ftmp8], %[ftmp0], %[ftmp11] \n\t"
141 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
138 "pxor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
142139 "punpcklbh %[ftmp0], %[ftmp0], %[ftmp9] \n\t"
143140 "psrah %[ftmp0], %[ftmp0], %[ftmp10] \n\t"
144 "xor %[ftmp11], %[ftmp11], %[ftmp11] \n\t"
141 "pxor %[ftmp11], %[ftmp11], %[ftmp11] \n\t"
145142 "punpckhbh %[ftmp9], %[ftmp11], %[ftmp9] \n\t"
146143 "psrah %[ftmp9], %[ftmp9], %[ftmp10] \n\t"
147144 "paddsh %[ftmp11], %[ftmp0], %[ff_ph_01] \n\t"
148145 "packsshb %[ftmp0], %[ftmp0], %[ftmp9] \n\t"
149146 "paddsh %[ftmp9], %[ftmp9], %[ff_ph_01] \n\t"
150147
151 "li %[tmp0], 0x01 \n\t"
152 "mtc1 %[tmp0], %[ftmp10] \n\t"
148 "dli %[tmp0], 0x01 \n\t"
149 "dmtc1 %[tmp0], %[ftmp10] \n\t"
153150 "psrah %[ftmp11], %[ftmp11], %[ftmp10] \n\t"
154151 "psrah %[ftmp9], %[ftmp9], %[ftmp10] \n\t"
155152 "packsshb %[ftmp11], %[ftmp11], %[ftmp9] \n\t"
156153 "pandn %[ftmp1], %[ftmp1], %[ftmp11] \n\t"
157154 "paddsb %[ftmp5], %[ftmp5], %[ftmp8] \n\t"
158 "xor %[ftmp5], %[ftmp5], %[ff_pb_80] \n\t"
155 "pxor %[ftmp5], %[ftmp5], %[ff_pb_80] \n\t"
159156
160157 MMI_SUBU(%[addr1], %[src_ptr], %[src_pixel_step])
161158 "gssdlc1 %[ftmp5], 0x07(%[addr1]) \n\t"
162159 "gssdrc1 %[ftmp5], 0x00(%[addr1]) \n\t"
163160 MMI_SUBU(%[addr1], %[src_ptr], %[src_pixel_step_x2])
164161 "paddsb %[ftmp4], %[ftmp4], %[ftmp1] \n\t"
165 "xor %[ftmp4], %[ftmp4], %[ff_pb_80] \n\t"
162 "pxor %[ftmp4], %[ftmp4], %[ff_pb_80] \n\t"
166163 "gssdlc1 %[ftmp4], 0x07(%[addr1]) \n\t"
167164 "gssdrc1 %[ftmp4], 0x00(%[addr1]) \n\t"
168165
169166 "psubsb %[ftmp6], %[ftmp6], %[ftmp0] \n\t"
170 "xor %[ftmp6], %[ftmp6], %[ff_pb_80] \n\t"
167 "pxor %[ftmp6], %[ftmp6], %[ff_pb_80] \n\t"
171168 "gssdlc1 %[ftmp6], 0x07(%[src_ptr]) \n\t"
172169 "gssdrc1 %[ftmp6], 0x00(%[src_ptr]) \n\t"
173170
174171 "psubsb %[ftmp7], %[ftmp7], %[ftmp1] \n\t"
175 "xor %[ftmp7], %[ftmp7], %[ff_pb_80] \n\t"
172 "pxor %[ftmp7], %[ftmp7], %[ff_pb_80] \n\t"
176173 "gssdlc1 %[ftmp7], 0x07(%[addr0]) \n\t"
177174 "gssdrc1 %[ftmp7], 0x00(%[addr0]) \n\t"
178175
187184 [ftmp10]"=&f"(ftmp[10]), [ftmp11]"=&f"(ftmp[11]),
188185 [tmp0]"=&r"(tmp[0]),
189186 [addr0]"=&r"(addr[0]), [addr1]"=&r"(addr[1]),
190 [src_ptr]"+&r"(src_ptr), [count]"+&r"(count)
187 [src_ptr]"+&r"(src_ptr), [count]"+&r"(count),
188 [ff_ph_01]"=&f"(ff_ph_01), [ff_pb_fe]"=&f"(ff_pb_fe),
189 [ff_pb_80]"=&f"(ff_pb_80), [ff_pb_04]"=&f"(ff_pb_04),
190 [ff_pb_03]"=&f"(ff_pb_03)
191191 : [limit]"r"(limit), [blimit]"r"(blimit),
192192 [thresh]"r"(thresh),
193193 [src_pixel_step]"r"((mips_reg)src_pixel_step),
194194 [src_pixel_step_x2]"r"((mips_reg)(src_pixel_step<<1)),
195 [src_pixel_step_x4]"r"((mips_reg)(src_pixel_step<<2)),
196 [ff_ph_01]"f"(ff_ph_01), [ff_pb_fe]"f"(ff_pb_fe),
197 [ff_pb_80]"f"(ff_pb_80), [ff_pb_04]"f"(ff_pb_04),
198 [ff_pb_03]"f"(ff_pb_03)
195 [src_pixel_step_x4]"r"((mips_reg)(src_pixel_step<<2))
199196 : "memory"
200197 );
198 /* clang-format on */
201199 }
202200
203201 void vp8_loop_filter_vertical_edge_mmi(unsigned char *src_ptr,
205203 const unsigned char *blimit,
206204 const unsigned char *limit,
207205 const unsigned char *thresh, int count) {
208 uint32_t tmp[1];
206 uint64_t tmp[1];
209207 mips_reg addr[2];
210208 double ftmp[13];
211
209 double ff_pb_fe, ff_ph_01, ff_pb_03, ff_pb_04, ff_pb_80;
210
211 /* clang-format off */
212212 __asm__ volatile (
213 "dli %[tmp0], 0xfefefefefefefefe \n\t"
214 "dmtc1 %[tmp0], %[ff_pb_fe] \n\t"
215 "dli %[tmp0], 0x0001000100010001 \n\t"
216 "dmtc1 %[tmp0], %[ff_ph_01] \n\t"
217 "dli %[tmp0], 0x0303030303030303 \n\t"
218 "dmtc1 %[tmp0], %[ff_pb_03] \n\t"
219 "dli %[tmp0], 0x0404040404040404 \n\t"
220 "dmtc1 %[tmp0], %[ff_pb_04] \n\t"
221 "dli %[tmp0], 0x8080808080808080 \n\t"
222 "dmtc1 %[tmp0], %[ff_pb_80] \n\t"
213223 MMI_SLL(%[tmp0], %[src_pixel_step], 0x02)
214224 MMI_ADDU(%[src_ptr], %[src_ptr], %[tmp0])
215225 MMI_SUBU(%[src_ptr], %[src_ptr], 0x04)
287297 /* abs (q2-q1) */
288298 "pasubub %[ftmp7], %[ftmp11], %[ftmp10] \n\t"
289299 "psubusb %[ftmp7], %[ftmp7], %[ftmp8] \n\t"
290 "or %[ftmp0], %[ftmp0], %[ftmp7] \n\t"
300 "por %[ftmp0], %[ftmp0], %[ftmp7] \n\t"
291301 /* ftmp3: abs(q1-q0) */
292302 "pasubub %[ftmp3], %[ftmp10], %[ftmp9] \n\t"
293303 "psubusb %[ftmp7], %[ftmp3], %[ftmp8] \n\t"
294 "or %[ftmp0], %[ftmp0], %[ftmp7] \n\t"
304 "por %[ftmp0], %[ftmp0], %[ftmp7] \n\t"
295305 /* ftmp4: abs(p1-p0) */
296306 "pasubub %[ftmp4], %[ftmp5], %[ftmp6] \n\t"
297307 "psubusb %[ftmp7], %[ftmp4], %[ftmp8] \n\t"
298 "or %[ftmp0], %[ftmp0], %[ftmp7] \n\t"
308 "por %[ftmp0], %[ftmp0], %[ftmp7] \n\t"
299309 /* abs (p2-p1) */
300310 "pasubub %[ftmp7], %[ftmp2], %[ftmp5] \n\t"
301311 "psubusb %[ftmp7], %[ftmp7], %[ftmp8] \n\t"
302 "or %[ftmp0], %[ftmp0], %[ftmp7] \n\t"
312 "por %[ftmp0], %[ftmp0], %[ftmp7] \n\t"
303313 /* abs (p3-p2) */
304314 "pasubub %[ftmp7], %[ftmp1], %[ftmp2] \n\t"
305315 "psubusb %[ftmp7], %[ftmp7], %[ftmp8] \n\t"
306 "or %[ftmp0], %[ftmp0], %[ftmp7] \n\t"
316 "por %[ftmp0], %[ftmp0], %[ftmp7] \n\t"
307317
308318 "gsldlc1 %[ftmp8], 0x07(%[blimit]) \n\t"
309319 "gsldrc1 %[ftmp8], 0x00(%[blimit]) \n\t"
313323 "paddusb %[ftmp11], %[ftmp11], %[ftmp11] \n\t"
314324 /* abs (p1-q1) */
315325 "pasubub %[ftmp12], %[ftmp10], %[ftmp5] \n\t"
316 "and %[ftmp12], %[ftmp12], %[ff_pb_fe] \n\t"
317 "li %[tmp0], 0x01 \n\t"
318 "mtc1 %[tmp0], %[ftmp1] \n\t"
326 "pand %[ftmp12], %[ftmp12], %[ff_pb_fe] \n\t"
327 "dli %[tmp0], 0x01 \n\t"
328 "dmtc1 %[tmp0], %[ftmp1] \n\t"
319329 "psrlh %[ftmp12], %[ftmp12], %[ftmp1] \n\t"
320330 "paddusb %[ftmp1], %[ftmp11], %[ftmp12] \n\t"
321331 "psubusb %[ftmp1], %[ftmp1], %[ftmp8] \n\t"
322 "or %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
323 "xor %[ftmp1], %[ftmp1], %[ftmp1] \n\t"
332 "por %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
333 "pxor %[ftmp1], %[ftmp1], %[ftmp1] \n\t"
324334 /* ftmp0:mask */
325335 "pcmpeqb %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
326336
330340 /* ftmp3: abs(q1-q0) ftmp4: abs(p1-p0) */
331341 "psubusb %[ftmp4], %[ftmp4], %[ftmp8] \n\t"
332342 "psubusb %[ftmp3], %[ftmp3], %[ftmp8] \n\t"
333 "or %[ftmp2], %[ftmp4], %[ftmp3] \n\t"
343 "por %[ftmp2], %[ftmp4], %[ftmp3] \n\t"
334344 "pcmpeqb %[ftmp2], %[ftmp2], %[ftmp1] \n\t"
335345 "pcmpeqb %[ftmp1], %[ftmp1], %[ftmp1] \n\t"
336346 /* ftmp1:hev */
337 "xor %[ftmp1], %[ftmp2], %[ftmp1] \n\t"
338
339 "xor %[ftmp10], %[ftmp10], %[ff_pb_80] \n\t"
340 "xor %[ftmp9], %[ftmp9], %[ff_pb_80] \n\t"
341 "xor %[ftmp6], %[ftmp6], %[ff_pb_80] \n\t"
342 "xor %[ftmp5], %[ftmp5], %[ff_pb_80] \n\t"
347 "pxor %[ftmp1], %[ftmp2], %[ftmp1] \n\t"
348
349 "pxor %[ftmp10], %[ftmp10], %[ff_pb_80] \n\t"
350 "pxor %[ftmp9], %[ftmp9], %[ff_pb_80] \n\t"
351 "pxor %[ftmp6], %[ftmp6], %[ff_pb_80] \n\t"
352 "pxor %[ftmp5], %[ftmp5], %[ff_pb_80] \n\t"
343353
344354 "psubsb %[ftmp2], %[ftmp5], %[ftmp10] \n\t"
345 "and %[ftmp2], %[ftmp2], %[ftmp1] \n\t"
355 "pand %[ftmp2], %[ftmp2], %[ftmp1] \n\t"
346356 "psubsb %[ftmp3], %[ftmp9], %[ftmp6] \n\t"
347357 "paddsb %[ftmp2], %[ftmp2], %[ftmp3] \n\t"
348358 "paddsb %[ftmp2], %[ftmp2], %[ftmp3] \n\t"
349359 "paddsb %[ftmp2], %[ftmp2], %[ftmp3] \n\t"
350360 /* ftmp2:filter_value */
351 "and %[ftmp2], %[ftmp2], %[ftmp0] \n\t"
361 "pand %[ftmp2], %[ftmp2], %[ftmp0] \n\t"
352362
353363 "paddsb %[ftmp11], %[ftmp2], %[ff_pb_04] \n\t"
354364 "paddsb %[ftmp12], %[ftmp2], %[ff_pb_03] \n\t"
355365
356 "li %[tmp0], 0x0b \n\t"
357 "mtc1 %[tmp0], %[ftmp7] \n\t"
358 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
359 "xor %[ftmp8], %[ftmp8], %[ftmp8] \n\t"
366 "dli %[tmp0], 0x0b \n\t"
367 "dmtc1 %[tmp0], %[ftmp7] \n\t"
368 "pxor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
369 "pxor %[ftmp8], %[ftmp8], %[ftmp8] \n\t"
360370 "punpcklbh %[ftmp0], %[ftmp0], %[ftmp12] \n\t"
361371 "punpckhbh %[ftmp8], %[ftmp8], %[ftmp12] \n\t"
362372 "psrah %[ftmp0], %[ftmp0], %[ftmp7] \n\t"
363373 "psrah %[ftmp8], %[ftmp8], %[ftmp7] \n\t"
364374 "packsshb %[ftmp12], %[ftmp0], %[ftmp8] \n\t"
365375
366 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
367 "xor %[ftmp8], %[ftmp8], %[ftmp8] \n\t"
376 "pxor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
377 "pxor %[ftmp8], %[ftmp8], %[ftmp8] \n\t"
368378 "punpcklbh %[ftmp0], %[ftmp0], %[ftmp11] \n\t"
369379 "punpckhbh %[ftmp8], %[ftmp8], %[ftmp11] \n\t"
370380 "psrah %[ftmp0], %[ftmp0], %[ftmp7] \n\t"
372382 "packsshb %[ftmp11], %[ftmp0], %[ftmp8] \n\t"
373383
374384 "psubsb %[ftmp9], %[ftmp9], %[ftmp11] \n\t"
375 "xor %[ftmp9], %[ftmp9], %[ff_pb_80] \n\t"
385 "pxor %[ftmp9], %[ftmp9], %[ff_pb_80] \n\t"
376386 "paddsb %[ftmp6], %[ftmp6], %[ftmp12] \n\t"
377 "xor %[ftmp6], %[ftmp6], %[ff_pb_80] \n\t"
387 "pxor %[ftmp6], %[ftmp6], %[ff_pb_80] \n\t"
378388 "paddsh %[ftmp0], %[ftmp0], %[ff_ph_01] \n\t"
379389 "paddsh %[ftmp8], %[ftmp8], %[ff_ph_01] \n\t"
380390
381 "li %[tmp0], 0x01 \n\t"
382 "mtc1 %[tmp0], %[ftmp7] \n\t"
391 "dli %[tmp0], 0x01 \n\t"
392 "dmtc1 %[tmp0], %[ftmp7] \n\t"
383393 "psrah %[ftmp0], %[ftmp0], %[ftmp7] \n\t"
384394 "psrah %[ftmp8], %[ftmp8], %[ftmp7] \n\t"
385395 "packsshb %[ftmp2], %[ftmp0], %[ftmp8] \n\t"
386396 "pandn %[ftmp2], %[ftmp1], %[ftmp2] \n\t"
387397 "psubsb %[ftmp10], %[ftmp10], %[ftmp2] \n\t"
388 "xor %[ftmp10], %[ftmp10], %[ff_pb_80] \n\t"
398 "pxor %[ftmp10], %[ftmp10], %[ff_pb_80] \n\t"
389399 "paddsb %[ftmp5], %[ftmp5], %[ftmp2] \n\t"
390 "xor %[ftmp5], %[ftmp5], %[ff_pb_80] \n\t"
400 "pxor %[ftmp5], %[ftmp5], %[ff_pb_80] \n\t"
391401
392402 /* ftmp5: *op1 ; ftmp6: *op0 */
393403 "punpcklbh %[ftmp2], %[ftmp5], %[ftmp6] \n\t"
407417
408418 "li %[tmp0], 0x20 \n\t"
409419 "mtc1 %[tmp0], %[ftmp9] \n\t"
410 "dsrl %[ftmp2], %[ftmp2], %[ftmp9] \n\t"
420 "ssrld %[ftmp2], %[ftmp2], %[ftmp9] \n\t"
411421 MMI_SLL(%[tmp0], %[src_pixel_step], 0x02)
412422 MMI_SUBU(%[addr1], %[addr0], %[tmp0])
413423 "gsswlc1 %[ftmp2], 0x05(%[addr1]) \n\t"
418428 "gsswlc1 %[ftmp6], 0x05(%[addr1]) \n\t"
419429 "gsswrc1 %[ftmp6], 0x02(%[addr1]) \n\t"
420430
421 "dsrl %[ftmp6], %[ftmp6], %[ftmp9] \n\t"
431 "ssrld %[ftmp6], %[ftmp6], %[ftmp9] \n\t"
422432 MMI_SUBU(%[addr1], %[src_ptr], %[src_pixel_step])
423433 "gsswlc1 %[ftmp6], 0x05(%[addr1]) \n\t"
424434 "gsswrc1 %[ftmp6], 0x02(%[addr1]) \n\t"
425435 "gsswlc1 %[ftmp1], 0x05(%[src_ptr]) \n\t"
426436 "gsswrc1 %[ftmp1], 0x02(%[src_ptr]) \n\t"
427437
428 "dsrl %[ftmp1], %[ftmp1], %[ftmp9] \n\t"
438 "ssrld %[ftmp1], %[ftmp1], %[ftmp9] \n\t"
429439 "gsswlc1 %[ftmp1], 0x05(%[addr0]) \n\t"
430440 "gsswrc1 %[ftmp1], 0x02(%[addr0]) \n\t"
431441 MMI_ADDU(%[addr1], %[addr0], %[src_pixel_step])
432442 "gsswlc1 %[ftmp5], 0x05(%[addr1]) \n\t"
433443 "gsswrc1 %[ftmp5], 0x02(%[addr1]) \n\t"
434444
435 "dsrl %[ftmp5], %[ftmp5], %[ftmp9] \n\t"
445 "ssrld %[ftmp5], %[ftmp5], %[ftmp9] \n\t"
436446 MMI_ADDU(%[addr1], %[addr0], %[tmp0])
437447 "gsswlc1 %[ftmp5], 0x05(%[addr1]) \n\t"
438448 "gsswrc1 %[ftmp5], 0x02(%[addr1]) \n\t"
449459 [ftmp10]"=&f"(ftmp[10]), [ftmp11]"=&f"(ftmp[11]),
450460 [ftmp12]"=&f"(ftmp[12]), [tmp0]"=&r"(tmp[0]),
451461 [addr0]"=&r"(addr[0]), [addr1]"=&r"(addr[1]),
452 [src_ptr]"+&r"(src_ptr), [count]"+&r"(count)
462 [src_ptr]"+&r"(src_ptr), [count]"+&r"(count),
463 [ff_ph_01]"=&f"(ff_ph_01), [ff_pb_03]"=&f"(ff_pb_03),
464 [ff_pb_04]"=&f"(ff_pb_04), [ff_pb_80]"=&f"(ff_pb_80),
465 [ff_pb_fe]"=&f"(ff_pb_fe)
453466 : [limit]"r"(limit), [blimit]"r"(blimit),
454467 [thresh]"r"(thresh),
455 [src_pixel_step]"r"((mips_reg)src_pixel_step),
456 [ff_ph_01]"f"(ff_ph_01), [ff_pb_03]"f"(ff_pb_03),
457 [ff_pb_04]"f"(ff_pb_04), [ff_pb_80]"f"(ff_pb_80),
458 [ff_pb_fe]"f"(ff_pb_fe)
468 [src_pixel_step]"r"((mips_reg)src_pixel_step)
459469 : "memory"
460470 );
471 /* clang-format on */
461472 }
462473
463474 /* clang-format off */
483494 void vp8_mbloop_filter_horizontal_edge_mmi(
484495 unsigned char *src_ptr, int src_pixel_step, const unsigned char *blimit,
485496 const unsigned char *limit, const unsigned char *thresh, int count) {
486 uint32_t tmp[1];
497 uint64_t tmp[1];
487498 double ftmp[13];
488
499 double ff_pb_fe, ff_pb_80, ff_pb_04, ff_pb_03, ff_ph_003f, ff_ph_0900,
500 ff_ph_1200, ff_ph_1b00;
501
502 /* clang-format off */
489503 __asm__ volatile (
504 "dli %[tmp0], 0xfefefefefefefefe \n\t"
505 "dmtc1 %[tmp0], %[ff_pb_fe] \n\t"
506 "dli %[tmp0], 0x8080808080808080 \n\t"
507 "dmtc1 %[tmp0], %[ff_pb_80] \n\t"
508 "dli %[tmp0], 0x0404040404040404 \n\t"
509 "dmtc1 %[tmp0], %[ff_pb_04] \n\t"
510 "dli %[tmp0], 0x0303030303030303 \n\t"
511 "dmtc1 %[tmp0], %[ff_pb_03] \n\t"
512 "dli %[tmp0], 0x003f003f003f003f \n\t"
513 "dmtc1 %[tmp0], %[ff_ph_003f] \n\t"
514 "dli %[tmp0], 0x0900090009000900 \n\t"
515 "dmtc1 %[tmp0], %[ff_ph_0900] \n\t"
516 "dli %[tmp0], 0x1200120012001200 \n\t"
517 "dmtc1 %[tmp0], %[ff_ph_1200] \n\t"
518 "dli %[tmp0], 0x1b001b001b001b00 \n\t"
519 "dmtc1 %[tmp0], %[ff_ph_1b00] \n\t"
490520 MMI_SLL(%[tmp0], %[src_pixel_step], 0x02)
491521 MMI_SUBU(%[src_ptr], %[src_ptr], %[tmp0])
492522 "1: \n\t"
531561 "psubusb %[ftmp0], %[ftmp0], %[ftmp9] \n\t"
532562 "pasubub %[ftmp1], %[ftmp3], %[ftmp4] \n\t"
533563 "psubusb %[ftmp1], %[ftmp1], %[ftmp9] \n\t"
534 "or %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
564 "por %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
535565 "pasubub %[ftmp10], %[ftmp4], %[ftmp5] \n\t"
536566 "psubusb %[ftmp1], %[ftmp10], %[ftmp9] \n\t"
537 "or %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
567 "por %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
538568 "pasubub %[ftmp11], %[ftmp7], %[ftmp6] \n\t"
539569 "psubusb %[ftmp1], %[ftmp11], %[ftmp9] \n\t"
540 "or %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
570 "por %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
541571 "pasubub %[ftmp1], %[ftmp8], %[ftmp7] \n\t"
542572 "psubusb %[ftmp1], %[ftmp1], %[ftmp9] \n\t"
543 "or %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
573 "por %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
544574 "pasubub %[ftmp1], %[ftmp2], %[ftmp8] \n\t"
545575 "psubusb %[ftmp1], %[ftmp1], %[ftmp9] \n\t"
546 "or %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
576 "por %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
547577
548578 "pasubub %[ftmp1], %[ftmp5], %[ftmp6] \n\t"
549579 "paddusb %[ftmp1], %[ftmp1], %[ftmp1] \n\t"
550580 "pasubub %[ftmp2], %[ftmp4], %[ftmp7] \n\t"
551 "and %[ftmp2], %[ftmp2], %[ff_pb_fe] \n\t"
552 "li %[tmp0], 0x01 \n\t"
553 "mtc1 %[tmp0], %[ftmp9] \n\t"
581 "pand %[ftmp2], %[ftmp2], %[ff_pb_fe] \n\t"
582 "dli %[tmp0], 0x01 \n\t"
583 "dmtc1 %[tmp0], %[ftmp9] \n\t"
554584 "psrlh %[ftmp2], %[ftmp2], %[ftmp9] \n\t"
555585 "paddusb %[ftmp1], %[ftmp1], %[ftmp2] \n\t"
556586 "psubusb %[ftmp1], %[ftmp1], %[ftmp12] \n\t"
557 "or %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
558 "xor %[ftmp9], %[ftmp9], %[ftmp9] \n\t"
587 "por %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
588 "pxor %[ftmp9], %[ftmp9], %[ftmp9] \n\t"
559589 /* ftmp0: mask */
560590 "pcmpeqb %[ftmp0], %[ftmp0], %[ftmp9] \n\t"
561591
564594 "psubusb %[ftmp1], %[ftmp10], %[ftmp9] \n\t"
565595 "psubusb %[ftmp2], %[ftmp11], %[ftmp9] \n\t"
566596 "paddb %[ftmp1], %[ftmp1], %[ftmp2] \n\t"
567 "xor %[ftmp2], %[ftmp2], %[ftmp2] \n\t"
597 "pxor %[ftmp2], %[ftmp2], %[ftmp2] \n\t"
568598 "pcmpeqb %[ftmp1], %[ftmp1], %[ftmp2] \n\t"
569599 "pcmpeqb %[ftmp2], %[ftmp2], %[ftmp2] \n\t"
570600 /* ftmp1: hev */
571 "xor %[ftmp1], %[ftmp1], %[ftmp2] \n\t"
572
573 "xor %[ftmp4], %[ftmp4], %[ff_pb_80] \n\t"
574 "xor %[ftmp5], %[ftmp5], %[ff_pb_80] \n\t"
575 "xor %[ftmp6], %[ftmp6], %[ff_pb_80] \n\t"
576 "xor %[ftmp7], %[ftmp7], %[ff_pb_80] \n\t"
601 "pxor %[ftmp1], %[ftmp1], %[ftmp2] \n\t"
602
603 "pxor %[ftmp4], %[ftmp4], %[ff_pb_80] \n\t"
604 "pxor %[ftmp5], %[ftmp5], %[ff_pb_80] \n\t"
605 "pxor %[ftmp6], %[ftmp6], %[ff_pb_80] \n\t"
606 "pxor %[ftmp7], %[ftmp7], %[ff_pb_80] \n\t"
577607 "psubsb %[ftmp2], %[ftmp4], %[ftmp7] \n\t"
578608 "psubsb %[ftmp9], %[ftmp6], %[ftmp5] \n\t"
579609 "paddsb %[ftmp2], %[ftmp2], %[ftmp9] \n\t"
580610 "paddsb %[ftmp2], %[ftmp2], %[ftmp9] \n\t"
581611 "paddsb %[ftmp2], %[ftmp2], %[ftmp9] \n\t"
582 "and %[ftmp2], %[ftmp2], %[ftmp0] \n\t"
612 "pand %[ftmp2], %[ftmp2], %[ftmp0] \n\t"
583613 "pandn %[ftmp12], %[ftmp1], %[ftmp2] \n\t"
584 "and %[ftmp2], %[ftmp2], %[ftmp1] \n\t"
585
586 "li %[tmp0], 0x0b \n\t"
587 "mtc1 %[tmp0], %[ftmp9] \n\t"
614 "pand %[ftmp2], %[ftmp2], %[ftmp1] \n\t"
615
616 "dli %[tmp0], 0x0b \n\t"
617 "dmtc1 %[tmp0], %[ftmp9] \n\t"
588618 "paddsb %[ftmp0], %[ftmp2], %[ff_pb_03] \n\t"
589619 VP8_MBLOOP_HPSRAB
590620 "paddsb %[ftmp5], %[ftmp5], %[ftmp0] \n\t"
592622 VP8_MBLOOP_HPSRAB
593623 "psubsb %[ftmp6], %[ftmp6], %[ftmp0] \n\t"
594624
595 "li %[tmp0], 0x07 \n\t"
596 "mtc1 %[tmp0], %[ftmp9] \n\t"
597 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
625 "dli %[tmp0], 0x07 \n\t"
626 "dmtc1 %[tmp0], %[ftmp9] \n\t"
627 "pxor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
598628
599629 VP8_MBLOOP_HPSRAB_ADD(%[ff_ph_1b00])
600630 "psubsb %[ftmp6], %[ftmp6], %[ftmp1] \n\t"
601631 "paddsb %[ftmp5], %[ftmp5], %[ftmp1] \n\t"
602 "xor %[ftmp6], %[ftmp6], %[ff_pb_80] \n\t"
603 "xor %[ftmp5], %[ftmp5], %[ff_pb_80] \n\t"
632 "pxor %[ftmp6], %[ftmp6], %[ff_pb_80] \n\t"
633 "pxor %[ftmp5], %[ftmp5], %[ff_pb_80] \n\t"
604634 MMI_SLL(%[tmp0], %[src_pixel_step], 0x02)
605635 MMI_SUBU(%[src_ptr], %[src_ptr], %[tmp0])
606636 "gssdlc1 %[ftmp5], 0x07(%[src_ptr]) \n\t"
612642 VP8_MBLOOP_HPSRAB_ADD(%[ff_ph_1200])
613643 "paddsb %[ftmp4], %[ftmp4], %[ftmp1] \n\t"
614644 "psubsb %[ftmp7], %[ftmp7], %[ftmp1] \n\t"
615 "xor %[ftmp4], %[ftmp4], %[ff_pb_80] \n\t"
616 "xor %[ftmp7], %[ftmp7], %[ff_pb_80] \n\t"
645 "pxor %[ftmp4], %[ftmp4], %[ff_pb_80] \n\t"
646 "pxor %[ftmp7], %[ftmp7], %[ff_pb_80] \n\t"
617647 MMI_ADDU(%[src_ptr], %[src_ptr], %[src_pixel_step])
618648 "gssdlc1 %[ftmp7], 0x07(%[src_ptr]) \n\t"
619649 "gssdrc1 %[ftmp7], 0x00(%[src_ptr]) \n\t"
623653 "gssdrc1 %[ftmp4], 0x00(%[src_ptr]) \n\t"
624654
625655 VP8_MBLOOP_HPSRAB_ADD(%[ff_ph_0900])
626 "xor %[ftmp3], %[ftmp3], %[ff_pb_80] \n\t"
627 "xor %[ftmp8], %[ftmp8], %[ff_pb_80] \n\t"
656 "pxor %[ftmp3], %[ftmp3], %[ff_pb_80] \n\t"
657 "pxor %[ftmp8], %[ftmp8], %[ff_pb_80] \n\t"
628658 "paddsb %[ftmp3], %[ftmp3], %[ftmp1] \n\t"
629659 "psubsb %[ftmp8], %[ftmp8], %[ftmp1] \n\t"
630 "xor %[ftmp3], %[ftmp3], %[ff_pb_80] \n\t"
631 "xor %[ftmp8], %[ftmp8], %[ff_pb_80] \n\t"
660 "pxor %[ftmp3], %[ftmp3], %[ff_pb_80] \n\t"
661 "pxor %[ftmp8], %[ftmp8], %[ff_pb_80] \n\t"
632662 MMI_ADDU(%[src_ptr], %[src_ptr], %[tmp0])
633663 "gssdlc1 %[ftmp8], 0x07(%[src_ptr]) \n\t"
634664 "gssdrc1 %[ftmp8], 0x00(%[src_ptr]) \n\t"
648678 [ftmp8]"=&f"(ftmp[8]), [ftmp9]"=&f"(ftmp[9]),
649679 [ftmp10]"=&f"(ftmp[10]), [ftmp11]"=&f"(ftmp[11]),
650680 [ftmp12]"=&f"(ftmp[12]), [tmp0]"=&r"(tmp[0]),
651 [src_ptr]"+&r"(src_ptr), [count]"+&r"(count)
681 [src_ptr]"+&r"(src_ptr), [count]"+&r"(count),
682 [ff_pb_fe]"=&f"(ff_pb_fe), [ff_pb_80]"=&f"(ff_pb_80),
683 [ff_pb_04]"=&f"(ff_pb_04), [ff_pb_03]"=&f"(ff_pb_03),
684 [ff_ph_0900]"=&f"(ff_ph_0900), [ff_ph_1b00]"=&f"(ff_ph_1b00),
685 [ff_ph_1200]"=&f"(ff_ph_1200), [ff_ph_003f]"=&f"(ff_ph_003f)
652686 : [limit]"r"(limit), [blimit]"r"(blimit),
653687 [thresh]"r"(thresh),
654 [src_pixel_step]"r"((mips_reg)src_pixel_step),
655 [ff_pb_fe]"f"(ff_pb_fe), [ff_pb_80]"f"(ff_pb_80),
656 [ff_pb_04]"f"(ff_pb_04), [ff_pb_03]"f"(ff_pb_03),
657 [ff_ph_0900]"f"(ff_ph_0900), [ff_ph_1b00]"f"(ff_ph_1b00),
658 [ff_ph_1200]"f"(ff_ph_1200), [ff_ph_003f]"f"(ff_ph_003f)
688 [src_pixel_step]"r"((mips_reg)src_pixel_step)
659689 : "memory"
660690 );
691 /* clang-format on */
661692 }
662693
694 /* clang-format off */
663695 #define VP8_MBLOOP_VPSRAB_ADDH \
664 "xor %[ftmp7], %[ftmp7], %[ftmp7] \n\t" \
665 "xor %[ftmp8], %[ftmp8], %[ftmp8] \n\t" \
696 "pxor %[ftmp7], %[ftmp7], %[ftmp7] \n\t" \
697 "pxor %[ftmp8], %[ftmp8], %[ftmp8] \n\t" \
666698 "punpcklbh %[ftmp7], %[ftmp7], %[ftmp0] \n\t" \
667699 "punpckhbh %[ftmp8], %[ftmp8], %[ftmp0] \n\t"
668700
672704 "psrah %[ftmp7], %[ftmp7], %[ftmp12] \n\t" \
673705 "psrah %[ftmp8], %[ftmp8], %[ftmp12] \n\t" \
674706 "packsshb %[ftmp3], %[ftmp7], %[ftmp8] \n\t"
707 /* clang-format on */
675708
676709 void vp8_mbloop_filter_vertical_edge_mmi(
677710 unsigned char *src_ptr, int src_pixel_step, const unsigned char *blimit,
678711 const unsigned char *limit, const unsigned char *thresh, int count) {
679712 mips_reg tmp[1];
680 DECLARE_ALIGNED(8, const uint64_t, srct[1]);
713 DECLARE_ALIGNED(8, const uint64_t, srct[2]);
681714 double ftmp[14];
682
715 double ff_ph_003f, ff_ph_0900, ff_pb_fe, ff_pb_80, ff_pb_04, ff_pb_03;
716
717 /* clang-format off */
683718 __asm__ volatile (
719 "dli %[tmp0], 0x003f003f003f003f \n\t"
720 "dmtc1 %[tmp0], %[ff_ph_003f] \n\t"
721 "dli %[tmp0], 0x0900090009000900 \n\t"
722 "dmtc1 %[tmp0], %[ff_ph_0900] \n\t"
723 "dli %[tmp0], 0xfefefefefefefefe \n\t"
724 "dmtc1 %[tmp0], %[ff_pb_fe] \n\t"
725 "dli %[tmp0], 0x8080808080808080 \n\t"
726 "dmtc1 %[tmp0], %[ff_pb_80] \n\t"
727 "dli %[tmp0], 0x0404040404040404 \n\t"
728 "dmtc1 %[tmp0], %[ff_pb_04] \n\t"
729 "dli %[tmp0], 0x0303030303030303 \n\t"
730 "dmtc1 %[tmp0], %[ff_pb_03] \n\t"
684731 MMI_SUBU(%[src_ptr], %[src_ptr], 0x04)
685732
686733 "1: \n\t"
754801 /* abs (q2-q1) */
755802 "pasubub %[ftmp7], %[ftmp11], %[ftmp10] \n\t"
756803 "psubusb %[ftmp7], %[ftmp7], %[ftmp13] \n\t"
757 "or %[ftmp0], %[ftmp0], %[ftmp7] \n\t"
804 "por %[ftmp0], %[ftmp0], %[ftmp7] \n\t"
758805 /* ftmp3: abs(q1-q0) */
759806 "pasubub %[ftmp3], %[ftmp10], %[ftmp9] \n\t"
760807 "psubusb %[ftmp7], %[ftmp3], %[ftmp13] \n\t"
761 "or %[ftmp0], %[ftmp0], %[ftmp7] \n\t"
808 "por %[ftmp0], %[ftmp0], %[ftmp7] \n\t"
762809 /* ftmp4: abs(p1-p0) */
763810 "pasubub %[ftmp4], %[ftmp5], %[ftmp6] \n\t"
764811 "psubusb %[ftmp7], %[ftmp4], %[ftmp13] \n\t"
765 "or %[ftmp0], %[ftmp0], %[ftmp7] \n\t"
812 "por %[ftmp0], %[ftmp0], %[ftmp7] \n\t"
766813 /* abs (p2-p1) */
767814 "pasubub %[ftmp7], %[ftmp2], %[ftmp5] \n\t"
768815 "psubusb %[ftmp7], %[ftmp7], %[ftmp13] \n\t"
769 "or %[ftmp0], %[ftmp0], %[ftmp7] \n\t"
816 "por %[ftmp0], %[ftmp0], %[ftmp7] \n\t"
770817 /* abs (p3-p2) */
771818 "pasubub %[ftmp7], %[ftmp1], %[ftmp2] \n\t"
772819 "psubusb %[ftmp7], %[ftmp7], %[ftmp13] \n\t"
773 "or %[ftmp0], %[ftmp0], %[ftmp7] \n\t"
820 "por %[ftmp0], %[ftmp0], %[ftmp7] \n\t"
774821
775822 "gsldlc1 %[ftmp13], 0x07(%[blimit]) \n\t"
776823 "gsldrc1 %[ftmp13], 0x00(%[blimit]) \n\t"
781828 "paddusb %[ftmp1], %[ftmp1], %[ftmp1] \n\t"
782829 /* abs (p1-q1) / 2 */
783830 "pasubub %[ftmp12], %[ftmp10], %[ftmp5] \n\t"
784 "and %[ftmp12], %[ftmp12], %[ff_pb_fe] \n\t"
785 "li %[tmp0], 0x01 \n\t"
786 "mtc1 %[tmp0], %[ftmp8] \n\t"
831 "pand %[ftmp12], %[ftmp12], %[ff_pb_fe] \n\t"
832 "dli %[tmp0], 0x01 \n\t"
833 "dmtc1 %[tmp0], %[ftmp8] \n\t"
787834 "psrlh %[ftmp12], %[ftmp12], %[ftmp8] \n\t"
788835 "paddusb %[ftmp12], %[ftmp1], %[ftmp12] \n\t"
789836 "psubusb %[ftmp12], %[ftmp12], %[ftmp13] \n\t"
790 "or %[ftmp0], %[ftmp0], %[ftmp12] \n\t"
791 "xor %[ftmp12], %[ftmp12], %[ftmp12] \n\t"
837 "por %[ftmp0], %[ftmp0], %[ftmp12] \n\t"
838 "pxor %[ftmp12], %[ftmp12], %[ftmp12] \n\t"
792839 /* ftmp0: mask */
793840 "pcmpeqb %[ftmp0], %[ftmp0], %[ftmp12] \n\t"
794841
796843 "psubusb %[ftmp4], %[ftmp4], %[ftmp7] \n\t"
797844 /* abs(q1-q0) - thresh */
798845 "psubusb %[ftmp3], %[ftmp3], %[ftmp7] \n\t"
799 "or %[ftmp3], %[ftmp4], %[ftmp3] \n\t"
846 "por %[ftmp3], %[ftmp4], %[ftmp3] \n\t"
800847 "pcmpeqb %[ftmp3], %[ftmp3], %[ftmp12] \n\t"
801848 "pcmpeqb %[ftmp1], %[ftmp1], %[ftmp1] \n\t"
802849 /* ftmp1: hev */
803 "xor %[ftmp1], %[ftmp3], %[ftmp1] \n\t"
850 "pxor %[ftmp1], %[ftmp3], %[ftmp1] \n\t"
804851
805852 /* ftmp2:ps2, ftmp5:ps1, ftmp6:ps0, ftmp9:qs0, ftmp10:qs1, ftmp11:qs2 */
806 "xor %[ftmp11], %[ftmp11], %[ff_pb_80] \n\t"
807 "xor %[ftmp10], %[ftmp10], %[ff_pb_80] \n\t"
808 "xor %[ftmp9], %[ftmp9], %[ff_pb_80] \n\t"
809 "xor %[ftmp6], %[ftmp6], %[ff_pb_80] \n\t"
810 "xor %[ftmp5], %[ftmp5], %[ff_pb_80] \n\t"
811 "xor %[ftmp2], %[ftmp2], %[ff_pb_80] \n\t"
853 "pxor %[ftmp11], %[ftmp11], %[ff_pb_80] \n\t"
854 "pxor %[ftmp10], %[ftmp10], %[ff_pb_80] \n\t"
855 "pxor %[ftmp9], %[ftmp9], %[ff_pb_80] \n\t"
856 "pxor %[ftmp6], %[ftmp6], %[ff_pb_80] \n\t"
857 "pxor %[ftmp5], %[ftmp5], %[ff_pb_80] \n\t"
858 "pxor %[ftmp2], %[ftmp2], %[ff_pb_80] \n\t"
812859
813860 "psubsb %[ftmp3], %[ftmp5], %[ftmp10] \n\t"
814861 "psubsb %[ftmp4], %[ftmp9], %[ftmp6] \n\t"
816863 "paddsb %[ftmp3], %[ftmp3], %[ftmp4] \n\t"
817864 "paddsb %[ftmp3], %[ftmp3], %[ftmp4] \n\t"
818865 /* filter_value &= mask */
819 "and %[ftmp0], %[ftmp0], %[ftmp3] \n\t"
866 "pand %[ftmp0], %[ftmp0], %[ftmp3] \n\t"
820867 /* Filter2 = filter_value & hev */
821 "and %[ftmp3], %[ftmp1], %[ftmp0] \n\t"
868 "pand %[ftmp3], %[ftmp1], %[ftmp0] \n\t"
822869 /* filter_value &= ~hev */
823870 "pandn %[ftmp0], %[ftmp1], %[ftmp0] \n\t"
824871
825872 "paddsb %[ftmp4], %[ftmp3], %[ff_pb_04] \n\t"
826 "li %[tmp0], 0x0b \n\t"
827 "mtc1 %[tmp0], %[ftmp12] \n\t"
873 "dli %[tmp0], 0x0b \n\t"
874 "dmtc1 %[tmp0], %[ftmp12] \n\t"
828875 "punpcklbh %[ftmp7], %[ftmp7], %[ftmp4] \n\t"
829876 "punpckhbh %[ftmp8], %[ftmp8], %[ftmp4] \n\t"
830877 "psrah %[ftmp7], %[ftmp7], %[ftmp12] \n\t"
841888 /* ftmp6: ps0 */
842889 "paddsb %[ftmp6], %[ftmp6], %[ftmp3] \n\t"
843890
844 "li %[tmp0], 0x07 \n\t"
845 "mtc1 %[tmp0], %[ftmp12] \n\t"
891 "dli %[tmp0], 0x07 \n\t"
892 "dmtc1 %[tmp0], %[ftmp12] \n\t"
846893 VP8_MBLOOP_VPSRAB_ADDH
847894 "paddh %[ftmp1], %[ff_ph_0900], %[ff_ph_0900] \n\t"
848895 "paddh %[ftmp1], %[ftmp1], %[ff_ph_0900] \n\t"
851898 VP8_MBLOOP_VPSRAB_ADDT
852899 "psubsb %[ftmp4], %[ftmp9], %[ftmp3] \n\t"
853900 /* ftmp9: oq0 */
854 "xor %[ftmp9], %[ftmp4], %[ff_pb_80] \n\t"
901 "pxor %[ftmp9], %[ftmp4], %[ff_pb_80] \n\t"
855902 "paddsb %[ftmp4], %[ftmp6], %[ftmp3] \n\t"
856903 /* ftmp6: op0 */
857 "xor %[ftmp6], %[ftmp4], %[ff_pb_80] \n\t"
904 "pxor %[ftmp6], %[ftmp4], %[ff_pb_80] \n\t"
858905
859906 VP8_MBLOOP_VPSRAB_ADDH
860907 "paddh %[ftmp1], %[ff_ph_0900], %[ff_ph_0900] \n\t"
863910 VP8_MBLOOP_VPSRAB_ADDT
864911 "psubsb %[ftmp4], %[ftmp10], %[ftmp3] \n\t"
865912 /* ftmp10: oq1 */
866 "xor %[ftmp10], %[ftmp4], %[ff_pb_80] \n\t"
913 "pxor %[ftmp10], %[ftmp4], %[ff_pb_80] \n\t"
867914 "paddsb %[ftmp4], %[ftmp5], %[ftmp3] \n\t"
868915 /* ftmp5: op1 */
869 "xor %[ftmp5], %[ftmp4], %[ff_pb_80] \n\t"
916 "pxor %[ftmp5], %[ftmp4], %[ff_pb_80] \n\t"
870917
871918 VP8_MBLOOP_VPSRAB_ADDH
872919 "pmulhh %[ftmp7], %[ftmp7], %[ff_ph_0900] \n\t"
874921 VP8_MBLOOP_VPSRAB_ADDT
875922 "psubsb %[ftmp4], %[ftmp11], %[ftmp3] \n\t"
876923 /* ftmp11: oq2 */
877 "xor %[ftmp11], %[ftmp4], %[ff_pb_80] \n\t"
924 "pxor %[ftmp11], %[ftmp4], %[ff_pb_80] \n\t"
878925 "paddsb %[ftmp4], %[ftmp2], %[ftmp3] \n\t"
879926 /* ftmp2: op2 */
880 "xor %[ftmp2], %[ftmp4], %[ff_pb_80] \n\t"
927 "pxor %[ftmp2], %[ftmp4], %[ff_pb_80] \n\t"
881928
882929 "ldc1 %[ftmp12], 0x00(%[srct]) \n\t"
883930 "ldc1 %[ftmp8], 0x08(%[srct]) \n\t"
947994 [ftmp10]"=&f"(ftmp[10]), [ftmp11]"=&f"(ftmp[11]),
948995 [ftmp12]"=&f"(ftmp[12]), [ftmp13]"=&f"(ftmp[13]),
949996 [tmp0]"=&r"(tmp[0]), [src_ptr]"+&r"(src_ptr),
950 [count]"+&r"(count)
997 [count]"+&r"(count),
998 [ff_ph_003f]"=&f"(ff_ph_003f), [ff_ph_0900]"=&f"(ff_ph_0900),
999 [ff_pb_03]"=&f"(ff_pb_03), [ff_pb_04]"=&f"(ff_pb_04),
1000 [ff_pb_80]"=&f"(ff_pb_80), [ff_pb_fe]"=&f"(ff_pb_fe)
9511001 : [limit]"r"(limit), [blimit]"r"(blimit),
9521002 [srct]"r"(srct), [thresh]"r"(thresh),
953 [src_pixel_step]"r"((mips_reg)src_pixel_step),
954 [ff_ph_003f]"f"(ff_ph_003f), [ff_ph_0900]"f"(ff_ph_0900),
955 [ff_pb_03]"f"(ff_pb_03), [ff_pb_04]"f"(ff_pb_04),
956 [ff_pb_80]"f"(ff_pb_80), [ff_pb_fe]"f"(ff_pb_fe)
1003 [src_pixel_step]"r"((mips_reg)src_pixel_step)
9571004 : "memory"
9581005 );
1006 /* clang-format on */
9591007 }
9601008
1009 /* clang-format off */
9611010 #define VP8_SIMPLE_HPSRAB \
9621011 "psllh %[ftmp0], %[ftmp5], %[ftmp8] \n\t" \
9631012 "psrah %[ftmp0], %[ftmp0], %[ftmp9] \n\t" \
9641013 "psrlh %[ftmp0], %[ftmp0], %[ftmp8] \n\t" \
9651014 "psrah %[ftmp1], %[ftmp5], %[ftmp10] \n\t" \
9661015 "psllh %[ftmp1], %[ftmp1], %[ftmp8] \n\t" \
967 "or %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
1016 "por %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
1017 /* clang-format on */
9681018
9691019 void vp8_loop_filter_simple_horizontal_edge_mmi(unsigned char *src_ptr,
9701020 int src_pixel_step,
9711021 const unsigned char *blimit) {
972 uint32_t tmp[1], count = 2;
1022 uint64_t tmp[1], count = 2;
9731023 mips_reg addr[2];
9741024 double ftmp[12];
975
1025 double ff_pb_fe, ff_pb_80, ff_pb_04, ff_pb_01;
1026
1027 /* clang-format off */
9761028 __asm__ volatile (
977 "li %[tmp0], 0x08 \n\t"
978 "mtc1 %[tmp0], %[ftmp8] \n\t"
979 "li %[tmp0], 0x03 \n\t"
980 "mtc1 %[tmp0], %[ftmp9] \n\t"
981 "li %[tmp0], 0x0b \n\t"
982 "mtc1 %[tmp0], %[ftmp10] \n\t"
983 "li %[tmp0], 0x01 \n\t"
984 "mtc1 %[tmp0], %[ftmp11] \n\t"
1029 "dli %[tmp0], 0x0b \n\t"
1030 "dmtc1 %[tmp0], %[ftmp10] \n\t"
1031 "dli %[tmp0], 0x01 \n\t"
1032 "dmtc1 %[tmp0], %[ftmp11] \n\t"
1033 "dli %[tmp0], 0x08 \n\t"
1034 "dmtc1 %[tmp0], %[ftmp8] \n\t"
1035 "dli %[tmp0], 0x03 \n\t"
1036 "dmtc1 %[tmp0], %[ftmp9] \n\t"
1037 "dli %[tmp0], 0x0b \n\t"
1038 "dmtc1 %[tmp0], %[ftmp10] \n\t"
1039 "dli %[tmp0], 0x01 \n\t"
1040 "dmtc1 %[tmp0], %[ftmp11] \n\t"
1041 "dli %[tmp0], 0xfefefefefefefefe \n\t"
1042 "dmtc1 %[tmp0], %[ff_pb_fe] \n\t"
1043 "dli %[tmp0], 0x8080808080808080 \n\t"
1044 "dmtc1 %[tmp0], %[ff_pb_80] \n\t"
1045 "dli %[tmp0], 0x0404040404040404 \n\t"
1046 "dmtc1 %[tmp0], %[ff_pb_04] \n\t"
1047 "dli %[tmp0], 0x0101010101010101 \n\t"
1048 "dmtc1 %[tmp0], %[ff_pb_01] \n\t"
9851049
9861050 "1: \n\t"
9871051 "gsldlc1 %[ftmp3], 0x07(%[blimit]) \n\t"
9951059 "gsldlc1 %[ftmp7], 0x07(%[addr0]) \n\t"
9961060 "gsldrc1 %[ftmp7], 0x00(%[addr0]) \n\t"
9971061 "pasubub %[ftmp1], %[ftmp7], %[ftmp2] \n\t"
998 "and %[ftmp1], %[ftmp1], %[ff_pb_fe] \n\t"
1062 "pand %[ftmp1], %[ftmp1], %[ff_pb_fe] \n\t"
9991063 "psrlh %[ftmp1], %[ftmp1], %[ftmp11] \n\t"
10001064
10011065 MMI_SUBU(%[addr1], %[src_ptr], %[src_pixel_step])
10071071 "paddusb %[ftmp5], %[ftmp5], %[ftmp5] \n\t"
10081072 "paddusb %[ftmp5], %[ftmp5], %[ftmp1] \n\t"
10091073 "psubusb %[ftmp5], %[ftmp5], %[ftmp3] \n\t"
1010 "xor %[ftmp3], %[ftmp3], %[ftmp3] \n\t"
1074 "pxor %[ftmp3], %[ftmp3], %[ftmp3] \n\t"
10111075 "pcmpeqb %[ftmp5], %[ftmp5], %[ftmp3] \n\t"
10121076
1013 "xor %[ftmp2], %[ftmp2], %[ff_pb_80] \n\t"
1014 "xor %[ftmp7], %[ftmp7], %[ff_pb_80] \n\t"
1077 "pxor %[ftmp2], %[ftmp2], %[ff_pb_80] \n\t"
1078 "pxor %[ftmp7], %[ftmp7], %[ff_pb_80] \n\t"
10151079 "psubsb %[ftmp2], %[ftmp2], %[ftmp7] \n\t"
1016 "xor %[ftmp6], %[ftmp6], %[ff_pb_80] \n\t"
1017 "xor %[ftmp3], %[ftmp0], %[ff_pb_80] \n\t"
1080 "pxor %[ftmp6], %[ftmp6], %[ff_pb_80] \n\t"
1081 "pxor %[ftmp3], %[ftmp0], %[ff_pb_80] \n\t"
10181082 "psubsb %[ftmp0], %[ftmp3], %[ftmp6] \n\t"
10191083 "paddsb %[ftmp2], %[ftmp2], %[ftmp0] \n\t"
10201084 "paddsb %[ftmp2], %[ftmp2], %[ftmp0] \n\t"
10211085 "paddsb %[ftmp2], %[ftmp2], %[ftmp0] \n\t"
1022 "and %[ftmp5], %[ftmp5], %[ftmp2] \n\t"
1086 "pand %[ftmp5], %[ftmp5], %[ftmp2] \n\t"
10231087
10241088 "paddsb %[ftmp5], %[ftmp5], %[ff_pb_04] \n\t"
10251089 VP8_SIMPLE_HPSRAB
10261090 "psubsb %[ftmp3], %[ftmp3], %[ftmp0] \n\t"
1027 "xor %[ftmp3], %[ftmp3], %[ff_pb_80] \n\t"
1091 "pxor %[ftmp3], %[ftmp3], %[ff_pb_80] \n\t"
10281092 "gssdlc1 %[ftmp3], 0x07(%[src_ptr]) \n\t"
10291093 "gssdrc1 %[ftmp3], 0x00(%[src_ptr]) \n\t"
10301094
10311095 "psubsb %[ftmp5], %[ftmp5], %[ff_pb_01] \n\t"
10321096 VP8_SIMPLE_HPSRAB
10331097 "paddsb %[ftmp6], %[ftmp6], %[ftmp0] \n\t"
1034 "xor %[ftmp6], %[ftmp6], %[ff_pb_80] \n\t"
1098 "pxor %[ftmp6], %[ftmp6], %[ff_pb_80] \n\t"
10351099 MMI_SUBU(%[addr1], %[src_ptr], %[src_pixel_step])
10361100 "gssdlc1 %[ftmp6], 0x07(%[addr1]) \n\t"
10371101 "gssdrc1 %[ftmp6], 0x00(%[addr1]) \n\t"
10471111 [ftmp10]"=&f"(ftmp[10]), [ftmp11]"=&f"(ftmp[11]),
10481112 [tmp0]"=&r"(tmp[0]),
10491113 [addr0]"=&r"(addr[0]), [addr1]"=&r"(addr[1]),
1050 [src_ptr]"+&r"(src_ptr), [count]"+&r"(count)
1114 [src_ptr]"+&r"(src_ptr), [count]"+&r"(count),
1115 [ff_pb_fe]"=&f"(ff_pb_fe), [ff_pb_80]"=&f"(ff_pb_80),
1116 [ff_pb_04]"=&f"(ff_pb_04), [ff_pb_01]"=&f"(ff_pb_01)
10511117 : [blimit]"r"(blimit),
10521118 [src_pixel_step]"r"((mips_reg)src_pixel_step),
1053 [src_pixel_step_x2]"r"((mips_reg)(src_pixel_step<<1)),
1054 [ff_pb_fe]"f"(ff_pb_fe), [ff_pb_80]"f"(ff_pb_80),
1055 [ff_pb_04]"f"(ff_pb_04), [ff_pb_01]"f"(ff_pb_01)
1119 [src_pixel_step_x2]"r"((mips_reg)(src_pixel_step<<1))
10561120 : "memory"
10571121 );
1122 /* clang-format on */
10581123 }
10591124
10601125 void vp8_loop_filter_simple_vertical_edge_mmi(unsigned char *src_ptr,
10611126 int src_pixel_step,
10621127 const unsigned char *blimit) {
1063 uint32_t tmp[1], count = 2;
1128 uint64_t tmp[1], count = 2;
10641129 mips_reg addr[2];
1065 DECLARE_ALIGNED(8, const uint64_t, srct[1]);
1066 double ftmp[12];
1067
1130 DECLARE_ALIGNED(8, const uint64_t, srct[2]);
1131 double ftmp[12], ff_pb_fe, ff_pb_80, ff_pb_04, ff_pb_01;
1132
1133 /* clang-format off */
10681134 __asm__ volatile (
1069 "li %[tmp0], 0x08 \n\t"
1070 "mtc1 %[tmp0], %[ftmp8] \n\t"
1071 "li %[tmp0], 0x20 \n\t"
1072 "mtc1 %[tmp0], %[ftmp10] \n\t"
1073
1135 "dli %[tmp0], 0x08 \n\t"
1136 "dmtc1 %[tmp0], %[ftmp8] \n\t"
1137 "dli %[tmp0], 0x20 \n\t"
1138 "dmtc1 %[tmp0], %[ftmp10] \n\t"
1139 "dli %[tmp0], 0x08 \n\t"
1140 "dmtc1 %[tmp0], %[ftmp8] \n\t"
1141 "dli %[tmp0], 0x20 \n\t"
1142 "dmtc1 %[tmp0], %[ftmp10] \n\t"
1143 "dli %[tmp0], 0xfefefefefefefefe \n\t"
1144 "dmtc1 %[tmp0], %[ff_pb_fe] \n\t"
1145 "dli %[tmp0], 0x8080808080808080 \n\t"
1146 "dmtc1 %[tmp0], %[ff_pb_80] \n\t"
1147 "dli %[tmp0], 0x0404040404040404 \n\t"
1148 "dmtc1 %[tmp0], %[ff_pb_04] \n\t"
1149 "dli %[tmp0], 0x0101010101010101 \n\t"
1150 "dmtc1 %[tmp0], %[ff_pb_01] \n\t"
10741151 MMI_ADDU(%[src_ptr], %[src_ptr], %[src_pixel_step_x4])
10751152 MMI_SUBU(%[src_ptr], %[src_ptr], 0x02)
10761153
11171194 "punpckhwd %[ftmp3], %[ftmp2], %[ftmp5] \n\t"
11181195 "punpcklwd %[ftmp2], %[ftmp2], %[ftmp5] \n\t"
11191196
1120 "li %[tmp0], 0x01 \n\t"
1121 "mtc1 %[tmp0], %[ftmp9] \n\t"
1197 "dli %[tmp0], 0x01 \n\t"
1198 "dmtc1 %[tmp0], %[ftmp9] \n\t"
11221199 "pasubub %[ftmp6], %[ftmp3], %[ftmp0] \n\t"
1123 "and %[ftmp6], %[ftmp6], %[ff_pb_fe] \n\t"
1200 "pand %[ftmp6], %[ftmp6], %[ff_pb_fe] \n\t"
11241201 "psrlh %[ftmp6], %[ftmp6], %[ftmp9] \n\t"
11251202 "pasubub %[ftmp5], %[ftmp1], %[ftmp2] \n\t"
11261203 "paddusb %[ftmp5], %[ftmp5], %[ftmp5] \n\t"
11291206 "gsldlc1 %[ftmp7], 0x07(%[blimit]) \n\t"
11301207 "gsldrc1 %[ftmp7], 0x00(%[blimit]) \n\t"
11311208 "psubusb %[ftmp5], %[ftmp5], %[ftmp7] \n\t"
1132 "xor %[ftmp7], %[ftmp7], %[ftmp7] \n\t"
1209 "pxor %[ftmp7], %[ftmp7], %[ftmp7] \n\t"
11331210 "pcmpeqb %[ftmp5], %[ftmp5], %[ftmp7] \n\t"
11341211
11351212 "sdc1 %[ftmp0], 0x00(%[srct]) \n\t"
11361213 "sdc1 %[ftmp3], 0x08(%[srct]) \n\t"
11371214
1138 "xor %[ftmp0], %[ftmp0], %[ff_pb_80] \n\t"
1139 "xor %[ftmp3], %[ftmp3], %[ff_pb_80] \n\t"
1215 "pxor %[ftmp0], %[ftmp0], %[ff_pb_80] \n\t"
1216 "pxor %[ftmp3], %[ftmp3], %[ff_pb_80] \n\t"
11401217 "psubsb %[ftmp0], %[ftmp0], %[ftmp3] \n\t"
11411218
1142 "xor %[ftmp6], %[ftmp1], %[ff_pb_80] \n\t"
1143 "xor %[ftmp3], %[ftmp2], %[ff_pb_80] \n\t"
1219 "pxor %[ftmp6], %[ftmp1], %[ff_pb_80] \n\t"
1220 "pxor %[ftmp3], %[ftmp2], %[ff_pb_80] \n\t"
11441221 "psubsb %[ftmp7], %[ftmp3], %[ftmp6] \n\t"
11451222 "paddsb %[ftmp0], %[ftmp0], %[ftmp7] \n\t"
11461223 "paddsb %[ftmp0], %[ftmp0], %[ftmp7] \n\t"
11471224 "paddsb %[ftmp0], %[ftmp0], %[ftmp7] \n\t"
1148 "and %[ftmp5], %[ftmp5], %[ftmp0] \n\t"
1225 "pand %[ftmp5], %[ftmp5], %[ftmp0] \n\t"
11491226 "paddsb %[ftmp5], %[ftmp5], %[ff_pb_04] \n\t"
11501227
1151 "li %[tmp0], 0x03 \n\t"
1152 "mtc1 %[tmp0], %[ftmp9] \n\t"
1228 "dli %[tmp0], 0x03 \n\t"
1229 "dmtc1 %[tmp0], %[ftmp9] \n\t"
11531230 "psllh %[ftmp0], %[ftmp5], %[ftmp8] \n\t"
11541231 "psrah %[ftmp0], %[ftmp0], %[ftmp9] \n\t"
11551232 "psrlh %[ftmp0], %[ftmp0], %[ftmp8] \n\t"
11561233
1157 "li %[tmp0], 0x0b \n\t"
1158 "mtc1 %[tmp0], %[ftmp9] \n\t"
1234 "dli %[tmp0], 0x0b \n\t"
1235 "dmtc1 %[tmp0], %[ftmp9] \n\t"
11591236 "psrah %[ftmp7], %[ftmp5], %[ftmp9] \n\t"
11601237 "psllh %[ftmp7], %[ftmp7], %[ftmp8] \n\t"
1161 "or %[ftmp0], %[ftmp0], %[ftmp7] \n\t"
1238 "por %[ftmp0], %[ftmp0], %[ftmp7] \n\t"
11621239 "psubsb %[ftmp3], %[ftmp3], %[ftmp0] \n\t"
1163 "xor %[ftmp3], %[ftmp3], %[ff_pb_80] \n\t"
1240 "pxor %[ftmp3], %[ftmp3], %[ff_pb_80] \n\t"
11641241 "psubsb %[ftmp5], %[ftmp5], %[ff_pb_01] \n\t"
11651242
1166 "li %[tmp0], 0x03 \n\t"
1167 "mtc1 %[tmp0], %[ftmp9] \n\t"
1243 "dli %[tmp0], 0x03 \n\t"
1244 "dmtc1 %[tmp0], %[ftmp9] \n\t"
11681245 "psllh %[ftmp0], %[ftmp5], %[ftmp8] \n\t"
11691246 "psrah %[ftmp0], %[ftmp0], %[ftmp9] \n\t"
11701247 "psrlh %[ftmp0], %[ftmp0], %[ftmp8] \n\t"
11711248
1172 "li %[tmp0], 0x0b \n\t"
1173 "mtc1 %[tmp0], %[ftmp9] \n\t"
1249 "dli %[tmp0], 0x0b \n\t"
1250 "dmtc1 %[tmp0], %[ftmp9] \n\t"
11741251 "psrah %[ftmp5], %[ftmp5], %[ftmp9] \n\t"
11751252 "psllh %[ftmp5], %[ftmp5], %[ftmp8] \n\t"
1176 "or %[ftmp0], %[ftmp0], %[ftmp5] \n\t"
1253 "por %[ftmp0], %[ftmp0], %[ftmp5] \n\t"
11771254 "paddsb %[ftmp6], %[ftmp6], %[ftmp0] \n\t"
1178 "xor %[ftmp6], %[ftmp6], %[ff_pb_80] \n\t"
1255 "pxor %[ftmp6], %[ftmp6], %[ff_pb_80] \n\t"
11791256
11801257 "ldc1 %[ftmp0], 0x00(%[srct]) \n\t"
11811258 "ldc1 %[ftmp4], 0x08(%[srct]) \n\t"
11941271 "punpckhhw %[ftmp5], %[ftmp1], %[ftmp3] \n\t"
11951272 "punpcklhw %[ftmp1], %[ftmp1], %[ftmp3] \n\t"
11961273
1197 "dsrl %[ftmp0], %[ftmp0], %[ftmp10] \n\t"
1274 "ssrld %[ftmp0], %[ftmp0], %[ftmp10] \n\t"
11981275 MMI_SUBU(%[addr1], %[addr0], %[src_pixel_step_x4])
11991276 "gsswlc1 %[ftmp0], 0x03(%[addr1]) \n\t"
12001277 "gsswrc1 %[ftmp0], 0x00(%[addr1]) \n\t"
12021279 "gsswlc1 %[ftmp6], 0x03(%[addr1]) \n\t"
12031280 "gsswrc1 %[ftmp6], 0x00(%[addr1]) \n\t"
12041281
1205 "dsrl %[ftmp6], %[ftmp6], %[ftmp10] \n\t"
1282 "ssrld %[ftmp6], %[ftmp6], %[ftmp10] \n\t"
12061283 "gsswlc1 %[ftmp1], 0x03(%[src_ptr]) \n\t"
12071284 "gsswrc1 %[ftmp1], 0x00(%[src_ptr]) \n\t"
12081285
12141291 "gsswlc1 %[ftmp5], 0x03(%[addr1]) \n\t"
12151292 "gsswrc1 %[ftmp5], 0x00(%[addr1]) \n\t"
12161293
1217 "dsrl %[ftmp1], %[ftmp1], %[ftmp10] \n\t"
1294 "ssrld %[ftmp1], %[ftmp1], %[ftmp10] \n\t"
12181295 "gsswlc1 %[ftmp1], 0x03(%[addr0]) \n\t"
12191296 "gsswrc1 %[ftmp1], 0x00(%[addr0]) \n\t"
12201297
1221 "dsrl %[ftmp5], %[ftmp5], %[ftmp10] \n\t"
1298 "ssrld %[ftmp5], %[ftmp5], %[ftmp10] \n\t"
12221299 MMI_ADDU(%[addr1], %[addr0], %[src_pixel_step_x2])
12231300 "gsswlc1 %[ftmp5], 0x03(%[addr1]) \n\t"
12241301 "gsswrc1 %[ftmp5], 0x00(%[addr1]) \n\t"
12341311 [ftmp10]"=&f"(ftmp[10]), [ftmp11]"=&f"(ftmp[11]),
12351312 [tmp0]"=&r"(tmp[0]),
12361313 [addr0]"=&r"(addr[0]), [addr1]"=&r"(addr[1]),
1237 [src_ptr]"+&r"(src_ptr), [count]"+&r"(count)
1314 [src_ptr]"+&r"(src_ptr), [count]"+&r"(count),
1315 [ff_pb_fe]"=&f"(ff_pb_fe), [ff_pb_80]"=&f"(ff_pb_80),
1316 [ff_pb_04]"=&f"(ff_pb_04), [ff_pb_01]"=&f"(ff_pb_01)
12381317 : [blimit]"r"(blimit), [srct]"r"(srct),
12391318 [src_pixel_step]"r"((mips_reg)src_pixel_step),
12401319 [src_pixel_step_x2]"r"((mips_reg)(src_pixel_step<<1)),
12411320 [src_pixel_step_x4]"r"((mips_reg)(src_pixel_step<<2)),
1242 [src_pixel_step_x8]"r"((mips_reg)(src_pixel_step<<3)),
1243 [ff_pb_fe]"f"(ff_pb_fe), [ff_pb_80]"f"(ff_pb_80),
1244 [ff_pb_04]"f"(ff_pb_04), [ff_pb_01]"f"(ff_pb_01)
1321 [src_pixel_step_x8]"r"((mips_reg)(src_pixel_step<<3))
12451322 : "memory"
12461323 );
1324 /* clang-format on */
12471325 }
12481326
12491327 /* Horizontal MB filtering */
6969 unsigned int output_height,
7070 unsigned int output_width,
7171 const int16_t *vp8_filter) {
72 uint32_t tmp[1];
73 DECLARE_ALIGNED(8, const uint64_t, ff_ph_40) = { 0x0040004000400040ULL };
74
72 uint64_t tmp[1];
73 double ff_ph_40;
7574 #if _MIPS_SIM == _ABIO32
7675 register double fzero asm("$f0");
7776 register double ftmp0 asm("$f2");
102101 register double ftmp11 asm("$f12");
103102 #endif // _MIPS_SIM == _ABIO32
104103
104 /* clang-format off */
105105 __asm__ volatile (
106 "dli %[tmp0], 0x0040004000400040 \n\t"
107 "dmtc1 %[tmp0], %[ff_ph_40] \n\t"
106108 "ldc1 %[ftmp0], 0x00(%[vp8_filter]) \n\t"
107109 "ldc1 %[ftmp1], 0x10(%[vp8_filter]) \n\t"
108110 "ldc1 %[ftmp2], 0x20(%[vp8_filter]) \n\t"
109111 "ldc1 %[ftmp3], 0x30(%[vp8_filter]) \n\t"
110112 "ldc1 %[ftmp4], 0x40(%[vp8_filter]) \n\t"
111113 "ldc1 %[ftmp5], 0x50(%[vp8_filter]) \n\t"
112 "xor %[fzero], %[fzero], %[fzero] \n\t"
113 "li %[tmp0], 0x07 \n\t"
114 "mtc1 %[tmp0], %[ftmp7] \n\t"
115 "li %[tmp0], 0x08 \n\t"
116 "mtc1 %[tmp0], %[ftmp11] \n\t"
114 "pxor %[fzero], %[fzero], %[fzero] \n\t"
115 "dli %[tmp0], 0x07 \n\t"
116 "dmtc1 %[tmp0], %[ftmp7] \n\t"
117 "dli %[tmp0], 0x08 \n\t"
118 "dmtc1 %[tmp0], %[ftmp11] \n\t"
117119
118120 "1: \n\t"
119121 "gsldlc1 %[ftmp9], 0x05(%[src_ptr]) \n\t"
136138 "pmullh %[ftmp6], %[ftmp6], %[ftmp5] \n\t"
137139 "paddsh %[ftmp8], %[ftmp8], %[ftmp6] \n\t"
138140
139 "dsrl %[ftmp10], %[ftmp10], %[ftmp11] \n\t"
141 "ssrld %[ftmp10], %[ftmp10], %[ftmp11] \n\t"
140142 "punpcklbh %[ftmp6], %[ftmp10], %[fzero] \n\t"
141143 "pmullh %[ftmp6], %[ftmp6], %[ftmp2] \n\t"
142144 "paddsh %[ftmp8], %[ftmp8], %[ftmp6] \n\t"
143145
144 "dsrl %[ftmp10], %[ftmp10], %[ftmp11] \n\t"
146 "ssrld %[ftmp10], %[ftmp10], %[ftmp11] \n\t"
145147 "punpcklbh %[ftmp6], %[ftmp10], %[fzero] \n\t"
146148 "pmullh %[ftmp6], %[ftmp6], %[ftmp3] \n\t"
147149 "paddsh %[ftmp8], %[ftmp8], %[ftmp6] \n\t"
165167 [ftmp9]"=&f"(ftmp9), [ftmp10]"=&f"(ftmp10),
166168 [ftmp11]"=&f"(ftmp11), [tmp0]"=&r"(tmp[0]),
167169 [output_ptr]"+&r"(output_ptr), [output_height]"+&r"(output_height),
168 [src_ptr]"+&r"(src_ptr)
170 [src_ptr]"+&r"(src_ptr), [ff_ph_40]"=&f"(ff_ph_40)
169171 : [src_pixels_per_line]"r"((mips_reg)src_pixels_per_line),
170 [vp8_filter]"r"(vp8_filter), [output_width]"r"(output_width),
171 [ff_ph_40]"f"(ff_ph_40)
172 [vp8_filter]"r"(vp8_filter), [output_width]"r"(output_width)
172173 : "memory"
173174 );
175 /* clang-format on */
174176 }
175177
176178 /* Horizontal filter: pixel_step is always W */
177179 static INLINE void vp8_filter_block1dc_v6_mmi(
178180 uint16_t *src_ptr, unsigned char *output_ptr, unsigned int output_height,
179181 int output_pitch, unsigned int pixels_per_line, const int16_t *vp8_filter) {
180 DECLARE_ALIGNED(8, const uint64_t, ff_ph_40) = { 0x0040004000400040ULL };
181 uint32_t tmp[1];
182 double ff_ph_40;
183 uint64_t tmp[1];
182184 mips_reg addr[1];
185
183186 #if _MIPS_SIM == _ABIO32
184187 register double fzero asm("$f0");
185188 register double ftmp0 asm("$f2");
214217 register double ftmp13 asm("$f14");
215218 #endif // _MIPS_SIM == _ABIO32
216219
220 /* clang-format off */
217221 __asm__ volatile (
222 "dli %[tmp0], 0x0040004000400040 \n\t"
223 "dmtc1 %[tmp0], %[ff_ph_40] \n\t"
218224 "ldc1 %[ftmp0], 0x00(%[vp8_filter]) \n\t"
219225 "ldc1 %[ftmp1], 0x10(%[vp8_filter]) \n\t"
220226 "ldc1 %[ftmp2], 0x20(%[vp8_filter]) \n\t"
221227 "ldc1 %[ftmp3], 0x30(%[vp8_filter]) \n\t"
222228 "ldc1 %[ftmp4], 0x40(%[vp8_filter]) \n\t"
223229 "ldc1 %[ftmp5], 0x50(%[vp8_filter]) \n\t"
224 "xor %[fzero], %[fzero], %[fzero] \n\t"
225 "li %[tmp0], 0x07 \n\t"
226 "mtc1 %[tmp0], %[ftmp13] \n\t"
230 "pxor %[fzero], %[fzero], %[fzero] \n\t"
231 "dli %[tmp0], 0x07 \n\t"
232 "dmtc1 %[tmp0], %[ftmp13] \n\t"
227233
228234 /* In order to make full use of memory load delay slot,
229235 * Operation of memory loading and calculating has been rearranged.
284290 [ftmp11]"=&f"(ftmp11), [ftmp12]"=&f"(ftmp12),
285291 [ftmp13]"=&f"(ftmp13), [tmp0]"=&r"(tmp[0]),
286292 [addr0]"=&r"(addr[0]), [src_ptr]"+&r"(src_ptr),
287 [output_ptr]"+&r"(output_ptr), [output_height]"+&r"(output_height)
293 [output_ptr]"+&r"(output_ptr), [output_height]"+&r"(output_height),
294 [ff_ph_40]"=&f"(ff_ph_40)
288295 : [pixels_per_line]"r"((mips_reg)pixels_per_line),
289296 [pixels_per_line_x2]"r"((mips_reg)(pixels_per_line<<1)),
290297 [pixels_per_line_x4]"r"((mips_reg)(pixels_per_line<<2)),
291298 [vp8_filter]"r"(vp8_filter),
292 [output_pitch]"r"((mips_reg)output_pitch),
293 [ff_ph_40]"f"(ff_ph_40)
299 [output_pitch]"r"((mips_reg)output_pitch)
294300 : "memory"
295301 );
302 /* clang-format on */
296303 }
297304
298305 /* When xoffset == 0, vp8_filter= {0,0,128,0,0,0},
312319 register double ftmp1 asm("$f2");
313320 #endif // _MIPS_SIM == _ABIO32
314321
322 /* clang-format off */
315323 __asm__ volatile (
316 "xor %[fzero], %[fzero], %[fzero] \n\t"
324 "pxor %[fzero], %[fzero], %[fzero] \n\t"
317325
318326 "1: \n\t"
319327 "gsldlc1 %[ftmp0], 0x07(%[src_ptr]) \n\t"
334342 [output_width]"r"(output_width)
335343 : "memory"
336344 );
345 /* clang-format on */
337346 }
338347
339348 static INLINE void vp8_filter_block1dc_v6_filter0_mmi(
349358 register double ftmp1 asm("$f2");
350359 #endif // _MIPS_SIM == _ABIO32
351360
361 /* clang-format on */
352362 __asm__ volatile (
353 "xor %[fzero], %[fzero], %[fzero] \n\t"
363 "pxor %[fzero], %[fzero], %[fzero] \n\t"
354364
355365 "1: \n\t"
356366 "gsldlc1 %[ftmp0], 0x07(%[src_ptr]) \n\t"
370380 [output_pitch]"r"((mips_reg)output_pitch)
371381 : "memory"
372382 );
383 /* clang-format on */
373384 }
374385
375386 #define sixtapNxM(n, m) \
121121 const uint8_t *psrc_m = (const uint8_t *)(psrc); \
122122 uint32_t val_m; \
123123 \
124 asm volatile("ulw %[val_m], %[psrc_m] \n\t" \
125 \
126 : [val_m] "=r"(val_m) \
127 : [psrc_m] "m"(*psrc_m)); \
124 asm volatile("lwr %[val_m], 0(%[psrc_m]) \n\t" \
125 "lwl %[val_m], 3(%[psrc_m]) \n\t" \
126 : [val_m] "=&r"(val_m) \
127 : [psrc_m] "r"(psrc_m)); \
128128 \
129129 val_m; \
130130 })
135135 const uint8_t *psrc_m = (const uint8_t *)(psrc); \
136136 uint64_t val_m = 0; \
137137 \
138 asm volatile("uld %[val_m], %[psrc_m] \n\t" \
139 \
140 : [val_m] "=r"(val_m) \
141 : [psrc_m] "m"(*psrc_m)); \
138 asm volatile("ldr %[val_m], 0(%[psrc_m]) \n\t" \
139 "ldl %[val_m], 7(%[psrc_m]) \n\t" \
140 : [val_m] "=&r"(val_m) \
141 : [psrc_m] "r"(psrc_m)); \
142142 \
143143 val_m; \
144144 })
170170 #define sem_wait(sem) (semaphore_wait(*sem))
171171 #define sem_post(sem) semaphore_signal(*sem)
172172 #define sem_destroy(sem) semaphore_destroy(mach_task_self(), *sem)
173 #define thread_sleep(nms)
174 /* { struct timespec ts;ts.tv_sec=0; ts.tv_nsec =
175 1000*nms;nanosleep(&ts, NULL);} */
176173 #else
177174 #include <unistd.h>
178175 #include <sched.h>
179 #define thread_sleep(nms) sched_yield();
176 #endif /* __APPLE__ */
177 /* Not Windows. Assume pthreads */
178
179 /* thread_sleep implementation: yield unless Linux/Unix. */
180 #if defined(__unix__) || defined(__APPLE__)
181 #define thread_sleep(nms)
180182 /* {struct timespec ts;ts.tv_sec=0;
181183 ts.tv_nsec = 1000*nms;nanosleep(&ts, NULL);} */
182 #endif
183 /* Not Windows. Assume pthreads */
184 #else
185 #define thread_sleep(nms) sched_yield();
186 #endif /* __unix__ || __APPLE__ */
184187
185188 #endif
186189
99
1010 #include "vpx_config.h"
1111 #include "vp8_rtcd.h"
12 #if !defined(WIN32) && CONFIG_OS_SUPPORT == 1
12 #if !defined(_WIN32) && CONFIG_OS_SUPPORT == 1
1313 #include <unistd.h>
1414 #endif
1515 #include "onyxd_int.h"
342342 const int nsync = cpi->mt_sync_range;
343343 vpx_atomic_int rightmost_col = VPX_ATOMIC_INIT(cm->mb_cols + nsync);
344344 const vpx_atomic_int *last_row_current_mb_col;
345 vpx_atomic_int *current_mb_col = &cpi->mt_current_mb_col[mb_row];
346
345 vpx_atomic_int *current_mb_col = NULL;
346
347 if (vpx_atomic_load_acquire(&cpi->b_multi_threaded) != 0) {
348 current_mb_col = &cpi->mt_current_mb_col[mb_row];
349 }
347350 if (vpx_atomic_load_acquire(&cpi->b_multi_threaded) != 0 && mb_row != 0) {
348351 last_row_current_mb_col = &cpi->mt_current_mb_col[mb_row - 1];
349352 } else {
2323 "punpcklhw %[ftmp5], %[ftmp1], %[ftmp0] \n\t" \
2424 "punpcklhw %[ftmp9], %[ftmp2], %[ftmp0] \n\t" \
2525 "pshufh %[ftmp9], %[ftmp9], %[ftmp10] \n\t" \
26 "or %[ftmp5], %[ftmp5], %[ftmp9] \n\t" \
26 "por %[ftmp5], %[ftmp5], %[ftmp9] \n\t" \
2727 "punpckhhw %[ftmp6], %[ftmp1], %[ftmp0] \n\t" \
2828 "punpckhhw %[ftmp9], %[ftmp2], %[ftmp0] \n\t" \
2929 "pshufh %[ftmp9], %[ftmp9], %[ftmp10] \n\t" \
30 "or %[ftmp6], %[ftmp6], %[ftmp9] \n\t" \
30 "por %[ftmp6], %[ftmp6], %[ftmp9] \n\t" \
3131 "punpcklhw %[ftmp7], %[ftmp3], %[ftmp0] \n\t" \
3232 "punpcklhw %[ftmp9], %[ftmp4], %[ftmp0] \n\t" \
3333 "pshufh %[ftmp9], %[ftmp9], %[ftmp10] \n\t" \
34 "or %[ftmp7], %[ftmp7], %[ftmp9] \n\t" \
34 "por %[ftmp7], %[ftmp7], %[ftmp9] \n\t" \
3535 "punpckhhw %[ftmp8], %[ftmp3], %[ftmp0] \n\t" \
3636 "punpckhhw %[ftmp9], %[ftmp4], %[ftmp0] \n\t" \
3737 "pshufh %[ftmp9], %[ftmp9], %[ftmp10] \n\t" \
38 "or %[ftmp8], %[ftmp8], %[ftmp9] \n\t" \
38 "por %[ftmp8], %[ftmp8], %[ftmp9] \n\t" \
3939 "punpcklwd %[ftmp1], %[ftmp5], %[ftmp7] \n\t" \
4040 "punpckhwd %[ftmp2], %[ftmp5], %[ftmp7] \n\t" \
4141 "punpcklwd %[ftmp3], %[ftmp6], %[ftmp8] \n\t" \
4545 void vp8_short_fdct4x4_mmi(int16_t *input, int16_t *output, int pitch) {
4646 uint64_t tmp[1];
4747 int16_t *ip = input;
48 double ff_ph_op1, ff_ph_op3;
4849
4950 #if _MIPS_SIM == _ABIO32
5051 register double ftmp0 asm("$f0");
8283 DECLARE_ALIGNED(8, const uint64_t, ff_pw_51000) = { 0x0000c7380000c738ULL };
8384 DECLARE_ALIGNED(8, const uint64_t, ff_pw_14500) = { 0x000038a4000038a4ULL };
8485 DECLARE_ALIGNED(8, const uint64_t, ff_pw_7500) = { 0x00001d4c00001d4cULL };
85 DECLARE_ALIGNED(8, const uint64_t, ff_ph_op1) = { 0x14e808a914e808a9ULL };
86 DECLARE_ALIGNED(8, const uint64_t, ff_ph_op3) = { 0xeb1808a9eb1808a9ULL };
8786 DECLARE_ALIGNED(8, const uint64_t, ff_pw_5352) = { 0x000014e8000014e8ULL };
8887 DECLARE_ALIGNED(8, const uint64_t, ff_pw_2217) = { 0x000008a9000008a9ULL };
8988 DECLARE_ALIGNED(8, const uint64_t, ff_ph_8) = { 0x0008000800080008ULL };
9089
90 /* clang-format off */
9191 __asm__ volatile (
92 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
92 "dli %[tmp0], 0x14e808a914e808a9 \n\t"
93 "dmtc1 %[tmp0], %[ff_ph_op1] \n\t"
94 "dli %[tmp0], 0xeb1808a9eb1808a9 \n\t"
95 "dmtc1 %[tmp0], %[ff_ph_op3] \n\t"
96 "pxor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
9397 "gsldlc1 %[ftmp1], 0x07(%[ip]) \n\t"
9498 "gsldrc1 %[ftmp1], 0x00(%[ip]) \n\t"
9599 MMI_ADDU(%[ip], %[ip], %[pitch])
128132
129133 // op[1] = (c1 * 2217 + d1 * 5352 + 14500) >> 12
130134 MMI_LI(%[tmp0], 0x0c)
131 "mtc1 %[tmp0], %[ftmp11] \n\t"
135 "dmtc1 %[tmp0], %[ftmp11] \n\t"
132136 "ldc1 %[ftmp12], %[ff_pw_14500] \n\t"
133137 "punpcklhw %[ftmp9], %[ftmp7], %[ftmp8] \n\t"
134138 "pmaddhw %[ftmp5], %[ftmp9], %[ff_ph_op1] \n\t"
168172 "paddh %[ftmp1], %[ftmp1], %[ftmp9] \n\t"
169173 "paddh %[ftmp2], %[ftmp2], %[ftmp9] \n\t"
170174 MMI_LI(%[tmp0], 0x04)
171 "mtc1 %[tmp0], %[ftmp9] \n\t"
175 "dmtc1 %[tmp0], %[ftmp9] \n\t"
172176 "psrah %[ftmp1], %[ftmp1], %[ftmp9] \n\t"
173177 "psrah %[ftmp2], %[ftmp2], %[ftmp9] \n\t"
174178
210214 [ftmp3] "=&f"(ftmp3), [ftmp4] "=&f"(ftmp4), [ftmp5] "=&f"(ftmp5),
211215 [ftmp6] "=&f"(ftmp6), [ftmp7] "=&f"(ftmp7), [ftmp8] "=&f"(ftmp8),
212216 [ftmp9] "=&f"(ftmp9), [ftmp10] "=&f"(ftmp10), [ftmp11] "=&f"(ftmp11),
213 [ftmp12] "=&f"(ftmp12), [tmp0] "=&r"(tmp[0]), [ip]"+&r"(ip)
217 [ftmp12] "=&f"(ftmp12), [tmp0] "=&r"(tmp[0]), [ip]"+&r"(ip),
218 [ff_ph_op1] "=&f"(ff_ph_op1), [ff_ph_op3] "=&f"(ff_ph_op3)
214219 : [ff_ph_01] "m"(ff_ph_01), [ff_ph_07] "m"(ff_ph_07),
215 [ff_ph_op1] "f"(ff_ph_op1), [ff_ph_op3] "f"(ff_ph_op3),
216220 [ff_pw_14500] "m"(ff_pw_14500), [ff_pw_7500] "m"(ff_pw_7500),
217221 [ff_pw_12000] "m"(ff_pw_12000), [ff_pw_51000] "m"(ff_pw_51000),
218222 [ff_pw_5352]"m"(ff_pw_5352), [ff_pw_2217]"m"(ff_pw_2217),
219223 [ff_ph_8]"m"(ff_ph_8), [pitch]"r"(pitch), [output] "r"(output)
220224 : "memory"
221225 );
226 /* clang-format on */
222227 }
223228
224229 void vp8_short_fdct8x4_mmi(int16_t *input, int16_t *output, int pitch) {
227232 }
228233
229234 void vp8_short_walsh4x4_mmi(int16_t *input, int16_t *output, int pitch) {
230 double ftmp[13];
231 uint32_t tmp[1];
232 DECLARE_ALIGNED(8, const uint64_t, ff_ph_01) = { 0x0001000100010001ULL };
233 DECLARE_ALIGNED(8, const uint64_t, ff_pw_01) = { 0x0000000100000001ULL };
234 DECLARE_ALIGNED(8, const uint64_t, ff_pw_03) = { 0x0000000300000003ULL };
235 DECLARE_ALIGNED(8, const uint64_t, ff_pw_mask) = { 0x0001000000010000ULL };
236
235 double ftmp[13], ff_ph_01, ff_pw_01, ff_pw_03, ff_pw_mask;
236 uint64_t tmp[1];
237
238 /* clang-format off */
237239 __asm__ volatile (
240 "dli %[tmp0], 0x0001000100010001 \n\t"
241 "dmtc1 %[tmp0], %[ff_ph_01] \n\t"
242 "dli %[tmp0], 0x0000000100000001 \n\t"
243 "dmtc1 %[tmp0], %[ff_pw_01] \n\t"
244 "dli %[tmp0], 0x0000000300000003 \n\t"
245 "dmtc1 %[tmp0], %[ff_pw_03] \n\t"
246 "dli %[tmp0], 0x0001000000010000 \n\t"
247 "dmtc1 %[tmp0], %[ff_pw_mask] \n\t"
238248 MMI_LI(%[tmp0], 0x02)
239 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
240 "mtc1 %[tmp0], %[ftmp11] \n\t"
249 "pxor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
250 "dmtc1 %[tmp0], %[ftmp11] \n\t"
241251
242252 "gsldlc1 %[ftmp1], 0x07(%[ip]) \n\t"
243253 "gsldrc1 %[ftmp1], 0x00(%[ip]) \n\t"
336346 "psubw %[ftmp4], %[ftmp9], %[ftmp10] \n\t"
337347
338348 MMI_LI(%[tmp0], 0x03)
339 "mtc1 %[tmp0], %[ftmp11] \n\t"
349 "dmtc1 %[tmp0], %[ftmp11] \n\t"
340350
341351 "pcmpgtw %[ftmp9], %[ftmp0], %[ftmp1] \n\t"
342 "and %[ftmp9], %[ftmp9], %[ff_pw_01] \n\t"
352 "pand %[ftmp9], %[ftmp9], %[ff_pw_01] \n\t"
343353 "paddw %[ftmp1], %[ftmp1], %[ftmp9] \n\t"
344354 "paddw %[ftmp1], %[ftmp1], %[ff_pw_03] \n\t"
345355 "psraw %[ftmp1], %[ftmp1], %[ftmp11] \n\t"
346356
347357 "pcmpgtw %[ftmp9], %[ftmp0], %[ftmp2] \n\t"
348 "and %[ftmp9], %[ftmp9], %[ff_pw_01] \n\t"
358 "pand %[ftmp9], %[ftmp9], %[ff_pw_01] \n\t"
349359 "paddw %[ftmp2], %[ftmp2], %[ftmp9] \n\t"
350360 "paddw %[ftmp2], %[ftmp2], %[ff_pw_03] \n\t"
351361 "psraw %[ftmp2], %[ftmp2], %[ftmp11] \n\t"
352362
353363 "pcmpgtw %[ftmp9], %[ftmp0], %[ftmp3] \n\t"
354 "and %[ftmp9], %[ftmp9], %[ff_pw_01] \n\t"
364 "pand %[ftmp9], %[ftmp9], %[ff_pw_01] \n\t"
355365 "paddw %[ftmp3], %[ftmp3], %[ftmp9] \n\t"
356366 "paddw %[ftmp3], %[ftmp3], %[ff_pw_03] \n\t"
357367 "psraw %[ftmp3], %[ftmp3], %[ftmp11] \n\t"
358368
359369 "pcmpgtw %[ftmp9], %[ftmp0], %[ftmp4] \n\t"
360 "and %[ftmp9], %[ftmp9], %[ff_pw_01] \n\t"
370 "pand %[ftmp9], %[ftmp9], %[ff_pw_01] \n\t"
361371 "paddw %[ftmp4], %[ftmp4], %[ftmp9] \n\t"
362372 "paddw %[ftmp4], %[ftmp4], %[ff_pw_03] \n\t"
363373 "psraw %[ftmp4], %[ftmp4], %[ftmp11] \n\t"
364374
365375 "pcmpgtw %[ftmp9], %[ftmp0], %[ftmp5] \n\t"
366 "and %[ftmp9], %[ftmp9], %[ff_pw_01] \n\t"
376 "pand %[ftmp9], %[ftmp9], %[ff_pw_01] \n\t"
367377 "paddw %[ftmp5], %[ftmp5], %[ftmp9] \n\t"
368378 "paddw %[ftmp5], %[ftmp5], %[ff_pw_03] \n\t"
369379 "psraw %[ftmp5], %[ftmp5], %[ftmp11] \n\t"
370380
371381 "pcmpgtw %[ftmp9], %[ftmp0], %[ftmp6] \n\t"
372 "and %[ftmp9], %[ftmp9], %[ff_pw_01] \n\t"
382 "pand %[ftmp9], %[ftmp9], %[ff_pw_01] \n\t"
373383 "paddw %[ftmp6], %[ftmp6], %[ftmp9] \n\t"
374384 "paddw %[ftmp6], %[ftmp6], %[ff_pw_03] \n\t"
375385 "psraw %[ftmp6], %[ftmp6], %[ftmp11] \n\t"
376386
377387 "pcmpgtw %[ftmp9], %[ftmp0], %[ftmp7] \n\t"
378 "and %[ftmp9], %[ftmp9], %[ff_pw_01] \n\t"
388 "pand %[ftmp9], %[ftmp9], %[ff_pw_01] \n\t"
379389 "paddw %[ftmp7], %[ftmp7], %[ftmp9] \n\t"
380390 "paddw %[ftmp7], %[ftmp7], %[ff_pw_03] \n\t"
381391 "psraw %[ftmp7], %[ftmp7], %[ftmp11] \n\t"
382392
383393 "pcmpgtw %[ftmp9], %[ftmp0], %[ftmp8] \n\t"
384 "and %[ftmp9], %[ftmp9], %[ff_pw_01] \n\t"
394 "pand %[ftmp9], %[ftmp9], %[ff_pw_01] \n\t"
385395 "paddw %[ftmp8], %[ftmp8], %[ftmp9] \n\t"
386396 "paddw %[ftmp8], %[ftmp8], %[ff_pw_03] \n\t"
387397 "psraw %[ftmp8], %[ftmp8], %[ftmp11] \n\t"
392402 "packsswh %[ftmp4], %[ftmp4], %[ftmp8] \n\t"
393403
394404 MMI_LI(%[tmp0], 0x72)
395 "mtc1 %[tmp0], %[ftmp11] \n\t"
405 "dmtc1 %[tmp0], %[ftmp11] \n\t"
396406 "pshufh %[ftmp1], %[ftmp1], %[ftmp11] \n\t"
397407 "pshufh %[ftmp2], %[ftmp2], %[ftmp11] \n\t"
398408 "pshufh %[ftmp3], %[ftmp3], %[ftmp11] \n\t"
412422 [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]),
413423 [ftmp8]"=&f"(ftmp[8]), [ftmp9]"=&f"(ftmp[9]),
414424 [ftmp10]"=&f"(ftmp[10]), [ftmp11]"=&f"(ftmp[11]),
415 [ftmp12]"=&f"(ftmp[12]),
416 [tmp0]"=&r"(tmp[0]),
417 [ip]"+&r"(input)
418 : [op]"r"(output),
419 [ff_pw_01]"f"(ff_pw_01), [pitch]"r"((mips_reg)pitch),
420 [ff_pw_03]"f"(ff_pw_03), [ff_pw_mask]"f"(ff_pw_mask),
421 [ff_ph_01]"f"(ff_ph_01)
425 [ftmp12]"=&f"(ftmp[12]), [ff_pw_mask]"=&f"(ff_pw_mask),
426 [tmp0]"=&r"(tmp[0]), [ff_pw_01]"=&f"(ff_pw_01),
427 [ip]"+&r"(input), [ff_pw_03]"=&f"(ff_pw_03),
428 [ff_ph_01]"=&f"(ff_ph_01)
429 : [op]"r"(output), [pitch]"r"((mips_reg)pitch)
422430 : "memory"
423431 );
432 /* clang-format on */
424433 }
4141
4242 double ftmp[13];
4343 uint64_t tmp[1];
44 DECLARE_ALIGNED(8, const uint64_t, ones) = { 0xffffffffffffffffULL };
45 int eob = 0;
44 int64_t eob = 0;
45 double ones;
4646
4747 __asm__ volatile(
4848 // loop 0 ~ 7
49 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
49 "pxor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
50 "pcmpeqh %[ones], %[ones], %[ones] \n\t"
5051 "gsldlc1 %[ftmp1], 0x07(%[coeff_ptr]) \n\t"
5152 "gsldrc1 %[ftmp1], 0x00(%[coeff_ptr]) \n\t"
52 "li %[tmp0], 0x0f \n\t"
53 "mtc1 %[tmp0], %[ftmp9] \n\t"
53 "dli %[tmp0], 0x0f \n\t"
54 "dmtc1 %[tmp0], %[ftmp9] \n\t"
5455 "gsldlc1 %[ftmp2], 0x0f(%[coeff_ptr]) \n\t"
5556 "gsldrc1 %[ftmp2], 0x08(%[coeff_ptr]) \n\t"
5657
5758 "psrah %[ftmp3], %[ftmp1], %[ftmp9] \n\t"
58 "xor %[ftmp1], %[ftmp3], %[ftmp1] \n\t"
59 "pxor %[ftmp1], %[ftmp3], %[ftmp1] \n\t"
5960 "psubh %[ftmp1], %[ftmp1], %[ftmp3] \n\t"
6061 "psrah %[ftmp4], %[ftmp2], %[ftmp9] \n\t"
61 "xor %[ftmp2], %[ftmp4], %[ftmp2] \n\t"
62 "pxor %[ftmp2], %[ftmp4], %[ftmp2] \n\t"
6263 "psubh %[ftmp2], %[ftmp2], %[ftmp4] \n\t"
6364
6465 "gsldlc1 %[ftmp5], 0x07(%[round_ptr]) \n\t"
7475 "pmulhuh %[ftmp5], %[ftmp5], %[ftmp7] \n\t"
7576 "pmulhuh %[ftmp6], %[ftmp6], %[ftmp8] \n\t"
7677
77 "xor %[ftmp7], %[ftmp5], %[ftmp3] \n\t"
78 "xor %[ftmp8], %[ftmp6], %[ftmp4] \n\t"
78 "pxor %[ftmp7], %[ftmp5], %[ftmp3] \n\t"
79 "pxor %[ftmp8], %[ftmp6], %[ftmp4] \n\t"
7980 "psubh %[ftmp7], %[ftmp7], %[ftmp3] \n\t"
8081 "psubh %[ftmp8], %[ftmp8], %[ftmp4] \n\t"
8182 "gssdlc1 %[ftmp7], 0x07(%[qcoeff_ptr]) \n\t"
8990 "gsldrc1 %[ftmp2], 0x08(%[inv_zig_zag]) \n\t"
9091 "pcmpeqh %[ftmp5], %[ftmp5], %[ftmp0] \n\t"
9192 "pcmpeqh %[ftmp6], %[ftmp6], %[ftmp0] \n\t"
92 "xor %[ftmp5], %[ftmp5], %[ones] \n\t"
93 "xor %[ftmp6], %[ftmp6], %[ones] \n\t"
94 "and %[ftmp5], %[ftmp5], %[ftmp1] \n\t"
95 "and %[ftmp6], %[ftmp6], %[ftmp2] \n\t"
93 "pxor %[ftmp5], %[ftmp5], %[ones] \n\t"
94 "pxor %[ftmp6], %[ftmp6], %[ones] \n\t"
95 "pand %[ftmp5], %[ftmp5], %[ftmp1] \n\t"
96 "pand %[ftmp6], %[ftmp6], %[ftmp2] \n\t"
9697 "pmaxsh %[ftmp10], %[ftmp5], %[ftmp6] \n\t"
9798
9899 "gsldlc1 %[ftmp5], 0x07(%[dequant_ptr]) \n\t"
113114 "gsldrc1 %[ftmp2], 0x18(%[coeff_ptr]) \n\t"
114115
115116 "psrah %[ftmp3], %[ftmp1], %[ftmp9] \n\t"
116 "xor %[ftmp1], %[ftmp3], %[ftmp1] \n\t"
117 "pxor %[ftmp1], %[ftmp3], %[ftmp1] \n\t"
117118 "psubh %[ftmp1], %[ftmp1], %[ftmp3] \n\t"
118119 "psrah %[ftmp4], %[ftmp2], %[ftmp9] \n\t"
119 "xor %[ftmp2], %[ftmp4], %[ftmp2] \n\t"
120 "pxor %[ftmp2], %[ftmp4], %[ftmp2] \n\t"
120121 "psubh %[ftmp2], %[ftmp2], %[ftmp4] \n\t"
121122
122123 "gsldlc1 %[ftmp5], 0x17(%[round_ptr]) \n\t"
132133 "pmulhuh %[ftmp5], %[ftmp5], %[ftmp7] \n\t"
133134 "pmulhuh %[ftmp6], %[ftmp6], %[ftmp8] \n\t"
134135
135 "xor %[ftmp7], %[ftmp5], %[ftmp3] \n\t"
136 "xor %[ftmp8], %[ftmp6], %[ftmp4] \n\t"
136 "pxor %[ftmp7], %[ftmp5], %[ftmp3] \n\t"
137 "pxor %[ftmp8], %[ftmp6], %[ftmp4] \n\t"
137138 "psubh %[ftmp7], %[ftmp7], %[ftmp3] \n\t"
138139 "psubh %[ftmp8], %[ftmp8], %[ftmp4] \n\t"
139140 "gssdlc1 %[ftmp7], 0x17(%[qcoeff_ptr]) \n\t"
147148 "gsldrc1 %[ftmp2], 0x18(%[inv_zig_zag]) \n\t"
148149 "pcmpeqh %[ftmp5], %[ftmp5], %[ftmp0] \n\t"
149150 "pcmpeqh %[ftmp6], %[ftmp6], %[ftmp0] \n\t"
150 "xor %[ftmp5], %[ftmp5], %[ones] \n\t"
151 "xor %[ftmp6], %[ftmp6], %[ones] \n\t"
152 "and %[ftmp5], %[ftmp5], %[ftmp1] \n\t"
153 "and %[ftmp6], %[ftmp6], %[ftmp2] \n\t"
151 "pxor %[ftmp5], %[ftmp5], %[ones] \n\t"
152 "pxor %[ftmp6], %[ftmp6], %[ones] \n\t"
153 "pand %[ftmp5], %[ftmp5], %[ftmp1] \n\t"
154 "pand %[ftmp6], %[ftmp6], %[ftmp2] \n\t"
154155 "pmaxsh %[ftmp11], %[ftmp5], %[ftmp6] \n\t"
155156
156157 "gsldlc1 %[ftmp5], 0x17(%[dequant_ptr]) \n\t"
164165 "gssdlc1 %[ftmp6], 0x1f(%[dqcoeff_ptr]) \n\t"
165166 "gssdrc1 %[ftmp6], 0x18(%[dqcoeff_ptr]) \n\t"
166167
167 "li %[tmp0], 0x10 \n\t"
168 "mtc1 %[tmp0], %[ftmp9] \n\t"
168 "dli %[tmp0], 0x10 \n\t"
169 "dmtc1 %[tmp0], %[ftmp9] \n\t"
169170
170171 "pmaxsh %[ftmp10], %[ftmp10], %[ftmp11] \n\t"
171172 "psrlw %[ftmp11], %[ftmp10], %[ftmp9] \n\t"
172173 "pmaxsh %[ftmp10], %[ftmp10], %[ftmp11] \n\t"
173 "li %[tmp0], 0xaa \n\t"
174 "mtc1 %[tmp0], %[ftmp9] \n\t"
174 "dli %[tmp0], 0xaa \n\t"
175 "dmtc1 %[tmp0], %[ftmp9] \n\t"
175176 "pshufh %[ftmp11], %[ftmp10], %[ftmp9] \n\t"
176177 "pmaxsh %[ftmp10], %[ftmp10], %[ftmp11] \n\t"
177 "li %[tmp0], 0xffff \n\t"
178 "mtc1 %[tmp0], %[ftmp9] \n\t"
179 "and %[ftmp10], %[ftmp10], %[ftmp9] \n\t"
178 "dli %[tmp0], 0xffff \n\t"
179 "dmtc1 %[tmp0], %[ftmp9] \n\t"
180 "pand %[ftmp10], %[ftmp10], %[ftmp9] \n\t"
180181 "gssdlc1 %[ftmp10], 0x07(%[eob]) \n\t"
181182 "gssdrc1 %[ftmp10], 0x00(%[eob]) \n\t"
182183 : [ftmp0] "=&f"(ftmp[0]), [ftmp1] "=&f"(ftmp[1]), [ftmp2] "=&f"(ftmp[2]),
183184 [ftmp3] "=&f"(ftmp[3]), [ftmp4] "=&f"(ftmp[4]), [ftmp5] "=&f"(ftmp[5]),
184185 [ftmp6] "=&f"(ftmp[6]), [ftmp7] "=&f"(ftmp[7]), [ftmp8] "=&f"(ftmp[8]),
185186 [ftmp9] "=&f"(ftmp[9]), [ftmp10] "=&f"(ftmp[10]),
186 [ftmp11] "=&f"(ftmp[11]), [ftmp12] "=&f"(ftmp[12]), [tmp0] "=&r"(tmp[0])
187 [ftmp11] "=&f"(ftmp[11]), [ftmp12] "=&f"(ftmp[12]),
188 [tmp0] "=&r"(tmp[0]), [ones] "=&f"(ones)
187189 : [coeff_ptr] "r"((mips_reg)coeff_ptr),
188190 [qcoeff_ptr] "r"((mips_reg)qcoeff_ptr),
189191 [dequant_ptr] "r"((mips_reg)dequant_ptr),
190192 [round_ptr] "r"((mips_reg)round_ptr),
191193 [quant_ptr] "r"((mips_reg)quant_ptr),
192194 [dqcoeff_ptr] "r"((mips_reg)dqcoeff_ptr),
193 [inv_zig_zag] "r"((mips_reg)inv_zig_zag), [eob] "r"((mips_reg)&eob),
194 [ones] "f"(ones)
195 [inv_zig_zag] "r"((mips_reg)inv_zig_zag), [eob] "r"((mips_reg)&eob)
195196 : "memory");
196197
197198 *d->eob = eob;
216217 // memset(dqcoeff_ptr, 0, 32);
217218 /* clang-format off */
218219 __asm__ volatile (
219 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
220 "pxor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
220221 "gssdlc1 %[ftmp0], 0x07(%[qcoeff_ptr]) \n\t"
221222 "gssdrc1 %[ftmp0], 0x00(%[qcoeff_ptr]) \n\t"
222223 "gssdlc1 %[ftmp0], 0x0f(%[qcoeff_ptr]) \n\t"
7474
7575 // TODO(angiebird): Set frame_index/frame_coding_index on the decoder side
7676 // properly.
77 int frame_index; // Display order in the video, it's equivalent to the
78 // show_idx defined in EncodeFrameInfo.
79 #if CONFIG_RATE_CTRL
77 int frame_index; // Display order in the video, it's equivalent to the
78 // show_idx defined in EncodeFrameInfo.
8079 int frame_coding_index; // The coding order (starting from zero) of this
8180 // frame.
82 #endif // CONFIG_RATE_CTRL
8381 vpx_codec_frame_buffer_t raw_frame_buffer;
8482 YV12_BUFFER_CONFIG buf;
8583 } RefCntBuffer;
239237 // TODO(angiebird): current_video_frame/current_frame_coding_index into a
240238 // structure
241239 unsigned int current_video_frame;
242 #if CONFIG_RATE_CTRL
243240 // Each show or no show frame is assigned with a coding index based on its
244241 // coding order (starting from zero).
245242
246243 // Current frame's coding index.
247244 int current_frame_coding_index;
248 #endif
249245 BITSTREAM_PROFILE profile;
250246
251247 // VPX_BITS_8 in profile 0 or 1, VPX_BITS_10 or VPX_BITS_12 in profile 2 or 3.
275271
276272 static INLINE void init_frame_indexes(VP9_COMMON *cm) {
277273 cm->current_video_frame = 0;
278 #if CONFIG_RATE_CTRL
279274 cm->current_frame_coding_index = 0;
280 #endif // CONFIG_RATE_CTRL
281275 }
282276
283277 static INLINE void update_frame_indexes(VP9_COMMON *cm, int show_frame) {
286280 // update not a real frame
287281 ++cm->current_video_frame;
288282 }
289 #if CONFIG_RATE_CTRL
290283 ++cm->current_frame_coding_index;
291 #endif // CONFIG_RATE_CTRL
292284 }
293285
294286 typedef struct {
10231023 #if CONFIG_RATE_CTRL
10241024 free_partition_info(cpi);
10251025 free_motion_vector_info(cpi);
1026 free_fp_motion_vector_info(cpi);
1027 free_tpl_stats_info(cpi);
10261028 #endif
10271029
10281030 vp9_free_ref_frame_buffers(cm->buffer_pool);
23142316 cpi->frame_info = vp9_get_frame_info(oxcf);
23152317
23162318 vp9_rc_init(&cpi->oxcf, oxcf->pass, &cpi->rc);
2319 vp9_init_rd_parameters(cpi);
23172320
23182321 init_frame_indexes(cm);
23192322 cpi->partition_search_skippable_frame = 0;
24612464
24622465 cpi->allow_encode_breakout = ENCODE_BREAKOUT_ENABLED;
24632466
2467 {
2468 vpx_codec_err_t codec_status = vp9_extrc_init(&cpi->ext_ratectrl);
2469 if (codec_status != VPX_CODEC_OK) {
2470 vpx_internal_error(&cm->error, codec_status, "vp9_extrc_init() failed");
2471 }
2472 }
2473
24642474 #if !CONFIG_REALTIME_ONLY
24652475 if (oxcf->pass == 1) {
24662476 vp9_init_first_pass(cpi);
26602670 encode_command_init(&cpi->encode_command);
26612671 partition_info_init(cpi);
26622672 motion_vector_info_init(cpi);
2673 fp_motion_vector_info_init(cpi);
2674 tpl_stats_info_init(cpi);
26632675 #endif
26642676
26652677 return cpi;
28302842 cpi->twopass.frame_mb_stats_buf = NULL;
28312843 }
28322844 #endif
2845
2846 vp9_extrc_delete(&cpi->ext_ratectrl);
28332847
28342848 vp9_remove_common(cm);
28352849 vp9_free_ref_frame_buffers(cm->buffer_pool);
33103324 // Skip loop filter in show_existing_frame mode.
33113325 if (cm->show_existing_frame) {
33123326 lf->filter_level = 0;
3327 return;
3328 }
3329
3330 if (cpi->loopfilter_ctrl == NO_LOOPFILTER ||
3331 (!is_reference_frame && cpi->loopfilter_ctrl == LOOPFILTER_REFERENCE)) {
3332 lf->filter_level = 0;
3333 vpx_extend_frame_inner_borders(cm->frame_to_show);
33133334 return;
33143335 }
33153336
40434064 // For 1 pass CBR SVC, only ZEROMV is allowed for spatial reference frame
40444065 // when svc->force_zero_mode_spatial_ref = 1. Under those conditions we can
40454066 // avoid this frame-level upsampling (for non intra_only frames).
4067 // For SVC single_layer mode, dynamic resize is allowed and we need to
4068 // scale references for this case.
40464069 if (frame_is_intra_only(cm) == 0 &&
4047 !(is_one_pass_cbr_svc(cpi) && svc->force_zero_mode_spatial_ref)) {
4070 ((svc->single_layer_svc && cpi->oxcf.resize_mode == RESIZE_DYNAMIC) ||
4071 !(is_one_pass_cbr_svc(cpi) && svc->force_zero_mode_spatial_ref))) {
40484072 vp9_scale_references(cpi);
40494073 }
40504074
41894213 return 1;
41904214 }
41914215
4216 static int get_ref_frame_flags(const VP9_COMP *cpi) {
4217 const int *const map = cpi->common.ref_frame_map;
4218 const int gold_is_last = map[cpi->gld_fb_idx] == map[cpi->lst_fb_idx];
4219 const int alt_is_last = map[cpi->alt_fb_idx] == map[cpi->lst_fb_idx];
4220 const int gold_is_alt = map[cpi->gld_fb_idx] == map[cpi->alt_fb_idx];
4221 int flags = VP9_ALT_FLAG | VP9_GOLD_FLAG | VP9_LAST_FLAG;
4222
4223 if (gold_is_last) flags &= ~VP9_GOLD_FLAG;
4224
4225 if (cpi->rc.frames_till_gf_update_due == INT_MAX &&
4226 (cpi->svc.number_temporal_layers == 1 &&
4227 cpi->svc.number_spatial_layers == 1))
4228 flags &= ~VP9_GOLD_FLAG;
4229
4230 if (alt_is_last) flags &= ~VP9_ALT_FLAG;
4231
4232 if (gold_is_alt) flags &= ~VP9_ALT_FLAG;
4233
4234 return flags;
4235 }
4236
41924237 #if !CONFIG_REALTIME_ONLY
41934238 #define MAX_QSTEP_ADJ 4
41944239 static int get_qstep_adj(int rate_excess, int rate_limit) {
41974242 return VPXMIN(qstep, MAX_QSTEP_ADJ);
41984243 }
41994244
4200 static void encode_with_recode_loop(VP9_COMP *cpi, size_t *size,
4201 uint8_t *dest) {
4245 #if CONFIG_RATE_CTRL
4246 static void init_rq_history(RATE_QINDEX_HISTORY *rq_history) {
4247 rq_history->recode_count = 0;
4248 rq_history->q_index_high = 255;
4249 rq_history->q_index_low = 0;
4250 }
4251
4252 static void update_rq_history(RATE_QINDEX_HISTORY *rq_history, int target_bits,
4253 int actual_bits, int q_index) {
4254 rq_history->q_index_history[rq_history->recode_count] = q_index;
4255 rq_history->rate_history[rq_history->recode_count] = actual_bits;
4256 if (actual_bits <= target_bits) {
4257 rq_history->q_index_high = q_index;
4258 }
4259 if (actual_bits >= target_bits) {
4260 rq_history->q_index_low = q_index;
4261 }
4262 rq_history->recode_count += 1;
4263 }
4264
4265 static int guess_q_index_from_model(const RATE_QSTEP_MODEL *rq_model,
4266 int target_bits) {
4267 // The model predicts bits as follows.
4268 // target_bits = bias - ratio * log2(q_step)
4269 // Given the target_bits, we compute the q_step as follows.
4270 double q_step;
4271 assert(rq_model->ratio > 0);
4272 q_step = pow(2.0, (rq_model->bias - target_bits) / rq_model->ratio);
4273 // TODO(angiebird): Make this function support highbitdepth.
4274 return vp9_convert_q_to_qindex(q_step, VPX_BITS_8);
4275 }
4276
4277 static int guess_q_index_linear(int prev_q_index, int target_bits,
4278 int actual_bits, int gap) {
4279 int q_index = prev_q_index;
4280 if (actual_bits < target_bits) {
4281 q_index -= gap;
4282 q_index = VPXMAX(q_index, 0);
4283 } else {
4284 q_index += gap;
4285 q_index = VPXMIN(q_index, 255);
4286 }
4287 return q_index;
4288 }
4289
4290 static double get_bits_percent_diff(int target_bits, int actual_bits) {
4291 double diff;
4292 target_bits = VPXMAX(target_bits, 1);
4293 diff = abs(target_bits - actual_bits) * 1. / target_bits;
4294 return diff * 100;
4295 }
4296
4297 static int rq_model_predict_q_index(const RATE_QSTEP_MODEL *rq_model,
4298 const RATE_QINDEX_HISTORY *rq_history,
4299 int target_bits) {
4300 int q_index = 128;
4301 if (rq_history->recode_count > 0) {
4302 const int actual_bits =
4303 rq_history->rate_history[rq_history->recode_count - 1];
4304 const int prev_q_index =
4305 rq_history->q_index_history[rq_history->recode_count - 1];
4306 const double percent_diff = get_bits_percent_diff(target_bits, actual_bits);
4307 if (percent_diff > 50) {
4308 // Binary search.
4309 // When the actual_bits and target_bits are far apart, binary search
4310 // q_index is faster.
4311 q_index = (rq_history->q_index_low + rq_history->q_index_high) / 2;
4312 } else {
4313 if (rq_model->ready) {
4314 q_index = guess_q_index_from_model(rq_model, target_bits);
4315 } else {
4316 // TODO(angiebird): Find a better way to set the gap.
4317 q_index =
4318 guess_q_index_linear(prev_q_index, target_bits, actual_bits, 20);
4319 }
4320 }
4321 } else {
4322 if (rq_model->ready) {
4323 q_index = guess_q_index_from_model(rq_model, target_bits);
4324 }
4325 }
4326
4327 assert(rq_history->q_index_low <= rq_history->q_index_high);
4328 if (q_index <= rq_history->q_index_low) {
4329 q_index = rq_history->q_index_low + 1;
4330 }
4331 if (q_index >= rq_history->q_index_high) {
4332 q_index = rq_history->q_index_high - 1;
4333 }
4334 return q_index;
4335 }
4336
4337 static void rq_model_update(const RATE_QINDEX_HISTORY *rq_history,
4338 int target_bits, RATE_QSTEP_MODEL *rq_model) {
4339 const int recode_count = rq_history->recode_count;
4340 const double delta = 0.00001;
4341 if (recode_count >= 2) {
4342 const int q_index1 = rq_history->q_index_history[recode_count - 2];
4343 const int q_index2 = rq_history->q_index_history[recode_count - 1];
4344 const int r1 = rq_history->rate_history[recode_count - 2];
4345 const int r2 = rq_history->rate_history[recode_count - 1];
4346 int valid = 0;
4347 // lower q_index should yield higher bit rate
4348 if (q_index1 < q_index2) {
4349 valid = r1 > r2;
4350 } else if (q_index1 > q_index2) {
4351 valid = r1 < r2;
4352 }
4353 // Only update the model when the q_index and rate behave normally.
4354 if (valid) {
4355 // Fit the ratio and bias of rq_model based on last two recode histories.
4356 const double s1 = vp9_convert_qindex_to_q(q_index1, VPX_BITS_8);
4357 const double s2 = vp9_convert_qindex_to_q(q_index2, VPX_BITS_8);
4358 if (fabs(log2(s1) - log2(s2)) > delta) {
4359 rq_model->ratio = (r2 - r1) / (log2(s1) - log2(s2));
4360 rq_model->bias = r1 + (rq_model->ratio) * log2(s1);
4361 if (rq_model->ratio > delta && rq_model->bias > delta) {
4362 rq_model->ready = 1;
4363 }
4364 }
4365 }
4366 } else if (recode_count == 1) {
4367 if (rq_model->ready) {
4368 // Update the ratio only when the initial model exists and we only have
4369 // one recode history.
4370 const int prev_q = rq_history->q_index_history[recode_count - 1];
4371 const double prev_q_step = vp9_convert_qindex_to_q(prev_q, VPX_BITS_8);
4372 if (fabs(log2(prev_q_step)) > delta) {
4373 const int actual_bits = rq_history->rate_history[recode_count - 1];
4374 rq_model->ratio =
4375 rq_model->ratio + (target_bits - actual_bits) / log2(prev_q_step);
4376 }
4377 }
4378 }
4379 }
4380 #endif // CONFIG_RATE_CTRL
4381
4382 static void encode_with_recode_loop(VP9_COMP *cpi, size_t *size, uint8_t *dest
4383 #if CONFIG_RATE_CTRL
4384 ,
4385 RATE_QINDEX_HISTORY *rq_history
4386 #endif // CONFIG_RATE_CTRL
4387 ) {
42024388 const VP9EncoderConfig *const oxcf = &cpi->oxcf;
42034389 VP9_COMMON *const cm = &cpi->common;
42044390 RATE_CONTROL *const rc = &cpi->rc;
42164402 int qrange_adj = 1;
42174403 #endif
42184404
4405 // A flag which indicates whether we are recoding the current frame
4406 // when the current frame size is larger than the max frame size in the
4407 // external rate control model.
4408 // This flag doesn't have any impact when external rate control is not used.
4409 int ext_rc_recode = 0;
4410 // Maximal frame size allowed by the external rate control.
4411 // case: 0, we ignore the max frame size limit, and encode with the qindex
4412 // passed in by the external rate control model.
4413 // case: -1, we take VP9's decision for the max frame size.
4414 int ext_rc_max_frame_size = 0;
4415
4416 #if CONFIG_RATE_CTRL
4417 const FRAME_UPDATE_TYPE update_type =
4418 cpi->twopass.gf_group.update_type[cpi->twopass.gf_group.index];
4419 const ENCODE_FRAME_TYPE frame_type = get_encode_frame_type(update_type);
4420 RATE_QSTEP_MODEL *rq_model = &cpi->rq_model[frame_type];
4421 init_rq_history(rq_history);
4422 #endif // CONFIG_RATE_CTRL
4423
42194424 if (cm->show_existing_frame) {
42204425 rc->this_frame_target = 0;
42214426 if (is_psnr_calc_enabled(cpi)) set_raw_source_frame(cpi);
42624467 loop_at_this_size = 0;
42634468 }
42644469
4470 #if CONFIG_RATE_CTRL
4471 if (cpi->encode_command.use_external_target_frame_bits) {
4472 q = rq_model_predict_q_index(rq_model, rq_history, rc->this_frame_target);
4473 }
4474 #endif // CONFIG_RATE_CTRL
42654475 // Decide frame size bounds first time through.
42664476 if (loop_count == 0) {
42674477 vp9_rc_compute_frame_size_bounds(cpi, rc->this_frame_target,
43084518 q = cpi->encode_command.external_quantize_index;
43094519 }
43104520 #endif
4521 if (cpi->ext_ratectrl.ready && !ext_rc_recode) {
4522 vpx_codec_err_t codec_status;
4523 const GF_GROUP *gf_group = &cpi->twopass.gf_group;
4524 vpx_rc_encodeframe_decision_t encode_frame_decision;
4525 FRAME_UPDATE_TYPE update_type = gf_group->update_type[gf_group->index];
4526 const int ref_frame_flags = get_ref_frame_flags(cpi);
4527 RefCntBuffer *ref_frame_bufs[MAX_INTER_REF_FRAMES];
4528 const RefCntBuffer *curr_frame_buf =
4529 get_ref_cnt_buffer(cm, cm->new_fb_idx);
4530 get_ref_frame_bufs(cpi, ref_frame_bufs);
4531 codec_status = vp9_extrc_get_encodeframe_decision(
4532 &cpi->ext_ratectrl, curr_frame_buf->frame_index,
4533 cm->current_frame_coding_index, gf_group->index, update_type,
4534 ref_frame_bufs, ref_frame_flags, &encode_frame_decision);
4535 if (codec_status != VPX_CODEC_OK) {
4536 vpx_internal_error(&cm->error, codec_status,
4537 "vp9_extrc_get_encodeframe_decision() failed");
4538 }
4539 q = encode_frame_decision.q_index;
4540 ext_rc_max_frame_size = encode_frame_decision.max_frame_size;
4541 }
43114542
43124543 vp9_set_quantizer(cpi, q);
43134544
43474578 if (frame_over_shoot_limit == 0) frame_over_shoot_limit = 1;
43484579 }
43494580
4581 if (cpi->ext_ratectrl.ready) {
4582 // In general, for the external rate control, we take the qindex provided
4583 // as input and encode the frame with this qindex faithfully. However,
4584 // in some extreme scenarios, the provided qindex leads to a massive
4585 // overshoot of frame size. In this case, we fall back to VP9's decision
4586 // to pick a new qindex and recode the frame. We return the new qindex
4587 // through the API to the external model.
4588 if (ext_rc_max_frame_size == 0) {
4589 break;
4590 } else if (ext_rc_max_frame_size == -1) {
4591 if (rc->projected_frame_size < rc->max_frame_bandwidth) {
4592 break;
4593 }
4594 } else {
4595 if (rc->projected_frame_size < ext_rc_max_frame_size) {
4596 break;
4597 }
4598 }
4599 ext_rc_recode = 1;
4600 }
43504601 #if CONFIG_RATE_CTRL
43514602 // This part needs to be after save_coding_context() because
43524603 // restore_coding_context will be called in the end of this function.
43554606 if (cpi->encode_command.use_external_quantize_index) {
43564607 break;
43574608 }
4358 #endif
4609
4610 if (cpi->encode_command.use_external_target_frame_bits) {
4611 const double percent_diff = get_bits_percent_diff(
4612 rc->this_frame_target, rc->projected_frame_size);
4613 update_rq_history(rq_history, rc->this_frame_target,
4614 rc->projected_frame_size, q);
4615 loop_count += 1;
4616
4617 rq_model_update(rq_history, rc->this_frame_target, rq_model);
4618
4619 // Check if we hit the target bitrate.
4620 if (percent_diff <= cpi->encode_command.target_frame_bits_error_percent ||
4621 rq_history->recode_count >= RATE_CTRL_MAX_RECODE_NUM ||
4622 rq_history->q_index_low >= rq_history->q_index_high) {
4623 break;
4624 }
4625
4626 loop = 1;
4627 restore_coding_context(cpi);
4628 continue;
4629 }
4630 #endif // CONFIG_RATE_CTRL
43594631
43604632 if (oxcf->rc_mode == VPX_Q) {
43614633 loop = 0;
45694841 }
45704842 }
45714843 #endif // !CONFIG_REALTIME_ONLY
4572
4573 static int get_ref_frame_flags(const VP9_COMP *cpi) {
4574 const int *const map = cpi->common.ref_frame_map;
4575 const int gold_is_last = map[cpi->gld_fb_idx] == map[cpi->lst_fb_idx];
4576 const int alt_is_last = map[cpi->alt_fb_idx] == map[cpi->lst_fb_idx];
4577 const int gold_is_alt = map[cpi->gld_fb_idx] == map[cpi->alt_fb_idx];
4578 int flags = VP9_ALT_FLAG | VP9_GOLD_FLAG | VP9_LAST_FLAG;
4579
4580 if (gold_is_last) flags &= ~VP9_GOLD_FLAG;
4581
4582 if (cpi->rc.frames_till_gf_update_due == INT_MAX &&
4583 (cpi->svc.number_temporal_layers == 1 &&
4584 cpi->svc.number_spatial_layers == 1))
4585 flags &= ~VP9_GOLD_FLAG;
4586
4587 if (alt_is_last) flags &= ~VP9_ALT_FLAG;
4588
4589 if (gold_is_alt) flags &= ~VP9_ALT_FLAG;
4590
4591 return flags;
4592 }
45934844
45944845 static void set_ext_overrides(VP9_COMP *cpi) {
45954846 // Overrides the defaults with the externally supplied values with
48955146 const GF_GROUP *const gf_group = &cpi->twopass.gf_group;
48965147 ref_buffer->frame_index =
48975148 cm->current_video_frame + gf_group->arf_src_offset[gf_group->index];
4898 #if CONFIG_RATE_CTRL
48995149 ref_buffer->frame_coding_index = cm->current_frame_coding_index;
4900 #endif // CONFIG_RATE_CTRL
49015150 }
49025151 }
49035152
51005349 #if CONFIG_RATE_CTRL
51015350 const PARTITION_INFO *partition_info,
51025351 const MOTION_VECTOR_INFO *motion_vector_info,
5352 const TplDepStats *tpl_stats_info,
51035353 #endif // CONFIG_RATE_CTRL
51045354 ENCODE_FRAME_RESULT *encode_frame_result);
51055355 #endif // !CONFIG_REALTIME_ONLY
52055455 if (!encode_without_recode_loop(cpi, size, dest)) return;
52065456 } else {
52075457 #if !CONFIG_REALTIME_ONLY
5458 #if CONFIG_RATE_CTRL
5459 encode_with_recode_loop(cpi, size, dest, &encode_frame_result->rq_history);
5460 #else // CONFIG_RATE_CTRL
52085461 encode_with_recode_loop(cpi, size, dest);
5209 #endif
5462 #endif // CONFIG_RATE_CTRL
5463 #endif // !CONFIG_REALTIME_ONLY
52105464 }
52115465
52125466 // TODO(jingning): When using show existing frame mode, we assume that the
52715525 // build the bitstream
52725526 vp9_pack_bitstream(cpi, dest, size);
52735527
5528 {
5529 const RefCntBuffer *coded_frame_buf =
5530 get_ref_cnt_buffer(cm, cm->new_fb_idx);
5531 vpx_codec_err_t codec_status = vp9_extrc_update_encodeframe_result(
5532 &cpi->ext_ratectrl, (*size) << 3, cpi->Source, &coded_frame_buf->buf,
5533 cm->bit_depth, cpi->oxcf.input_bit_depth, cm->base_qindex);
5534 if (codec_status != VPX_CODEC_OK) {
5535 vpx_internal_error(&cm->error, codec_status,
5536 "vp9_extrc_update_encodeframe_result() failed");
5537 }
5538 }
52745539 #if CONFIG_REALTIME_ONLY
52755540 (void)encode_frame_result;
52765541 assert(encode_frame_result == NULL);
53015566 ref_frame_flags,
53025567 cpi->twopass.gf_group.update_type[cpi->twopass.gf_group.index],
53035568 cpi->Source, coded_frame_buf, ref_frame_bufs, vp9_get_quantizer(cpi),
5304 cpi->oxcf.input_bit_depth, cm->bit_depth, cpi->td.counts,
5569 cm->bit_depth, cpi->oxcf.input_bit_depth, cpi->td.counts,
53055570 #if CONFIG_RATE_CTRL
5306 cpi->partition_info, cpi->motion_vector_info,
5571 cpi->partition_info, cpi->motion_vector_info, cpi->tpl_stats_info,
53075572 #endif // CONFIG_RATE_CTRL
53085573 encode_frame_result);
53095574 }
54585723 unsigned int *frame_flags,
54595724 ENCODE_FRAME_RESULT *encode_frame_result) {
54605725 cpi->allow_encode_breakout = ENCODE_BREAKOUT_ENABLED;
5726
5727 if (cpi->common.current_frame_coding_index == 0) {
5728 VP9_COMMON *cm = &cpi->common;
5729 const vpx_codec_err_t codec_status = vp9_extrc_send_firstpass_stats(
5730 &cpi->ext_ratectrl, &cpi->twopass.first_pass_info);
5731 if (codec_status != VPX_CODEC_OK) {
5732 vpx_internal_error(&cm->error, codec_status,
5733 "vp9_extrc_send_firstpass_stats() failed");
5734 }
5735 }
54615736 #if CONFIG_MISMATCH_DEBUG
54625737 mismatch_move_frame_idx_w();
54635738 #endif
71497424 }
71507425 }
71517426
7427 #if CONFIG_RATE_CTRL
7428 static void accumulate_frame_tpl_stats(VP9_COMP *cpi) {
7429 VP9_COMMON *const cm = &cpi->common;
7430 const GF_GROUP *gf_group = &cpi->twopass.gf_group;
7431 int show_frame_count = 0;
7432 int frame_idx;
7433 // Accumulate tpl stats for each frame in the current group of picture.
7434 for (frame_idx = 1; frame_idx < gf_group->gf_group_size; ++frame_idx) {
7435 TplDepFrame *tpl_frame = &cpi->tpl_stats[frame_idx];
7436 TplDepStats *tpl_stats = tpl_frame->tpl_stats_ptr;
7437 const int tpl_stride = tpl_frame->stride;
7438 int64_t intra_cost_base = 0;
7439 int64_t inter_cost_base = 0;
7440 int64_t mc_dep_cost_base = 0;
7441 int64_t mc_ref_cost_base = 0;
7442 int64_t mc_flow_base = 0;
7443 int row, col;
7444
7445 if (!tpl_frame->is_valid) continue;
7446
7447 for (row = 0; row < cm->mi_rows && tpl_frame->is_valid; ++row) {
7448 for (col = 0; col < cm->mi_cols; ++col) {
7449 TplDepStats *this_stats = &tpl_stats[row * tpl_stride + col];
7450 intra_cost_base += this_stats->intra_cost;
7451 inter_cost_base += this_stats->inter_cost;
7452 mc_dep_cost_base += this_stats->mc_dep_cost;
7453 mc_ref_cost_base += this_stats->mc_ref_cost;
7454 mc_flow_base += this_stats->mc_flow;
7455 }
7456 }
7457
7458 cpi->tpl_stats_info[show_frame_count].intra_cost = intra_cost_base;
7459 cpi->tpl_stats_info[show_frame_count].inter_cost = inter_cost_base;
7460 cpi->tpl_stats_info[show_frame_count].mc_dep_cost = mc_dep_cost_base;
7461 cpi->tpl_stats_info[show_frame_count].mc_ref_cost = mc_ref_cost_base;
7462 cpi->tpl_stats_info[show_frame_count].mc_flow = mc_flow_base;
7463
7464 ++show_frame_count;
7465 }
7466 }
7467 #endif // CONFIG_RATE_CTRL
7468
71527469 static void setup_tpl_stats(VP9_COMP *cpi) {
71537470 GF_PICTURE gf_picture[MAX_ARF_GOP_SIZE];
71547471 const GF_GROUP *gf_group = &cpi->twopass.gf_group;
71717488 dump_tpl_stats(cpi, tpl_group_frames, gf_group, gf_picture, cpi->tpl_bsize);
71727489 #endif // DUMP_TPL_STATS
71737490 #endif // CONFIG_NON_GREEDY_MV
7491
7492 #if CONFIG_RATE_CTRL
7493 accumulate_frame_tpl_stats(cpi);
7494 #endif // CONFIG_RATE_CTRL
7495 }
7496
7497 void vp9_get_ref_frame_info(FRAME_UPDATE_TYPE update_type, int ref_frame_flags,
7498 RefCntBuffer *ref_frame_bufs[MAX_INTER_REF_FRAMES],
7499 int *ref_frame_coding_indexes,
7500 int *ref_frame_valid_list) {
7501 if (update_type != KF_UPDATE) {
7502 const VP9_REFFRAME inter_ref_flags[MAX_INTER_REF_FRAMES] = { VP9_LAST_FLAG,
7503 VP9_GOLD_FLAG,
7504 VP9_ALT_FLAG };
7505 int i;
7506 for (i = 0; i < MAX_INTER_REF_FRAMES; ++i) {
7507 assert(ref_frame_bufs[i] != NULL);
7508 ref_frame_coding_indexes[i] = ref_frame_bufs[i]->frame_coding_index;
7509 ref_frame_valid_list[i] = (ref_frame_flags & inter_ref_flags[i]) != 0;
7510 }
7511 } else {
7512 // No reference frame is available when this is a key frame.
7513 int i;
7514 for (i = 0; i < MAX_INTER_REF_FRAMES; ++i) {
7515 ref_frame_coding_indexes[i] = -1;
7516 ref_frame_valid_list[i] = 0;
7517 }
7518 }
71747519 }
71757520
71767521 #if !CONFIG_REALTIME_ONLY
73207665 }
73217666 }
73227667 #endif // CONFIG_RATE_CTRL
7668
73237669 static void update_encode_frame_result(
73247670 int ref_frame_flags, FRAME_UPDATE_TYPE update_type,
73257671 const YV12_BUFFER_CONFIG *source_frame, const RefCntBuffer *coded_frame_buf,
73287674 #if CONFIG_RATE_CTRL
73297675 const PARTITION_INFO *partition_info,
73307676 const MOTION_VECTOR_INFO *motion_vector_info,
7677 const TplDepStats *tpl_stats_info,
73317678 #endif // CONFIG_RATE_CTRL
73327679 ENCODE_FRAME_RESULT *encode_frame_result) {
73337680 #if CONFIG_RATE_CTRL
73347681 PSNR_STATS psnr;
73357682 #if CONFIG_VP9_HIGHBITDEPTH
7336 vpx_calc_highbd_psnr(source_frame, coded_frame_buf->buf, &psnr, bit_depth,
7683 vpx_calc_highbd_psnr(source_frame, &coded_frame_buf->buf, &psnr, bit_depth,
73377684 input_bit_depth);
73387685 #else // CONFIG_VP9_HIGHBITDEPTH
73397686 (void)bit_depth;
73427689 #endif // CONFIG_VP9_HIGHBITDEPTH
73437690 encode_frame_result->frame_coding_index = coded_frame_buf->frame_coding_index;
73447691
7345 if (update_type != KF_UPDATE) {
7346 const VP9_REFFRAME inter_ref_flags[MAX_INTER_REF_FRAMES] = { VP9_LAST_FLAG,
7347 VP9_GOLD_FLAG,
7348 VP9_ALT_FLAG };
7349 int i;
7350 for (i = 0; i < MAX_INTER_REF_FRAMES; ++i) {
7351 assert(ref_frame_bufs[i] != NULL);
7352 encode_frame_result->ref_frame_coding_indexes[i] =
7353 ref_frame_bufs[i]->frame_coding_index;
7354 encode_frame_result->ref_frame_valid_list[i] =
7355 (ref_frame_flags & inter_ref_flags[i]) != 0;
7356 }
7357 } else {
7358 // No reference frame is available when this is a key frame.
7359 int i;
7360 for (i = 0; i < MAX_INTER_REF_FRAMES; ++i) {
7361 encode_frame_result->ref_frame_coding_indexes[i] = -1;
7362 encode_frame_result->ref_frame_valid_list[i] = 0;
7363 }
7364 }
7692 vp9_get_ref_frame_info(update_type, ref_frame_flags, ref_frame_bufs,
7693 encode_frame_result->ref_frame_coding_indexes,
7694 encode_frame_result->ref_frame_valid_list);
7695
73657696 encode_frame_result->psnr = psnr.psnr[0];
73667697 encode_frame_result->sse = psnr.sse[0];
73677698 copy_frame_counts(counts, &encode_frame_result->frame_counts);
73687699 encode_frame_result->partition_info = partition_info;
73697700 encode_frame_result->motion_vector_info = motion_vector_info;
7701 encode_frame_result->tpl_stats_info = tpl_stats_info;
73707702 if (encode_frame_result->coded_frame.allocated) {
73717703 yv12_buffer_to_image_buffer(&coded_frame_buf->buf,
73727704 &encode_frame_result->coded_frame);
73927724 encode_frame_result->frame_coding_index = -1;
73937725 vp9_zero(encode_frame_result->coded_frame);
73947726 encode_frame_result->coded_frame.allocated = 0;
7727 init_rq_history(&encode_frame_result->rq_history);
73957728 #endif // CONFIG_RATE_CTRL
73967729 }
73977730
75787911 cm->new_fb_idx = get_free_fb(cm);
75797912
75807913 if (cm->new_fb_idx == INVALID_IDX) return -1;
7581
75827914 cm->cur_frame = &pool->frame_bufs[cm->new_fb_idx];
7583
7915 // If the frame buffer for current frame is the same as previous frame, MV in
7916 // the base layer shouldn't be used as it'll cause data race.
7917 if (cpi->svc.spatial_layer_id > 0 && cm->cur_frame == cm->prev_frame) {
7918 cpi->svc.use_base_mv = 0;
7919 }
75847920 // Start with a 0 size frame.
75857921 *size = 0;
75867922
1414
1515 #include "./vpx_config.h"
1616 #include "vpx/internal/vpx_codec_internal.h"
17 #include "vpx/vpx_ext_ratectrl.h"
1718 #include "vpx/vp8cx.h"
1819 #if CONFIG_INTERNAL_STATS
1920 #include "vpx_dsp/ssim.h"
3738 #include "vp9/encoder/vp9_context_tree.h"
3839 #include "vp9/encoder/vp9_encodemb.h"
3940 #include "vp9/encoder/vp9_ethread.h"
41 #include "vp9/encoder/vp9_ext_ratectrl.h"
4042 #include "vp9/encoder/vp9_firstpass.h"
4143 #include "vp9/encoder/vp9_job_queue.h"
4244 #include "vp9/encoder/vp9_lookahead.h"
145147 kLowVarHighSumdiff = 5,
146148 kVeryHighSad = 6,
147149 } CONTENT_STATE_SB;
150
151 typedef enum {
152 LOOPFILTER_ALL = 0,
153 LOOPFILTER_REFERENCE = 1, // Disable loopfilter on non reference frames.
154 NO_LOOPFILTER = 2, // Disable loopfilter on all frames.
155 } LOOPFILTER_CONTROL;
148156
149157 typedef struct VP9EncoderConfig {
150158 BITSTREAM_PROFILE profile;
559567 return gop_command->show_frame_count + gop_command->use_alt_ref;
560568 }
561569
570 // TODO(angiebird): See if we can merge this one with FrameType in
571 // simple_encode.h
572 typedef enum ENCODE_FRAME_TYPE {
573 ENCODE_FRAME_TYPE_KEY,
574 ENCODE_FRAME_TYPE_INTER,
575 ENCODE_FRAME_TYPE_ALTREF,
576 ENCODE_FRAME_TYPE_OVERLAY,
577 ENCODE_FRAME_TYPE_GOLDEN,
578 ENCODE_FRAME_TYPES,
579 } ENCODE_FRAME_TYPE;
580
581 // TODO(angiebird): Merge this function with get_frame_type_from_update_type()
582 static INLINE ENCODE_FRAME_TYPE
583 get_encode_frame_type(FRAME_UPDATE_TYPE update_type) {
584 switch (update_type) {
585 case KF_UPDATE: return ENCODE_FRAME_TYPE_KEY;
586 case ARF_UPDATE: return ENCODE_FRAME_TYPE_ALTREF;
587 case GF_UPDATE: return ENCODE_FRAME_TYPE_GOLDEN;
588 case OVERLAY_UPDATE: return ENCODE_FRAME_TYPE_OVERLAY;
589 case LF_UPDATE: return ENCODE_FRAME_TYPE_INTER;
590 default:
591 fprintf(stderr, "Unsupported update_type %d\n", update_type);
592 abort();
593 return ENCODE_FRAME_TYPE_INTER;
594 }
595 }
596
597 typedef struct RATE_QSTEP_MODEL {
598 // The rq model predicts the bit usage as follows.
599 // rate = bias - ratio * log2(q_step)
600 int ready;
601 double bias;
602 double ratio;
603 } RATE_QSTEP_MODEL;
604
562605 typedef struct ENCODE_COMMAND {
563606 int use_external_quantize_index;
564607 int external_quantize_index;
608
609 int use_external_target_frame_bits;
610 int target_frame_bits;
611 double target_frame_bits_error_percent;
612
565613 GOP_COMMAND gop_command;
566614 } ENCODE_COMMAND;
567
568 static INLINE void encode_command_init(ENCODE_COMMAND *encode_command) {
569 vp9_zero(*encode_command);
570 encode_command->use_external_quantize_index = 0;
571 encode_command->external_quantize_index = -1;
572 gop_command_off(&encode_command->gop_command);
573 }
574615
575616 static INLINE void encode_command_set_gop_command(
576617 ENCODE_COMMAND *encode_command, GOP_COMMAND gop_command) {
589630 encode_command->external_quantize_index = -1;
590631 }
591632
633 static INLINE void encode_command_set_target_frame_bits(
634 ENCODE_COMMAND *encode_command, int target_frame_bits,
635 double target_frame_bits_error_percent) {
636 encode_command->use_external_target_frame_bits = 1;
637 encode_command->target_frame_bits = target_frame_bits;
638 encode_command->target_frame_bits_error_percent =
639 target_frame_bits_error_percent;
640 }
641
642 static INLINE void encode_command_reset_target_frame_bits(
643 ENCODE_COMMAND *encode_command) {
644 encode_command->use_external_target_frame_bits = 0;
645 encode_command->target_frame_bits = -1;
646 encode_command->target_frame_bits_error_percent = 0;
647 }
648
649 static INLINE void encode_command_init(ENCODE_COMMAND *encode_command) {
650 vp9_zero(*encode_command);
651 encode_command_reset_external_quantize_index(encode_command);
652 encode_command_reset_target_frame_bits(encode_command);
653 gop_command_off(&encode_command->gop_command);
654 }
655
592656 // Returns number of units in size of 4, if not multiple not a multiple of 4,
593657 // round it up. For example, size is 7, return 2.
594658 static INLINE int get_num_unit_4x4(int size) { return (size + 3) >> 2; }
659 // Returns number of units in size of 16, if not multiple not a multiple of 16,
660 // round it up. For example, size is 17, return 2.
661 static INLINE int get_num_unit_16x16(int size) { return (size + 15) >> 4; }
595662 #endif // CONFIG_RATE_CTRL
596663
597664 typedef struct VP9_COMP {
678745 // Ambient reconstruction err target for force key frames
679746 int64_t ambient_err;
680747
748 RD_CONTROL rd_ctrl;
681749 RD_OPT rd;
682750
683751 CODING_CONTEXT coding_context;
898966
899967 int multi_layer_arf;
900968 vpx_roi_map_t roi;
969
970 LOOPFILTER_CONTROL loopfilter_ctrl;
901971 #if CONFIG_RATE_CTRL
902972 ENCODE_COMMAND encode_command;
903973 PARTITION_INFO *partition_info;
904974 MOTION_VECTOR_INFO *motion_vector_info;
905 #endif
975 MOTION_VECTOR_INFO *fp_motion_vector_info;
976 TplDepStats *tpl_stats_info;
977
978 RATE_QSTEP_MODEL rq_model[ENCODE_FRAME_TYPES];
979 #endif
980 EXT_RATECTRL ext_ratectrl;
906981 } VP9_COMP;
907982
908983 #if CONFIG_RATE_CTRL
9271002 cpi->partition_info = NULL;
9281003 }
9291004
1005 static INLINE void reset_mv_info(MOTION_VECTOR_INFO *mv_info) {
1006 mv_info->ref_frame[0] = NONE;
1007 mv_info->ref_frame[1] = NONE;
1008 mv_info->mv[0].as_int = INVALID_MV;
1009 mv_info->mv[1].as_int = INVALID_MV;
1010 }
1011
9301012 // Allocates memory for the motion vector information.
9311013 // The unit size is each 4x4 block.
9321014 // Only called once in vp9_create_compressor().
9481030 cpi->motion_vector_info = NULL;
9491031 }
9501032
1033 // Allocates memory for the tpl stats information.
1034 // Only called once in vp9_create_compressor().
1035 static INLINE void tpl_stats_info_init(struct VP9_COMP *cpi) {
1036 VP9_COMMON *const cm = &cpi->common;
1037 CHECK_MEM_ERROR(
1038 cm, cpi->tpl_stats_info,
1039 (TplDepStats *)vpx_calloc(MAX_LAG_BUFFERS, sizeof(TplDepStats)));
1040 memset(cpi->tpl_stats_info, 0, MAX_LAG_BUFFERS * sizeof(TplDepStats));
1041 }
1042
1043 // Frees memory of the tpl stats information.
1044 // Only called once in dealloc_compressor_data().
1045 static INLINE void free_tpl_stats_info(struct VP9_COMP *cpi) {
1046 vpx_free(cpi->tpl_stats_info);
1047 cpi->tpl_stats_info = NULL;
1048 }
1049
1050 // Allocates memory for the first pass motion vector information.
1051 // The unit size is each 16x16 block.
1052 // Only called once in vp9_create_compressor().
1053 static INLINE void fp_motion_vector_info_init(struct VP9_COMP *cpi) {
1054 VP9_COMMON *const cm = &cpi->common;
1055 const int unit_width = get_num_unit_16x16(cpi->frame_info.frame_width);
1056 const int unit_height = get_num_unit_16x16(cpi->frame_info.frame_height);
1057 CHECK_MEM_ERROR(cm, cpi->fp_motion_vector_info,
1058 (MOTION_VECTOR_INFO *)vpx_calloc(unit_width * unit_height,
1059 sizeof(MOTION_VECTOR_INFO)));
1060 }
1061
1062 static INLINE void fp_motion_vector_info_reset(
1063 int frame_width, int frame_height,
1064 MOTION_VECTOR_INFO *fp_motion_vector_info) {
1065 const int unit_width = get_num_unit_16x16(frame_width);
1066 const int unit_height = get_num_unit_16x16(frame_height);
1067 int i;
1068 for (i = 0; i < unit_width * unit_height; ++i) {
1069 reset_mv_info(fp_motion_vector_info + i);
1070 }
1071 }
1072
1073 // Frees memory of the first pass motion vector information.
1074 // Only called once in dealloc_compressor_data().
1075 static INLINE void free_fp_motion_vector_info(struct VP9_COMP *cpi) {
1076 vpx_free(cpi->fp_motion_vector_info);
1077 cpi->fp_motion_vector_info = NULL;
1078 }
1079
9511080 // This is the c-version counter part of ImageBuffer
9521081 typedef struct IMAGE_BUFFER {
9531082 int allocated;
9551084 int plane_height[3];
9561085 uint8_t *plane_buffer[3];
9571086 } IMAGE_BUFFER;
1087
1088 #define RATE_CTRL_MAX_RECODE_NUM 7
1089
1090 typedef struct RATE_QINDEX_HISTORY {
1091 int recode_count;
1092 int q_index_history[RATE_CTRL_MAX_RECODE_NUM];
1093 int rate_history[RATE_CTRL_MAX_RECODE_NUM];
1094 int q_index_high;
1095 int q_index_low;
1096 } RATE_QINDEX_HISTORY;
1097
9581098 #endif // CONFIG_RATE_CTRL
9591099
9601100 typedef struct ENCODE_FRAME_RESULT {
9691109 FRAME_COUNTS frame_counts;
9701110 const PARTITION_INFO *partition_info;
9711111 const MOTION_VECTOR_INFO *motion_vector_info;
1112 const TplDepStats *tpl_stats_info;
9721113 IMAGE_BUFFER coded_frame;
1114 RATE_QINDEX_HISTORY rq_history;
9731115 #endif // CONFIG_RATE_CTRL
9741116 int quantize_index;
9751117 } ENCODE_FRAME_RESULT;
11441286 void vp9_scale_references(VP9_COMP *cpi);
11451287
11461288 void vp9_update_reference_frames(VP9_COMP *cpi);
1289
1290 void vp9_get_ref_frame_info(FRAME_UPDATE_TYPE update_type, int ref_frame_flags,
1291 RefCntBuffer *ref_frame_bufs[MAX_INTER_REF_FRAMES],
1292 int *ref_frame_coding_indexes,
1293 int *ref_frame_valid_list);
11471294
11481295 void vp9_set_high_precision_mv(VP9_COMP *cpi, int allow_high_precision_mv);
11491296
0 /*
1 * Copyright (c) 2020 The WebM project authors. All Rights Reserved.
2 *
3 * Use of this source code is governed by a BSD-style license
4 * that can be found in the LICENSE file in the root of the source
5 * tree. An additional intellectual property rights grant can be found
6 * in the file PATENTS. All contributing project authors may
7 * be found in the AUTHORS file in the root of the source tree.
8 */
9
10 #include "vp9/encoder/vp9_ext_ratectrl.h"
11 #include "vp9/encoder/vp9_encoder.h"
12 #include "vp9/common/vp9_common.h"
13 #include "vpx_dsp/psnr.h"
14
15 vpx_codec_err_t vp9_extrc_init(EXT_RATECTRL *ext_ratectrl) {
16 if (ext_ratectrl == NULL) {
17 return VPX_CODEC_INVALID_PARAM;
18 }
19 vp9_zero(*ext_ratectrl);
20 return VPX_CODEC_OK;
21 }
22
23 vpx_codec_err_t vp9_extrc_create(vpx_rc_funcs_t funcs,
24 vpx_rc_config_t ratectrl_config,
25 EXT_RATECTRL *ext_ratectrl) {
26 vpx_rc_status_t rc_status;
27 vpx_rc_firstpass_stats_t *rc_firstpass_stats;
28 if (ext_ratectrl == NULL) {
29 return VPX_CODEC_INVALID_PARAM;
30 }
31 vp9_extrc_delete(ext_ratectrl);
32 ext_ratectrl->funcs = funcs;
33 ext_ratectrl->ratectrl_config = ratectrl_config;
34 rc_status = ext_ratectrl->funcs.create_model(ext_ratectrl->funcs.priv,
35 &ext_ratectrl->ratectrl_config,
36 &ext_ratectrl->model);
37 if (rc_status == VPX_RC_ERROR) {
38 return VPX_CODEC_ERROR;
39 }
40 rc_firstpass_stats = &ext_ratectrl->rc_firstpass_stats;
41 rc_firstpass_stats->num_frames = ratectrl_config.show_frame_count;
42 rc_firstpass_stats->frame_stats =
43 vpx_malloc(sizeof(*rc_firstpass_stats->frame_stats) *
44 rc_firstpass_stats->num_frames);
45 if (rc_firstpass_stats->frame_stats == NULL) {
46 return VPX_CODEC_MEM_ERROR;
47 }
48 ext_ratectrl->ready = 1;
49 return VPX_CODEC_OK;
50 }
51
52 vpx_codec_err_t vp9_extrc_delete(EXT_RATECTRL *ext_ratectrl) {
53 if (ext_ratectrl == NULL) {
54 return VPX_CODEC_INVALID_PARAM;
55 }
56 if (ext_ratectrl->ready) {
57 vpx_rc_status_t rc_status =
58 ext_ratectrl->funcs.delete_model(ext_ratectrl->model);
59 if (rc_status == VPX_RC_ERROR) {
60 return VPX_CODEC_ERROR;
61 }
62 vpx_free(ext_ratectrl->rc_firstpass_stats.frame_stats);
63 }
64 return vp9_extrc_init(ext_ratectrl);
65 }
66
67 static void gen_rc_firstpass_stats(const FIRSTPASS_STATS *stats,
68 vpx_rc_frame_stats_t *rc_frame_stats) {
69 rc_frame_stats->frame = stats->frame;
70 rc_frame_stats->weight = stats->weight;
71 rc_frame_stats->intra_error = stats->intra_error;
72 rc_frame_stats->coded_error = stats->coded_error;
73 rc_frame_stats->sr_coded_error = stats->sr_coded_error;
74 rc_frame_stats->frame_noise_energy = stats->frame_noise_energy;
75 rc_frame_stats->pcnt_inter = stats->pcnt_inter;
76 rc_frame_stats->pcnt_motion = stats->pcnt_motion;
77 rc_frame_stats->pcnt_second_ref = stats->pcnt_second_ref;
78 rc_frame_stats->pcnt_neutral = stats->pcnt_neutral;
79 rc_frame_stats->pcnt_intra_low = stats->pcnt_intra_low;
80 rc_frame_stats->pcnt_intra_high = stats->pcnt_intra_high;
81 rc_frame_stats->intra_skip_pct = stats->intra_skip_pct;
82 rc_frame_stats->intra_smooth_pct = stats->intra_smooth_pct;
83 rc_frame_stats->inactive_zone_rows = stats->inactive_zone_rows;
84 rc_frame_stats->inactive_zone_cols = stats->inactive_zone_cols;
85 rc_frame_stats->MVr = stats->MVr;
86 rc_frame_stats->mvr_abs = stats->mvr_abs;
87 rc_frame_stats->MVc = stats->MVc;
88 rc_frame_stats->mvc_abs = stats->mvc_abs;
89 rc_frame_stats->MVrv = stats->MVrv;
90 rc_frame_stats->MVcv = stats->MVcv;
91 rc_frame_stats->mv_in_out_count = stats->mv_in_out_count;
92 rc_frame_stats->duration = stats->duration;
93 rc_frame_stats->count = stats->count;
94 }
95
96 vpx_codec_err_t vp9_extrc_send_firstpass_stats(
97 EXT_RATECTRL *ext_ratectrl, const FIRST_PASS_INFO *first_pass_info) {
98 if (ext_ratectrl == NULL) {
99 return VPX_CODEC_INVALID_PARAM;
100 }
101 if (ext_ratectrl->ready) {
102 vpx_rc_status_t rc_status;
103 vpx_rc_firstpass_stats_t *rc_firstpass_stats =
104 &ext_ratectrl->rc_firstpass_stats;
105 int i;
106 assert(rc_firstpass_stats->num_frames == first_pass_info->num_frames);
107 for (i = 0; i < rc_firstpass_stats->num_frames; ++i) {
108 gen_rc_firstpass_stats(&first_pass_info->stats[i],
109 &rc_firstpass_stats->frame_stats[i]);
110 }
111 rc_status = ext_ratectrl->funcs.send_firstpass_stats(ext_ratectrl->model,
112 rc_firstpass_stats);
113 if (rc_status == VPX_RC_ERROR) {
114 return VPX_CODEC_ERROR;
115 }
116 }
117 return VPX_CODEC_OK;
118 }
119
120 static int extrc_get_frame_type(FRAME_UPDATE_TYPE update_type) {
121 // TODO(angiebird): Add unit test to make sure this function behaves like
122 // get_frame_type_from_update_type()
123 // TODO(angiebird): Merge this function with get_frame_type_from_update_type()
124 switch (update_type) {
125 case KF_UPDATE: return 0; // kFrameTypeKey;
126 case ARF_UPDATE: return 2; // kFrameTypeAltRef;
127 case GF_UPDATE: return 4; // kFrameTypeGolden;
128 case OVERLAY_UPDATE: return 3; // kFrameTypeOverlay;
129 case LF_UPDATE: return 1; // kFrameTypeInter;
130 default:
131 fprintf(stderr, "Unsupported update_type %d\n", update_type);
132 abort();
133 return 1;
134 }
135 }
136
137 vpx_codec_err_t vp9_extrc_get_encodeframe_decision(
138 EXT_RATECTRL *ext_ratectrl, int show_index, int coding_index, int gop_index,
139 FRAME_UPDATE_TYPE update_type,
140 RefCntBuffer *ref_frame_bufs[MAX_INTER_REF_FRAMES], int ref_frame_flags,
141 vpx_rc_encodeframe_decision_t *encode_frame_decision) {
142 if (ext_ratectrl == NULL) {
143 return VPX_CODEC_INVALID_PARAM;
144 }
145 if (ext_ratectrl->ready) {
146 vpx_rc_status_t rc_status;
147 vpx_rc_encodeframe_info_t encode_frame_info;
148 encode_frame_info.show_index = show_index;
149 encode_frame_info.coding_index = coding_index;
150 encode_frame_info.gop_index = gop_index;
151 encode_frame_info.frame_type = extrc_get_frame_type(update_type);
152
153 vp9_get_ref_frame_info(update_type, ref_frame_flags, ref_frame_bufs,
154 encode_frame_info.ref_frame_coding_indexes,
155 encode_frame_info.ref_frame_valid_list);
156
157 rc_status = ext_ratectrl->funcs.get_encodeframe_decision(
158 ext_ratectrl->model, &encode_frame_info, encode_frame_decision);
159 if (rc_status == VPX_RC_ERROR) {
160 return VPX_CODEC_ERROR;
161 }
162 }
163 return VPX_CODEC_OK;
164 }
165
166 vpx_codec_err_t vp9_extrc_update_encodeframe_result(
167 EXT_RATECTRL *ext_ratectrl, int64_t bit_count,
168 const YV12_BUFFER_CONFIG *source_frame,
169 const YV12_BUFFER_CONFIG *coded_frame, uint32_t bit_depth,
170 uint32_t input_bit_depth, const int actual_encoding_qindex) {
171 if (ext_ratectrl == NULL) {
172 return VPX_CODEC_INVALID_PARAM;
173 }
174 if (ext_ratectrl->ready) {
175 PSNR_STATS psnr;
176 vpx_rc_status_t rc_status;
177 vpx_rc_encodeframe_result_t encode_frame_result;
178 encode_frame_result.bit_count = bit_count;
179 encode_frame_result.pixel_count =
180 source_frame->y_crop_width * source_frame->y_crop_height +
181 2 * source_frame->uv_crop_width * source_frame->uv_crop_height;
182 encode_frame_result.actual_encoding_qindex = actual_encoding_qindex;
183 #if CONFIG_VP9_HIGHBITDEPTH
184 vpx_calc_highbd_psnr(source_frame, coded_frame, &psnr, bit_depth,
185 input_bit_depth);
186 #else
187 (void)bit_depth;
188 (void)input_bit_depth;
189 vpx_calc_psnr(source_frame, coded_frame, &psnr);
190 #endif
191 encode_frame_result.sse = psnr.sse[0];
192 rc_status = ext_ratectrl->funcs.update_encodeframe_result(
193 ext_ratectrl->model, &encode_frame_result);
194 if (rc_status == VPX_RC_ERROR) {
195 return VPX_CODEC_ERROR;
196 }
197 }
198 return VPX_CODEC_OK;
199 }
0 /*
1 * Copyright (c) 2020 The WebM project authors. All Rights Reserved.
2 *
3 * Use of this source code is governed by a BSD-style license
4 * that can be found in the LICENSE file in the root of the source
5 * tree. An additional intellectual property rights grant can be found
6 * in the file PATENTS. All contributing project authors may
7 * be found in the AUTHORS file in the root of the source tree.
8 */
9
10 #ifndef VPX_VP9_ENCODER_VP9_EXT_RATECTRL_H_
11 #define VPX_VP9_ENCODER_VP9_EXT_RATECTRL_H_
12
13 #include "vpx/vpx_ext_ratectrl.h"
14 #include "vp9/encoder/vp9_firstpass.h"
15
16 typedef struct EXT_RATECTRL {
17 int ready;
18 vpx_rc_model_t model;
19 vpx_rc_funcs_t funcs;
20 vpx_rc_config_t ratectrl_config;
21 vpx_rc_firstpass_stats_t rc_firstpass_stats;
22 } EXT_RATECTRL;
23
24 vpx_codec_err_t vp9_extrc_init(EXT_RATECTRL *ext_ratectrl);
25
26 vpx_codec_err_t vp9_extrc_create(vpx_rc_funcs_t funcs,
27 vpx_rc_config_t ratectrl_config,
28 EXT_RATECTRL *ext_ratectrl);
29
30 vpx_codec_err_t vp9_extrc_delete(EXT_RATECTRL *ext_ratectrl);
31
32 vpx_codec_err_t vp9_extrc_send_firstpass_stats(
33 EXT_RATECTRL *ext_ratectrl, const FIRST_PASS_INFO *first_pass_info);
34
35 vpx_codec_err_t vp9_extrc_get_encodeframe_decision(
36 EXT_RATECTRL *ext_ratectrl, int show_index, int coding_index, int gop_index,
37 FRAME_UPDATE_TYPE update_type,
38 RefCntBuffer *ref_frame_bufs[MAX_INTER_REF_FRAMES], int ref_frame_flags,
39 vpx_rc_encodeframe_decision_t *encode_frame_decision);
40
41 vpx_codec_err_t vp9_extrc_update_encodeframe_result(
42 EXT_RATECTRL *ext_ratectrl, int64_t bit_count,
43 const YV12_BUFFER_CONFIG *source_frame,
44 const YV12_BUFFER_CONFIG *coded_frame, uint32_t bit_depth,
45 uint32_t input_bit_depth, const int actual_encoding_qindex);
46
47 #endif // VPX_VP9_ENCODER_VP9_EXT_RATECTRL_H_
5252
5353 #define NCOUNT_INTRA_THRESH 8192
5454 #define NCOUNT_INTRA_FACTOR 3
55
56 #define SR_DIFF_PART 0.0015
57 #define INTRA_PART 0.005
58 #define DEFAULT_DECAY_LIMIT 0.75
59 #define LOW_SR_DIFF_TRHESH 0.1
60 #define SR_DIFF_MAX 128.0
61 #define LOW_CODED_ERR_PER_MB 10.0
62 #define NCOUNT_FRAME_II_THRESH 6.0
63 #define BASELINE_ERR_PER_MB 12500.0
64 #define GF_MAX_FRAME_BOOST 96.0
65
66 #ifdef AGGRESSIVE_VBR
67 #define KF_MAX_FRAME_BOOST 80.0
68 #define MAX_KF_TOT_BOOST 4800
69 #else
70 #define KF_MAX_FRAME_BOOST 96.0
71 #define MAX_KF_TOT_BOOST 5400
72 #endif
73
74 #define ZM_POWER_FACTOR 0.75
75 #define MINQ_ADJ_LIMIT 48
76 #define MINQ_ADJ_LIMIT_CQ 20
77 #define HIGH_UNDERSHOOT_RATIO 2
78 #define AV_WQ_FACTOR 4.0
79 #define DEF_EPMB_LOW 2000.0
5580
5681 #define DOUBLE_DIVIDE_CHECK(x) ((x) < 0 ? (x)-0.000001 : (x) + 0.000001)
5782
838863 fp_acc_data->image_data_start_row);
839864 }
840865
866 #if CONFIG_RATE_CTRL
867 static void store_fp_motion_vector(VP9_COMP *cpi, const MV *mv,
868 const int mb_row, const int mb_col,
869 MV_REFERENCE_FRAME frame_type,
870 const int mv_idx) {
871 VP9_COMMON *const cm = &cpi->common;
872 const int mb_index = mb_row * cm->mb_cols + mb_col;
873 MOTION_VECTOR_INFO *this_motion_vector_info =
874 &cpi->fp_motion_vector_info[mb_index];
875 this_motion_vector_info->ref_frame[mv_idx] = frame_type;
876 if (frame_type != INTRA_FRAME) {
877 this_motion_vector_info->mv[mv_idx].as_mv = *mv;
878 }
879 }
880 #endif // CONFIG_RATE_CTRL
881
841882 #define NZ_MOTION_PENALTY 128
842883 #define INTRA_MODE_PENALTY 1024
843884 void vp9_first_pass_encode_tile_mb_row(VP9_COMP *cpi, ThreadData *td,
10641105 x->mv_limits.col_max =
10651106 ((cm->mb_cols - 1 - mb_col) * 16) + BORDER_MV_PIXELS_B16;
10661107
1067 // Other than for the first frame do a motion search.
1068 if (cm->current_video_frame > 0) {
1108 // Other than for intra-only frame do a motion search.
1109 if (!frame_is_intra_only(cm)) {
10691110 int tmp_err, motion_error, this_motion_error, raw_motion_error;
10701111 // Assume 0,0 motion with no mv overhead.
10711112 MV mv = { 0, 0 }, tmp_mv = { 0, 0 };
10721113 struct buf_2d unscaled_last_source_buf_2d;
10731114 vp9_variance_fn_ptr_t v_fn_ptr = cpi->fn_ptr[bsize];
1115
1116 #if CONFIG_RATE_CTRL
1117 // Store zero mv as default
1118 store_fp_motion_vector(cpi, &mv, mb_row, mb_col, LAST_FRAME, 0);
1119 #endif // CONFIG_RAGE_CTRL
10741120
10751121 xd->plane[0].pre[0].buf = first_ref_buf->y_buffer + recon_yoffset;
10761122 #if CONFIG_VP9_HIGHBITDEPTH
11361182 vp9_get_mvpred_var(x, &tmp_mv, &zero_mv, &v_fn_ptr, 0);
11371183 }
11381184 }
1185 #if CONFIG_RATE_CTRL
1186 store_fp_motion_vector(cpi, &mv, mb_row, mb_col, LAST_FRAME, 0);
1187 #endif // CONFIG_RAGE_CTRL
11391188
11401189 // Search in an older reference frame.
11411190 if ((cm->current_video_frame > 1) && gld_yv12 != NULL) {
11571206 #endif // CONFIG_VP9_HIGHBITDEPTH
11581207
11591208 first_pass_motion_search(cpi, x, &zero_mv, &tmp_mv, &gf_motion_error);
1209 #if CONFIG_RATE_CTRL
1210 store_fp_motion_vector(cpi, &tmp_mv, mb_row, mb_col, GOLDEN_FRAME, 1);
1211 #endif // CONFIG_RAGE_CTRL
11601212
11611213 if (gf_motion_error < motion_error && gf_motion_error < this_error)
11621214 ++(fp_acc_data->second_ref_count);
13301382 }
13311383 } else {
13321384 fp_acc_data->sr_coded_error += (int64_t)this_error;
1385 #if CONFIG_RATE_CTRL
1386 store_fp_motion_vector(cpi, NULL, mb_row, mb_col, INTRA_FRAME, 0);
1387 #endif // CONFIG_RAGE_CTRL
13331388 }
13341389 fp_acc_data->coded_error += (int64_t)this_error;
13351390
13551410 MV best_ref_mv;
13561411 // Tiling is ignored in the first pass.
13571412 vp9_tile_init(tile, cm, 0, 0);
1413
1414 #if CONFIG_RATE_CTRL
1415 fp_motion_vector_info_reset(cpi->frame_info.frame_width,
1416 cpi->frame_info.frame_height,
1417 cpi->fp_motion_vector_info);
1418 #endif
13581419
13591420 for (mb_row = 0; mb_row < cm->mb_rows; ++mb_row) {
13601421 best_ref_mv = zero_mv;
17701831 twopass->arnr_strength_adjustment = 0;
17711832 }
17721833
1773 #define SR_DIFF_PART 0.0015
1774 #define INTRA_PART 0.005
1775 #define DEFAULT_DECAY_LIMIT 0.75
1776 #define LOW_SR_DIFF_TRHESH 0.1
1777 #define SR_DIFF_MAX 128.0
1778 #define LOW_CODED_ERR_PER_MB 10.0
1779 #define NCOUNT_FRAME_II_THRESH 6.0
1780
17811834 static double get_sr_decay_rate(const FRAME_INFO *frame_info,
17821835 const FIRSTPASS_STATS *frame) {
17831836 double sr_diff = (frame->sr_coded_error - frame->coded_error);
18151868 double sr_decay = get_sr_decay_rate(frame_info, frame_stats);
18161869 return VPXMIN(sr_decay, zero_motion_pct);
18171870 }
1818
1819 #define ZM_POWER_FACTOR 0.75
18201871
18211872 static double get_prediction_decay_rate(const FRAME_INFO *frame_info,
18221873 const FIRSTPASS_STATS *frame_stats) {
19051956 }
19061957 }
19071958
1908 #define BASELINE_ERR_PER_MB 12500.0
1909 #define GF_MAX_BOOST 96.0
19101959 static double calc_frame_boost(const FRAME_INFO *frame_info,
19111960 const FIRSTPASS_STATS *this_frame,
19121961 int avg_frame_qindex,
19281977 // Q correction and scalling
19291978 frame_boost = frame_boost * boost_q_correction;
19301979
1931 return VPXMIN(frame_boost, GF_MAX_BOOST * boost_q_correction);
1980 return VPXMIN(frame_boost, GF_MAX_FRAME_BOOST * boost_q_correction);
19321981 }
19331982
19341983 static double kf_err_per_mb(VP9_COMP *cpi) {
31223171 #define MIN_SCAN_FRAMES_FOR_KF_BOOST 32
31233172 #define KF_ABS_ZOOM_THRESH 6.0
31243173
3125 #ifdef AGGRESSIVE_VBR
3126 #define KF_MAX_FRAME_BOOST 80.0
3127 #define MAX_KF_TOT_BOOST 4800
3128 #else
3129 #define KF_MAX_FRAME_BOOST 96.0
3130 #define MAX_KF_TOT_BOOST 5400
3131 #endif
3132
31333174 int vp9_get_frames_to_next_key(const VP9EncoderConfig *oxcf,
31343175 const FRAME_INFO *frame_info,
31353176 const FIRST_PASS_INFO *first_pass_info,
34333474 twopass->stats_in->pcnt_inter - twopass->stats_in->pcnt_motion == 1);
34343475 }
34353476
3477 // Configure image size specific vizier parameters.
3478 // Later these will be set via additional command line options
3479 static void init_vizier_params(RATE_CONTROL *const rc, int screen_area) {
3480 if (1) {
3481 // Force defaults for now
3482 rc->active_wq_factor = AV_WQ_FACTOR;
3483 rc->base_err_per_mb = BASELINE_ERR_PER_MB;
3484 rc->sr_default_decay_limit = DEFAULT_DECAY_LIMIT;
3485 rc->sr_diff_part = SR_DIFF_PART;
3486 rc->gf_frame_max_boost = GF_MAX_FRAME_BOOST;
3487 rc->gf_max_total_boost = MAX_GF_BOOST;
3488 rc->kf_err_per_mb = DEF_EPMB_LOW;
3489 rc->kf_frame_max_boost_first = KF_MAX_FRAME_BOOST; // Max for first kf.
3490 rc->kf_frame_max_boost_subs = KF_MAX_FRAME_BOOST / 2; // Max for other kfs.
3491 rc->kf_max_total_boost = MAX_KF_TOT_BOOST;
3492 rc->zm_power_factor = ZM_POWER_FACTOR;
3493 } else {
3494 // Vizer experimental parameters from training.
3495 // Later these will be set via the command line.
3496 if (screen_area <= 176 * 144) {
3497 rc->active_wq_factor = 46.0;
3498 rc->base_err_per_mb = 37597.399760969536;
3499 rc->sr_default_decay_limit = 0.3905639800962774;
3500 rc->sr_diff_part = 0.009599023654146284;
3501 rc->gf_frame_max_boost = 87.27362648627846;
3502 rc->gf_max_total_boost = MAX_GF_BOOST;
3503 rc->kf_err_per_mb = 1854.8255436877148;
3504 rc->kf_frame_max_boost_first = KF_MAX_FRAME_BOOST;
3505 rc->kf_frame_max_boost_subs = rc->kf_frame_max_boost_first / 2;
3506 rc->kf_max_total_boost = MAX_KF_TOT_BOOST;
3507 rc->zm_power_factor = 2.93715229184991;
3508 } else if (screen_area <= 320 * 240) {
3509 rc->active_wq_factor = 55.0;
3510 rc->base_err_per_mb = 34525.33177195309;
3511 rc->sr_default_decay_limit = 0.23901360046804604;
3512 rc->sr_diff_part = 0.008581014394766773;
3513 rc->gf_frame_max_boost = 127.34978204980285;
3514 rc->gf_max_total_boost = MAX_GF_BOOST;
3515 rc->kf_err_per_mb = 723.8337508755031;
3516 rc->kf_frame_max_boost_first = KF_MAX_FRAME_BOOST;
3517 rc->kf_frame_max_boost_subs = rc->kf_frame_max_boost_first / 2;
3518 rc->kf_max_total_boost = MAX_KF_TOT_BOOST;
3519 rc->zm_power_factor = 3.5299221493593413;
3520 } else if (screen_area <= 640 * 360) {
3521 rc->active_wq_factor = 12.5;
3522 rc->base_err_per_mb = 18823.978018028298;
3523 rc->sr_default_decay_limit = 0.6043527690301296;
3524 rc->sr_diff_part = 0.00343296783885544;
3525 rc->gf_frame_max_boost = 75.17672317013668;
3526 rc->gf_max_total_boost = MAX_GF_BOOST;
3527 rc->kf_err_per_mb = 422.2871502380377;
3528 rc->kf_frame_max_boost_first = KF_MAX_FRAME_BOOST;
3529 rc->kf_frame_max_boost_subs = rc->kf_frame_max_boost_first / 2;
3530 rc->kf_max_total_boost = MAX_KF_TOT_BOOST;
3531 rc->zm_power_factor = 2.265742666649307;
3532 } else if (screen_area <= 854 * 480) {
3533 rc->active_wq_factor = 51.5;
3534 rc->base_err_per_mb = 33718.98307662595;
3535 rc->sr_default_decay_limit = 0.33633414970713393;
3536 rc->sr_diff_part = 0.00868988716928333;
3537 rc->gf_frame_max_boost = 85.2868528581522;
3538 rc->gf_max_total_boost = MAX_GF_BOOST;
3539 rc->kf_err_per_mb = 1513.4883914008383;
3540 rc->kf_frame_max_boost_first = KF_MAX_FRAME_BOOST;
3541 rc->kf_frame_max_boost_subs = rc->kf_frame_max_boost_first / 2;
3542 rc->kf_max_total_boost = MAX_KF_TOT_BOOST;
3543 rc->zm_power_factor = 3.552278528517416;
3544 } else if (screen_area <= 1280 * 720) {
3545 rc->active_wq_factor = 41.5;
3546 rc->base_err_per_mb = 29527.46375825401;
3547 rc->sr_default_decay_limit = 0.5009117586299728;
3548 rc->sr_diff_part = 0.005007364627260114;
3549 rc->gf_frame_max_boost = GF_MAX_FRAME_BOOST;
3550 rc->gf_max_total_boost = MAX_GF_BOOST;
3551 rc->kf_err_per_mb = 998.6342911785146;
3552 rc->kf_frame_max_boost_first = KF_MAX_FRAME_BOOST;
3553 rc->kf_frame_max_boost_subs = rc->kf_frame_max_boost_first / 2;
3554 rc->kf_max_total_boost = MAX_KF_TOT_BOOST;
3555 rc->zm_power_factor = 2.568627575572356;
3556 } else if (screen_area <= 1920 * 1080) {
3557 rc->active_wq_factor = 31.0;
3558 rc->base_err_per_mb = 34474.723463367416;
3559 rc->sr_default_decay_limit = 0.23346886902707745;
3560 rc->sr_diff_part = 0.011431716637966029;
3561 rc->gf_frame_max_boost = 81.00472969483079;
3562 rc->gf_max_total_boost = MAX_GF_BOOST;
3563 rc->kf_err_per_mb = 35931.25734431429;
3564 rc->kf_frame_max_boost_first = KF_MAX_FRAME_BOOST;
3565 rc->kf_frame_max_boost_subs = rc->kf_frame_max_boost_first / 2;
3566 rc->kf_max_total_boost = MAX_KF_TOT_BOOST;
3567 rc->zm_power_factor = 5.5776463538431935;
3568 } else {
3569 rc->active_wq_factor = AV_WQ_FACTOR;
3570 rc->base_err_per_mb = BASELINE_ERR_PER_MB;
3571 rc->sr_default_decay_limit = DEFAULT_DECAY_LIMIT;
3572 rc->sr_diff_part = SR_DIFF_PART;
3573 rc->gf_frame_max_boost = GF_MAX_FRAME_BOOST;
3574 rc->gf_max_total_boost = MAX_GF_BOOST;
3575 rc->kf_err_per_mb = DEF_EPMB_LOW;
3576 rc->kf_frame_max_boost_first = KF_MAX_FRAME_BOOST;
3577 rc->kf_frame_max_boost_subs = rc->kf_frame_max_boost_first / 2;
3578 rc->kf_max_total_boost = MAX_KF_TOT_BOOST;
3579 rc->zm_power_factor = ZM_POWER_FACTOR;
3580 }
3581 }
3582 }
3583
34363584 void vp9_rc_get_second_pass_params(VP9_COMP *cpi) {
34373585 VP9_COMMON *const cm = &cpi->common;
34383586 RATE_CONTROL *const rc = &cpi->rc;
34423590 const int show_idx = cm->current_video_frame;
34433591
34443592 if (!twopass->stats_in) return;
3593
3594 // Configure image size specific vizier parameters
3595 if (cm->current_video_frame == 0) {
3596 unsigned int screen_area = (cm->width * cm->height);
3597
3598 init_vizier_params(rc, screen_area);
3599 }
34453600
34463601 // If this is an arf frame then we dont want to read the stats file or
34473602 // advance the input pointer as we already have what we need.
35683723 subtract_stats(&twopass->total_left_stats, &this_frame);
35693724 }
35703725
3571 #define MINQ_ADJ_LIMIT 48
3572 #define MINQ_ADJ_LIMIT_CQ 20
3573 #define HIGH_UNDERSHOOT_RATIO 2
35743726 void vp9_twopass_postencode_update(VP9_COMP *cpi) {
35753727 TWO_PASS *const twopass = &cpi->twopass;
35763728 RATE_CONTROL *const rc = &cpi->rc;
8181 * This function will copy the source image into a new framebuffer with
8282 * the expected stride/border.
8383 *
84 * If active_map is non-NULL and there is only one frame in the queue, then copy
85 * only active macroblocks.
86 *
8784 * \param[in] ctx Pointer to the lookahead context
8885 * \param[in] src Pointer to the image to enqueue
8986 * \param[in] ts_start Timestamp for the start of this frame
9087 * \param[in] ts_end Timestamp for the end of this frame
9188 * \param[in] flags Flags set on this frame
92 * \param[in] active_map Map that specifies which macroblock is active
9389 */
9490 int vp9_lookahead_push(struct lookahead_ctx *ctx, YV12_BUFFER_CONFIG *src,
9591 int64_t ts_start, int64_t ts_end, int use_highbitdepth,
440440 rc->last_post_encode_dropped_scene_change = 0;
441441 rc->use_post_encode_drop = 0;
442442 rc->ext_use_post_encode_drop = 0;
443 rc->disable_overshoot_maxq_cbr = 0;
443444 rc->arf_active_best_quality_adjustment_factor = 1.0;
444445 rc->arf_increase_active_best_quality = 0;
445446 rc->preserve_arf_as_gld = 0;
17121713
17131714 // Modify frame size target when down-scaling.
17141715 if (cpi->oxcf.resize_mode == RESIZE_DYNAMIC &&
1715 rc->frame_size_selector != UNSCALED)
1716 rc->frame_size_selector != UNSCALED) {
17161717 rc->this_frame_target = (int)(rc->this_frame_target *
17171718 rate_thresh_mult[rc->frame_size_selector]);
1719 }
1720
1721 #if CONFIG_RATE_CTRL
1722 if (cpi->encode_command.use_external_target_frame_bits) {
1723 rc->this_frame_target = cpi->encode_command.target_frame_bits;
1724 }
1725 #endif
17181726
17191727 // Target rate per SB64 (including partial SB64s.
17201728 rc->sb64_target_rate = (int)(((int64_t)rc->this_frame_target * 64 * 64) /
19871995 cpi->rc.rc_2_frame = 0;
19881996 cpi->rc.rc_1_frame = 0;
19891997 cpi->rc.last_avg_frame_bandwidth = cpi->rc.avg_frame_bandwidth;
1998 cpi->rc.last_q[INTER_FRAME] = cpi->common.base_qindex;
19901999 // For SVC on dropped frame when framedrop_mode != LAYER_DROP:
19912000 // in this mode the whole superframe may be dropped if only a single layer
19922001 // has buffer underflow (below threshold). Since this can then lead to
23922401 cpi->resize_scale_num * lc->scaling_factor_num;
23932402 lc->scaling_factor_den_resize =
23942403 cpi->resize_scale_den * lc->scaling_factor_den;
2404 // Reset rate control for all temporal layers.
2405 lc->rc.buffer_level = lc->rc.optimal_buffer_level;
2406 lc->rc.bits_off_target = lc->rc.optimal_buffer_level;
2407 lc->rc.rate_correction_factors[INTER_FRAME] =
2408 rc->rate_correction_factors[INTER_FRAME];
23952409 }
23962410 // Set the size for this current temporal layer.
23972411 lc = &svc->layer_context[svc->spatial_layer_id *
26662680 int min_width = (320 * 4) / 3;
26672681 int min_height = (180 * 4) / 3;
26682682 int down_size_on = 1;
2683 int force_downsize_rate = 0;
26692684 cpi->resize_scale_num = 1;
26702685 cpi->resize_scale_den = 1;
26712686 // Don't resize on key frame; reset the counters on key frame.
26862701 }
26872702 #endif
26882703
2704 // Force downsize based on per-frame-bandwidth, for extreme case,
2705 // for HD input.
2706 if (cpi->resize_state == ORIG && cm->width * cm->height >= 1280 * 720) {
2707 if (rc->avg_frame_bandwidth < 300000 / 30) {
2708 resize_action = DOWN_ONEHALF;
2709 cpi->resize_state = ONE_HALF;
2710 force_downsize_rate = 1;
2711 } else if (rc->avg_frame_bandwidth < 400000 / 30) {
2712 resize_action = ONEHALFONLY_RESIZE ? DOWN_ONEHALF : DOWN_THREEFOUR;
2713 cpi->resize_state = ONEHALFONLY_RESIZE ? ONE_HALF : THREE_QUARTER;
2714 force_downsize_rate = 1;
2715 }
2716 } else if (cpi->resize_state == THREE_QUARTER &&
2717 cm->width * cm->height >= 960 * 540) {
2718 if (rc->avg_frame_bandwidth < 300000 / 30) {
2719 resize_action = DOWN_ONEHALF;
2720 cpi->resize_state = ONE_HALF;
2721 force_downsize_rate = 1;
2722 }
2723 }
2724
26892725 // Resize based on average buffer underflow and QP over some window.
26902726 // Ignore samples close to key frame, since QP is usually high after key.
2691 if (cpi->rc.frames_since_key > 2 * cpi->framerate) {
2692 const int window = (int)(4 * cpi->framerate);
2693 cpi->resize_avg_qp += cm->base_qindex;
2727 if (!force_downsize_rate && cpi->rc.frames_since_key > cpi->framerate) {
2728 const int window = VPXMIN(30, (int)(2 * cpi->framerate));
2729 cpi->resize_avg_qp += rc->last_q[INTER_FRAME];
26942730 if (cpi->rc.buffer_level < (int)(30 * rc->optimal_buffer_level / 100))
26952731 ++cpi->resize_buffer_underflow;
26962732 ++cpi->resize_count;
32263262 int tl = 0;
32273263 int sl = 0;
32283264 SVC *svc = &cpi->svc;
3229 for (sl = 0; sl < svc->first_spatial_layer_to_encode; ++sl) {
3265 for (sl = 0; sl < VPXMAX(1, svc->first_spatial_layer_to_encode); ++sl) {
32303266 for (tl = 0; tl < svc->number_temporal_layers; ++tl) {
32313267 const int layer =
32323268 LAYER_IDS_TO_IDX(sl, tl, svc->number_temporal_layers);
194194 int use_post_encode_drop;
195195 // External flag to enable post encode frame dropping, controlled by user.
196196 int ext_use_post_encode_drop;
197
197 // Flag to disable CBR feature to increase Q on overshoot detection.
198 int disable_overshoot_maxq_cbr;
198199 int damped_adjustment[RATE_FACTOR_LEVELS];
199200 double arf_active_best_quality_adjustment_factor;
200201 int arf_increase_active_best_quality;
202203 int preserve_arf_as_gld;
203204 int preserve_next_arf_as_gld;
204205 int show_arf_as_gld;
206
207 // Vizeir project experimental rate control parameters.
208 double active_wq_factor;
209 double base_err_per_mb;
210 double sr_default_decay_limit;
211 double sr_diff_part;
212 double kf_frame_max_boost_first; // Max for first kf in a chunk.
213 double kf_frame_max_boost_subs; // Max for subsequent mid chunk kfs.
214 double kf_max_total_boost;
215 double kf_err_per_mb;
216 double gf_frame_max_boost;
217 double gf_max_total_boost;
218 double zm_power_factor;
205219 } RATE_CONTROL;
206220
207221 struct VP9_COMP;
196196 static const int rd_frame_type_factor[FRAME_UPDATE_TYPES] = { 128, 144, 128,
197197 128, 144, 144 };
198198
199 // Configure Vizier RD parameters.
200 // Later this function will use passed in command line values.
201 void vp9_init_rd_parameters(VP9_COMP *cpi) {
202 RD_CONTROL *const rdc = &cpi->rd_ctrl;
203 unsigned int screen_area = (cpi->common.width * cpi->common.height);
204
205 // Make sure this function is floating point safe.
206 vpx_clear_system_state();
207
208 if (1) {
209 // Non/pre-Vizer defaults
210 rdc->rd_mult_q_sq_inter_low_qp = 4.0;
211 rdc->rd_mult_q_sq_inter_mid_qp = 4.5;
212 rdc->rd_mult_q_sq_inter_high_qp = 3.0;
213 rdc->rd_mult_q_sq_key_ultralow_qp = 4.0;
214 rdc->rd_mult_q_sq_key_low_qp = 3.5;
215 rdc->rd_mult_q_sq_key_mid_qp = 4.5;
216 rdc->rd_mult_q_sq_key_high_qp = 7.5;
217 } else if (screen_area <= 176 * 144) {
218 rdc->rd_mult_q_sq_inter_high_qp = 4.295745965132044;
219 rdc->rd_mult_q_sq_inter_low_qp = 4.0718581295922025;
220 rdc->rd_mult_q_sq_inter_mid_qp = 4.031435609256739;
221 rdc->rd_mult_q_sq_key_low_qp = 5.7037775720838155;
222 rdc->rd_mult_q_sq_key_mid_qp = 4.72424015517201;
223 rdc->rd_mult_q_sq_key_ultralow_qp = 4.290774097327333;
224 } else if (screen_area <= 320 * 240) {
225 rdc->rd_mult_q_sq_inter_high_qp = 4.388244213131458;
226 rdc->rd_mult_q_sq_inter_low_qp = 4.506676356706102;
227 rdc->rd_mult_q_sq_inter_mid_qp = 4.489349899621181;
228 rdc->rd_mult_q_sq_key_low_qp = 4.497000582319771;
229 rdc->rd_mult_q_sq_key_mid_qp = 4.2825894884789735;
230 rdc->rd_mult_q_sq_key_ultralow_qp = 4.217074424696166;
231 } else if (screen_area <= 640 * 360) {
232 rdc->rd_mult_q_sq_inter_high_qp = 4.3702861603380025;
233 rdc->rd_mult_q_sq_inter_low_qp = 4.730644123689013;
234 rdc->rd_mult_q_sq_inter_mid_qp = 4.314589509578551;
235 rdc->rd_mult_q_sq_key_low_qp = 6.068652999601526;
236 rdc->rd_mult_q_sq_key_mid_qp = 4.817707474077241;
237 rdc->rd_mult_q_sq_key_ultralow_qp = 4.576902541873747;
238 } else if (screen_area <= 854 * 480) {
239 rdc->rd_mult_q_sq_inter_high_qp = 3.969083125219539;
240 rdc->rd_mult_q_sq_inter_low_qp = 4.811470143416073;
241 rdc->rd_mult_q_sq_inter_mid_qp = 4.621618127750201;
242 rdc->rd_mult_q_sq_key_low_qp = 5.073157238799473;
243 rdc->rd_mult_q_sq_key_mid_qp = 5.7587672849242635;
244 rdc->rd_mult_q_sq_key_ultralow_qp = 4.9854544277222566;
245 } else if (screen_area <= 1280 * 720) {
246 rdc->rd_mult_q_sq_inter_high_qp = 4.410712348825541;
247 rdc->rd_mult_q_sq_inter_low_qp = 5.119381136011107;
248 rdc->rd_mult_q_sq_inter_mid_qp = 4.518613675766538;
249 rdc->rd_mult_q_sq_key_low_qp = 5.848703119971484;
250 rdc->rd_mult_q_sq_key_mid_qp = 5.368947246228739;
251 rdc->rd_mult_q_sq_key_ultralow_qp = 3.9468491666607326;
252 } else if (screen_area <= 1920 * 1080) {
253 rdc->rd_mult_q_sq_inter_high_qp = 3.2141187537667797;
254 rdc->rd_mult_q_sq_inter_low_qp = 6.00569815296199;
255 rdc->rd_mult_q_sq_inter_mid_qp = 3.932565684947023;
256 rdc->rd_mult_q_sq_key_low_qp = 10.582906599488298;
257 rdc->rd_mult_q_sq_key_mid_qp = 6.274162346360692;
258 rdc->rd_mult_q_sq_key_ultralow_qp = 4.399795006320089;
259 }
260 }
261
199262 int vp9_compute_rd_mult_based_on_qindex(const VP9_COMP *cpi, int qindex) {
200 // largest dc_quant is 21387, therefore rdmult should always fit in int32_t
263 const RD_CONTROL *rdc = &cpi->rd_ctrl;
201264 const int q = vp9_dc_quant(qindex, 0, cpi->common.bit_depth);
202 uint32_t rdmult = q * q;
265 // largest dc_quant is 21387, therefore rdmult should fit in int32_t
266 int rdmult = q * q;
267
268 // Make sure this function is floating point safe.
269 vpx_clear_system_state();
203270
204271 if (cpi->common.frame_type != KEY_FRAME) {
205 if (qindex < 128)
206 rdmult = rdmult * 4;
207 else if (qindex < 190)
208 rdmult = rdmult * 4 + rdmult / 2;
209 else
210 rdmult = rdmult * 3;
272 if (qindex < 128) {
273 rdmult = (int)((double)rdmult * rdc->rd_mult_q_sq_inter_low_qp);
274 } else if (qindex < 190) {
275 rdmult = (int)((double)rdmult * rdc->rd_mult_q_sq_inter_mid_qp);
276 } else {
277 rdmult = (int)((double)rdmult * rdc->rd_mult_q_sq_inter_high_qp);
278 }
211279 } else {
212 if (qindex < 64)
213 rdmult = rdmult * 4;
214 else if (qindex <= 128)
215 rdmult = rdmult * 3 + rdmult / 2;
216 else if (qindex < 190)
217 rdmult = rdmult * 4 + rdmult / 2;
218 else
219 rdmult = rdmult * 7 + rdmult / 2;
220 }
280 if (qindex < 64) {
281 rdmult = (int)((double)rdmult * rdc->rd_mult_q_sq_key_ultralow_qp);
282 } else if (qindex <= 128) {
283 rdmult = (int)((double)rdmult * rdc->rd_mult_q_sq_key_low_qp);
284 } else if (qindex < 190) {
285 rdmult = (int)((double)rdmult * rdc->rd_mult_q_sq_key_mid_qp);
286
287 } else {
288 rdmult = (int)((double)rdmult * rdc->rd_mult_q_sq_key_high_qp);
289 }
290 }
291
221292 #if CONFIG_VP9_HIGHBITDEPTH
222293 switch (cpi->common.bit_depth) {
223294 case VPX_BITS_10: rdmult = ROUND_POWER_OF_TWO(rdmult, 4); break;
100100 THR_INTRA,
101101 } THR_MODES_SUB8X8;
102102
103 typedef struct {
104 // RD control parameters
105 // Added for Vizier project.
106 double rd_mult_q_sq_inter_low_qp;
107 double rd_mult_q_sq_inter_mid_qp;
108 double rd_mult_q_sq_inter_high_qp;
109 double rd_mult_q_sq_key_ultralow_qp;
110 double rd_mult_q_sq_key_low_qp;
111 double rd_mult_q_sq_key_mid_qp;
112 double rd_mult_q_sq_key_high_qp;
113 } RD_CONTROL;
114
103115 typedef struct RD_OPT {
104116 // Thresh_mult is used to set a threshold for the rd score. A higher value
105117 // means that we will accept the best mode so far more often. This number
142154 struct TileDataEnc;
143155 struct VP9_COMP;
144156 struct macroblock;
157
158 void vp9_init_rd_parameters(struct VP9_COMP *cpi);
145159
146160 int vp9_compute_rd_mult_based_on_qindex(const struct VP9_COMP *cpi, int qindex);
147161
44424442 tmp_best_sse = total_sse;
44434443 tmp_best_skippable = skippable;
44444444 tmp_best_mbmode = *mi;
4445 x->sum_y_eobs[TX_4X4] = 0;
44454446 for (i = 0; i < 4; i++) {
44464447 tmp_best_bmodes[i] = xd->mi[0]->bmi[i];
44474448 x->zcoeff_blk[TX_4X4][i] = !x->plane[0].eobs[i];
44754476 &rate, &rate_y, &distortion, &skippable, &total_sse,
44764477 (int)this_rd_thresh, seg_mvs, bsi, 0, mi_row, mi_col);
44774478 if (tmp_rd == INT64_MAX) continue;
4479 x->sum_y_eobs[TX_4X4] = 0;
4480 for (i = 0; i < 4; i++) {
4481 x->zcoeff_blk[TX_4X4][i] = !x->plane[0].eobs[i];
4482 x->sum_y_eobs[TX_4X4] += x->plane[0].eobs[i];
4483 }
44784484 } else {
44794485 total_sse = tmp_best_sse;
44804486 rate = tmp_best_rate;
620620 // increase in encoding time.
621621 if (cpi->use_svc && svc->spatial_layer_id > 0) sf->nonrd_keyframe = 1;
622622 if (cm->frame_type != KEY_FRAME && cpi->resize_state == ORIG &&
623 cpi->oxcf.rc_mode == VPX_CBR) {
623 cpi->oxcf.rc_mode == VPX_CBR && !cpi->rc.disable_overshoot_maxq_cbr) {
624624 if (cm->width * cm->height <= 352 * 288 && !cpi->use_svc &&
625625 cpi->oxcf.content != VP9E_CONTENT_SCREEN)
626626 sf->overshoot_detection_cbr_rt = RE_ENCODE_MAXQ;
667667 sf->base_mv_aggressive = 1;
668668 }
669669 if (cm->frame_type != KEY_FRAME && cpi->resize_state == ORIG &&
670 cpi->oxcf.rc_mode == VPX_CBR)
670 cpi->oxcf.rc_mode == VPX_CBR && !cpi->rc.disable_overshoot_maxq_cbr)
671671 sf->overshoot_detection_cbr_rt = FAST_DETECTION_MAXQ;
672672 }
673673
356356 if (is_one_pass_cbr_svc(cpi) && lc->speed > 0) {
357357 cpi->oxcf.speed = lc->speed;
358358 }
359 cpi->loopfilter_ctrl = lc->loopfilter_ctrl;
359360 // Reset the frames_since_key and frames_to_key counters to their values
360361 // before the layer restore. Keep these defined for the stream (not layer).
361362 if (cpi->svc.number_temporal_layers > 1 ||
954955 if (cpi->common.frame_type != KEY_FRAME && !cpi->ext_refresh_last_frame &&
955956 !cpi->ext_refresh_golden_frame && !cpi->ext_refresh_alt_ref_frame)
956957 svc->non_reference_frame = 1;
957 // For non-flexible mode, where update_buffer_slot is used, need to check if
958 // For flexible mode, where update_buffer_slot is used, need to check if
958959 // all buffer slots are not refreshed.
959960 if (svc->temporal_layering_mode == VP9E_TEMPORAL_LAYERING_MODE_BYPASS) {
960961 if (svc->update_buffer_slot[svc->spatial_layer_id] != 0)
7070 int actual_num_seg2_blocks;
7171 int counter_encode_maxq_scene_change;
7272 uint8_t speed;
73 int loopfilter_ctrl;
7374 } LAYER_CONTEXT;
7475
7576 typedef struct SVC {
158158
159159 int VP9RateControlRTC::GetLoopfilterLevel() const {
160160 struct loopfilter *const lf = &cpi_->common.lf;
161 vp9_pick_filter_level(NULL, cpi_, LPF_PICK_FROM_Q);
161 vp9_pick_filter_level(nullptr, cpi_, LPF_PICK_FROM_Q);
162162 return lf->filter_level;
163163 }
164164
8989 return 1;
9090 }
9191
92 // Assume every config in VP9EncoderConfig is less than 100 characters.
93 #define ENCODE_CONFIG_BUF_SIZE 100
94 struct EncodeConfig {
95 char name[ENCODE_CONFIG_BUF_SIZE];
96 char value[ENCODE_CONFIG_BUF_SIZE];
97 };
98
9299 class SimpleEncode::EncodeImpl {
93100 public:
94101 VP9_COMP *cpi;
95102 vpx_img_fmt_t img_fmt;
96103 vpx_image_t tmp_img;
97104 std::vector<FIRSTPASS_STATS> first_pass_stats;
105 std::vector<EncodeConfig> encode_config_list;
98106 };
99107
100108 static VP9_COMP *init_encoder(const VP9EncoderConfig *oxcf,
166174
167175 static void update_motion_vector_info(
168176 const MOTION_VECTOR_INFO *input_motion_vector_info, const int num_rows_4x4,
169 const int num_cols_4x4, MotionVectorInfo *output_motion_vector_info) {
177 const int num_cols_4x4, MotionVectorInfo *output_motion_vector_info,
178 int motion_vector_scale) {
170179 const int num_units_4x4 = num_rows_4x4 * num_cols_4x4;
171180 for (int i = 0; i < num_units_4x4; ++i) {
172181 const MV_REFERENCE_FRAME *in_ref_frame =
184193 mv_ref_frame_to_ref_frame_type(in_ref_frame[1]);
185194 output_motion_vector_info[i].mv_row[0] =
186195 (double)input_motion_vector_info[i].mv[0].as_mv.row /
187 kMotionVectorPrecision;
196 motion_vector_scale;
188197 output_motion_vector_info[i].mv_column[0] =
189198 (double)input_motion_vector_info[i].mv[0].as_mv.col /
190 kMotionVectorPrecision;
199 motion_vector_scale;
191200 output_motion_vector_info[i].mv_row[1] =
192201 (double)input_motion_vector_info[i].mv[1].as_mv.row /
193 kMotionVectorPrecision;
202 motion_vector_scale;
194203 output_motion_vector_info[i].mv_column[1] =
195204 (double)input_motion_vector_info[i].mv[1].as_mv.col /
196 kMotionVectorPrecision;
205 motion_vector_scale;
206 }
207 }
208
209 static void update_tpl_stats_info(const TplDepStats *input_tpl_stats_info,
210 const int show_frame_count,
211 TplStatsInfo *output_tpl_stats_info) {
212 int frame_idx;
213 for (frame_idx = 0; frame_idx < show_frame_count; ++frame_idx) {
214 output_tpl_stats_info[frame_idx].intra_cost =
215 input_tpl_stats_info[frame_idx].intra_cost;
216 output_tpl_stats_info[frame_idx].inter_cost =
217 input_tpl_stats_info[frame_idx].inter_cost;
218 output_tpl_stats_info[frame_idx].mc_flow =
219 input_tpl_stats_info[frame_idx].mc_flow;
220 output_tpl_stats_info[frame_idx].mc_dep_cost =
221 input_tpl_stats_info[frame_idx].mc_dep_cost;
222 output_tpl_stats_info[frame_idx].mc_ref_cost =
223 input_tpl_stats_info[frame_idx].mc_ref_cost;
197224 }
198225 }
199226
470497 encode_frame_result->coding_data.reset(
471498 new (std::nothrow) uint8_t[max_coding_data_byte_size]);
472499
473 encode_frame_result->num_rows_4x4 = get_num_unit_4x4(frame_width);
474 encode_frame_result->num_cols_4x4 = get_num_unit_4x4(frame_height);
500 encode_frame_result->num_rows_4x4 = get_num_unit_4x4(frame_height);
501 encode_frame_result->num_cols_4x4 = get_num_unit_4x4(frame_width);
475502 encode_frame_result->partition_info.resize(encode_frame_result->num_rows_4x4 *
476503 encode_frame_result->num_cols_4x4);
477504 encode_frame_result->motion_vector_info.resize(
478505 encode_frame_result->num_rows_4x4 * encode_frame_result->num_cols_4x4);
506 encode_frame_result->tpl_stats_info.resize(MAX_LAG_BUFFERS);
479507
480508 if (encode_frame_result->coding_data.get() == nullptr) {
481509 return false;
484512 frame_height, img_fmt);
485513 }
486514
515 static void encode_frame_result_update_rq_history(
516 const RATE_QINDEX_HISTORY *rq_history,
517 EncodeFrameResult *encode_frame_result) {
518 encode_frame_result->recode_count = rq_history->recode_count;
519 for (int i = 0; i < encode_frame_result->recode_count; ++i) {
520 const int q_index = rq_history->q_index_history[i];
521 const int rate = rq_history->rate_history[i];
522 encode_frame_result->q_index_history.push_back(q_index);
523 encode_frame_result->rate_history.push_back(rate);
524 }
525 }
526
487527 static void update_encode_frame_result(
488 EncodeFrameResult *encode_frame_result,
528 EncodeFrameResult *encode_frame_result, const int show_frame_count,
489529 const ENCODE_FRAME_RESULT *encode_frame_info) {
490530 encode_frame_result->coding_data_bit_size =
491531 encode_frame_result->coding_data_byte_size * 8;
510550 update_motion_vector_info(encode_frame_info->motion_vector_info,
511551 encode_frame_result->num_rows_4x4,
512552 encode_frame_result->num_cols_4x4,
513 &encode_frame_result->motion_vector_info[0]);
553 &encode_frame_result->motion_vector_info[0],
554 kMotionVectorSubPixelPrecision);
514555 update_frame_counts(&encode_frame_info->frame_counts,
515556 &encode_frame_result->frame_counts);
557 if (encode_frame_result->frame_type == kFrameTypeAltRef) {
558 update_tpl_stats_info(encode_frame_info->tpl_stats_info, show_frame_count,
559 &encode_frame_result->tpl_stats_info[0]);
560 }
561 encode_frame_result_update_rq_history(&encode_frame_info->rq_history,
562 encode_frame_result);
516563 }
517564
518565 static void IncreaseGroupOfPictureIndex(GroupOfPicture *group_of_picture) {
694741 start_ref_frame_info, group_of_picture);
695742 }
696743
744 #define SET_STRUCT_VALUE(config, structure, ret, field) \
745 if (strcmp(config.name, #field) == 0) { \
746 structure->field = atoi(config.value); \
747 ret = 1; \
748 }
749
750 static void UpdateEncodeConfig(const EncodeConfig &config,
751 VP9EncoderConfig *oxcf) {
752 int ret = 0;
753 SET_STRUCT_VALUE(config, oxcf, ret, key_freq);
754 SET_STRUCT_VALUE(config, oxcf, ret, two_pass_vbrmin_section);
755 SET_STRUCT_VALUE(config, oxcf, ret, two_pass_vbrmax_section);
756 SET_STRUCT_VALUE(config, oxcf, ret, under_shoot_pct);
757 SET_STRUCT_VALUE(config, oxcf, ret, over_shoot_pct);
758 SET_STRUCT_VALUE(config, oxcf, ret, max_threads);
759 SET_STRUCT_VALUE(config, oxcf, ret, frame_parallel_decoding_mode);
760 SET_STRUCT_VALUE(config, oxcf, ret, tile_columns);
761 SET_STRUCT_VALUE(config, oxcf, ret, arnr_max_frames);
762 SET_STRUCT_VALUE(config, oxcf, ret, arnr_strength);
763 SET_STRUCT_VALUE(config, oxcf, ret, lag_in_frames);
764 SET_STRUCT_VALUE(config, oxcf, ret, encode_breakout);
765 SET_STRUCT_VALUE(config, oxcf, ret, enable_tpl_model);
766 SET_STRUCT_VALUE(config, oxcf, ret, enable_auto_arf);
767 if (strcmp(config.name, "rc_mode") == 0) {
768 int rc_mode = atoi(config.value);
769 if (rc_mode >= VPX_VBR && rc_mode <= VPX_Q) {
770 oxcf->rc_mode = (enum vpx_rc_mode)rc_mode;
771 ret = 1;
772 } else {
773 fprintf(stderr, "Invalid rc_mode value: %d\n", rc_mode);
774 }
775 }
776 SET_STRUCT_VALUE(config, oxcf, ret, cq_level);
777 if (ret == 0) {
778 fprintf(stderr, "Ignored unsupported encode_config %s\n", config.name);
779 }
780 }
781
782 static VP9EncoderConfig GetEncodeConfig(
783 int frame_width, int frame_height, vpx_rational_t frame_rate,
784 int target_bitrate, int encode_speed, vpx_enc_pass enc_pass,
785 const std::vector<EncodeConfig> &encode_config_list) {
786 VP9EncoderConfig oxcf =
787 vp9_get_encoder_config(frame_width, frame_height, frame_rate,
788 target_bitrate, encode_speed, enc_pass);
789 for (const auto &config : encode_config_list) {
790 UpdateEncodeConfig(config, &oxcf);
791 }
792 if (enc_pass == VPX_RC_FIRST_PASS) {
793 oxcf.lag_in_frames = 0;
794 }
795 return oxcf;
796 }
797
697798 SimpleEncode::SimpleEncode(int frame_width, int frame_height,
698799 int frame_rate_num, int frame_rate_den,
699800 int target_bitrate, int num_frames,
705806 frame_rate_den_ = frame_rate_den;
706807 target_bitrate_ = target_bitrate;
707808 num_frames_ = num_frames;
809 encode_speed_ = 0;
708810
709811 frame_coding_index_ = 0;
710812 show_frame_count_ = 0;
726828 InitRefFrameInfo(&ref_frame_info_);
727829 }
728830
831 void SimpleEncode::SetEncodeSpeed(int encode_speed) {
832 encode_speed_ = encode_speed;
833 }
834
835 StatusCode SimpleEncode::SetEncodeConfig(const char *name, const char *value) {
836 if (name == nullptr || value == nullptr) {
837 fprintf(stderr, "SetEncodeConfig: null pointer, name %p value %p\n", name,
838 value);
839 return StatusError;
840 }
841 EncodeConfig config;
842 snprintf(config.name, ENCODE_CONFIG_BUF_SIZE, "%s", name);
843 snprintf(config.value, ENCODE_CONFIG_BUF_SIZE, "%s", value);
844 impl_ptr_->encode_config_list.push_back(config);
845 return StatusOk;
846 }
847
848 StatusCode SimpleEncode::DumpEncodeConfigs(int pass, FILE *fp) {
849 if (fp == nullptr) {
850 fprintf(stderr, "DumpEncodeConfigs: null pointer, fp %p\n", fp);
851 return StatusError;
852 }
853 vpx_enc_pass enc_pass;
854 if (pass == 1) {
855 enc_pass = VPX_RC_FIRST_PASS;
856 } else {
857 enc_pass = VPX_RC_LAST_PASS;
858 }
859 const vpx_rational_t frame_rate =
860 make_vpx_rational(frame_rate_num_, frame_rate_den_);
861 const VP9EncoderConfig oxcf =
862 GetEncodeConfig(frame_width_, frame_height_, frame_rate, target_bitrate_,
863 encode_speed_, enc_pass, impl_ptr_->encode_config_list);
864 vp9_dump_encoder_config(&oxcf, fp);
865 return StatusOk;
866 }
867
729868 void SimpleEncode::ComputeFirstPassStats() {
730869 vpx_rational_t frame_rate =
731870 make_vpx_rational(frame_rate_num_, frame_rate_den_);
732 const VP9EncoderConfig oxcf =
733 vp9_get_encoder_config(frame_width_, frame_height_, frame_rate,
734 target_bitrate_, VPX_RC_FIRST_PASS);
871 const VP9EncoderConfig oxcf = GetEncodeConfig(
872 frame_width_, frame_height_, frame_rate, target_bitrate_, encode_speed_,
873 VPX_RC_FIRST_PASS, impl_ptr_->encode_config_list);
735874 VP9_COMP *cpi = init_encoder(&oxcf, impl_ptr_->img_fmt);
736875 struct lookahead_ctx *lookahead = cpi->lookahead;
737876 int i;
738877 int use_highbitdepth = 0;
878 const int num_rows_16x16 = get_num_unit_16x16(frame_height_);
879 const int num_cols_16x16 = get_num_unit_16x16(frame_width_);
739880 #if CONFIG_VP9_HIGHBITDEPTH
740881 use_highbitdepth = cpi->common.use_highbitdepth;
741882 #endif
768909 // vp9_get_compressed_data only generates first pass stats not
769910 // compresses data
770911 assert(size == 0);
912 // Get vp9 first pass motion vector info.
913 std::vector<MotionVectorInfo> mv_info(num_rows_16x16 * num_cols_16x16);
914 update_motion_vector_info(cpi->fp_motion_vector_info, num_rows_16x16,
915 num_cols_16x16, mv_info.data(),
916 kMotionVectorFullPixelPrecision);
917 fp_motion_vector_info_.push_back(mv_info);
771918 }
772919 impl_ptr_->first_pass_stats.push_back(vp9_get_frame_stats(&cpi->twopass));
773920 }
805952 return output_stats;
806953 }
807954
808 void SimpleEncode::SetExternalGroupOfPicturesMap(std::vector<int> gop_map) {
809 gop_map_ = gop_map;
955 std::vector<std::vector<MotionVectorInfo>>
956 SimpleEncode::ObserveFirstPassMotionVectors() {
957 return fp_motion_vector_info_;
958 }
959
960 void SimpleEncode::SetExternalGroupOfPicturesMap(int *gop_map,
961 int gop_map_size) {
962 for (int i = 0; i < gop_map_size; ++i) {
963 gop_map_.push_back(gop_map[i]);
964 }
810965 // The following will check and modify gop_map_ to make sure the
811966 // gop_map_ satisfies the constraints.
812967 // 1) Each key frame position should be at the start of a gop.
8471002
8481003 static GOP_COMMAND GetGopCommand(const std::vector<int> &gop_map,
8491004 int start_show_index) {
850 assert(static_cast<size_t>(start_show_index) < gop_map.size());
851 assert((gop_map[start_show_index] & kGopMapFlagStart) != 0);
8521005 GOP_COMMAND gop_command;
8531006 if (gop_map.size() > 0) {
1007 assert(static_cast<size_t>(start_show_index) < gop_map.size());
1008 assert((gop_map[start_show_index] & kGopMapFlagStart) != 0);
8541009 int end_show_index = start_show_index + 1;
8551010 // gop_map[end_show_index] & kGopMapFlagStart == 0 means this is
8561011 // the start of a gop.
8751030 assert(impl_ptr_->first_pass_stats.size() > 0);
8761031 vpx_rational_t frame_rate =
8771032 make_vpx_rational(frame_rate_num_, frame_rate_den_);
878 VP9EncoderConfig oxcf =
879 vp9_get_encoder_config(frame_width_, frame_height_, frame_rate,
880 target_bitrate_, VPX_RC_LAST_PASS);
1033 VP9EncoderConfig oxcf = GetEncodeConfig(
1034 frame_width_, frame_height_, frame_rate, target_bitrate_, encode_speed_,
1035 VPX_RC_LAST_PASS, impl_ptr_->encode_config_list);
1036
8811037 vpx_fixed_buf_t stats;
8821038 stats.buf = GetVectorData(impl_ptr_->first_pass_stats);
8831039 stats.sz = sizeof(impl_ptr_->first_pass_stats[0]) *
10451201 abort();
10461202 }
10471203
1048 update_encode_frame_result(encode_frame_result, &encode_frame_info);
1204 const GroupOfPicture group_of_picture = this->ObserveGroupOfPicture();
1205 const int show_frame_count = group_of_picture.show_frame_count;
1206 update_encode_frame_result(encode_frame_result, show_frame_count,
1207 &encode_frame_info);
10491208 PostUpdateState(*encode_frame_result);
10501209 } else {
10511210 // TODO(angiebird): Clean up encode_frame_result.
10601219 quantize_index);
10611220 EncodeFrame(encode_frame_result);
10621221 encode_command_reset_external_quantize_index(&impl_ptr_->cpi->encode_command);
1222 }
1223
1224 void SimpleEncode::EncodeFrameWithTargetFrameBits(
1225 EncodeFrameResult *encode_frame_result, int target_frame_bits,
1226 double percent_diff) {
1227 encode_command_set_target_frame_bits(&impl_ptr_->cpi->encode_command,
1228 target_frame_bits, percent_diff);
1229 EncodeFrame(encode_frame_result);
1230 encode_command_reset_target_frame_bits(&impl_ptr_->cpi->encode_command);
10631231 }
10641232
10651233 static int GetCodingFrameNumFromGopMap(const std::vector<int> &gop_map) {
10851253 const int allow_alt_ref = 1;
10861254 vpx_rational_t frame_rate =
10871255 make_vpx_rational(frame_rate_num_, frame_rate_den_);
1088 const VP9EncoderConfig oxcf =
1089 vp9_get_encoder_config(frame_width_, frame_height_, frame_rate,
1090 target_bitrate_, VPX_RC_LAST_PASS);
1256 const VP9EncoderConfig oxcf = GetEncodeConfig(
1257 frame_width_, frame_height_, frame_rate, target_bitrate_, encode_speed_,
1258 VPX_RC_LAST_PASS, impl_ptr_->encode_config_list);
10911259 FRAME_INFO frame_info = vp9_get_frame_info(&oxcf);
10921260 FIRST_PASS_INFO first_pass_info;
10931261 fps_init_first_pass_info(&first_pass_info,
10981266 }
10991267
11001268 std::vector<int> SimpleEncode::ComputeKeyFrameMap() const {
1101 assert(impl_ptr_->first_pass_stats.size() == num_frames_);
1269 // The last entry of first_pass_stats is the overall stats.
1270 assert(impl_ptr_->first_pass_stats.size() == num_frames_ + 1);
11021271 vpx_rational_t frame_rate =
11031272 make_vpx_rational(frame_rate_num_, frame_rate_den_);
1104 const VP9EncoderConfig oxcf =
1105 vp9_get_encoder_config(frame_width_, frame_height_, frame_rate,
1106 target_bitrate_, VPX_RC_LAST_PASS);
1273 const VP9EncoderConfig oxcf = GetEncodeConfig(
1274 frame_width_, frame_height_, frame_rate, target_bitrate_, encode_speed_,
1275 VPX_RC_LAST_PASS, impl_ptr_->encode_config_list);
11071276 FRAME_INFO frame_info = vp9_get_frame_info(&oxcf);
11081277 FIRST_PASS_INFO first_pass_info;
11091278 fps_init_first_pass_info(&first_pass_info,
1818
1919 namespace vp9 {
2020
21 enum StatusCode {
22 StatusOk = 0,
23 StatusError,
24 };
25
2126 // TODO(angiebird): Add description for each frame type.
2227 enum FrameType {
2328 kFrameTypeKey = 0,
24 kFrameTypeInter,
25 kFrameTypeAltRef,
26 kFrameTypeOverlay,
27 kFrameTypeGolden,
29 kFrameTypeInter = 1,
30 kFrameTypeAltRef = 2,
31 kFrameTypeOverlay = 3,
32 kFrameTypeGolden = 4,
2833 };
2934
3035 // TODO(angiebird): Add description for each reference frame type.
5762 int height; // prediction block height
5863 };
5964
60 constexpr int kMotionVectorPrecision = 8;
61
62 // The frame is split to 4x4 blocks.
65 constexpr int kMotionVectorSubPixelPrecision = 8;
66 constexpr int kMotionVectorFullPixelPrecision = 1;
67
68 // In the first pass. The frame is split to 16x16 blocks.
69 // This structure contains the information of each 16x16 block.
70 // In the second pass. The frame is split to 4x4 blocks.
6371 // This structure contains the information of each 4x4 block.
6472 struct MotionVectorInfo {
6573 // Number of valid motion vectors, always 0 if this block is in the key frame.
6775 int mv_count;
6876 // The reference frame for motion vectors. If the second motion vector does
6977 // not exist (mv_count = 1), the reference frame is kNoneRefFrame.
70 // Otherwise, the reference frame is either kLastFrame, or kGoldenFrame,
71 // or kAltRefFrame.
78 // Otherwise, the reference frame is either kRefFrameTypeLast, or
79 // kRefFrameTypePast, or kRefFrameTypeFuture.
7280 RefFrameType ref_frame[2];
7381 // The row offset of motion vectors in the unit of pixel.
7482 // If the second motion vector does not exist, the value is 0.
7684 // The column offset of motion vectors in the unit of pixel.
7785 // If the second motion vector does not exist, the value is 0.
7886 double mv_column[2];
87 };
88
89 // Accumulated tpl stats of all blocks in one frame.
90 // For each frame, the tpl stats are computed per 32x32 block.
91 struct TplStatsInfo {
92 // Intra complexity: the sum of absolute transform difference (SATD) of
93 // intra predicted residuals.
94 int64_t intra_cost;
95 // Inter complexity: the SATD of inter predicted residuals.
96 int64_t inter_cost;
97 // Motion compensated information flow. It measures how much information
98 // is propagated from the current frame to other frames.
99 int64_t mc_flow;
100 // Motion compensated dependency cost. It equals to its own intra_cost
101 // plus the mc_flow.
102 int64_t mc_dep_cost;
103 // Motion compensated reference cost.
104 int64_t mc_ref_cost;
79105 };
80106
81107 struct RefFrameInfo {
244270 std::vector<PartitionInfo> partition_info;
245271 // A vector of the motion vector information of the frame.
246272 // The number of elements is |num_rows_4x4| * |num_cols_4x4|.
247 // The frame is divided 4x4 blocks of |num_rows_4x4| rows and
273 // The frame is divided into 4x4 blocks of |num_rows_4x4| rows and
248274 // |num_cols_4x4| columns.
249275 // Each 4x4 block contains 0 motion vector if this is an intra predicted
250276 // frame (for example, the key frame). If the frame is inter predicted,
252278 // Similar to partition info, all 4x4 blocks inside the same partition block
253279 // share the same motion vector information.
254280 std::vector<MotionVectorInfo> motion_vector_info;
281 // A vector of the tpl stats information.
282 // The tpl stats measure the complexity of a frame, as well as the
283 // information propagated along the motion trajectory between frames, in
284 // the reference frame structure.
285 // The tpl stats could be used as a more accurate spatial and temporal
286 // complexity measure in addition to the first pass stats.
287 // The vector contains tpl stats for all show frames in a GOP.
288 // The tpl stats stored in the vector is according to the encoding order.
289 // For example, suppose there are N show frames for the current GOP.
290 // Then tpl_stats_info[0] stores the information of the first frame to be
291 // encoded for this GOP, i.e, the AltRef frame.
292 std::vector<TplStatsInfo> tpl_stats_info;
255293 ImageBuffer coded_frame;
294
295 // recode_count, q_index_history and rate_history are only available when
296 // EncodeFrameWithTargetFrameBits() is used.
297 int recode_count;
298 std::vector<int> q_index_history;
299 std::vector<int> rate_history;
256300 };
257301
258302 struct GroupOfPicture {
303347 SimpleEncode(SimpleEncode &) = delete;
304348 SimpleEncode &operator=(const SimpleEncode &) = delete;
305349
350 // Adjusts the encoder's coding speed.
351 // If this function is not called, the encoder will use default encode_speed
352 // 0. Call this function before ComputeFirstPassStats() if needed.
353 // The encode_speed is equivalent to --cpu-used of the vpxenc command.
354 // The encode_speed's range should be [0, 9].
355 // Setting the encode_speed to a higher level will yield faster coding
356 // at the cost of lower compression efficiency.
357 void SetEncodeSpeed(int encode_speed);
358
359 // Set encoder config
360 // The following configs in VP9EncoderConfig are allowed to change in this
361 // function. See https://ffmpeg.org/ffmpeg-codecs.html#libvpx for each
362 // config's meaning.
363 // Configs in VP9EncoderConfig: Equivalent configs in ffmpeg:
364 // 1 key_freq -g
365 // 2 two_pass_vbrmin_section -minrate * 100LL / bit_rate
366 // 3 two_pass_vbrmax_section -maxrate * 100LL / bit_rate
367 // 4 under_shoot_pct -undershoot-pct
368 // 5 over_shoot_pct -overshoot-pct
369 // 6 max_threads -threads
370 // 7 frame_parallel_decoding_mode -frame-parallel
371 // 8 tile_column -tile-columns
372 // 9 arnr_max_frames -arnr-maxframes
373 // 10 arnr_strength -arnr-strength
374 // 11 lag_in_frames -rc_lookahead
375 // 12 encode_breakout -static-thresh
376 // 13 enable_tpl_model -enable-tpl
377 // 14 enable_auto_arf -auto-alt-ref
378 // 15 rc_mode
379 // Possible Settings:
380 // 0 - Variable Bit Rate (VPX_VBR) -b:v <bit_rate>
381 // 1 - Constant Bit Rate (VPX_CBR) -b:v <bit_rate> -minrate <bit_rate>
382 // -maxrate <bit_rate>
383 // two_pass_vbrmin_section == 100 i.e. bit_rate == minrate == maxrate
384 // two_pass_vbrmax_section == 100
385 // 2 - Constrained Quality (VPX_CQ) -crf <cq_level> -b:v bit_rate
386 // 3 - Constant Quality (VPX_Q) -crf <cq_level> -b:v 0
387 // See https://trac.ffmpeg.org/wiki/Encode/VP9 for more details.
388 // 16 cq_level see rc_mode for details.
389 StatusCode SetEncodeConfig(const char *name, const char *value);
390
391 // A debug function that dumps configs from VP9EncoderConfig
392 // pass = 1: first pass, pass = 2: second pass
393 // fp: file pointer for dumping config
394 StatusCode DumpEncodeConfigs(int pass, FILE *fp);
395
306396 // Makes encoder compute the first pass stats and store it at
307397 // impl_ptr_->first_pass_stats. key_frame_map_ is also computed based on the
308398 // first pass stats.
313403 // each video frame. The stats of each video frame is a vector of 25 double
314404 // values. For details, please check FIRSTPASS_STATS in vp9_firstpass.h
315405 std::vector<std::vector<double>> ObserveFirstPassStats();
406
407 // Outputs the first pass motion vectors represented by a 2-D vector.
408 // One can use the frame index at first dimension to retrieve the mvs for
409 // each video frame. The frame is divided into 16x16 blocks. The number of
410 // elements is round_up(|num_rows_4x4| / 4) * round_up(|num_cols_4x4| / 4).
411 std::vector<std::vector<MotionVectorInfo>> ObserveFirstPassMotionVectors();
316412
317413 // Ouputs a copy of key_frame_map_, a binary vector with size equal to the
318414 // number of show frames in the video. For each entry in the vector, 1
334430 // constraints.
335431 // 1) Each key frame position should be at the start of a gop.
336432 // 2) The last gop should not use an alt ref.
337 void SetExternalGroupOfPicturesMap(std::vector<int> gop_map);
433 void SetExternalGroupOfPicturesMap(int *gop_map, int gop_map_size);
338434
339435 // Observe the group of pictures map set through
340436 // SetExternalGroupOfPicturesMap(). This function should be called after
371467 // This function should be called after StartEncode() and before EndEncode().
372468 void EncodeFrameWithQuantizeIndex(EncodeFrameResult *encode_frame_result,
373469 int quantize_index);
470
471 // Encode a frame with target frame bits usage.
472 // The encoder will find a quantize index to make the actual frame bits usage
473 // match the target. EncodeFrameWithTargetFrameBits() will recode the frame
474 // up to 7 times to find a q_index to make the actual_frame_bits satisfy the
475 // following inequality. |actual_frame_bits - target_frame_bits| * 100 /
476 // target_frame_bits
477 // <= percent_diff.
478 void EncodeFrameWithTargetFrameBits(EncodeFrameResult *encode_frame_result,
479 int target_frame_bits,
480 double percent_diff);
374481
375482 // Gets the number of coding frames for the video. The coding frames include
376483 // show frame and no show frame.
404511 int frame_rate_den_;
405512 int target_bitrate_;
406513 int num_frames_;
514 int encode_speed_;
407515
408516 std::FILE *in_file_;
409517 std::FILE *out_file_;
434542 // frame appears?
435543 // Reference frames info of the to-be-coded frame.
436544 RefFrameInfo ref_frame_info_;
545
546 // A 2-D vector of motion vector information of the frame collected
547 // from the first pass. The first dimension is the frame index.
548 // Each frame is divided into 16x16 blocks. The number of elements is
549 // round_up(|num_rows_4x4| / 4) * round_up(|num_cols_4x4| / 4).
550 // Each 16x16 block contains 0 motion vector if this is an intra predicted
551 // frame (for example, the key frame). If the frame is inter predicted,
552 // each 16x16 block contains either 1 or 2 motion vectors.
553 // The first motion vector is always from the LAST_FRAME.
554 // The second motion vector is always from the GOLDEN_FRAME.
555 std::vector<std::vector<MotionVectorInfo>> fp_motion_vector_info_;
437556 };
438557
439558 } // namespace vp9
1212
1313 #include "./vpx_config.h"
1414 #include "vpx/vpx_encoder.h"
15 #include "vpx/vpx_ext_ratectrl.h"
1516 #include "vpx_dsp/psnr.h"
1617 #include "vpx_ports/vpx_once.h"
1718 #include "vpx_ports/static_assert.h"
632633 }
633634
634635 if (get_level_index(oxcf->target_level) >= 0) config_target_level(oxcf);
635 // vp9_dump_encoder_config(oxcf);
636 // vp9_dump_encoder_config(oxcf, stderr);
636637 return VPX_CODEC_OK;
637638 }
638639
15711572 lc->scaling_factor_num = params->scaling_factor_num[sl];
15721573 lc->scaling_factor_den = params->scaling_factor_den[sl];
15731574 lc->speed = params->speed_per_layer[sl];
1575 lc->loopfilter_ctrl = params->loopfilter_ctrl[sl];
15741576 }
15751577 }
15761578
17121714 VP9_COMP *const cpi = ctx->cpi;
17131715 const unsigned int data = va_arg(args, unsigned int);
17141716 cpi->rc.ext_use_post_encode_drop = data;
1717 return VPX_CODEC_OK;
1718 }
1719
1720 static vpx_codec_err_t ctrl_set_disable_overshoot_maxq_cbr(
1721 vpx_codec_alg_priv_t *ctx, va_list args) {
1722 VP9_COMP *const cpi = ctx->cpi;
1723 const unsigned int data = va_arg(args, unsigned int);
1724 cpi->rc.disable_overshoot_maxq_cbr = data;
1725 return VPX_CODEC_OK;
1726 }
1727
1728 static vpx_codec_err_t ctrl_set_disable_loopfilter(vpx_codec_alg_priv_t *ctx,
1729 va_list args) {
1730 VP9_COMP *const cpi = ctx->cpi;
1731 const unsigned int data = va_arg(args, unsigned int);
1732 cpi->loopfilter_ctrl = data;
1733 return VPX_CODEC_OK;
1734 }
1735
1736 static vpx_codec_err_t ctrl_set_external_rate_control(vpx_codec_alg_priv_t *ctx,
1737 va_list args) {
1738 vpx_rc_funcs_t funcs = *CAST(VP9E_SET_EXTERNAL_RATE_CONTROL, args);
1739 VP9_COMP *cpi = ctx->cpi;
1740 EXT_RATECTRL *ext_ratectrl = &cpi->ext_ratectrl;
1741 const VP9EncoderConfig *oxcf = &cpi->oxcf;
1742 // TODO(angiebird): Check the possibility of this flag being set at pass == 1
1743 if (oxcf->pass == 2) {
1744 const FRAME_INFO *frame_info = &cpi->frame_info;
1745 vpx_rc_config_t ratectrl_config;
1746 vpx_codec_err_t codec_status;
1747
1748 ratectrl_config.frame_width = frame_info->frame_width;
1749 ratectrl_config.frame_height = frame_info->frame_height;
1750 ratectrl_config.show_frame_count = cpi->twopass.first_pass_info.num_frames;
1751
1752 // TODO(angiebird): Double check whether this is the proper way to set up
1753 // target_bitrate and frame_rate.
1754 ratectrl_config.target_bitrate_kbps = (int)(oxcf->target_bandwidth / 1000);
1755 ratectrl_config.frame_rate_num = oxcf->g_timebase.den;
1756 ratectrl_config.frame_rate_den = oxcf->g_timebase.num;
1757
1758 codec_status = vp9_extrc_create(funcs, ratectrl_config, ext_ratectrl);
1759 if (codec_status != VPX_CODEC_OK) {
1760 return codec_status;
1761 }
1762 }
17151763 return VPX_CODEC_OK;
17161764 }
17171765
17591807 { VP9E_SET_TARGET_LEVEL, ctrl_set_target_level },
17601808 { VP9E_SET_ROW_MT, ctrl_set_row_mt },
17611809 { VP9E_SET_POSTENCODE_DROP, ctrl_set_postencode_drop },
1810 { VP9E_SET_DISABLE_OVERSHOOT_MAXQ_CBR, ctrl_set_disable_overshoot_maxq_cbr },
17621811 { VP9E_ENABLE_MOTION_VECTOR_UNIT_TEST, ctrl_enable_motion_vector_unit_test },
17631812 { VP9E_SET_SVC_INTER_LAYER_PRED, ctrl_set_svc_inter_layer_pred },
17641813 { VP9E_SET_SVC_FRAME_DROP_LAYER, ctrl_set_svc_frame_drop_layer },
17651814 { VP9E_SET_SVC_GF_TEMPORAL_REF, ctrl_set_svc_gf_temporal_ref },
17661815 { VP9E_SET_SVC_SPATIAL_LAYER_SYNC, ctrl_set_svc_spatial_layer_sync },
17671816 { VP9E_SET_DELTA_Q_UV, ctrl_set_delta_q_uv },
1817 { VP9E_SET_DISABLE_LOOPFILTER, ctrl_set_disable_loopfilter },
1818 { VP9E_SET_EXTERNAL_RATE_CONTROL, ctrl_set_external_rate_control },
17681819
17691820 // Getters
17701821 { VP8E_GET_LAST_QUANTIZER, ctrl_get_quantizer },
18981949
18991950 VP9EncoderConfig vp9_get_encoder_config(int frame_width, int frame_height,
19001951 vpx_rational_t frame_rate,
1901 int target_bitrate,
1952 int target_bitrate, int encode_speed,
19021953 vpx_enc_pass enc_pass) {
19031954 /* This function will generate the same VP9EncoderConfig used by the
19041955 * vpxenc command given below.
19091960 * HEIGHT: frame_height
19101961 * FPS: frame_rate
19111962 * BITRATE: target_bitrate
1963 * CPU_USED:encode_speed
19121964 *
19131965 * INPUT, OUTPUT, LIMIT will not affect VP9EncoderConfig
19141966 *
19201972 * BITRATE=600
19211973 * FPS=30/1
19221974 * LIMIT=150
1975 * CPU_USED=0
19231976 * ./vpxenc --limit=$LIMIT --width=$WIDTH --height=$HEIGHT --fps=$FPS
19241977 * --lag-in-frames=25 \
1925 * --codec=vp9 --good --cpu-used=0 --threads=0 --profile=0 \
1978 * --codec=vp9 --good --cpu-used=CPU_USED --threads=0 --profile=0 \
19261979 * --min-q=0 --max-q=63 --auto-alt-ref=1 --passes=2 --kf-max-dist=150 \
19271980 * --kf-min-dist=0 --drop-frame=0 --static-thresh=0 --bias-pct=50 \
19281981 * --minsection-pct=0 --maxsection-pct=150 --arnr-maxframes=7 --psnr \
19451998 oxcf.tile_columns = 0;
19461999 oxcf.frame_parallel_decoding_mode = 0;
19472000 oxcf.two_pass_vbrmax_section = 150;
2001 oxcf.speed = abs(encode_speed);
19482002 return oxcf;
19492003 }
19502004
1951 #define DUMP_STRUCT_VALUE(struct, value) \
1952 printf(#value " %" PRId64 "\n", (int64_t)(struct)->value)
1953
1954 void vp9_dump_encoder_config(const VP9EncoderConfig *oxcf) {
1955 DUMP_STRUCT_VALUE(oxcf, profile);
1956 DUMP_STRUCT_VALUE(oxcf, bit_depth);
1957 DUMP_STRUCT_VALUE(oxcf, width);
1958 DUMP_STRUCT_VALUE(oxcf, height);
1959 DUMP_STRUCT_VALUE(oxcf, input_bit_depth);
1960 DUMP_STRUCT_VALUE(oxcf, init_framerate);
2005 #define DUMP_STRUCT_VALUE(fp, structure, value) \
2006 fprintf(fp, #value " %" PRId64 "\n", (int64_t)(structure)->value)
2007
2008 void vp9_dump_encoder_config(const VP9EncoderConfig *oxcf, FILE *fp) {
2009 DUMP_STRUCT_VALUE(fp, oxcf, profile);
2010 DUMP_STRUCT_VALUE(fp, oxcf, bit_depth);
2011 DUMP_STRUCT_VALUE(fp, oxcf, width);
2012 DUMP_STRUCT_VALUE(fp, oxcf, height);
2013 DUMP_STRUCT_VALUE(fp, oxcf, input_bit_depth);
2014 DUMP_STRUCT_VALUE(fp, oxcf, init_framerate);
19612015 // TODO(angiebird): dump g_timebase
19622016 // TODO(angiebird): dump g_timebase_in_ts
19632017
1964 DUMP_STRUCT_VALUE(oxcf, target_bandwidth);
1965
1966 DUMP_STRUCT_VALUE(oxcf, noise_sensitivity);
1967 DUMP_STRUCT_VALUE(oxcf, sharpness);
1968 DUMP_STRUCT_VALUE(oxcf, speed);
1969 DUMP_STRUCT_VALUE(oxcf, rc_max_intra_bitrate_pct);
1970 DUMP_STRUCT_VALUE(oxcf, rc_max_inter_bitrate_pct);
1971 DUMP_STRUCT_VALUE(oxcf, gf_cbr_boost_pct);
1972
1973 DUMP_STRUCT_VALUE(oxcf, mode);
1974 DUMP_STRUCT_VALUE(oxcf, pass);
2018 DUMP_STRUCT_VALUE(fp, oxcf, target_bandwidth);
2019
2020 DUMP_STRUCT_VALUE(fp, oxcf, noise_sensitivity);
2021 DUMP_STRUCT_VALUE(fp, oxcf, sharpness);
2022 DUMP_STRUCT_VALUE(fp, oxcf, speed);
2023 DUMP_STRUCT_VALUE(fp, oxcf, rc_max_intra_bitrate_pct);
2024 DUMP_STRUCT_VALUE(fp, oxcf, rc_max_inter_bitrate_pct);
2025 DUMP_STRUCT_VALUE(fp, oxcf, gf_cbr_boost_pct);
2026
2027 DUMP_STRUCT_VALUE(fp, oxcf, mode);
2028 DUMP_STRUCT_VALUE(fp, oxcf, pass);
19752029
19762030 // Key Framing Operations
1977 DUMP_STRUCT_VALUE(oxcf, auto_key);
1978 DUMP_STRUCT_VALUE(oxcf, key_freq);
1979
1980 DUMP_STRUCT_VALUE(oxcf, lag_in_frames);
2031 DUMP_STRUCT_VALUE(fp, oxcf, auto_key);
2032 DUMP_STRUCT_VALUE(fp, oxcf, key_freq);
2033
2034 DUMP_STRUCT_VALUE(fp, oxcf, lag_in_frames);
19812035
19822036 // ----------------------------------------------------------------
19832037 // DATARATE CONTROL OPTIONS
19842038
19852039 // vbr, cbr, constrained quality or constant quality
1986 DUMP_STRUCT_VALUE(oxcf, rc_mode);
2040 DUMP_STRUCT_VALUE(fp, oxcf, rc_mode);
19872041
19882042 // buffer targeting aggressiveness
1989 DUMP_STRUCT_VALUE(oxcf, under_shoot_pct);
1990 DUMP_STRUCT_VALUE(oxcf, over_shoot_pct);
2043 DUMP_STRUCT_VALUE(fp, oxcf, under_shoot_pct);
2044 DUMP_STRUCT_VALUE(fp, oxcf, over_shoot_pct);
19912045
19922046 // buffering parameters
19932047 // TODO(angiebird): dump tarting_buffer_level_ms
19952049 // TODO(angiebird): dump maximum_buffer_size_ms
19962050
19972051 // Frame drop threshold.
1998 DUMP_STRUCT_VALUE(oxcf, drop_frames_water_mark);
2052 DUMP_STRUCT_VALUE(fp, oxcf, drop_frames_water_mark);
19992053
20002054 // controlling quality
2001 DUMP_STRUCT_VALUE(oxcf, fixed_q);
2002 DUMP_STRUCT_VALUE(oxcf, worst_allowed_q);
2003 DUMP_STRUCT_VALUE(oxcf, best_allowed_q);
2004 DUMP_STRUCT_VALUE(oxcf, cq_level);
2005 DUMP_STRUCT_VALUE(oxcf, aq_mode);
2055 DUMP_STRUCT_VALUE(fp, oxcf, fixed_q);
2056 DUMP_STRUCT_VALUE(fp, oxcf, worst_allowed_q);
2057 DUMP_STRUCT_VALUE(fp, oxcf, best_allowed_q);
2058 DUMP_STRUCT_VALUE(fp, oxcf, cq_level);
2059 DUMP_STRUCT_VALUE(fp, oxcf, aq_mode);
20062060
20072061 // Special handling of Adaptive Quantization for AltRef frames
2008 DUMP_STRUCT_VALUE(oxcf, alt_ref_aq);
2062 DUMP_STRUCT_VALUE(fp, oxcf, alt_ref_aq);
20092063
20102064 // Internal frame size scaling.
2011 DUMP_STRUCT_VALUE(oxcf, resize_mode);
2012 DUMP_STRUCT_VALUE(oxcf, scaled_frame_width);
2013 DUMP_STRUCT_VALUE(oxcf, scaled_frame_height);
2065 DUMP_STRUCT_VALUE(fp, oxcf, resize_mode);
2066 DUMP_STRUCT_VALUE(fp, oxcf, scaled_frame_width);
2067 DUMP_STRUCT_VALUE(fp, oxcf, scaled_frame_height);
20142068
20152069 // Enable feature to reduce the frame quantization every x frames.
2016 DUMP_STRUCT_VALUE(oxcf, frame_periodic_boost);
2070 DUMP_STRUCT_VALUE(fp, oxcf, frame_periodic_boost);
20172071
20182072 // two pass datarate control
2019 DUMP_STRUCT_VALUE(oxcf, two_pass_vbrbias);
2020 DUMP_STRUCT_VALUE(oxcf, two_pass_vbrmin_section);
2021 DUMP_STRUCT_VALUE(oxcf, two_pass_vbrmax_section);
2022 DUMP_STRUCT_VALUE(oxcf, vbr_corpus_complexity);
2073 DUMP_STRUCT_VALUE(fp, oxcf, two_pass_vbrbias);
2074 DUMP_STRUCT_VALUE(fp, oxcf, two_pass_vbrmin_section);
2075 DUMP_STRUCT_VALUE(fp, oxcf, two_pass_vbrmax_section);
2076 DUMP_STRUCT_VALUE(fp, oxcf, vbr_corpus_complexity);
20232077 // END DATARATE CONTROL OPTIONS
20242078 // ----------------------------------------------------------------
20252079
20262080 // Spatial and temporal scalability.
2027 DUMP_STRUCT_VALUE(oxcf, ss_number_layers);
2028 DUMP_STRUCT_VALUE(oxcf, ts_number_layers);
2081 DUMP_STRUCT_VALUE(fp, oxcf, ss_number_layers);
2082 DUMP_STRUCT_VALUE(fp, oxcf, ts_number_layers);
20292083
20302084 // Bitrate allocation for spatial layers.
20312085 // TODO(angiebird): dump layer_target_bitrate[VPX_MAX_LAYERS]
20332087 // TODO(angiebird): dump ss_enable_auto_arf[VPX_SS_MAX_LAYERS]
20342088 // TODO(angiebird): dump ts_rate_decimator[VPX_TS_MAX_LAYERS]
20352089
2036 DUMP_STRUCT_VALUE(oxcf, enable_auto_arf);
2037 DUMP_STRUCT_VALUE(oxcf, encode_breakout);
2038 DUMP_STRUCT_VALUE(oxcf, error_resilient_mode);
2039 DUMP_STRUCT_VALUE(oxcf, frame_parallel_decoding_mode);
2040
2041 DUMP_STRUCT_VALUE(oxcf, arnr_max_frames);
2042 DUMP_STRUCT_VALUE(oxcf, arnr_strength);
2043
2044 DUMP_STRUCT_VALUE(oxcf, min_gf_interval);
2045 DUMP_STRUCT_VALUE(oxcf, max_gf_interval);
2046
2047 DUMP_STRUCT_VALUE(oxcf, tile_columns);
2048 DUMP_STRUCT_VALUE(oxcf, tile_rows);
2049
2050 DUMP_STRUCT_VALUE(oxcf, enable_tpl_model);
2051
2052 DUMP_STRUCT_VALUE(oxcf, max_threads);
2053
2054 DUMP_STRUCT_VALUE(oxcf, target_level);
2090 DUMP_STRUCT_VALUE(fp, oxcf, enable_auto_arf);
2091 DUMP_STRUCT_VALUE(fp, oxcf, encode_breakout);
2092 DUMP_STRUCT_VALUE(fp, oxcf, error_resilient_mode);
2093 DUMP_STRUCT_VALUE(fp, oxcf, frame_parallel_decoding_mode);
2094
2095 DUMP_STRUCT_VALUE(fp, oxcf, arnr_max_frames);
2096 DUMP_STRUCT_VALUE(fp, oxcf, arnr_strength);
2097
2098 DUMP_STRUCT_VALUE(fp, oxcf, min_gf_interval);
2099 DUMP_STRUCT_VALUE(fp, oxcf, max_gf_interval);
2100
2101 DUMP_STRUCT_VALUE(fp, oxcf, tile_columns);
2102 DUMP_STRUCT_VALUE(fp, oxcf, tile_rows);
2103
2104 DUMP_STRUCT_VALUE(fp, oxcf, enable_tpl_model);
2105
2106 DUMP_STRUCT_VALUE(fp, oxcf, max_threads);
2107
2108 DUMP_STRUCT_VALUE(fp, oxcf, target_level);
20552109
20562110 // TODO(angiebird): dump two_pass_stats_in
20572111
20592113 // TODO(angiebird): dump firstpass_mb_stats_in
20602114 #endif
20612115
2062 DUMP_STRUCT_VALUE(oxcf, tuning);
2063 DUMP_STRUCT_VALUE(oxcf, content);
2116 DUMP_STRUCT_VALUE(fp, oxcf, tuning);
2117 DUMP_STRUCT_VALUE(fp, oxcf, content);
20642118 #if CONFIG_VP9_HIGHBITDEPTH
2065 DUMP_STRUCT_VALUE(oxcf, use_highbitdepth);
2119 DUMP_STRUCT_VALUE(fp, oxcf, use_highbitdepth);
20662120 #endif
2067 DUMP_STRUCT_VALUE(oxcf, color_space);
2068 DUMP_STRUCT_VALUE(oxcf, color_range);
2069 DUMP_STRUCT_VALUE(oxcf, render_width);
2070 DUMP_STRUCT_VALUE(oxcf, render_height);
2071 DUMP_STRUCT_VALUE(oxcf, temporal_layering_mode);
2072
2073 DUMP_STRUCT_VALUE(oxcf, row_mt);
2074 DUMP_STRUCT_VALUE(oxcf, motion_vector_unit_test);
2121 DUMP_STRUCT_VALUE(fp, oxcf, color_space);
2122 DUMP_STRUCT_VALUE(fp, oxcf, color_range);
2123 DUMP_STRUCT_VALUE(fp, oxcf, render_width);
2124 DUMP_STRUCT_VALUE(fp, oxcf, render_height);
2125 DUMP_STRUCT_VALUE(fp, oxcf, temporal_layering_mode);
2126
2127 DUMP_STRUCT_VALUE(fp, oxcf, row_mt);
2128 DUMP_STRUCT_VALUE(fp, oxcf, motion_vector_unit_test);
20752129 }
20762130
20772131 FRAME_INFO vp9_get_frame_info(const VP9EncoderConfig *oxcf) {
1818
1919 VP9EncoderConfig vp9_get_encoder_config(int frame_width, int frame_height,
2020 vpx_rational_t frame_rate,
21 int target_bitrate,
21 int target_bitrate, int encode_speed,
2222 vpx_enc_pass enc_pass);
2323
24 void vp9_dump_encoder_config(const VP9EncoderConfig *oxcf);
24 void vp9_dump_encoder_config(const VP9EncoderConfig *oxcf, FILE *fp);
2525
2626 FRAME_INFO vp9_get_frame_info(const VP9EncoderConfig *oxcf);
2727
9595 VP9_CX_SRCS-yes += encoder/vp9_skin_detection.h
9696 VP9_CX_SRCS-yes += encoder/vp9_noise_estimate.c
9797 VP9_CX_SRCS-yes += encoder/vp9_noise_estimate.h
98 VP9_CX_SRCS-yes += encoder/vp9_ext_ratectrl.c
99 VP9_CX_SRCS-yes += encoder/vp9_ext_ratectrl.h
98100 ifeq ($(CONFIG_VP9_POSTPROC),yes)
99101 VP9_CX_SRCS-$(CONFIG_INTERNAL_STATS) += common/vp9_postproc.h
100102 VP9_CX_SRCS-$(CONFIG_INTERNAL_STATS) += common/vp9_postproc.c
1616 */
1717 #include "./vp8.h"
1818 #include "./vpx_encoder.h"
19 #include "./vpx_ext_ratectrl.h"
1920
2021 /*!\file
2122 * \brief Provides definitions for using VP8 or VP9 encoder algorithm within the
683684 * Supported in codecs: VP9
684685 */
685686 VP9E_SET_DELTA_Q_UV,
687
688 /*!\brief Codec control function to disable increase Q on overshoot in CBR.
689 *
690 * 0: On (default), 1: Disable.
691 *
692 * Supported in codecs: VP9
693 */
694 VP9E_SET_DISABLE_OVERSHOOT_MAXQ_CBR,
695
696 /*!\brief Codec control function to disable loopfilter.
697 *
698 * 0: Loopfilter on all frames, 1: Disable on non reference frames.
699 * 2: Disable on all frames.
700 *
701 * Supported in codecs: VP9
702 */
703 VP9E_SET_DISABLE_LOOPFILTER,
704
705 /*!\brief Codec control function to enable external rate control library.
706 *
707 * args[0]: path of the rate control library
708 *
709 * args[1]: private config of the rate control library
710 *
711 * Supported in codecs: VP9
712 */
713 VP9E_SET_EXTERNAL_RATE_CONTROL,
686714 };
687715
688716 /*!\brief vpx 1-D scaling mode
10331061 VPX_CTRL_USE_TYPE(VP9E_SET_DELTA_Q_UV, int)
10341062 #define VPX_CTRL_VP9E_SET_DELTA_Q_UV
10351063
1064 VPX_CTRL_USE_TYPE(VP9E_SET_DISABLE_OVERSHOOT_MAXQ_CBR, int)
1065 #define VPX_CTRL_VP9E_SET_DISABLE_OVERSHOOT_MAXQ_CBR
1066
1067 VPX_CTRL_USE_TYPE(VP9E_SET_DISABLE_LOOPFILTER, int)
1068 #define VPX_CTRL_VP9E_SET_DISABLE_LOOPFILTER
1069
1070 VPX_CTRL_USE_TYPE(VP9E_SET_EXTERNAL_RATE_CONTROL, vpx_rc_funcs_t *)
1071 #define VPX_CTRL_VP9E_SET_EXTERNAL_RATE_CONTROL
1072
10361073 /*!\endcond */
10371074 /*! @} - end defgroup vp8_encoder */
10381075 #ifdef __cplusplus
2323 API_DOC_SRCS-yes += vpx_codec.h
2424 API_DOC_SRCS-yes += vpx_decoder.h
2525 API_DOC_SRCS-yes += vpx_encoder.h
26 API_DOC_SRCS-yes += vpx_ext_ratectrl.h
2627 API_DOC_SRCS-yes += vpx_frame_buffer.h
2728 API_DOC_SRCS-yes += vpx_image.h
2829
3839 API_SRCS-yes += vpx_frame_buffer.h
3940 API_SRCS-yes += vpx_image.h
4041 API_SRCS-yes += vpx_integer.h
42 API_SRCS-yes += vpx_ext_ratectrl.h
2929 #endif
3030
3131 #include "./vpx_codec.h"
32 #include "./vpx_ext_ratectrl.h"
3233
3334 /*! Temporal Scalability: Maximum length of the sequence defining frame
3435 * layer membership
5657 * fields to structures
5758 */
5859 #define VPX_ENCODER_ABI_VERSION \
59 (14 + VPX_CODEC_ABI_VERSION) /**<\hideinitializer*/
60 (14 + VPX_CODEC_ABI_VERSION + \
61 VPX_EXT_RATECTRL_ABI_VERSION) /**<\hideinitializer*/
6062
6163 /*! \brief Encoder capabilities bitfield
6264 *
704706 int scaling_factor_den[VPX_MAX_LAYERS]; /**< Scaling factor-denominator */
705707 int speed_per_layer[VPX_MAX_LAYERS]; /**< Speed setting for each sl */
706708 int temporal_layering_mode; /**< Temporal layering mode */
709 int loopfilter_ctrl[VPX_MAX_LAYERS]; /**< Loopfilter ctrl for each sl */
707710 } vpx_svc_extra_cfg_t;
708711
709712 /*!\brief Initialize an encoder instance
0 /*
1 * Copyright (c) 2020 The WebM project authors. All Rights Reserved.
2 *
3 * Use of this source code is governed by a BSD-style license
4 * that can be found in the LICENSE file in the root of the source
5 * tree. An additional intellectual property rights grant can be found
6 * in the file PATENTS. All contributing project authors may
7 * be found in the AUTHORS file in the root of the source tree.
8 */
9
10 #ifndef VPX_VPX_VPX_EXT_RATECTRL_H_
11 #define VPX_VPX_VPX_EXT_RATECTRL_H_
12
13 #ifdef __cplusplus
14 extern "C" {
15 #endif
16
17 #include "./vpx_integer.h"
18
19 /*!\brief Current ABI version number
20 *
21 * \internal
22 * If this file is altered in any way that changes the ABI, this value
23 * must be bumped. Examples include, but are not limited to, changing
24 * types, removing or reassigning enums, adding/removing/rearranging
25 * fields to structures.
26 */
27 #define VPX_EXT_RATECTRL_ABI_VERSION (1)
28
29 /*!\brief Abstract rate control model handler
30 *
31 * The encoder will receive the model handler from create_model() defined in
32 * vpx_rc_funcs_t.
33 */
34 typedef void *vpx_rc_model_t;
35
36 /*!\brief Encode frame decision made by the external rate control model
37 *
38 * The encoder will receive the decision from the external rate control model
39 * through get_encodeframe_decision() defined in vpx_rc_funcs_t.
40 *
41 * If max_frame_size = 0, the encoding ignores max frame size limit.
42 * If max_frame_size = -1, the encoding uses VP9's max frame size as the limit.
43 * If the encoded frame size is larger than max_frame_size, the frame is
44 * recoded to meet the size limit, following VP9's recoding principles.
45 */
46 typedef struct vpx_rc_encodeframe_decision {
47 int q_index; /**< Quantizer step index [0..255]*/
48 int max_frame_size; /**< Maximal frame size allowed to encode a frame*/
49 } vpx_rc_encodeframe_decision_t;
50
51 /*!\brief Information for the frame to be encoded.
52 *
53 * The encoder will send the information to external rate control model through
54 * get_encodeframe_decision() defined in vpx_rc_funcs_t.
55 *
56 */
57 typedef struct vpx_rc_encodeframe_info {
58 /*!
59 * 0: Key frame
60 * 1: Inter frame
61 * 2: Alternate reference frame
62 * 3: Overlay frame
63 * 4: Golden frame
64 */
65 int frame_type;
66 int show_index; /**< display index, starts from zero*/
67 int coding_index; /**< coding index, starts from zero*/
68 /*!
69 * index in group of picture, starts from zero.
70 */
71 int gop_index;
72 int ref_frame_coding_indexes[3]; /**< three reference frames' coding indices*/
73 /*!
74 * The validity of the three reference frames.
75 * 0: Invalid
76 * 1: Valid
77 */
78 int ref_frame_valid_list[3];
79 } vpx_rc_encodeframe_info_t;
80
81 /*!\brief Frame coding result
82 *
83 * The encoder will send the result to the external rate control model through
84 * update_encodeframe_result() defined in vpx_rc_funcs_t.
85 */
86 typedef struct vpx_rc_encodeframe_result {
87 int64_t sse; /**< sum of squared error of the reconstructed frame */
88 int64_t bit_count; /**< number of bits spent on coding the frame*/
89 int64_t pixel_count; /**< number of pixels in YUV planes of the frame*/
90 int actual_encoding_qindex; /**< the actual qindex used to encode the frame*/
91 } vpx_rc_encodeframe_result_t;
92
93 /*!\brief Status returned by rate control callback functions.
94 */
95 typedef enum vpx_rc_status {
96 VPX_RC_OK = 0,
97 VPX_RC_ERROR = 1,
98 } vpx_rc_status_t;
99
100 /*!\brief First pass frame stats
101 * This is a mirror of vp9's FIRSTPASS_STATS except that spatial_layer_id is
102 * omitted
103 */
104 typedef struct vpx_rc_frame_stats {
105 /*!
106 * Frame number in display order, if stats are for a single frame.
107 * No real meaning for a collection of frames.
108 */
109 double frame;
110 /*!
111 * Weight assigned to this frame (or total weight for the collection of
112 * frames) currently based on intra factor and brightness factor. This is used
113 * to distribute bits between easier and harder frames.
114 */
115 double weight;
116 /*!
117 * Intra prediction error.
118 */
119 double intra_error;
120 /*!
121 * Best of intra pred error and inter pred error using last frame as ref.
122 */
123 double coded_error;
124 /*!
125 * Best of intra pred error and inter pred error using golden frame as ref.
126 */
127 double sr_coded_error;
128 /*!
129 * Estimate the noise energy of the current frame.
130 */
131 double frame_noise_energy;
132 /*!
133 * Percentage of blocks with inter pred error < intra pred error.
134 */
135 double pcnt_inter;
136 /*!
137 * Percentage of blocks using (inter prediction and) non-zero motion vectors.
138 */
139 double pcnt_motion;
140 /*!
141 * Percentage of blocks where golden frame was better than last or intra:
142 * inter pred error using golden frame < inter pred error using last frame and
143 * inter pred error using golden frame < intra pred error
144 */
145 double pcnt_second_ref;
146 /*!
147 * Percentage of blocks where intra and inter prediction errors were very
148 * close.
149 */
150 double pcnt_neutral;
151 /*!
152 * Percentage of blocks that have intra error < inter error and inter error <
153 * LOW_I_THRESH
154 * - bit_depth 8: LOW_I_THRESH = 24000
155 * - bit_depth 10: LOW_I_THRESH = 24000 << 4
156 * - bit_depth 12: LOW_I_THRESH = 24000 << 8
157 */
158 double pcnt_intra_low;
159 /*!
160 * Percentage of blocks that have intra error < inter error and intra error <
161 * LOW_I_THRESH but inter error >= LOW_I_THRESH LOW_I_THRESH
162 * - bit_depth 8: LOW_I_THRESH = 24000
163 * - bit_depth 10: LOW_I_THRESH = 24000 << 4
164 * - bit_depth 12: LOW_I_THRESH = 24000 << 8
165 */
166 double pcnt_intra_high;
167 /*!
168 * Percentage of blocks that have almost no intra error residual
169 * (i.e. are in effect completely flat and untextured in the intra
170 * domain). In natural videos this is uncommon, but it is much more
171 * common in animations, graphics and screen content, so may be used
172 * as a signal to detect these types of content.
173 */
174 double intra_skip_pct;
175 /*!
176 * Percentage of blocks that have intra error < SMOOTH_INTRA_THRESH
177 * - bit_depth 8: SMOOTH_INTRA_THRESH = 4000
178 * - bit_depth 10: SMOOTH_INTRA_THRESH = 4000 << 4
179 * - bit_depth 12: SMOOTH_INTRA_THRESH = 4000 << 8
180 */
181 double intra_smooth_pct;
182 /*!
183 * Image mask rows top and bottom.
184 */
185 double inactive_zone_rows;
186 /*!
187 * Image mask columns at left and right edges.
188 */
189 double inactive_zone_cols;
190 /*!
191 * Mean of row motion vectors.
192 */
193 double MVr;
194 /*!
195 * Mean of absolute value of row motion vectors.
196 */
197 double mvr_abs;
198 /*!
199 * Mean of column motion vectors.
200 */
201 double MVc;
202 /*!
203 * Mean of absolute value of column motion vectors.
204 */
205 double mvc_abs;
206 /*!
207 * Variance of row motion vectors.
208 */
209 double MVrv;
210 /*!
211 * Variance of column motion vectors.
212 */
213 double MVcv;
214 /*!
215 * Value in range [-1,1] indicating fraction of row and column motion vectors
216 * that point inwards (negative MV value) or outwards (positive MV value).
217 * For example, value of 1 indicates, all row/column MVs are inwards.
218 */
219 double mv_in_out_count;
220 /*!
221 * Duration of the frame / collection of frames.
222 */
223 double duration;
224 /*!
225 * 1.0 if stats are for a single frame, or
226 * number of frames whose stats are accumulated.
227 */
228 double count;
229 } vpx_rc_frame_stats_t;
230
231 /*!\brief Collection of first pass frame stats
232 */
233 typedef struct vpx_rc_firstpass_stats {
234 /*!
235 * Pointer to first pass frame stats.
236 * The pointed array of vpx_rc_frame_stats_t should have length equal to
237 * number of show frames in the video.
238 */
239 vpx_rc_frame_stats_t *frame_stats;
240 /*!
241 * Number of show frames in the video.
242 */
243 int num_frames;
244 } vpx_rc_firstpass_stats_t;
245
246 /*!\brief Encode config sent to external rate control model
247 */
248 typedef struct vpx_rc_config {
249 int frame_width; /**< frame width */
250 int frame_height; /**< frame height */
251 int show_frame_count; /**< number of visible frames in the video */
252 /*!
253 * Target bitrate in kilobytes per second
254 */
255 int target_bitrate_kbps;
256 int frame_rate_num; /**< numerator of frame rate */
257 int frame_rate_den; /**< denominator of frame rate */
258 } vpx_rc_config_t;
259
260 /*!\brief Create an external rate control model callback prototype
261 *
262 * This callback is invoked by the encoder to create an external rate control
263 * model.
264 *
265 * \param[in] priv Callback's private data
266 * \param[in] ratectrl_config Pointer to vpx_rc_config_t
267 * \param[out] rate_ctrl_model_pt Pointer to vpx_rc_model_t
268 */
269 typedef vpx_rc_status_t (*vpx_rc_create_model_cb_fn_t)(
270 void *priv, const vpx_rc_config_t *ratectrl_config,
271 vpx_rc_model_t *rate_ctrl_model_pt);
272
273 /*!\brief Send first pass stats to the external rate control model callback
274 * prototype
275 *
276 * This callback is invoked by the encoder to send first pass stats to the
277 * external rate control model.
278 *
279 * \param[in] rate_ctrl_model rate control model
280 * \param[in] first_pass_stats first pass stats
281 */
282 typedef vpx_rc_status_t (*vpx_rc_send_firstpass_stats_cb_fn_t)(
283 vpx_rc_model_t rate_ctrl_model,
284 const vpx_rc_firstpass_stats_t *first_pass_stats);
285
286 /*!\brief Receive encode frame decision callback prototype
287 *
288 * This callback is invoked by the encoder to receive encode frame decision from
289 * the external rate control model.
290 *
291 * \param[in] rate_ctrl_model rate control model
292 * \param[in] encode_frame_info information of the coding frame
293 * \param[out] frame_decision encode decision of the coding frame
294 */
295 typedef vpx_rc_status_t (*vpx_rc_get_encodeframe_decision_cb_fn_t)(
296 vpx_rc_model_t rate_ctrl_model,
297 const vpx_rc_encodeframe_info_t *encode_frame_info,
298 vpx_rc_encodeframe_decision_t *frame_decision);
299
300 /*!\brief Update encode frame result callback prototype
301 *
302 * This callback is invoked by the encoder to update encode frame result to the
303 * external rate control model.
304 *
305 * \param[in] rate_ctrl_model rate control model
306 * \param[out] encode_frame_result encode result of the coding frame
307 */
308 typedef vpx_rc_status_t (*vpx_rc_update_encodeframe_result_cb_fn_t)(
309 vpx_rc_model_t rate_ctrl_model,
310 const vpx_rc_encodeframe_result_t *encode_frame_result);
311
312 /*!\brief Delete the external rate control model callback prototype
313 *
314 * This callback is invoked by the encoder to delete the external rate control
315 * model.
316 *
317 * \param[in] rate_ctrl_model rate control model
318 */
319 typedef vpx_rc_status_t (*vpx_rc_delete_model_cb_fn_t)(
320 vpx_rc_model_t rate_ctrl_model);
321
322 /*!\brief Callback function set for external rate control.
323 *
324 * The user can enable external rate control by registering
325 * a set of callback functions with the codec control flag
326 * VP9E_SET_EXTERNAL_RATE_CONTROL.
327 */
328 typedef struct vpx_rc_funcs {
329 /*!
330 * Create an external rate control model.
331 */
332 vpx_rc_create_model_cb_fn_t create_model;
333 /*!
334 * Send first pass stats to the external rate control model.
335 */
336 vpx_rc_send_firstpass_stats_cb_fn_t send_firstpass_stats;
337 /*!
338 * Get encodeframe decision from the external rate control model.
339 */
340 vpx_rc_get_encodeframe_decision_cb_fn_t get_encodeframe_decision;
341 /*!
342 * Update encodeframe result to the external rate control model.
343 */
344 vpx_rc_update_encodeframe_result_cb_fn_t update_encodeframe_result;
345 /*!
346 * Delete the external rate control model.
347 */
348 vpx_rc_delete_model_cb_fn_t delete_model;
349 /*!
350 * Private data for the external rate control model.
351 */
352 void *priv;
353 } vpx_rc_funcs_t;
354
355 #ifdef __cplusplus
356 } // extern "C"
357 #endif
358
359 #endif // VPX_VPX_VPX_EXT_RATECTRL_H_
660660 vpx_highbd_lpf_vertical_8_neon(s + 8 * p, p, blimit1, limit1, thresh1, bd);
661661 }
662662
663 // Quiet warnings of the form: 'vpx_dsp/arm/highbd_loopfilter_neon.c|675 col 67|
664 // warning: 'oq1' may be used uninitialized in this function
665 // [-Wmaybe-uninitialized]', for oq1-op1. Without reworking the code or adding
666 // an additional branch this warning cannot be silenced otherwise. The
667 // loopfilter is only called when needed for a block so these output pixels
668 // will be set.
669 #if defined(__GNUC__) && __GNUC__ >= 4 && !defined(__clang__)
670 #pragma GCC diagnostic push
671 #pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
672 #endif
673
663674 static void lpf_horizontal_16_kernel(uint16_t *s, int p,
664675 const uint16x8_t blimit_vec,
665676 const uint16x8_t limit_vec,
722733 }
723734 }
724735
736 #if defined(__GNUC__) && __GNUC__ >= 4 && !defined(__clang__)
737 #pragma GCC diagnostic pop
738 #endif
739
725740 void vpx_highbd_lpf_horizontal_16_neon(uint16_t *s, int p,
726741 const uint8_t *blimit,
727742 const uint8_t *limit,
974974 FUN_LPF_16_KERNEL(_dual_, 16) // lpf_16_dual_kernel
975975 #undef FUN_LPF_16_KERNEL
976976
977 // Quiet warnings of the form: 'vpx_dsp/arm/loopfilter_neon.c|981 col 42|
978 // warning: 'oq1' may be used uninitialized in this function
979 // [-Wmaybe-uninitialized]', for oq1-op1. Without reworking the code or adding
980 // an additional branch this warning cannot be silenced otherwise. The
981 // loopfilter is only called when needed for a block so these output pixels
982 // will be set.
983 #if defined(__GNUC__) && __GNUC__ >= 4 && !defined(__clang__)
984 #pragma GCC diagnostic push
985 #pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
986 #endif
987
977988 void vpx_lpf_horizontal_16_neon(uint8_t *s, int p, const uint8_t *blimit,
978989 const uint8_t *limit, const uint8_t *thresh) {
979990 uint8x8_t p7, p6, p5, p4, p3, p2, p1, p0, q0, q1, q2, q3, q4, q5, q6, q7, op6,
10891100 vget_high_u8(oq0), vget_high_u8(oq1));
10901101 }
10911102 }
1103
1104 #if defined(__GNUC__) && __GNUC__ >= 4 && !defined(__clang__)
1105 #pragma GCC diagnostic pop
1106 #endif
8787 const uint8_t *psrc_lw_m = (const uint8_t *)(psrc); \
8888 uint32_t val_lw_m; \
8989 \
90 __asm__ __volatile__("ulw %[val_lw_m], %[psrc_lw_m] \n\t" \
91 \
92 : [val_lw_m] "=r"(val_lw_m) \
93 : [psrc_lw_m] "m"(*psrc_lw_m)); \
90 __asm__ __volatile__("lwr %[val_lw_m], 0(%[psrc_lw_m]) \n\t" \
91 "lwl %[val_lw_m], 3(%[psrc_lw_m]) \n\t" \
92 : [val_lw_m] "=&r"(val_lw_m) \
93 : [psrc_lw_m] "r"(psrc_lw_m)); \
9494 \
9595 val_lw_m; \
9696 })
101101 const uint8_t *psrc_ld_m = (const uint8_t *)(psrc); \
102102 uint64_t val_ld_m = 0; \
103103 \
104 __asm__ __volatile__("uld %[val_ld_m], %[psrc_ld_m] \n\t" \
105 \
106 : [val_ld_m] "=r"(val_ld_m) \
107 : [psrc_ld_m] "m"(*psrc_ld_m)); \
104 __asm__ __volatile__("ldr %[val_ld_m], 0(%[psrc_ld_m]) \n\t" \
105 "ldl %[val_ld_m], 7(%[psrc_ld_m]) \n\t" \
106 : [val_ld_m] "=&r"(val_ld_m) \
107 : [psrc_ld_m] "r"(psrc_ld_m)); \
108108 \
109109 val_ld_m; \
110110 })
363363 double ftmp1, ftmp2, ftmp3, ftmp4, ftmp5;
364364 mips_reg l_counter = counter;
365365
366 __asm__ volatile (
367 "xor %[ftmp5], %[ftmp5], %[ftmp5] \n\t"
366 /* clang-format off */
367 __asm__ volatile (
368 "pxor %[ftmp5], %[ftmp5], %[ftmp5] \n\t"
368369 "1: \n\t"
369370 // Include two loop body, to reduce loop time.
370371 SAD_SRC_REF_ABS_SUB_64
382383 : [src_stride]"r"((mips_reg)src_stride),
383384 [ref_stride]"r"((mips_reg)ref_stride)
384385 );
386 /* clang-format on */
385387
386388 return sad;
387389 }
404406 unsigned int sad;
405407 double ftmp1, ftmp2, ftmp3, ftmp4, ftmp5;
406408 mips_reg l_counter = counter;
407
408 __asm__ volatile (
409 "xor %[ftmp5], %[ftmp5], %[ftmp5] \n\t"
409 mips_reg l_second_pred = (mips_reg)second_pred;
410
411 /* clang-format off */
412 __asm__ volatile (
413 "pxor %[ftmp5], %[ftmp5], %[ftmp5] \n\t"
410414 "1: \n\t"
411415 // Include two loop body, to reduce loop time.
412416 SAD_SRC_AVGREF_ABS_SUB_64
423427 : [ftmp1]"=&f"(ftmp1), [ftmp2]"=&f"(ftmp2), [ftmp3]"=&f"(ftmp3),
424428 [ftmp4]"=&f"(ftmp4), [ftmp5]"=&f"(ftmp5), [counter]"+&r"(l_counter),
425429 [src]"+&r"(src), [ref]"+&r"(ref),
426 [second_pred]"+&r"((mips_reg)second_pred),
430 [second_pred]"+&r"(l_second_pred),
427431 [sad]"=&r"(sad)
428432 : [src_stride]"r"((mips_reg)src_stride),
429433 [ref_stride]"r"((mips_reg)ref_stride)
430434 );
435 /* clang-format on */
431436
432437 return sad;
433438 }
449454 double ftmp1, ftmp2, ftmp3, ftmp4, ftmp5;
450455 mips_reg l_counter = counter;
451456
452 __asm__ volatile (
453 "xor %[ftmp5], %[ftmp5], %[ftmp5] \n\t"
457 /* clang-format off */
458 __asm__ volatile (
459 "pxor %[ftmp5], %[ftmp5], %[ftmp5] \n\t"
454460 "1: \n\t"
455461 // Include two loop body, to reduce loop time.
456462 SAD_SRC_REF_ABS_SUB_32
468474 : [src_stride]"r"((mips_reg)src_stride),
469475 [ref_stride]"r"((mips_reg)ref_stride)
470476 );
477 /* clang-format on */
471478
472479 return sad;
473480 }
492499 unsigned int sad;
493500 double ftmp1, ftmp2, ftmp3, ftmp4, ftmp5;
494501 mips_reg l_counter = counter;
495
496 __asm__ volatile (
497 "xor %[ftmp5], %[ftmp5], %[ftmp5] \n\t"
502 mips_reg l_second_pred = (mips_reg)second_pred;
503
504 /* clang-format off */
505 __asm__ volatile (
506 "pxor %[ftmp5], %[ftmp5], %[ftmp5] \n\t"
498507 "1: \n\t"
499508 // Include two loop body, to reduce loop time.
500509 SAD_SRC_AVGREF_ABS_SUB_32
511520 : [ftmp1]"=&f"(ftmp1), [ftmp2]"=&f"(ftmp2), [ftmp3]"=&f"(ftmp3),
512521 [ftmp4]"=&f"(ftmp4), [ftmp5]"=&f"(ftmp5), [counter]"+&r"(l_counter),
513522 [src]"+&r"(src), [ref]"+&r"(ref),
514 [second_pred]"+&r"((mips_reg)second_pred),
523 [second_pred]"+&r"(l_second_pred),
515524 [sad]"=&r"(sad)
516525 : [src_stride]"r"((mips_reg)src_stride),
517526 [ref_stride]"r"((mips_reg)ref_stride)
518527 );
528 /* clang-format on */
519529
520530 return sad;
521531 }
538548 double ftmp1, ftmp2, ftmp3, ftmp4, ftmp5;
539549 mips_reg l_counter = counter;
540550
541 __asm__ volatile (
542 "xor %[ftmp5], %[ftmp5], %[ftmp5] \n\t"
551 /* clang-format off */
552 __asm__ volatile (
553 "pxor %[ftmp5], %[ftmp5], %[ftmp5] \n\t"
543554 "1: \n\t"
544555 // Include two loop body, to reduce loop time.
545556 SAD_SRC_REF_ABS_SUB_16
557568 : [src_stride]"r"((mips_reg)src_stride),
558569 [ref_stride]"r"((mips_reg)ref_stride)
559570 );
571 /* clang-format on */
560572
561573 return sad;
562574 }
585597 unsigned int sad;
586598 double ftmp1, ftmp2, ftmp3, ftmp4, ftmp5;
587599 mips_reg l_counter = counter;
588
589 __asm__ volatile (
590 "xor %[ftmp5], %[ftmp5], %[ftmp5] \n\t"
600 mips_reg l_second_pred = (mips_reg)second_pred;
601
602 /* clang-format off */
603 __asm__ volatile (
604 "pxor %[ftmp5], %[ftmp5], %[ftmp5] \n\t"
591605 "1: \n\t"
592606 // Include two loop body, to reduce loop time.
593607 SAD_SRC_AVGREF_ABS_SUB_16
604618 : [ftmp1]"=&f"(ftmp1), [ftmp2]"=&f"(ftmp2), [ftmp3]"=&f"(ftmp3),
605619 [ftmp4]"=&f"(ftmp4), [ftmp5]"=&f"(ftmp5), [counter]"+&r"(l_counter),
606620 [src]"+&r"(src), [ref]"+&r"(ref),
607 [second_pred]"+&r"((mips_reg)second_pred),
621 [second_pred]"+&r"(l_second_pred),
608622 [sad]"=&r"(sad)
609623 : [src_stride]"r"((mips_reg)src_stride),
610624 [ref_stride]"r"((mips_reg)ref_stride)
611625 );
626 /* clang-format on */
612627
613628 return sad;
614629 }
631646 double ftmp1, ftmp2, ftmp3;
632647 mips_reg l_counter = counter;
633648
634 __asm__ volatile (
635 "xor %[ftmp3], %[ftmp3], %[ftmp3] \n\t"
649 /* clang-format off */
650 __asm__ volatile (
651 "pxor %[ftmp3], %[ftmp3], %[ftmp3] \n\t"
636652 "1: \n\t"
637653 // Include two loop body, to reduce loop time.
638654 SAD_SRC_REF_ABS_SUB_8
650666 : [src_stride]"r"((mips_reg)src_stride),
651667 [ref_stride]"r"((mips_reg)ref_stride)
652668 );
669 /* clang-format on */
653670
654671 return sad;
655672 }
678695 unsigned int sad;
679696 double ftmp1, ftmp2, ftmp3;
680697 mips_reg l_counter = counter;
681
682 __asm__ volatile (
683 "xor %[ftmp3], %[ftmp3], %[ftmp3] \n\t"
698 mips_reg l_second_pred = (mips_reg)second_pred;
699
700 /* clang-format off */
701 __asm__ volatile (
702 "pxor %[ftmp3], %[ftmp3], %[ftmp3] \n\t"
684703 "1: \n\t"
685704 // Include two loop body, to reduce loop time.
686705 SAD_SRC_AVGREF_ABS_SUB_8
696715 "mfc1 %[sad], %[ftmp3] \n\t"
697716 : [ftmp1]"=&f"(ftmp1), [ftmp2]"=&f"(ftmp2), [ftmp3]"=&f"(ftmp3),
698717 [counter]"+&r"(l_counter), [src]"+&r"(src), [ref]"+&r"(ref),
699 [second_pred]"+&r"((mips_reg)second_pred),
718 [second_pred]"+&r"(l_second_pred),
700719 [sad]"=&r"(sad)
701720 : [src_stride]"r"((mips_reg)src_stride),
702721 [ref_stride]"r"((mips_reg)ref_stride)
703722 );
723 /* clang-format on */
704724
705725 return sad;
706726 }
723743 double ftmp1, ftmp2, ftmp3;
724744 mips_reg l_counter = counter;
725745
726 __asm__ volatile (
727 "xor %[ftmp3], %[ftmp3], %[ftmp3] \n\t"
746 /* clang-format off */
747 __asm__ volatile (
748 "pxor %[ftmp3], %[ftmp3], %[ftmp3] \n\t"
728749 "1: \n\t"
729750 // Include two loop body, to reduce loop time.
730751 SAD_SRC_REF_ABS_SUB_4
742763 : [src_stride]"r"((mips_reg)src_stride),
743764 [ref_stride]"r"((mips_reg)ref_stride)
744765 );
766 /* clang-format on */
745767
746768 return sad;
747769 }
766788 unsigned int sad;
767789 double ftmp1, ftmp2, ftmp3;
768790 mips_reg l_counter = counter;
769
770 __asm__ volatile (
771 "xor %[ftmp3], %[ftmp3], %[ftmp3] \n\t"
791 mips_reg l_second_pred = (mips_reg)second_pred;
792
793 /* clang-format off */
794 __asm__ volatile (
795 "pxor %[ftmp3], %[ftmp3], %[ftmp3] \n\t"
772796 "1: \n\t"
773797 // Include two loop body, to reduce loop time.
774798 SAD_SRC_AVGREF_ABS_SUB_4
784808 "mfc1 %[sad], %[ftmp3] \n\t"
785809 : [ftmp1]"=&f"(ftmp1), [ftmp2]"=&f"(ftmp2), [ftmp3]"=&f"(ftmp3),
786810 [counter]"+&r"(l_counter), [src]"+&r"(src), [ref]"+&r"(ref),
787 [second_pred]"+&r"((mips_reg)second_pred),
811 [second_pred]"+&r"(l_second_pred),
788812 [sad]"=&r"(sad)
789813 : [src_stride]"r"((mips_reg)src_stride),
790814 [ref_stride]"r"((mips_reg)ref_stride)
791815 );
816 /* clang-format on */
792817
793818 return sad;
794819 }
2323 switch (rows) {
2424 case 4:
2525 __asm__ volatile(
26 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
26 "pxor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
2727 #if _MIPS_SIM == _ABIO32
2828 "ulw %[tmp0], 0x00(%[src]) \n\t"
2929 "mtc1 %[tmp0], %[ftmp1] \n\t"
117117 break;
118118 case 8:
119119 __asm__ volatile(
120 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
120 "pxor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
121121 "li %[tmp0], 0x02 \n\t"
122122 "1: \n\t"
123123 "gsldlc1 %[ftmp1], 0x07(%[src]) \n\t"
205205 break;
206206 case 16:
207207 __asm__ volatile(
208 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
208 "pxor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
209209 "li %[tmp0], 0x08 \n\t"
210210 "1: \n\t"
211211 "gsldlc1 %[ftmp1], 0x07(%[src]) \n\t"
149149 "psrlh %[ftmp2], %[ftmp2], %[ftmp6] \n\t" \
150150 \
151151 /* store: temp2[0] ~ temp2[3] */ \
152 "and %[ftmp2], %[ftmp2], %[mask] \n\t" \
152 "pand %[ftmp2], %[ftmp2], %[mask] \n\t" \
153153 "packushb %[ftmp2], %[ftmp2], %[ftmp0] \n\t" \
154154 "gssdrc1 %[ftmp2], 0x00(%[temp2_ptr]) \n\t"
155155
162162 "psrlh %[ftmp4], %[ftmp4], %[ftmp6] \n\t" \
163163 \
164164 /* store: temp2[0] ~ temp2[3] */ \
165 "and %[ftmp4], %[ftmp4], %[mask] \n\t" \
165 "pand %[ftmp4], %[ftmp4], %[mask] \n\t" \
166166 "packushb %[ftmp4], %[ftmp4], %[ftmp0] \n\t" \
167167 "gssdrc1 %[ftmp4], 0x00(%[temp2_ptr]) \n\t"
168168
224224 "psrlh %[ftmp3], %[ftmp3], %[ftmp14] \n\t" \
225225 \
226226 /* store: temp2[0] ~ temp2[7] */ \
227 "and %[ftmp2], %[ftmp2], %[mask] \n\t" \
228 "and %[ftmp3], %[ftmp3], %[mask] \n\t" \
227 "pand %[ftmp2], %[ftmp2], %[mask] \n\t" \
228 "pand %[ftmp3], %[ftmp3], %[mask] \n\t" \
229229 "packushb %[ftmp2], %[ftmp2], %[ftmp3] \n\t" \
230230 "gssdlc1 %[ftmp2], 0x07(%[temp2_ptr]) \n\t" \
231231 "gssdrc1 %[ftmp2], 0x00(%[temp2_ptr]) \n\t"
246246 "psrlh %[ftmp9], %[ftmp9], %[ftmp14] \n\t" \
247247 \
248248 /* store: temp2[0] ~ temp2[7] */ \
249 "and %[ftmp8], %[ftmp8], %[mask] \n\t" \
250 "and %[ftmp9], %[ftmp9], %[mask] \n\t" \
249 "pand %[ftmp8], %[ftmp8], %[mask] \n\t" \
250 "pand %[ftmp9], %[ftmp9], %[mask] \n\t" \
251251 "packushb %[ftmp8], %[ftmp8], %[ftmp9] \n\t" \
252252 "gssdlc1 %[ftmp8], 0x07(%[temp2_ptr]) \n\t" \
253253 "gssdrc1 %[ftmp8], 0x00(%[temp2_ptr]) \n\t"
318318 "psrlh %[ftmp5], %[ftmp5], %[ftmp14] \n\t" \
319319 \
320320 /* store: temp2[8] ~ temp2[15] */ \
321 "and %[ftmp4], %[ftmp4], %[mask] \n\t" \
322 "and %[ftmp5], %[ftmp5], %[mask] \n\t" \
321 "pand %[ftmp4], %[ftmp4], %[mask] \n\t" \
322 "pand %[ftmp5], %[ftmp5], %[mask] \n\t" \
323323 "packushb %[ftmp4], %[ftmp4], %[ftmp5] \n\t" \
324324 "gssdlc1 %[ftmp4], 0x0f(%[temp2_ptr]) \n\t" \
325325 "gssdrc1 %[ftmp4], 0x08(%[temp2_ptr]) \n\t"
342342 "psrlh %[ftmp11], %[ftmp11], %[ftmp14] \n\t" \
343343 \
344344 /* store: temp2[8] ~ temp2[15] */ \
345 "and %[ftmp10], %[ftmp10], %[mask] \n\t" \
346 "and %[ftmp11], %[ftmp11], %[mask] \n\t" \
345 "pand %[ftmp10], %[ftmp10], %[mask] \n\t" \
346 "pand %[ftmp11], %[ftmp11], %[mask] \n\t" \
347347 "packushb %[ftmp10], %[ftmp10], %[ftmp11] \n\t" \
348348 "gssdlc1 %[ftmp10], 0x0f(%[temp2_ptr]) \n\t" \
349349 "gssdrc1 %[ftmp10], 0x08(%[temp2_ptr]) \n\t"
413413
414414 *sse = 0;
415415
416 /* clang-format off */
416417 __asm__ volatile (
417418 "li %[tmp0], 0x20 \n\t"
418419 "mtc1 %[tmp0], %[ftmp11] \n\t"
419420 MMI_L(%[tmp0], %[high], 0x00)
420 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
421 "xor %[ftmp9], %[ftmp9], %[ftmp9] \n\t"
422 "xor %[ftmp10], %[ftmp10], %[ftmp10] \n\t"
421 "pxor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
422 "pxor %[ftmp9], %[ftmp9], %[ftmp9] \n\t"
423 "pxor %[ftmp10], %[ftmp10], %[ftmp10] \n\t"
423424 "1: \n\t"
424425 "gsldlc1 %[ftmp1], 0x07(%[src_ptr]) \n\t"
425426 "gsldrc1 %[ftmp1], 0x00(%[src_ptr]) \n\t"
477478 "mfc1 %[tmp1], %[ftmp9] \n\t"
478479 "mfhc1 %[tmp2], %[ftmp9] \n\t"
479480 "addu %[sum], %[tmp1], %[tmp2] \n\t"
480 "dsrl %[ftmp1], %[ftmp10], %[ftmp11] \n\t"
481 "ssrld %[ftmp1], %[ftmp10], %[ftmp11] \n\t"
481482 "paddw %[ftmp1], %[ftmp1], %[ftmp10] \n\t"
482483 "swc1 %[ftmp1], 0x00(%[sse]) \n\t"
483484 : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),
495496 [high]"r"(&high), [sse]"r"(sse)
496497 : "memory"
497498 );
499 /* clang-format on */
498500
499501 return *sse - (((int64_t)sum * sum) / (64 * high));
500502 }
518520
519521 *sse = 0;
520522
523 /* clang-format off */
521524 __asm__ volatile (
522525 "li %[tmp0], 0x20 \n\t"
523526 "mtc1 %[tmp0], %[ftmp11] \n\t"
524527 "li %[tmp0], 0x40 \n\t"
525 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
526 "xor %[ftmp9], %[ftmp9], %[ftmp9] \n\t"
527 "xor %[ftmp10], %[ftmp10], %[ftmp10] \n\t"
528 "pxor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
529 "pxor %[ftmp9], %[ftmp9], %[ftmp9] \n\t"
530 "pxor %[ftmp10], %[ftmp10], %[ftmp10] \n\t"
528531 "1: \n\t"
529532 "gsldlc1 %[ftmp1], 0x07(%[src_ptr]) \n\t"
530533 "gsldrc1 %[ftmp1], 0x00(%[src_ptr]) \n\t"
558561 "mfc1 %[tmp1], %[ftmp9] \n\t"
559562 "mfhc1 %[tmp2], %[ftmp9] \n\t"
560563 "addu %[sum], %[tmp1], %[tmp2] \n\t"
561 "dsrl %[ftmp1], %[ftmp10], %[ftmp11] \n\t"
564 "ssrld %[ftmp1], %[ftmp10], %[ftmp11] \n\t"
562565 "paddw %[ftmp1], %[ftmp1], %[ftmp10] \n\t"
563566 "swc1 %[ftmp1], 0x00(%[sse]) \n\t"
564567 : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),
576579 [sse]"r"(sse)
577580 : "memory"
578581 );
582 /* clang-format on */
579583
580584 return *sse - (((int64_t)sum * sum) / 2048);
581585 }
589593
590594 *sse = 0;
591595
596 /* clang-format off */
592597 __asm__ volatile (
593598 "li %[tmp0], 0x20 \n\t"
594599 "mtc1 %[tmp0], %[ftmp11] \n\t"
595600 MMI_L(%[tmp0], %[high], 0x00)
596 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
597 "xor %[ftmp8], %[ftmp8], %[ftmp8] \n\t"
598 "xor %[ftmp10], %[ftmp10], %[ftmp10] \n\t"
599 "xor %[ftmp12], %[ftmp12], %[ftmp12] \n\t"
601 "pxor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
602 "pxor %[ftmp8], %[ftmp8], %[ftmp8] \n\t"
603 "pxor %[ftmp10], %[ftmp10], %[ftmp10] \n\t"
604 "pxor %[ftmp12], %[ftmp12], %[ftmp12] \n\t"
600605 "1: \n\t"
601606 "gsldlc1 %[ftmp1], 0x07(%[src_ptr]) \n\t"
602607 "gsldrc1 %[ftmp1], 0x00(%[src_ptr]) \n\t"
624629 MMI_ADDU(%[ref_ptr], %[ref_ptr], %[ref_stride])
625630 "bnez %[tmp0], 1b \n\t"
626631
627 "dsrl %[ftmp9], %[ftmp8], %[ftmp11] \n\t"
632 "ssrld %[ftmp9], %[ftmp8], %[ftmp11] \n\t"
628633 "paddw %[ftmp9], %[ftmp9], %[ftmp8] \n\t"
629634 "swc1 %[ftmp9], 0x00(%[sse]) \n\t"
630635
635640 "paddw %[ftmp3], %[ftmp3], %[ftmp4] \n\t"
636641 "psubw %[ftmp3], %[ftmp3], %[ftmp5] \n\t"
637642 "psubw %[ftmp3], %[ftmp3], %[ftmp6] \n\t"
638 "dsrl %[ftmp0], %[ftmp3], %[ftmp11] \n\t"
643 "ssrld %[ftmp0], %[ftmp3], %[ftmp11] \n\t"
639644 "paddw %[ftmp0], %[ftmp0], %[ftmp3] \n\t"
640645 "swc1 %[ftmp0], 0x00(%[sum]) \n\t"
641646
652657 [high]"r"(&high), [sse]"r"(sse), [sum]"r"(&sum)
653658 : "memory"
654659 );
660 /* clang-format on */
655661
656662 return *sse - (((int64_t)sum * sum) / (32 * high));
657663 }
675681
676682 *sse = 0;
677683
684 /* clang-format off */
678685 __asm__ volatile (
679686 "li %[tmp0], 0x20 \n\t"
680687 "mtc1 %[tmp0], %[ftmp11] \n\t"
681688 MMI_L(%[tmp0], %[high], 0x00)
682 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
683 "xor %[ftmp8], %[ftmp8], %[ftmp8] \n\t"
684 "xor %[ftmp10], %[ftmp10], %[ftmp10] \n\t"
685 "xor %[ftmp12], %[ftmp12], %[ftmp12] \n\t"
689 "pxor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
690 "pxor %[ftmp8], %[ftmp8], %[ftmp8] \n\t"
691 "pxor %[ftmp10], %[ftmp10], %[ftmp10] \n\t"
692 "pxor %[ftmp12], %[ftmp12], %[ftmp12] \n\t"
686693 "1: \n\t"
687694 "gsldlc1 %[ftmp1], 0x07(%[src_ptr]) \n\t"
688695 "gsldrc1 %[ftmp1], 0x00(%[src_ptr]) \n\t"
700707 MMI_ADDU(%[ref_ptr], %[ref_ptr], %[ref_stride])
701708 "bnez %[tmp0], 1b \n\t"
702709
703 "dsrl %[ftmp9], %[ftmp8], %[ftmp11] \n\t"
710 "ssrld %[ftmp9], %[ftmp8], %[ftmp11] \n\t"
704711 "paddw %[ftmp9], %[ftmp9], %[ftmp8] \n\t"
705712 "swc1 %[ftmp9], 0x00(%[sse]) \n\t"
706713
711718 "paddw %[ftmp3], %[ftmp3], %[ftmp4] \n\t"
712719 "psubw %[ftmp3], %[ftmp3], %[ftmp5] \n\t"
713720 "psubw %[ftmp3], %[ftmp3], %[ftmp6] \n\t"
714 "dsrl %[ftmp0], %[ftmp3], %[ftmp11] \n\t"
721 "ssrld %[ftmp0], %[ftmp3], %[ftmp11] \n\t"
715722 "paddw %[ftmp0], %[ftmp0], %[ftmp3] \n\t"
716723 "swc1 %[ftmp0], 0x00(%[sum]) \n\t"
717724
728735 [high]"r"(&high), [sse]"r"(sse), [sum]"r"(&sum)
729736 : "memory"
730737 );
738 /* clang-format on */
731739
732740 return *sse - (((int64_t)sum * sum) / (16 * high));
733741 }
752760
753761 *sse = 0;
754762
763 /* clang-format off */
755764 __asm__ volatile (
756765 "li %[tmp0], 0x20 \n\t"
757766 "mtc1 %[tmp0], %[ftmp11] \n\t"
758767 MMI_L(%[tmp0], %[high], 0x00)
759 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
760 "xor %[ftmp8], %[ftmp8], %[ftmp8] \n\t"
761 "xor %[ftmp10], %[ftmp10], %[ftmp10] \n\t"
762 "xor %[ftmp12], %[ftmp12], %[ftmp12] \n\t"
768 "pxor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
769 "pxor %[ftmp8], %[ftmp8], %[ftmp8] \n\t"
770 "pxor %[ftmp10], %[ftmp10], %[ftmp10] \n\t"
771 "pxor %[ftmp12], %[ftmp12], %[ftmp12] \n\t"
763772 "1: \n\t"
764773 "gsldlc1 %[ftmp1], 0x07(%[src_ptr]) \n\t"
765774 "gsldrc1 %[ftmp1], 0x00(%[src_ptr]) \n\t"
772781 MMI_ADDU(%[ref_ptr], %[ref_ptr], %[ref_stride])
773782 "bnez %[tmp0], 1b \n\t"
774783
775 "dsrl %[ftmp9], %[ftmp8], %[ftmp11] \n\t"
784 "ssrld %[ftmp9], %[ftmp8], %[ftmp11] \n\t"
776785 "paddw %[ftmp9], %[ftmp9], %[ftmp8] \n\t"
777786 "swc1 %[ftmp9], 0x00(%[sse]) \n\t"
778787
783792 "paddw %[ftmp3], %[ftmp3], %[ftmp4] \n\t"
784793 "psubw %[ftmp3], %[ftmp3], %[ftmp5] \n\t"
785794 "psubw %[ftmp3], %[ftmp3], %[ftmp6] \n\t"
786 "dsrl %[ftmp0], %[ftmp3], %[ftmp11] \n\t"
795 "ssrld %[ftmp0], %[ftmp3], %[ftmp11] \n\t"
787796 "paddw %[ftmp0], %[ftmp0], %[ftmp3] \n\t"
788797 "swc1 %[ftmp0], 0x00(%[sum]) \n\t"
789798
800809 [high]"r"(&high), [sse]"r"(sse), [sum]"r"(&sum)
801810 : "memory"
802811 );
812 /* clang-format on */
803813
804814 return *sse - (((int64_t)sum * sum) / (8 * high));
805815 }
824834
825835 *sse = 0;
826836
837 /* clang-format off */
827838 __asm__ volatile (
828839 "li %[tmp0], 0x20 \n\t"
829840 "mtc1 %[tmp0], %[ftmp10] \n\t"
830841 MMI_L(%[tmp0], %[high], 0x00)
831 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
832 "xor %[ftmp6], %[ftmp6], %[ftmp6] \n\t"
833 "xor %[ftmp7], %[ftmp7], %[ftmp7] \n\t"
834 "xor %[ftmp8], %[ftmp8], %[ftmp8] \n\t"
842 "pxor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
843 "pxor %[ftmp6], %[ftmp6], %[ftmp6] \n\t"
844 "pxor %[ftmp7], %[ftmp7], %[ftmp7] \n\t"
845 "pxor %[ftmp8], %[ftmp8], %[ftmp8] \n\t"
835846 "1: \n\t"
836847 "gsldlc1 %[ftmp1], 0x07(%[src_ptr]) \n\t"
837848 "gsldrc1 %[ftmp1], 0x00(%[src_ptr]) \n\t"
844855 MMI_ADDU(%[ref_ptr], %[ref_ptr], %[ref_stride])
845856 "bnez %[tmp0], 1b \n\t"
846857
847 "dsrl %[ftmp9], %[ftmp6], %[ftmp10] \n\t"
858 "ssrld %[ftmp9], %[ftmp6], %[ftmp10] \n\t"
848859 "paddw %[ftmp9], %[ftmp9], %[ftmp6] \n\t"
849860 "swc1 %[ftmp9], 0x00(%[sse]) \n\t"
850861
855866 "paddw %[ftmp3], %[ftmp3], %[ftmp4] \n\t"
856867 "psubw %[ftmp3], %[ftmp3], %[ftmp5] \n\t"
857868 "psubw %[ftmp3], %[ftmp3], %[ftmp6] \n\t"
858 "dsrl %[ftmp0], %[ftmp3], %[ftmp10] \n\t"
869 "ssrld %[ftmp0], %[ftmp3], %[ftmp10] \n\t"
859870 "paddw %[ftmp0], %[ftmp0], %[ftmp3] \n\t"
860871 "swc1 %[ftmp0], 0x00(%[sum]) \n\t"
861872 : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),
871882 [high]"r"(&high), [sse]"r"(sse), [sum]"r"(&sum)
872883 : "memory"
873884 );
885 /* clang-format on */
874886
875887 return *sse - (((int64_t)sum * sum) / (4 * high));
876888 }
893905
894906 *sse = 0;
895907
908 /* clang-format off */
896909 __asm__ volatile (
897910 "li %[tmp0], 0x20 \n\t"
898911 "mtc1 %[tmp0], %[ftmp11] \n\t"
899912 MMI_L(%[tmp0], %[high], 0x00)
900 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
901 "xor %[ftmp8], %[ftmp8], %[ftmp8] \n\t"
913 "pxor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
914 "pxor %[ftmp8], %[ftmp8], %[ftmp8] \n\t"
902915
903916 "1: \n\t"
904917 VARIANCE_SSE_16
908921 MMI_ADDU(%[ref_ptr], %[ref_ptr], %[ref_stride])
909922 "bnez %[tmp0], 1b \n\t"
910923
911 "dsrl %[ftmp9], %[ftmp8], %[ftmp11] \n\t"
924 "ssrld %[ftmp9], %[ftmp8], %[ftmp11] \n\t"
912925 "paddw %[ftmp9], %[ftmp9], %[ftmp8] \n\t"
913926 "swc1 %[ftmp9], 0x00(%[sse]) \n\t"
914927 : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),
924937 [high]"r"(&high), [sse]"r"(sse)
925938 : "memory"
926939 );
940 /* clang-format on */
927941
928942 return *sse;
929943 }
946960
947961 *sse = 0;
948962
963 /* clang-format off */
949964 __asm__ volatile (
950965 "li %[tmp0], 0x20 \n\t"
951966 "mtc1 %[tmp0], %[ftmp11] \n\t"
952967 MMI_L(%[tmp0], %[high], 0x00)
953 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
954 "xor %[ftmp8], %[ftmp8], %[ftmp8] \n\t"
968 "pxor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
969 "pxor %[ftmp8], %[ftmp8], %[ftmp8] \n\t"
955970
956971 "1: \n\t"
957972 VARIANCE_SSE_8
961976 MMI_ADDU(%[ref_ptr], %[ref_ptr], %[ref_stride])
962977 "bnez %[tmp0], 1b \n\t"
963978
964 "dsrl %[ftmp9], %[ftmp8], %[ftmp11] \n\t"
979 "ssrld %[ftmp9], %[ftmp8], %[ftmp11] \n\t"
965980 "paddw %[ftmp9], %[ftmp9], %[ftmp8] \n\t"
966981 "swc1 %[ftmp9], 0x00(%[sse]) \n\t"
967982 : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),
977992 [high]"r"(&high), [sse]"r"(sse)
978993 : "memory"
979994 );
995 /* clang-format on */
980996
981997 return *sse;
982998 }
10201036 uint8_t *temp2_ptr = temp2;
10211037 mips_reg l_counter = counter;
10221038 double ftmp[15];
1039 double ff_ph_40, mask;
1040 double filter_x0, filter_x1, filter_y0, filter_y1;
10231041 mips_reg tmp[2];
1024 DECLARE_ALIGNED(8, const uint64_t, ff_ph_40) = { 0x0040004000400040ULL };
1025 DECLARE_ALIGNED(8, const uint64_t, mask) = { 0x00ff00ff00ff00ffULL };
1042 uint64_t x0, x1, y0, y1, all;
10261043
10271044 const uint8_t *filter_x = bilinear_filters[x_offset];
10281045 const uint8_t *filter_y = bilinear_filters[y_offset];
1029
1046 x0 = (uint64_t)filter_x[0];
1047 x1 = (uint64_t)filter_x[1];
1048 y0 = (uint64_t)filter_y[0];
1049 y1 = (uint64_t)filter_y[1];
1050 all = x0 | x1 << 8 | y0 << 16 | y1 << 24;
1051
1052 /* clang-format off */
10301053 __asm__ volatile (
1031 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
1054 "pxor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
1055 MMI_MTC1(%[all], %[ftmp14])
1056 "punpcklbh %[ftmp14], %[ftmp14], %[ftmp0] \n\t"
1057 "pshufh %[filter_x0], %[ftmp14], %[ftmp0] \n\t"
1058 MMI_LI(%[tmp0], 0x10)
1059 MMI_MTC1(%[tmp0], %[mask])
1060 "ssrld %[ftmp14], %[ftmp14], %[mask] \n\t"
1061 "pshufh %[filter_x1], %[ftmp14], %[ftmp0] \n\t"
1062 "ssrld %[ftmp14], %[ftmp14], %[mask] \n\t"
1063 "pshufh %[filter_y0], %[ftmp14], %[ftmp0] \n\t"
1064 "ssrld %[ftmp14], %[ftmp14], %[mask] \n\t"
1065 "pshufh %[filter_y1], %[ftmp14], %[ftmp0] \n\t"
10321066 MMI_LI(%[tmp0], 0x07)
10331067 MMI_MTC1(%[tmp0], %[ftmp14])
1034 "pshufh %[filter_x0], %[filter_x0], %[ftmp0] \n\t"
1035 "pshufh %[filter_x1], %[filter_x1], %[ftmp0] \n\t"
1036 "pshufh %[filter_y0], %[filter_y0], %[ftmp0] \n\t"
1037 "pshufh %[filter_y1], %[filter_y1], %[ftmp0] \n\t"
1038
1068 MMI_LI(%[tmp0], 0x0040004000400040)
1069 MMI_MTC1(%[tmp0], %[ff_ph_40])
1070 MMI_LI(%[tmp0], 0x00ff00ff00ff00ff)
1071 MMI_MTC1(%[tmp0], %[mask])
10391072 // fdata3: fdata3[0] ~ fdata3[15]
10401073 VAR_FILTER_BLOCK2D_BIL_FIRST_PASS_16_A
10411074
10711104 [ftmp11] "=&f"(ftmp[11]), [ftmp12] "=&f"(ftmp[12]),
10721105 [ftmp13] "=&f"(ftmp[13]), [ftmp14] "=&f"(ftmp[14]),
10731106 [tmp0] "=&r"(tmp[0]), [src_ptr] "+&r"(src_ptr), [temp2_ptr] "+&r"(temp2_ptr),
1074 [counter]"+&r"(l_counter)
1075 : [filter_x0] "f"((uint64_t)filter_x[0]),
1076 [filter_x1] "f"((uint64_t)filter_x[1]),
1077 [filter_y0] "f"((uint64_t)filter_y[0]),
1078 [filter_y1] "f"((uint64_t)filter_y[1]),
1079 [src_stride] "r"((mips_reg)src_stride), [ff_ph_40] "f"(ff_ph_40),
1080 [mask] "f"(mask)
1107 [counter]"+&r"(l_counter), [ff_ph_40] "=&f"(ff_ph_40), [mask] "=&f"(mask),
1108 [filter_x0] "=&f"(filter_x0), [filter_x1] "=&f"(filter_x1),
1109 [filter_y0] "=&f"(filter_y0), [filter_y1] "=&f"(filter_y1)
1110 : [src_stride] "r"((mips_reg)src_stride), [all] "r"(all)
10811111 : "memory"
10821112 );
1113 /* clang-format on */
10831114 }
10841115
10851116 #define SUBPIX_VAR16XN(H) \
11041135 mips_reg l_counter = counter;
11051136 double ftmp[15];
11061137 mips_reg tmp[2];
1107 DECLARE_ALIGNED(8, const uint64_t, ff_ph_40) = { 0x0040004000400040ULL };
1108 DECLARE_ALIGNED(8, const uint64_t, mask) = { 0x00ff00ff00ff00ffULL };
1138 double ff_ph_40, mask;
1139 uint64_t x0, x1, y0, y1, all;
1140 double filter_x0, filter_x1, filter_y0, filter_y1;
11091141 const uint8_t *filter_x = bilinear_filters[x_offset];
11101142 const uint8_t *filter_y = bilinear_filters[y_offset];
1111
1143 x0 = (uint64_t)filter_x[0];
1144 x1 = (uint64_t)filter_x[1];
1145 y0 = (uint64_t)filter_y[0];
1146 y1 = (uint64_t)filter_y[1];
1147 all = x0 | x1 << 8 | y0 << 16 | y1 << 24;
1148
1149 /* clang-format off */
11121150 __asm__ volatile (
1113 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
1151 "pxor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
1152 MMI_MTC1(%[all], %[ftmp14])
1153 "punpcklbh %[ftmp14], %[ftmp14], %[ftmp0] \n\t"
1154 "pshufh %[filter_x0], %[ftmp14], %[ftmp0] \n\t"
1155 MMI_LI(%[tmp0], 0x10)
1156 MMI_MTC1(%[tmp0], %[mask])
1157 "ssrld %[ftmp14], %[ftmp14], %[mask] \n\t"
1158 "pshufh %[filter_x1], %[ftmp14], %[ftmp0] \n\t"
1159 "ssrld %[ftmp14], %[ftmp14], %[mask] \n\t"
1160 "pshufh %[filter_y0], %[ftmp14], %[ftmp0] \n\t"
1161 "ssrld %[ftmp14], %[ftmp14], %[mask] \n\t"
1162 "pshufh %[filter_y1], %[ftmp14], %[ftmp0] \n\t"
1163 "pxor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
11141164 MMI_LI(%[tmp0], 0x07)
11151165 MMI_MTC1(%[tmp0], %[ftmp14])
1116 "pshufh %[filter_x0], %[filter_x0], %[ftmp0] \n\t"
1117 "pshufh %[filter_x1], %[filter_x1], %[ftmp0] \n\t"
1118 "pshufh %[filter_y0], %[filter_y0], %[ftmp0] \n\t"
1119 "pshufh %[filter_y1], %[filter_y1], %[ftmp0] \n\t"
1166 MMI_LI(%[tmp0], 0x0040004000400040)
1167 MMI_MTC1(%[tmp0], %[ff_ph_40])
1168 MMI_LI(%[tmp0], 0x00ff00ff00ff00ff)
1169 MMI_MTC1(%[tmp0], %[mask])
11201170
11211171 // fdata3: fdata3[0] ~ fdata3[7]
11221172 VAR_FILTER_BLOCK2D_BIL_FIRST_PASS_8_A
11531203 [ftmp11] "=&f"(ftmp[11]), [ftmp12] "=&f"(ftmp[12]),
11541204 [ftmp13] "=&f"(ftmp[13]), [ftmp14] "=&f"(ftmp[14]),
11551205 [tmp0] "=&r"(tmp[0]), [src_ptr] "+&r"(src_ptr), [temp2_ptr] "+&r"(temp2_ptr),
1156 [counter]"+&r"(l_counter)
1157 : [filter_x0] "f"((uint64_t)filter_x[0]),
1158 [filter_x1] "f"((uint64_t)filter_x[1]),
1159 [filter_y0] "f"((uint64_t)filter_y[0]),
1160 [filter_y1] "f"((uint64_t)filter_y[1]),
1161 [src_stride] "r"((mips_reg)src_stride), [ff_ph_40] "f"(ff_ph_40),
1162 [mask] "f"(mask)
1206 [counter]"+&r"(l_counter), [ff_ph_40] "=&f"(ff_ph_40), [mask] "=&f"(mask),
1207 [filter_x0] "=&f"(filter_x0), [filter_x1] "=&f"(filter_x1),
1208 [filter_y0] "=&f"(filter_y0), [filter_y1] "=&f"(filter_y1)
1209 : [src_stride] "r"((mips_reg)src_stride), [all] "r"(all)
11631210 : "memory"
11641211 );
1212 /* clang-format on */
11651213 }
11661214
11671215 #define SUBPIX_VAR8XN(H) \
11871235 mips_reg l_counter = counter;
11881236 double ftmp[7];
11891237 mips_reg tmp[2];
1190 DECLARE_ALIGNED(8, const uint64_t, ff_ph_40) = { 0x0040004000400040ULL };
1191 DECLARE_ALIGNED(8, const uint64_t, mask) = { 0x00ff00ff00ff00ffULL };
1238 double ff_ph_40, mask;
1239 uint64_t x0, x1, y0, y1, all;
1240 double filter_x0, filter_x1, filter_y0, filter_y1;
11921241 const uint8_t *filter_x = bilinear_filters[x_offset];
11931242 const uint8_t *filter_y = bilinear_filters[y_offset];
1194
1243 x0 = (uint64_t)filter_x[0];
1244 x1 = (uint64_t)filter_x[1];
1245 y0 = (uint64_t)filter_y[0];
1246 y1 = (uint64_t)filter_y[1];
1247 all = x0 | x1 << 8 | y0 << 16 | y1 << 24;
1248
1249 /* clang-format off */
11951250 __asm__ volatile (
1196 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
1251 "pxor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
1252 MMI_MTC1(%[all], %[ftmp6])
1253 "punpcklbh %[ftmp6], %[ftmp6], %[ftmp0] \n\t"
1254 "pshufh %[filter_x0], %[ftmp6], %[ftmp0] \n\t"
1255 MMI_LI(%[tmp0], 0x10)
1256 MMI_MTC1(%[tmp0], %[mask])
1257 "ssrld %[ftmp6], %[ftmp6], %[mask] \n\t"
1258 "pshufh %[filter_x1], %[ftmp6], %[ftmp0] \n\t"
1259 "ssrld %[ftmp6], %[ftmp6], %[mask] \n\t"
1260 "pshufh %[filter_y0], %[ftmp6], %[ftmp0] \n\t"
1261 "ssrld %[ftmp6], %[ftmp6], %[mask] \n\t"
1262 "pshufh %[filter_y1], %[ftmp6], %[ftmp0] \n\t"
1263 "pxor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
11971264 MMI_LI(%[tmp0], 0x07)
11981265 MMI_MTC1(%[tmp0], %[ftmp6])
1199 "pshufh %[filter_x0], %[filter_x0], %[ftmp0] \n\t"
1200 "pshufh %[filter_x1], %[filter_x1], %[ftmp0] \n\t"
1201 "pshufh %[filter_y0], %[filter_y0], %[ftmp0] \n\t"
1202 "pshufh %[filter_y1], %[filter_y1], %[ftmp0] \n\t"
1266 MMI_LI(%[tmp0], 0x0040004000400040)
1267 MMI_MTC1(%[tmp0], %[ff_ph_40])
1268 MMI_LI(%[tmp0], 0x00ff00ff00ff00ff)
1269 MMI_MTC1(%[tmp0], %[mask])
12031270 // fdata3: fdata3[0] ~ fdata3[3]
12041271 VAR_FILTER_BLOCK2D_BIL_FIRST_PASS_4_A
12051272
12311298 : [ftmp0] "=&f"(ftmp[0]), [ftmp1] "=&f"(ftmp[1]), [ftmp2] "=&f"(ftmp[2]),
12321299 [ftmp3] "=&f"(ftmp[3]), [ftmp4] "=&f"(ftmp[4]), [ftmp5] "=&f"(ftmp[5]),
12331300 [ftmp6] "=&f"(ftmp[6]), [tmp0] "=&r"(tmp[0]), [src_ptr] "+&r"(src_ptr),
1234 [temp2_ptr] "+&r"(temp2_ptr), [counter]"+&r"(l_counter)
1235 : [filter_x0] "f"((uint64_t)filter_x[0]),
1236 [filter_x1] "f"((uint64_t)filter_x[1]),
1237 [filter_y0] "f"((uint64_t)filter_y[0]),
1238 [filter_y1] "f"((uint64_t)filter_y[1]),
1239 [src_stride] "r"((mips_reg)src_stride), [ff_ph_40] "f"(ff_ph_40),
1240 [mask] "f"(mask)
1301 [temp2_ptr] "+&r"(temp2_ptr), [counter]"+&r"(l_counter),
1302 [ff_ph_40] "=&f"(ff_ph_40), [mask] "=&f"(mask),
1303 [filter_x0] "=&f"(filter_x0), [filter_x1] "=&f"(filter_x1),
1304 [filter_y0] "=&f"(filter_y0), [filter_y1] "=&f"(filter_y1)
1305 : [src_stride] "r"((mips_reg)src_stride), [all] "r"(all)
12411306 : "memory"
12421307 );
1308 /* clang-format on */
12431309 }
12441310
12451311 #define SUBPIX_VAR4XN(H) \
104104 /* clang-format off */
105105 __asm__ volatile(
106106 "move %[tmp1], %[width] \n\t"
107 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
107 "pxor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
108108 "gsldlc1 %[filter1], 0x03(%[filter]) \n\t"
109109 "gsldrc1 %[filter1], 0x00(%[filter]) \n\t"
110110 "gsldlc1 %[filter2], 0x0b(%[filter]) \n\t"
177177 (void)y_step_q4;
178178
179179 __asm__ volatile(
180 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
180 "pxor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
181181 "gsldlc1 %[ftmp4], 0x03(%[filter]) \n\t"
182182 "gsldrc1 %[ftmp4], 0x00(%[filter]) \n\t"
183183 "gsldlc1 %[ftmp5], 0x0b(%[filter]) \n\t"
270270
271271 __asm__ volatile(
272272 "move %[tmp1], %[width] \n\t"
273 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
273 "pxor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
274274 "gsldlc1 %[filter1], 0x03(%[filter]) \n\t"
275275 "gsldrc1 %[filter1], 0x00(%[filter]) \n\t"
276276 "gsldlc1 %[filter2], 0x0b(%[filter]) \n\t"
353353 (void)y_step_q4;
354354
355355 __asm__ volatile(
356 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
356 "pxor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
357357 "gsldlc1 %[ftmp4], 0x03(%[filter]) \n\t"
358358 "gsldrc1 %[ftmp4], 0x00(%[filter]) \n\t"
359359 "gsldlc1 %[ftmp5], 0x0b(%[filter]) \n\t"
466466
467467 __asm__ volatile(
468468 "move %[tmp1], %[width] \n\t"
469 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
469 "pxor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
470470 "li %[tmp0], 0x10001 \n\t"
471471 MMI_MTC1(%[tmp0], %[ftmp3])
472472 "punpcklhw %[ftmp3], %[ftmp3], %[ftmp3] \n\t"
3333 "ld " #reg ", " #bias "(" #addr ") \n\t"
3434
3535 #define MMI_SRL(reg1, reg2, shift) \
36 "dsrl " #reg1 ", " #reg2 ", " #shift " \n\t"
36 "ssrld " #reg1 ", " #reg2 ", " #shift " \n\t"
3737
3838 #define MMI_SLL(reg1, reg2, shift) \
3939 "dsll " #reg1 ", " #reg2 ", " #shift " \n\t"
6262 "lw " #reg ", " #bias "(" #addr ") \n\t"
6363
6464 #define MMI_SRL(reg1, reg2, shift) \
65 "srl " #reg1 ", " #reg2 ", " #shift " \n\t"
65 "ssrlw " #reg1 ", " #reg2 ", " #shift " \n\t"
6666
6767 #define MMI_SLL(reg1, reg2, shift) \
6868 "sll " #reg1 ", " #reg2 ", " #shift " \n\t"
0 /*
1 * Copyright (c) 2020 The WebM project authors. All Rights Reserved.
2 *
3 * Use of this source code is governed by a BSD-style license
4 * that can be found in the LICENSE file in the root of the source
5 * tree. An additional intellectual property rights grant can be found
6 * in the file PATENTS. All contributing project authors may
7 * be found in the AUTHORS file in the root of the source tree.
8 */
9
10 #ifndef VPX_PORTS_MIPS_H_
11 #define VPX_PORTS_MIPS_H_
12
13 #ifdef __cplusplus
14 extern "C" {
15 #endif
16
17 #define HAS_MMI 0x01
18 #define HAS_MSA 0x02
19
20 int mips_cpu_caps(void);
21
22 #ifdef __cplusplus
23 } // extern "C"
24 #endif
25
26 #endif // VPX_PORTS_MIPS_H_
0 /*
1 * Copyright (c) 2020 The WebM project authors. All Rights Reserved.
2 *
3 * Use of this source code is governed by a BSD-style license
4 * that can be found in the LICENSE file in the root of the source
5 * tree. An additional intellectual property rights grant can be found
6 * in the file PATENTS. All contributing project authors may
7 * be found in the AUTHORS file in the root of the source tree.
8 */
9 #include <stdio.h>
10 #include <string.h>
11 #include "./vpx_config.h"
12 #include "vpx_ports/mips.h"
13
14 #if CONFIG_RUNTIME_CPU_DETECT
15 #if defined(__mips__) && defined(__linux__)
16 int mips_cpu_caps(void) {
17 char cpuinfo_line[512];
18 int flag = 0x0;
19 FILE *f = fopen("/proc/cpuinfo", "r");
20 if (!f) {
21 // Assume nothing if /proc/cpuinfo is unavailable.
22 // This will occur for Chrome sandbox for Pepper or Render process.
23 return 0;
24 }
25 while (fgets(cpuinfo_line, sizeof(cpuinfo_line) - 1, f)) {
26 if (memcmp(cpuinfo_line, "cpu model", 9) == 0) {
27 // Workaround early kernel without mmi in ASEs line.
28 if (strstr(cpuinfo_line, "Loongson-3")) {
29 flag |= HAS_MMI;
30 } else if (strstr(cpuinfo_line, "Loongson-2K")) {
31 flag |= HAS_MMI | HAS_MSA;
32 }
33 }
34 if (memcmp(cpuinfo_line, "ASEs implemented", 16) == 0) {
35 if (strstr(cpuinfo_line, "loongson-mmi") &&
36 strstr(cpuinfo_line, "loongson-ext")) {
37 flag |= HAS_MMI;
38 }
39 if (strstr(cpuinfo_line, "msa")) {
40 flag |= HAS_MSA;
41 }
42 // ASEs is the last line, so we can break here.
43 break;
44 }
45 }
46 fclose(f);
47 return flag;
48 }
49 #else /* end __mips__ && __linux__ */
50 #error \
51 "--enable-runtime-cpu-detect selected, but no CPU detection method " \
52 "available for your platform. Reconfigure with --disable-runtime-cpu-detect."
53 #endif
54 #else /* end CONFIG_RUNTIME_CPU_DETECT */
55 int mips_cpu_caps(void) { return 0; }
56 #endif
4141 PORTS_SRCS-$(VPX_ARCH_PPC) += ppc_cpudetect.c
4242 PORTS_SRCS-$(VPX_ARCH_PPC) += ppc.h
4343
44 PORTS_SRCS-$(VPX_ARCH_MIPS) += mips_cpudetect.c
45 PORTS_SRCS-$(VPX_ARCH_MIPS) += mips.h
46
4447 ifeq ($(VPX_ARCH_MIPS), yes)
4548 PORTS_SRCS-yes += asmdefs_mmi.h
4649 endif
464464 static const arg_def_t row_mt =
465465 ARG_DEF(NULL, "row-mt", 1,
466466 "Enable row based non-deterministic multi-threading in VP9");
467
468 static const arg_def_t disable_loopfilter =
469 ARG_DEF(NULL, "disable-loopfilter", 1,
470 "Control Loopfilter in VP9\n"
471 "0: Loopfilter on for all frames (default)\n"
472 "1: Loopfilter off for non reference frames\n"
473 "2: Loopfilter off for all frames");
467474 #endif
468475
469476 #if CONFIG_VP9_ENCODER
494501 &max_gf_interval,
495502 &target_level,
496503 &row_mt,
504 &disable_loopfilter,
505 // NOTE: The entries above have a corresponding entry in vp9_arg_ctrl_map. The
506 // entries below do not have a corresponding entry in vp9_arg_ctrl_map. They
507 // must be listed at the end of vp9_args.
497508 #if CONFIG_VP9_HIGHBITDEPTH
498509 &bitdeptharg,
499510 &inbitdeptharg,
526537 VP9E_SET_MAX_GF_INTERVAL,
527538 VP9E_SET_TARGET_LEVEL,
528539 VP9E_SET_ROW_MT,
540 VP9E_SET_DISABLE_LOOPFILTER,
529541 0 };
530542 #endif
531543
16231635 int res = 0;
16241636
16251637 memset(&input, 0, sizeof(input));
1638 memset(&raw, 0, sizeof(raw));
16261639 exec_name = argv_[0];
16271640
16281641 /* Setup default input stream settings */
17681781 FOREACH_STREAM(show_stream_config(stream, &global, &input));
17691782
17701783 if (pass == (global.pass ? global.pass - 1 : 0)) {
1771 if (input.file_type == FILE_TYPE_Y4M)
1772 /*The Y4M reader does its own allocation.
1773 Just initialize this here to avoid problems if we never read any
1774 frames.*/
1775 memset(&raw, 0, sizeof(raw));
1776 else
1784 // The Y4M reader does its own allocation.
1785 if (input.file_type != FILE_TYPE_Y4M) {
17771786 vpx_img_alloc(&raw, input.fmt, input.width, input.height, 32);
1778
1787 }
17791788 FOREACH_STREAM(stream->rate_hist = init_rate_histogram(
17801789 &stream->config.cfg, &global.framerate));
17811790 }
1818 namespace {
1919
2020 void reset(struct WebmInputContext *const webm_ctx) {
21 if (webm_ctx->reader != NULL) {
21 if (webm_ctx->reader != nullptr) {
2222 mkvparser::MkvReader *const reader =
2323 reinterpret_cast<mkvparser::MkvReader *>(webm_ctx->reader);
2424 delete reader;
2525 }
26 if (webm_ctx->segment != NULL) {
26 if (webm_ctx->segment != nullptr) {
2727 mkvparser::Segment *const segment =
2828 reinterpret_cast<mkvparser::Segment *>(webm_ctx->segment);
2929 delete segment;
3030 }
31 if (webm_ctx->buffer != NULL) {
31 if (webm_ctx->buffer != nullptr) {
3232 delete[] webm_ctx->buffer;
3333 }
34 webm_ctx->reader = NULL;
35 webm_ctx->segment = NULL;
36 webm_ctx->buffer = NULL;
37 webm_ctx->cluster = NULL;
38 webm_ctx->block_entry = NULL;
39 webm_ctx->block = NULL;
34 webm_ctx->reader = nullptr;
35 webm_ctx->segment = nullptr;
36 webm_ctx->buffer = nullptr;
37 webm_ctx->cluster = nullptr;
38 webm_ctx->block_entry = nullptr;
39 webm_ctx->block = nullptr;
4040 webm_ctx->block_frame_index = 0;
4141 webm_ctx->video_track_index = 0;
4242 webm_ctx->timestamp_ns = 0;
8383 }
8484
8585 const mkvparser::Tracks *const tracks = segment->GetTracks();
86 const mkvparser::VideoTrack *video_track = NULL;
86 const mkvparser::VideoTrack *video_track = nullptr;
8787 for (unsigned long i = 0; i < tracks->GetTracksCount(); ++i) {
8888 const mkvparser::Track *const track = tracks->GetTrackByIndex(i);
8989 if (track->GetType() == mkvparser::Track::kVideo) {
9393 }
9494 }
9595
96 if (video_track == NULL || video_track->GetCodecId() == NULL) {
96 if (video_track == nullptr || video_track->GetCodecId() == nullptr) {
9797 rewind_and_reset(webm_ctx, vpx_ctx);
9898 return 0;
9999 }
136136 do {
137137 long status = 0;
138138 bool get_new_block = false;
139 if (block_entry == NULL && !block_entry_eos) {
139 if (block_entry == nullptr && !block_entry_eos) {
140140 status = cluster->GetFirst(block_entry);
141141 get_new_block = true;
142142 } else if (block_entry_eos || block_entry->EOS()) {
143143 cluster = segment->GetNext(cluster);
144 if (cluster == NULL || cluster->EOS()) {
144 if (cluster == nullptr || cluster->EOS()) {
145145 *buffer_size = 0;
146146 webm_ctx->reached_eos = 1;
147147 return 1;
149149 status = cluster->GetFirst(block_entry);
150150 block_entry_eos = false;
151151 get_new_block = true;
152 } else if (block == NULL ||
152 } else if (block == nullptr ||
153153 webm_ctx->block_frame_index == block->GetFrameCount() ||
154154 block->GetTrackNumber() != webm_ctx->video_track_index) {
155155 status = cluster->GetNext(block_entry, block_entry);
156 if (block_entry == NULL || block_entry->EOS()) {
156 if (block_entry == nullptr || block_entry->EOS()) {
157157 block_entry_eos = true;
158158 continue;
159159 }
160160 get_new_block = true;
161161 }
162 if (status || block_entry == NULL) {
162 if (status || block_entry == nullptr) {
163163 return -1;
164164 }
165165 if (get_new_block) {
166166 block = block_entry->GetBlock();
167 if (block == NULL) return -1;
167 if (block == nullptr) return -1;
168168 webm_ctx->block_frame_index = 0;
169169 }
170170 } while (block_entry_eos ||
180180 if (frame.len > static_cast<long>(*buffer_size)) {
181181 delete[] * buffer;
182182 *buffer = new uint8_t[frame.len];
183 if (*buffer == NULL) {
183 if (*buffer == nullptr) {
184184 return -1;
185185 }
186186 webm_ctx->buffer = *buffer;
197197 int webm_guess_framerate(struct WebmInputContext *webm_ctx,
198198 struct VpxInputContext *vpx_ctx) {
199199 uint32_t i = 0;
200 uint8_t *buffer = NULL;
200 uint8_t *buffer = nullptr;
201201 size_t buffer_size = 0;
202202 while (webm_ctx->timestamp_ns < 1000000000 && i < 50) {
203203 if (webm_read_frame(webm_ctx, &buffer, &buffer_size)) {
211211 delete[] buffer;
212212
213213 get_first_cluster(webm_ctx);
214 webm_ctx->block = NULL;
215 webm_ctx->block_entry = NULL;
214 webm_ctx->block = nullptr;
215 webm_ctx->block_entry = nullptr;
216216 webm_ctx->block_frame_index = 0;
217217 webm_ctx->timestamp_ns = 0;
218218 webm_ctx->reached_eos = 0;
8989 segment->Finalize();
9090 delete segment;
9191 delete writer;
92 webm_ctx->writer = NULL;
93 webm_ctx->segment = NULL;
92 webm_ctx->writer = nullptr;
93 webm_ctx->segment = nullptr;
9494 }
99 * Based on code from the OggTheora software codec source code,
1010 * Copyright (C) 2002-2010 The Xiph.Org Foundation and contributors.
1111 */
12 #include <assert.h>
1213 #include <errno.h>
1314 #include <stdlib.h>
1415 #include <string.h>
5051 }
5152
5253 static int y4m_parse_tags(y4m_input *_y4m, char *_tags) {
53 int got_w;
54 int got_h;
55 int got_fps;
56 int got_interlace;
57 int got_par;
58 int got_chroma;
5954 char *p;
6055 char *q;
61 got_w = got_h = got_fps = got_interlace = got_par = got_chroma = 0;
6256 for (p = _tags;; p = q) {
6357 /*Skip any leading spaces.*/
6458 while (*p == ' ') p++;
7165 switch (p[0]) {
7266 case 'W': {
7367 if (sscanf(p + 1, "%d", &_y4m->pic_w) != 1) return -1;
74 got_w = 1;
7568 break;
7669 }
7770 case 'H': {
7871 if (sscanf(p + 1, "%d", &_y4m->pic_h) != 1) return -1;
79 got_h = 1;
8072 break;
8173 }
8274 case 'F': {
8375 if (sscanf(p + 1, "%d:%d", &_y4m->fps_n, &_y4m->fps_d) != 2) {
8476 return -1;
8577 }
86 got_fps = 1;
8778 break;
8879 }
8980 case 'I': {
9081 _y4m->interlace = p[1];
91 got_interlace = 1;
9282 break;
9383 }
9484 case 'A': {
9585 if (sscanf(p + 1, "%d:%d", &_y4m->par_n, &_y4m->par_d) != 2) {
9686 return -1;
9787 }
98 got_par = 1;
9988 break;
10089 }
10190 case 'C': {
10291 if (q - p > 16) return -1;
10392 memcpy(_y4m->chroma_type, p + 1, q - p - 1);
10493 _y4m->chroma_type[q - p - 1] = '\0';
105 got_chroma = 1;
10694 break;
10795 }
10896 /*Ignore unknown tags.*/
10997 }
11098 }
111 if (!got_w || !got_h || !got_fps) return -1;
112 if (!got_interlace) _y4m->interlace = '?';
113 if (!got_par) _y4m->par_n = _y4m->par_d = 0;
114 /*Chroma-type is not specified in older files, e.g., those generated by
115 mplayer.*/
116 if (!got_chroma) strcpy(_y4m->chroma_type, "420");
11799 return 0;
100 }
101
102 // Copy a single tag into the buffer, along with a null character.
103 // Returns 0 if any file IO errors occur.
104 static int copy_tag(char *buf, size_t buf_len, char *end_tag, FILE *file) {
105 size_t i;
106 assert(buf_len >= 1);
107 // Skip leading space characters.
108 do {
109 if (!file_read(buf, 1, file)) {
110 return 0;
111 }
112 } while (buf[0] == ' ');
113
114 // If we hit the newline, treat this as the "empty" tag.
115 if (buf[0] == '\n') {
116 buf[0] = '\0';
117 *end_tag = '\n';
118 return 1;
119 }
120
121 // Copy over characters until a space is hit, or the buffer is exhausted.
122 for (i = 1; i < buf_len; ++i) {
123 if (!file_read(buf + i, 1, file)) {
124 return 0;
125 }
126 if (buf[i] == ' ' || buf[i] == '\n') {
127 break;
128 }
129 }
130 if (i == buf_len) {
131 fprintf(stderr, "Error: Y4M header tags must be less than %lu characters\n",
132 (unsigned long)i);
133 return 0;
134 }
135 *end_tag = buf[i];
136 buf[i] = '\0';
137 return 1;
138 }
139
140 /* Returns 1 if tags were parsed successfully, 0 otherwise. */
141 static int parse_tags(y4m_input *y4m_ctx, FILE *file) {
142 char tag[256];
143 char end; /* Character denoting the end of the tag, ' ' or '\n'. */
144 /* Set Y4M tags to defaults, updating them as processing occurs. Mandatory
145 fields are marked with -1 and will be checked after the tags are parsed. */
146 y4m_ctx->pic_w = -1;
147 y4m_ctx->pic_h = -1;
148 y4m_ctx->fps_n = -1; /* Also serves as marker for fps_d */
149 y4m_ctx->par_n = 0;
150 y4m_ctx->par_d = 0;
151 y4m_ctx->interlace = '?';
152 snprintf(y4m_ctx->chroma_type, sizeof(y4m_ctx->chroma_type), "420");
153
154 /* Find one tag at a time. */
155 do {
156 if (!copy_tag(tag, sizeof(tag), &end, file)) {
157 return 0;
158 }
159 /* y4m_parse_tags returns 0 on success. */
160 if (y4m_parse_tags(y4m_ctx, tag)) {
161 return 0;
162 }
163 } while (end != '\n');
164
165 /* Check the mandatory fields. */
166 if (y4m_ctx->pic_w == -1) {
167 fprintf(stderr, "Width field missing\n");
168 return 0;
169 }
170 if (y4m_ctx->pic_h == -1) {
171 fprintf(stderr, "Height field missing\n");
172 return 0;
173 }
174 if (y4m_ctx->fps_n == -1) {
175 fprintf(stderr, "FPS field missing\n");
176 return 0;
177 }
178 return 1;
118179 }
119180
120181 /*All anti-aliasing filters in the following conversion functions are based on
783844 (void)_aux;
784845 }
785846
786 int y4m_input_open(y4m_input *_y4m, FILE *_fin, char *_skip, int _nskip,
787 int only_420) {
788 char buffer[80] = { 0 };
789 int ret;
790 int i;
791 /*Read until newline, or 80 cols, whichever happens first.*/
792 for (i = 0; i < 79; i++) {
793 if (_nskip > 0) {
794 buffer[i] = *_skip++;
795 _nskip--;
796 } else {
797 if (!file_read(buffer + i, 1, _fin)) return -1;
798 }
799 if (buffer[i] == '\n') break;
800 }
801 /*We skipped too much header data.*/
802 if (_nskip > 0) return -1;
803 if (i == 79) {
804 fprintf(stderr, "Error parsing header; not a YUV2MPEG2 file?\n");
847 static const char TAG[] = "YUV4MPEG2";
848
849 int y4m_input_open(y4m_input *y4m_ctx, FILE *file, char *skip_buffer,
850 int num_skip, int only_420) {
851 // File must start with |TAG|.
852 char tag_buffer[9]; // 9 == strlen(TAG)
853 // Read as much as possible from |skip_buffer|, which were characters
854 // that were previously read from the file to do input-type detection.
855 assert(num_skip >= 0 && num_skip <= 8);
856 if (num_skip > 0) {
857 memcpy(tag_buffer, skip_buffer, num_skip);
858 }
859 // Start reading from the file now that the |skip_buffer| is depleted.
860 if (!file_read(tag_buffer + num_skip, 9 - num_skip, file)) {
805861 return -1;
806862 }
807 buffer[i] = '\0';
808 if (memcmp(buffer, "YUV4MPEG", 8)) {
809 fprintf(stderr, "Incomplete magic for YUV4MPEG file.\n");
863 if (memcmp(TAG, tag_buffer, 9) != 0) {
864 fprintf(stderr, "Error parsing header: must start with %s\n", TAG);
810865 return -1;
811866 }
812 if (buffer[8] != '2') {
813 fprintf(stderr, "Incorrect YUV input file version; YUV4MPEG2 required.\n");
814 }
815 ret = y4m_parse_tags(_y4m, buffer + 5);
816 if (ret < 0) {
817 fprintf(stderr, "Error parsing YUV4MPEG2 header.\n");
818 return ret;
819 }
820 if (_y4m->interlace == '?') {
867 // Next character must be a space.
868 if (!file_read(tag_buffer, 1, file) || tag_buffer[0] != ' ') {
869 fprintf(stderr, "Error parsing header: space must follow %s\n", TAG);
870 return -1;
871 }
872 if (!parse_tags(y4m_ctx, file)) {
873 fprintf(stderr, "Error parsing %s header.\n", TAG);
874 }
875 if (y4m_ctx->interlace == '?') {
821876 fprintf(stderr,
822877 "Warning: Input video interlacing format unknown; "
823878 "assuming progressive scan.\n");
824 } else if (_y4m->interlace != 'p') {
879 } else if (y4m_ctx->interlace != 'p') {
825880 fprintf(stderr,
826881 "Input video is interlaced; "
827882 "Only progressive scan handled.\n");
828883 return -1;
829884 }
830 _y4m->vpx_fmt = VPX_IMG_FMT_I420;
831 _y4m->bps = 12;
832 _y4m->bit_depth = 8;
833 if (strcmp(_y4m->chroma_type, "420") == 0 ||
834 strcmp(_y4m->chroma_type, "420jpeg") == 0) {
835 _y4m->src_c_dec_h = _y4m->dst_c_dec_h = _y4m->src_c_dec_v =
836 _y4m->dst_c_dec_v = 2;
837 _y4m->dst_buf_read_sz =
838 _y4m->pic_w * _y4m->pic_h +
839 2 * ((_y4m->pic_w + 1) / 2) * ((_y4m->pic_h + 1) / 2);
885 y4m_ctx->vpx_fmt = VPX_IMG_FMT_I420;
886 y4m_ctx->bps = 12;
887 y4m_ctx->bit_depth = 8;
888 y4m_ctx->aux_buf = NULL;
889 y4m_ctx->dst_buf = NULL;
890 if (strcmp(y4m_ctx->chroma_type, "420") == 0 ||
891 strcmp(y4m_ctx->chroma_type, "420jpeg") == 0) {
892 y4m_ctx->src_c_dec_h = y4m_ctx->dst_c_dec_h = y4m_ctx->src_c_dec_v =
893 y4m_ctx->dst_c_dec_v = 2;
894 y4m_ctx->dst_buf_read_sz =
895 y4m_ctx->pic_w * y4m_ctx->pic_h +
896 2 * ((y4m_ctx->pic_w + 1) / 2) * ((y4m_ctx->pic_h + 1) / 2);
840897 /* Natively supported: no conversion required. */
841 _y4m->aux_buf_sz = _y4m->aux_buf_read_sz = 0;
842 _y4m->convert = y4m_convert_null;
843 } else if (strcmp(_y4m->chroma_type, "420p10") == 0) {
844 _y4m->src_c_dec_h = 2;
845 _y4m->dst_c_dec_h = 2;
846 _y4m->src_c_dec_v = 2;
847 _y4m->dst_c_dec_v = 2;
848 _y4m->dst_buf_read_sz =
849 2 * (_y4m->pic_w * _y4m->pic_h +
850 2 * ((_y4m->pic_w + 1) / 2) * ((_y4m->pic_h + 1) / 2));
898 y4m_ctx->aux_buf_sz = y4m_ctx->aux_buf_read_sz = 0;
899 y4m_ctx->convert = y4m_convert_null;
900 } else if (strcmp(y4m_ctx->chroma_type, "420p10") == 0) {
901 y4m_ctx->src_c_dec_h = 2;
902 y4m_ctx->dst_c_dec_h = 2;
903 y4m_ctx->src_c_dec_v = 2;
904 y4m_ctx->dst_c_dec_v = 2;
905 y4m_ctx->dst_buf_read_sz =
906 2 * (y4m_ctx->pic_w * y4m_ctx->pic_h +
907 2 * ((y4m_ctx->pic_w + 1) / 2) * ((y4m_ctx->pic_h + 1) / 2));
851908 /* Natively supported: no conversion required. */
852 _y4m->aux_buf_sz = _y4m->aux_buf_read_sz = 0;
853 _y4m->convert = y4m_convert_null;
854 _y4m->bit_depth = 10;
855 _y4m->bps = 15;
856 _y4m->vpx_fmt = VPX_IMG_FMT_I42016;
909 y4m_ctx->aux_buf_sz = y4m_ctx->aux_buf_read_sz = 0;
910 y4m_ctx->convert = y4m_convert_null;
911 y4m_ctx->bit_depth = 10;
912 y4m_ctx->bps = 15;
913 y4m_ctx->vpx_fmt = VPX_IMG_FMT_I42016;
857914 if (only_420) {
858915 fprintf(stderr, "Unsupported conversion from 420p10 to 420jpeg\n");
859916 return -1;
860917 }
861 } else if (strcmp(_y4m->chroma_type, "420p12") == 0) {
862 _y4m->src_c_dec_h = 2;
863 _y4m->dst_c_dec_h = 2;
864 _y4m->src_c_dec_v = 2;
865 _y4m->dst_c_dec_v = 2;
866 _y4m->dst_buf_read_sz =
867 2 * (_y4m->pic_w * _y4m->pic_h +
868 2 * ((_y4m->pic_w + 1) / 2) * ((_y4m->pic_h + 1) / 2));
918 } else if (strcmp(y4m_ctx->chroma_type, "420p12") == 0) {
919 y4m_ctx->src_c_dec_h = 2;
920 y4m_ctx->dst_c_dec_h = 2;
921 y4m_ctx->src_c_dec_v = 2;
922 y4m_ctx->dst_c_dec_v = 2;
923 y4m_ctx->dst_buf_read_sz =
924 2 * (y4m_ctx->pic_w * y4m_ctx->pic_h +
925 2 * ((y4m_ctx->pic_w + 1) / 2) * ((y4m_ctx->pic_h + 1) / 2));
869926 /* Natively supported: no conversion required. */
870 _y4m->aux_buf_sz = _y4m->aux_buf_read_sz = 0;
871 _y4m->convert = y4m_convert_null;
872 _y4m->bit_depth = 12;
873 _y4m->bps = 18;
874 _y4m->vpx_fmt = VPX_IMG_FMT_I42016;
927 y4m_ctx->aux_buf_sz = y4m_ctx->aux_buf_read_sz = 0;
928 y4m_ctx->convert = y4m_convert_null;
929 y4m_ctx->bit_depth = 12;
930 y4m_ctx->bps = 18;
931 y4m_ctx->vpx_fmt = VPX_IMG_FMT_I42016;
875932 if (only_420) {
876933 fprintf(stderr, "Unsupported conversion from 420p12 to 420jpeg\n");
877934 return -1;
878935 }
879 } else if (strcmp(_y4m->chroma_type, "420mpeg2") == 0) {
880 _y4m->src_c_dec_h = _y4m->dst_c_dec_h = _y4m->src_c_dec_v =
881 _y4m->dst_c_dec_v = 2;
882 _y4m->dst_buf_read_sz = _y4m->pic_w * _y4m->pic_h;
936 } else if (strcmp(y4m_ctx->chroma_type, "420mpeg2") == 0) {
937 y4m_ctx->src_c_dec_h = y4m_ctx->dst_c_dec_h = y4m_ctx->src_c_dec_v =
938 y4m_ctx->dst_c_dec_v = 2;
939 y4m_ctx->dst_buf_read_sz = y4m_ctx->pic_w * y4m_ctx->pic_h;
883940 /*Chroma filter required: read into the aux buf first.*/
884 _y4m->aux_buf_sz = _y4m->aux_buf_read_sz =
885 2 * ((_y4m->pic_w + 1) / 2) * ((_y4m->pic_h + 1) / 2);
886 _y4m->convert = y4m_convert_42xmpeg2_42xjpeg;
887 } else if (strcmp(_y4m->chroma_type, "420paldv") == 0) {
888 _y4m->src_c_dec_h = _y4m->dst_c_dec_h = _y4m->src_c_dec_v =
889 _y4m->dst_c_dec_v = 2;
890 _y4m->dst_buf_read_sz = _y4m->pic_w * _y4m->pic_h;
941 y4m_ctx->aux_buf_sz = y4m_ctx->aux_buf_read_sz =
942 2 * ((y4m_ctx->pic_w + 1) / 2) * ((y4m_ctx->pic_h + 1) / 2);
943 y4m_ctx->convert = y4m_convert_42xmpeg2_42xjpeg;
944 } else if (strcmp(y4m_ctx->chroma_type, "420paldv") == 0) {
945 y4m_ctx->src_c_dec_h = y4m_ctx->dst_c_dec_h = y4m_ctx->src_c_dec_v =
946 y4m_ctx->dst_c_dec_v = 2;
947 y4m_ctx->dst_buf_read_sz = y4m_ctx->pic_w * y4m_ctx->pic_h;
891948 /*Chroma filter required: read into the aux buf first.
892949 We need to make two filter passes, so we need some extra space in the
893950 aux buffer.*/
894 _y4m->aux_buf_sz = 3 * ((_y4m->pic_w + 1) / 2) * ((_y4m->pic_h + 1) / 2);
895 _y4m->aux_buf_read_sz =
896 2 * ((_y4m->pic_w + 1) / 2) * ((_y4m->pic_h + 1) / 2);
897 _y4m->convert = y4m_convert_42xpaldv_42xjpeg;
898 } else if (strcmp(_y4m->chroma_type, "422jpeg") == 0) {
899 _y4m->src_c_dec_h = _y4m->dst_c_dec_h = 2;
900 _y4m->src_c_dec_v = 1;
901 _y4m->dst_c_dec_v = 2;
902 _y4m->dst_buf_read_sz = _y4m->pic_w * _y4m->pic_h;
951 y4m_ctx->aux_buf_sz =
952 3 * ((y4m_ctx->pic_w + 1) / 2) * ((y4m_ctx->pic_h + 1) / 2);
953 y4m_ctx->aux_buf_read_sz =
954 2 * ((y4m_ctx->pic_w + 1) / 2) * ((y4m_ctx->pic_h + 1) / 2);
955 y4m_ctx->convert = y4m_convert_42xpaldv_42xjpeg;
956 } else if (strcmp(y4m_ctx->chroma_type, "422jpeg") == 0) {
957 y4m_ctx->src_c_dec_h = y4m_ctx->dst_c_dec_h = 2;
958 y4m_ctx->src_c_dec_v = 1;
959 y4m_ctx->dst_c_dec_v = 2;
960 y4m_ctx->dst_buf_read_sz = y4m_ctx->pic_w * y4m_ctx->pic_h;
903961 /*Chroma filter required: read into the aux buf first.*/
904 _y4m->aux_buf_sz = _y4m->aux_buf_read_sz =
905 2 * ((_y4m->pic_w + 1) / 2) * _y4m->pic_h;
906 _y4m->convert = y4m_convert_422jpeg_420jpeg;
907 } else if (strcmp(_y4m->chroma_type, "422") == 0) {
908 _y4m->src_c_dec_h = 2;
909 _y4m->src_c_dec_v = 1;
962 y4m_ctx->aux_buf_sz = y4m_ctx->aux_buf_read_sz =
963 2 * ((y4m_ctx->pic_w + 1) / 2) * y4m_ctx->pic_h;
964 y4m_ctx->convert = y4m_convert_422jpeg_420jpeg;
965 } else if (strcmp(y4m_ctx->chroma_type, "422") == 0) {
966 y4m_ctx->src_c_dec_h = 2;
967 y4m_ctx->src_c_dec_v = 1;
910968 if (only_420) {
911 _y4m->dst_c_dec_h = 2;
912 _y4m->dst_c_dec_v = 2;
913 _y4m->dst_buf_read_sz = _y4m->pic_w * _y4m->pic_h;
969 y4m_ctx->dst_c_dec_h = 2;
970 y4m_ctx->dst_c_dec_v = 2;
971 y4m_ctx->dst_buf_read_sz = y4m_ctx->pic_w * y4m_ctx->pic_h;
914972 /*Chroma filter required: read into the aux buf first.
915973 We need to make two filter passes, so we need some extra space in the
916974 aux buffer.*/
917 _y4m->aux_buf_read_sz = 2 * ((_y4m->pic_w + 1) / 2) * _y4m->pic_h;
918 _y4m->aux_buf_sz =
919 _y4m->aux_buf_read_sz + ((_y4m->pic_w + 1) / 2) * _y4m->pic_h;
920 _y4m->convert = y4m_convert_422_420jpeg;
975 y4m_ctx->aux_buf_read_sz =
976 2 * ((y4m_ctx->pic_w + 1) / 2) * y4m_ctx->pic_h;
977 y4m_ctx->aux_buf_sz = y4m_ctx->aux_buf_read_sz +
978 ((y4m_ctx->pic_w + 1) / 2) * y4m_ctx->pic_h;
979 y4m_ctx->convert = y4m_convert_422_420jpeg;
921980 } else {
922 _y4m->vpx_fmt = VPX_IMG_FMT_I422;
923 _y4m->bps = 16;
924 _y4m->dst_c_dec_h = _y4m->src_c_dec_h;
925 _y4m->dst_c_dec_v = _y4m->src_c_dec_v;
926 _y4m->dst_buf_read_sz =
927 _y4m->pic_w * _y4m->pic_h + 2 * ((_y4m->pic_w + 1) / 2) * _y4m->pic_h;
981 y4m_ctx->vpx_fmt = VPX_IMG_FMT_I422;
982 y4m_ctx->bps = 16;
983 y4m_ctx->dst_c_dec_h = y4m_ctx->src_c_dec_h;
984 y4m_ctx->dst_c_dec_v = y4m_ctx->src_c_dec_v;
985 y4m_ctx->dst_buf_read_sz =
986 y4m_ctx->pic_w * y4m_ctx->pic_h +
987 2 * ((y4m_ctx->pic_w + 1) / 2) * y4m_ctx->pic_h;
928988 /*Natively supported: no conversion required.*/
929 _y4m->aux_buf_sz = _y4m->aux_buf_read_sz = 0;
930 _y4m->convert = y4m_convert_null;
931 }
932 } else if (strcmp(_y4m->chroma_type, "422p10") == 0) {
933 _y4m->src_c_dec_h = 2;
934 _y4m->src_c_dec_v = 1;
935 _y4m->vpx_fmt = VPX_IMG_FMT_I42216;
936 _y4m->bps = 20;
937 _y4m->bit_depth = 10;
938 _y4m->dst_c_dec_h = _y4m->src_c_dec_h;
939 _y4m->dst_c_dec_v = _y4m->src_c_dec_v;
940 _y4m->dst_buf_read_sz = 2 * (_y4m->pic_w * _y4m->pic_h +
941 2 * ((_y4m->pic_w + 1) / 2) * _y4m->pic_h);
942 _y4m->aux_buf_sz = _y4m->aux_buf_read_sz = 0;
943 _y4m->convert = y4m_convert_null;
989 y4m_ctx->aux_buf_sz = y4m_ctx->aux_buf_read_sz = 0;
990 y4m_ctx->convert = y4m_convert_null;
991 }
992 } else if (strcmp(y4m_ctx->chroma_type, "422p10") == 0) {
993 y4m_ctx->src_c_dec_h = 2;
994 y4m_ctx->src_c_dec_v = 1;
995 y4m_ctx->vpx_fmt = VPX_IMG_FMT_I42216;
996 y4m_ctx->bps = 20;
997 y4m_ctx->bit_depth = 10;
998 y4m_ctx->dst_c_dec_h = y4m_ctx->src_c_dec_h;
999 y4m_ctx->dst_c_dec_v = y4m_ctx->src_c_dec_v;
1000 y4m_ctx->dst_buf_read_sz =
1001 2 * (y4m_ctx->pic_w * y4m_ctx->pic_h +
1002 2 * ((y4m_ctx->pic_w + 1) / 2) * y4m_ctx->pic_h);
1003 y4m_ctx->aux_buf_sz = y4m_ctx->aux_buf_read_sz = 0;
1004 y4m_ctx->convert = y4m_convert_null;
9441005 if (only_420) {
9451006 fprintf(stderr, "Unsupported conversion from 422p10 to 420jpeg\n");
9461007 return -1;
9471008 }
948 } else if (strcmp(_y4m->chroma_type, "422p12") == 0) {
949 _y4m->src_c_dec_h = 2;
950 _y4m->src_c_dec_v = 1;
951 _y4m->vpx_fmt = VPX_IMG_FMT_I42216;
952 _y4m->bps = 24;
953 _y4m->bit_depth = 12;
954 _y4m->dst_c_dec_h = _y4m->src_c_dec_h;
955 _y4m->dst_c_dec_v = _y4m->src_c_dec_v;
956 _y4m->dst_buf_read_sz = 2 * (_y4m->pic_w * _y4m->pic_h +
957 2 * ((_y4m->pic_w + 1) / 2) * _y4m->pic_h);
958 _y4m->aux_buf_sz = _y4m->aux_buf_read_sz = 0;
959 _y4m->convert = y4m_convert_null;
1009 } else if (strcmp(y4m_ctx->chroma_type, "422p12") == 0) {
1010 y4m_ctx->src_c_dec_h = 2;
1011 y4m_ctx->src_c_dec_v = 1;
1012 y4m_ctx->vpx_fmt = VPX_IMG_FMT_I42216;
1013 y4m_ctx->bps = 24;
1014 y4m_ctx->bit_depth = 12;
1015 y4m_ctx->dst_c_dec_h = y4m_ctx->src_c_dec_h;
1016 y4m_ctx->dst_c_dec_v = y4m_ctx->src_c_dec_v;
1017 y4m_ctx->dst_buf_read_sz =
1018 2 * (y4m_ctx->pic_w * y4m_ctx->pic_h +
1019 2 * ((y4m_ctx->pic_w + 1) / 2) * y4m_ctx->pic_h);
1020 y4m_ctx->aux_buf_sz = y4m_ctx->aux_buf_read_sz = 0;
1021 y4m_ctx->convert = y4m_convert_null;
9601022 if (only_420) {
9611023 fprintf(stderr, "Unsupported conversion from 422p12 to 420jpeg\n");
9621024 return -1;
9631025 }
964 } else if (strcmp(_y4m->chroma_type, "411") == 0) {
965 _y4m->src_c_dec_h = 4;
966 _y4m->dst_c_dec_h = 2;
967 _y4m->src_c_dec_v = 1;
968 _y4m->dst_c_dec_v = 2;
969 _y4m->dst_buf_read_sz = _y4m->pic_w * _y4m->pic_h;
1026 } else if (strcmp(y4m_ctx->chroma_type, "411") == 0) {
1027 y4m_ctx->src_c_dec_h = 4;
1028 y4m_ctx->dst_c_dec_h = 2;
1029 y4m_ctx->src_c_dec_v = 1;
1030 y4m_ctx->dst_c_dec_v = 2;
1031 y4m_ctx->dst_buf_read_sz = y4m_ctx->pic_w * y4m_ctx->pic_h;
9701032 /*Chroma filter required: read into the aux buf first.
9711033 We need to make two filter passes, so we need some extra space in the
9721034 aux buffer.*/
973 _y4m->aux_buf_read_sz = 2 * ((_y4m->pic_w + 3) / 4) * _y4m->pic_h;
974 _y4m->aux_buf_sz =
975 _y4m->aux_buf_read_sz + ((_y4m->pic_w + 1) / 2) * _y4m->pic_h;
976 _y4m->convert = y4m_convert_411_420jpeg;
1035 y4m_ctx->aux_buf_read_sz = 2 * ((y4m_ctx->pic_w + 3) / 4) * y4m_ctx->pic_h;
1036 y4m_ctx->aux_buf_sz =
1037 y4m_ctx->aux_buf_read_sz + ((y4m_ctx->pic_w + 1) / 2) * y4m_ctx->pic_h;
1038 y4m_ctx->convert = y4m_convert_411_420jpeg;
9771039 fprintf(stderr, "Unsupported conversion from yuv 411\n");
9781040 return -1;
979 } else if (strcmp(_y4m->chroma_type, "444") == 0) {
980 _y4m->src_c_dec_h = 1;
981 _y4m->src_c_dec_v = 1;
1041 } else if (strcmp(y4m_ctx->chroma_type, "444") == 0) {
1042 y4m_ctx->src_c_dec_h = 1;
1043 y4m_ctx->src_c_dec_v = 1;
9821044 if (only_420) {
983 _y4m->dst_c_dec_h = 2;
984 _y4m->dst_c_dec_v = 2;
985 _y4m->dst_buf_read_sz = _y4m->pic_w * _y4m->pic_h;
1045 y4m_ctx->dst_c_dec_h = 2;
1046 y4m_ctx->dst_c_dec_v = 2;
1047 y4m_ctx->dst_buf_read_sz = y4m_ctx->pic_w * y4m_ctx->pic_h;
9861048 /*Chroma filter required: read into the aux buf first.
9871049 We need to make two filter passes, so we need some extra space in the
9881050 aux buffer.*/
989 _y4m->aux_buf_read_sz = 2 * _y4m->pic_w * _y4m->pic_h;
990 _y4m->aux_buf_sz =
991 _y4m->aux_buf_read_sz + ((_y4m->pic_w + 1) / 2) * _y4m->pic_h;
992 _y4m->convert = y4m_convert_444_420jpeg;
1051 y4m_ctx->aux_buf_read_sz = 2 * y4m_ctx->pic_w * y4m_ctx->pic_h;
1052 y4m_ctx->aux_buf_sz = y4m_ctx->aux_buf_read_sz +
1053 ((y4m_ctx->pic_w + 1) / 2) * y4m_ctx->pic_h;
1054 y4m_ctx->convert = y4m_convert_444_420jpeg;
9931055 } else {
994 _y4m->vpx_fmt = VPX_IMG_FMT_I444;
995 _y4m->bps = 24;
996 _y4m->dst_c_dec_h = _y4m->src_c_dec_h;
997 _y4m->dst_c_dec_v = _y4m->src_c_dec_v;
998 _y4m->dst_buf_read_sz = 3 * _y4m->pic_w * _y4m->pic_h;
1056 y4m_ctx->vpx_fmt = VPX_IMG_FMT_I444;
1057 y4m_ctx->bps = 24;
1058 y4m_ctx->dst_c_dec_h = y4m_ctx->src_c_dec_h;
1059 y4m_ctx->dst_c_dec_v = y4m_ctx->src_c_dec_v;
1060 y4m_ctx->dst_buf_read_sz = 3 * y4m_ctx->pic_w * y4m_ctx->pic_h;
9991061 /*Natively supported: no conversion required.*/
1000 _y4m->aux_buf_sz = _y4m->aux_buf_read_sz = 0;
1001 _y4m->convert = y4m_convert_null;
1002 }
1003 } else if (strcmp(_y4m->chroma_type, "444p10") == 0) {
1004 _y4m->src_c_dec_h = 1;
1005 _y4m->src_c_dec_v = 1;
1006 _y4m->vpx_fmt = VPX_IMG_FMT_I44416;
1007 _y4m->bps = 30;
1008 _y4m->bit_depth = 10;
1009 _y4m->dst_c_dec_h = _y4m->src_c_dec_h;
1010 _y4m->dst_c_dec_v = _y4m->src_c_dec_v;
1011 _y4m->dst_buf_read_sz = 2 * 3 * _y4m->pic_w * _y4m->pic_h;
1012 _y4m->aux_buf_sz = _y4m->aux_buf_read_sz = 0;
1013 _y4m->convert = y4m_convert_null;
1062 y4m_ctx->aux_buf_sz = y4m_ctx->aux_buf_read_sz = 0;
1063 y4m_ctx->convert = y4m_convert_null;
1064 }
1065 } else if (strcmp(y4m_ctx->chroma_type, "444p10") == 0) {
1066 y4m_ctx->src_c_dec_h = 1;
1067 y4m_ctx->src_c_dec_v = 1;
1068 y4m_ctx->vpx_fmt = VPX_IMG_FMT_I44416;
1069 y4m_ctx->bps = 30;
1070 y4m_ctx->bit_depth = 10;
1071 y4m_ctx->dst_c_dec_h = y4m_ctx->src_c_dec_h;
1072 y4m_ctx->dst_c_dec_v = y4m_ctx->src_c_dec_v;
1073 y4m_ctx->dst_buf_read_sz = 2 * 3 * y4m_ctx->pic_w * y4m_ctx->pic_h;
1074 y4m_ctx->aux_buf_sz = y4m_ctx->aux_buf_read_sz = 0;
1075 y4m_ctx->convert = y4m_convert_null;
10141076 if (only_420) {
10151077 fprintf(stderr, "Unsupported conversion from 444p10 to 420jpeg\n");
10161078 return -1;
10171079 }
1018 } else if (strcmp(_y4m->chroma_type, "444p12") == 0) {
1019 _y4m->src_c_dec_h = 1;
1020 _y4m->src_c_dec_v = 1;
1021 _y4m->vpx_fmt = VPX_IMG_FMT_I44416;
1022 _y4m->bps = 36;
1023 _y4m->bit_depth = 12;
1024 _y4m->dst_c_dec_h = _y4m->src_c_dec_h;
1025 _y4m->dst_c_dec_v = _y4m->src_c_dec_v;
1026 _y4m->dst_buf_read_sz = 2 * 3 * _y4m->pic_w * _y4m->pic_h;
1027 _y4m->aux_buf_sz = _y4m->aux_buf_read_sz = 0;
1028 _y4m->convert = y4m_convert_null;
1080 } else if (strcmp(y4m_ctx->chroma_type, "444p12") == 0) {
1081 y4m_ctx->src_c_dec_h = 1;
1082 y4m_ctx->src_c_dec_v = 1;
1083 y4m_ctx->vpx_fmt = VPX_IMG_FMT_I44416;
1084 y4m_ctx->bps = 36;
1085 y4m_ctx->bit_depth = 12;
1086 y4m_ctx->dst_c_dec_h = y4m_ctx->src_c_dec_h;
1087 y4m_ctx->dst_c_dec_v = y4m_ctx->src_c_dec_v;
1088 y4m_ctx->dst_buf_read_sz = 2 * 3 * y4m_ctx->pic_w * y4m_ctx->pic_h;
1089 y4m_ctx->aux_buf_sz = y4m_ctx->aux_buf_read_sz = 0;
1090 y4m_ctx->convert = y4m_convert_null;
10291091 if (only_420) {
10301092 fprintf(stderr, "Unsupported conversion from 444p12 to 420jpeg\n");
10311093 return -1;
10321094 }
1033 } else if (strcmp(_y4m->chroma_type, "mono") == 0) {
1034 _y4m->src_c_dec_h = _y4m->src_c_dec_v = 0;
1035 _y4m->dst_c_dec_h = _y4m->dst_c_dec_v = 2;
1036 _y4m->dst_buf_read_sz = _y4m->pic_w * _y4m->pic_h;
1095 } else if (strcmp(y4m_ctx->chroma_type, "mono") == 0) {
1096 y4m_ctx->src_c_dec_h = y4m_ctx->src_c_dec_v = 0;
1097 y4m_ctx->dst_c_dec_h = y4m_ctx->dst_c_dec_v = 2;
1098 y4m_ctx->dst_buf_read_sz = y4m_ctx->pic_w * y4m_ctx->pic_h;
10371099 /*No extra space required, but we need to clear the chroma planes.*/
1038 _y4m->aux_buf_sz = _y4m->aux_buf_read_sz = 0;
1039 _y4m->convert = y4m_convert_mono_420jpeg;
1100 y4m_ctx->aux_buf_sz = y4m_ctx->aux_buf_read_sz = 0;
1101 y4m_ctx->convert = y4m_convert_mono_420jpeg;
10401102 } else {
1041 fprintf(stderr, "Unknown chroma sampling type: %s\n", _y4m->chroma_type);
1103 fprintf(stderr, "Unknown chroma sampling type: %s\n", y4m_ctx->chroma_type);
10421104 return -1;
10431105 }
10441106 /*The size of the final frame buffers is always computed from the
10451107 destination chroma decimation type.*/
1046 _y4m->dst_buf_sz =
1047 _y4m->pic_w * _y4m->pic_h +
1048 2 * ((_y4m->pic_w + _y4m->dst_c_dec_h - 1) / _y4m->dst_c_dec_h) *
1049 ((_y4m->pic_h + _y4m->dst_c_dec_v - 1) / _y4m->dst_c_dec_v);
1050 if (_y4m->bit_depth == 8)
1051 _y4m->dst_buf = (unsigned char *)malloc(_y4m->dst_buf_sz);
1108 y4m_ctx->dst_buf_sz =
1109 y4m_ctx->pic_w * y4m_ctx->pic_h +
1110 2 * ((y4m_ctx->pic_w + y4m_ctx->dst_c_dec_h - 1) / y4m_ctx->dst_c_dec_h) *
1111 ((y4m_ctx->pic_h + y4m_ctx->dst_c_dec_v - 1) / y4m_ctx->dst_c_dec_v);
1112 if (y4m_ctx->bit_depth == 8)
1113 y4m_ctx->dst_buf = (unsigned char *)malloc(y4m_ctx->dst_buf_sz);
10521114 else
1053 _y4m->dst_buf = (unsigned char *)malloc(2 * _y4m->dst_buf_sz);
1054
1055 if (_y4m->aux_buf_sz > 0)
1056 _y4m->aux_buf = (unsigned char *)malloc(_y4m->aux_buf_sz);
1115 y4m_ctx->dst_buf = (unsigned char *)malloc(2 * y4m_ctx->dst_buf_sz);
1116
1117 if (y4m_ctx->aux_buf_sz > 0)
1118 y4m_ctx->aux_buf = (unsigned char *)malloc(y4m_ctx->aux_buf_sz);
10571119 return 0;
10581120 }
10591121
5555 unsigned int bit_depth;
5656 };
5757
58 int y4m_input_open(y4m_input *_y4m, FILE *_fin, char *_skip, int _nskip,
59 int only_420);
58 /**
59 * Open the input file, treating it as Y4M. |y4m_ctx| is filled in after
60 * reading it. The |skip_buffer| indicates bytes that were previously read
61 * from |file|, to do input-type detection; this buffer will be read before
62 * the |file| is read. It is of size |num_skip|, which *must* be 8 or less.
63 *
64 * Returns 0 on success, -1 on failure.
65 */
66 int y4m_input_open(y4m_input *y4m_ctx, FILE *file, char *skip_buffer,
67 int num_skip, int only_420);
6068 void y4m_input_close(y4m_input *_y4m);
6169 int y4m_input_fetch_frame(y4m_input *_y4m, FILE *_fin, vpx_image_t *img);
6270