Compare commits
	
		
			2 Commits
		
	
	
		
			v1.3.0
			...
			sandbox/hl
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					5f1b295527 | ||
| 
						 | 
					1422ce5cff | 
							
								
								
									
										17
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -1,12 +1,8 @@
 | 
				
			|||||||
*.a
 | 
					*.a
 | 
				
			||||||
*.asm.s
 | 
					*.asm.s
 | 
				
			||||||
*.d
 | 
					*.d
 | 
				
			||||||
*.gcno
 | 
					 | 
				
			||||||
*.gcda
 | 
					 | 
				
			||||||
*.o
 | 
					*.o
 | 
				
			||||||
*~
 | 
					*~
 | 
				
			||||||
/*.ivf
 | 
					 | 
				
			||||||
/*.ivf.md5
 | 
					 | 
				
			||||||
/*-*.mk
 | 
					/*-*.mk
 | 
				
			||||||
/*.asm
 | 
					/*.asm
 | 
				
			||||||
/*.doxy
 | 
					/*.doxy
 | 
				
			||||||
@@ -16,7 +12,7 @@
 | 
				
			|||||||
/.install-*
 | 
					/.install-*
 | 
				
			||||||
/.libs
 | 
					/.libs
 | 
				
			||||||
/Makefile
 | 
					/Makefile
 | 
				
			||||||
/config.log
 | 
					/config.err
 | 
				
			||||||
/config.mk
 | 
					/config.mk
 | 
				
			||||||
/decode_to_md5
 | 
					/decode_to_md5
 | 
				
			||||||
/decode_to_md5.c
 | 
					/decode_to_md5.c
 | 
				
			||||||
@@ -36,8 +32,6 @@
 | 
				
			|||||||
/ivfdec.dox
 | 
					/ivfdec.dox
 | 
				
			||||||
/ivfenc
 | 
					/ivfenc
 | 
				
			||||||
/ivfenc.dox
 | 
					/ivfenc.dox
 | 
				
			||||||
/libvpx.so*
 | 
					 | 
				
			||||||
/libvpx.ver
 | 
					 | 
				
			||||||
/obj_int_extract
 | 
					/obj_int_extract
 | 
				
			||||||
/postproc
 | 
					/postproc
 | 
				
			||||||
/postproc.c
 | 
					/postproc.c
 | 
				
			||||||
@@ -49,12 +43,12 @@
 | 
				
			|||||||
/simple_encoder
 | 
					/simple_encoder
 | 
				
			||||||
/simple_encoder.c
 | 
					/simple_encoder.c
 | 
				
			||||||
/simple_encoder.dox
 | 
					/simple_encoder.dox
 | 
				
			||||||
/test_libvpx
 | 
					 | 
				
			||||||
/twopass_encoder
 | 
					/twopass_encoder
 | 
				
			||||||
/twopass_encoder.c
 | 
					/twopass_encoder.c
 | 
				
			||||||
/twopass_encoder.dox
 | 
					/twopass_encoder.dox
 | 
				
			||||||
/vp8_api1_migration.dox
 | 
					/vp8_api1_migration.dox
 | 
				
			||||||
/vp8_scalable_patterns
 | 
					/vp8_scalable_patterns
 | 
				
			||||||
 | 
					/vp8_scalable_patterns.c
 | 
				
			||||||
/vp8_scalable_patterns.dox
 | 
					/vp8_scalable_patterns.dox
 | 
				
			||||||
/vp8_set_maps
 | 
					/vp8_set_maps
 | 
				
			||||||
/vp8_set_maps.c
 | 
					/vp8_set_maps.c
 | 
				
			||||||
@@ -62,14 +56,7 @@
 | 
				
			|||||||
/vp8cx_set_ref
 | 
					/vp8cx_set_ref
 | 
				
			||||||
/vp8cx_set_ref.c
 | 
					/vp8cx_set_ref.c
 | 
				
			||||||
/vp8cx_set_ref.dox
 | 
					/vp8cx_set_ref.dox
 | 
				
			||||||
/vpx.pc
 | 
					 | 
				
			||||||
/vpx_config.c
 | 
					/vpx_config.c
 | 
				
			||||||
/vpx_config.h
 | 
					/vpx_config.h
 | 
				
			||||||
/vpx_rtcd.h
 | 
					 | 
				
			||||||
/vpx_version.h
 | 
					/vpx_version.h
 | 
				
			||||||
/vpxdec
 | 
					 | 
				
			||||||
/vpxenc
 | 
					 | 
				
			||||||
TAGS
 | 
					TAGS
 | 
				
			||||||
.cproject
 | 
					 | 
				
			||||||
.project
 | 
					 | 
				
			||||||
.settings
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								.mailmap
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								.mailmap
									
									
									
									
									
								
							@@ -1,18 +1,2 @@
 | 
				
			|||||||
Adrian Grange <agrange@google.com>
 | 
					Adrian Grange <agrange@google.com>
 | 
				
			||||||
Alexis Ballier <aballier@gentoo.org> <alexis.ballier@gmail.com>
 | 
					 | 
				
			||||||
Hangyu Kuang <hkuang@google.com>
 | 
					 | 
				
			||||||
Jim Bankoski <jimbankoski@google.com>
 | 
					 | 
				
			||||||
John Koleszar <jkoleszar@google.com>
 | 
					 | 
				
			||||||
Johann Koenig <johannkoenig@google.com>
 | 
					Johann Koenig <johannkoenig@google.com>
 | 
				
			||||||
Johann Koenig <johannkoenig@google.com> <johann.koenig@duck.com>
 | 
					 | 
				
			||||||
Johann Koenig <johannkoenig@google.com> <johannkoenig@dhcp-172-19-7-52.mtv.corp.google.com>
 | 
					 | 
				
			||||||
Pascal Massimino <pascal.massimino@gmail.com>
 | 
					 | 
				
			||||||
Sami Pietilä <samipietila@google.com>
 | 
					 | 
				
			||||||
Tero Rintaluoma <teror@google.com> <tero.rintaluoma@on2.com>
 | 
					 | 
				
			||||||
Timothy B. Terriberry <tterribe@xiph.org> Tim Terriberry <tterriberry@mozilla.com>
 | 
					 | 
				
			||||||
Tom Finegan <tomfinegan@google.com>
 | 
					 | 
				
			||||||
Ralph Giles <giles@xiph.org> <giles@entropywave.com>
 | 
					 | 
				
			||||||
Ralph Giles <giles@xiph.org> <giles@mozilla.com>
 | 
					 | 
				
			||||||
Alpha Lam <hclam@google.com> <hclam@chromium.org>
 | 
					 | 
				
			||||||
Deb Mukherjee <debargha@google.com>
 | 
					 | 
				
			||||||
Yaowu Xu <yaowu@google.com> <yaowu@xuyaowu.com>
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										64
									
								
								AUTHORS
									
									
									
									
									
								
							
							
						
						
									
										64
									
								
								AUTHORS
									
									
									
									
									
								
							@@ -2,97 +2,33 @@
 | 
				
			|||||||
# by tools/gen_authors.sh.
 | 
					# by tools/gen_authors.sh.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Aaron Watry <awatry@gmail.com>
 | 
					Aaron Watry <awatry@gmail.com>
 | 
				
			||||||
Abo Talib Mahfoodh <ab.mahfoodh@gmail.com>
 | 
					 | 
				
			||||||
Adrian Grange <agrange@google.com>
 | 
					Adrian Grange <agrange@google.com>
 | 
				
			||||||
Ahmad Sharif <asharif@google.com>
 | 
					 | 
				
			||||||
Alexander Voronov <avoronov@graphics.cs.msu.ru>
 | 
					 | 
				
			||||||
Alex Converse <alex.converse@gmail.com>
 | 
					Alex Converse <alex.converse@gmail.com>
 | 
				
			||||||
Alexis Ballier <aballier@gentoo.org>
 | 
					 | 
				
			||||||
Alok Ahuja <waveletcoeff@gmail.com>
 | 
					 | 
				
			||||||
Alpha Lam <hclam@google.com>
 | 
					 | 
				
			||||||
A.Mahfoodh <ab.mahfoodh@gmail.com>
 | 
					 | 
				
			||||||
Ami Fischman <fischman@chromium.org>
 | 
					 | 
				
			||||||
Andoni Morales Alastruey <ylatuya@gmail.com>
 | 
					 | 
				
			||||||
Andres Mejia <mcitadel@gmail.com>
 | 
					Andres Mejia <mcitadel@gmail.com>
 | 
				
			||||||
Aron Rosenberg <arosenberg@logitech.com>
 | 
					 | 
				
			||||||
Attila Nagy <attilanagy@google.com>
 | 
					 | 
				
			||||||
changjun.yang <changjun.yang@intel.com>
 | 
					 | 
				
			||||||
chm <chm@rock-chips.com>
 | 
					 | 
				
			||||||
Christian Duvivier <cduvivier@google.com>
 | 
					 | 
				
			||||||
Daniel Kang <ddkang@google.com>
 | 
					 | 
				
			||||||
Deb Mukherjee <debargha@google.com>
 | 
					 | 
				
			||||||
Dmitry Kovalev <dkovalev@google.com>
 | 
					 | 
				
			||||||
Dragan Mrdjan <dmrdjan@mips.com>
 | 
					 | 
				
			||||||
Erik Niemeyer <erik.a.niemeyer@gmail.com>
 | 
					 | 
				
			||||||
Fabio Pedretti <fabio.ped@libero.it>
 | 
					Fabio Pedretti <fabio.ped@libero.it>
 | 
				
			||||||
Frank Galligan <fgalligan@google.com>
 | 
					Frank Galligan <fgalligan@google.com>
 | 
				
			||||||
Fredrik Söderquist <fs@opera.com>
 | 
					Fredrik Söderquist <fs@opera.com>
 | 
				
			||||||
Fritz Koenig <frkoenig@google.com>
 | 
					Fritz Koenig <frkoenig@google.com>
 | 
				
			||||||
Gaute Strokkenes <gaute.strokkenes@broadcom.com>
 | 
					 | 
				
			||||||
Giuseppe Scrivano <gscrivano@gnu.org>
 | 
					Giuseppe Scrivano <gscrivano@gnu.org>
 | 
				
			||||||
Guillaume Martres <gmartres@google.com>
 | 
					 | 
				
			||||||
Guillermo Ballester Valor <gbvalor@gmail.com>
 | 
					Guillermo Ballester Valor <gbvalor@gmail.com>
 | 
				
			||||||
Hangyu Kuang <hkuang@google.com>
 | 
					 | 
				
			||||||
Henrik Lundin <hlundin@google.com>
 | 
					 | 
				
			||||||
Hui Su <huisu@google.com>
 | 
					 | 
				
			||||||
Ivan Maltz <ivanmaltz@google.com>
 | 
					 | 
				
			||||||
James Berry <jamesberry@google.com>
 | 
					 | 
				
			||||||
James Zern <jzern@google.com>
 | 
					James Zern <jzern@google.com>
 | 
				
			||||||
Jan Kratochvil <jan.kratochvil@redhat.com>
 | 
					Jan Kratochvil <jan.kratochvil@redhat.com>
 | 
				
			||||||
Janne Salonen <jsalonen@google.com>
 | 
					 | 
				
			||||||
Jeff Faust <jfaust@google.com>
 | 
					 | 
				
			||||||
Jeff Muizelaar <jmuizelaar@mozilla.com>
 | 
					Jeff Muizelaar <jmuizelaar@mozilla.com>
 | 
				
			||||||
Jeff Petkau <jpet@chromium.org>
 | 
					 | 
				
			||||||
Jim Bankoski <jimbankoski@google.com>
 | 
					Jim Bankoski <jimbankoski@google.com>
 | 
				
			||||||
Jingning Han <jingning@google.com>
 | 
					 | 
				
			||||||
Johann Koenig <johannkoenig@google.com>
 | 
					Johann Koenig <johannkoenig@google.com>
 | 
				
			||||||
John Koleszar <jkoleszar@google.com>
 | 
					John Koleszar <jkoleszar@google.com>
 | 
				
			||||||
Joshua Bleecher Snyder <josh@treelinelabs.com>
 | 
					 | 
				
			||||||
Joshua Litt <joshualitt@google.com>
 | 
					 | 
				
			||||||
Justin Clift <justin@salasaga.org>
 | 
					Justin Clift <justin@salasaga.org>
 | 
				
			||||||
Justin Lebar <justin.lebar@gmail.com>
 | 
					Justin Lebar <justin.lebar@gmail.com>
 | 
				
			||||||
KO Myung-Hun <komh@chollian.net>
 | 
					 | 
				
			||||||
Lou Quillio <louquillio@google.com>
 | 
					 | 
				
			||||||
Luca Barbato <lu_zero@gentoo.org>
 | 
					Luca Barbato <lu_zero@gentoo.org>
 | 
				
			||||||
Makoto Kato <makoto.kt@gmail.com>
 | 
					Makoto Kato <makoto.kt@gmail.com>
 | 
				
			||||||
Mans Rullgard <mans@mansr.com>
 | 
					 | 
				
			||||||
Marco Paniconi <marpan@google.com>
 | 
					 | 
				
			||||||
Mark Mentovai <mark@chromium.org>
 | 
					 | 
				
			||||||
Martin Ettl <ettl.martin78@googlemail.com>
 | 
					Martin Ettl <ettl.martin78@googlemail.com>
 | 
				
			||||||
Martin Storsjo <martin@martin.st>
 | 
					 | 
				
			||||||
Matthew Heaney <matthewjheaney@chromium.org>
 | 
					 | 
				
			||||||
Michael Kohler <michaelkohler@live.com>
 | 
					Michael Kohler <michaelkohler@live.com>
 | 
				
			||||||
Mike Frysinger <vapier@chromium.org>
 | 
					 | 
				
			||||||
Mike Hommey <mhommey@mozilla.com>
 | 
					 | 
				
			||||||
Mikhal Shemer <mikhal@google.com>
 | 
					 | 
				
			||||||
Morton Jonuschat <yabawock@gmail.com>
 | 
					 | 
				
			||||||
Parag Salasakar <img.mips1@gmail.com>
 | 
					 | 
				
			||||||
Pascal Massimino <pascal.massimino@gmail.com>
 | 
					 | 
				
			||||||
Patrik Westin <patrik.westin@gmail.com>
 | 
					 | 
				
			||||||
Paul Wilkins <paulwilkins@google.com>
 | 
					Paul Wilkins <paulwilkins@google.com>
 | 
				
			||||||
Pavol Rusnak <stick@gk2.sk>
 | 
					Pavol Rusnak <stick@gk2.sk>
 | 
				
			||||||
Paweł Hajdan <phajdan@google.com>
 | 
					 | 
				
			||||||
Philip Jägenstedt <philipj@opera.com>
 | 
					Philip Jägenstedt <philipj@opera.com>
 | 
				
			||||||
Priit Laes <plaes@plaes.org>
 | 
					 | 
				
			||||||
Rafael Ávila de Espíndola <rafael.espindola@gmail.com>
 | 
					 | 
				
			||||||
Rafaël Carré <funman@videolan.org>
 | 
					 | 
				
			||||||
Ralph Giles <giles@xiph.org>
 | 
					 | 
				
			||||||
Rob Bradford <rob@linux.intel.com>
 | 
					 | 
				
			||||||
Ronald S. Bultje <rbultje@google.com>
 | 
					 | 
				
			||||||
Sami Pietilä <samipietila@google.com>
 | 
					 | 
				
			||||||
Scott Graham <scottmg@chromium.org>
 | 
					 | 
				
			||||||
Scott LaVarnway <slavarnway@google.com>
 | 
					Scott LaVarnway <slavarnway@google.com>
 | 
				
			||||||
Shimon Doodkin <helpmepro1@gmail.com>
 | 
					 | 
				
			||||||
Stefan Holmer <holmer@google.com>
 | 
					 | 
				
			||||||
Suman Sunkara <sunkaras@google.com>
 | 
					 | 
				
			||||||
Taekhyun Kim <takim@nvidia.com>
 | 
					 | 
				
			||||||
Takanori MATSUURA <t.matsuu@gmail.com>
 | 
					 | 
				
			||||||
Tamar Levy <tamar.levy@intel.com>
 | 
					 | 
				
			||||||
Tero Rintaluoma <teror@google.com>
 | 
					 | 
				
			||||||
Thijs Vermeir <thijsvermeir@gmail.com>
 | 
					 | 
				
			||||||
Timothy B. Terriberry <tterribe@xiph.org>
 | 
					Timothy B. Terriberry <tterribe@xiph.org>
 | 
				
			||||||
Tom Finegan <tomfinegan@google.com>
 | 
					Tom Finegan <tomfinegan@google.com>
 | 
				
			||||||
Vignesh Venkatasubramanian <vigneshv@google.com>
 | 
					 | 
				
			||||||
Yaowu Xu <yaowu@google.com>
 | 
					Yaowu Xu <yaowu@google.com>
 | 
				
			||||||
Yunqing Wang <yunqingwang@google.com>
 | 
					Yunqing Wang <yunqingwang@google.com>
 | 
				
			||||||
Google Inc.
 | 
					Google Inc.
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										408
									
								
								CHANGELOG
									
									
									
									
									
								
							
							
						
						
									
										408
									
								
								CHANGELOG
									
									
									
									
									
								
							@@ -1,411 +1,3 @@
 | 
				
			|||||||
2013-11-15 v1.3.0 "Forest"
 | 
					 | 
				
			||||||
  This release introduces the VP9 codec in a backward-compatible way.
 | 
					 | 
				
			||||||
  All existing users of VP8 can continue to use the library without
 | 
					 | 
				
			||||||
  modification. However, some VP8 options do not map to VP9 in the same manner.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  The VP9 encoder in this release is not feature complete. Users interested in
 | 
					 | 
				
			||||||
  the encoder are advised to use the git master branch and discuss issues on
 | 
					 | 
				
			||||||
  libvpx mailing lists.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  - Upgrading:
 | 
					 | 
				
			||||||
    This release is ABI and API compatible with Duclair (v1.0.0). Users
 | 
					 | 
				
			||||||
    of older releases should refer to the Upgrading notes in this document
 | 
					 | 
				
			||||||
    for that release.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  - Enhancements:
 | 
					 | 
				
			||||||
      Get rid of bashisms in the main build scripts
 | 
					 | 
				
			||||||
      Added usage info on command line options
 | 
					 | 
				
			||||||
      Add lossless compression mode
 | 
					 | 
				
			||||||
      Dll build of libvpx
 | 
					 | 
				
			||||||
      Add additional Mac OS X targets: 10.7, 10.8 and 10.9 (darwin11-13)
 | 
					 | 
				
			||||||
      Add option to disable documentation
 | 
					 | 
				
			||||||
      configure: add --enable-external-build support
 | 
					 | 
				
			||||||
      make: support V=1 as short form of verbose=yes
 | 
					 | 
				
			||||||
      configure: support mingw-w64
 | 
					 | 
				
			||||||
      configure: support hardfloat armv7 CHOSTS
 | 
					 | 
				
			||||||
      configure: add support for android x86
 | 
					 | 
				
			||||||
      Add estimated completion time to vpxenc
 | 
					 | 
				
			||||||
      Don't exit on decode errors in vpxenc
 | 
					 | 
				
			||||||
      vpxenc: support scaling prior to encoding
 | 
					 | 
				
			||||||
      vpxdec: support scaling output
 | 
					 | 
				
			||||||
      vpxenc: improve progress indicators with --skip
 | 
					 | 
				
			||||||
      msvs: Don't link to winmm.lib
 | 
					 | 
				
			||||||
      Add a new script for producing vcxproj files
 | 
					 | 
				
			||||||
      Produce Visual Studio 10 and 11 project files
 | 
					 | 
				
			||||||
      Produce Windows Phone project files
 | 
					 | 
				
			||||||
      msvs-build: use msbuild for vs >= 2005
 | 
					 | 
				
			||||||
      configure: default configure log to config.log
 | 
					 | 
				
			||||||
      Add encoding option --static-thresh
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  - Speed:
 | 
					 | 
				
			||||||
      Miscellaneous speed optimizations for VP8 and VP9.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  - Quality:
 | 
					 | 
				
			||||||
      In general, quality is consistent with the Eider release.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  - Bug Fixes:
 | 
					 | 
				
			||||||
      This release represents approximately a year of engineering effort,
 | 
					 | 
				
			||||||
      and contains multiple bug fixes. Please refer to git history for details.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
2012-12-21 v1.2.0
 | 
					 | 
				
			||||||
  This release acts as a checkpoint for a large amount of internal refactoring
 | 
					 | 
				
			||||||
  and testing. It also contains a number of small bugfixes, so all users are
 | 
					 | 
				
			||||||
  encouraged to upgrade.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  - Upgrading:
 | 
					 | 
				
			||||||
    This release is ABI and API compatible with Duclair (v1.0.0). Users
 | 
					 | 
				
			||||||
    of older releases should refer to the Upgrading notes in this
 | 
					 | 
				
			||||||
    document for that release.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  - Enhancements:
 | 
					 | 
				
			||||||
      VP8 optimizations for MIPS dspr2
 | 
					 | 
				
			||||||
      vpxenc: add -quiet option
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  - Speed:
 | 
					 | 
				
			||||||
      Encoder and decoder speed is consistent with the Eider release.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  - Quality:
 | 
					 | 
				
			||||||
      In general, quality is consistent with the Eider release.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      Minor tweaks to ARNR filtering
 | 
					 | 
				
			||||||
      Minor improvements to real time encoding with multiple temporal layers
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  - Bug Fixes:
 | 
					 | 
				
			||||||
      Fixes multithreaded encoder race condition in loopfilter
 | 
					 | 
				
			||||||
      Fixes multi-resolution threaded encoding
 | 
					 | 
				
			||||||
      Fix potential encoder dead-lock after picture resize
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
2012-05-09 v1.1.0 "Eider"
 | 
					 | 
				
			||||||
  This introduces a number of enhancements, mostly focused on real-time
 | 
					 | 
				
			||||||
  encoding. In addition, it fixes a decoder bug (first introduced in
 | 
					 | 
				
			||||||
  Duclair) so all users of that release are encouraged to upgrade.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  - Upgrading:
 | 
					 | 
				
			||||||
    This release is ABI and API compatible with Duclair (v1.0.0). Users
 | 
					 | 
				
			||||||
    of older releases should refer to the Upgrading notes in this
 | 
					 | 
				
			||||||
    document for that release.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This release introduces a new temporal denoiser, controlled by the
 | 
					 | 
				
			||||||
    VP8E_SET_NOISE_SENSITIVITY control. The temporal denoiser does not
 | 
					 | 
				
			||||||
    currently take a strength parameter, so the control is effectively
 | 
					 | 
				
			||||||
    a boolean - zero (off) or non-zero (on). For compatibility with
 | 
					 | 
				
			||||||
    existing applications, the values accepted are the same as those
 | 
					 | 
				
			||||||
    for the spatial denoiser (0-6). The temporal denoiser is enabled
 | 
					 | 
				
			||||||
    by default, and the older spatial denoiser may be restored by
 | 
					 | 
				
			||||||
    configuring with --disable-temporal-denoising. The temporal denoiser
 | 
					 | 
				
			||||||
    is more computationally intensive than the spatial one.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This release removes support for a legacy, decode only API that was
 | 
					 | 
				
			||||||
    supported, but deprecated, at the initial release of libvpx
 | 
					 | 
				
			||||||
    (v0.9.0). This is not expected to have any impact. If you are
 | 
					 | 
				
			||||||
    impacted, you can apply a reversion to commit 2bf8fb58 locally.
 | 
					 | 
				
			||||||
    Please update to the latest libvpx API if you are affected.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  - Enhancements:
 | 
					 | 
				
			||||||
      Adds a motion compensated temporal denoiser to the encoder, which
 | 
					 | 
				
			||||||
      gives higher quality than the older spatial denoiser. (See above
 | 
					 | 
				
			||||||
      for notes on upgrading).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      In addition, support for new compilers and platforms were added,
 | 
					 | 
				
			||||||
      including:
 | 
					 | 
				
			||||||
        improved support for XCode
 | 
					 | 
				
			||||||
        Android x86 NDK build
 | 
					 | 
				
			||||||
        OS/2 support
 | 
					 | 
				
			||||||
        SunCC support
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      Changing resolution with vpx_codec_enc_config_set() is now
 | 
					 | 
				
			||||||
      supported. Previously, reinitializing the codec was required to
 | 
					 | 
				
			||||||
      change the input resolution.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      The vpxenc application has initial support for producing multiple
 | 
					 | 
				
			||||||
      encodes from the same input in one call. Resizing is not yet
 | 
					 | 
				
			||||||
      supported, but varying other codec parameters is. Use -- to
 | 
					 | 
				
			||||||
      delineate output streams. Options persist from one stream to the
 | 
					 | 
				
			||||||
      next.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      Also, the vpxenc application will now use a keyframe interval of
 | 
					 | 
				
			||||||
      5 seconds by default. Use the --kf-max-dist option to override.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  - Speed:
 | 
					 | 
				
			||||||
      Decoder performance improved 2.5% versus Duclair. Encoder speed is
 | 
					 | 
				
			||||||
      consistent with Duclair for most material. Two pass encoding of
 | 
					 | 
				
			||||||
      slideshow-like material will see significant improvements.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      Large realtime encoding speed gains at a small quality expense are
 | 
					 | 
				
			||||||
      possible by configuring the on-the-fly bitpacking experiment with
 | 
					 | 
				
			||||||
      --enable-onthefly-bitpacking. Realtime encoder can be up to 13%
 | 
					 | 
				
			||||||
      faster (ARM) depending on the number of threads and bitrate
 | 
					 | 
				
			||||||
      settings. This technique sees constant gain over the 5-16 speed
 | 
					 | 
				
			||||||
      range. For VC style input the loss seen is up to 0.2dB. See commit
 | 
					 | 
				
			||||||
      52cf4dca for further details.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  - Quality:
 | 
					 | 
				
			||||||
      On the whole, quality is consistent with the Duclair release. Some
 | 
					 | 
				
			||||||
      tweaks:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        Reduced blockiness in easy sections by applying a penalty to
 | 
					 | 
				
			||||||
        intra modes.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        Improved quality of static sections (like slideshows) with
 | 
					 | 
				
			||||||
        two pass encoding.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        Improved keyframe sizing with multiple temporal layers
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  - Bug Fixes:
 | 
					 | 
				
			||||||
      Corrected alt-ref contribution to frame rate for visible updates
 | 
					 | 
				
			||||||
      to the alt-ref buffer. This affected applications making manual
 | 
					 | 
				
			||||||
      usage of the frame reference flags, or temporal layers.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      Additional constraints were added to disable multi-frame quality
 | 
					 | 
				
			||||||
      enhancement (MFQE) in sections of the frame where there is motion.
 | 
					 | 
				
			||||||
      (#392)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      Fixed corruption issues when vpx_codec_enc_config_set() was called
 | 
					 | 
				
			||||||
      with spatial resampling enabled.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      Fixed a decoder error introduced in Duclair where the segmentation
 | 
					 | 
				
			||||||
      map was not being reinitialized on keyframes (#378)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
2012-01-27 v1.0.0 "Duclair"
 | 
					 | 
				
			||||||
  Our fourth named release, focused on performance and features related to
 | 
					 | 
				
			||||||
  real-time encoding. It also fixes a decoder crash bug introduced in
 | 
					 | 
				
			||||||
  v0.9.7, so all users of that release are encouraged to upgrade.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  - Upgrading:
 | 
					 | 
				
			||||||
      This release is ABI incompatible with prior releases of libvpx, so the
 | 
					 | 
				
			||||||
      "major" version number has been bumped to 1. You must recompile your
 | 
					 | 
				
			||||||
      applications against the latest version of the libvpx headers. The
 | 
					 | 
				
			||||||
      API remains compatible, and this should not require code changes in most
 | 
					 | 
				
			||||||
      applications.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  - Enhancements:
 | 
					 | 
				
			||||||
      This release introduces several substantial new features to the encoder,
 | 
					 | 
				
			||||||
      of particular interest to real time streaming applications.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      Temporal scalability allows the encoder to produce a stream that can
 | 
					 | 
				
			||||||
      be decimated to different frame rates, with independent rate targetting
 | 
					 | 
				
			||||||
      for each substream.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      Multiframe quality enhancement postprocessing can make visual quality
 | 
					 | 
				
			||||||
      more consistent in the presence of frames that are substantially
 | 
					 | 
				
			||||||
      different quality than the surrounding frames, as in the temporal
 | 
					 | 
				
			||||||
      scalability case and in some forced keyframe scenarios.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      Multiple-resolution encoding support allows the encoding of the
 | 
					 | 
				
			||||||
      same content at different resolutions faster than encoding them
 | 
					 | 
				
			||||||
      separately.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  - Speed:
 | 
					 | 
				
			||||||
      Optimization targets for this release included the decoder and the real-
 | 
					 | 
				
			||||||
      time modes of the encoder. Decoder speed on x86 has improved 10.5% with
 | 
					 | 
				
			||||||
      this release. Encoder improvements followed a curve where speeds 1-3
 | 
					 | 
				
			||||||
      improved 4.0%-1.5%, speeds 4-8 improved <1%, and speeds 9-16 improved
 | 
					 | 
				
			||||||
      1.5% to 10.5%, respectively. "Best" mode speed is consistent with the
 | 
					 | 
				
			||||||
      Cayuga release.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  - Quality:
 | 
					 | 
				
			||||||
      Encoder quality in the single stream case is consistent with the Cayuga
 | 
					 | 
				
			||||||
      release.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  - Bug Fixes:
 | 
					 | 
				
			||||||
      This release fixes an OOB read decoder crash bug present in v0.9.7
 | 
					 | 
				
			||||||
      related to the clamping of motion vectors in SPLITMV blocks. This
 | 
					 | 
				
			||||||
      behavior could be triggered by corrupt input or by starting
 | 
					 | 
				
			||||||
      decoding from a P-frame.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
2011-08-15 v0.9.7-p1 "Cayuga" patch 1
 | 
					 | 
				
			||||||
  This is an incremental bugfix release against Cayuga. All users of that
 | 
					 | 
				
			||||||
  release are strongly encouraged to upgrade.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    - Fix potential OOB reads (cdae03a)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
          An unbounded out of bounds read was discovered when the
 | 
					 | 
				
			||||||
          decoder was requested to perform error concealment (new in
 | 
					 | 
				
			||||||
          Cayuga) given a frame with corrupt partition sizes.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
          A bounded out of bounds read was discovered affecting all
 | 
					 | 
				
			||||||
          versions of libvpx. Given an multipartition input frame that
 | 
					 | 
				
			||||||
          is truncated between the mode/mv partition and the first
 | 
					 | 
				
			||||||
          residiual paritition (in the block of partition offsets), up
 | 
					 | 
				
			||||||
          to 3 extra bytes could have been read from the source buffer.
 | 
					 | 
				
			||||||
          The code will not take any action regardless of the contents
 | 
					 | 
				
			||||||
          of these undefined bytes, as the truncated buffer is detected
 | 
					 | 
				
			||||||
          immediately following the read based on the calculated
 | 
					 | 
				
			||||||
          starting position of the coefficient partition.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    - Fix potential error concealment crash when the very first frame
 | 
					 | 
				
			||||||
      is missing or corrupt (a609be5)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    - Fix significant artifacts in error concealment (a4c2211, 99d870a)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    - Revert 1-pass CBR rate control changes (e961317)
 | 
					 | 
				
			||||||
      Further testing showed this change produced undesirable visual
 | 
					 | 
				
			||||||
      artifacts, rolling back for now.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
2011-08-02 v0.9.7 "Cayuga"
 | 
					 | 
				
			||||||
  Our third named release, focused on a faster, higher quality, encoder.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  - Upgrading:
 | 
					 | 
				
			||||||
    This release is backwards compatible with Aylesbury (v0.9.5) and
 | 
					 | 
				
			||||||
    Bali (v0.9.6). Users of older releases should refer to the Upgrading
 | 
					 | 
				
			||||||
    notes in this document for that release.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  - Enhancements:
 | 
					 | 
				
			||||||
          Stereo 3D format support for vpxenc
 | 
					 | 
				
			||||||
          Runtime detection of available processor cores.
 | 
					 | 
				
			||||||
          Allow specifying --end-usage by enum name
 | 
					 | 
				
			||||||
          vpxdec: test for frame corruption
 | 
					 | 
				
			||||||
          vpxenc: add quantizer histogram display
 | 
					 | 
				
			||||||
          vpxenc: add rate histogram display
 | 
					 | 
				
			||||||
          Set VPX_FRAME_IS_DROPPABLE
 | 
					 | 
				
			||||||
          update configure for ios sdk 4.3
 | 
					 | 
				
			||||||
          Avoid text relocations in ARM vp8 decoder
 | 
					 | 
				
			||||||
          Generate a vpx.pc file for pkg-config.
 | 
					 | 
				
			||||||
          New ways of passing encoded data between encoder and decoder.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  - Speed:
 | 
					 | 
				
			||||||
      This release includes across-the-board speed improvements to the
 | 
					 | 
				
			||||||
      encoder. On x86, these measure at approximately 11.5% in Best mode,
 | 
					 | 
				
			||||||
      21.5% in Good mode (speed 0), and 22.5% in Realtime mode (speed 6).
 | 
					 | 
				
			||||||
      On ARM Cortex A9 with Neon extensions, real-time encoding of video
 | 
					 | 
				
			||||||
      telephony content is 35% faster than Bali on single core and 48%
 | 
					 | 
				
			||||||
      faster on multi-core. On the NVidia Tegra2 platform, real time
 | 
					 | 
				
			||||||
      encoding is 40% faster than Bali.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      Decoder speed was not a priority for this release, but improved
 | 
					 | 
				
			||||||
      approximately 8.4% on x86.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
          Reduce motion vector search on alt-ref frame.
 | 
					 | 
				
			||||||
          Encoder loopfilter running in its own thread
 | 
					 | 
				
			||||||
          Reworked loopfilter to precalculate more parameters
 | 
					 | 
				
			||||||
          SSE2/SSSE3 optimizations for build_predictors_mbuv{,_s}().
 | 
					 | 
				
			||||||
          Make hor UV predict ~2x faster (73 vs 132 cycles) using SSSE3.
 | 
					 | 
				
			||||||
          Removed redundant checks
 | 
					 | 
				
			||||||
          Reduced structure sizes
 | 
					 | 
				
			||||||
          utilize preload in ARMv6 MC/LPF/Copy routines
 | 
					 | 
				
			||||||
          ARM optimized quantization, dfct, variance, subtract
 | 
					 | 
				
			||||||
          Increase chrow row alignment to 16 bytes.
 | 
					 | 
				
			||||||
          disable trellis optimization for first pass
 | 
					 | 
				
			||||||
          Write SSSE3 sub-pixel filter function
 | 
					 | 
				
			||||||
          Improve SSE2 half-pixel filter funtions
 | 
					 | 
				
			||||||
          Add vp8_sub_pixel_variance16x8_ssse3 function
 | 
					 | 
				
			||||||
          Reduce unnecessary distortion computation
 | 
					 | 
				
			||||||
          Use diamond search to replace full search
 | 
					 | 
				
			||||||
          Preload reference area in sub-pixel motion search (real-time mode)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  - Quality:
 | 
					 | 
				
			||||||
      This release focused primarily on one-pass use cases, including
 | 
					 | 
				
			||||||
      video conferencing. Low latency data rate control was significantly
 | 
					 | 
				
			||||||
      improved, improving streamability over bandwidth constrained links.
 | 
					 | 
				
			||||||
      Added support for error concealment, allowing frames to maintain
 | 
					 | 
				
			||||||
      visual quality in the presence of substantial packet loss.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
          Add rc_max_intra_bitrate_pct control
 | 
					 | 
				
			||||||
          Limit size of initial keyframe in one-pass.
 | 
					 | 
				
			||||||
          Improve framerate adaptation
 | 
					 | 
				
			||||||
          Improved 1-pass CBR rate control
 | 
					 | 
				
			||||||
          Improved KF insertion after fades to still.
 | 
					 | 
				
			||||||
          Improved key frame detection.
 | 
					 | 
				
			||||||
          Improved activity masking (lower PSNR impact for same SSIM boost)
 | 
					 | 
				
			||||||
          Improved interaction between GF and ARFs
 | 
					 | 
				
			||||||
          Adding error-concealment to the decoder.
 | 
					 | 
				
			||||||
          Adding support for independent partitions
 | 
					 | 
				
			||||||
          Adjusted rate-distortion constants
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  - Bug Fixes:
 | 
					 | 
				
			||||||
          Removed firstpass motion map
 | 
					 | 
				
			||||||
          Fix parallel make install
 | 
					 | 
				
			||||||
          Fix multithreaded encoding for 1 MB wide frame
 | 
					 | 
				
			||||||
          Fixed iwalsh_neon build problems with RVDS4.1
 | 
					 | 
				
			||||||
          Fix semaphore emulation, spin-wait intrinsics on Windows
 | 
					 | 
				
			||||||
          Fix build with xcode4 and simplify GLOBAL.
 | 
					 | 
				
			||||||
          Mark ARM asm objects as allowing a non-executable stack.
 | 
					 | 
				
			||||||
          Fix vpxenc encoding incorrect webm file header on big endian
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
2011-03-07 v0.9.6 "Bali"
 | 
					 | 
				
			||||||
  Our second named release, focused on a faster, higher quality, encoder.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  - Upgrading:
 | 
					 | 
				
			||||||
    This release is backwards compatible with Aylesbury (v0.9.5). Users
 | 
					 | 
				
			||||||
    of older releases should refer to the Upgrading notes in this
 | 
					 | 
				
			||||||
    document for that release.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  - Enhancements:
 | 
					 | 
				
			||||||
      vpxenc --psnr shows a summary when encode completes
 | 
					 | 
				
			||||||
      --tune=ssim option to enable activity masking
 | 
					 | 
				
			||||||
      improved postproc visualizations for development
 | 
					 | 
				
			||||||
      updated support for Apple iOS to SDK 4.2
 | 
					 | 
				
			||||||
      query decoder to determine which reference frames were updated
 | 
					 | 
				
			||||||
      implemented error tracking in the decoder
 | 
					 | 
				
			||||||
      fix pipe support on windows
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  - Speed:
 | 
					 | 
				
			||||||
      Primary focus was on good quality mode, speed 0. Average improvement
 | 
					 | 
				
			||||||
      on x86 about 40%, up to 100% on user-generated content at that speed.
 | 
					 | 
				
			||||||
      Best quality mode speed improved 35%, and realtime speed 10-20%. This
 | 
					 | 
				
			||||||
      release also saw significant improvement in realtime encoding speed
 | 
					 | 
				
			||||||
      on ARM platforms.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        Improved encoder threading
 | 
					 | 
				
			||||||
        Dont pick encoder filter level when loopfilter is disabled.
 | 
					 | 
				
			||||||
        Avoid double copying of key frames into alt and golden buffer
 | 
					 | 
				
			||||||
        FDCT optimizations.
 | 
					 | 
				
			||||||
        x86 sse2 temporal filter
 | 
					 | 
				
			||||||
        SSSE3 version of fast quantizer
 | 
					 | 
				
			||||||
        vp8_rd_pick_best_mbsegmentation code restructure
 | 
					 | 
				
			||||||
        Adjusted breakout RD for SPLITMV
 | 
					 | 
				
			||||||
        Changed segmentation check order
 | 
					 | 
				
			||||||
        Improved rd_pick_intra4x4block
 | 
					 | 
				
			||||||
        Adds armv6 optimized variance calculation
 | 
					 | 
				
			||||||
        ARMv6 optimized sad16x16
 | 
					 | 
				
			||||||
        ARMv6 optimized half pixel variance calculations
 | 
					 | 
				
			||||||
        Full search SAD function optimization in SSE4.1
 | 
					 | 
				
			||||||
        Improve MV prediction accuracy to achieve performance gain
 | 
					 | 
				
			||||||
        Improve MV prediction in vp8_pick_inter_mode() for speed>3
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  - Quality:
 | 
					 | 
				
			||||||
      Best quality mode improved PSNR 6.3%, and SSIM 6.1%. This release
 | 
					 | 
				
			||||||
      also includes support for "activity masking," which greatly improves
 | 
					 | 
				
			||||||
      SSIM at the expense of PSNR. For now, this feature is available with
 | 
					 | 
				
			||||||
      the --tune=ssim option. Further experimentation in this area
 | 
					 | 
				
			||||||
      is ongoing. This release also introduces a new rate control mode
 | 
					 | 
				
			||||||
      called "CQ," which changes the allocation of bits within a clip to
 | 
					 | 
				
			||||||
      the sections where they will have the most visual impact.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        Tuning for the more exact quantizer.
 | 
					 | 
				
			||||||
        Relax rate control for last few frames
 | 
					 | 
				
			||||||
        CQ Mode
 | 
					 | 
				
			||||||
        Limit key frame quantizer for forced key frames.
 | 
					 | 
				
			||||||
        KF/GF Pulsing
 | 
					 | 
				
			||||||
        Add simple version of activity masking.
 | 
					 | 
				
			||||||
        make rdmult adaptive for intra in quantizer RDO
 | 
					 | 
				
			||||||
        cap the best quantizer for 2nd order DC
 | 
					 | 
				
			||||||
        change the threshold of DC check for encode breakout
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  - Bug Fixes:
 | 
					 | 
				
			||||||
      Fix crash on Sparc Solaris.
 | 
					 | 
				
			||||||
      Fix counter of fixed keyframe distance
 | 
					 | 
				
			||||||
      ARNR filter pointer update bug fix
 | 
					 | 
				
			||||||
      Fixed use of motion percentage in KF/GF group calc
 | 
					 | 
				
			||||||
      Changed condition for using RD in Intra Mode
 | 
					 | 
				
			||||||
      Fix encoder real-time only configuration.
 | 
					 | 
				
			||||||
      Fix ARM encoder crash with multiple token partitions
 | 
					 | 
				
			||||||
      Fixed bug first cluster timecode of webm file is wrong.
 | 
					 | 
				
			||||||
      Fixed various encoder bugs with odd-sized images
 | 
					 | 
				
			||||||
      vp8e_get_preview fixed when spatial resampling enabled
 | 
					 | 
				
			||||||
      quantizer: fix assertion in fast quantizer path
 | 
					 | 
				
			||||||
      Allocate source buffers to be multiples of 16
 | 
					 | 
				
			||||||
      Fix for manual Golden frame frequency
 | 
					 | 
				
			||||||
      Fix drastic undershoot in long form content
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
2010-10-28 v0.9.5 "Aylesbury"
 | 
					2010-10-28 v0.9.5 "Aylesbury"
 | 
				
			||||||
  Our first named release, focused on a faster decoder, and a better encoder.
 | 
					  Our first named release, focused on a faster decoder, and a better encoder.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										9
									
								
								LICENSE
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								LICENSE
									
									
									
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
Copyright (c) 2010, The WebM Project authors. All rights reserved.
 | 
					Copyright (c) 2010, Google Inc. All rights reserved.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Redistribution and use in source and binary forms, with or without
 | 
					Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
modification, are permitted provided that the following conditions are
 | 
					modification, are permitted provided that the following conditions are
 | 
				
			||||||
@@ -12,10 +12,9 @@ met:
 | 
				
			|||||||
    the documentation and/or other materials provided with the
 | 
					    the documentation and/or other materials provided with the
 | 
				
			||||||
    distribution.
 | 
					    distribution.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  * Neither the name of Google, nor the WebM Project, nor the names
 | 
					  * Neither the name of Google nor the names of its contributors may
 | 
				
			||||||
    of its contributors may be used to endorse or promote products
 | 
					    be used to endorse or promote products derived from this software
 | 
				
			||||||
    derived from this software without specific prior written
 | 
					    without specific prior written permission.
 | 
				
			||||||
    permission.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
					THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
				
			||||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
					"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										61
									
								
								README
									
									
									
									
									
								
							
							
						
						
									
										61
									
								
								README
									
									
									
									
									
								
							@@ -1,7 +1,7 @@
 | 
				
			|||||||
vpx Multi-Format Codec SDK
 | 
					vpx Multi-Format Codec SDK
 | 
				
			||||||
README - 1 August 2013
 | 
					README - 19 May 2010
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Welcome to the WebM VP8/VP9 Codec SDK!
 | 
					Welcome to the WebM VP8 Codec SDK!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
COMPILING THE APPLICATIONS/LIBRARIES:
 | 
					COMPILING THE APPLICATIONS/LIBRARIES:
 | 
				
			||||||
  The build system used is similar to autotools. Building generally consists of
 | 
					  The build system used is similar to autotools. Building generally consists of
 | 
				
			||||||
@@ -15,19 +15,11 @@ COMPILING THE APPLICATIONS/LIBRARIES:
 | 
				
			|||||||
    * Building the documentation requires PHP[3] and Doxygen[4]. If you do not
 | 
					    * Building the documentation requires PHP[3] and Doxygen[4]. If you do not
 | 
				
			||||||
      have these packages, you must pass --disable-install-docs to the
 | 
					      have these packages, you must pass --disable-install-docs to the
 | 
				
			||||||
      configure script.
 | 
					      configure script.
 | 
				
			||||||
    * Downloading the data for the unit tests requires curl[5] and sha1sum.
 | 
					 | 
				
			||||||
      sha1sum is provided via the GNU coreutils, installed by default on
 | 
					 | 
				
			||||||
      many *nix platforms, as well as MinGW and Cygwin. If coreutils is not
 | 
					 | 
				
			||||||
      available, a compatible version of sha1sum can be built from
 | 
					 | 
				
			||||||
      source[6]. These requirements are optional if not running the unit
 | 
					 | 
				
			||||||
      tests.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    [1]: http://www.tortall.net/projects/yasm
 | 
					    [1]: http://www.tortall.net/projects/yasm
 | 
				
			||||||
    [2]: http://www.cygwin.com
 | 
					    [2]: http://www.cygwin.com
 | 
				
			||||||
    [3]: http://php.net
 | 
					    [3]: http://php.net
 | 
				
			||||||
    [4]: http://www.doxygen.org
 | 
					    [4]: http://www.doxygen.org
 | 
				
			||||||
    [5]: http://curl.haxx.se
 | 
					 | 
				
			||||||
    [6]: http://www.microbrew.org/tools/md5sha1sum/
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  2. Out-of-tree builds
 | 
					  2. Out-of-tree builds
 | 
				
			||||||
  Out of tree builds are a supported method of building the application. For
 | 
					  Out of tree builds are a supported method of building the application. For
 | 
				
			||||||
@@ -50,69 +42,44 @@ COMPILING THE APPLICATIONS/LIBRARIES:
 | 
				
			|||||||
  --help output of the configure script. As of this writing, the list of
 | 
					  --help output of the configure script. As of this writing, the list of
 | 
				
			||||||
  available targets is:
 | 
					  available targets is:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    armv5te-android-gcc
 | 
					 | 
				
			||||||
    armv5te-linux-rvct
 | 
					    armv5te-linux-rvct
 | 
				
			||||||
    armv5te-linux-gcc
 | 
					    armv5te-linux-gcc
 | 
				
			||||||
    armv5te-none-rvct
 | 
					    armv5te-symbian-gcc
 | 
				
			||||||
 | 
					    armv5te-wince-vs8
 | 
				
			||||||
    armv6-darwin-gcc
 | 
					    armv6-darwin-gcc
 | 
				
			||||||
    armv6-linux-rvct
 | 
					    armv6-linux-rvct
 | 
				
			||||||
    armv6-linux-gcc
 | 
					    armv6-linux-gcc
 | 
				
			||||||
    armv6-none-rvct
 | 
					    armv6-symbian-gcc
 | 
				
			||||||
    armv7-android-gcc
 | 
					    armv6-wince-vs8
 | 
				
			||||||
    armv7-darwin-gcc
 | 
					    iwmmxt-linux-rvct
 | 
				
			||||||
 | 
					    iwmmxt-linux-gcc
 | 
				
			||||||
 | 
					    iwmmxt-wince-vs8
 | 
				
			||||||
 | 
					    iwmmxt2-linux-rvct
 | 
				
			||||||
 | 
					    iwmmxt2-linux-gcc
 | 
				
			||||||
 | 
					    iwmmxt2-wince-vs8
 | 
				
			||||||
    armv7-linux-rvct
 | 
					    armv7-linux-rvct
 | 
				
			||||||
    armv7-linux-gcc
 | 
					    armv7-linux-gcc
 | 
				
			||||||
    armv7-none-rvct
 | 
					 | 
				
			||||||
    armv7-win32-vs11
 | 
					 | 
				
			||||||
    armv7-win32-vs12
 | 
					 | 
				
			||||||
    mips32-linux-gcc
 | 
					    mips32-linux-gcc
 | 
				
			||||||
    ppc32-darwin8-gcc
 | 
					    ppc32-darwin8-gcc
 | 
				
			||||||
    ppc32-darwin9-gcc
 | 
					    ppc32-darwin9-gcc
 | 
				
			||||||
    ppc32-linux-gcc
 | 
					 | 
				
			||||||
    ppc64-darwin8-gcc
 | 
					    ppc64-darwin8-gcc
 | 
				
			||||||
    ppc64-darwin9-gcc
 | 
					    ppc64-darwin9-gcc
 | 
				
			||||||
    ppc64-linux-gcc
 | 
					    ppc64-linux-gcc
 | 
				
			||||||
    sparc-solaris-gcc
 | 
					 | 
				
			||||||
    x86-android-gcc
 | 
					 | 
				
			||||||
    x86-darwin8-gcc
 | 
					    x86-darwin8-gcc
 | 
				
			||||||
    x86-darwin8-icc
 | 
					    x86-darwin8-icc
 | 
				
			||||||
    x86-darwin9-gcc
 | 
					    x86-darwin9-gcc
 | 
				
			||||||
    x86-darwin9-icc
 | 
					    x86-darwin9-icc
 | 
				
			||||||
    x86-darwin10-gcc
 | 
					 | 
				
			||||||
    x86-darwin11-gcc
 | 
					 | 
				
			||||||
    x86-darwin12-gcc
 | 
					 | 
				
			||||||
    x86-darwin13-gcc
 | 
					 | 
				
			||||||
    x86-linux-gcc
 | 
					    x86-linux-gcc
 | 
				
			||||||
    x86-linux-icc
 | 
					    x86-linux-icc
 | 
				
			||||||
    x86-os2-gcc
 | 
					 | 
				
			||||||
    x86-solaris-gcc
 | 
					    x86-solaris-gcc
 | 
				
			||||||
    x86-win32-gcc
 | 
					 | 
				
			||||||
    x86-win32-vs7
 | 
					    x86-win32-vs7
 | 
				
			||||||
    x86-win32-vs8
 | 
					    x86-win32-vs8
 | 
				
			||||||
    x86-win32-vs9
 | 
					 | 
				
			||||||
    x86-win32-vs10
 | 
					 | 
				
			||||||
    x86-win32-vs11
 | 
					 | 
				
			||||||
    x86-win32-vs12
 | 
					 | 
				
			||||||
    x86_64-darwin9-gcc
 | 
					    x86_64-darwin9-gcc
 | 
				
			||||||
    x86_64-darwin10-gcc
 | 
					 | 
				
			||||||
    x86_64-darwin11-gcc
 | 
					 | 
				
			||||||
    x86_64-darwin12-gcc
 | 
					 | 
				
			||||||
    x86_64-darwin13-gcc
 | 
					 | 
				
			||||||
    x86_64-linux-gcc
 | 
					    x86_64-linux-gcc
 | 
				
			||||||
    x86_64-linux-icc
 | 
					 | 
				
			||||||
    x86_64-solaris-gcc
 | 
					    x86_64-solaris-gcc
 | 
				
			||||||
    x86_64-win64-gcc
 | 
					 | 
				
			||||||
    x86_64-win64-vs8
 | 
					    x86_64-win64-vs8
 | 
				
			||||||
    x86_64-win64-vs9
 | 
					 | 
				
			||||||
    x86_64-win64-vs10
 | 
					 | 
				
			||||||
    x86_64-win64-vs11
 | 
					 | 
				
			||||||
    x86_64-win64-vs12
 | 
					 | 
				
			||||||
    universal-darwin8-gcc
 | 
					    universal-darwin8-gcc
 | 
				
			||||||
    universal-darwin9-gcc
 | 
					    universal-darwin9-gcc
 | 
				
			||||||
    universal-darwin10-gcc
 | 
					 | 
				
			||||||
    universal-darwin11-gcc
 | 
					 | 
				
			||||||
    universal-darwin12-gcc
 | 
					 | 
				
			||||||
    universal-darwin13-gcc
 | 
					 | 
				
			||||||
    generic-gnu
 | 
					    generic-gnu
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  The generic-gnu target, in conjunction with the CROSS environment variable,
 | 
					  The generic-gnu target, in conjunction with the CROSS environment variable,
 | 
				
			||||||
@@ -130,10 +97,10 @@ COMPILING THE APPLICATIONS/LIBRARIES:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  5. Configuration errors
 | 
					  5. Configuration errors
 | 
				
			||||||
  If the configuration step fails, the first step is to look in the error log.
 | 
					  If the configuration step fails, the first step is to look in the error log.
 | 
				
			||||||
  This defaults to config.log. This should give a good indication of what went
 | 
					  This defaults to config.err. This should give a good indication of what went
 | 
				
			||||||
  wrong. If not, contact us for support.
 | 
					  wrong. If not, contact us for support.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SUPPORT
 | 
					SUPPORT
 | 
				
			||||||
  This library is an open source project supported by its community. Please
 | 
					  This library is an open source project supported by its community. Please
 | 
				
			||||||
  please email webm-discuss@webmproject.org for help.
 | 
					  please email webm-users@webmproject.org for help.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										371
									
								
								args.c
									
									
									
									
									
								
							
							
						
						
									
										371
									
								
								args.c
									
									
									
									
									
								
							@@ -25,214 +25,241 @@ extern void die(const char *fmt, ...);
 | 
				
			|||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct arg arg_init(char **argv) {
 | 
					struct arg arg_init(char **argv)
 | 
				
			||||||
  struct arg a;
 | 
					{
 | 
				
			||||||
 | 
					    struct arg a;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  a.argv      = argv;
 | 
					    a.argv      = argv;
 | 
				
			||||||
  a.argv_step = 1;
 | 
					    a.argv_step = 1;
 | 
				
			||||||
  a.name      = NULL;
 | 
					    a.name      = NULL;
 | 
				
			||||||
  a.val       = NULL;
 | 
					    a.val       = NULL;
 | 
				
			||||||
  a.def       = NULL;
 | 
					    a.def       = NULL;
 | 
				
			||||||
  return a;
 | 
					    return a;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int arg_match(struct arg *arg_, const struct arg_def *def, char **argv) {
 | 
					int arg_match(struct arg *arg_, const struct arg_def *def, char **argv)
 | 
				
			||||||
  struct arg arg;
 | 
					{
 | 
				
			||||||
 | 
					    struct arg arg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (!argv[0] || argv[0][0] != '-')
 | 
					    if (!argv[0] || argv[0][0] != '-')
 | 
				
			||||||
    return 0;
 | 
					        return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  arg = arg_init(argv);
 | 
					    arg = arg_init(argv);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (def->short_name
 | 
					    if (def->short_name
 | 
				
			||||||
      && strlen(arg.argv[0]) == strlen(def->short_name) + 1
 | 
					        && strlen(arg.argv[0]) == strlen(def->short_name) + 1
 | 
				
			||||||
      && !strcmp(arg.argv[0] + 1, def->short_name)) {
 | 
					        && !strcmp(arg.argv[0] + 1, def->short_name))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    arg.name = arg.argv[0] + 1;
 | 
					        arg.name = arg.argv[0] + 1;
 | 
				
			||||||
    arg.val = def->has_val ? arg.argv[1] : NULL;
 | 
					        arg.val = def->has_val ? arg.argv[1] : NULL;
 | 
				
			||||||
    arg.argv_step = def->has_val ? 2 : 1;
 | 
					        arg.argv_step = def->has_val ? 2 : 1;
 | 
				
			||||||
  } else if (def->long_name) {
 | 
					 | 
				
			||||||
    const size_t name_len = strlen(def->long_name);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (strlen(arg.argv[0]) >= name_len + 2
 | 
					 | 
				
			||||||
        && arg.argv[0][1] == '-'
 | 
					 | 
				
			||||||
        && !strncmp(arg.argv[0] + 2, def->long_name, name_len)
 | 
					 | 
				
			||||||
        && (arg.argv[0][name_len + 2] == '='
 | 
					 | 
				
			||||||
            || arg.argv[0][name_len + 2] == '\0')) {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      arg.name = arg.argv[0] + 2;
 | 
					 | 
				
			||||||
      arg.val = arg.name[name_len] == '=' ? arg.name + name_len + 1 : NULL;
 | 
					 | 
				
			||||||
      arg.argv_step = 1;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (arg.name && !arg.val && def->has_val)
 | 
					 | 
				
			||||||
    die("Error: option %s requires argument.\n", arg.name);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (arg.name && arg.val && !def->has_val)
 | 
					 | 
				
			||||||
    die("Error: option %s requires no argument.\n", arg.name);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (arg.name
 | 
					 | 
				
			||||||
      && (arg.val || !def->has_val)) {
 | 
					 | 
				
			||||||
    arg.def = def;
 | 
					 | 
				
			||||||
    *arg_ = arg;
 | 
					 | 
				
			||||||
    return 1;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const char *arg_next(struct arg *arg) {
 | 
					 | 
				
			||||||
  if (arg->argv[0])
 | 
					 | 
				
			||||||
    arg->argv += arg->argv_step;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return *arg->argv;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
char **argv_dup(int argc, const char **argv) {
 | 
					 | 
				
			||||||
  char **new_argv = malloc((argc + 1) * sizeof(*argv));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  memcpy(new_argv, argv, argc * sizeof(*argv));
 | 
					 | 
				
			||||||
  new_argv[argc] = NULL;
 | 
					 | 
				
			||||||
  return new_argv;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void arg_show_usage(FILE *fp, const struct arg_def *const *defs) {
 | 
					 | 
				
			||||||
  char option_text[40] = {0};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  for (; *defs; defs++) {
 | 
					 | 
				
			||||||
    const struct arg_def *def = *defs;
 | 
					 | 
				
			||||||
    char *short_val = def->has_val ? " <arg>" : "";
 | 
					 | 
				
			||||||
    char *long_val = def->has_val ? "=<arg>" : "";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (def->short_name && def->long_name) {
 | 
					 | 
				
			||||||
      char *comma = def->has_val ? "," : ",      ";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      snprintf(option_text, 37, "-%s%s%s --%s%6s",
 | 
					 | 
				
			||||||
               def->short_name, short_val, comma,
 | 
					 | 
				
			||||||
               def->long_name, long_val);
 | 
					 | 
				
			||||||
    } else if (def->short_name)
 | 
					 | 
				
			||||||
      snprintf(option_text, 37, "-%s%s",
 | 
					 | 
				
			||||||
               def->short_name, short_val);
 | 
					 | 
				
			||||||
    else if (def->long_name)
 | 
					    else if (def->long_name)
 | 
				
			||||||
      snprintf(option_text, 37, "          --%s%s",
 | 
					    {
 | 
				
			||||||
               def->long_name, long_val);
 | 
					        int name_len = strlen(def->long_name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fprintf(fp, "  %-37s\t%s\n", option_text, def->desc);
 | 
					        if (strlen(arg.argv[0]) >= name_len + 2
 | 
				
			||||||
 | 
					            && arg.argv[0][1] == '-'
 | 
				
			||||||
 | 
					            && !strncmp(arg.argv[0] + 2, def->long_name, name_len)
 | 
				
			||||||
 | 
					            && (arg.argv[0][name_len+2] == '='
 | 
				
			||||||
 | 
					                || arg.argv[0][name_len+2] == '\0'))
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (def->enums) {
 | 
					            arg.name = arg.argv[0] + 2;
 | 
				
			||||||
      const struct arg_enum_list *listptr;
 | 
					            arg.val = arg.name[name_len] == '=' ? arg.name + name_len + 1 : NULL;
 | 
				
			||||||
 | 
					            arg.argv_step = 1;
 | 
				
			||||||
      fprintf(fp, "  %-37s\t  ", "");
 | 
					        }
 | 
				
			||||||
 | 
					 | 
				
			||||||
      for (listptr = def->enums; listptr->name; listptr++)
 | 
					 | 
				
			||||||
        fprintf(fp, "%s%s", listptr->name,
 | 
					 | 
				
			||||||
                listptr[1].name ? ", " : "\n");
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					
 | 
				
			||||||
 | 
					    if (arg.name && !arg.val && def->has_val)
 | 
				
			||||||
 | 
					        die("Error: option %s requires argument.\n", arg.name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (arg.name && arg.val && !def->has_val)
 | 
				
			||||||
 | 
					        die("Error: option %s requires no argument.\n", arg.name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (arg.name
 | 
				
			||||||
 | 
					        && (arg.val || !def->has_val))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        arg.def = def;
 | 
				
			||||||
 | 
					        *arg_ = arg;
 | 
				
			||||||
 | 
					        return 1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
unsigned int arg_parse_uint(const struct arg *arg) {
 | 
					const char *arg_next(struct arg *arg)
 | 
				
			||||||
  long int   rawval;
 | 
					{
 | 
				
			||||||
  char      *endptr;
 | 
					    if (arg->argv[0])
 | 
				
			||||||
 | 
					        arg->argv += arg->argv_step;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  rawval = strtol(arg->val, &endptr, 10);
 | 
					    return *arg->argv;
 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (arg->val[0] != '\0' && endptr[0] == '\0') {
 | 
					 | 
				
			||||||
    if (rawval >= 0 && rawval <= UINT_MAX)
 | 
					 | 
				
			||||||
      return rawval;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    die("Option %s: Value %ld out of range for unsigned int\n",
 | 
					 | 
				
			||||||
        arg->name, rawval);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  die("Option %s: Invalid character '%c'\n", arg->name, *endptr);
 | 
					 | 
				
			||||||
  return 0;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int arg_parse_int(const struct arg *arg) {
 | 
					char **argv_dup(int argc, const char **argv)
 | 
				
			||||||
  long int   rawval;
 | 
					{
 | 
				
			||||||
  char      *endptr;
 | 
					    char **new_argv = malloc((argc + 1) * sizeof(*argv));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  rawval = strtol(arg->val, &endptr, 10);
 | 
					    memcpy(new_argv, argv, argc * sizeof(*argv));
 | 
				
			||||||
 | 
					    new_argv[argc] = NULL;
 | 
				
			||||||
  if (arg->val[0] != '\0' && endptr[0] == '\0') {
 | 
					    return new_argv;
 | 
				
			||||||
    if (rawval >= INT_MIN && rawval <= INT_MAX)
 | 
					 | 
				
			||||||
      return rawval;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    die("Option %s: Value %ld out of range for signed int\n",
 | 
					 | 
				
			||||||
        arg->name, rawval);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  die("Option %s: Invalid character '%c'\n", arg->name, *endptr);
 | 
					 | 
				
			||||||
  return 0;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct vpx_rational {
 | 
					void arg_show_usage(FILE *fp, const struct arg_def *const *defs)
 | 
				
			||||||
  int num; /**< fraction numerator */
 | 
					{
 | 
				
			||||||
  int den; /**< fraction denominator */
 | 
					    char option_text[40] = {0};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (; *defs; defs++)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        const struct arg_def *def = *defs;
 | 
				
			||||||
 | 
					        char *short_val = def->has_val ? " <arg>" : "";
 | 
				
			||||||
 | 
					        char *long_val = def->has_val ? "=<arg>" : "";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (def->short_name && def->long_name)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            char *comma = def->has_val ? "," : ",      ";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            snprintf(option_text, 37, "-%s%s%s --%s%6s",
 | 
				
			||||||
 | 
					                     def->short_name, short_val, comma,
 | 
				
			||||||
 | 
					                     def->long_name, long_val);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else if (def->short_name)
 | 
				
			||||||
 | 
					            snprintf(option_text, 37, "-%s%s",
 | 
				
			||||||
 | 
					                     def->short_name, short_val);
 | 
				
			||||||
 | 
					        else if (def->long_name)
 | 
				
			||||||
 | 
					            snprintf(option_text, 37, "          --%s%s",
 | 
				
			||||||
 | 
					                     def->long_name, long_val);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        fprintf(fp, "  %-37s\t%s\n", option_text, def->desc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if(def->enums)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            const struct arg_enum_list *listptr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            fprintf(fp, "  %-37s\t  ", "");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            for(listptr = def->enums; listptr->name; listptr++)
 | 
				
			||||||
 | 
					                fprintf(fp, "%s%s", listptr->name,
 | 
				
			||||||
 | 
					                        listptr[1].name ? ", " : "\n");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					unsigned int arg_parse_uint(const struct arg *arg)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    long int   rawval;
 | 
				
			||||||
 | 
					    char      *endptr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    rawval = strtol(arg->val, &endptr, 10);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (arg->val[0] != '\0' && endptr[0] == '\0')
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (rawval >= 0 && rawval <= UINT_MAX)
 | 
				
			||||||
 | 
					            return rawval;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        die("Option %s: Value %ld out of range for unsigned int\n",
 | 
				
			||||||
 | 
					            arg->name, rawval);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    die("Option %s: Invalid character '%c'\n", arg->name, *endptr);
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int arg_parse_int(const struct arg *arg)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    long int   rawval;
 | 
				
			||||||
 | 
					    char      *endptr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    rawval = strtol(arg->val, &endptr, 10);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (arg->val[0] != '\0' && endptr[0] == '\0')
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (rawval >= INT_MIN && rawval <= INT_MAX)
 | 
				
			||||||
 | 
					            return rawval;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        die("Option %s: Value %ld out of range for signed int\n",
 | 
				
			||||||
 | 
					            arg->name, rawval);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    die("Option %s: Invalid character '%c'\n", arg->name, *endptr);
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct vpx_rational
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int num; /**< fraction numerator */
 | 
				
			||||||
 | 
					    int den; /**< fraction denominator */
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
struct vpx_rational arg_parse_rational(const struct arg *arg) {
 | 
					struct vpx_rational arg_parse_rational(const struct arg *arg)
 | 
				
			||||||
  long int             rawval;
 | 
					{
 | 
				
			||||||
  char                *endptr;
 | 
					    long int             rawval;
 | 
				
			||||||
  struct vpx_rational  rat;
 | 
					    char                *endptr;
 | 
				
			||||||
 | 
					    struct vpx_rational  rat;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* parse numerator */
 | 
					    /* parse numerator */
 | 
				
			||||||
  rawval = strtol(arg->val, &endptr, 10);
 | 
					    rawval = strtol(arg->val, &endptr, 10);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (arg->val[0] != '\0' && endptr[0] == '/') {
 | 
					    if (arg->val[0] != '\0' && endptr[0] == '/')
 | 
				
			||||||
    if (rawval >= INT_MIN && rawval <= INT_MAX)
 | 
					    {
 | 
				
			||||||
      rat.num = rawval;
 | 
					        if (rawval >= INT_MIN && rawval <= INT_MAX)
 | 
				
			||||||
    else die("Option %s: Value %ld out of range for signed int\n",
 | 
					            rat.num = rawval;
 | 
				
			||||||
               arg->name, rawval);
 | 
					        else die("Option %s: Value %ld out of range for signed int\n",
 | 
				
			||||||
  } else die("Option %s: Expected / at '%c'\n", arg->name, *endptr);
 | 
					                     arg->name, rawval);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else die("Option %s: Expected / at '%c'\n", arg->name, *endptr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* parse denominator */
 | 
					    /* parse denominator */
 | 
				
			||||||
  rawval = strtol(endptr + 1, &endptr, 10);
 | 
					    rawval = strtol(endptr + 1, &endptr, 10);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (arg->val[0] != '\0' && endptr[0] == '\0') {
 | 
					    if (arg->val[0] != '\0' && endptr[0] == '\0')
 | 
				
			||||||
    if (rawval >= INT_MIN && rawval <= INT_MAX)
 | 
					    {
 | 
				
			||||||
      rat.den = rawval;
 | 
					        if (rawval >= INT_MIN && rawval <= INT_MAX)
 | 
				
			||||||
    else die("Option %s: Value %ld out of range for signed int\n",
 | 
					            rat.den = rawval;
 | 
				
			||||||
               arg->name, rawval);
 | 
					        else die("Option %s: Value %ld out of range for signed int\n",
 | 
				
			||||||
  } else die("Option %s: Invalid character '%c'\n", arg->name, *endptr);
 | 
					                     arg->name, rawval);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else die("Option %s: Invalid character '%c'\n", arg->name, *endptr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return rat;
 | 
					    return rat;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int arg_parse_enum(const struct arg *arg) {
 | 
					int arg_parse_enum(const struct arg *arg)
 | 
				
			||||||
  const struct arg_enum_list *listptr;
 | 
					{
 | 
				
			||||||
  long int                    rawval;
 | 
					    const struct arg_enum_list *listptr;
 | 
				
			||||||
  char                       *endptr;
 | 
					    long int                    rawval;
 | 
				
			||||||
 | 
					    char                       *endptr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* First see if the value can be parsed as a raw value */
 | 
					    /* First see if the value can be parsed as a raw value */
 | 
				
			||||||
  rawval = strtol(arg->val, &endptr, 10);
 | 
					    rawval = strtol(arg->val, &endptr, 10);
 | 
				
			||||||
  if (arg->val[0] != '\0' && endptr[0] == '\0') {
 | 
					    if (arg->val[0] != '\0' && endptr[0] == '\0')
 | 
				
			||||||
    /* Got a raw value, make sure it's valid */
 | 
					    {
 | 
				
			||||||
    for (listptr = arg->def->enums; listptr->name; listptr++)
 | 
					        /* Got a raw value, make sure it's valid */
 | 
				
			||||||
      if (listptr->val == rawval)
 | 
					        for(listptr = arg->def->enums; listptr->name; listptr++)
 | 
				
			||||||
        return rawval;
 | 
					            if(listptr->val == rawval)
 | 
				
			||||||
  }
 | 
					                return rawval;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* Next see if it can be parsed as a string */
 | 
					    /* Next see if it can be parsed as a string */
 | 
				
			||||||
  for (listptr = arg->def->enums; listptr->name; listptr++)
 | 
					    for(listptr = arg->def->enums; listptr->name; listptr++)
 | 
				
			||||||
    if (!strcmp(arg->val, listptr->name))
 | 
					        if(!strcmp(arg->val, listptr->name))
 | 
				
			||||||
      return listptr->val;
 | 
					            return listptr->val;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  die("Option %s: Invalid value '%s'\n", arg->name, arg->val);
 | 
					    die("Option %s: Invalid value '%s'\n", arg->name, arg->val);
 | 
				
			||||||
  return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int arg_parse_enum_or_int(const struct arg *arg) {
 | 
					int arg_parse_enum_or_int(const struct arg *arg)
 | 
				
			||||||
  if (arg->def->enums)
 | 
					{
 | 
				
			||||||
    return arg_parse_enum(arg);
 | 
					    if(arg->def->enums)
 | 
				
			||||||
  return arg_parse_int(arg);
 | 
					        return arg_parse_enum(arg);
 | 
				
			||||||
 | 
					    return arg_parse_int(arg);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										33
									
								
								args.h
									
									
									
									
									
								
							
							
						
						
									
										33
									
								
								args.h
									
									
									
									
									
								
							@@ -13,26 +13,29 @@
 | 
				
			|||||||
#define ARGS_H
 | 
					#define ARGS_H
 | 
				
			||||||
#include <stdio.h>
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct arg {
 | 
					struct arg
 | 
				
			||||||
  char                 **argv;
 | 
					{
 | 
				
			||||||
  const char            *name;
 | 
					    char                 **argv;
 | 
				
			||||||
  const char            *val;
 | 
					    const char            *name;
 | 
				
			||||||
  unsigned int           argv_step;
 | 
					    const char            *val;
 | 
				
			||||||
  const struct arg_def  *def;
 | 
					    unsigned int           argv_step;
 | 
				
			||||||
 | 
					    const struct arg_def  *def;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct arg_enum_list {
 | 
					struct arg_enum_list
 | 
				
			||||||
  const char *name;
 | 
					{
 | 
				
			||||||
  int         val;
 | 
					    const char *name;
 | 
				
			||||||
 | 
					    int         val;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
#define ARG_ENUM_LIST_END {0}
 | 
					#define ARG_ENUM_LIST_END {0}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct arg_def {
 | 
					typedef struct arg_def
 | 
				
			||||||
  const char *short_name;
 | 
					{
 | 
				
			||||||
  const char *long_name;
 | 
					    const char *short_name;
 | 
				
			||||||
  int         has_val;
 | 
					    const char *long_name;
 | 
				
			||||||
  const char *desc;
 | 
					    int         has_val;
 | 
				
			||||||
  const struct arg_enum_list *enums;
 | 
					    const char *desc;
 | 
				
			||||||
 | 
					    const struct arg_enum_list *enums;
 | 
				
			||||||
} arg_def_t;
 | 
					} arg_def_t;
 | 
				
			||||||
#define ARG_DEF(s,l,v,d) {s,l,v,d, NULL}
 | 
					#define ARG_DEF(s,l,v,d) {s,l,v,d, NULL}
 | 
				
			||||||
#define ARG_DEF_ENUM(s,l,v,d,e) {s,l,v,d,e}
 | 
					#define ARG_DEF_ENUM(s,l,v,d,e) {s,l,v,d,e}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,14 +0,0 @@
 | 
				
			|||||||
REM   Copyright (c) 2013 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
REM
 | 
					 | 
				
			||||||
REM   Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
REM   that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
REM   tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
REM   in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
REM   be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
echo on
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
cl /I "./" /I "%1" /nologo /c /DWINAPI_FAMILY=WINAPI_FAMILY_PHONE_APP "%1/vp8/encoder/vp8_asm_enc_offsets.c"
 | 
					 | 
				
			||||||
obj_int_extract.exe rvds "vp8_asm_enc_offsets.obj" > "vp8_asm_enc_offsets.asm"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
cl /I "./" /I "%1" /nologo /c /DWINAPI_FAMILY=WINAPI_FAMILY_PHONE_APP "%1/vpx_scale/vpx_scale_asm_offsets.c"
 | 
					 | 
				
			||||||
obj_int_extract.exe rvds "vpx_scale_asm_offsets.obj" > "vpx_scale_asm_offsets.asm"
 | 
					 | 
				
			||||||
							
								
								
									
										20
									
								
								build/arm-wince-vs8/armasmv5.rules
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								build/arm-wince-vs8/armasmv5.rules
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="utf-8"?>
 | 
				
			||||||
 | 
					<VisualStudioToolFile
 | 
				
			||||||
 | 
						Name="armasm"
 | 
				
			||||||
 | 
						Version="8.00"
 | 
				
			||||||
 | 
						>
 | 
				
			||||||
 | 
						<Rules>
 | 
				
			||||||
 | 
							<CustomBuildRule
 | 
				
			||||||
 | 
								Name="ARMASM"
 | 
				
			||||||
 | 
								DisplayName="Armasm Assembler"
 | 
				
			||||||
 | 
								CommandLine="armasm -o "$(IntDir)\$(InputName).obj" $(InputPath) -32 -ARCH 5
"
 | 
				
			||||||
 | 
								Outputs="$(IntDir)\$(InputName).obj"
 | 
				
			||||||
 | 
								FileExtensions="*.asm"
 | 
				
			||||||
 | 
								ExecutionDescription="Assembling $(InputName).asm"
 | 
				
			||||||
 | 
								ShowOnlyRuleProperties="false"
 | 
				
			||||||
 | 
								>
 | 
				
			||||||
 | 
								<Properties>
 | 
				
			||||||
 | 
								</Properties>
 | 
				
			||||||
 | 
							</CustomBuildRule>
 | 
				
			||||||
 | 
						</Rules>
 | 
				
			||||||
 | 
					</VisualStudioToolFile>
 | 
				
			||||||
							
								
								
									
										20
									
								
								build/arm-wince-vs8/armasmv6.rules
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								build/arm-wince-vs8/armasmv6.rules
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="utf-8"?>
 | 
				
			||||||
 | 
					<VisualStudioToolFile
 | 
				
			||||||
 | 
						Name="armasm"
 | 
				
			||||||
 | 
						Version="8.00"
 | 
				
			||||||
 | 
						>
 | 
				
			||||||
 | 
						<Rules>
 | 
				
			||||||
 | 
							<CustomBuildRule
 | 
				
			||||||
 | 
								Name="ARMASM"
 | 
				
			||||||
 | 
								DisplayName="Armasm Assembler"
 | 
				
			||||||
 | 
								CommandLine="armasm -o "$(IntDir)\$(InputName).obj" $(InputPath) -32 -ARCH 6
"
 | 
				
			||||||
 | 
								Outputs="$(IntDir)\$(InputName).obj"
 | 
				
			||||||
 | 
								FileExtensions="*.asm"
 | 
				
			||||||
 | 
								ExecutionDescription="Assembling $(InputName).asm"
 | 
				
			||||||
 | 
								ShowOnlyRuleProperties="false"
 | 
				
			||||||
 | 
								>
 | 
				
			||||||
 | 
								<Properties>
 | 
				
			||||||
 | 
								</Properties>
 | 
				
			||||||
 | 
							</CustomBuildRule>
 | 
				
			||||||
 | 
						</Rules>
 | 
				
			||||||
 | 
					</VisualStudioToolFile>
 | 
				
			||||||
							
								
								
									
										20
									
								
								build/arm-wince-vs8/armasmxscale.rules
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								build/arm-wince-vs8/armasmxscale.rules
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="utf-8"?>
 | 
				
			||||||
 | 
					<VisualStudioToolFile
 | 
				
			||||||
 | 
						Name="armasm"
 | 
				
			||||||
 | 
						Version="8.00"
 | 
				
			||||||
 | 
						>
 | 
				
			||||||
 | 
						<Rules>
 | 
				
			||||||
 | 
							<CustomBuildRule
 | 
				
			||||||
 | 
								Name="ARMASM"
 | 
				
			||||||
 | 
								DisplayName="Armasm Assembler"
 | 
				
			||||||
 | 
								CommandLine="armasm -o "$(IntDir)\$(InputName).obj" $(InputPath) -32 -cpu XSCALE
"
 | 
				
			||||||
 | 
								Outputs="$(IntDir)\$(InputName).obj"
 | 
				
			||||||
 | 
								FileExtensions="*.asm"
 | 
				
			||||||
 | 
								ExecutionDescription="Assembling $(InputName).asm"
 | 
				
			||||||
 | 
								ShowOnlyRuleProperties="false"
 | 
				
			||||||
 | 
								>
 | 
				
			||||||
 | 
								<Properties>
 | 
				
			||||||
 | 
								</Properties>
 | 
				
			||||||
 | 
							</CustomBuildRule>
 | 
				
			||||||
 | 
						</Rules>
 | 
				
			||||||
 | 
					</VisualStudioToolFile>
 | 
				
			||||||
							
								
								
									
										13
									
								
								build/arm-wince-vs8/obj_int_extract.bat
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								build/arm-wince-vs8/obj_int_extract.bat
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
				
			|||||||
 | 
					@echo off
 | 
				
			||||||
 | 
					REM   Copyright (c) 2010 The WebM project authors. All Rights Reserved.
 | 
				
			||||||
 | 
					REM
 | 
				
			||||||
 | 
					REM   Use of this source code is governed by a BSD-style license
 | 
				
			||||||
 | 
					REM   that can be found in the LICENSE file in the root of the source
 | 
				
			||||||
 | 
					REM   tree. An additional intellectual property rights grant can be found
 | 
				
			||||||
 | 
					REM   in the file PATENTS.  All contributing project authors may
 | 
				
			||||||
 | 
					REM   be found in the AUTHORS file in the root of the source tree.
 | 
				
			||||||
 | 
					echo on
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cl /I ".\\" /I "..\vp6_decoder_sdk" /I "..\vp6_decoder_sdk\vpx_ports" /D "NDEBUG" /D "_WIN32_WCE=0x420" /D "UNDER_CE" /D "WIN32_PLATFORM_PSPC" /D "WINCE" /D "_LIB" /D "ARM" /D "_ARM_" /D "_UNICODE" /D "UNICODE" /FD /EHsc /MT /GS- /fp:fast /GR- /Fo"Pocket_PC_2003__ARMV4_\%1/" /Fd"Pocket_PC_2003__ARMV4_\%1/vc80.pdb" /W3 /nologo /c /TC ..\vp6_decoder_sdk\vp6_decoder\algo\common\arm\dec_asm_offsets_arm.c
 | 
				
			||||||
 | 
					obj_int_extract.exe rvds "Pocket_PC_2003__ARMV4_\%1/dec_asm_offsets_arm.obj"
 | 
				
			||||||
							
								
								
									
										88
									
								
								build/arm-wince-vs8/vpx.sln
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								build/arm-wince-vs8/vpx.sln
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,88 @@
 | 
				
			|||||||
 | 
					Microsoft Visual Studio Solution File, Format Version 9.00
 | 
				
			||||||
 | 
					# Visual Studio 2005
 | 
				
			||||||
 | 
					Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example", "example.vcproj", "{BA5FE66F-38DD-E034-F542-B1578C5FB950}"
 | 
				
			||||||
 | 
						ProjectSection(ProjectDependencies) = postProject
 | 
				
			||||||
 | 
							{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74} = {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}
 | 
				
			||||||
 | 
							{E1360C65-D375-4335-8057-7ED99CC3F9B2} = {E1360C65-D375-4335-8057-7ED99CC3F9B2}
 | 
				
			||||||
 | 
						EndProjectSection
 | 
				
			||||||
 | 
					EndProject
 | 
				
			||||||
 | 
					Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "obj_int_extract", "obj_int_extract.vcproj", "{E1360C65-D375-4335-8057-7ED99CC3F9B2}"
 | 
				
			||||||
 | 
					EndProject
 | 
				
			||||||
 | 
					Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vpx", "vpx.vcproj", "{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}"
 | 
				
			||||||
 | 
						ProjectSection(ProjectDependencies) = postProject
 | 
				
			||||||
 | 
							{E1360C65-D375-4335-8057-7ED99CC3F9B2} = {E1360C65-D375-4335-8057-7ED99CC3F9B2}
 | 
				
			||||||
 | 
						EndProjectSection
 | 
				
			||||||
 | 
					EndProject
 | 
				
			||||||
 | 
					Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xma", "xma.vcproj", "{A955FC4A-73F1-44F7-135E-30D84D32F022}"
 | 
				
			||||||
 | 
						ProjectSection(ProjectDependencies) = postProject
 | 
				
			||||||
 | 
							{E1360C65-D375-4335-8057-7ED99CC3F9B2} = {E1360C65-D375-4335-8057-7ED99CC3F9B2}
 | 
				
			||||||
 | 
							{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74} = {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}
 | 
				
			||||||
 | 
						EndProjectSection
 | 
				
			||||||
 | 
					EndProject
 | 
				
			||||||
 | 
					Global
 | 
				
			||||||
 | 
						GlobalSection(SolutionConfigurationPlatforms) = preSolution
 | 
				
			||||||
 | 
							Debug|Mixed Platforms = Debug|Mixed Platforms
 | 
				
			||||||
 | 
							Debug|Pocket PC 2003 (ARMV4) = Debug|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							Debug|Win32 = Debug|Win32
 | 
				
			||||||
 | 
							Release|Mixed Platforms = Release|Mixed Platforms
 | 
				
			||||||
 | 
							Release|Pocket PC 2003 (ARMV4) = Release|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							Release|Win32 = Release|Win32
 | 
				
			||||||
 | 
						EndGlobalSection
 | 
				
			||||||
 | 
						GlobalSection(ProjectConfigurationPlatforms) = postSolution
 | 
				
			||||||
 | 
							{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Debug|Mixed Platforms.ActiveCfg = Debug|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Debug|Mixed Platforms.Build.0 = Debug|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Debug|Mixed Platforms.Deploy.0 = Debug|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Debug|Pocket PC 2003 (ARMV4).ActiveCfg = Debug|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Debug|Pocket PC 2003 (ARMV4).Build.0 = Debug|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Debug|Pocket PC 2003 (ARMV4).Deploy.0 = Debug|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Debug|Win32.ActiveCfg = Debug|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Release|Mixed Platforms.ActiveCfg = Release|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Release|Mixed Platforms.Build.0 = Release|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Release|Mixed Platforms.Deploy.0 = Release|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Release|Pocket PC 2003 (ARMV4).ActiveCfg = Release|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Release|Pocket PC 2003 (ARMV4).Build.0 = Release|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Release|Pocket PC 2003 (ARMV4).Deploy.0 = Release|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Release|Win32.ActiveCfg = Release|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							{E1360C65-D375-4335-8057-7ED99CC3F9B2}.Debug|Mixed Platforms.ActiveCfg = Release|Win32
 | 
				
			||||||
 | 
							{E1360C65-D375-4335-8057-7ED99CC3F9B2}.Debug|Mixed Platforms.Build.0 = Release|Win32
 | 
				
			||||||
 | 
							{E1360C65-D375-4335-8057-7ED99CC3F9B2}.Debug|Pocket PC 2003 (ARMV4).ActiveCfg = Release|Win32
 | 
				
			||||||
 | 
							{E1360C65-D375-4335-8057-7ED99CC3F9B2}.Debug|Win32.ActiveCfg = Release|Win32
 | 
				
			||||||
 | 
							{E1360C65-D375-4335-8057-7ED99CC3F9B2}.Debug|Win32.Build.0 = Release|Win32
 | 
				
			||||||
 | 
							{E1360C65-D375-4335-8057-7ED99CC3F9B2}.Release|Mixed Platforms.ActiveCfg = Release|Win32
 | 
				
			||||||
 | 
							{E1360C65-D375-4335-8057-7ED99CC3F9B2}.Release|Mixed Platforms.Build.0 = Release|Win32
 | 
				
			||||||
 | 
							{E1360C65-D375-4335-8057-7ED99CC3F9B2}.Release|Pocket PC 2003 (ARMV4).ActiveCfg = Release|Win32
 | 
				
			||||||
 | 
							{E1360C65-D375-4335-8057-7ED99CC3F9B2}.Release|Win32.ActiveCfg = Release|Win32
 | 
				
			||||||
 | 
							{E1360C65-D375-4335-8057-7ED99CC3F9B2}.Release|Win32.Build.0 = Release|Win32
 | 
				
			||||||
 | 
							{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|Mixed Platforms.ActiveCfg = Debug|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|Mixed Platforms.Build.0 = Debug|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|Mixed Platforms.Deploy.0 = Debug|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|Pocket PC 2003 (ARMV4).ActiveCfg = Debug|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|Pocket PC 2003 (ARMV4).Build.0 = Debug|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|Pocket PC 2003 (ARMV4).Deploy.0 = Debug|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|Win32.ActiveCfg = Debug|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|Mixed Platforms.ActiveCfg = Release|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|Mixed Platforms.Build.0 = Release|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|Mixed Platforms.Deploy.0 = Release|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|Pocket PC 2003 (ARMV4).ActiveCfg = Release|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|Pocket PC 2003 (ARMV4).Build.0 = Release|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|Pocket PC 2003 (ARMV4).Deploy.0 = Release|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|Win32.ActiveCfg = Release|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							{A955FC4A-73F1-44F7-135E-30D84D32F022}.Debug|Mixed Platforms.ActiveCfg = Debug|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							{A955FC4A-73F1-44F7-135E-30D84D32F022}.Debug|Mixed Platforms.Build.0 = Debug|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							{A955FC4A-73F1-44F7-135E-30D84D32F022}.Debug|Mixed Platforms.Deploy.0 = Debug|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							{A955FC4A-73F1-44F7-135E-30D84D32F022}.Debug|Pocket PC 2003 (ARMV4).ActiveCfg = Debug|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							{A955FC4A-73F1-44F7-135E-30D84D32F022}.Debug|Pocket PC 2003 (ARMV4).Build.0 = Debug|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							{A955FC4A-73F1-44F7-135E-30D84D32F022}.Debug|Pocket PC 2003 (ARMV4).Deploy.0 = Debug|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							{A955FC4A-73F1-44F7-135E-30D84D32F022}.Debug|Win32.ActiveCfg = Debug|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							{A955FC4A-73F1-44F7-135E-30D84D32F022}.Release|Mixed Platforms.ActiveCfg = Release|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							{A955FC4A-73F1-44F7-135E-30D84D32F022}.Release|Mixed Platforms.Build.0 = Release|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							{A955FC4A-73F1-44F7-135E-30D84D32F022}.Release|Mixed Platforms.Deploy.0 = Release|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							{A955FC4A-73F1-44F7-135E-30D84D32F022}.Release|Pocket PC 2003 (ARMV4).ActiveCfg = Release|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							{A955FC4A-73F1-44F7-135E-30D84D32F022}.Release|Pocket PC 2003 (ARMV4).Build.0 = Release|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							{A955FC4A-73F1-44F7-135E-30D84D32F022}.Release|Pocket PC 2003 (ARMV4).Deploy.0 = Release|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
							{A955FC4A-73F1-44F7-135E-30D84D32F022}.Release|Win32.ActiveCfg = Release|Pocket PC 2003 (ARMV4)
 | 
				
			||||||
 | 
						EndGlobalSection
 | 
				
			||||||
 | 
						GlobalSection(SolutionProperties) = preSolution
 | 
				
			||||||
 | 
							HideSolutionNode = FALSE
 | 
				
			||||||
 | 
						EndGlobalSection
 | 
				
			||||||
 | 
					EndGlobal
 | 
				
			||||||
@@ -1,212 +0,0 @@
 | 
				
			|||||||
##
 | 
					 | 
				
			||||||
##  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
##
 | 
					 | 
				
			||||||
##  Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
##  that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
##  tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
##  in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
##  be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
##
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# This file is to be used for compiling libvpx for Android using the NDK.
 | 
					 | 
				
			||||||
# In an Android project place a libvpx checkout in the jni directory.
 | 
					 | 
				
			||||||
# Run the configure script from the jni directory.  Base libvpx
 | 
					 | 
				
			||||||
# encoder/decoder configuration will look similar to:
 | 
					 | 
				
			||||||
# ./libvpx/configure --target=armv7-android-gcc --disable-examples \
 | 
					 | 
				
			||||||
#                    --sdk-path=/opt/android-ndk-r6b/
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# When targeting Android, realtime-only is enabled by default.  This can
 | 
					 | 
				
			||||||
# be overridden by adding the command line flag:
 | 
					 | 
				
			||||||
#  --disable-realtime-only
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# This will create .mk files that contain variables that contain the
 | 
					 | 
				
			||||||
# source files to compile.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# Place an Android.mk file in the jni directory that references the
 | 
					 | 
				
			||||||
# Android.mk file in the libvpx directory:
 | 
					 | 
				
			||||||
# LOCAL_PATH := $(call my-dir)
 | 
					 | 
				
			||||||
# include $(CLEAR_VARS)
 | 
					 | 
				
			||||||
# include jni/libvpx/build/make/Android.mk
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# There are currently two TARGET_ARCH_ABI targets for ARM.
 | 
					 | 
				
			||||||
# armeabi and armeabi-v7a.  armeabi-v7a is selected by creating an
 | 
					 | 
				
			||||||
# Application.mk in the jni directory that contains:
 | 
					 | 
				
			||||||
# APP_ABI := armeabi-v7a
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# By default libvpx will detect at runtime the existance of NEON extension.
 | 
					 | 
				
			||||||
# For this we import the 'cpufeatures' module from the NDK sources.
 | 
					 | 
				
			||||||
# libvpx can also be configured without this runtime detection method.
 | 
					 | 
				
			||||||
# Configuring with --disable-runtime-cpu-detect will assume presence of NEON.
 | 
					 | 
				
			||||||
# Configuring with --disable-runtime-cpu-detect --disable-neon will remove any
 | 
					 | 
				
			||||||
# NEON dependency.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# To change to building armeabi, run ./libvpx/configure again, but with
 | 
					 | 
				
			||||||
# --target=arm5te-android-gcc and modify the Application.mk file to
 | 
					 | 
				
			||||||
# set APP_ABI := armeabi
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# Running ndk-build will build libvpx and include it in your project.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
CONFIG_DIR := $(LOCAL_PATH)/
 | 
					 | 
				
			||||||
LIBVPX_PATH := $(LOCAL_PATH)/libvpx
 | 
					 | 
				
			||||||
ASM_CNV_PATH_LOCAL := $(TARGET_ARCH_ABI)/ads2gas
 | 
					 | 
				
			||||||
ASM_CNV_PATH := $(LOCAL_PATH)/$(ASM_CNV_PATH_LOCAL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Makefiles created by the libvpx configure process
 | 
					 | 
				
			||||||
# This will need to be fixed to handle x86.
 | 
					 | 
				
			||||||
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
 | 
					 | 
				
			||||||
  include $(CONFIG_DIR)libs-armv7-android-gcc.mk
 | 
					 | 
				
			||||||
else
 | 
					 | 
				
			||||||
  include $(CONFIG_DIR)libs-armv5te-android-gcc.mk
 | 
					 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Rule that is normally in Makefile created by libvpx
 | 
					 | 
				
			||||||
# configure.  Used to filter out source files based on configuration.
 | 
					 | 
				
			||||||
enabled=$(filter-out $($(1)-no),$($(1)-yes))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Override the relative path that is defined by the libvpx
 | 
					 | 
				
			||||||
# configure process
 | 
					 | 
				
			||||||
SRC_PATH_BARE := $(LIBVPX_PATH)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Include the list of files to be built
 | 
					 | 
				
			||||||
include $(LIBVPX_PATH)/libs.mk
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Want arm, not thumb, optimized
 | 
					 | 
				
			||||||
LOCAL_ARM_MODE := arm
 | 
					 | 
				
			||||||
LOCAL_CFLAGS := -O3
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# -----------------------------------------------------------------------------
 | 
					 | 
				
			||||||
# Template  : asm_offsets_template
 | 
					 | 
				
			||||||
# Arguments : 1: assembly offsets file to be created
 | 
					 | 
				
			||||||
#             2: c file to base assembly offsets on
 | 
					 | 
				
			||||||
# Returns   : None
 | 
					 | 
				
			||||||
# Usage     : $(eval $(call asm_offsets_template,<asmfile>, <srcfile>
 | 
					 | 
				
			||||||
# Rationale : Create offsets at compile time using for structures that are
 | 
					 | 
				
			||||||
#             defined in c, but used in assembly functions.
 | 
					 | 
				
			||||||
# -----------------------------------------------------------------------------
 | 
					 | 
				
			||||||
define asm_offsets_template
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
_SRC:=$(2)
 | 
					 | 
				
			||||||
_OBJ:=$(ASM_CNV_PATH)/$$(notdir $(2)).S
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
_FLAGS = $$($$(my)CFLAGS) \
 | 
					 | 
				
			||||||
          $$(call get-src-file-target-cflags,$(2)) \
 | 
					 | 
				
			||||||
          $$(call host-c-includes,$$(LOCAL_C_INCLUDES) $$(CONFIG_DIR)) \
 | 
					 | 
				
			||||||
          $$(LOCAL_CFLAGS) \
 | 
					 | 
				
			||||||
          $$(NDK_APP_CFLAGS) \
 | 
					 | 
				
			||||||
          $$(call host-c-includes,$$($(my)C_INCLUDES)) \
 | 
					 | 
				
			||||||
          -DINLINE_ASM \
 | 
					 | 
				
			||||||
          -S \
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
_TEXT = "Compile $$(call get-src-file-text,$(2))"
 | 
					 | 
				
			||||||
_CC   = $$(TARGET_CC)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$$(eval $$(call ev-build-file))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(1) : $$(_OBJ) $(2)
 | 
					 | 
				
			||||||
	@mkdir -p $$(dir $$@)
 | 
					 | 
				
			||||||
	@grep $(OFFSET_PATTERN) $$< | tr -d '\#' | $(CONFIG_DIR)$(ASM_CONVERSION) > $$@
 | 
					 | 
				
			||||||
endef
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Use ads2gas script to convert from RVCT format to GAS format.  This passes
 | 
					 | 
				
			||||||
#  puts the processed file under $(ASM_CNV_PATH).  Local clean rule
 | 
					 | 
				
			||||||
#  to handle removing these
 | 
					 | 
				
			||||||
ifeq ($(CONFIG_VP8_ENCODER), yes)
 | 
					 | 
				
			||||||
  ASM_CNV_OFFSETS_DEPEND += $(ASM_CNV_PATH)/vp8_asm_enc_offsets.asm
 | 
					 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
ifeq ($(HAVE_NEON), yes)
 | 
					 | 
				
			||||||
  ASM_CNV_OFFSETS_DEPEND += $(ASM_CNV_PATH)/vpx_scale_asm_offsets.asm
 | 
					 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.PRECIOUS: %.asm.s
 | 
					 | 
				
			||||||
$(ASM_CNV_PATH)/libvpx/%.asm.s: $(LIBVPX_PATH)/%.asm $(ASM_CNV_OFFSETS_DEPEND)
 | 
					 | 
				
			||||||
	@mkdir -p $(dir $@)
 | 
					 | 
				
			||||||
	@$(CONFIG_DIR)$(ASM_CONVERSION) <$< > $@
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# For building *_rtcd.h, which have rules in libs.mk
 | 
					 | 
				
			||||||
TGT_ISA:=$(word 1, $(subst -, ,$(TOOLCHAIN)))
 | 
					 | 
				
			||||||
target := libs
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
LOCAL_SRC_FILES += vpx_config.c
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Remove duplicate entries
 | 
					 | 
				
			||||||
CODEC_SRCS_UNIQUE = $(sort $(CODEC_SRCS))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Pull out C files.  vpx_config.c is in the immediate directory and
 | 
					 | 
				
			||||||
# so it does not need libvpx/ prefixed like the rest of the source files.
 | 
					 | 
				
			||||||
CODEC_SRCS_C = $(filter %.c, $(CODEC_SRCS_UNIQUE))
 | 
					 | 
				
			||||||
LOCAL_CODEC_SRCS_C = $(filter-out vpx_config.c, $(CODEC_SRCS_C))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
LOCAL_SRC_FILES += $(foreach file, $(LOCAL_CODEC_SRCS_C), libvpx/$(file))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Pull out assembly files, splitting NEON from the rest.  This is
 | 
					 | 
				
			||||||
# done to specify that the NEON assembly files use NEON assembler flags.
 | 
					 | 
				
			||||||
CODEC_SRCS_ASM_ALL = $(filter %.asm.s, $(CODEC_SRCS_UNIQUE))
 | 
					 | 
				
			||||||
CODEC_SRCS_ASM = $(foreach v, \
 | 
					 | 
				
			||||||
                 $(CODEC_SRCS_ASM_ALL), \
 | 
					 | 
				
			||||||
                 $(if $(findstring neon,$(v)),,$(v)))
 | 
					 | 
				
			||||||
CODEC_SRCS_ASM_ADS2GAS = $(patsubst %.s, \
 | 
					 | 
				
			||||||
                         $(ASM_CNV_PATH_LOCAL)/libvpx/%.s, \
 | 
					 | 
				
			||||||
                         $(CODEC_SRCS_ASM))
 | 
					 | 
				
			||||||
LOCAL_SRC_FILES += $(CODEC_SRCS_ASM_ADS2GAS)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
 | 
					 | 
				
			||||||
  CODEC_SRCS_ASM_NEON = $(foreach v, \
 | 
					 | 
				
			||||||
                        $(CODEC_SRCS_ASM_ALL),\
 | 
					 | 
				
			||||||
                        $(if $(findstring neon,$(v)),$(v),))
 | 
					 | 
				
			||||||
  CODEC_SRCS_ASM_NEON_ADS2GAS = $(patsubst %.s, \
 | 
					 | 
				
			||||||
                                $(ASM_CNV_PATH_LOCAL)/libvpx/%.s, \
 | 
					 | 
				
			||||||
                                $(CODEC_SRCS_ASM_NEON))
 | 
					 | 
				
			||||||
  LOCAL_SRC_FILES += $(patsubst %.s, \
 | 
					 | 
				
			||||||
                     %.s.neon, \
 | 
					 | 
				
			||||||
                     $(CODEC_SRCS_ASM_NEON_ADS2GAS))
 | 
					 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
LOCAL_CFLAGS += \
 | 
					 | 
				
			||||||
    -DHAVE_CONFIG_H=vpx_config.h \
 | 
					 | 
				
			||||||
    -I$(LIBVPX_PATH) \
 | 
					 | 
				
			||||||
    -I$(ASM_CNV_PATH)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
LOCAL_MODULE := libvpx
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
LOCAL_LDLIBS := -llog
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
ifeq ($(CONFIG_RUNTIME_CPU_DETECT),yes)
 | 
					 | 
				
			||||||
  LOCAL_STATIC_LIBRARIES := cpufeatures
 | 
					 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Add a dependency to force generation of the RTCD files.
 | 
					 | 
				
			||||||
ifeq ($(CONFIG_VP8), yes)
 | 
					 | 
				
			||||||
$(foreach file, $(LOCAL_SRC_FILES), $(LOCAL_PATH)/$(file)): vp8_rtcd.h
 | 
					 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
ifeq ($(CONFIG_VP9), yes)
 | 
					 | 
				
			||||||
$(foreach file, $(LOCAL_SRC_FILES), $(LOCAL_PATH)/$(file)): vp9_rtcd.h
 | 
					 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
$(foreach file, $(LOCAL_SRC_FILES), $(LOCAL_PATH)/$(file)): vpx_scale_rtcd.h
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.PHONY: clean
 | 
					 | 
				
			||||||
clean:
 | 
					 | 
				
			||||||
	@echo "Clean: ads2gas files [$(TARGET_ARCH_ABI)]"
 | 
					 | 
				
			||||||
	@$(RM) $(CODEC_SRCS_ASM_ADS2GAS) $(CODEC_SRCS_ASM_NEON_ADS2GAS)
 | 
					 | 
				
			||||||
	@$(RM) $(patsubst %.asm, %.*, $(ASM_CNV_OFFSETS_DEPEND))
 | 
					 | 
				
			||||||
	@$(RM) -r $(ASM_CNV_PATH)
 | 
					 | 
				
			||||||
	@$(RM) $(CLEAN-OBJS)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
include $(BUILD_SHARED_LIBRARY)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
ifeq ($(HAVE_NEON), yes)
 | 
					 | 
				
			||||||
  $(eval $(call asm_offsets_template,\
 | 
					 | 
				
			||||||
    $(ASM_CNV_PATH)/vpx_scale_asm_offsets.asm, \
 | 
					 | 
				
			||||||
    $(LIBVPX_PATH)/vpx_scale/vpx_scale_asm_offsets.c))
 | 
					 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
ifeq ($(CONFIG_VP8_ENCODER), yes)
 | 
					 | 
				
			||||||
  $(eval $(call asm_offsets_template,\
 | 
					 | 
				
			||||||
    $(ASM_CNV_PATH)/vp8_asm_enc_offsets.asm, \
 | 
					 | 
				
			||||||
    $(LIBVPX_PATH)/vp8/encoder/vp8_asm_enc_offsets.c))
 | 
					 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
ifeq ($(CONFIG_RUNTIME_CPU_DETECT),yes)
 | 
					 | 
				
			||||||
$(call import-module,cpufeatures)
 | 
					 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
							
								
								
									
										100
									
								
								build/make/Makefile
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										100
									
								
								build/make/Makefile
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							@@ -20,8 +20,6 @@ ifeq ($(target),)
 | 
				
			|||||||
all: .DEFAULT
 | 
					all: .DEFAULT
 | 
				
			||||||
clean:: .DEFAULT
 | 
					clean:: .DEFAULT
 | 
				
			||||||
install:: .DEFAULT
 | 
					install:: .DEFAULT
 | 
				
			||||||
test:: .DEFAULT
 | 
					 | 
				
			||||||
testdata:: .DEFAULT
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Note: md5sum is not installed on OS X, but openssl is. Openssl may not be
 | 
					# Note: md5sum is not installed on OS X, but openssl is. Openssl may not be
 | 
				
			||||||
@@ -67,27 +65,25 @@ endif
 | 
				
			|||||||
BUILD_ROOT?=.
 | 
					BUILD_ROOT?=.
 | 
				
			||||||
VPATH=$(SRC_PATH_BARE)
 | 
					VPATH=$(SRC_PATH_BARE)
 | 
				
			||||||
CFLAGS+=-I$(BUILD_PFX)$(BUILD_ROOT) -I$(SRC_PATH)
 | 
					CFLAGS+=-I$(BUILD_PFX)$(BUILD_ROOT) -I$(SRC_PATH)
 | 
				
			||||||
CXXFLAGS+=-I$(BUILD_PFX)$(BUILD_ROOT) -I$(SRC_PATH)
 | 
					 | 
				
			||||||
ASFLAGS+=-I$(BUILD_PFX)$(BUILD_ROOT)/ -I$(SRC_PATH)/
 | 
					ASFLAGS+=-I$(BUILD_PFX)$(BUILD_ROOT)/ -I$(SRC_PATH)/
 | 
				
			||||||
DIST_DIR?=dist
 | 
					DIST_DIR?=dist
 | 
				
			||||||
HOSTCC?=gcc
 | 
					HOSTCC?=gcc
 | 
				
			||||||
TGT_ISA:=$(word 1, $(subst -, ,$(TOOLCHAIN)))
 | 
					TGT_ISA:=$(word 1, $(subst -, ,$(TOOLCHAIN)))
 | 
				
			||||||
TGT_OS:=$(word 2, $(subst -, ,$(TOOLCHAIN)))
 | 
					TGT_OS:=$(word 2, $(subst -, ,$(TOOLCHAIN)))
 | 
				
			||||||
TGT_CC:=$(word 3, $(subst -, ,$(TOOLCHAIN)))
 | 
					TGT_CC:=$(word 3, $(subst -, ,$(TOOLCHAIN)))
 | 
				
			||||||
quiet:=$(if $(or $(verbose), $(V)),, yes)
 | 
					quiet:=$(if $(verbose),,yes)
 | 
				
			||||||
qexec=$(if $(quiet),@)
 | 
					qexec=$(if $(quiet),@)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Cancel built-in implicit rules
 | 
					# Cancel built-in implicit rules
 | 
				
			||||||
%: %.o
 | 
					%: %.o
 | 
				
			||||||
%.asm:
 | 
					%.asm:
 | 
				
			||||||
%.a:
 | 
					%.a:
 | 
				
			||||||
%: %.cc
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# Common rules"
 | 
					# Common rules"
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
.PHONY: all
 | 
					.PHONY: all-$(target)
 | 
				
			||||||
all:
 | 
					all-$(target):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.PHONY: clean
 | 
					.PHONY: clean
 | 
				
			||||||
clean::
 | 
					clean::
 | 
				
			||||||
@@ -98,44 +94,15 @@ clean::
 | 
				
			|||||||
dist:
 | 
					dist:
 | 
				
			||||||
.PHONY: install
 | 
					.PHONY: install
 | 
				
			||||||
install::
 | 
					install::
 | 
				
			||||||
.PHONY: test
 | 
					 | 
				
			||||||
test::
 | 
					 | 
				
			||||||
.PHONY: testdata
 | 
					 | 
				
			||||||
testdata::
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Add compiler flags for intrinsic files
 | 
					 | 
				
			||||||
$(BUILD_PFX)%_mmx.c.d: CFLAGS += -mmmx
 | 
					 | 
				
			||||||
$(BUILD_PFX)%_mmx.c.o: CFLAGS += -mmmx
 | 
					 | 
				
			||||||
$(BUILD_PFX)%_sse2.c.d: CFLAGS += -msse2
 | 
					 | 
				
			||||||
$(BUILD_PFX)%_sse2.c.o: CFLAGS += -msse2
 | 
					 | 
				
			||||||
$(BUILD_PFX)%_sse3.c.d: CFLAGS += -msse3
 | 
					 | 
				
			||||||
$(BUILD_PFX)%_sse3.c.o: CFLAGS += -msse3
 | 
					 | 
				
			||||||
$(BUILD_PFX)%_ssse3.c.d: CFLAGS += -mssse3
 | 
					 | 
				
			||||||
$(BUILD_PFX)%_ssse3.c.o: CFLAGS += -mssse3
 | 
					 | 
				
			||||||
$(BUILD_PFX)%_sse4.c.d: CFLAGS += -msse4.1
 | 
					 | 
				
			||||||
$(BUILD_PFX)%_sse4.c.o: CFLAGS += -msse4.1
 | 
					 | 
				
			||||||
$(BUILD_PFX)%_avx.c.d: CFLAGS += -mavx
 | 
					 | 
				
			||||||
$(BUILD_PFX)%_avx.c.o: CFLAGS += -mavx
 | 
					 | 
				
			||||||
$(BUILD_PFX)%_avx2.c.d: CFLAGS += -mavx2
 | 
					 | 
				
			||||||
$(BUILD_PFX)%_avx2.c.o: CFLAGS += -mavx2
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
$(BUILD_PFX)%.c.d: %.c
 | 
					$(BUILD_PFX)%.c.d: %.c
 | 
				
			||||||
	$(if $(quiet),@echo "    [DEP] $@")
 | 
						$(if $(quiet),@echo "    [DEP] $@")
 | 
				
			||||||
	$(qexec)mkdir -p $(dir $@)
 | 
						$(qexec)mkdir -p $(dir $@)
 | 
				
			||||||
	$(qexec)$(CC) $(INTERNAL_CFLAGS) $(CFLAGS) -M $< | $(fmt_deps) > $@
 | 
						$(qexec)$(CC) $(CFLAGS) -M $< | $(fmt_deps) > $@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$(BUILD_PFX)%.c.o: %.c
 | 
					$(BUILD_PFX)%.c.o: %.c
 | 
				
			||||||
	$(if $(quiet),@echo "    [CC] $@")
 | 
						$(if $(quiet),@echo "    [CC] $@")
 | 
				
			||||||
	$(qexec)$(CC) $(INTERNAL_CFLAGS) $(CFLAGS) -c -o $@ $<
 | 
						$(qexec)$(CC) $(CFLAGS) -c -o $@ $<
 | 
				
			||||||
 | 
					 | 
				
			||||||
$(BUILD_PFX)%.cc.d: %.cc
 | 
					 | 
				
			||||||
	$(if $(quiet),@echo "    [DEP] $@")
 | 
					 | 
				
			||||||
	$(qexec)mkdir -p $(dir $@)
 | 
					 | 
				
			||||||
	$(qexec)$(CXX) $(INTERNAL_CFLAGS) $(CXXFLAGS) -M $< | $(fmt_deps) > $@
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(BUILD_PFX)%.cc.o: %.cc
 | 
					 | 
				
			||||||
	$(if $(quiet),@echo "    [CXX] $@")
 | 
					 | 
				
			||||||
	$(qexec)$(CXX) $(INTERNAL_CFLAGS) $(CXXFLAGS) -c -o $@ $<
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
$(BUILD_PFX)%.asm.d: %.asm
 | 
					$(BUILD_PFX)%.asm.d: %.asm
 | 
				
			||||||
	$(if $(quiet),@echo "    [DEP] $@")
 | 
						$(if $(quiet),@echo "    [DEP] $@")
 | 
				
			||||||
@@ -157,12 +124,6 @@ $(BUILD_PFX)%.s.o: %.s
 | 
				
			|||||||
	$(if $(quiet),@echo "    [AS] $@")
 | 
						$(if $(quiet),@echo "    [AS] $@")
 | 
				
			||||||
	$(qexec)$(AS) $(ASFLAGS) -o $@ $<
 | 
						$(qexec)$(AS) $(ASFLAGS) -o $@ $<
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.PRECIOUS: %.c.S
 | 
					 | 
				
			||||||
%.c.S: CFLAGS += -DINLINE_ASM
 | 
					 | 
				
			||||||
$(BUILD_PFX)%.c.S: %.c
 | 
					 | 
				
			||||||
	$(if $(quiet),@echo "    [GEN] $@")
 | 
					 | 
				
			||||||
	$(qexec)$(CC) -S $(CFLAGS) -o $@ $<
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.PRECIOUS: %.asm.s
 | 
					.PRECIOUS: %.asm.s
 | 
				
			||||||
$(BUILD_PFX)%.asm.s: %.asm
 | 
					$(BUILD_PFX)%.asm.s: %.asm
 | 
				
			||||||
	$(if $(quiet),@echo "    [ASM CONVERSION] $@")
 | 
						$(if $(quiet),@echo "    [ASM CONVERSION] $@")
 | 
				
			||||||
@@ -191,8 +152,8 @@ endif
 | 
				
			|||||||
# Rule to extract assembly constants from C sources
 | 
					# Rule to extract assembly constants from C sources
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
obj_int_extract: build/make/obj_int_extract.c
 | 
					obj_int_extract: build/make/obj_int_extract.c
 | 
				
			||||||
	$(if $(quiet),@echo "    [HOSTCC] $@")
 | 
						$(if $(quiet),echo "    [HOSTCC] $@")
 | 
				
			||||||
	$(qexec)$(HOSTCC) -I. -I$(SRC_PATH_BARE) -o $@ $<
 | 
						$(qexec)$(HOSTCC) -I. -o $@ $<
 | 
				
			||||||
CLEAN-OBJS += obj_int_extract
 | 
					CLEAN-OBJS += obj_int_extract
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
@@ -208,7 +169,7 @@ cond_enabled=$(if $(filter yes,$($(1))), $(call enabled,$(2)))
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
find_file1=$(word 1,$(wildcard $(subst //,/,$(addsuffix /$(1),$(2)))))
 | 
					find_file1=$(word 1,$(wildcard $(subst //,/,$(addsuffix /$(1),$(2)))))
 | 
				
			||||||
find_file=$(foreach f,$(1),$(call find_file1,$(strip $(f)),$(strip $(2))) )
 | 
					find_file=$(foreach f,$(1),$(call find_file1,$(strip $(f)),$(strip $(2))) )
 | 
				
			||||||
obj_pats=.c=.c.o $(AS_SFX)=$(AS_SFX).o .cc=.cc.o
 | 
					obj_pats=.c=.c.o $(AS_SFX)=$(AS_SFX).o
 | 
				
			||||||
objs=$(addprefix $(BUILD_PFX),$(foreach p,$(obj_pats),$(filter %.o,$(1:$(p))) ))
 | 
					objs=$(addprefix $(BUILD_PFX),$(foreach p,$(obj_pats),$(filter %.o,$(1:$(p))) ))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
install_map_templates=$(eval $(call install_map_template,$(1),$(2)))
 | 
					install_map_templates=$(eval $(call install_map_template,$(1),$(2)))
 | 
				
			||||||
@@ -227,13 +188,7 @@ define linker_template
 | 
				
			|||||||
$(1): $(filter-out -%,$(2))
 | 
					$(1): $(filter-out -%,$(2))
 | 
				
			||||||
$(1):
 | 
					$(1):
 | 
				
			||||||
	$(if $(quiet),@echo    "    [LD] $$@")
 | 
						$(if $(quiet),@echo    "    [LD] $$@")
 | 
				
			||||||
	$(qexec)$$(LD) $$(strip $$(INTERNAL_LDFLAGS) $$(LDFLAGS) -o $$@ $(2) $(3) $$(extralibs))
 | 
						$(qexec)$$(LD) $$(strip $$(LDFLAGS) -o $$@ $(2) $(3) $$(extralibs))
 | 
				
			||||||
endef
 | 
					 | 
				
			||||||
define linkerxx_template
 | 
					 | 
				
			||||||
$(1): $(filter-out -%,$(2))
 | 
					 | 
				
			||||||
$(1):
 | 
					 | 
				
			||||||
	$(if $(quiet),@echo    "    [LD] $$@")
 | 
					 | 
				
			||||||
	$(qexec)$$(CXX) $$(strip $$(INTERNAL_LDFLAGS) $$(LDFLAGS) -o $$@ $(2) $(3) $$(extralibs))
 | 
					 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
# make-3.80 has a bug with expanding large input strings to the eval function,
 | 
					# make-3.80 has a bug with expanding large input strings to the eval function,
 | 
				
			||||||
# which was triggered in some cases by the following component of
 | 
					# which was triggered in some cases by the following component of
 | 
				
			||||||
@@ -269,25 +224,10 @@ $(1):
 | 
				
			|||||||
	$(if $(quiet),@echo "    [LD] $$@")
 | 
						$(if $(quiet),@echo "    [LD] $$@")
 | 
				
			||||||
	$(qexec)$$(LD) -shared $$(LDFLAGS) \
 | 
						$(qexec)$$(LD) -shared $$(LDFLAGS) \
 | 
				
			||||||
            -Wl,--no-undefined -Wl,-soname,$$(SONAME) \
 | 
					            -Wl,--no-undefined -Wl,-soname,$$(SONAME) \
 | 
				
			||||||
            -Wl,--version-script,$$(EXPORTS_FILE) -o $$@ \
 | 
					            -Wl,--version-script,$$(SO_VERSION_SCRIPT) -o $$@ \
 | 
				
			||||||
            $$(filter %.o,$$^) $$(extralibs)
 | 
					            $$(filter %.o,$$?) $$(extralibs)
 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define dl_template
 | 
					 | 
				
			||||||
# Not using a pattern rule here because we don't want to generate empty
 | 
					 | 
				
			||||||
# archives when they are listed as a dependency in files not responsible
 | 
					 | 
				
			||||||
# for creating them.
 | 
					 | 
				
			||||||
$(1):
 | 
					 | 
				
			||||||
	$(if $(quiet),@echo "    [LD] $$@")
 | 
					 | 
				
			||||||
	$(qexec)$$(LD) -dynamiclib $$(LDFLAGS) \
 | 
					 | 
				
			||||||
	    -exported_symbols_list $$(EXPORTS_FILE) \
 | 
					 | 
				
			||||||
        -Wl,-headerpad_max_install_names,-compatibility_version,1.0,-current_version,$$(VERSION_MAJOR) \
 | 
					 | 
				
			||||||
        -o $$@ \
 | 
					 | 
				
			||||||
        $$(filter %.o,$$^) $$(extralibs)
 | 
					 | 
				
			||||||
endef
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
define lipo_lib_template
 | 
					define lipo_lib_template
 | 
				
			||||||
$(1): $(addsuffix /$(1),$(FAT_ARCHS))
 | 
					$(1): $(addsuffix /$(1),$(FAT_ARCHS))
 | 
				
			||||||
	$(if $(quiet),@echo "    [LIPO] $$@")
 | 
						$(if $(quiet),@echo "    [LIPO] $$@")
 | 
				
			||||||
@@ -315,7 +255,7 @@ ifeq ($(filter clean,$(MAKECMDGOALS)),)
 | 
				
			|||||||
endif
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# Configuration dependent rules
 | 
					# Configuration dependant rules
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
$(call pairmap,install_map_templates,$(INSTALL_MAPS))
 | 
					$(call pairmap,install_map_templates,$(INSTALL_MAPS))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -352,7 +292,6 @@ LIBS=$(call enabled,LIBS)
 | 
				
			|||||||
	@touch $@
 | 
						@touch $@
 | 
				
			||||||
$(foreach lib,$(filter %_g.a,$(LIBS)),$(eval $(call archive_template,$(lib))))
 | 
					$(foreach lib,$(filter %_g.a,$(LIBS)),$(eval $(call archive_template,$(lib))))
 | 
				
			||||||
$(foreach lib,$(filter %so.$(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_PATCH),$(LIBS)),$(eval $(call so_template,$(lib))))
 | 
					$(foreach lib,$(filter %so.$(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_PATCH),$(LIBS)),$(eval $(call so_template,$(lib))))
 | 
				
			||||||
$(foreach lib,$(filter %$(VERSION_MAJOR).dylib,$(LIBS)),$(eval $(call dl_template,$(lib))))
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
INSTALL-LIBS=$(call cond_enabled,CONFIG_INSTALL_LIBS,INSTALL-LIBS)
 | 
					INSTALL-LIBS=$(call cond_enabled,CONFIG_INSTALL_LIBS,INSTALL-LIBS)
 | 
				
			||||||
ifeq ($(MAKECMDGOALS),dist)
 | 
					ifeq ($(MAKECMDGOALS),dist)
 | 
				
			||||||
@@ -391,15 +330,13 @@ ifneq ($(call enabled,DIST-SRCS),)
 | 
				
			|||||||
    DIST-SRCS-$(CONFIG_MSVS)  += build/make/gen_msvs_proj.sh
 | 
					    DIST-SRCS-$(CONFIG_MSVS)  += build/make/gen_msvs_proj.sh
 | 
				
			||||||
    DIST-SRCS-$(CONFIG_MSVS)  += build/make/gen_msvs_sln.sh
 | 
					    DIST-SRCS-$(CONFIG_MSVS)  += build/make/gen_msvs_sln.sh
 | 
				
			||||||
    DIST-SRCS-$(CONFIG_MSVS)  += build/x86-msvs/yasm.rules
 | 
					    DIST-SRCS-$(CONFIG_MSVS)  += build/x86-msvs/yasm.rules
 | 
				
			||||||
    DIST-SRCS-$(CONFIG_MSVS)  += build/x86-msvs/obj_int_extract.bat
 | 
					 | 
				
			||||||
    DIST-SRCS-$(CONFIG_MSVS)  += build/arm-msvs/obj_int_extract.bat
 | 
					 | 
				
			||||||
    DIST-SRCS-$(CONFIG_RVCT) += build/make/armlink_adapter.sh
 | 
					    DIST-SRCS-$(CONFIG_RVCT) += build/make/armlink_adapter.sh
 | 
				
			||||||
    # Include obj_int_extract if we use offsets from *_asm_*_offsets
 | 
					    #
 | 
				
			||||||
    DIST-SRCS-$(ARCH_ARM)$(ARCH_X86)$(ARCH_X86_64)    += build/make/obj_int_extract.c
 | 
					    # This isn't really ARCH_ARM dependent, it's dependant on whether we're
 | 
				
			||||||
 | 
					    # using assembly code or not (CONFIG_OPTIMIZATIONS maybe). Just use
 | 
				
			||||||
 | 
					    # this for now.
 | 
				
			||||||
 | 
					    DIST-SRCS-$(ARCH_ARM)    += build/make/obj_int_extract.c
 | 
				
			||||||
    DIST-SRCS-$(ARCH_ARM)    += build/make/ads2gas.pl
 | 
					    DIST-SRCS-$(ARCH_ARM)    += build/make/ads2gas.pl
 | 
				
			||||||
    DIST-SRCS-$(ARCH_ARM)    += build/make/ads2gas_apple.pl
 | 
					 | 
				
			||||||
    DIST-SRCS-$(ARCH_ARM)    += build/make/ads2armasm_ms.pl
 | 
					 | 
				
			||||||
    DIST-SRCS-$(ARCH_ARM)    += build/make/thumb.pm
 | 
					 | 
				
			||||||
    DIST-SRCS-yes            += $(target:-$(TOOLCHAIN)=).mk
 | 
					    DIST-SRCS-yes            += $(target:-$(TOOLCHAIN)=).mk
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
INSTALL-SRCS := $(call cond_enabled,CONFIG_INSTALL_SRCS,INSTALL-SRCS)
 | 
					INSTALL-SRCS := $(call cond_enabled,CONFIG_INSTALL_SRCS,INSTALL-SRCS)
 | 
				
			||||||
@@ -418,7 +355,6 @@ ifeq ($(CONFIG_EXTERNAL_BUILD),yes)
 | 
				
			|||||||
endif
 | 
					endif
 | 
				
			||||||
BUILD_TARGETS += .docs .libs .bins
 | 
					BUILD_TARGETS += .docs .libs .bins
 | 
				
			||||||
INSTALL_TARGETS += .install-docs .install-srcs .install-libs .install-bins
 | 
					INSTALL_TARGETS += .install-docs .install-srcs .install-libs .install-bins
 | 
				
			||||||
all: $(BUILD_TARGETS)
 | 
					all-$(target): $(BUILD_TARGETS)
 | 
				
			||||||
install:: $(INSTALL_TARGETS)
 | 
					install:: $(INSTALL_TARGETS)
 | 
				
			||||||
dist: $(INSTALL_TARGETS)
 | 
					dist: $(INSTALL_TARGETS)
 | 
				
			||||||
test::
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,38 +0,0 @@
 | 
				
			|||||||
#!/usr/bin/perl
 | 
					 | 
				
			||||||
##
 | 
					 | 
				
			||||||
##  Copyright (c) 2013 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
##
 | 
					 | 
				
			||||||
##  Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
##  that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
##  tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
##  in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
##  be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
##
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
use FindBin;
 | 
					 | 
				
			||||||
use lib $FindBin::Bin;
 | 
					 | 
				
			||||||
use thumb;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
print "; This file was created from a .asm file\n";
 | 
					 | 
				
			||||||
print ";  using the ads2armasm_ms.pl script.\n";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
while (<STDIN>)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    undef $comment;
 | 
					 | 
				
			||||||
    undef $line;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    s/REQUIRE8//;
 | 
					 | 
				
			||||||
    s/PRESERVE8//;
 | 
					 | 
				
			||||||
    s/^\s*ARM\s*$//;
 | 
					 | 
				
			||||||
    s/AREA\s+\|\|(.*)\|\|/AREA |$1|/;
 | 
					 | 
				
			||||||
    s/qsubaddx/qsax/i;
 | 
					 | 
				
			||||||
    s/qaddsubx/qasx/i;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    thumb::FixThumbInstructions($_, 1);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    s/ldrneb/ldrbne/i;
 | 
					 | 
				
			||||||
    s/ldrneh/ldrhne/i;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    print;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@@ -17,45 +17,14 @@
 | 
				
			|||||||
#
 | 
					#
 | 
				
			||||||
# Usage: cat inputfile | perl ads2gas.pl > outputfile
 | 
					# Usage: cat inputfile | perl ads2gas.pl > outputfile
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
 | 
					 | 
				
			||||||
use FindBin;
 | 
					 | 
				
			||||||
use lib $FindBin::Bin;
 | 
					 | 
				
			||||||
use thumb;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
my $thumb = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
foreach my $arg (@ARGV) {
 | 
					 | 
				
			||||||
    $thumb = 1 if ($arg eq "-thumb");
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
print "@ This file was created from a .asm file\n";
 | 
					print "@ This file was created from a .asm file\n";
 | 
				
			||||||
print "@  using the ads2gas.pl script.\n";
 | 
					print "@  using the ads2gas.pl script.\n";
 | 
				
			||||||
print "\t.equ DO1STROUNDING, 0\n";
 | 
					print "\t.equ DO1STROUNDING, 0\n";
 | 
				
			||||||
if ($thumb) {
 | 
					 | 
				
			||||||
    print "\t.syntax unified\n";
 | 
					 | 
				
			||||||
    print "\t.thumb\n";
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Stack of procedure names.
 | 
					 | 
				
			||||||
@proc_stack = ();
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
while (<STDIN>)
 | 
					while (<STDIN>)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    undef $comment;
 | 
					    # Comment character
 | 
				
			||||||
    undef $line;
 | 
					    s/;/@/g;
 | 
				
			||||||
    $comment_char = ";";
 | 
					 | 
				
			||||||
    $comment_sub = "@";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Handle comments.
 | 
					 | 
				
			||||||
    if (/$comment_char/)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      $comment = "";
 | 
					 | 
				
			||||||
      ($line, $comment) = /(.*?)$comment_char(.*)/;
 | 
					 | 
				
			||||||
      $_ = $line;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Load and store alignment
 | 
					 | 
				
			||||||
    s/@/,:/g;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Hexadecimal constants prefaced by 0x
 | 
					    # Hexadecimal constants prefaced by 0x
 | 
				
			||||||
    s/#&/#0x/g;
 | 
					    s/#&/#0x/g;
 | 
				
			||||||
@@ -76,27 +45,16 @@ while (<STDIN>)
 | 
				
			|||||||
    s/:SHR:/ >> /g;
 | 
					    s/:SHR:/ >> /g;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Convert ELSE to .else
 | 
					    # Convert ELSE to .else
 | 
				
			||||||
    s/\bELSE\b/.else/g;
 | 
					    s/ELSE/.else/g;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Convert ENDIF to .endif
 | 
					    # Convert ENDIF to .endif
 | 
				
			||||||
    s/\bENDIF\b/.endif/g;
 | 
					    s/ENDIF/.endif/g;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Convert ELSEIF to .elseif
 | 
					    # Convert ELSEIF to .elseif
 | 
				
			||||||
    s/\bELSEIF\b/.elseif/g;
 | 
					    s/ELSEIF/.elseif/g;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Convert LTORG to .ltorg
 | 
					    # Convert LTORG to .ltorg
 | 
				
			||||||
    s/\bLTORG\b/.ltorg/g;
 | 
					    s/LTORG/.ltorg/g;
 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Convert endfunc to nothing.
 | 
					 | 
				
			||||||
    s/\bendfunc\b//ig;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Convert FUNCTION to nothing.
 | 
					 | 
				
			||||||
    s/\bFUNCTION\b//g;
 | 
					 | 
				
			||||||
    s/\bfunction\b//g;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    s/\bENTRY\b//g;
 | 
					 | 
				
			||||||
    s/\bMSARMASM\b/0/g;
 | 
					 | 
				
			||||||
    s/^\s+end\s+$//g;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Convert IF :DEF:to .if
 | 
					    # Convert IF :DEF:to .if
 | 
				
			||||||
    # gcc doesn't have the ability to do a conditional
 | 
					    # gcc doesn't have the ability to do a conditional
 | 
				
			||||||
@@ -121,10 +79,7 @@ while (<STDIN>)
 | 
				
			|||||||
    s/CODE([0-9][0-9])/.code $1/;
 | 
					    s/CODE([0-9][0-9])/.code $1/;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # No AREA required
 | 
					    # No AREA required
 | 
				
			||||||
    # But ALIGNs in AREA must be obeyed
 | 
					    s/^\s*AREA.*$/.text/;
 | 
				
			||||||
    s/^\s*AREA.*ALIGN=([0-9])$/.text\n.p2align $1/;
 | 
					 | 
				
			||||||
    # If no ALIGN, strip the AREA and align to 4 bytes
 | 
					 | 
				
			||||||
    s/^\s*AREA.*$/.text\n.p2align 2/;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # DCD to .word
 | 
					    # DCD to .word
 | 
				
			||||||
    # This one is for incoming symbols
 | 
					    # This one is for incoming symbols
 | 
				
			||||||
@@ -142,7 +97,6 @@ while (<STDIN>)
 | 
				
			|||||||
    if (s/RN\s+([Rr]\d+|lr)/.req $1/)
 | 
					    if (s/RN\s+([Rr]\d+|lr)/.req $1/)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        print;
 | 
					        print;
 | 
				
			||||||
        print "$comment_sub$comment\n" if defined $comment;
 | 
					 | 
				
			||||||
        next;
 | 
					        next;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -151,9 +105,6 @@ while (<STDIN>)
 | 
				
			|||||||
    s/EXPORT\s+\|([\$\w]*)\|/.global $1 \n\t.type $1, function/;
 | 
					    s/EXPORT\s+\|([\$\w]*)\|/.global $1 \n\t.type $1, function/;
 | 
				
			||||||
    s/IMPORT\s+\|([\$\w]*)\|/.global $1/;
 | 
					    s/IMPORT\s+\|([\$\w]*)\|/.global $1/;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    s/EXPORT\s+([\$\w]*)/.global $1/;
 | 
					 | 
				
			||||||
    s/export\s+([\$\w]*)/.global $1/;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # No vertical bars required; make additional symbol with prepended
 | 
					    # No vertical bars required; make additional symbol with prepended
 | 
				
			||||||
    # underscore
 | 
					    # underscore
 | 
				
			||||||
    s/^\|(\$?\w+)\|/_$1\n\t$1:/g;
 | 
					    s/^\|(\$?\w+)\|/_$1\n\t$1:/g;
 | 
				
			||||||
@@ -163,61 +114,28 @@ while (<STDIN>)
 | 
				
			|||||||
    # put the colon at the end of the line in the macro
 | 
					    # put the colon at the end of the line in the macro
 | 
				
			||||||
    s/^([a-zA-Z_0-9\$]+)/$1:/ if !/EQU/;
 | 
					    s/^([a-zA-Z_0-9\$]+)/$1:/ if !/EQU/;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # ALIGN directive
 | 
					    # Strip ALIGN
 | 
				
			||||||
    s/\bALIGN\b/.balign/g;
 | 
					    s/\sALIGN/@ ALIGN/g;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if ($thumb) {
 | 
					    # Strip ARM
 | 
				
			||||||
        # ARM code - we force everything to thumb with the declaration in the header
 | 
					    s/\sARM/@ ARM/g;
 | 
				
			||||||
        s/\sARM//g;
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
        # ARM code
 | 
					 | 
				
			||||||
        s/\sARM/.arm/g;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # push/pop
 | 
					    # Strip REQUIRE8
 | 
				
			||||||
    s/(push\s+)(r\d+)/stmdb sp\!, \{$2\}/g;
 | 
					    #s/\sREQUIRE8/@ REQUIRE8/g;
 | 
				
			||||||
    s/(pop\s+)(r\d+)/ldmia sp\!, \{$2\}/g;
 | 
					    s/\sREQUIRE8/@ /g;      #EQU cause problem
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # NEON code
 | 
					    # Strip PRESERVE8
 | 
				
			||||||
    s/(vld1.\d+\s+)(q\d+)/$1\{$2\}/g;
 | 
					    s/\sPRESERVE8/@ PRESERVE8/g;
 | 
				
			||||||
    s/(vtbl.\d+\s+[^,]+),([^,]+)/$1,\{$2\}/g;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if ($thumb) {
 | 
					    # Strip PROC and ENDPROC
 | 
				
			||||||
        thumb::FixThumbInstructions($_, 0);
 | 
					    s/\sPROC/@/g;
 | 
				
			||||||
    }
 | 
					    s/\sENDP/@/g;
 | 
				
			||||||
 | 
					 | 
				
			||||||
    # eabi_attributes numerical equivalents can be found in the
 | 
					 | 
				
			||||||
    # "ARM IHI 0045C" document.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # REQUIRE8 Stack is required to be 8-byte aligned
 | 
					 | 
				
			||||||
    s/\sREQUIRE8/.eabi_attribute 24, 1 \@Tag_ABI_align_needed/g;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # PRESERVE8 Stack 8-byte align is preserved
 | 
					 | 
				
			||||||
    s/\sPRESERVE8/.eabi_attribute 25, 1 \@Tag_ABI_align_preserved/g;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Use PROC and ENDP to give the symbols a .size directive.
 | 
					 | 
				
			||||||
    # This makes them show up properly in debugging tools like gdb and valgrind.
 | 
					 | 
				
			||||||
    if (/\bPROC\b/)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        my $proc;
 | 
					 | 
				
			||||||
        /^_([\.0-9A-Z_a-z]\w+)\b/;
 | 
					 | 
				
			||||||
        $proc = $1;
 | 
					 | 
				
			||||||
        push(@proc_stack, $proc) if ($proc);
 | 
					 | 
				
			||||||
        s/\bPROC\b/@ $&/;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if (/\bENDP\b/)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        my $proc;
 | 
					 | 
				
			||||||
        s/\bENDP\b/@ $&/;
 | 
					 | 
				
			||||||
        $proc = pop(@proc_stack);
 | 
					 | 
				
			||||||
        $_ = "\t.size $proc, .-$proc".$_ if ($proc);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # EQU directive
 | 
					    # EQU directive
 | 
				
			||||||
    s/(\S+\s+)EQU(\s+\S+)/.equ $1, $2/;
 | 
					    s/(.*)EQU(.*)/.equ $1, $2/;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Begin macro definition
 | 
					    # Begin macro definition
 | 
				
			||||||
    if (/\bMACRO\b/) {
 | 
					    if (/MACRO/) {
 | 
				
			||||||
        $_ = <STDIN>;
 | 
					        $_ = <STDIN>;
 | 
				
			||||||
        s/^/.macro/;
 | 
					        s/^/.macro/;
 | 
				
			||||||
        s/\$//g;                # remove formal param reference
 | 
					        s/\$//g;                # remove formal param reference
 | 
				
			||||||
@@ -226,11 +144,7 @@ while (<STDIN>)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    # For macros, use \ to reference formal params
 | 
					    # For macros, use \ to reference formal params
 | 
				
			||||||
    s/\$/\\/g;                  # End macro definition
 | 
					    s/\$/\\/g;                  # End macro definition
 | 
				
			||||||
    s/\bMEND\b/.endm/;              # No need to tell it where to stop assembling
 | 
					    s/MEND/.endm/;              # No need to tell it where to stop assembling
 | 
				
			||||||
    next if /^\s*END\s*$/;
 | 
					    next if /^\s*END\s*$/;
 | 
				
			||||||
    print;
 | 
					    print;
 | 
				
			||||||
    print "$comment_sub$comment\n" if defined $comment;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
# Mark that this object doesn't need an executable stack.
 | 
					 | 
				
			||||||
printf ("\t.section\t.note.GNU-stack,\"\",\%\%progbits\n");
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,20 +10,13 @@
 | 
				
			|||||||
##
 | 
					##
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# ads2gas_apple.pl
 | 
					# ads2gas.pl
 | 
				
			||||||
# Author: Eric Fung (efung (at) acm.org)
 | 
					# Author: Eric Fung (efung (at) acm.org)
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# Convert ARM Developer Suite 1.0.1 syntax assembly source to GNU as format
 | 
					# Convert ARM Developer Suite 1.0.1 syntax assembly source to GNU as format
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# Usage: cat inputfile | perl ads2gas_apple.pl > outputfile
 | 
					# Usage: cat inputfile | perl ads2gas.pl > outputfile
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
 | 
					 | 
				
			||||||
my $chromium = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
foreach my $arg (@ARGV) {
 | 
					 | 
				
			||||||
    $chromium = 1 if ($arg eq "-chromium");
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
print "@ This file was created from a .asm file\n";
 | 
					print "@ This file was created from a .asm file\n";
 | 
				
			||||||
print "@  using the ads2gas_apple.pl script.\n\n";
 | 
					print "@  using the ads2gas_apple.pl script.\n\n";
 | 
				
			||||||
print "\t.set WIDE_REFERENCE, 0\n";
 | 
					print "\t.set WIDE_REFERENCE, 0\n";
 | 
				
			||||||
@@ -37,8 +30,6 @@ my @mapping_list = ("\$0", "\$1", "\$2", "\$3", "\$4", "\$5", "\$6", "\$7", "\$8
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
my @incoming_array;
 | 
					my @incoming_array;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
my @imported_functions;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Perl trim function to remove whitespace from the start and end of the string
 | 
					# Perl trim function to remove whitespace from the start and end of the string
 | 
				
			||||||
sub trim($)
 | 
					sub trim($)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -50,11 +41,8 @@ sub trim($)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
while (<STDIN>)
 | 
					while (<STDIN>)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    # Load and store alignment
 | 
					 | 
				
			||||||
    s/@/,:/g;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Comment character
 | 
					    # Comment character
 | 
				
			||||||
    s/;/ @/g;
 | 
					    s/;/@/g;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Hexadecimal constants prefaced by 0x
 | 
					    # Hexadecimal constants prefaced by 0x
 | 
				
			||||||
    s/#&/#0x/g;
 | 
					    s/#&/#0x/g;
 | 
				
			||||||
@@ -109,10 +97,7 @@ while (<STDIN>)
 | 
				
			|||||||
    s/CODE([0-9][0-9])/.code $1/;
 | 
					    s/CODE([0-9][0-9])/.code $1/;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # No AREA required
 | 
					    # No AREA required
 | 
				
			||||||
    # But ALIGNs in AREA must be obeyed
 | 
					    s/^\s*AREA.*$/.text/;
 | 
				
			||||||
    s/^\s*AREA.*ALIGN=([0-9])$/.text\n.p2align $1/;
 | 
					 | 
				
			||||||
    # If no ALIGN, strip the AREA and align to 4 bytes
 | 
					 | 
				
			||||||
    s/^\s*AREA.*$/.text\n.p2align 2/;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # DCD to .word
 | 
					    # DCD to .word
 | 
				
			||||||
    # This one is for incoming symbols
 | 
					    # This one is for incoming symbols
 | 
				
			||||||
@@ -141,18 +126,7 @@ while (<STDIN>)
 | 
				
			|||||||
    # Make function visible to linker, and make additional symbol with
 | 
					    # Make function visible to linker, and make additional symbol with
 | 
				
			||||||
    # prepended underscore
 | 
					    # prepended underscore
 | 
				
			||||||
    s/EXPORT\s+\|([\$\w]*)\|/.globl _$1\n\t.globl $1/;
 | 
					    s/EXPORT\s+\|([\$\w]*)\|/.globl _$1\n\t.globl $1/;
 | 
				
			||||||
 | 
					    s/IMPORT\s+\|([\$\w]*)\|/.globl $1/;
 | 
				
			||||||
    # Prepend imported functions with _
 | 
					 | 
				
			||||||
    if (s/IMPORT\s+\|([\$\w]*)\|/.globl $1/)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        $function = trim($1);
 | 
					 | 
				
			||||||
        push(@imported_functions, $function);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    foreach $function (@imported_functions)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        s/$function/_$function/;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # No vertical bars required; make additional symbol with prepended
 | 
					    # No vertical bars required; make additional symbol with prepended
 | 
				
			||||||
    # underscore
 | 
					    # underscore
 | 
				
			||||||
@@ -163,8 +137,8 @@ while (<STDIN>)
 | 
				
			|||||||
    # put the colon at the end of the line in the macro
 | 
					    # put the colon at the end of the line in the macro
 | 
				
			||||||
    s/^([a-zA-Z_0-9\$]+)/$1:/ if !/EQU/;
 | 
					    s/^([a-zA-Z_0-9\$]+)/$1:/ if !/EQU/;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # ALIGN directive
 | 
					    # Strip ALIGN
 | 
				
			||||||
    s/ALIGN/.balign/g;
 | 
					    s/\sALIGN/@ ALIGN/g;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Strip ARM
 | 
					    # Strip ARM
 | 
				
			||||||
    s/\sARM/@ ARM/g;
 | 
					    s/\sARM/@ ARM/g;
 | 
				
			||||||
@@ -177,8 +151,8 @@ while (<STDIN>)
 | 
				
			|||||||
    s/\sPRESERVE8/@ PRESERVE8/g;
 | 
					    s/\sPRESERVE8/@ PRESERVE8/g;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Strip PROC and ENDPROC
 | 
					    # Strip PROC and ENDPROC
 | 
				
			||||||
    s/\bPROC\b/@/g;
 | 
					    s/PROC/@/g;
 | 
				
			||||||
    s/\bENDP\b/@/g;
 | 
					    s/ENDP/@/g;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # EQU directive
 | 
					    # EQU directive
 | 
				
			||||||
    s/(.*)EQU(.*)/.set $1, $2/;
 | 
					    s/(.*)EQU(.*)/.set $1, $2/;
 | 
				
			||||||
@@ -195,7 +169,7 @@ while (<STDIN>)
 | 
				
			|||||||
        $trimmed =~ s/,//g;
 | 
					        $trimmed =~ s/,//g;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # string to array
 | 
					        # string to array
 | 
				
			||||||
        @incoming_array = split(/\s+/, $trimmed);
 | 
					        @incoming_array = split(/ /, $trimmed);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        print ".macro @incoming_array[0]\n";
 | 
					        print ".macro @incoming_array[0]\n";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -217,19 +191,5 @@ while (<STDIN>)
 | 
				
			|||||||
#   s/\$/\\/g;                  # End macro definition
 | 
					#   s/\$/\\/g;                  # End macro definition
 | 
				
			||||||
    s/MEND/.endm/;              # No need to tell it where to stop assembling
 | 
					    s/MEND/.endm/;              # No need to tell it where to stop assembling
 | 
				
			||||||
    next if /^\s*END\s*$/;
 | 
					    next if /^\s*END\s*$/;
 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Clang used by Chromium differs slightly from clang in XCode in what it
 | 
					 | 
				
			||||||
    # will accept in the assembly.
 | 
					 | 
				
			||||||
    if ($chromium) {
 | 
					 | 
				
			||||||
        s/qsubaddx/qsax/i;
 | 
					 | 
				
			||||||
        s/qaddsubx/qasx/i;
 | 
					 | 
				
			||||||
        s/ldrneb/ldrbne/i;
 | 
					 | 
				
			||||||
        s/ldrneh/ldrhne/i;
 | 
					 | 
				
			||||||
        s/(vqshrun\.s16 .*, \#)0$/${1}8/i;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        # http://llvm.org/bugs/show_bug.cgi?id=16022
 | 
					 | 
				
			||||||
        s/\.include/#include/;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    print;
 | 
					    print;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
#!/bin/sh
 | 
					#!/bin/bash
 | 
				
			||||||
##
 | 
					##
 | 
				
			||||||
##  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
 | 
					##  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
 | 
				
			||||||
##
 | 
					##
 | 
				
			||||||
@@ -13,21 +13,19 @@
 | 
				
			|||||||
verbose=0
 | 
					verbose=0
 | 
				
			||||||
set -- $*
 | 
					set -- $*
 | 
				
			||||||
for i; do
 | 
					for i; do
 | 
				
			||||||
    if [ "$i" = "-o" ]; then
 | 
					    if [ "$i" == "-o" ]; then
 | 
				
			||||||
        on_of=1
 | 
					        on_of=1
 | 
				
			||||||
    elif [ "$i" = "-v" ]; then
 | 
					    elif [ "$i" == "-v" ]; then
 | 
				
			||||||
        verbose=1
 | 
					        verbose=1
 | 
				
			||||||
    elif [ "$i" = "-g" ]; then
 | 
					    elif [ "$on_of" == "1" ]; then
 | 
				
			||||||
        args="${args} --debug"
 | 
					 | 
				
			||||||
    elif [ "$on_of" = "1" ]; then
 | 
					 | 
				
			||||||
        outfile=$i
 | 
					        outfile=$i
 | 
				
			||||||
        on_of=0
 | 
					    on_of=0
 | 
				
			||||||
    elif [ -f "$i" ]; then
 | 
					    elif [ -f "$i" ]; then
 | 
				
			||||||
        infiles="$infiles $i"
 | 
					        infiles="$infiles $i"
 | 
				
			||||||
    elif [ "${i#-l}" != "$i" ]; then
 | 
					    elif [ "${i:0:2}" == "-l" ]; then
 | 
				
			||||||
        libs="$libs ${i#-l}"
 | 
					        libs="$libs ${i#-l}"
 | 
				
			||||||
    elif [ "${i#-L}" != "$i" ]; then
 | 
					    elif [ "${i:0:2}" == "-L" ]; then
 | 
				
			||||||
        libpaths="${libpaths} ${i#-L}"
 | 
					    libpaths="${libpaths} ${i#-L}"
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
        args="${args} ${i}"
 | 
					        args="${args} ${i}"
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
 
 | 
				
			|||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
#!/bin/sh
 | 
					#!/bin/bash
 | 
				
			||||||
##
 | 
					##
 | 
				
			||||||
##  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
 | 
					##  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
 | 
				
			||||||
##
 | 
					##
 | 
				
			||||||
@@ -42,7 +42,7 @@ done
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[ -n "$srcfile" ] || show_help
 | 
					[ -n "$srcfile" ] || show_help
 | 
				
			||||||
sfx=${sfx:-asm}
 | 
					sfx=${sfx:-asm}
 | 
				
			||||||
includes=$(LC_ALL=C egrep -i "include +\"?[a-z0-9_/]+\.${sfx}" $srcfile |
 | 
					includes=$(egrep -i "include +\"?+[a-z0-9_/]+\.${sfx}" $srcfile |
 | 
				
			||||||
           perl -p -e "s;.*?([a-z0-9_/]+.${sfx}).*;\1;")
 | 
					           perl -p -e "s;.*?([a-z0-9_/]+.${sfx}).*;\1;")
 | 
				
			||||||
#" restore editor state
 | 
					#" restore editor state
 | 
				
			||||||
for inc in ${includes}; do
 | 
					for inc in ${includes}; do
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,15 +26,13 @@ Options:
 | 
				
			|||||||
    --help                      Print this message
 | 
					    --help                      Print this message
 | 
				
			||||||
    --exe                       Generate a project for building an Application
 | 
					    --exe                       Generate a project for building an Application
 | 
				
			||||||
    --lib                       Generate a project for creating a static library
 | 
					    --lib                       Generate a project for creating a static library
 | 
				
			||||||
    --dll                       Generate a project for creating a dll
 | 
					 | 
				
			||||||
    --static-crt                Use the static C runtime (/MT)
 | 
					    --static-crt                Use the static C runtime (/MT)
 | 
				
			||||||
    --target=isa-os-cc          Target specifier (required)
 | 
					    --target=isa-os-cc          Target specifier (required)
 | 
				
			||||||
    --out=filename              Write output to a file [stdout]
 | 
					    --out=filename              Write output to a file [stdout]
 | 
				
			||||||
    --name=project_name         Name of the project (required)
 | 
					    --name=project_name         Name of the project (required)
 | 
				
			||||||
    --proj-guid=GUID            GUID to use for the project
 | 
					    --proj-guid=GUID            GUID to use for the project
 | 
				
			||||||
    --module-def=filename       File containing export definitions (for DLLs)
 | 
					    --module-def=filename       File containing export definitions (for DLLs)
 | 
				
			||||||
    --ver=version               Version (7,8,9) of visual studio to generate for
 | 
					    --ver=version               Version (7,8) of visual studio to generate for
 | 
				
			||||||
    --src-path-bare=dir         Path to root of source tree
 | 
					 | 
				
			||||||
    -Ipath/to/include           Additional include directories
 | 
					    -Ipath/to/include           Additional include directories
 | 
				
			||||||
    -DFLAG[=value]              Preprocessor macros to define
 | 
					    -DFLAG[=value]              Preprocessor macros to define
 | 
				
			||||||
    -Lpath/to/lib               Additional library search paths
 | 
					    -Lpath/to/lib               Additional library search paths
 | 
				
			||||||
@@ -134,7 +132,7 @@ generate_filter() {
 | 
				
			|||||||
    open_tag Filter \
 | 
					    open_tag Filter \
 | 
				
			||||||
        Name=$name \
 | 
					        Name=$name \
 | 
				
			||||||
        Filter=$pats \
 | 
					        Filter=$pats \
 | 
				
			||||||
        UniqueIdentifier=`generate_uuid` \
 | 
					        UniqueIdentifier=`generate_uuid`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    file_list_sz=${#file_list[@]}
 | 
					    file_list_sz=${#file_list[@]}
 | 
				
			||||||
    for i in ${!file_list[@]}; do
 | 
					    for i in ${!file_list[@]}; do
 | 
				
			||||||
@@ -143,40 +141,35 @@ generate_filter() {
 | 
				
			|||||||
            if [ "${f##*.}" == "$pat" ]; then
 | 
					            if [ "${f##*.}" == "$pat" ]; then
 | 
				
			||||||
                unset file_list[i]
 | 
					                unset file_list[i]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                objf=$(echo ${f%.*}.obj | sed -e 's/^[\./]\+//g' -e 's,/,_,g')
 | 
					 | 
				
			||||||
                open_tag File RelativePath="./$f"
 | 
					                open_tag File RelativePath="./$f"
 | 
				
			||||||
 | 
					 | 
				
			||||||
                if [ "$pat" == "asm" ] && $asm_use_custom_step; then
 | 
					                if [ "$pat" == "asm" ] && $asm_use_custom_step; then
 | 
				
			||||||
                    for plat in "${platforms[@]}"; do
 | 
					                    for plat in "${platforms[@]}"; do
 | 
				
			||||||
                        for cfg in Debug Release; do
 | 
					                        for cfg in Debug Release; do
 | 
				
			||||||
                            open_tag FileConfiguration \
 | 
					                            open_tag  FileConfiguration \
 | 
				
			||||||
                                Name="${cfg}|${plat}" \
 | 
					                            Name="${cfg}|${plat}"
 | 
				
			||||||
 | 
					 | 
				
			||||||
                            tag Tool \
 | 
					                            tag Tool \
 | 
				
			||||||
                                Name="VCCustomBuildTool" \
 | 
					                                Name="VCCustomBuildTool" \
 | 
				
			||||||
                                Description="Assembling \$(InputFileName)" \
 | 
					                                Description="Assembling \$(InputFileName)" \
 | 
				
			||||||
                                CommandLine="$(eval echo \$asm_${cfg}_cmdline) -o \$(IntDir)$objf" \
 | 
					                                CommandLine="$(eval echo \$asm_${cfg}_cmdline)"\
 | 
				
			||||||
                                Outputs="\$(IntDir)$objf" \
 | 
					                                Outputs="\$(InputName).obj"
 | 
				
			||||||
 | 
					 | 
				
			||||||
                            close_tag FileConfiguration
 | 
					                            close_tag FileConfiguration
 | 
				
			||||||
                        done
 | 
					                        done
 | 
				
			||||||
                    done
 | 
					                    done
 | 
				
			||||||
                fi
 | 
					                fi
 | 
				
			||||||
                if [ "$pat" == "c" ] || [ "$pat" == "cc" ] ; then
 | 
					
 | 
				
			||||||
 | 
					                if [ "${f##*.}" == "cpp" ]; then
 | 
				
			||||||
                    for plat in "${platforms[@]}"; do
 | 
					                    for plat in "${platforms[@]}"; do
 | 
				
			||||||
                        for cfg in Debug Release; do
 | 
					                        for cfg in Debug Release; do
 | 
				
			||||||
                            open_tag FileConfiguration \
 | 
					                        open_tag FileConfiguration \
 | 
				
			||||||
                                Name="${cfg}|${plat}" \
 | 
					                            Name="${cfg}|${plat}"
 | 
				
			||||||
 | 
					                        tag Tool \
 | 
				
			||||||
                            tag Tool \
 | 
					                            Name="VCCLCompilerTool" \
 | 
				
			||||||
                                Name="VCCLCompilerTool" \
 | 
					                            CompileAs="2"
 | 
				
			||||||
                                ObjectFile="\$(IntDir)$objf" \
 | 
					                        close_tag FileConfiguration
 | 
				
			||||||
 | 
					 | 
				
			||||||
                            close_tag FileConfiguration
 | 
					 | 
				
			||||||
                        done
 | 
					                        done
 | 
				
			||||||
                    done
 | 
					                    done
 | 
				
			||||||
                fi
 | 
					                fi
 | 
				
			||||||
                close_tag File
 | 
					                close_tag  File
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                break
 | 
					                break
 | 
				
			||||||
            fi
 | 
					            fi
 | 
				
			||||||
@@ -192,65 +185,57 @@ unset target
 | 
				
			|||||||
for opt in "$@"; do
 | 
					for opt in "$@"; do
 | 
				
			||||||
    optval="${opt#*=}"
 | 
					    optval="${opt#*=}"
 | 
				
			||||||
    case "$opt" in
 | 
					    case "$opt" in
 | 
				
			||||||
        --help|-h) show_help
 | 
					    --help|-h) show_help
 | 
				
			||||||
        ;;
 | 
					    ;;
 | 
				
			||||||
        --target=*) target="${optval}"
 | 
					    --target=*) target="${optval}"
 | 
				
			||||||
        ;;
 | 
					    ;;
 | 
				
			||||||
        --out=*) outfile="$optval"
 | 
					    --out=*) outfile="$optval"
 | 
				
			||||||
        ;;
 | 
					    ;;
 | 
				
			||||||
        --name=*) name="${optval}"
 | 
					    --name=*) name="${optval}"
 | 
				
			||||||
        ;;
 | 
					    ;;
 | 
				
			||||||
        --proj-guid=*) guid="${optval}"
 | 
					    --proj-guid=*) guid="${optval}"
 | 
				
			||||||
        ;;
 | 
					    ;;
 | 
				
			||||||
        --module-def=*) link_opts="${link_opts} ModuleDefinitionFile=${optval}"
 | 
					    --module-def=*)
 | 
				
			||||||
        ;;
 | 
					        link_opts="${link_opts} ModuleDefinitionFile=${optval}"
 | 
				
			||||||
        --exe) proj_kind="exe"
 | 
					    ;;
 | 
				
			||||||
        ;;
 | 
					    --exe) proj_kind="exe"
 | 
				
			||||||
        --dll) proj_kind="dll"
 | 
					    ;;
 | 
				
			||||||
        ;;
 | 
					    --lib) proj_kind="lib"
 | 
				
			||||||
        --lib) proj_kind="lib"
 | 
					    ;;
 | 
				
			||||||
        ;;
 | 
					    --static-crt) use_static_runtime=true
 | 
				
			||||||
        --src-path-bare=*) src_path_bare="$optval"
 | 
					    ;;
 | 
				
			||||||
        ;;
 | 
					    --ver=*) vs_ver="$optval"
 | 
				
			||||||
        --static-crt) use_static_runtime=true
 | 
					             case $optval in
 | 
				
			||||||
        ;;
 | 
					             [789])
 | 
				
			||||||
        --ver=*)
 | 
					             ;;
 | 
				
			||||||
            vs_ver="$optval"
 | 
					             *) die Unrecognized Visual Studio Version in $opt
 | 
				
			||||||
            case "$optval" in
 | 
					             ;;
 | 
				
			||||||
                [789])
 | 
					             esac
 | 
				
			||||||
                ;;
 | 
					    ;;
 | 
				
			||||||
                *) die Unrecognized Visual Studio Version in $opt
 | 
					    -I*) opt="${opt%/}"
 | 
				
			||||||
                ;;
 | 
					         incs="${incs}${incs:+;}"${opt##-I}""
 | 
				
			||||||
            esac
 | 
					         yasmincs="${yasmincs} ${opt}"
 | 
				
			||||||
        ;;
 | 
					    ;;
 | 
				
			||||||
        -I*)
 | 
					    -D*) defines="${defines}${defines:+;}${opt##-D}"
 | 
				
			||||||
            opt="${opt%/}"
 | 
					    ;;
 | 
				
			||||||
            incs="${incs}${incs:+;}"${opt##-I}""
 | 
					    -L*) # fudge . to $(OutDir)
 | 
				
			||||||
            yasmincs="${yasmincs} ${opt}"
 | 
					         if [ "${opt##-L}" == "." ]; then
 | 
				
			||||||
        ;;
 | 
					             libdirs="${libdirs}${libdirs:+;}"\$(OutDir)""
 | 
				
			||||||
        -D*) defines="${defines}${defines:+;}${opt##-D}"
 | 
					         else
 | 
				
			||||||
        ;;
 | 
					             # Also try directories for this platform/configuration
 | 
				
			||||||
        -L*) # fudge . to $(OutDir)
 | 
					             libdirs="${libdirs}${libdirs:+;}"${opt##-L}""
 | 
				
			||||||
            if [ "${opt##-L}" == "." ]; then
 | 
					             libdirs="${libdirs}${libdirs:+;}"${opt##-L}/\$(PlatformName)/\$(ConfigurationName)""
 | 
				
			||||||
                libdirs="${libdirs}${libdirs:+;}"\$(OutDir)""
 | 
					             libdirs="${libdirs}${libdirs:+;}"${opt##-L}/\$(PlatformName)""
 | 
				
			||||||
            else
 | 
					         fi
 | 
				
			||||||
                 # Also try directories for this platform/configuration
 | 
					    ;;
 | 
				
			||||||
                 libdirs="${libdirs}${libdirs:+;}"${opt##-L}""
 | 
					    -l*) libs="${libs}${libs:+ }${opt##-l}.lib"
 | 
				
			||||||
                 libdirs="${libdirs}${libdirs:+;}"${opt##-L}/\$(PlatformName)/\$(ConfigurationName)""
 | 
					    ;;
 | 
				
			||||||
                 libdirs="${libdirs}${libdirs:+;}"${opt##-L}/\$(PlatformName)""
 | 
					    -*) die_unknown $opt
 | 
				
			||||||
            fi
 | 
					    ;;
 | 
				
			||||||
        ;;
 | 
					    *) file_list[${#file_list[@]}]="$opt"
 | 
				
			||||||
        -l*) libs="${libs}${libs:+ }${opt##-l}.lib"
 | 
					       case "$opt" in
 | 
				
			||||||
        ;;
 | 
					       *.asm) uses_asm=true;;
 | 
				
			||||||
        -*) die_unknown $opt
 | 
					       esac
 | 
				
			||||||
        ;;
 | 
					 | 
				
			||||||
        *)
 | 
					 | 
				
			||||||
            file_list[${#file_list[@]}]="$opt"
 | 
					 | 
				
			||||||
            case "$opt" in
 | 
					 | 
				
			||||||
                 *.asm) uses_asm=true
 | 
					 | 
				
			||||||
                 ;;
 | 
					 | 
				
			||||||
            esac
 | 
					 | 
				
			||||||
        ;;
 | 
					 | 
				
			||||||
    esac
 | 
					    esac
 | 
				
			||||||
done
 | 
					done
 | 
				
			||||||
outfile=${outfile:-/dev/stdout}
 | 
					outfile=${outfile:-/dev/stdout}
 | 
				
			||||||
@@ -260,15 +245,10 @@ uses_asm=${uses_asm:-false}
 | 
				
			|||||||
case "${vs_ver:-8}" in
 | 
					case "${vs_ver:-8}" in
 | 
				
			||||||
    7) vs_ver_id="7.10"
 | 
					    7) vs_ver_id="7.10"
 | 
				
			||||||
       asm_use_custom_step=$uses_asm
 | 
					       asm_use_custom_step=$uses_asm
 | 
				
			||||||
       warn_64bit='Detect64BitPortabilityProblems=true'
 | 
					 | 
				
			||||||
    ;;
 | 
					    ;;
 | 
				
			||||||
    8) vs_ver_id="8.00"
 | 
					    8) vs_ver_id="8.00"
 | 
				
			||||||
       asm_use_custom_step=$uses_asm
 | 
					 | 
				
			||||||
       warn_64bit='Detect64BitPortabilityProblems=true'
 | 
					 | 
				
			||||||
    ;;
 | 
					    ;;
 | 
				
			||||||
    9) vs_ver_id="9.00"
 | 
					    9) vs_ver_id="9.00"
 | 
				
			||||||
       asm_use_custom_step=$uses_asm
 | 
					 | 
				
			||||||
       warn_64bit='Detect64BitPortabilityProblems=false'
 | 
					 | 
				
			||||||
    ;;
 | 
					    ;;
 | 
				
			||||||
esac
 | 
					esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -298,7 +278,11 @@ done
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# List Keyword for this target
 | 
					# List Keyword for this target
 | 
				
			||||||
case "$target" in
 | 
					case "$target" in
 | 
				
			||||||
    x86*) keyword="ManagedCProj"
 | 
					    x86*)
 | 
				
			||||||
 | 
					        keyword="ManagedCProj"
 | 
				
			||||||
 | 
					    ;;
 | 
				
			||||||
 | 
					    arm*|iwmmx*)
 | 
				
			||||||
 | 
					        keyword="Win32Proj"
 | 
				
			||||||
    ;;
 | 
					    ;;
 | 
				
			||||||
    *) die "Unsupported target $target!"
 | 
					    *) die "Unsupported target $target!"
 | 
				
			||||||
esac
 | 
					esac
 | 
				
			||||||
@@ -307,264 +291,409 @@ esac
 | 
				
			|||||||
case "$target" in
 | 
					case "$target" in
 | 
				
			||||||
    x86_64*)
 | 
					    x86_64*)
 | 
				
			||||||
        platforms[0]="x64"
 | 
					        platforms[0]="x64"
 | 
				
			||||||
        asm_Debug_cmdline="yasm -Xvc -g cv8 -f \$(PlatformName) ${yasmincs} "\$(InputPath)""
 | 
					 | 
				
			||||||
        asm_Release_cmdline="yasm -Xvc -f \$(PlatformName) ${yasmincs} "\$(InputPath)""
 | 
					 | 
				
			||||||
    ;;
 | 
					    ;;
 | 
				
			||||||
    x86*)
 | 
					    x86*)
 | 
				
			||||||
        platforms[0]="Win32"
 | 
					        platforms[0]="Win32"
 | 
				
			||||||
 | 
					        # these are only used by vs7
 | 
				
			||||||
        asm_Debug_cmdline="yasm -Xvc -g cv8 -f \$(PlatformName) ${yasmincs} "\$(InputPath)""
 | 
					        asm_Debug_cmdline="yasm -Xvc -g cv8 -f \$(PlatformName) ${yasmincs} "\$(InputPath)""
 | 
				
			||||||
        asm_Release_cmdline="yasm -Xvc -f \$(PlatformName) ${yasmincs} "\$(InputPath)""
 | 
					        asm_Release_cmdline="yasm -Xvc -f \$(PlatformName) ${yasmincs} "\$(InputPath)""
 | 
				
			||||||
    ;;
 | 
					    ;;
 | 
				
			||||||
 | 
					    arm*|iwmmx*)
 | 
				
			||||||
 | 
					        case "${name}" in
 | 
				
			||||||
 | 
					        obj_int_extract) platforms[0]="Win32"
 | 
				
			||||||
 | 
					        ;;
 | 
				
			||||||
 | 
					        *) platforms[0]="Pocket PC 2003 (ARMV4)"
 | 
				
			||||||
 | 
					        ;;
 | 
				
			||||||
 | 
					        esac
 | 
				
			||||||
 | 
					    ;;
 | 
				
			||||||
    *) die "Unsupported target $target!"
 | 
					    *) die "Unsupported target $target!"
 | 
				
			||||||
 | 
					esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# List Command-line Arguments for this target
 | 
				
			||||||
 | 
					case "$target" in
 | 
				
			||||||
 | 
					    arm*|iwmmx*)
 | 
				
			||||||
 | 
					        if [ "$name" == "example" ];then
 | 
				
			||||||
 | 
					            ARGU="--codec vp6 --flipuv --progress _bnd.vp6"
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					        if [ "$name" == "xma" ];then
 | 
				
			||||||
 | 
					            ARGU="--codec vp6 -h 240 -w 320 -v"
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
    ;;
 | 
					    ;;
 | 
				
			||||||
esac
 | 
					esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
generate_vcproj() {
 | 
					generate_vcproj() {
 | 
				
			||||||
    case "$proj_kind" in
 | 
					    case "$proj_kind" in
 | 
				
			||||||
        exe) vs_ConfigurationType=1
 | 
					    exe) vs_ConfigurationType=1
 | 
				
			||||||
        ;;
 | 
					    ;;
 | 
				
			||||||
        dll) vs_ConfigurationType=2
 | 
					    *)   vs_ConfigurationType=4
 | 
				
			||||||
        ;;
 | 
					    ;;
 | 
				
			||||||
        *)   vs_ConfigurationType=4
 | 
					 | 
				
			||||||
        ;;
 | 
					 | 
				
			||||||
    esac
 | 
					    esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    echo "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>"
 | 
					    echo "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>"
 | 
				
			||||||
    open_tag VisualStudioProject \
 | 
					    open_tag  VisualStudioProject \
 | 
				
			||||||
        ProjectType="Visual C++" \
 | 
					                  ProjectType="Visual C++" \
 | 
				
			||||||
        Version="${vs_ver_id}" \
 | 
					                  Version="${vs_ver_id}" \
 | 
				
			||||||
        Name="${name}" \
 | 
					                  Name="${name}" \
 | 
				
			||||||
        ProjectGUID="{${guid}}" \
 | 
					                  ProjectGUID="{${guid}}" \
 | 
				
			||||||
        RootNamespace="${name}" \
 | 
					                  RootNamespace="${name}" \
 | 
				
			||||||
        Keyword="${keyword}" \
 | 
					                  Keyword="${keyword}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    open_tag Platforms
 | 
					    open_tag  Platforms
 | 
				
			||||||
    for plat in "${platforms[@]}"; do
 | 
					    for plat in "${platforms[@]}"; do
 | 
				
			||||||
        tag Platform Name="$plat"
 | 
					        tag   Platform Name="$plat"
 | 
				
			||||||
    done
 | 
					    done
 | 
				
			||||||
    close_tag Platforms
 | 
					    close_tag Platforms
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    open_tag Configurations
 | 
					    open_tag  ToolFiles
 | 
				
			||||||
 | 
					    case "$target" in
 | 
				
			||||||
 | 
					        x86*) $uses_asm && tag ToolFile RelativePath="$self_dirname/../x86-msvs/yasm.rules"
 | 
				
			||||||
 | 
					        ;;
 | 
				
			||||||
 | 
					        arm*|iwmmx*)
 | 
				
			||||||
 | 
					            if [ "$name" == "vpx" ];then
 | 
				
			||||||
 | 
					            case "$target" in
 | 
				
			||||||
 | 
					                armv5*)
 | 
				
			||||||
 | 
					                    tag ToolFile RelativePath="$self_dirname/../arm-wince-vs8/armasmv5.rules"
 | 
				
			||||||
 | 
					                ;;
 | 
				
			||||||
 | 
					                armv6*)
 | 
				
			||||||
 | 
					                    tag ToolFile RelativePath="$self_dirname/../arm-wince-vs8/armasmv6.rules"
 | 
				
			||||||
 | 
					                ;;
 | 
				
			||||||
 | 
					                iwmmxt*)
 | 
				
			||||||
 | 
					                    tag ToolFile RelativePath="$self_dirname/../arm-wince-vs8/armasmxscale.rules"
 | 
				
			||||||
 | 
					                ;;
 | 
				
			||||||
 | 
					            esac
 | 
				
			||||||
 | 
					            fi
 | 
				
			||||||
 | 
					        ;;
 | 
				
			||||||
 | 
					    esac
 | 
				
			||||||
 | 
					    close_tag ToolFiles
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    open_tag  Configurations
 | 
				
			||||||
    for plat in "${platforms[@]}"; do
 | 
					    for plat in "${platforms[@]}"; do
 | 
				
			||||||
        plat_no_ws=`echo $plat | sed 's/[^A-Za-z0-9_]/_/g'`
 | 
					        plat_no_ws=`echo $plat | sed 's/[^A-Za-z0-9_]/_/g'`
 | 
				
			||||||
        open_tag Configuration \
 | 
					        open_tag  Configuration \
 | 
				
			||||||
            Name="Debug|$plat" \
 | 
					                      Name="Debug|$plat" \
 | 
				
			||||||
            OutputDirectory="\$(SolutionDir)$plat_no_ws/\$(ConfigurationName)" \
 | 
					                      OutputDirectory="\$(SolutionDir)$plat_no_ws/\$(ConfigurationName)" \
 | 
				
			||||||
            IntermediateDirectory="$plat_no_ws/\$(ConfigurationName)/${name}" \
 | 
					                      IntermediateDirectory="$plat_no_ws/\$(ConfigurationName)/${name}" \
 | 
				
			||||||
            ConfigurationType="$vs_ConfigurationType" \
 | 
					                      ConfigurationType="$vs_ConfigurationType" \
 | 
				
			||||||
            CharacterSet="1" \
 | 
					                      CharacterSet="1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if [ "$target" == "armv6-wince-vs8" ] || [ "$target" == "armv5te-wince-vs8" ] || [ "$target" == "iwmmxt-wince-vs8" ] || [ "$target" == "iwmmxt2-wince-vs8" ];then
 | 
				
			||||||
 | 
					            case "$name" in
 | 
				
			||||||
 | 
					                vpx)         tag Tool \
 | 
				
			||||||
 | 
					                             Name="VCPreBuildEventTool" \
 | 
				
			||||||
 | 
					                             CommandLine="call obj_int_extract.bat \$(ConfigurationName)"
 | 
				
			||||||
 | 
					                             tag Tool \
 | 
				
			||||||
 | 
					                             Name="VCMIDLTool" \
 | 
				
			||||||
 | 
					                             TargetEnvironment="1"
 | 
				
			||||||
 | 
					                             tag Tool \
 | 
				
			||||||
 | 
					                             Name="VCCLCompilerTool" \
 | 
				
			||||||
 | 
					                             ExecutionBucket="7" \
 | 
				
			||||||
 | 
					                             Optimization="0" \
 | 
				
			||||||
 | 
					                             AdditionalIncludeDirectories="$incs" \
 | 
				
			||||||
 | 
					                             PreprocessorDefinitions="_DEBUG;_WIN32_WCE=\$(CEVER);UNDER_CE;\$(PLATFORMDEFINES);WINCE;DEBUG;_LIB;\$(ARCHFAM);\$(_ARCHFAM_);_UNICODE;UNICODE;" \
 | 
				
			||||||
 | 
					                             MinimalRebuild="true" \
 | 
				
			||||||
 | 
					                             RuntimeLibrary="1" \
 | 
				
			||||||
 | 
					                             BufferSecurityCheck="false" \
 | 
				
			||||||
 | 
					                             UsePrecompiledHeader="0" \
 | 
				
			||||||
 | 
					                             WarningLevel="3" \
 | 
				
			||||||
 | 
					                             DebugInformationFormat="1" \
 | 
				
			||||||
 | 
					                             CompileAs="1"
 | 
				
			||||||
 | 
					                             tag Tool \
 | 
				
			||||||
 | 
					                             Name="VCResourceCompilerTool" \
 | 
				
			||||||
 | 
					                             PreprocessorDefinitions="_DEBUG;_WIN32_WCE=\$(CEVER);UNDER_CE;\$(PLATFORMDEFINES)" \
 | 
				
			||||||
 | 
					                             Culture="1033" \
 | 
				
			||||||
 | 
					                             AdditionalIncludeDirectories="\$(IntDir)" \
 | 
				
			||||||
 | 
					                ;;
 | 
				
			||||||
 | 
					                example|xma) tag Tool \
 | 
				
			||||||
 | 
					                             Name="VCCLCompilerTool" \
 | 
				
			||||||
 | 
					                             ExecutionBucket="7" \
 | 
				
			||||||
 | 
					                             Optimization="0" \
 | 
				
			||||||
 | 
					                             AdditionalIncludeDirectories="$incs" \
 | 
				
			||||||
 | 
					                             PreprocessorDefinitions="_DEBUG;_WIN32_WCE=\$(CEVER);UNDER_CE;\$(PLATFORMDEFINES);WINCE;DEBUG;_CONSOLE;\$(ARCHFAM);\$(_ARCHFAM_);_UNICODE;UNICODE;" \
 | 
				
			||||||
 | 
					                             MinimalRebuild="true" \
 | 
				
			||||||
 | 
					                             RuntimeLibrary="1" \
 | 
				
			||||||
 | 
					                             BufferSecurityCheck="false" \
 | 
				
			||||||
 | 
					                             UsePrecompiledHeader="0" \
 | 
				
			||||||
 | 
					                             WarningLevel="3" \
 | 
				
			||||||
 | 
					                             DebugInformationFormat="1" \
 | 
				
			||||||
 | 
					                             CompileAs="1"
 | 
				
			||||||
 | 
					                             tag Tool \
 | 
				
			||||||
 | 
					                             Name="VCResourceCompilerTool" \
 | 
				
			||||||
 | 
					                             PreprocessorDefinitions="_DEBUG;_WIN32_WCE=\$(CEVER);UNDER_CE;\$(PLATFORMDEFINES)" \
 | 
				
			||||||
 | 
					                             Culture="1033" \
 | 
				
			||||||
 | 
					                             AdditionalIncludeDirectories="\$(IntDir)" \
 | 
				
			||||||
 | 
					                ;;
 | 
				
			||||||
 | 
					                obj_int_extract) tag Tool \
 | 
				
			||||||
 | 
					                             Name="VCCLCompilerTool" \
 | 
				
			||||||
 | 
					                             Optimization="0" \
 | 
				
			||||||
 | 
					                             AdditionalIncludeDirectories="$incs" \
 | 
				
			||||||
 | 
					                             PreprocessorDefinitions="WIN32;DEBUG;_CONSOLE" \
 | 
				
			||||||
 | 
					                             RuntimeLibrary="1" \
 | 
				
			||||||
 | 
					                             WarningLevel="3" \
 | 
				
			||||||
 | 
					                             DebugInformationFormat="1" \
 | 
				
			||||||
 | 
					                ;;
 | 
				
			||||||
 | 
					            esac
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        case "$target" in
 | 
					        case "$target" in
 | 
				
			||||||
            x86*)
 | 
					            x86*) tag Tool \
 | 
				
			||||||
                case "$name" in
 | 
					                Name="VCCLCompilerTool" \
 | 
				
			||||||
                    obj_int_extract)
 | 
					                Optimization="0" \
 | 
				
			||||||
                        tag Tool \
 | 
					                AdditionalIncludeDirectories="$incs" \
 | 
				
			||||||
                            Name="VCCLCompilerTool" \
 | 
					                PreprocessorDefinitions="WIN32;_DEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;$defines" \
 | 
				
			||||||
                            Optimization="0" \
 | 
					                RuntimeLibrary="$debug_runtime" \
 | 
				
			||||||
                            AdditionalIncludeDirectories="$incs" \
 | 
					                UsePrecompiledHeader="0" \
 | 
				
			||||||
                            PreprocessorDefinitions="WIN32;DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE" \
 | 
					                WarningLevel="3" \
 | 
				
			||||||
                            RuntimeLibrary="$debug_runtime" \
 | 
					                DebugInformationFormat="1" \
 | 
				
			||||||
                            WarningLevel="3" \
 | 
					                Detect64BitPortabilityProblems="true" \
 | 
				
			||||||
                            DebugInformationFormat="1" \
 | 
					 | 
				
			||||||
                            $warn_64bit \
 | 
					 | 
				
			||||||
                    ;;
 | 
					 | 
				
			||||||
                    vpx)
 | 
					 | 
				
			||||||
                        tag Tool \
 | 
					 | 
				
			||||||
                            Name="VCPreBuildEventTool" \
 | 
					 | 
				
			||||||
                            CommandLine="call obj_int_extract.bat $src_path_bare" \
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        tag Tool \
 | 
					                $uses_asm && tag Tool Name="YASM"  IncludePaths="$incs" Debug="1"
 | 
				
			||||||
                            Name="VCCLCompilerTool" \
 | 
					 | 
				
			||||||
                            Optimization="0" \
 | 
					 | 
				
			||||||
                            AdditionalIncludeDirectories="$incs" \
 | 
					 | 
				
			||||||
                            PreprocessorDefinitions="WIN32;_DEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;$defines" \
 | 
					 | 
				
			||||||
                            RuntimeLibrary="$debug_runtime" \
 | 
					 | 
				
			||||||
                            UsePrecompiledHeader="0" \
 | 
					 | 
				
			||||||
                            WarningLevel="3" \
 | 
					 | 
				
			||||||
                            DebugInformationFormat="2" \
 | 
					 | 
				
			||||||
                            $warn_64bit \
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                        $uses_asm && tag Tool Name="YASM"  IncludePaths="$incs" Debug="true"
 | 
					 | 
				
			||||||
                    ;;
 | 
					 | 
				
			||||||
                    *)
 | 
					 | 
				
			||||||
                        tag Tool \
 | 
					 | 
				
			||||||
                            Name="VCCLCompilerTool" \
 | 
					 | 
				
			||||||
                            Optimization="0" \
 | 
					 | 
				
			||||||
                            AdditionalIncludeDirectories="$incs" \
 | 
					 | 
				
			||||||
                            PreprocessorDefinitions="WIN32;_DEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;$defines" \
 | 
					 | 
				
			||||||
                            RuntimeLibrary="$debug_runtime" \
 | 
					 | 
				
			||||||
                            UsePrecompiledHeader="0" \
 | 
					 | 
				
			||||||
                            WarningLevel="3" \
 | 
					 | 
				
			||||||
                            DebugInformationFormat="2" \
 | 
					 | 
				
			||||||
                            $warn_64bit \
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                        $uses_asm && tag Tool Name="YASM"  IncludePaths="$incs" Debug="true"
 | 
					 | 
				
			||||||
                    ;;
 | 
					 | 
				
			||||||
                esac
 | 
					 | 
				
			||||||
            ;;
 | 
					            ;;
 | 
				
			||||||
        esac
 | 
					        esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        case "$proj_kind" in
 | 
					        case "$proj_kind" in
 | 
				
			||||||
            exe)
 | 
					            exe)
 | 
				
			||||||
                case "$target" in
 | 
					                case "$target" in
 | 
				
			||||||
                    x86*)
 | 
					                    x86*) tag Tool \
 | 
				
			||||||
 | 
					                          Name="VCLinkerTool" \
 | 
				
			||||||
 | 
					                          AdditionalDependencies="$debug_libs \$(NoInherit)" \
 | 
				
			||||||
 | 
					                          AdditionalLibraryDirectories="$libdirs" \
 | 
				
			||||||
 | 
					                          GenerateDebugInformation="true" \
 | 
				
			||||||
 | 
					                          ProgramDatabaseFile="\$(OutDir)/${name}.pdb" \
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    ;;
 | 
				
			||||||
 | 
					                    arm*|iwmmx*)
 | 
				
			||||||
                        case "$name" in
 | 
					                        case "$name" in
 | 
				
			||||||
                            obj_int_extract)
 | 
					                            obj_int_extract) tag Tool \
 | 
				
			||||||
                                tag Tool \
 | 
					                                Name="VCLinkerTool" \
 | 
				
			||||||
                                    Name="VCLinkerTool" \
 | 
					                                OutputFile="${name}.exe" \
 | 
				
			||||||
                                    OutputFile="${name}.exe" \
 | 
					                                GenerateDebugInformation="true"
 | 
				
			||||||
                                    GenerateDebugInformation="true" \
 | 
					 | 
				
			||||||
                            ;;
 | 
					                            ;;
 | 
				
			||||||
                            *)
 | 
					                            *) tag Tool \
 | 
				
			||||||
                                tag Tool \
 | 
					                                Name="VCLinkerTool" \
 | 
				
			||||||
                                    Name="VCLinkerTool" \
 | 
					                                AdditionalDependencies="$debug_libs" \
 | 
				
			||||||
                                    AdditionalDependencies="$debug_libs \$(NoInherit)" \
 | 
					                                OutputFile="\$(OutDir)/${name}.exe" \
 | 
				
			||||||
                                    AdditionalLibraryDirectories="$libdirs" \
 | 
					                                LinkIncremental="2" \
 | 
				
			||||||
                                    GenerateDebugInformation="true" \
 | 
					                                AdditionalLibraryDirectories="${libdirs};"..\lib/$plat_no_ws"" \
 | 
				
			||||||
                                    ProgramDatabaseFile="\$(OutDir)/${name}.pdb" \
 | 
					                                DelayLoadDLLs="\$(NOINHERIT)" \
 | 
				
			||||||
 | 
					                                GenerateDebugInformation="true" \
 | 
				
			||||||
 | 
					                                ProgramDatabaseFile="\$(OutDir)/${name}.pdb" \
 | 
				
			||||||
 | 
					                                SubSystem="9" \
 | 
				
			||||||
 | 
					                                StackReserveSize="65536" \
 | 
				
			||||||
 | 
					                                StackCommitSize="4096" \
 | 
				
			||||||
 | 
					                                EntryPointSymbol="mainWCRTStartup" \
 | 
				
			||||||
 | 
					                                TargetMachine="3"
 | 
				
			||||||
                            ;;
 | 
					                            ;;
 | 
				
			||||||
                        esac
 | 
					                        esac
 | 
				
			||||||
                    ;;
 | 
					                     ;;
 | 
				
			||||||
                 esac
 | 
					                 esac
 | 
				
			||||||
            ;;
 | 
					            ;;
 | 
				
			||||||
            lib)
 | 
					            lib)
 | 
				
			||||||
                case "$target" in
 | 
					                case "$target" in
 | 
				
			||||||
                    x86*)
 | 
					                      arm*|iwmmx*) tag Tool \
 | 
				
			||||||
                        tag Tool \
 | 
					                                    Name="VCLibrarianTool" \
 | 
				
			||||||
                            Name="VCLibrarianTool" \
 | 
					                                    AdditionalOptions=" /subsystem:windowsce,4.20 /machine:ARM" \
 | 
				
			||||||
                            OutputFile="\$(OutDir)/${name}${lib_sfx}d.lib" \
 | 
					                                    OutputFile="\$(OutDir)/${name}.lib" \
 | 
				
			||||||
 | 
					                                ;;
 | 
				
			||||||
                    ;;
 | 
					                                *) tag Tool \
 | 
				
			||||||
 | 
					                                    Name="VCLibrarianTool" \
 | 
				
			||||||
 | 
					                                    OutputFile="\$(OutDir)/${name}${lib_sfx}d.lib" \
 | 
				
			||||||
 | 
					                                ;;
 | 
				
			||||||
                esac
 | 
					                esac
 | 
				
			||||||
            ;;
 | 
					            ;;
 | 
				
			||||||
            dll)
 | 
					            dll) tag Tool \
 | 
				
			||||||
                tag Tool \
 | 
					                 Name="VCLinkerTool" \
 | 
				
			||||||
                    Name="VCLinkerTool" \
 | 
					                AdditionalDependencies="\$(NoInherit)" \
 | 
				
			||||||
                    AdditionalDependencies="\$(NoInherit)" \
 | 
					                LinkIncremental="2" \
 | 
				
			||||||
                    LinkIncremental="2" \
 | 
					                GenerateDebugInformation="true" \
 | 
				
			||||||
                    GenerateDebugInformation="true" \
 | 
					                AssemblyDebug="1" \
 | 
				
			||||||
                    AssemblyDebug="1" \
 | 
					                TargetMachine="1" \
 | 
				
			||||||
                    TargetMachine="1" \
 | 
					                      $link_opts
 | 
				
			||||||
                    $link_opts \
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        esac
 | 
					        esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if [ "$target" == "armv6-wince-vs8" ] || [ "$target" == "armv5te-wince-vs8" ] || [ "$target" == "iwmmxt-wince-vs8" ] || [ "$target" == "iwmmxt2-wince-vs8" ];then
 | 
				
			||||||
 | 
					            case "$name" in
 | 
				
			||||||
 | 
					                vpx)         tag DeploymentTool \
 | 
				
			||||||
 | 
					                             ForceDirty="-1" \
 | 
				
			||||||
 | 
					                             RegisterOutput="0"
 | 
				
			||||||
 | 
					                                ;;
 | 
				
			||||||
 | 
					                example|xma) tag DeploymentTool \
 | 
				
			||||||
 | 
					                             ForceDirty="-1" \
 | 
				
			||||||
 | 
					                             RegisterOutput="0"
 | 
				
			||||||
 | 
					                             tag DebuggerTool \
 | 
				
			||||||
 | 
					                             Arguments="${ARGU}"
 | 
				
			||||||
 | 
					                                ;;
 | 
				
			||||||
 | 
					            esac
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
        close_tag Configuration
 | 
					        close_tag Configuration
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        open_tag Configuration \
 | 
					        open_tag  Configuration \
 | 
				
			||||||
            Name="Release|$plat" \
 | 
					                      Name="Release|$plat" \
 | 
				
			||||||
            OutputDirectory="\$(SolutionDir)$plat_no_ws/\$(ConfigurationName)" \
 | 
					                      OutputDirectory="\$(SolutionDir)$plat_no_ws/\$(ConfigurationName)" \
 | 
				
			||||||
            IntermediateDirectory="$plat_no_ws/\$(ConfigurationName)/${name}" \
 | 
					                      IntermediateDirectory="$plat_no_ws/\$(ConfigurationName)/${name}" \
 | 
				
			||||||
            ConfigurationType="$vs_ConfigurationType" \
 | 
					                      ConfigurationType="$vs_ConfigurationType" \
 | 
				
			||||||
            CharacterSet="1" \
 | 
					                      CharacterSet="1" \
 | 
				
			||||||
            WholeProgramOptimization="0" \
 | 
					                      WholeProgramOptimization="0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        case "$target" in
 | 
					        if [ "$target" == "armv6-wince-vs8" ] || [ "$target" == "armv5te-wince-vs8" ] || [ "$target" == "iwmmxt-wince-vs8" ] || [ "$target" == "iwmmxt2-wince-vs8" ];then
 | 
				
			||||||
            x86*)
 | 
					            case "$name" in
 | 
				
			||||||
                case "$name" in
 | 
					                vpx)         tag Tool \
 | 
				
			||||||
                    obj_int_extract)
 | 
					                                     Name="VCPreBuildEventTool" \
 | 
				
			||||||
                        tag Tool \
 | 
					                                     CommandLine="call obj_int_extract.bat \$(ConfigurationName)"
 | 
				
			||||||
                            Name="VCCLCompilerTool" \
 | 
					                             tag Tool \
 | 
				
			||||||
                            Optimization="2" \
 | 
					                                     Name="VCMIDLTool" \
 | 
				
			||||||
                            FavorSizeorSpeed="1" \
 | 
					                                     TargetEnvironment="1"
 | 
				
			||||||
                            AdditionalIncludeDirectories="$incs" \
 | 
					                             tag Tool \
 | 
				
			||||||
                            PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE" \
 | 
					                                             Name="VCCLCompilerTool" \
 | 
				
			||||||
                            RuntimeLibrary="$release_runtime" \
 | 
					                                             ExecutionBucket="7" \
 | 
				
			||||||
                            UsePrecompiledHeader="0" \
 | 
					                                             Optimization="2" \
 | 
				
			||||||
                            WarningLevel="3" \
 | 
					                                             FavorSizeOrSpeed="1" \
 | 
				
			||||||
                            DebugInformationFormat="0" \
 | 
					                                             AdditionalIncludeDirectories="$incs" \
 | 
				
			||||||
                            $warn_64bit \
 | 
					                                             PreprocessorDefinitions="NDEBUG;_WIN32_WCE=\$(CEVER);UNDER_CE;\$(PLATFORMDEFINES);WINCE;_LIB;\$(ARCHFAM);\$(_ARCHFAM_);_UNICODE;UNICODE;" \
 | 
				
			||||||
                    ;;
 | 
					                                             RuntimeLibrary="0" \
 | 
				
			||||||
                    vpx)
 | 
					                                             BufferSecurityCheck="false" \
 | 
				
			||||||
                        tag Tool \
 | 
					                                             UsePrecompiledHeader="0" \
 | 
				
			||||||
                            Name="VCPreBuildEventTool" \
 | 
					                                             WarningLevel="3" \
 | 
				
			||||||
                            CommandLine="call obj_int_extract.bat $src_path_bare" \
 | 
					                                             DebugInformationFormat="0" \
 | 
				
			||||||
 | 
					                                             CompileAs="1"
 | 
				
			||||||
 | 
					                             tag Tool \
 | 
				
			||||||
 | 
					                                             Name="VCResourceCompilerTool" \
 | 
				
			||||||
 | 
					                                             PreprocessorDefinitions="NDEBUG;_WIN32_WCE=\$(CEVER);UNDER_CE;\$(PLATFORMDEFINES)" \
 | 
				
			||||||
 | 
					                                             Culture="1033" \
 | 
				
			||||||
 | 
					                                             AdditionalIncludeDirectories="\$(IntDir)" \
 | 
				
			||||||
 | 
					                ;;
 | 
				
			||||||
 | 
					                example|xma) tag Tool \
 | 
				
			||||||
 | 
					                             Name="VCCLCompilerTool" \
 | 
				
			||||||
 | 
					                             ExecutionBucket="7" \
 | 
				
			||||||
 | 
					                             Optimization="2" \
 | 
				
			||||||
 | 
					                             FavorSizeOrSpeed="1" \
 | 
				
			||||||
 | 
					                             AdditionalIncludeDirectories="$incs" \
 | 
				
			||||||
 | 
					                             PreprocessorDefinitions="NDEBUG;_WIN32_WCE=\$(CEVER);UNDER_CE;\$(PLATFORMDEFINES);WINCE;_CONSOLE;\$(ARCHFAM);\$(_ARCHFAM_);_UNICODE;UNICODE;" \
 | 
				
			||||||
 | 
					                             RuntimeLibrary="0" \
 | 
				
			||||||
 | 
					                             BufferSecurityCheck="false" \
 | 
				
			||||||
 | 
					                             UsePrecompiledHeader="0" \
 | 
				
			||||||
 | 
					                             WarningLevel="3" \
 | 
				
			||||||
 | 
					                             DebugInformationFormat="0" \
 | 
				
			||||||
 | 
					                             CompileAs="1"
 | 
				
			||||||
 | 
					                             tag Tool \
 | 
				
			||||||
 | 
					                             Name="VCResourceCompilerTool" \
 | 
				
			||||||
 | 
					                             PreprocessorDefinitions="NDEBUG;_WIN32_WCE=\$(CEVER);UNDER_CE;\$(PLATFORMDEFINES)" \
 | 
				
			||||||
 | 
					                             Culture="1033" \
 | 
				
			||||||
 | 
					                             AdditionalIncludeDirectories="\$(IntDir)" \
 | 
				
			||||||
 | 
					                ;;
 | 
				
			||||||
 | 
					                obj_int_extract) tag Tool \
 | 
				
			||||||
 | 
					                             Name="VCCLCompilerTool" \
 | 
				
			||||||
 | 
					                             AdditionalIncludeDirectories="$incs" \
 | 
				
			||||||
 | 
					                             PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE" \
 | 
				
			||||||
 | 
					                             RuntimeLibrary="0" \
 | 
				
			||||||
 | 
					                             UsePrecompiledHeader="0" \
 | 
				
			||||||
 | 
					                             WarningLevel="3" \
 | 
				
			||||||
 | 
					                             Detect64BitPortabilityProblems="true" \
 | 
				
			||||||
 | 
					                             DebugInformationFormat="0" \
 | 
				
			||||||
 | 
					                ;;
 | 
				
			||||||
 | 
					            esac
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        tag Tool \
 | 
					    case "$target" in
 | 
				
			||||||
                            Name="VCCLCompilerTool" \
 | 
					        x86*) tag       Tool \
 | 
				
			||||||
                            Optimization="2" \
 | 
					                      Name="VCCLCompilerTool" \
 | 
				
			||||||
                            FavorSizeorSpeed="1" \
 | 
					                      AdditionalIncludeDirectories="$incs" \
 | 
				
			||||||
                            AdditionalIncludeDirectories="$incs" \
 | 
					                      PreprocessorDefinitions="WIN32;NDEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;$defines" \
 | 
				
			||||||
                            PreprocessorDefinitions="WIN32;NDEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;$defines" \
 | 
					                      RuntimeLibrary="$release_runtime" \
 | 
				
			||||||
                            RuntimeLibrary="$release_runtime" \
 | 
					                      UsePrecompiledHeader="0" \
 | 
				
			||||||
                            UsePrecompiledHeader="0" \
 | 
					                      WarningLevel="3" \
 | 
				
			||||||
                            WarningLevel="3" \
 | 
					                      DebugInformationFormat="0" \
 | 
				
			||||||
                            DebugInformationFormat="0" \
 | 
					                      Detect64BitPortabilityProblems="true"
 | 
				
			||||||
                            $warn_64bit \
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        $uses_asm && tag Tool Name="YASM"  IncludePaths="$incs"
 | 
					                $uses_asm && tag Tool Name="YASM"  IncludePaths="$incs"
 | 
				
			||||||
                    ;;
 | 
					                ;;
 | 
				
			||||||
                    *)
 | 
					 | 
				
			||||||
                        tag Tool \
 | 
					 | 
				
			||||||
                            Name="VCCLCompilerTool" \
 | 
					 | 
				
			||||||
                            AdditionalIncludeDirectories="$incs" \
 | 
					 | 
				
			||||||
                            Optimization="2" \
 | 
					 | 
				
			||||||
                            FavorSizeorSpeed="1" \
 | 
					 | 
				
			||||||
                            PreprocessorDefinitions="WIN32;NDEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;$defines" \
 | 
					 | 
				
			||||||
                            RuntimeLibrary="$release_runtime" \
 | 
					 | 
				
			||||||
                            UsePrecompiledHeader="0" \
 | 
					 | 
				
			||||||
                            WarningLevel="3" \
 | 
					 | 
				
			||||||
                            DebugInformationFormat="0" \
 | 
					 | 
				
			||||||
                            $warn_64bit \
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                        $uses_asm && tag Tool Name="YASM"  IncludePaths="$incs"
 | 
					 | 
				
			||||||
                    ;;
 | 
					 | 
				
			||||||
                esac
 | 
					                esac
 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        esac
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        case "$proj_kind" in
 | 
					        case "$proj_kind" in
 | 
				
			||||||
            exe)
 | 
					            exe)
 | 
				
			||||||
                case "$target" in
 | 
					                case "$target" in
 | 
				
			||||||
                    x86*)
 | 
					                    x86*) tag Tool \
 | 
				
			||||||
 | 
					                                  Name="VCLinkerTool" \
 | 
				
			||||||
 | 
					                                  AdditionalDependencies="$libs \$(NoInherit)" \
 | 
				
			||||||
 | 
					                                  AdditionalLibraryDirectories="$libdirs" \
 | 
				
			||||||
 | 
					                    ;;
 | 
				
			||||||
 | 
					                    arm*|iwmmx*)
 | 
				
			||||||
                        case "$name" in
 | 
					                        case "$name" in
 | 
				
			||||||
                            obj_int_extract)
 | 
					                            obj_int_extract) tag Tool \
 | 
				
			||||||
                                tag Tool \
 | 
					                                Name="VCLinkerTool" \
 | 
				
			||||||
                                    Name="VCLinkerTool" \
 | 
					                                OutputFile="${name}.exe" \
 | 
				
			||||||
                                    OutputFile="${name}.exe" \
 | 
					                                LinkIncremental="1" \
 | 
				
			||||||
                                    GenerateDebugInformation="true" \
 | 
					                                GenerateDebugInformation="false" \
 | 
				
			||||||
 | 
					                                SubSystem="0" \
 | 
				
			||||||
 | 
					                                OptimizeReferences="0" \
 | 
				
			||||||
 | 
					                                EnableCOMDATFolding="0" \
 | 
				
			||||||
 | 
					                                TargetMachine="0"
 | 
				
			||||||
                            ;;
 | 
					                            ;;
 | 
				
			||||||
                            *)
 | 
					                            *) tag Tool \
 | 
				
			||||||
                                tag Tool \
 | 
					                                Name="VCLinkerTool" \
 | 
				
			||||||
                                    Name="VCLinkerTool" \
 | 
					                                AdditionalDependencies="$libs" \
 | 
				
			||||||
                                    AdditionalDependencies="$libs \$(NoInherit)" \
 | 
					                                OutputFile="\$(OutDir)/${name}.exe" \
 | 
				
			||||||
                                    AdditionalLibraryDirectories="$libdirs" \
 | 
					                                LinkIncremental="1" \
 | 
				
			||||||
 | 
					                                AdditionalLibraryDirectories="${libdirs};"..\lib/$plat_no_ws"" \
 | 
				
			||||||
 | 
					                                DelayLoadDLLs="\$(NOINHERIT)" \
 | 
				
			||||||
 | 
					                                GenerateDebugInformation="true" \
 | 
				
			||||||
 | 
					                                ProgramDatabaseFile="\$(OutDir)/${name}.pdb" \
 | 
				
			||||||
 | 
					                                SubSystem="9" \
 | 
				
			||||||
 | 
					                                StackReserveSize="65536" \
 | 
				
			||||||
 | 
					                                StackCommitSize="4096" \
 | 
				
			||||||
 | 
					                                OptimizeReferences="2" \
 | 
				
			||||||
 | 
					                                EnableCOMDATFolding="2" \
 | 
				
			||||||
 | 
					                                EntryPointSymbol="mainWCRTStartup" \
 | 
				
			||||||
 | 
					                                TargetMachine="3"
 | 
				
			||||||
                            ;;
 | 
					                            ;;
 | 
				
			||||||
                        esac
 | 
					                        esac
 | 
				
			||||||
                    ;;
 | 
					                     ;;
 | 
				
			||||||
                 esac
 | 
					                 esac
 | 
				
			||||||
            ;;
 | 
					            ;;
 | 
				
			||||||
            lib)
 | 
					        lib)
 | 
				
			||||||
                case "$target" in
 | 
					                case "$target" in
 | 
				
			||||||
                    x86*)
 | 
					                      arm*|iwmmx*) tag Tool \
 | 
				
			||||||
                        tag Tool \
 | 
					                                    Name="VCLibrarianTool" \
 | 
				
			||||||
                            Name="VCLibrarianTool" \
 | 
					                                    AdditionalOptions=" /subsystem:windowsce,4.20 /machine:ARM" \
 | 
				
			||||||
                            OutputFile="\$(OutDir)/${name}${lib_sfx}.lib" \
 | 
					                                    OutputFile="\$(OutDir)/${name}.lib" \
 | 
				
			||||||
 | 
					                                ;;
 | 
				
			||||||
                    ;;
 | 
					                                *) tag Tool \
 | 
				
			||||||
 | 
					                                    Name="VCLibrarianTool" \
 | 
				
			||||||
 | 
					                                    OutputFile="\$(OutDir)/${name}${lib_sfx}.lib" \
 | 
				
			||||||
 | 
					                                ;;
 | 
				
			||||||
                esac
 | 
					                esac
 | 
				
			||||||
            ;;
 | 
					        ;;
 | 
				
			||||||
            dll) # note differences to debug version: LinkIncremental, AssemblyDebug
 | 
					        dll) # note differences to debug version: LinkIncremental, AssemblyDebug
 | 
				
			||||||
                tag Tool \
 | 
					             tag Tool \
 | 
				
			||||||
                    Name="VCLinkerTool" \
 | 
					                      Name="VCLinkerTool" \
 | 
				
			||||||
                    AdditionalDependencies="\$(NoInherit)" \
 | 
					                      AdditionalDependencies="\$(NoInherit)" \
 | 
				
			||||||
                    LinkIncremental="1" \
 | 
					                      LinkIncremental="1" \
 | 
				
			||||||
                    GenerateDebugInformation="true" \
 | 
					                      GenerateDebugInformation="true" \
 | 
				
			||||||
                    TargetMachine="1" \
 | 
					                      TargetMachine="1" \
 | 
				
			||||||
                    $link_opts \
 | 
					                      $link_opts
 | 
				
			||||||
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        esac
 | 
					        esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if [ "$target" == "armv6-wince-vs8" ] || [ "$target" == "armv5te-wince-vs8" ] || [ "$target" == "iwmmxt-wince-vs8" ] || [ "$target" == "iwmmxt2-wince-vs8" ];then
 | 
				
			||||||
 | 
					            case "$name" in
 | 
				
			||||||
 | 
					                vpx)         tag DeploymentTool \
 | 
				
			||||||
 | 
					                             ForceDirty="-1" \
 | 
				
			||||||
 | 
					                             RegisterOutput="0"
 | 
				
			||||||
 | 
					                ;;
 | 
				
			||||||
 | 
					                example|xma) tag DeploymentTool \
 | 
				
			||||||
 | 
					                             ForceDirty="-1" \
 | 
				
			||||||
 | 
					                             RegisterOutput="0"
 | 
				
			||||||
 | 
					                             tag DebuggerTool \
 | 
				
			||||||
 | 
					                             Arguments="${ARGU}"
 | 
				
			||||||
 | 
					                                ;;
 | 
				
			||||||
 | 
					            esac
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        close_tag Configuration
 | 
					        close_tag Configuration
 | 
				
			||||||
    done
 | 
					    done
 | 
				
			||||||
    close_tag Configurations
 | 
					    close_tag Configurations
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    open_tag Files
 | 
					    open_tag  Files
 | 
				
			||||||
    generate_filter srcs   "Source Files"   "c;cc;def;odl;idl;hpj;bat;asm;asmx"
 | 
					    generate_filter srcs   "Source Files"   "cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
 | 
				
			||||||
    generate_filter hdrs   "Header Files"   "h;hm;inl;inc;xsd"
 | 
					    generate_filter hdrs   "Header Files"   "h;hpp;hxx;hm;inl;inc;xsd"
 | 
				
			||||||
    generate_filter resrcs "Resource Files" "rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
 | 
					    generate_filter resrcs "Resource Files" "rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
 | 
				
			||||||
    generate_filter resrcs "Build Files"    "mk"
 | 
					    generate_filter resrcs "Build Files"    "mk"
 | 
				
			||||||
    close_tag Files
 | 
					    close_tag Files
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,7 +25,7 @@ files.
 | 
				
			|||||||
Options:
 | 
					Options:
 | 
				
			||||||
    --help                      Print this message
 | 
					    --help                      Print this message
 | 
				
			||||||
    --out=outfile               Redirect output to a file
 | 
					    --out=outfile               Redirect output to a file
 | 
				
			||||||
    --ver=version               Version (7,8,9,10,11) of visual studio to generate for
 | 
					    --ver=version               Version (7,8,9) of visual studio to generate for
 | 
				
			||||||
    --target=isa-os-cc          Target specifier
 | 
					    --target=isa-os-cc          Target specifier
 | 
				
			||||||
EOF
 | 
					EOF
 | 
				
			||||||
    exit 1
 | 
					    exit 1
 | 
				
			||||||
@@ -55,38 +55,22 @@ indent_pop() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
parse_project() {
 | 
					parse_project() {
 | 
				
			||||||
    local file=$1
 | 
					    local file=$1
 | 
				
			||||||
    if [ "$sfx" = "vcproj" ]; then
 | 
					    local name=`grep Name "$file" | awk 'BEGIN {FS="\""}{if (NR==1) print $2}'`
 | 
				
			||||||
        local name=`grep Name "$file" | awk 'BEGIN {FS="\""}{if (NR==1) print $2}'`
 | 
					    local guid=`grep ProjectGUID "$file" | awk 'BEGIN {FS="\""}{if (NR==1) print $2}'`
 | 
				
			||||||
        local guid=`grep ProjectGUID "$file" | awk 'BEGIN {FS="\""}{if (NR==1) print $2}'`
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        local name=`grep RootNamespace "$file" | sed 's,.*<.*>\(.*\)</.*>.*,\1,'`
 | 
					 | 
				
			||||||
        local guid=`grep ProjectGuid "$file" | sed 's,.*<.*>\(.*\)</.*>.*,\1,'`
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # save the project GUID to a varaible, normalizing to the basename of the
 | 
					    # save the project GUID to a varaible, normalizing to the basename of the
 | 
				
			||||||
    # vcproj file without the extension
 | 
					    # vcproj file without the extension
 | 
				
			||||||
    local var
 | 
					    local var
 | 
				
			||||||
    var=${file##*/}
 | 
					    var=${file##*/}
 | 
				
			||||||
    var=${var%%.${sfx}}
 | 
					    var=${var%%.vcproj}
 | 
				
			||||||
    eval "${var}_file=\"$1\""
 | 
					    eval "${var}_file=\"$1\""
 | 
				
			||||||
    eval "${var}_name=$name"
 | 
					    eval "${var}_name=$name"
 | 
				
			||||||
    eval "${var}_guid=$guid"
 | 
					    eval "${var}_guid=$guid"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if [ "$sfx" = "vcproj" ]; then
 | 
					    # assume that all projects have the same list of possible configurations,
 | 
				
			||||||
        cur_config_list=`grep -A1 '<Configuration' $file |
 | 
					    # so overwriting old config_lists is not a problem
 | 
				
			||||||
            grep Name | cut -d\" -f2`
 | 
					    config_list=`grep -A1 '<Configuration' $file |
 | 
				
			||||||
    else
 | 
					        grep Name | cut -d\" -f2`
 | 
				
			||||||
        cur_config_list=`grep -B1 'Label="Configuration"' $file |
 | 
					 | 
				
			||||||
            grep Condition | cut -d\' -f4`
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
    new_config_list=$(for i in $config_list $cur_config_list; do
 | 
					 | 
				
			||||||
        echo $i
 | 
					 | 
				
			||||||
    done | sort | uniq)
 | 
					 | 
				
			||||||
    if [ "$config_list" != "" ] && [ "$config_list" != "$new_config_list" ]; then
 | 
					 | 
				
			||||||
        mixed_platforms=1
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
    config_list="$new_config_list"
 | 
					 | 
				
			||||||
    eval "${var}_config_list=\"$cur_config_list\""
 | 
					 | 
				
			||||||
    proj_list="${proj_list} ${var}"
 | 
					    proj_list="${proj_list} ${var}"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -99,14 +83,14 @@ process_project() {
 | 
				
			|||||||
    # vcproj file without the extension
 | 
					    # vcproj file without the extension
 | 
				
			||||||
    local var
 | 
					    local var
 | 
				
			||||||
    var=${file##*/}
 | 
					    var=${file##*/}
 | 
				
			||||||
    var=${var%%.${sfx}}
 | 
					    var=${var%%.vcproj}
 | 
				
			||||||
    eval "${var}_guid=$guid"
 | 
					    eval "${var}_guid=$guid"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    echo "Project(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"$name\", \"$file\", \"$guid\""
 | 
					    echo "Project(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"$name\", \"$file\", \"$guid\""
 | 
				
			||||||
    indent_push
 | 
					    indent_push
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    eval "local deps=\"\${${var}_deps}\""
 | 
					    eval "local deps=\"\${${var}_deps}\""
 | 
				
			||||||
    if [ -n "$deps" ] && [ "$sfx" = "vcproj" ]; then
 | 
					    if [ -n "$deps" ]; then
 | 
				
			||||||
        echo "${indent}ProjectSection(ProjectDependencies) = postProject"
 | 
					        echo "${indent}ProjectSection(ProjectDependencies) = postProject"
 | 
				
			||||||
        indent_push
 | 
					        indent_push
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -136,11 +120,6 @@ process_global() {
 | 
				
			|||||||
    indent_push
 | 
					    indent_push
 | 
				
			||||||
    IFS_bak=${IFS}
 | 
					    IFS_bak=${IFS}
 | 
				
			||||||
    IFS=$'\r'$'\n'
 | 
					    IFS=$'\r'$'\n'
 | 
				
			||||||
    if [ "$mixed_platforms" != "" ]; then
 | 
					 | 
				
			||||||
        config_list="
 | 
					 | 
				
			||||||
Release|Mixed Platforms
 | 
					 | 
				
			||||||
Debug|Mixed Platforms"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
    for config in ${config_list}; do
 | 
					    for config in ${config_list}; do
 | 
				
			||||||
        echo "${indent}$config = $config"
 | 
					        echo "${indent}$config = $config"
 | 
				
			||||||
    done
 | 
					    done
 | 
				
			||||||
@@ -155,18 +134,14 @@ Debug|Mixed Platforms"
 | 
				
			|||||||
    indent_push
 | 
					    indent_push
 | 
				
			||||||
    for proj in ${proj_list}; do
 | 
					    for proj in ${proj_list}; do
 | 
				
			||||||
        eval "local proj_guid=\${${proj}_guid}"
 | 
					        eval "local proj_guid=\${${proj}_guid}"
 | 
				
			||||||
        eval "local proj_config_list=\${${proj}_config_list}"
 | 
					 | 
				
			||||||
        IFS=$'\r'$'\n'
 | 
					        IFS=$'\r'$'\n'
 | 
				
			||||||
        for config in ${proj_config_list}; do
 | 
					        for config in ${config_list}; do
 | 
				
			||||||
            if [ "$mixed_platforms" != "" ]; then
 | 
					            echo "${indent}${proj_guid}.${config}.ActiveCfg = ${config}"
 | 
				
			||||||
                local c=${config%%|*}
 | 
					            echo "${indent}${proj_guid}.${config}.Build.0 = ${config}"
 | 
				
			||||||
                echo "${indent}${proj_guid}.${c}|Mixed Platforms.ActiveCfg = ${config}"
 | 
					 | 
				
			||||||
                echo "${indent}${proj_guid}.${c}|Mixed Platforms.Build.0 = ${config}"
 | 
					 | 
				
			||||||
            else
 | 
					 | 
				
			||||||
                echo "${indent}${proj_guid}.${config}.ActiveCfg = ${config}"
 | 
					 | 
				
			||||||
                echo "${indent}${proj_guid}.${config}.Build.0 = ${config}"
 | 
					 | 
				
			||||||
            fi
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if [ "$target" == "armv6-wince-vs8" ] || [ "$target" == "armv5te-wince-vs8" ] || [ "$target" == "iwmmxt-wince-vs8" ] || [ "$target" == "iwmmxt2-wince-vs8" ];then
 | 
				
			||||||
 | 
					                echo "${indent}${proj_guid}.${config}.Deploy.0 = ${config}"
 | 
				
			||||||
 | 
					            fi
 | 
				
			||||||
        done
 | 
					        done
 | 
				
			||||||
        IFS=${IFS_bak}
 | 
					        IFS=${IFS_bak}
 | 
				
			||||||
    done
 | 
					    done
 | 
				
			||||||
@@ -191,14 +166,9 @@ process_makefile() {
 | 
				
			|||||||
    IFS=$'\r'$'\n'
 | 
					    IFS=$'\r'$'\n'
 | 
				
			||||||
    local TAB=$'\t'
 | 
					    local TAB=$'\t'
 | 
				
			||||||
    cat <<EOF
 | 
					    cat <<EOF
 | 
				
			||||||
ifeq (\$(CONFIG_VS_VERSION),7)
 | 
					found_devenv := \$(shell which devenv.com >/dev/null 2>&1 && echo yes)
 | 
				
			||||||
MSBUILD_TOOL := devenv.com
 | 
					 | 
				
			||||||
else
 | 
					 | 
				
			||||||
MSBUILD_TOOL := msbuild.exe
 | 
					 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
found_devenv := \$(shell which \$(MSBUILD_TOOL) >/dev/null 2>&1 && echo yes)
 | 
					 | 
				
			||||||
.nodevenv.once:
 | 
					.nodevenv.once:
 | 
				
			||||||
${TAB}@echo "  * \$(MSBUILD_TOOL) not found in path."
 | 
					${TAB}@echo "  * devenv.com not found in path."
 | 
				
			||||||
${TAB}@echo "  * "
 | 
					${TAB}@echo "  * "
 | 
				
			||||||
${TAB}@echo "  * You will have to build all configurations manually using the"
 | 
					${TAB}@echo "  * You will have to build all configurations manually using the"
 | 
				
			||||||
${TAB}@echo "  * Visual Studio IDE. To allow make to build them automatically,"
 | 
					${TAB}@echo "  * Visual Studio IDE. To allow make to build them automatically,"
 | 
				
			||||||
@@ -223,17 +193,16 @@ ${TAB}rm -rf "$platform"/"$config"
 | 
				
			|||||||
ifneq (\$(found_devenv),)
 | 
					ifneq (\$(found_devenv),)
 | 
				
			||||||
  ifeq (\$(CONFIG_VS_VERSION),7)
 | 
					  ifeq (\$(CONFIG_VS_VERSION),7)
 | 
				
			||||||
$nows_sln_config: $outfile
 | 
					$nows_sln_config: $outfile
 | 
				
			||||||
${TAB}\$(MSBUILD_TOOL) $outfile -build "$config"
 | 
					${TAB}devenv.com $outfile -build "$config"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
$nows_sln_config: $outfile
 | 
					$nows_sln_config: $outfile
 | 
				
			||||||
${TAB}\$(MSBUILD_TOOL) $outfile -m -t:Build \\
 | 
					${TAB}devenv.com $outfile -build "$sln_config"
 | 
				
			||||||
${TAB}${TAB}-p:Configuration="$config" -p:Platform="$platform"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  endif
 | 
					  endif
 | 
				
			||||||
else
 | 
					else
 | 
				
			||||||
$nows_sln_config: $outfile .nodevenv.once
 | 
					$nows_sln_config: $outfile .nodevenv.once
 | 
				
			||||||
${TAB}@echo "  * Skipping build of $sln_config (\$(MSBUILD_TOOL) not in path)."
 | 
					${TAB}@echo "  * Skipping build of $sln_config (devenv.com not in path)."
 | 
				
			||||||
${TAB}@echo "  * "
 | 
					${TAB}@echo "  * "
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -255,7 +224,7 @@ for opt in "$@"; do
 | 
				
			|||||||
    ;;
 | 
					    ;;
 | 
				
			||||||
    --ver=*) vs_ver="$optval"
 | 
					    --ver=*) vs_ver="$optval"
 | 
				
			||||||
             case $optval in
 | 
					             case $optval in
 | 
				
			||||||
             [789]|10|11|12)
 | 
					             [789])
 | 
				
			||||||
             ;;
 | 
					             ;;
 | 
				
			||||||
             *) die Unrecognized Visual Studio Version in $opt
 | 
					             *) die Unrecognized Visual Studio Version in $opt
 | 
				
			||||||
             ;;
 | 
					             ;;
 | 
				
			||||||
@@ -291,23 +260,6 @@ case "${vs_ver:-8}" in
 | 
				
			|||||||
    9) sln_vers="10.00"
 | 
					    9) sln_vers="10.00"
 | 
				
			||||||
       sln_vers_str="Visual Studio 2008"
 | 
					       sln_vers_str="Visual Studio 2008"
 | 
				
			||||||
    ;;
 | 
					    ;;
 | 
				
			||||||
    10) sln_vers="11.00"
 | 
					 | 
				
			||||||
       sln_vers_str="Visual Studio 2010"
 | 
					 | 
				
			||||||
    ;;
 | 
					 | 
				
			||||||
    11) sln_vers="12.00"
 | 
					 | 
				
			||||||
       sln_vers_str="Visual Studio 2012"
 | 
					 | 
				
			||||||
    ;;
 | 
					 | 
				
			||||||
    12) sln_vers="12.00"
 | 
					 | 
				
			||||||
       sln_vers_str="Visual Studio 2013"
 | 
					 | 
				
			||||||
    ;;
 | 
					 | 
				
			||||||
esac
 | 
					 | 
				
			||||||
case "${vs_ver:-8}" in
 | 
					 | 
				
			||||||
    [789])
 | 
					 | 
				
			||||||
    sfx=vcproj
 | 
					 | 
				
			||||||
    ;;
 | 
					 | 
				
			||||||
    10|11|12)
 | 
					 | 
				
			||||||
    sfx=vcxproj
 | 
					 | 
				
			||||||
    ;;
 | 
					 | 
				
			||||||
esac
 | 
					esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
for f in "${file_list[@]}"; do
 | 
					for f in "${file_list[@]}"; do
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,544 +0,0 @@
 | 
				
			|||||||
#!/bin/bash
 | 
					 | 
				
			||||||
##
 | 
					 | 
				
			||||||
##  Copyright (c) 2013 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
##
 | 
					 | 
				
			||||||
##  Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
##  that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
##  tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
##  in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
##  be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
##
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
self=$0
 | 
					 | 
				
			||||||
self_basename=${self##*/}
 | 
					 | 
				
			||||||
self_dirname=$(dirname "$0")
 | 
					 | 
				
			||||||
EOL=$'\n'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
show_help() {
 | 
					 | 
				
			||||||
    cat <<EOF
 | 
					 | 
				
			||||||
Usage: ${self_basename} --name=projname [options] file1 [file2 ...]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
This script generates a Visual Studio project file from a list of source
 | 
					 | 
				
			||||||
code files.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Options:
 | 
					 | 
				
			||||||
    --help                      Print this message
 | 
					 | 
				
			||||||
    --exe                       Generate a project for building an Application
 | 
					 | 
				
			||||||
    --lib                       Generate a project for creating a static library
 | 
					 | 
				
			||||||
    --dll                       Generate a project for creating a dll
 | 
					 | 
				
			||||||
    --static-crt                Use the static C runtime (/MT)
 | 
					 | 
				
			||||||
    --target=isa-os-cc          Target specifier (required)
 | 
					 | 
				
			||||||
    --out=filename              Write output to a file [stdout]
 | 
					 | 
				
			||||||
    --name=project_name         Name of the project (required)
 | 
					 | 
				
			||||||
    --proj-guid=GUID            GUID to use for the project
 | 
					 | 
				
			||||||
    --module-def=filename       File containing export definitions (for DLLs)
 | 
					 | 
				
			||||||
    --ver=version               Version (10,11,12) of visual studio to generate for
 | 
					 | 
				
			||||||
    --src-path-bare=dir         Path to root of source tree
 | 
					 | 
				
			||||||
    -Ipath/to/include           Additional include directories
 | 
					 | 
				
			||||||
    -DFLAG[=value]              Preprocessor macros to define
 | 
					 | 
				
			||||||
    -Lpath/to/lib               Additional library search paths
 | 
					 | 
				
			||||||
    -llibname                   Library to link against
 | 
					 | 
				
			||||||
EOF
 | 
					 | 
				
			||||||
    exit 1
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
die() {
 | 
					 | 
				
			||||||
    echo "${self_basename}: $@" >&2
 | 
					 | 
				
			||||||
    exit 1
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
die_unknown(){
 | 
					 | 
				
			||||||
    echo "Unknown option \"$1\"." >&2
 | 
					 | 
				
			||||||
    echo "See ${self_basename} --help for available options." >&2
 | 
					 | 
				
			||||||
    exit 1
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
generate_uuid() {
 | 
					 | 
				
			||||||
    local hex="0123456789ABCDEF"
 | 
					 | 
				
			||||||
    local i
 | 
					 | 
				
			||||||
    local uuid=""
 | 
					 | 
				
			||||||
    local j
 | 
					 | 
				
			||||||
    #93995380-89BD-4b04-88EB-625FBE52EBFB
 | 
					 | 
				
			||||||
    for ((i=0; i<32; i++)); do
 | 
					 | 
				
			||||||
        (( j = $RANDOM % 16 ))
 | 
					 | 
				
			||||||
        uuid="${uuid}${hex:$j:1}"
 | 
					 | 
				
			||||||
    done
 | 
					 | 
				
			||||||
    echo "${uuid:0:8}-${uuid:8:4}-${uuid:12:4}-${uuid:16:4}-${uuid:20:12}"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
indent1="    "
 | 
					 | 
				
			||||||
indent=""
 | 
					 | 
				
			||||||
indent_push() {
 | 
					 | 
				
			||||||
    indent="${indent}${indent1}"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
indent_pop() {
 | 
					 | 
				
			||||||
    indent="${indent%${indent1}}"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
tag_attributes() {
 | 
					 | 
				
			||||||
    for opt in "$@"; do
 | 
					 | 
				
			||||||
        optval="${opt#*=}"
 | 
					 | 
				
			||||||
        [ -n "${optval}" ] ||
 | 
					 | 
				
			||||||
            die "Missing attribute value in '$opt' while generating $tag tag"
 | 
					 | 
				
			||||||
        echo "${indent}${opt%%=*}=\"${optval}\""
 | 
					 | 
				
			||||||
    done
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
open_tag() {
 | 
					 | 
				
			||||||
    local tag=$1
 | 
					 | 
				
			||||||
    shift
 | 
					 | 
				
			||||||
    if [ $# -ne 0 ]; then
 | 
					 | 
				
			||||||
        echo "${indent}<${tag}"
 | 
					 | 
				
			||||||
        indent_push
 | 
					 | 
				
			||||||
        tag_attributes "$@"
 | 
					 | 
				
			||||||
        echo "${indent}>"
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        echo "${indent}<${tag}>"
 | 
					 | 
				
			||||||
        indent_push
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
close_tag() {
 | 
					 | 
				
			||||||
    local tag=$1
 | 
					 | 
				
			||||||
    indent_pop
 | 
					 | 
				
			||||||
    echo "${indent}</${tag}>"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
tag() {
 | 
					 | 
				
			||||||
    local tag=$1
 | 
					 | 
				
			||||||
    shift
 | 
					 | 
				
			||||||
    if [ $# -ne 0 ]; then
 | 
					 | 
				
			||||||
        echo "${indent}<${tag}"
 | 
					 | 
				
			||||||
        indent_push
 | 
					 | 
				
			||||||
        tag_attributes "$@"
 | 
					 | 
				
			||||||
        indent_pop
 | 
					 | 
				
			||||||
        echo "${indent}/>"
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        echo "${indent}<${tag}/>"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
tag_content() {
 | 
					 | 
				
			||||||
    local tag=$1
 | 
					 | 
				
			||||||
    local content=$2
 | 
					 | 
				
			||||||
    shift
 | 
					 | 
				
			||||||
    shift
 | 
					 | 
				
			||||||
    if [ $# -ne 0 ]; then
 | 
					 | 
				
			||||||
        echo "${indent}<${tag}"
 | 
					 | 
				
			||||||
        indent_push
 | 
					 | 
				
			||||||
        tag_attributes "$@"
 | 
					 | 
				
			||||||
        echo "${indent}>${content}</${tag}>"
 | 
					 | 
				
			||||||
        indent_pop
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        echo "${indent}<${tag}>${content}</${tag}>"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
generate_filter() {
 | 
					 | 
				
			||||||
    local name=$1
 | 
					 | 
				
			||||||
    local pats=$2
 | 
					 | 
				
			||||||
    local file_list_sz
 | 
					 | 
				
			||||||
    local i
 | 
					 | 
				
			||||||
    local f
 | 
					 | 
				
			||||||
    local saveIFS="$IFS"
 | 
					 | 
				
			||||||
    local pack
 | 
					 | 
				
			||||||
    echo "generating filter '$name' from ${#file_list[@]} files" >&2
 | 
					 | 
				
			||||||
    IFS=*
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    file_list_sz=${#file_list[@]}
 | 
					 | 
				
			||||||
    for i in ${!file_list[@]}; do
 | 
					 | 
				
			||||||
        f=${file_list[i]}
 | 
					 | 
				
			||||||
        for pat in ${pats//;/$IFS}; do
 | 
					 | 
				
			||||||
            if [ "${f##*.}" == "$pat" ]; then
 | 
					 | 
				
			||||||
                unset file_list[i]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                objf=$(echo ${f%.*}.obj | sed -e 's/^[\./]\+//g' -e 's,/,_,g')
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                if ([ "$pat" == "asm" ] || [ "$pat" == "s" ]) && $asm_use_custom_step; then
 | 
					 | 
				
			||||||
                    open_tag CustomBuild \
 | 
					 | 
				
			||||||
                        Include=".\\$f"
 | 
					 | 
				
			||||||
                    for plat in "${platforms[@]}"; do
 | 
					 | 
				
			||||||
                        for cfg in Debug Release; do
 | 
					 | 
				
			||||||
                            tag_content Message "Assembling %(Filename)%(Extension)" \
 | 
					 | 
				
			||||||
                                Condition="'\$(Configuration)|\$(Platform)'=='$cfg|$plat'"
 | 
					 | 
				
			||||||
                            tag_content Command "$(eval echo \$asm_${cfg}_cmdline) -o \$(IntDir)$objf" \
 | 
					 | 
				
			||||||
                                Condition="'\$(Configuration)|\$(Platform)'=='$cfg|$plat'"
 | 
					 | 
				
			||||||
                            tag_content Outputs "\$(IntDir)$objf" \
 | 
					 | 
				
			||||||
                                Condition="'\$(Configuration)|\$(Platform)'=='$cfg|$plat'"
 | 
					 | 
				
			||||||
                        done
 | 
					 | 
				
			||||||
                    done
 | 
					 | 
				
			||||||
                    close_tag CustomBuild
 | 
					 | 
				
			||||||
                elif [ "$pat" == "c" ] || [ "$pat" == "cc" ] ; then
 | 
					 | 
				
			||||||
                    open_tag ClCompile \
 | 
					 | 
				
			||||||
                        Include=".\\$f"
 | 
					 | 
				
			||||||
                    # Separate file names with Condition?
 | 
					 | 
				
			||||||
                    tag_content ObjectFileName "\$(IntDir)$objf"
 | 
					 | 
				
			||||||
                    close_tag ClCompile
 | 
					 | 
				
			||||||
                elif [ "$pat" == "h" ] ; then
 | 
					 | 
				
			||||||
                    tag ClInclude \
 | 
					 | 
				
			||||||
                        Include=".\\$f"
 | 
					 | 
				
			||||||
                elif [ "$pat" == "vcxproj" ] ; then
 | 
					 | 
				
			||||||
                    open_tag ProjectReference \
 | 
					 | 
				
			||||||
                        Include="$f"
 | 
					 | 
				
			||||||
                    depguid=`grep ProjectGuid "$f" | sed 's,.*<.*>\(.*\)</.*>.*,\1,'`
 | 
					 | 
				
			||||||
                    tag_content Project "$depguid"
 | 
					 | 
				
			||||||
                    tag_content ReferenceOutputAssembly false
 | 
					 | 
				
			||||||
                    close_tag ProjectReference
 | 
					 | 
				
			||||||
                else
 | 
					 | 
				
			||||||
                    tag None \
 | 
					 | 
				
			||||||
                        Include=".\\$f"
 | 
					 | 
				
			||||||
                fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                break
 | 
					 | 
				
			||||||
            fi
 | 
					 | 
				
			||||||
        done
 | 
					 | 
				
			||||||
    done
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    IFS="$saveIFS"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Process command line
 | 
					 | 
				
			||||||
unset target
 | 
					 | 
				
			||||||
for opt in "$@"; do
 | 
					 | 
				
			||||||
    optval="${opt#*=}"
 | 
					 | 
				
			||||||
    case "$opt" in
 | 
					 | 
				
			||||||
        --help|-h) show_help
 | 
					 | 
				
			||||||
        ;;
 | 
					 | 
				
			||||||
        --target=*) target="${optval}"
 | 
					 | 
				
			||||||
        ;;
 | 
					 | 
				
			||||||
        --out=*) outfile="$optval"
 | 
					 | 
				
			||||||
        ;;
 | 
					 | 
				
			||||||
        --name=*) name="${optval}"
 | 
					 | 
				
			||||||
        ;;
 | 
					 | 
				
			||||||
        --proj-guid=*) guid="${optval}"
 | 
					 | 
				
			||||||
        ;;
 | 
					 | 
				
			||||||
        --module-def=*) module_def="${optval}"
 | 
					 | 
				
			||||||
        ;;
 | 
					 | 
				
			||||||
        --exe) proj_kind="exe"
 | 
					 | 
				
			||||||
        ;;
 | 
					 | 
				
			||||||
        --dll) proj_kind="dll"
 | 
					 | 
				
			||||||
        ;;
 | 
					 | 
				
			||||||
        --lib) proj_kind="lib"
 | 
					 | 
				
			||||||
        ;;
 | 
					 | 
				
			||||||
        --src-path-bare=*) src_path_bare="$optval"
 | 
					 | 
				
			||||||
        ;;
 | 
					 | 
				
			||||||
        --static-crt) use_static_runtime=true
 | 
					 | 
				
			||||||
        ;;
 | 
					 | 
				
			||||||
        --ver=*)
 | 
					 | 
				
			||||||
            vs_ver="$optval"
 | 
					 | 
				
			||||||
            case "$optval" in
 | 
					 | 
				
			||||||
                10|11|12)
 | 
					 | 
				
			||||||
                ;;
 | 
					 | 
				
			||||||
                *) die Unrecognized Visual Studio Version in $opt
 | 
					 | 
				
			||||||
                ;;
 | 
					 | 
				
			||||||
            esac
 | 
					 | 
				
			||||||
        ;;
 | 
					 | 
				
			||||||
        -I*)
 | 
					 | 
				
			||||||
            opt="${opt%/}"
 | 
					 | 
				
			||||||
            incs="${incs}${incs:+;}${opt##-I}"
 | 
					 | 
				
			||||||
            yasmincs="${yasmincs} ${opt}"
 | 
					 | 
				
			||||||
        ;;
 | 
					 | 
				
			||||||
        -D*) defines="${defines}${defines:+;}${opt##-D}"
 | 
					 | 
				
			||||||
        ;;
 | 
					 | 
				
			||||||
        -L*) # fudge . to $(OutDir)
 | 
					 | 
				
			||||||
            if [ "${opt##-L}" == "." ]; then
 | 
					 | 
				
			||||||
                libdirs="${libdirs}${libdirs:+;}\$(OutDir)"
 | 
					 | 
				
			||||||
            else
 | 
					 | 
				
			||||||
                 # Also try directories for this platform/configuration
 | 
					 | 
				
			||||||
                 libdirs="${libdirs}${libdirs:+;}${opt##-L}"
 | 
					 | 
				
			||||||
                 libdirs="${libdirs}${libdirs:+;}${opt##-L}/\$(PlatformName)/\$(Configuration)"
 | 
					 | 
				
			||||||
                 libdirs="${libdirs}${libdirs:+;}${opt##-L}/\$(PlatformName)"
 | 
					 | 
				
			||||||
            fi
 | 
					 | 
				
			||||||
        ;;
 | 
					 | 
				
			||||||
        -l*) libs="${libs}${libs:+ }${opt##-l}.lib"
 | 
					 | 
				
			||||||
        ;;
 | 
					 | 
				
			||||||
        -*) die_unknown $opt
 | 
					 | 
				
			||||||
        ;;
 | 
					 | 
				
			||||||
        *)
 | 
					 | 
				
			||||||
            file_list[${#file_list[@]}]="$opt"
 | 
					 | 
				
			||||||
            case "$opt" in
 | 
					 | 
				
			||||||
                 *.asm|*.s) uses_asm=true
 | 
					 | 
				
			||||||
                 ;;
 | 
					 | 
				
			||||||
            esac
 | 
					 | 
				
			||||||
        ;;
 | 
					 | 
				
			||||||
    esac
 | 
					 | 
				
			||||||
done
 | 
					 | 
				
			||||||
outfile=${outfile:-/dev/stdout}
 | 
					 | 
				
			||||||
guid=${guid:-`generate_uuid`}
 | 
					 | 
				
			||||||
asm_use_custom_step=false
 | 
					 | 
				
			||||||
uses_asm=${uses_asm:-false}
 | 
					 | 
				
			||||||
case "${vs_ver:-11}" in
 | 
					 | 
				
			||||||
    10|11|12)
 | 
					 | 
				
			||||||
       asm_use_custom_step=$uses_asm
 | 
					 | 
				
			||||||
    ;;
 | 
					 | 
				
			||||||
esac
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[ -n "$name" ] || die "Project name (--name) must be specified!"
 | 
					 | 
				
			||||||
[ -n "$target" ] || die "Target (--target) must be specified!"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if ${use_static_runtime:-false}; then
 | 
					 | 
				
			||||||
    release_runtime=MultiThreaded
 | 
					 | 
				
			||||||
    debug_runtime=MultiThreadedDebug
 | 
					 | 
				
			||||||
    lib_sfx=mt
 | 
					 | 
				
			||||||
else
 | 
					 | 
				
			||||||
    release_runtime=MultiThreadedDLL
 | 
					 | 
				
			||||||
    debug_runtime=MultiThreadedDebugDLL
 | 
					 | 
				
			||||||
    lib_sfx=md
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Calculate debug lib names: If a lib ends in ${lib_sfx}.lib, then rename
 | 
					 | 
				
			||||||
# it to ${lib_sfx}d.lib. This precludes linking to release libs from a
 | 
					 | 
				
			||||||
# debug exe, so this may need to be refactored later.
 | 
					 | 
				
			||||||
for lib in ${libs}; do
 | 
					 | 
				
			||||||
    if [ "$lib" != "${lib%${lib_sfx}.lib}" ]; then
 | 
					 | 
				
			||||||
        lib=${lib%.lib}d.lib
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
    debug_libs="${debug_libs}${debug_libs:+ }${lib}"
 | 
					 | 
				
			||||||
done
 | 
					 | 
				
			||||||
debug_libs=${debug_libs// /;}
 | 
					 | 
				
			||||||
libs=${libs// /;}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# List of all platforms supported for this target
 | 
					 | 
				
			||||||
case "$target" in
 | 
					 | 
				
			||||||
    x86_64*)
 | 
					 | 
				
			||||||
        platforms[0]="x64"
 | 
					 | 
				
			||||||
        asm_Debug_cmdline="yasm -Xvc -g cv8 -f \$(PlatformName) ${yasmincs} "%(FullPath)""
 | 
					 | 
				
			||||||
        asm_Release_cmdline="yasm -Xvc -f \$(PlatformName) ${yasmincs} "%(FullPath)""
 | 
					 | 
				
			||||||
    ;;
 | 
					 | 
				
			||||||
    x86*)
 | 
					 | 
				
			||||||
        platforms[0]="Win32"
 | 
					 | 
				
			||||||
        asm_Debug_cmdline="yasm -Xvc -g cv8 -f \$(PlatformName) ${yasmincs} "%(FullPath)""
 | 
					 | 
				
			||||||
        asm_Release_cmdline="yasm -Xvc -f \$(PlatformName) ${yasmincs} "%(FullPath)""
 | 
					 | 
				
			||||||
    ;;
 | 
					 | 
				
			||||||
    arm*)
 | 
					 | 
				
			||||||
        asm_Debug_cmdline="armasm -nologo "%(FullPath)""
 | 
					 | 
				
			||||||
        asm_Release_cmdline="armasm -nologo "%(FullPath)""
 | 
					 | 
				
			||||||
        if [ "$name" = "obj_int_extract" ]; then
 | 
					 | 
				
			||||||
            # We don't want to build this tool for the target architecture,
 | 
					 | 
				
			||||||
            # but for an architecture we can run locally during the build.
 | 
					 | 
				
			||||||
            platforms[0]="Win32"
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
            platforms[0]="ARM"
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
    ;;
 | 
					 | 
				
			||||||
    *) die "Unsupported target $target!"
 | 
					 | 
				
			||||||
    ;;
 | 
					 | 
				
			||||||
esac
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
generate_vcxproj() {
 | 
					 | 
				
			||||||
    echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
 | 
					 | 
				
			||||||
    open_tag Project \
 | 
					 | 
				
			||||||
        DefaultTargets="Build" \
 | 
					 | 
				
			||||||
        ToolsVersion="4.0" \
 | 
					 | 
				
			||||||
        xmlns="http://schemas.microsoft.com/developer/msbuild/2003" \
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    open_tag ItemGroup \
 | 
					 | 
				
			||||||
        Label="ProjectConfigurations"
 | 
					 | 
				
			||||||
    for plat in "${platforms[@]}"; do
 | 
					 | 
				
			||||||
        for config in Debug Release; do
 | 
					 | 
				
			||||||
            open_tag ProjectConfiguration \
 | 
					 | 
				
			||||||
                Include="$config|$plat"
 | 
					 | 
				
			||||||
            tag_content Configuration $config
 | 
					 | 
				
			||||||
            tag_content Platform $plat
 | 
					 | 
				
			||||||
            close_tag ProjectConfiguration
 | 
					 | 
				
			||||||
        done
 | 
					 | 
				
			||||||
    done
 | 
					 | 
				
			||||||
    close_tag ItemGroup
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    open_tag PropertyGroup \
 | 
					 | 
				
			||||||
        Label="Globals"
 | 
					 | 
				
			||||||
        tag_content ProjectGuid "{${guid}}"
 | 
					 | 
				
			||||||
        tag_content RootNamespace ${name}
 | 
					 | 
				
			||||||
        tag_content Keyword ManagedCProj
 | 
					 | 
				
			||||||
    close_tag PropertyGroup
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    tag Import \
 | 
					 | 
				
			||||||
        Project="\$(VCTargetsPath)\\Microsoft.Cpp.Default.props"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for plat in "${platforms[@]}"; do
 | 
					 | 
				
			||||||
        for config in Release Debug; do
 | 
					 | 
				
			||||||
            open_tag PropertyGroup \
 | 
					 | 
				
			||||||
                Condition="'\$(Configuration)|\$(Platform)'=='$config|$plat'" \
 | 
					 | 
				
			||||||
                Label="Configuration"
 | 
					 | 
				
			||||||
            if [ "$proj_kind" = "exe" ]; then
 | 
					 | 
				
			||||||
                tag_content ConfigurationType Application
 | 
					 | 
				
			||||||
            elif [ "$proj_kind" = "dll" ]; then
 | 
					 | 
				
			||||||
                tag_content ConfigurationType DynamicLibrary
 | 
					 | 
				
			||||||
            else
 | 
					 | 
				
			||||||
                tag_content ConfigurationType StaticLibrary
 | 
					 | 
				
			||||||
            fi
 | 
					 | 
				
			||||||
            if [ "$vs_ver" = "11" ]; then
 | 
					 | 
				
			||||||
                if [ "$plat" = "ARM" ]; then
 | 
					 | 
				
			||||||
                    # Setting the wp80 toolchain automatically sets the
 | 
					 | 
				
			||||||
                    # WINAPI_FAMILY define, which is required for building
 | 
					 | 
				
			||||||
                    # code for arm with the windows headers. Alternatively,
 | 
					 | 
				
			||||||
                    # one could add AppContainerApplication=true in the Globals
 | 
					 | 
				
			||||||
                    # section and add PrecompiledHeader=NotUsing and
 | 
					 | 
				
			||||||
                    # CompileAsWinRT=false in ClCompile and SubSystem=Console
 | 
					 | 
				
			||||||
                    # in Link.
 | 
					 | 
				
			||||||
                    tag_content PlatformToolset v110_wp80
 | 
					 | 
				
			||||||
                else
 | 
					 | 
				
			||||||
                    tag_content PlatformToolset v110
 | 
					 | 
				
			||||||
                fi
 | 
					 | 
				
			||||||
            fi
 | 
					 | 
				
			||||||
            if [ "$vs_ver" = "12" ]; then
 | 
					 | 
				
			||||||
                if [ "$plat" = "ARM" ]; then
 | 
					 | 
				
			||||||
                    # Setting the wp80 toolchain automatically sets the
 | 
					 | 
				
			||||||
                    # WINAPI_FAMILY define, which is required for building
 | 
					 | 
				
			||||||
                    # code for arm with the windows headers. Alternatively,
 | 
					 | 
				
			||||||
                    # one could add AppContainerApplication=true in the Globals
 | 
					 | 
				
			||||||
                    # section and add PrecompiledHeader=NotUsing and
 | 
					 | 
				
			||||||
                    # CompileAsWinRT=false in ClCompile and SubSystem=Console
 | 
					 | 
				
			||||||
                    # in Link.
 | 
					 | 
				
			||||||
                    tag_content PlatformToolset v120_wp80
 | 
					 | 
				
			||||||
                else
 | 
					 | 
				
			||||||
                    tag_content PlatformToolset v120
 | 
					 | 
				
			||||||
                fi
 | 
					 | 
				
			||||||
            fi
 | 
					 | 
				
			||||||
            tag_content CharacterSet Unicode
 | 
					 | 
				
			||||||
            if [ "$config" = "Release" ]; then
 | 
					 | 
				
			||||||
                tag_content WholeProgramOptimization true
 | 
					 | 
				
			||||||
            fi
 | 
					 | 
				
			||||||
            close_tag PropertyGroup
 | 
					 | 
				
			||||||
        done
 | 
					 | 
				
			||||||
    done
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    tag Import \
 | 
					 | 
				
			||||||
        Project="\$(VCTargetsPath)\\Microsoft.Cpp.props"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    open_tag ImportGroup \
 | 
					 | 
				
			||||||
        Label="PropertySheets"
 | 
					 | 
				
			||||||
        tag Import \
 | 
					 | 
				
			||||||
            Project="\$(UserRootDir)\\Microsoft.Cpp.\$(Platform).user.props" \
 | 
					 | 
				
			||||||
            Condition="exists('\$(UserRootDir)\\Microsoft.Cpp.\$(Platform).user.props')" \
 | 
					 | 
				
			||||||
            Label="LocalAppDataPlatform"
 | 
					 | 
				
			||||||
    close_tag ImportGroup
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    tag PropertyGroup \
 | 
					 | 
				
			||||||
        Label="UserMacros"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for plat in "${platforms[@]}"; do
 | 
					 | 
				
			||||||
        plat_no_ws=`echo $plat | sed 's/[^A-Za-z0-9_]/_/g'`
 | 
					 | 
				
			||||||
        for config in Debug Release; do
 | 
					 | 
				
			||||||
            open_tag PropertyGroup \
 | 
					 | 
				
			||||||
                Condition="'\$(Configuration)|\$(Platform)'=='$config|$plat'"
 | 
					 | 
				
			||||||
            tag_content OutDir "\$(SolutionDir)$plat_no_ws\\\$(Configuration)\\"
 | 
					 | 
				
			||||||
            tag_content IntDir "$plat_no_ws\\\$(Configuration)\\${name}\\"
 | 
					 | 
				
			||||||
            close_tag PropertyGroup
 | 
					 | 
				
			||||||
        done
 | 
					 | 
				
			||||||
    done
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for plat in "${platforms[@]}"; do
 | 
					 | 
				
			||||||
        for config in Debug Release; do
 | 
					 | 
				
			||||||
            open_tag ItemDefinitionGroup \
 | 
					 | 
				
			||||||
                Condition="'\$(Configuration)|\$(Platform)'=='$config|$plat'"
 | 
					 | 
				
			||||||
            if [ "$name" = "vpx" ]; then
 | 
					 | 
				
			||||||
                open_tag PreBuildEvent
 | 
					 | 
				
			||||||
                tag_content Command "call obj_int_extract.bat $src_path_bare"
 | 
					 | 
				
			||||||
                close_tag PreBuildEvent
 | 
					 | 
				
			||||||
            fi
 | 
					 | 
				
			||||||
            open_tag ClCompile
 | 
					 | 
				
			||||||
            if [ "$config" = "Debug" ]; then
 | 
					 | 
				
			||||||
                opt=Disabled
 | 
					 | 
				
			||||||
                runtime=$debug_runtime
 | 
					 | 
				
			||||||
                curlibs=$debug_libs
 | 
					 | 
				
			||||||
                confsuffix=d
 | 
					 | 
				
			||||||
                case "$name" in
 | 
					 | 
				
			||||||
                obj_int_extract)
 | 
					 | 
				
			||||||
                    debug=DEBUG
 | 
					 | 
				
			||||||
                    ;;
 | 
					 | 
				
			||||||
                *)
 | 
					 | 
				
			||||||
                    debug=_DEBUG
 | 
					 | 
				
			||||||
                    ;;
 | 
					 | 
				
			||||||
                esac
 | 
					 | 
				
			||||||
            else
 | 
					 | 
				
			||||||
                opt=MaxSpeed
 | 
					 | 
				
			||||||
                runtime=$release_runtime
 | 
					 | 
				
			||||||
                curlibs=$libs
 | 
					 | 
				
			||||||
                confsuffix=""
 | 
					 | 
				
			||||||
                tag_content FavorSizeOrSpeed Speed
 | 
					 | 
				
			||||||
                debug=NDEBUG
 | 
					 | 
				
			||||||
            fi
 | 
					 | 
				
			||||||
            case "$name" in
 | 
					 | 
				
			||||||
            obj_int_extract)
 | 
					 | 
				
			||||||
                extradefines=";_CONSOLE"
 | 
					 | 
				
			||||||
                ;;
 | 
					 | 
				
			||||||
            *)
 | 
					 | 
				
			||||||
                extradefines=";$defines"
 | 
					 | 
				
			||||||
                ;;
 | 
					 | 
				
			||||||
            esac
 | 
					 | 
				
			||||||
            tag_content Optimization $opt
 | 
					 | 
				
			||||||
            tag_content AdditionalIncludeDirectories "$incs;%(AdditionalIncludeDirectories)"
 | 
					 | 
				
			||||||
            tag_content PreprocessorDefinitions "WIN32;$debug;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE$extradefines;%(PreprocessorDefinitions)"
 | 
					 | 
				
			||||||
            tag_content RuntimeLibrary $runtime
 | 
					 | 
				
			||||||
            tag_content WarningLevel Level3
 | 
					 | 
				
			||||||
            # DebugInformationFormat
 | 
					 | 
				
			||||||
            close_tag ClCompile
 | 
					 | 
				
			||||||
            case "$proj_kind" in
 | 
					 | 
				
			||||||
            exe)
 | 
					 | 
				
			||||||
                open_tag Link
 | 
					 | 
				
			||||||
                if [ "$name" = "obj_int_extract" ]; then
 | 
					 | 
				
			||||||
                    tag_content OutputFile "${name}.exe"
 | 
					 | 
				
			||||||
                else
 | 
					 | 
				
			||||||
                    tag_content AdditionalDependencies "$curlibs"
 | 
					 | 
				
			||||||
                    tag_content AdditionalLibraryDirectories "$libdirs;%(AdditionalLibraryDirectories)"
 | 
					 | 
				
			||||||
                fi
 | 
					 | 
				
			||||||
                tag_content GenerateDebugInformation true
 | 
					 | 
				
			||||||
                close_tag Link
 | 
					 | 
				
			||||||
                ;;
 | 
					 | 
				
			||||||
            dll)
 | 
					 | 
				
			||||||
                open_tag Link
 | 
					 | 
				
			||||||
                tag_content GenerateDebugInformation true
 | 
					 | 
				
			||||||
                tag_content ModuleDefinitionFile $module_def
 | 
					 | 
				
			||||||
                close_tag Link
 | 
					 | 
				
			||||||
                ;;
 | 
					 | 
				
			||||||
            lib)
 | 
					 | 
				
			||||||
                open_tag Lib
 | 
					 | 
				
			||||||
                tag_content OutputFile "\$(OutDir)${name}${lib_sfx}${confsuffix}.lib"
 | 
					 | 
				
			||||||
                close_tag Lib
 | 
					 | 
				
			||||||
                ;;
 | 
					 | 
				
			||||||
            esac
 | 
					 | 
				
			||||||
            close_tag ItemDefinitionGroup
 | 
					 | 
				
			||||||
        done
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    done
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    open_tag ItemGroup
 | 
					 | 
				
			||||||
    generate_filter "Source Files"   "c;cc;def;odl;idl;hpj;bat;asm;asmx;s"
 | 
					 | 
				
			||||||
    close_tag ItemGroup
 | 
					 | 
				
			||||||
    open_tag ItemGroup
 | 
					 | 
				
			||||||
    generate_filter "Header Files"   "h;hm;inl;inc;xsd"
 | 
					 | 
				
			||||||
    close_tag ItemGroup
 | 
					 | 
				
			||||||
    open_tag ItemGroup
 | 
					 | 
				
			||||||
    generate_filter "Build Files"    "mk"
 | 
					 | 
				
			||||||
    close_tag ItemGroup
 | 
					 | 
				
			||||||
    open_tag ItemGroup
 | 
					 | 
				
			||||||
    generate_filter "References"     "vcxproj"
 | 
					 | 
				
			||||||
    close_tag ItemGroup
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    tag Import \
 | 
					 | 
				
			||||||
        Project="\$(VCTargetsPath)\\Microsoft.Cpp.targets"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    open_tag ImportGroup \
 | 
					 | 
				
			||||||
        Label="ExtensionTargets"
 | 
					 | 
				
			||||||
    close_tag ImportGroup
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    close_tag Project
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # This must be done from within the {} subshell
 | 
					 | 
				
			||||||
    echo "Ignored files list (${#file_list[@]} items) is:" >&2
 | 
					 | 
				
			||||||
    for f in "${file_list[@]}"; do
 | 
					 | 
				
			||||||
        echo "    $f" >&2
 | 
					 | 
				
			||||||
    done
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# This regexp doesn't catch most of the strings in the vcxproj format,
 | 
					 | 
				
			||||||
# since they're like <tag>path</tag> instead of <tag attr="path" />
 | 
					 | 
				
			||||||
# as previously. It still seems to work ok despite this.
 | 
					 | 
				
			||||||
generate_vcxproj |
 | 
					 | 
				
			||||||
    sed  -e '/"/s;\([^ "]\)/;\1\\;g' |
 | 
					 | 
				
			||||||
    sed  -e '/xmlns/s;\\;/;g' > ${outfile}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
exit
 | 
					 | 
				
			||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,363 +0,0 @@
 | 
				
			|||||||
#!/bin/sh
 | 
					 | 
				
			||||||
self=$0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
usage() {
 | 
					 | 
				
			||||||
  cat <<EOF >&2
 | 
					 | 
				
			||||||
Usage: $self [options] FILE
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Reads the Run Time CPU Detections definitions from FILE and generates a
 | 
					 | 
				
			||||||
C header file on stdout.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Options:
 | 
					 | 
				
			||||||
  --arch=ARCH   Architecture to generate defs for (required)
 | 
					 | 
				
			||||||
  --disable-EXT Disable support for EXT extensions
 | 
					 | 
				
			||||||
  --require-EXT Require support for EXT extensions
 | 
					 | 
				
			||||||
  --sym=SYMBOL  Unique symbol to use for RTCD initialization function
 | 
					 | 
				
			||||||
  --config=FILE File with CONFIG_FOO=yes lines to parse
 | 
					 | 
				
			||||||
EOF
 | 
					 | 
				
			||||||
  exit 1
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
die() {
 | 
					 | 
				
			||||||
  echo "$@" >&2
 | 
					 | 
				
			||||||
  exit 1
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
die_argument_required() {
 | 
					 | 
				
			||||||
  die "Option $opt requires argument"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
for opt; do
 | 
					 | 
				
			||||||
  optval="${opt#*=}"
 | 
					 | 
				
			||||||
  case "$opt" in
 | 
					 | 
				
			||||||
    --arch) die_argument_required;;
 | 
					 | 
				
			||||||
    --arch=*) arch=${optval};;
 | 
					 | 
				
			||||||
    --disable-*) eval "disable_${opt#--disable-}=true";;
 | 
					 | 
				
			||||||
    --require-*) REQUIRES="${REQUIRES}${opt#--require-} ";;
 | 
					 | 
				
			||||||
    --sym) die_argument_required;;
 | 
					 | 
				
			||||||
    --sym=*) symbol=${optval};;
 | 
					 | 
				
			||||||
    --config=*) config_file=${optval};;
 | 
					 | 
				
			||||||
    -h|--help)
 | 
					 | 
				
			||||||
      usage
 | 
					 | 
				
			||||||
      ;;
 | 
					 | 
				
			||||||
    -*)
 | 
					 | 
				
			||||||
      die "Unrecognized option: ${opt%%=*}"
 | 
					 | 
				
			||||||
      ;;
 | 
					 | 
				
			||||||
    *)
 | 
					 | 
				
			||||||
      defs_file="$defs_file $opt"
 | 
					 | 
				
			||||||
      ;;
 | 
					 | 
				
			||||||
  esac
 | 
					 | 
				
			||||||
  shift
 | 
					 | 
				
			||||||
done
 | 
					 | 
				
			||||||
for f in $defs_file; do [ -f "$f" ] || usage; done
 | 
					 | 
				
			||||||
[ -n "$arch" ] || usage
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Import the configuration
 | 
					 | 
				
			||||||
[ -f "$config_file" ] && eval $(grep CONFIG_ "$config_file")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# Routines for the RTCD DSL to call
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
prototype() {
 | 
					 | 
				
			||||||
  rtyp=""
 | 
					 | 
				
			||||||
  case "$1" in
 | 
					 | 
				
			||||||
    unsigned) rtyp="$1 "; shift;;
 | 
					 | 
				
			||||||
  esac
 | 
					 | 
				
			||||||
  rtyp="${rtyp}$1"
 | 
					 | 
				
			||||||
  fn="$2"
 | 
					 | 
				
			||||||
  args="$3"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  eval "${2}_rtyp='$rtyp'"
 | 
					 | 
				
			||||||
  eval "${2}_args='$3'"
 | 
					 | 
				
			||||||
  ALL_FUNCS="$ALL_FUNCS $fn"
 | 
					 | 
				
			||||||
  specialize $fn c
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
specialize() {
 | 
					 | 
				
			||||||
  fn="$1"
 | 
					 | 
				
			||||||
  shift
 | 
					 | 
				
			||||||
  for opt in "$@"; do
 | 
					 | 
				
			||||||
    eval "${fn}_${opt}=${fn}_${opt}"
 | 
					 | 
				
			||||||
  done
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
require() {
 | 
					 | 
				
			||||||
  for fn in $ALL_FUNCS; do
 | 
					 | 
				
			||||||
    for opt in "$@"; do
 | 
					 | 
				
			||||||
      ofn=$(eval "echo \$${fn}_${opt}")
 | 
					 | 
				
			||||||
      [ -z "$ofn" ] && continue
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      # if we already have a default, then we can disable it, as we know
 | 
					 | 
				
			||||||
      # we can do better.
 | 
					 | 
				
			||||||
      best=$(eval "echo \$${fn}_default")
 | 
					 | 
				
			||||||
      best_ofn=$(eval "echo \$${best}")
 | 
					 | 
				
			||||||
      [ -n "$best" ] && [ "$best_ofn" != "$ofn" ] && eval "${best}_link=false"
 | 
					 | 
				
			||||||
      eval "${fn}_default=${fn}_${opt}"
 | 
					 | 
				
			||||||
      eval "${fn}_${opt}_link=true"
 | 
					 | 
				
			||||||
    done
 | 
					 | 
				
			||||||
  done
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
forward_decls() {
 | 
					 | 
				
			||||||
  ALL_FORWARD_DECLS="$ALL_FORWARD_DECLS $1"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# Include the user's directives
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
for f in $defs_file; do
 | 
					 | 
				
			||||||
  . $f
 | 
					 | 
				
			||||||
done
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# Process the directives according to the command line
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
process_forward_decls() {
 | 
					 | 
				
			||||||
  for fn in $ALL_FORWARD_DECLS; do
 | 
					 | 
				
			||||||
    eval $fn
 | 
					 | 
				
			||||||
  done
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
determine_indirection() {
 | 
					 | 
				
			||||||
  [ "$CONFIG_RUNTIME_CPU_DETECT" = "yes" ] || require $ALL_ARCHS
 | 
					 | 
				
			||||||
  for fn in $ALL_FUNCS; do
 | 
					 | 
				
			||||||
    n=""
 | 
					 | 
				
			||||||
    rtyp="$(eval "echo \$${fn}_rtyp")"
 | 
					 | 
				
			||||||
    args="$(eval "echo \"\$${fn}_args\"")"
 | 
					 | 
				
			||||||
    dfn="$(eval "echo \$${fn}_default")"
 | 
					 | 
				
			||||||
    dfn=$(eval "echo \$${dfn}")
 | 
					 | 
				
			||||||
    for opt in "$@"; do
 | 
					 | 
				
			||||||
      ofn=$(eval "echo \$${fn}_${opt}")
 | 
					 | 
				
			||||||
      [ -z "$ofn" ] && continue
 | 
					 | 
				
			||||||
      link=$(eval "echo \$${fn}_${opt}_link")
 | 
					 | 
				
			||||||
      [ "$link" = "false" ] && continue
 | 
					 | 
				
			||||||
      n="${n}x"
 | 
					 | 
				
			||||||
    done
 | 
					 | 
				
			||||||
    if [ "$n" = "x" ]; then
 | 
					 | 
				
			||||||
      eval "${fn}_indirect=false"
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
      eval "${fn}_indirect=true"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
  done
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
declare_function_pointers() {
 | 
					 | 
				
			||||||
  for fn in $ALL_FUNCS; do
 | 
					 | 
				
			||||||
    rtyp="$(eval "echo \$${fn}_rtyp")"
 | 
					 | 
				
			||||||
    args="$(eval "echo \"\$${fn}_args\"")"
 | 
					 | 
				
			||||||
    dfn="$(eval "echo \$${fn}_default")"
 | 
					 | 
				
			||||||
    dfn=$(eval "echo \$${dfn}")
 | 
					 | 
				
			||||||
    for opt in "$@"; do
 | 
					 | 
				
			||||||
      ofn=$(eval "echo \$${fn}_${opt}")
 | 
					 | 
				
			||||||
      [ -z "$ofn" ] && continue
 | 
					 | 
				
			||||||
      echo "$rtyp ${ofn}($args);"
 | 
					 | 
				
			||||||
    done
 | 
					 | 
				
			||||||
    if [ "$(eval "echo \$${fn}_indirect")" = "false" ]; then
 | 
					 | 
				
			||||||
      echo "#define ${fn} ${dfn}"
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
      echo "RTCD_EXTERN $rtyp (*${fn})($args);"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
    echo
 | 
					 | 
				
			||||||
  done
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
set_function_pointers() {
 | 
					 | 
				
			||||||
  for fn in $ALL_FUNCS; do
 | 
					 | 
				
			||||||
    n=""
 | 
					 | 
				
			||||||
    rtyp="$(eval "echo \$${fn}_rtyp")"
 | 
					 | 
				
			||||||
    args="$(eval "echo \"\$${fn}_args\"")"
 | 
					 | 
				
			||||||
    dfn="$(eval "echo \$${fn}_default")"
 | 
					 | 
				
			||||||
    dfn=$(eval "echo \$${dfn}")
 | 
					 | 
				
			||||||
    if $(eval "echo \$${fn}_indirect"); then
 | 
					 | 
				
			||||||
      echo "    $fn = $dfn;"
 | 
					 | 
				
			||||||
      for opt in "$@"; do
 | 
					 | 
				
			||||||
        ofn=$(eval "echo \$${fn}_${opt}")
 | 
					 | 
				
			||||||
        [ -z "$ofn" ] && continue
 | 
					 | 
				
			||||||
        [ "$ofn" = "$dfn" ] && continue;
 | 
					 | 
				
			||||||
        link=$(eval "echo \$${fn}_${opt}_link")
 | 
					 | 
				
			||||||
        [ "$link" = "false" ] && continue
 | 
					 | 
				
			||||||
        cond="$(eval "echo \$have_${opt}")"
 | 
					 | 
				
			||||||
        echo "    if (${cond}) $fn = $ofn;"
 | 
					 | 
				
			||||||
      done
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
    echo
 | 
					 | 
				
			||||||
  done
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
filter() {
 | 
					 | 
				
			||||||
  filtered=""
 | 
					 | 
				
			||||||
  for opt in "$@"; do
 | 
					 | 
				
			||||||
    [ -z $(eval "echo \$disable_${opt}") ] && filtered="$filtered $opt"
 | 
					 | 
				
			||||||
  done
 | 
					 | 
				
			||||||
  echo $filtered
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# Helper functions for generating the arch specific RTCD files
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
common_top() {
 | 
					 | 
				
			||||||
  outfile_basename=$(basename ${symbol:-rtcd})
 | 
					 | 
				
			||||||
  include_guard=$(echo $outfile_basename | tr '[a-z]' '[A-Z]' | \
 | 
					 | 
				
			||||||
    tr -c '[A-Z0-9]' _)H_
 | 
					 | 
				
			||||||
  cat <<EOF
 | 
					 | 
				
			||||||
#ifndef ${include_guard}
 | 
					 | 
				
			||||||
#define ${include_guard}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef RTCD_C
 | 
					 | 
				
			||||||
#define RTCD_EXTERN
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
#define RTCD_EXTERN extern
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(process_forward_decls)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(declare_function_pointers c $ALL_ARCHS)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void ${symbol:-rtcd}(void);
 | 
					 | 
				
			||||||
EOF
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
common_bottom() {
 | 
					 | 
				
			||||||
  cat <<EOF
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
EOF
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
x86() {
 | 
					 | 
				
			||||||
  determine_indirection c $ALL_ARCHS
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  # Assign the helper variable for each enabled extension
 | 
					 | 
				
			||||||
  for opt in $ALL_ARCHS; do
 | 
					 | 
				
			||||||
    uc=$(echo $opt | tr '[a-z]' '[A-Z]')
 | 
					 | 
				
			||||||
    eval "have_${opt}=\"flags & HAS_${uc}\""
 | 
					 | 
				
			||||||
  done
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  cat <<EOF
 | 
					 | 
				
			||||||
$(common_top)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef RTCD_C
 | 
					 | 
				
			||||||
#include "vpx_ports/x86.h"
 | 
					 | 
				
			||||||
static void setup_rtcd_internal(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    int flags = x86_simd_caps();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    (void)flags;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(set_function_pointers c $ALL_ARCHS)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
$(common_bottom)
 | 
					 | 
				
			||||||
EOF
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
arm() {
 | 
					 | 
				
			||||||
  determine_indirection c $ALL_ARCHS
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  # Assign the helper variable for each enabled extension
 | 
					 | 
				
			||||||
  for opt in $ALL_ARCHS; do
 | 
					 | 
				
			||||||
    uc=$(echo $opt | tr '[a-z]' '[A-Z]')
 | 
					 | 
				
			||||||
    eval "have_${opt}=\"flags & HAS_${uc}\""
 | 
					 | 
				
			||||||
  done
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  cat <<EOF
 | 
					 | 
				
			||||||
$(common_top)
 | 
					 | 
				
			||||||
#include "vpx_config.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef RTCD_C
 | 
					 | 
				
			||||||
#include "vpx_ports/arm.h"
 | 
					 | 
				
			||||||
static void setup_rtcd_internal(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    int flags = arm_cpu_caps();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    (void)flags;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(set_function_pointers c $ALL_ARCHS)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
$(common_bottom)
 | 
					 | 
				
			||||||
EOF
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
mips() {
 | 
					 | 
				
			||||||
  determine_indirection c $ALL_ARCHS
 | 
					 | 
				
			||||||
  cat <<EOF
 | 
					 | 
				
			||||||
$(common_top)
 | 
					 | 
				
			||||||
#include "vpx_config.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef RTCD_C
 | 
					 | 
				
			||||||
static void setup_rtcd_internal(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
$(set_function_pointers c $ALL_ARCHS)
 | 
					 | 
				
			||||||
#if HAVE_DSPR2
 | 
					 | 
				
			||||||
#if CONFIG_VP8
 | 
					 | 
				
			||||||
void dsputil_static_init();
 | 
					 | 
				
			||||||
dsputil_static_init();
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#if CONFIG_VP9
 | 
					 | 
				
			||||||
void vp9_dsputil_static_init();
 | 
					 | 
				
			||||||
vp9_dsputil_static_init();
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
$(common_bottom)
 | 
					 | 
				
			||||||
EOF
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
unoptimized() {
 | 
					 | 
				
			||||||
  determine_indirection c
 | 
					 | 
				
			||||||
  cat <<EOF
 | 
					 | 
				
			||||||
$(common_top)
 | 
					 | 
				
			||||||
#include "vpx_config.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef RTCD_C
 | 
					 | 
				
			||||||
static void setup_rtcd_internal(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
$(set_function_pointers c)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
$(common_bottom)
 | 
					 | 
				
			||||||
EOF
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# Main Driver
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
require c
 | 
					 | 
				
			||||||
case $arch in
 | 
					 | 
				
			||||||
  x86)
 | 
					 | 
				
			||||||
    ALL_ARCHS=$(filter mmx sse sse2 sse3 ssse3 sse4_1 avx avx2)
 | 
					 | 
				
			||||||
    x86
 | 
					 | 
				
			||||||
    ;;
 | 
					 | 
				
			||||||
  x86_64)
 | 
					 | 
				
			||||||
    ALL_ARCHS=$(filter mmx sse sse2 sse3 ssse3 sse4_1 avx avx2)
 | 
					 | 
				
			||||||
    REQUIRES=${REQUIRES:-mmx sse sse2}
 | 
					 | 
				
			||||||
    require $(filter $REQUIRES)
 | 
					 | 
				
			||||||
    x86
 | 
					 | 
				
			||||||
    ;;
 | 
					 | 
				
			||||||
  mips32)
 | 
					 | 
				
			||||||
    ALL_ARCHS=$(filter mips32)
 | 
					 | 
				
			||||||
    dspr2=$([ -f "$config_file" ] && eval echo $(grep HAVE_DSPR2 "$config_file"))
 | 
					 | 
				
			||||||
    HAVE_DSPR2="${dspr2#*=}"
 | 
					 | 
				
			||||||
    if [ "$HAVE_DSPR2" = "yes" ]; then
 | 
					 | 
				
			||||||
        ALL_ARCHS=$(filter mips32 dspr2)
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
    mips
 | 
					 | 
				
			||||||
    ;;
 | 
					 | 
				
			||||||
  armv5te)
 | 
					 | 
				
			||||||
    ALL_ARCHS=$(filter edsp)
 | 
					 | 
				
			||||||
    arm
 | 
					 | 
				
			||||||
    ;;
 | 
					 | 
				
			||||||
  armv6)
 | 
					 | 
				
			||||||
    ALL_ARCHS=$(filter edsp media)
 | 
					 | 
				
			||||||
    arm
 | 
					 | 
				
			||||||
    ;;
 | 
					 | 
				
			||||||
  armv7)
 | 
					 | 
				
			||||||
    ALL_ARCHS=$(filter edsp media neon)
 | 
					 | 
				
			||||||
    arm
 | 
					 | 
				
			||||||
    ;;
 | 
					 | 
				
			||||||
  *)
 | 
					 | 
				
			||||||
    unoptimized
 | 
					 | 
				
			||||||
    ;;
 | 
					 | 
				
			||||||
esac
 | 
					 | 
				
			||||||
@@ -1,70 +0,0 @@
 | 
				
			|||||||
#!/usr/bin/perl
 | 
					 | 
				
			||||||
##
 | 
					 | 
				
			||||||
##  Copyright (c) 2013 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
##
 | 
					 | 
				
			||||||
##  Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
##  that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
##  tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
##  in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
##  be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
##
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package thumb;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
sub FixThumbInstructions($$)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    my $short_branches = $_[1];
 | 
					 | 
				
			||||||
    my $branch_shift_offset = $short_branches ? 1 : 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Write additions with shifts, such as "add r10, r11, lsl #8",
 | 
					 | 
				
			||||||
    # in three operand form, "add r10, r10, r11, lsl #8".
 | 
					 | 
				
			||||||
    s/(add\s+)(r\d+),\s*(r\d+),\s*(lsl #\d+)/$1$2, $2, $3, $4/g;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Convert additions with a non-constant shift into a sequence
 | 
					 | 
				
			||||||
    # with left shift, addition and a right shift (to restore the
 | 
					 | 
				
			||||||
    # register to the original value). Currently the right shift
 | 
					 | 
				
			||||||
    # isn't necessary in the code base since the values in these
 | 
					 | 
				
			||||||
    # registers aren't used, but doing the shift for consitency.
 | 
					 | 
				
			||||||
    # This converts instructions such as "add r12, r12, r5, lsl r4"
 | 
					 | 
				
			||||||
    # into the sequence "lsl r5, r4", "add r12, r12, r5", "lsr r5, r4".
 | 
					 | 
				
			||||||
    s/^(\s*)(add)(\s+)(r\d+),\s*(r\d+),\s*(r\d+),\s*lsl (r\d+)/$1lsl$3$6, $7\n$1$2$3$4, $5, $6\n$1lsr$3$6, $7/g;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Convert loads with right shifts in the indexing into a
 | 
					 | 
				
			||||||
    # sequence of an add, load and sub. This converts
 | 
					 | 
				
			||||||
    # "ldrb r4, [r9, lr, asr #1]" into "add r9, r9, lr, asr #1",
 | 
					 | 
				
			||||||
    # "ldrb r9, [r9]", "sub r9, r9, lr, asr #1".
 | 
					 | 
				
			||||||
    s/^(\s*)(ldrb)(\s+)(r\d+),\s*\[(\w+),\s*(\w+),\s*(asr #\d+)\]/$1add $3$5, $5, $6, $7\n$1$2$3$4, [$5]\n$1sub $3$5, $5, $6, $7/g;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Convert register indexing with writeback into a separate add
 | 
					 | 
				
			||||||
    # instruction. This converts "ldrb r12, [r1, r2]!" into
 | 
					 | 
				
			||||||
    # "ldrb r12, [r1, r2]", "add r1, r1, r2".
 | 
					 | 
				
			||||||
    s/^(\s*)(ldrb)(\s+)(r\d+),\s*\[(\w+),\s*(\w+)\]!/$1$2$3$4, [$5, $6]\n$1add $3$5, $6/g;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Convert negative register indexing into separate sub/add instructions.
 | 
					 | 
				
			||||||
    # This converts "ldrne r4, [src, -pstep, lsl #1]" into
 | 
					 | 
				
			||||||
    # "subne src, src, pstep, lsl #1", "ldrne r4, [src]",
 | 
					 | 
				
			||||||
    # "addne src, src, pstep, lsl #1". In a couple of cases where
 | 
					 | 
				
			||||||
    # this is used, it's used for two subsequent load instructions,
 | 
					 | 
				
			||||||
    # where a hand-written version of it could merge two subsequent
 | 
					 | 
				
			||||||
    # add and sub instructions.
 | 
					 | 
				
			||||||
    s/^(\s*)((ldr|str|pld)(ne)?)(\s+)(r\d+,\s*)?\[(\w+), -([^\]]+)\]/$1sub$4$5$7, $7, $8\n$1$2$5$6\[$7\]\n$1add$4$5$7, $7, $8/g;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Convert register post indexing to a separate add instruction.
 | 
					 | 
				
			||||||
    # This converts "ldrneb r9, [r0], r2" into "ldrneb r9, [r0]",
 | 
					 | 
				
			||||||
    # "add r0, r2".
 | 
					 | 
				
			||||||
    s/^(\s*)((ldr|str)(ne)?[bhd]?)(\s+)(\w+),(\s*\w+,)?\s*\[(\w+)\],\s*(\w+)/$1$2$5$6,$7 [$8]\n$1add$4$5$8, $8, $9/g;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Convert a conditional addition to the pc register into a series of
 | 
					 | 
				
			||||||
    # instructions. This converts "addlt pc, pc, r3, lsl #2" into
 | 
					 | 
				
			||||||
    # "itttt lt", "movlt.n r12, pc", "addlt.w r12, #12",
 | 
					 | 
				
			||||||
    # "addlt.w r12, r12, r3, lsl #2", "movlt.n pc, r12".
 | 
					 | 
				
			||||||
    # This assumes that r12 is free at this point.
 | 
					 | 
				
			||||||
    s/^(\s*)addlt(\s+)pc,\s*pc,\s*(\w+),\s*lsl\s*#(\d+)/$1itttt$2lt\n$1movlt.n$2r12, pc\n$1addlt.w$2r12, #12\n$1addlt.w$2r12, r12, $3, lsl #($4-$branch_shift_offset)\n$1movlt.n$2pc, r12/g;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Convert "mov pc, lr" into "bx lr", since the former only works
 | 
					 | 
				
			||||||
    # for switching from arm to thumb (and only in armv7), but not
 | 
					 | 
				
			||||||
    # from thumb to arm.
 | 
					 | 
				
			||||||
    s/mov(\s*)pc\s*,\s*lr/bx$1lr/g;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
1;
 | 
					 | 
				
			||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
#!/bin/sh
 | 
					#!/bin/bash
 | 
				
			||||||
##
 | 
					##
 | 
				
			||||||
##  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
 | 
					##  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
 | 
				
			||||||
##
 | 
					##
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,12 +0,0 @@
 | 
				
			|||||||
REM   Copyright (c) 2011 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
REM
 | 
					 | 
				
			||||||
REM   Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
REM   that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
REM   tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
REM   in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
REM   be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
echo on
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
cl /I "./" /I "%1" /nologo /c "%1/vp8/encoder/vp8_asm_enc_offsets.c"
 | 
					 | 
				
			||||||
obj_int_extract.exe rvds "vp8_asm_enc_offsets.obj" > "vp8_asm_enc_offsets.asm"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
							
								
								
									
										115
									
								
								build/x86-msvs/yasm.rules
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										115
									
								
								build/x86-msvs/yasm.rules
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,115 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="utf-8"?>
 | 
				
			||||||
 | 
					<VisualStudioToolFile
 | 
				
			||||||
 | 
						Name="Yasm"
 | 
				
			||||||
 | 
						Version="8.00"
 | 
				
			||||||
 | 
						>
 | 
				
			||||||
 | 
					  <Rules>
 | 
				
			||||||
 | 
					    <CustomBuildRule
 | 
				
			||||||
 | 
								Name="YASM"
 | 
				
			||||||
 | 
								DisplayName="Yasm Assembler"
 | 
				
			||||||
 | 
								CommandLine="yasm -Xvc -f $(PlatformName) [AllOptions] [AdditionalOptions] [Inputs]"
 | 
				
			||||||
 | 
								Outputs="[$ObjectFileName]"
 | 
				
			||||||
 | 
								FileExtensions="*.asm"
 | 
				
			||||||
 | 
								ExecutionDescription="Assembling $(InputFileName)"
 | 
				
			||||||
 | 
								ShowOnlyRuleProperties="false"
 | 
				
			||||||
 | 
								>
 | 
				
			||||||
 | 
					      <Properties>
 | 
				
			||||||
 | 
					        <StringProperty
 | 
				
			||||||
 | 
										Name="Defines"
 | 
				
			||||||
 | 
										DisplayName="Definitions"
 | 
				
			||||||
 | 
										Category="Pre-Defined Symbols"
 | 
				
			||||||
 | 
										Description="Specify pre-defined symbols ('symbol' or 'symbol = value') "
 | 
				
			||||||
 | 
										Switch="-D [value]"
 | 
				
			||||||
 | 
										Delimited="true"
 | 
				
			||||||
 | 
										Inheritable="true"
 | 
				
			||||||
 | 
									/>
 | 
				
			||||||
 | 
					        <StringProperty
 | 
				
			||||||
 | 
										Name="IncludePaths"
 | 
				
			||||||
 | 
										DisplayName="Include Paths"
 | 
				
			||||||
 | 
										Category="Configuration"
 | 
				
			||||||
 | 
										Description="Set the paths for any additional include files"
 | 
				
			||||||
 | 
										Switch="-I [value]"
 | 
				
			||||||
 | 
										Delimited="true"
 | 
				
			||||||
 | 
										Inheritable="true"
 | 
				
			||||||
 | 
									/>
 | 
				
			||||||
 | 
					        <StringProperty
 | 
				
			||||||
 | 
										Name="UnDefines"
 | 
				
			||||||
 | 
										DisplayName="Remove Definitions"
 | 
				
			||||||
 | 
										Category="Pre-Defined Symbols"
 | 
				
			||||||
 | 
										Description="Remove pre-defined symbols "
 | 
				
			||||||
 | 
										Switch="-U [value]"
 | 
				
			||||||
 | 
										Delimited="true"
 | 
				
			||||||
 | 
										Inheritable="true"
 | 
				
			||||||
 | 
									/>
 | 
				
			||||||
 | 
					        <StringProperty
 | 
				
			||||||
 | 
										Name="ObjectFileName"
 | 
				
			||||||
 | 
										DisplayName="Object File Name"
 | 
				
			||||||
 | 
										Category="Output"
 | 
				
			||||||
 | 
										Description="Select the output file name"
 | 
				
			||||||
 | 
										Switch="-o [value]"
 | 
				
			||||||
 | 
										DefaultValue="$(IntDir)\$(InputName).obj"
 | 
				
			||||||
 | 
									/>
 | 
				
			||||||
 | 
					        <StringProperty
 | 
				
			||||||
 | 
										Name="ListFileName"
 | 
				
			||||||
 | 
										DisplayName="List File Name"
 | 
				
			||||||
 | 
										Category="Output"
 | 
				
			||||||
 | 
										Description="Select an output listing by setting its file name"
 | 
				
			||||||
 | 
										Switch="-l [value]"
 | 
				
			||||||
 | 
									/>
 | 
				
			||||||
 | 
					        <StringProperty
 | 
				
			||||||
 | 
										Name="PreIncludeFile"
 | 
				
			||||||
 | 
										DisplayName="Pre Include File"
 | 
				
			||||||
 | 
										Category="Configuration"
 | 
				
			||||||
 | 
										Description="Select a pre-included file by setting its name"
 | 
				
			||||||
 | 
										Switch="-P [value]"
 | 
				
			||||||
 | 
									/>
 | 
				
			||||||
 | 
					        <BooleanProperty
 | 
				
			||||||
 | 
										Name="Debug"
 | 
				
			||||||
 | 
										DisplayName="Debug Information"
 | 
				
			||||||
 | 
										Category="Output"
 | 
				
			||||||
 | 
										Description="Generate debugging information"
 | 
				
			||||||
 | 
										Switch="-g cv8"
 | 
				
			||||||
 | 
									/>
 | 
				
			||||||
 | 
					        <EnumProperty
 | 
				
			||||||
 | 
										Name="PreProc"
 | 
				
			||||||
 | 
										DisplayName="Pre-Processor"
 | 
				
			||||||
 | 
										Category="Configuration"
 | 
				
			||||||
 | 
										Description="Select the pre-processor ('nasm' or 'raw')"
 | 
				
			||||||
 | 
										>
 | 
				
			||||||
 | 
					          <Values>
 | 
				
			||||||
 | 
					            <EnumValue
 | 
				
			||||||
 | 
												Value="0"
 | 
				
			||||||
 | 
												Switch="-rnasm"
 | 
				
			||||||
 | 
												DisplayName="Nasm "
 | 
				
			||||||
 | 
											/>
 | 
				
			||||||
 | 
					            <EnumValue
 | 
				
			||||||
 | 
												Value="1"
 | 
				
			||||||
 | 
												Switch="-rraw"
 | 
				
			||||||
 | 
												DisplayName="Raw"
 | 
				
			||||||
 | 
											/>
 | 
				
			||||||
 | 
					          </Values>
 | 
				
			||||||
 | 
					        </EnumProperty>
 | 
				
			||||||
 | 
					        <EnumProperty
 | 
				
			||||||
 | 
										Name="Parser"
 | 
				
			||||||
 | 
										DisplayName="Parser"
 | 
				
			||||||
 | 
										Category="Configuration"
 | 
				
			||||||
 | 
										Description="Select the parser for Intel ('nasm') or AT&T ( 'gas') syntax"
 | 
				
			||||||
 | 
										>
 | 
				
			||||||
 | 
					          <Values>
 | 
				
			||||||
 | 
					            <EnumValue
 | 
				
			||||||
 | 
												Value="0"
 | 
				
			||||||
 | 
												Switch="-pnasm"
 | 
				
			||||||
 | 
												DisplayName="Nasm"
 | 
				
			||||||
 | 
											/>
 | 
				
			||||||
 | 
					            <EnumValue
 | 
				
			||||||
 | 
												Value="1"
 | 
				
			||||||
 | 
												Switch="-pgas"
 | 
				
			||||||
 | 
												DisplayName="Gas"
 | 
				
			||||||
 | 
											/>
 | 
				
			||||||
 | 
					          </Values>
 | 
				
			||||||
 | 
					        </EnumProperty>
 | 
				
			||||||
 | 
					      </Properties>
 | 
				
			||||||
 | 
					    </CustomBuildRule>
 | 
				
			||||||
 | 
					  </Rules>
 | 
				
			||||||
 | 
					</VisualStudioToolFile>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										303
									
								
								configure
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										303
									
								
								configure
									
									
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
#!/bin/sh
 | 
					#!/bin/bash
 | 
				
			||||||
##
 | 
					##
 | 
				
			||||||
##  configure
 | 
					##  configure
 | 
				
			||||||
##
 | 
					##
 | 
				
			||||||
@@ -20,13 +20,10 @@ show_help(){
 | 
				
			|||||||
    show_help_pre
 | 
					    show_help_pre
 | 
				
			||||||
    cat << EOF
 | 
					    cat << EOF
 | 
				
			||||||
Advanced options:
 | 
					Advanced options:
 | 
				
			||||||
  ${toggle_libs}                  libraries
 | 
					  ${toggle_libs}                  don't build libraries
 | 
				
			||||||
  ${toggle_examples}              examples
 | 
					  ${toggle_examples}              don't build examples
 | 
				
			||||||
  ${toggle_docs}                  documentation
 | 
					 | 
				
			||||||
  ${toggle_unit_tests}            unit tests
 | 
					 | 
				
			||||||
  --libc=PATH                     path to alternate libc
 | 
					  --libc=PATH                     path to alternate libc
 | 
				
			||||||
  --as={yasm|nasm|auto}           use specified assembler [auto, yasm preferred]
 | 
					  --as={yasm|nasm|auto}           use specified assembler [auto, yasm preferred]
 | 
				
			||||||
  --sdk-path=PATH                 path to root of sdk (android builds only)
 | 
					 | 
				
			||||||
  ${toggle_fast_unaligned}        don't use unaligned accesses, even when
 | 
					  ${toggle_fast_unaligned}        don't use unaligned accesses, even when
 | 
				
			||||||
                                  supported by hardware [auto]
 | 
					                                  supported by hardware [auto]
 | 
				
			||||||
  ${toggle_codec_srcs}            in/exclude codec library source code
 | 
					  ${toggle_codec_srcs}            in/exclude codec library source code
 | 
				
			||||||
@@ -34,23 +31,17 @@ Advanced options:
 | 
				
			|||||||
  ${toggle_md5}                   support for output of checksum data
 | 
					  ${toggle_md5}                   support for output of checksum data
 | 
				
			||||||
  ${toggle_static_msvcrt}         use static MSVCRT (VS builds only)
 | 
					  ${toggle_static_msvcrt}         use static MSVCRT (VS builds only)
 | 
				
			||||||
  ${toggle_vp8}                   VP8 codec support
 | 
					  ${toggle_vp8}                   VP8 codec support
 | 
				
			||||||
  ${toggle_vp9}                   VP9 codec support
 | 
					  ${toggle_psnr}                  output of PSNR data, if supported (encoders)
 | 
				
			||||||
  ${toggle_internal_stats}        output of encoder internal stats for debug, if supported (encoders)
 | 
					 | 
				
			||||||
  ${toggle_mem_tracker}           track memory usage
 | 
					  ${toggle_mem_tracker}           track memory usage
 | 
				
			||||||
  ${toggle_postproc}              postprocessing
 | 
					  ${toggle_postproc}              postprocessing
 | 
				
			||||||
  ${toggle_vp9_postproc}          vp9 specific postprocessing
 | 
					  ${toggle_multithread}           multithreaded encoding and decoding.
 | 
				
			||||||
  ${toggle_multithread}           multithreaded encoding and decoding
 | 
					 | 
				
			||||||
  ${toggle_spatial_resampling}    spatial sampling (scaling) support
 | 
					  ${toggle_spatial_resampling}    spatial sampling (scaling) support
 | 
				
			||||||
  ${toggle_realtime_only}         enable this option while building for real-time encoding
 | 
					  ${toggle_realtime_only}         enable this option while building for real-time encoding
 | 
				
			||||||
  ${toggle_onthefly_bitpacking}   enable on-the-fly bitpacking in real-time encoding
 | 
					 | 
				
			||||||
  ${toggle_error_concealment}     enable this option to get a decoder which is able to conceal losses
 | 
					 | 
				
			||||||
  ${toggle_runtime_cpu_detect}    runtime cpu detection
 | 
					  ${toggle_runtime_cpu_detect}    runtime cpu detection
 | 
				
			||||||
  ${toggle_shared}                shared library support
 | 
					  ${toggle_shared}                shared library support
 | 
				
			||||||
  ${toggle_static}                static library support
 | 
					 | 
				
			||||||
  ${toggle_small}                 favor smaller size over speed
 | 
					  ${toggle_small}                 favor smaller size over speed
 | 
				
			||||||
 | 
					  ${toggle_arm_asm_detok}         assembly version of the detokenizer (ARM platforms only)
 | 
				
			||||||
  ${toggle_postproc_visualizer}   macro block / block level visualizers
 | 
					  ${toggle_postproc_visualizer}   macro block / block level visualizers
 | 
				
			||||||
  ${toggle_multi_res_encoding}    enable multiple-resolution encoding
 | 
					 | 
				
			||||||
  ${toggle_temporal_denoising}    enable temporal denoising and disable the spatial denoiser
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
Codecs:
 | 
					Codecs:
 | 
				
			||||||
  Codecs can be selectively enabled or disabled individually, or by family:
 | 
					  Codecs can be selectively enabled or disabled individually, or by family:
 | 
				
			||||||
@@ -86,21 +77,24 @@ EOF
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# all_platforms is a list of all supported target platforms. Maintain
 | 
					# all_platforms is a list of all supported target platforms. Maintain
 | 
				
			||||||
# alphabetically by architecture, generic-gnu last.
 | 
					# alphabetically by architecture, generic-gnu last.
 | 
				
			||||||
all_platforms="${all_platforms} armv5te-android-gcc"
 | 
					 | 
				
			||||||
all_platforms="${all_platforms} armv5te-linux-rvct"
 | 
					all_platforms="${all_platforms} armv5te-linux-rvct"
 | 
				
			||||||
all_platforms="${all_platforms} armv5te-linux-gcc"
 | 
					all_platforms="${all_platforms} armv5te-linux-gcc"
 | 
				
			||||||
all_platforms="${all_platforms} armv5te-none-rvct"
 | 
					all_platforms="${all_platforms} armv5te-symbian-gcc"
 | 
				
			||||||
 | 
					all_platforms="${all_platforms} armv5te-wince-vs8"
 | 
				
			||||||
all_platforms="${all_platforms} armv6-darwin-gcc"
 | 
					all_platforms="${all_platforms} armv6-darwin-gcc"
 | 
				
			||||||
all_platforms="${all_platforms} armv6-linux-rvct"
 | 
					all_platforms="${all_platforms} armv6-linux-rvct"
 | 
				
			||||||
all_platforms="${all_platforms} armv6-linux-gcc"
 | 
					all_platforms="${all_platforms} armv6-linux-gcc"
 | 
				
			||||||
all_platforms="${all_platforms} armv6-none-rvct"
 | 
					all_platforms="${all_platforms} armv6-symbian-gcc"
 | 
				
			||||||
all_platforms="${all_platforms} armv7-android-gcc"   #neon Cortex-A8
 | 
					all_platforms="${all_platforms} armv6-wince-vs8"
 | 
				
			||||||
 | 
					all_platforms="${all_platforms} iwmmxt-linux-rvct"
 | 
				
			||||||
 | 
					all_platforms="${all_platforms} iwmmxt-linux-gcc"
 | 
				
			||||||
 | 
					all_platforms="${all_platforms} iwmmxt-wince-vs8"
 | 
				
			||||||
 | 
					all_platforms="${all_platforms} iwmmxt2-linux-rvct"
 | 
				
			||||||
 | 
					all_platforms="${all_platforms} iwmmxt2-linux-gcc"
 | 
				
			||||||
 | 
					all_platforms="${all_platforms} iwmmxt2-wince-vs8"
 | 
				
			||||||
all_platforms="${all_platforms} armv7-darwin-gcc"    #neon Cortex-A8
 | 
					all_platforms="${all_platforms} armv7-darwin-gcc"    #neon Cortex-A8
 | 
				
			||||||
all_platforms="${all_platforms} armv7-linux-rvct"    #neon Cortex-A8
 | 
					all_platforms="${all_platforms} armv7-linux-rvct"    #neon Cortex-A8
 | 
				
			||||||
all_platforms="${all_platforms} armv7-linux-gcc"     #neon Cortex-A8
 | 
					all_platforms="${all_platforms} armv7-linux-gcc"     #neon Cortex-A8
 | 
				
			||||||
all_platforms="${all_platforms} armv7-none-rvct"     #neon Cortex-A8
 | 
					 | 
				
			||||||
all_platforms="${all_platforms} armv7-win32-vs11"
 | 
					 | 
				
			||||||
all_platforms="${all_platforms} armv7-win32-vs12"
 | 
					 | 
				
			||||||
all_platforms="${all_platforms} mips32-linux-gcc"
 | 
					all_platforms="${all_platforms} mips32-linux-gcc"
 | 
				
			||||||
all_platforms="${all_platforms} ppc32-darwin8-gcc"
 | 
					all_platforms="${all_platforms} ppc32-darwin8-gcc"
 | 
				
			||||||
all_platforms="${all_platforms} ppc32-darwin9-gcc"
 | 
					all_platforms="${all_platforms} ppc32-darwin9-gcc"
 | 
				
			||||||
@@ -109,46 +103,26 @@ all_platforms="${all_platforms} ppc64-darwin8-gcc"
 | 
				
			|||||||
all_platforms="${all_platforms} ppc64-darwin9-gcc"
 | 
					all_platforms="${all_platforms} ppc64-darwin9-gcc"
 | 
				
			||||||
all_platforms="${all_platforms} ppc64-linux-gcc"
 | 
					all_platforms="${all_platforms} ppc64-linux-gcc"
 | 
				
			||||||
all_platforms="${all_platforms} sparc-solaris-gcc"
 | 
					all_platforms="${all_platforms} sparc-solaris-gcc"
 | 
				
			||||||
all_platforms="${all_platforms} x86-android-gcc"
 | 
					 | 
				
			||||||
all_platforms="${all_platforms} x86-darwin8-gcc"
 | 
					all_platforms="${all_platforms} x86-darwin8-gcc"
 | 
				
			||||||
all_platforms="${all_platforms} x86-darwin8-icc"
 | 
					all_platforms="${all_platforms} x86-darwin8-icc"
 | 
				
			||||||
all_platforms="${all_platforms} x86-darwin9-gcc"
 | 
					all_platforms="${all_platforms} x86-darwin9-gcc"
 | 
				
			||||||
all_platforms="${all_platforms} x86-darwin9-icc"
 | 
					all_platforms="${all_platforms} x86-darwin9-icc"
 | 
				
			||||||
all_platforms="${all_platforms} x86-darwin10-gcc"
 | 
					 | 
				
			||||||
all_platforms="${all_platforms} x86-darwin11-gcc"
 | 
					 | 
				
			||||||
all_platforms="${all_platforms} x86-darwin12-gcc"
 | 
					 | 
				
			||||||
all_platforms="${all_platforms} x86-darwin13-gcc"
 | 
					 | 
				
			||||||
all_platforms="${all_platforms} x86-linux-gcc"
 | 
					all_platforms="${all_platforms} x86-linux-gcc"
 | 
				
			||||||
all_platforms="${all_platforms} x86-linux-icc"
 | 
					all_platforms="${all_platforms} x86-linux-icc"
 | 
				
			||||||
all_platforms="${all_platforms} x86-os2-gcc"
 | 
					 | 
				
			||||||
all_platforms="${all_platforms} x86-solaris-gcc"
 | 
					all_platforms="${all_platforms} x86-solaris-gcc"
 | 
				
			||||||
all_platforms="${all_platforms} x86-win32-gcc"
 | 
					all_platforms="${all_platforms} x86-win32-gcc"
 | 
				
			||||||
all_platforms="${all_platforms} x86-win32-vs7"
 | 
					all_platforms="${all_platforms} x86-win32-vs7"
 | 
				
			||||||
all_platforms="${all_platforms} x86-win32-vs8"
 | 
					all_platforms="${all_platforms} x86-win32-vs8"
 | 
				
			||||||
all_platforms="${all_platforms} x86-win32-vs9"
 | 
					all_platforms="${all_platforms} x86-win32-vs9"
 | 
				
			||||||
all_platforms="${all_platforms} x86-win32-vs10"
 | 
					 | 
				
			||||||
all_platforms="${all_platforms} x86-win32-vs11"
 | 
					 | 
				
			||||||
all_platforms="${all_platforms} x86-win32-vs12"
 | 
					 | 
				
			||||||
all_platforms="${all_platforms} x86_64-darwin9-gcc"
 | 
					all_platforms="${all_platforms} x86_64-darwin9-gcc"
 | 
				
			||||||
all_platforms="${all_platforms} x86_64-darwin10-gcc"
 | 
					all_platforms="${all_platforms} x86_64-darwin10-gcc"
 | 
				
			||||||
all_platforms="${all_platforms} x86_64-darwin11-gcc"
 | 
					 | 
				
			||||||
all_platforms="${all_platforms} x86_64-darwin12-gcc"
 | 
					 | 
				
			||||||
all_platforms="${all_platforms} x86_64-darwin13-gcc"
 | 
					 | 
				
			||||||
all_platforms="${all_platforms} x86_64-linux-gcc"
 | 
					all_platforms="${all_platforms} x86_64-linux-gcc"
 | 
				
			||||||
all_platforms="${all_platforms} x86_64-linux-icc"
 | 
					all_platforms="${all_platforms} x86_64-linux-icc"
 | 
				
			||||||
all_platforms="${all_platforms} x86_64-solaris-gcc"
 | 
					all_platforms="${all_platforms} x86_64-solaris-gcc"
 | 
				
			||||||
all_platforms="${all_platforms} x86_64-win64-gcc"
 | 
					 | 
				
			||||||
all_platforms="${all_platforms} x86_64-win64-vs8"
 | 
					all_platforms="${all_platforms} x86_64-win64-vs8"
 | 
				
			||||||
all_platforms="${all_platforms} x86_64-win64-vs9"
 | 
					all_platforms="${all_platforms} x86_64-win64-vs9"
 | 
				
			||||||
all_platforms="${all_platforms} x86_64-win64-vs10"
 | 
					 | 
				
			||||||
all_platforms="${all_platforms} x86_64-win64-vs11"
 | 
					 | 
				
			||||||
all_platforms="${all_platforms} x86_64-win64-vs12"
 | 
					 | 
				
			||||||
all_platforms="${all_platforms} universal-darwin8-gcc"
 | 
					all_platforms="${all_platforms} universal-darwin8-gcc"
 | 
				
			||||||
all_platforms="${all_platforms} universal-darwin9-gcc"
 | 
					all_platforms="${all_platforms} universal-darwin9-gcc"
 | 
				
			||||||
all_platforms="${all_platforms} universal-darwin10-gcc"
 | 
					 | 
				
			||||||
all_platforms="${all_platforms} universal-darwin11-gcc"
 | 
					 | 
				
			||||||
all_platforms="${all_platforms} universal-darwin12-gcc"
 | 
					 | 
				
			||||||
all_platforms="${all_platforms} universal-darwin13-gcc"
 | 
					 | 
				
			||||||
all_platforms="${all_platforms} generic-gnu"
 | 
					all_platforms="${all_platforms} generic-gnu"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# all_targets is a list of all targets that can be configured
 | 
					# all_targets is a list of all targets that can be configured
 | 
				
			||||||
@@ -157,7 +131,7 @@ all_targets="libs examples docs"
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# all targets available are enabled, by default.
 | 
					# all targets available are enabled, by default.
 | 
				
			||||||
for t in ${all_targets}; do
 | 
					for t in ${all_targets}; do
 | 
				
			||||||
    [ -f ${source_path}/${t}.mk ] && enable_feature ${t}
 | 
					    [ -f ${source_path}/${t}.mk ] && enable ${t}
 | 
				
			||||||
done
 | 
					done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# check installed doxygen version
 | 
					# check installed doxygen version
 | 
				
			||||||
@@ -168,46 +142,36 @@ if [ ${doxy_major:-0} -ge 1 ]; then
 | 
				
			|||||||
    doxy_minor=${doxy_version%%.*}
 | 
					    doxy_minor=${doxy_version%%.*}
 | 
				
			||||||
    doxy_patch=${doxy_version##*.}
 | 
					    doxy_patch=${doxy_version##*.}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    [ $doxy_major -gt 1 ] && enable_feature doxygen
 | 
					    [ $doxy_major -gt 1 ] && enable doxygen
 | 
				
			||||||
    [ $doxy_minor -gt 5 ] && enable_feature doxygen
 | 
					    [ $doxy_minor -gt 5 ] && enable doxygen
 | 
				
			||||||
    [ $doxy_minor -eq 5 ] && [ $doxy_patch -ge 3 ] && enable_feature doxygen
 | 
					    [ $doxy_minor -eq 5 ] && [ $doxy_patch -ge 3 ] && enable doxygen
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# install everything except the sources, by default. sources will have
 | 
					# install everything except the sources, by default. sources will have
 | 
				
			||||||
# to be enabled when doing dist builds, since that's no longer a common
 | 
					# to be enabled when doing dist builds, since that's no longer a common
 | 
				
			||||||
# case.
 | 
					# case.
 | 
				
			||||||
enabled doxygen && php -v >/dev/null 2>&1 && enable_feature install_docs
 | 
					enabled doxygen && php -v >/dev/null 2>&1 && enable install_docs
 | 
				
			||||||
enable_feature install_bins
 | 
					enable install_bins
 | 
				
			||||||
enable_feature install_libs
 | 
					enable install_libs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enable_feature static
 | 
					enable optimizations
 | 
				
			||||||
enable_feature optimizations
 | 
					enable fast_unaligned #allow unaligned accesses, if supported by hw
 | 
				
			||||||
enable_feature fast_unaligned #allow unaligned accesses, if supported by hw
 | 
					enable md5
 | 
				
			||||||
enable_feature md5
 | 
					enable spatial_resampling
 | 
				
			||||||
enable_feature spatial_resampling
 | 
					enable multithread
 | 
				
			||||||
enable_feature multithread
 | 
					 | 
				
			||||||
enable_feature os_support
 | 
					 | 
				
			||||||
enable_feature temporal_denoising
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ -d ${source_path}/../include ] && enable_feature alt_tree_layout
 | 
					[ -d ${source_path}/../include ] && enable alt_tree_layout
 | 
				
			||||||
for d in vp8 vp9; do
 | 
					for d in vp8; do
 | 
				
			||||||
    [ -d ${source_path}/${d} ] && disable_feature alt_tree_layout;
 | 
					    [ -d ${source_path}/${d} ] && disable alt_tree_layout;
 | 
				
			||||||
done
 | 
					done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if ! enabled alt_tree_layout; then
 | 
					if ! enabled alt_tree_layout; then
 | 
				
			||||||
# development environment
 | 
					# development environment
 | 
				
			||||||
[ -d ${source_path}/vp8 ] && CODECS="${CODECS} vp8_encoder vp8_decoder"
 | 
					[ -d ${source_path}/vp8 ] && CODECS="${CODECS} vp8_encoder vp8_decoder"
 | 
				
			||||||
[ -d ${source_path}/vp9 ] && CODECS="${CODECS} vp9_encoder vp9_decoder"
 | 
					 | 
				
			||||||
else
 | 
					else
 | 
				
			||||||
# customer environment
 | 
					# customer environment
 | 
				
			||||||
[ -f ${source_path}/../include/vpx/vp8cx.h ] && CODECS="${CODECS} vp8_encoder"
 | 
					[ -f ${source_path}/../include/vpx/vp8cx.h ] && CODECS="${CODECS} vp8_encoder"
 | 
				
			||||||
[ -f ${source_path}/../include/vpx/vp8dx.h ] && CODECS="${CODECS} vp8_decoder"
 | 
					[ -f ${source_path}/../include/vpx/vp8dx.h ] && CODECS="${CODECS} vp8_decoder"
 | 
				
			||||||
[ -f ${source_path}/../include/vpx/vp9cx.h ] && CODECS="${CODECS} vp9_encoder"
 | 
					 | 
				
			||||||
[ -f ${source_path}/../include/vpx/vp9dx.h ] && CODECS="${CODECS} vp9_decoder"
 | 
					 | 
				
			||||||
[ -f ${source_path}/../include/vpx/vp8cx.h ] || disable_feature vp8_encoder
 | 
					 | 
				
			||||||
[ -f ${source_path}/../include/vpx/vp8dx.h ] || disable_feature vp8_decoder
 | 
					 | 
				
			||||||
[ -f ${source_path}/../include/vpx/vp9cx.h ] || disable_feature vp9_encoder
 | 
					 | 
				
			||||||
[ -f ${source_path}/../include/vpx/vp9dx.h ] || disable_feature vp9_decoder
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ -f ${source_path}/../lib/*/*mt.lib ] && soft_enable static_msvcrt
 | 
					[ -f ${source_path}/../lib/*/*mt.lib ] && soft_enable static_msvcrt
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
@@ -224,12 +188,13 @@ ARCH_LIST="
 | 
				
			|||||||
    ppc64
 | 
					    ppc64
 | 
				
			||||||
"
 | 
					"
 | 
				
			||||||
ARCH_EXT_LIST="
 | 
					ARCH_EXT_LIST="
 | 
				
			||||||
    edsp
 | 
					    armv5te
 | 
				
			||||||
    media
 | 
					    armv6
 | 
				
			||||||
    neon
 | 
					    armv7
 | 
				
			||||||
 | 
					    iwmmxt
 | 
				
			||||||
 | 
					    iwmmxt2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    mips32
 | 
					    mips32
 | 
				
			||||||
    dspr2
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    mmx
 | 
					    mmx
 | 
				
			||||||
    sse
 | 
					    sse
 | 
				
			||||||
@@ -237,8 +202,6 @@ ARCH_EXT_LIST="
 | 
				
			|||||||
    sse3
 | 
					    sse3
 | 
				
			||||||
    ssse3
 | 
					    ssse3
 | 
				
			||||||
    sse4_1
 | 
					    sse4_1
 | 
				
			||||||
    avx
 | 
					 | 
				
			||||||
    avx2
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    altivec
 | 
					    altivec
 | 
				
			||||||
"
 | 
					"
 | 
				
			||||||
@@ -249,12 +212,6 @@ HAVE_LIST="
 | 
				
			|||||||
    alt_tree_layout
 | 
					    alt_tree_layout
 | 
				
			||||||
    pthread_h
 | 
					    pthread_h
 | 
				
			||||||
    sys_mman_h
 | 
					    sys_mman_h
 | 
				
			||||||
    unistd_h
 | 
					 | 
				
			||||||
"
 | 
					 | 
				
			||||||
EXPERIMENT_LIST="
 | 
					 | 
				
			||||||
    multiple_arf
 | 
					 | 
				
			||||||
    non420
 | 
					 | 
				
			||||||
    alpha
 | 
					 | 
				
			||||||
"
 | 
					"
 | 
				
			||||||
CONFIG_LIST="
 | 
					CONFIG_LIST="
 | 
				
			||||||
    external_build
 | 
					    external_build
 | 
				
			||||||
@@ -262,7 +219,6 @@ CONFIG_LIST="
 | 
				
			|||||||
    install_bins
 | 
					    install_bins
 | 
				
			||||||
    install_libs
 | 
					    install_libs
 | 
				
			||||||
    install_srcs
 | 
					    install_srcs
 | 
				
			||||||
    use_x86inc
 | 
					 | 
				
			||||||
    debug
 | 
					    debug
 | 
				
			||||||
    gprof
 | 
					    gprof
 | 
				
			||||||
    gcov
 | 
					    gcov
 | 
				
			||||||
@@ -284,9 +240,8 @@ CONFIG_LIST="
 | 
				
			|||||||
    dc_recon
 | 
					    dc_recon
 | 
				
			||||||
    runtime_cpu_detect
 | 
					    runtime_cpu_detect
 | 
				
			||||||
    postproc
 | 
					    postproc
 | 
				
			||||||
    vp9_postproc
 | 
					 | 
				
			||||||
    multithread
 | 
					    multithread
 | 
				
			||||||
    internal_stats
 | 
					    psnr
 | 
				
			||||||
    ${CODECS}
 | 
					    ${CODECS}
 | 
				
			||||||
    ${CODEC_FAMILIES}
 | 
					    ${CODEC_FAMILIES}
 | 
				
			||||||
    encoders
 | 
					    encoders
 | 
				
			||||||
@@ -294,22 +249,12 @@ CONFIG_LIST="
 | 
				
			|||||||
    static_msvcrt
 | 
					    static_msvcrt
 | 
				
			||||||
    spatial_resampling
 | 
					    spatial_resampling
 | 
				
			||||||
    realtime_only
 | 
					    realtime_only
 | 
				
			||||||
    onthefly_bitpacking
 | 
					 | 
				
			||||||
    error_concealment
 | 
					 | 
				
			||||||
    shared
 | 
					    shared
 | 
				
			||||||
    static
 | 
					 | 
				
			||||||
    small
 | 
					    small
 | 
				
			||||||
 | 
					    arm_asm_detok
 | 
				
			||||||
    postproc_visualizer
 | 
					    postproc_visualizer
 | 
				
			||||||
    os_support
 | 
					 | 
				
			||||||
    unit_tests
 | 
					 | 
				
			||||||
    multi_res_encoding
 | 
					 | 
				
			||||||
    temporal_denoising
 | 
					 | 
				
			||||||
    experimental
 | 
					 | 
				
			||||||
    decrypt
 | 
					 | 
				
			||||||
    ${EXPERIMENT_LIST}
 | 
					 | 
				
			||||||
"
 | 
					"
 | 
				
			||||||
CMDLINE_SELECT="
 | 
					CMDLINE_SELECT="
 | 
				
			||||||
    external_build
 | 
					 | 
				
			||||||
    extra_warnings
 | 
					    extra_warnings
 | 
				
			||||||
    werror
 | 
					    werror
 | 
				
			||||||
    install_docs
 | 
					    install_docs
 | 
				
			||||||
@@ -320,15 +265,12 @@ CMDLINE_SELECT="
 | 
				
			|||||||
    gprof
 | 
					    gprof
 | 
				
			||||||
    gcov
 | 
					    gcov
 | 
				
			||||||
    pic
 | 
					    pic
 | 
				
			||||||
    use_x86inc
 | 
					 | 
				
			||||||
    optimizations
 | 
					    optimizations
 | 
				
			||||||
    ccache
 | 
					    ccache
 | 
				
			||||||
    runtime_cpu_detect
 | 
					    runtime_cpu_detect
 | 
				
			||||||
    thumb
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    libs
 | 
					    libs
 | 
				
			||||||
    examples
 | 
					    examples
 | 
				
			||||||
    docs
 | 
					 | 
				
			||||||
    libc
 | 
					    libc
 | 
				
			||||||
    as
 | 
					    as
 | 
				
			||||||
    fast_unaligned
 | 
					    fast_unaligned
 | 
				
			||||||
@@ -339,46 +281,26 @@ CMDLINE_SELECT="
 | 
				
			|||||||
    dequant_tokens
 | 
					    dequant_tokens
 | 
				
			||||||
    dc_recon
 | 
					    dc_recon
 | 
				
			||||||
    postproc
 | 
					    postproc
 | 
				
			||||||
    vp9_postproc
 | 
					 | 
				
			||||||
    multithread
 | 
					    multithread
 | 
				
			||||||
    internal_stats
 | 
					    psnr
 | 
				
			||||||
    ${CODECS}
 | 
					    ${CODECS}
 | 
				
			||||||
    ${CODEC_FAMILIES}
 | 
					    ${CODEC_FAMILIES}
 | 
				
			||||||
    static_msvcrt
 | 
					    static_msvcrt
 | 
				
			||||||
    mem_tracker
 | 
					    mem_tracker
 | 
				
			||||||
    spatial_resampling
 | 
					    spatial_resampling
 | 
				
			||||||
    realtime_only
 | 
					    realtime_only
 | 
				
			||||||
    onthefly_bitpacking
 | 
					 | 
				
			||||||
    error_concealment
 | 
					 | 
				
			||||||
    shared
 | 
					    shared
 | 
				
			||||||
    static
 | 
					 | 
				
			||||||
    small
 | 
					    small
 | 
				
			||||||
 | 
					    arm_asm_detok
 | 
				
			||||||
    postproc_visualizer
 | 
					    postproc_visualizer
 | 
				
			||||||
    unit_tests
 | 
					 | 
				
			||||||
    multi_res_encoding
 | 
					 | 
				
			||||||
    temporal_denoising
 | 
					 | 
				
			||||||
    experimental
 | 
					 | 
				
			||||||
    decrypt
 | 
					 | 
				
			||||||
"
 | 
					"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
process_cmdline() {
 | 
					process_cmdline() {
 | 
				
			||||||
    for opt do
 | 
					    for opt do
 | 
				
			||||||
        optval="${opt#*=}"
 | 
					        optval="${opt#*=}"
 | 
				
			||||||
        case "$opt" in
 | 
					        case "$opt" in
 | 
				
			||||||
        --disable-codecs) for c in ${CODECS}; do disable_feature $c; done ;;
 | 
					        --disable-codecs) for c in ${CODECS}; do disable $c; done ;;
 | 
				
			||||||
        --enable-?*|--disable-?*)
 | 
					        *) process_common_cmdline $opt
 | 
				
			||||||
        eval `echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g'`
 | 
					 | 
				
			||||||
        if echo "${EXPERIMENT_LIST}" | grep "^ *$option\$" >/dev/null; then
 | 
					 | 
				
			||||||
            if enabled experimental; then
 | 
					 | 
				
			||||||
                ${action}_feature $option
 | 
					 | 
				
			||||||
            else
 | 
					 | 
				
			||||||
                log_echo "Ignoring $opt -- not in experimental mode."
 | 
					 | 
				
			||||||
            fi
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
            process_common_cmdline $opt
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
        ;;
 | 
					 | 
				
			||||||
        *) process_common_cmdline "$opt"
 | 
					 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
        esac
 | 
					        esac
 | 
				
			||||||
    done
 | 
					    done
 | 
				
			||||||
@@ -391,8 +313,8 @@ post_process_cmdline() {
 | 
				
			|||||||
    # If the codec family is enabled, enable all components of that family.
 | 
					    # If the codec family is enabled, enable all components of that family.
 | 
				
			||||||
    log_echo "Configuring selected codecs"
 | 
					    log_echo "Configuring selected codecs"
 | 
				
			||||||
    for c in ${CODECS}; do
 | 
					    for c in ${CODECS}; do
 | 
				
			||||||
        disabled ${c%%_*} && disable_feature ${c}
 | 
					        disabled ${c%%_*} && disable ${c}
 | 
				
			||||||
        enabled ${c%%_*} && enable_feature ${c}
 | 
					        enabled ${c%%_*} && enable ${c}
 | 
				
			||||||
    done
 | 
					    done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Enable all detected codecs, if they haven't been disabled
 | 
					    # Enable all detected codecs, if they haven't been disabled
 | 
				
			||||||
@@ -400,12 +322,12 @@ post_process_cmdline() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    # Enable the codec family if any component of that family is enabled
 | 
					    # Enable the codec family if any component of that family is enabled
 | 
				
			||||||
    for c in ${CODECS}; do
 | 
					    for c in ${CODECS}; do
 | 
				
			||||||
        enabled $c && enable_feature ${c%_*}
 | 
					        enabled $c && enable ${c%_*}
 | 
				
			||||||
    done
 | 
					    done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Set the {en,de}coders variable if any algorithm in that class is enabled
 | 
					    # Set the {en,de}coders variable if any algorithm in that class is enabled
 | 
				
			||||||
    for c in ${CODECS}; do
 | 
					    for c in ${CODECS}; do
 | 
				
			||||||
        enabled ${c} && enable_feature ${c##*_}s
 | 
					        enabled ${c} && enable ${c##*_}s
 | 
				
			||||||
    done
 | 
					    done
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -426,7 +348,7 @@ process_targets() {
 | 
				
			|||||||
    fi
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # The write_common_config (config.mk) logic is deferred until after the
 | 
					    # The write_common_config (config.mk) logic is deferred until after the
 | 
				
			||||||
    # recursive calls to configure complete, because we want our universal
 | 
					    # recursive calls to configure complete, becuase we want our universal
 | 
				
			||||||
    # targets to be executed last.
 | 
					    # targets to be executed last.
 | 
				
			||||||
    write_common_config_targets
 | 
					    write_common_config_targets
 | 
				
			||||||
    enabled universal && echo "FAT_ARCHS=${fat_bin_archs}" >> config.mk
 | 
					    enabled universal && echo "FAT_ARCHS=${fat_bin_archs}" >> config.mk
 | 
				
			||||||
@@ -445,7 +367,7 @@ process_targets() {
 | 
				
			|||||||
    done
 | 
					    done
 | 
				
			||||||
    enabled debug_libs && DIST_DIR="${DIST_DIR}-debug"
 | 
					    enabled debug_libs && DIST_DIR="${DIST_DIR}-debug"
 | 
				
			||||||
    enabled codec_srcs && DIST_DIR="${DIST_DIR}-src"
 | 
					    enabled codec_srcs && DIST_DIR="${DIST_DIR}-src"
 | 
				
			||||||
    ! enabled postproc && ! enabled vp9_postproc && DIST_DIR="${DIST_DIR}-nopost"
 | 
					    ! enabled postproc && DIST_DIR="${DIST_DIR}-nopost"
 | 
				
			||||||
    ! enabled multithread && DIST_DIR="${DIST_DIR}-nomt"
 | 
					    ! enabled multithread && DIST_DIR="${DIST_DIR}-nomt"
 | 
				
			||||||
    ! enabled install_docs && DIST_DIR="${DIST_DIR}-nodocs"
 | 
					    ! enabled install_docs && DIST_DIR="${DIST_DIR}-nodocs"
 | 
				
			||||||
    DIST_DIR="${DIST_DIR}-${tgt_isa}-${tgt_os}"
 | 
					    DIST_DIR="${DIST_DIR}-${tgt_isa}-${tgt_os}"
 | 
				
			||||||
@@ -457,7 +379,6 @@ process_targets() {
 | 
				
			|||||||
    if [ -f "${source_path}/build/make/version.sh" ]; then
 | 
					    if [ -f "${source_path}/build/make/version.sh" ]; then
 | 
				
			||||||
        local ver=`"$source_path/build/make/version.sh" --bare $source_path`
 | 
					        local ver=`"$source_path/build/make/version.sh" --bare $source_path`
 | 
				
			||||||
        DIST_DIR="${DIST_DIR}-${ver}"
 | 
					        DIST_DIR="${DIST_DIR}-${ver}"
 | 
				
			||||||
        VERSION_STRING=${ver}
 | 
					 | 
				
			||||||
        ver=${ver%%-*}
 | 
					        ver=${ver%%-*}
 | 
				
			||||||
        VERSION_PATCH=${ver##*.}
 | 
					        VERSION_PATCH=${ver##*.}
 | 
				
			||||||
        ver=${ver%.*}
 | 
					        ver=${ver%.*}
 | 
				
			||||||
@@ -466,8 +387,6 @@ process_targets() {
 | 
				
			|||||||
        VERSION_MAJOR=${ver%.*}
 | 
					        VERSION_MAJOR=${ver%.*}
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
    enabled child || cat <<EOF >> config.mk
 | 
					    enabled child || cat <<EOF >> config.mk
 | 
				
			||||||
 | 
					 | 
				
			||||||
PREFIX=${prefix}
 | 
					 | 
				
			||||||
ifeq (\$(MAKECMDGOALS),dist)
 | 
					ifeq (\$(MAKECMDGOALS),dist)
 | 
				
			||||||
DIST_DIR?=${DIST_DIR}
 | 
					DIST_DIR?=${DIST_DIR}
 | 
				
			||||||
else
 | 
					else
 | 
				
			||||||
@@ -475,8 +394,6 @@ DIST_DIR?=\$(DESTDIR)${prefix}
 | 
				
			|||||||
endif
 | 
					endif
 | 
				
			||||||
LIBSUBDIR=${libdir##${prefix}/}
 | 
					LIBSUBDIR=${libdir##${prefix}/}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VERSION_STRING=${VERSION_STRING}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
VERSION_MAJOR=${VERSION_MAJOR}
 | 
					VERSION_MAJOR=${VERSION_MAJOR}
 | 
				
			||||||
VERSION_MINOR=${VERSION_MINOR}
 | 
					VERSION_MINOR=${VERSION_MINOR}
 | 
				
			||||||
VERSION_PATCH=${VERSION_PATCH}
 | 
					VERSION_PATCH=${VERSION_PATCH}
 | 
				
			||||||
@@ -505,24 +422,17 @@ process_detect() {
 | 
				
			|||||||
        # Can only build shared libs on a subset of platforms. Doing this check
 | 
					        # Can only build shared libs on a subset of platforms. Doing this check
 | 
				
			||||||
        # here rather than at option parse time because the target auto-detect
 | 
					        # here rather than at option parse time because the target auto-detect
 | 
				
			||||||
        # magic happens after the command line has been parsed.
 | 
					        # magic happens after the command line has been parsed.
 | 
				
			||||||
        if ! enabled linux; then
 | 
					        enabled linux || die "--enable-shared only supported on ELF for now"
 | 
				
			||||||
            if enabled gnu; then
 | 
					 | 
				
			||||||
                echo "--enable-shared is only supported on ELF; assuming this is OK"
 | 
					 | 
				
			||||||
            else
 | 
					 | 
				
			||||||
                die "--enable-shared only supported on ELF for now"
 | 
					 | 
				
			||||||
            fi
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
    if [ -z "$CC" ] || enabled external_build; then
 | 
					    if [ -z "$CC" ]; then
 | 
				
			||||||
        echo "Bypassing toolchain for environment detection."
 | 
					        echo "Bypassing toolchain for environment detection."
 | 
				
			||||||
        enable_feature external_build
 | 
					        enable external_build
 | 
				
			||||||
        check_header() {
 | 
					        check_header() {
 | 
				
			||||||
            log fake_check_header "$@"
 | 
					            log fake_check_header "$@"
 | 
				
			||||||
            header=$1
 | 
					            header=$1
 | 
				
			||||||
            shift
 | 
					            shift
 | 
				
			||||||
            var=`echo $header | sed 's/[^A-Za-z0-9_]/_/g'`
 | 
					            var=`echo $header | sed 's/[^A-Za-z0-9_]/_/g'`
 | 
				
			||||||
            disable_feature $var
 | 
					            disable $var
 | 
				
			||||||
            # Headers common to all environments
 | 
					 | 
				
			||||||
            case $header in
 | 
					            case $header in
 | 
				
			||||||
                stdio.h)
 | 
					                stdio.h)
 | 
				
			||||||
                    true;
 | 
					                    true;
 | 
				
			||||||
@@ -533,26 +443,7 @@ process_detect() {
 | 
				
			|||||||
                        [ -f "${d##-I}/$header" ] && result=true && break
 | 
					                        [ -f "${d##-I}/$header" ] && result=true && break
 | 
				
			||||||
                    done
 | 
					                    done
 | 
				
			||||||
                    ${result:-true}
 | 
					                    ${result:-true}
 | 
				
			||||||
            esac && enable_feature $var
 | 
					            esac && enable $var
 | 
				
			||||||
 | 
					 | 
				
			||||||
            # Specialize windows and POSIX environments.
 | 
					 | 
				
			||||||
            case $toolchain in
 | 
					 | 
				
			||||||
                *-win*-*)
 | 
					 | 
				
			||||||
                    case $header-$toolchain in
 | 
					 | 
				
			||||||
                        stdint*-gcc) true;;
 | 
					 | 
				
			||||||
                        *) false;;
 | 
					 | 
				
			||||||
                    esac && enable_feature $var
 | 
					 | 
				
			||||||
                    ;;
 | 
					 | 
				
			||||||
                *)
 | 
					 | 
				
			||||||
                    case $header in
 | 
					 | 
				
			||||||
                        stdint.h) true;;
 | 
					 | 
				
			||||||
                        pthread.h) true;;
 | 
					 | 
				
			||||||
                        sys/mman.h) true;;
 | 
					 | 
				
			||||||
                        unistd.h) true;;
 | 
					 | 
				
			||||||
                        *) false;;
 | 
					 | 
				
			||||||
                    esac && enable_feature $var
 | 
					 | 
				
			||||||
            esac
 | 
					 | 
				
			||||||
            enabled $var
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        check_ld() {
 | 
					        check_ld() {
 | 
				
			||||||
            true
 | 
					            true
 | 
				
			||||||
@@ -566,9 +457,8 @@ EOF
 | 
				
			|||||||
    check_header stdint.h
 | 
					    check_header stdint.h
 | 
				
			||||||
    check_header pthread.h
 | 
					    check_header pthread.h
 | 
				
			||||||
    check_header sys/mman.h
 | 
					    check_header sys/mman.h
 | 
				
			||||||
    check_header unistd.h # for sysconf(3) and friends.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    check_header vpx/vpx_integer.h -I${source_path} && enable_feature vpx_ports
 | 
					    check_header vpx/vpx_integer.h -I${source_path} && enable vpx_ports
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
process_toolchain() {
 | 
					process_toolchain() {
 | 
				
			||||||
@@ -578,20 +468,11 @@ process_toolchain() {
 | 
				
			|||||||
    case $toolchain in
 | 
					    case $toolchain in
 | 
				
			||||||
        universal-darwin*)
 | 
					        universal-darwin*)
 | 
				
			||||||
            local darwin_ver=${tgt_os##darwin}
 | 
					            local darwin_ver=${tgt_os##darwin}
 | 
				
			||||||
 | 
					            fat_bin_archs="$fat_bin_archs ppc32-${tgt_os}-gcc"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            # Snow Leopard (10.6/darwin10) dropped support for PPC
 | 
					            # Intel
 | 
				
			||||||
            # Include PPC support for all prior versions
 | 
					            fat_bin_archs="$fat_bin_archs x86-${tgt_os}-${tgt_cc}"
 | 
				
			||||||
            if [ $darwin_ver -lt 10 ]; then
 | 
					            if [ $darwin_ver -gt 8 ]; then
 | 
				
			||||||
                fat_bin_archs="$fat_bin_archs ppc32-${tgt_os}-gcc"
 | 
					 | 
				
			||||||
            fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            # Tiger (10.4/darwin8) brought support for x86
 | 
					 | 
				
			||||||
            if [ $darwin_ver -ge 8 ]; then
 | 
					 | 
				
			||||||
                fat_bin_archs="$fat_bin_archs x86-${tgt_os}-${tgt_cc}"
 | 
					 | 
				
			||||||
            fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            # Leopard (10.5/darwin9) brought 64 bit support
 | 
					 | 
				
			||||||
            if [ $darwin_ver -ge 9 ]; then
 | 
					 | 
				
			||||||
                fat_bin_archs="$fat_bin_archs x86_64-${tgt_os}-${tgt_cc}"
 | 
					                fat_bin_archs="$fat_bin_archs x86_64-${tgt_os}-${tgt_cc}"
 | 
				
			||||||
            fi
 | 
					            fi
 | 
				
			||||||
            ;;
 | 
					            ;;
 | 
				
			||||||
@@ -607,20 +488,7 @@ process_toolchain() {
 | 
				
			|||||||
        check_add_cflags -Wpointer-arith
 | 
					        check_add_cflags -Wpointer-arith
 | 
				
			||||||
        check_add_cflags -Wtype-limits
 | 
					        check_add_cflags -Wtype-limits
 | 
				
			||||||
        check_add_cflags -Wcast-qual
 | 
					        check_add_cflags -Wcast-qual
 | 
				
			||||||
        check_add_cflags -Wvla
 | 
					        enabled extra_warnings || check_add_cflags -Wno-unused
 | 
				
			||||||
        check_add_cflags -Wimplicit-function-declaration
 | 
					 | 
				
			||||||
        check_add_cflags -Wuninitialized
 | 
					 | 
				
			||||||
        check_add_cflags -Wunused-variable
 | 
					 | 
				
			||||||
        case ${CC} in
 | 
					 | 
				
			||||||
          *clang*)
 | 
					 | 
				
			||||||
              # libvpx and/or clang have issues with aliasing:
 | 
					 | 
				
			||||||
              # https://code.google.com/p/webm/issues/detail?id=603
 | 
					 | 
				
			||||||
              # work around them until they are fixed
 | 
					 | 
				
			||||||
              check_add_cflags -fno-strict-aliasing
 | 
					 | 
				
			||||||
          ;;
 | 
					 | 
				
			||||||
          *) check_add_cflags -Wunused-but-set-variable ;;
 | 
					 | 
				
			||||||
        esac
 | 
					 | 
				
			||||||
        enabled extra_warnings || check_add_cflags -Wno-unused-function
 | 
					 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if enabled icc; then
 | 
					    if enabled icc; then
 | 
				
			||||||
@@ -655,31 +523,16 @@ process_toolchain() {
 | 
				
			|||||||
    # ccache only really works on gcc toolchains
 | 
					    # ccache only really works on gcc toolchains
 | 
				
			||||||
    enabled gcc || soft_disable ccache
 | 
					    enabled gcc || soft_disable ccache
 | 
				
			||||||
    if enabled mips; then
 | 
					    if enabled mips; then
 | 
				
			||||||
        enable_feature dequant_tokens
 | 
					        enable dequant_tokens
 | 
				
			||||||
        enable_feature dc_recon
 | 
					        enable dc_recon
 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if enabled internal_stats; then
 | 
					 | 
				
			||||||
        enable_feature vp9_postproc
 | 
					 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Enable the postbuild target if building for visual studio.
 | 
					    # Enable the postbuild target if building for visual studio.
 | 
				
			||||||
    case "$tgt_cc" in
 | 
					    case "$tgt_cc" in
 | 
				
			||||||
        vs*) enable_feature msvs
 | 
					        vs*) enable msvs
 | 
				
			||||||
             enable_feature solution
 | 
					             enable solution
 | 
				
			||||||
             vs_version=${tgt_cc##vs}
 | 
					             vs_version=${tgt_cc##vs}
 | 
				
			||||||
             case $vs_version in
 | 
					 | 
				
			||||||
             [789])
 | 
					 | 
				
			||||||
                 VCPROJ_SFX=vcproj
 | 
					 | 
				
			||||||
                 gen_vcproj_cmd=${source_path}/build/make/gen_msvs_proj.sh
 | 
					 | 
				
			||||||
                 ;;
 | 
					 | 
				
			||||||
             10|11|12)
 | 
					 | 
				
			||||||
                 VCPROJ_SFX=vcxproj
 | 
					 | 
				
			||||||
                 gen_vcproj_cmd=${source_path}/build/make/gen_msvs_vcxproj.sh
 | 
					 | 
				
			||||||
                 ;;
 | 
					 | 
				
			||||||
             esac
 | 
					 | 
				
			||||||
             all_targets="${all_targets} solution"
 | 
					             all_targets="${all_targets} solution"
 | 
				
			||||||
             INLINE="__forceinline"
 | 
					 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
    esac
 | 
					    esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -689,33 +542,6 @@ process_toolchain() {
 | 
				
			|||||||
    if enabled postproc_visualizer; then
 | 
					    if enabled postproc_visualizer; then
 | 
				
			||||||
        enabled postproc || die "postproc_visualizer requires postproc to be enabled"
 | 
					        enabled postproc || die "postproc_visualizer requires postproc to be enabled"
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Enable unit tests by default if we have a working C++ compiler.
 | 
					 | 
				
			||||||
    case "$toolchain" in
 | 
					 | 
				
			||||||
        *-vs*)
 | 
					 | 
				
			||||||
            soft_enable unit_tests
 | 
					 | 
				
			||||||
        ;;
 | 
					 | 
				
			||||||
        *-android-*)
 | 
					 | 
				
			||||||
            # GTestLog must be modified to use Android logging utilities.
 | 
					 | 
				
			||||||
        ;;
 | 
					 | 
				
			||||||
        *-darwin-*)
 | 
					 | 
				
			||||||
            # iOS/ARM builds do not work with gtest. This does not match
 | 
					 | 
				
			||||||
            # x86 targets.
 | 
					 | 
				
			||||||
        ;;
 | 
					 | 
				
			||||||
        *-win*)
 | 
					 | 
				
			||||||
            # Some mingw toolchains don't have pthread available by default.
 | 
					 | 
				
			||||||
            # Treat these more like visual studio where threading in gtest
 | 
					 | 
				
			||||||
            # would be disabled for the same reason.
 | 
					 | 
				
			||||||
            check_cxx "$@" <<EOF && soft_enable unit_tests
 | 
					 | 
				
			||||||
int z;
 | 
					 | 
				
			||||||
EOF
 | 
					 | 
				
			||||||
        ;;
 | 
					 | 
				
			||||||
        *)
 | 
					 | 
				
			||||||
            enabled pthread_h && check_cxx "$@" <<EOF && soft_enable unit_tests
 | 
					 | 
				
			||||||
int z;
 | 
					 | 
				
			||||||
EOF
 | 
					 | 
				
			||||||
        ;;
 | 
					 | 
				
			||||||
    esac
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -724,8 +550,7 @@ EOF
 | 
				
			|||||||
##
 | 
					##
 | 
				
			||||||
CONFIGURE_ARGS="$@"
 | 
					CONFIGURE_ARGS="$@"
 | 
				
			||||||
process "$@"
 | 
					process "$@"
 | 
				
			||||||
print_webm_license ${BUILD_PFX}vpx_config.c "/*" " */"
 | 
					cat <<EOF > ${BUILD_PFX}vpx_config.c
 | 
				
			||||||
cat <<EOF >> ${BUILD_PFX}vpx_config.c
 | 
					 | 
				
			||||||
static const char* const cfg = "$CONFIGURE_ARGS";
 | 
					static const char* const cfg = "$CONFIGURE_ARGS";
 | 
				
			||||||
const char *vpx_codec_build_config(void) {return cfg;}
 | 
					const char *vpx_codec_build_config(void) {return cfg;}
 | 
				
			||||||
EOF
 | 
					EOF
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										6
									
								
								docs.mk
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								docs.mk
									
									
									
									
									
								
							@@ -21,6 +21,9 @@ CODEC_DOX :=    mainpage.dox \
 | 
				
			|||||||
		usage_dx.dox \
 | 
							usage_dx.dox \
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Other doxy files sourced in Markdown
 | 
					# Other doxy files sourced in Markdown
 | 
				
			||||||
 | 
					TXT_DOX-$(CONFIG_VP8)          += vp8_api1_migration.dox
 | 
				
			||||||
 | 
					vp8_api1_migration.dox.DESC     = VP8 API 1.x Migration
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TXT_DOX = $(call enabled,TXT_DOX)
 | 
					TXT_DOX = $(call enabled,TXT_DOX)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
%.dox: %.txt
 | 
					%.dox: %.txt
 | 
				
			||||||
@@ -31,8 +34,7 @@ TXT_DOX = $(call enabled,TXT_DOX)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
EXAMPLE_PATH += $(SRC_PATH_BARE) #for CHANGELOG, README, etc
 | 
					EXAMPLE_PATH += $(SRC_PATH_BARE) #for CHANGELOG, README, etc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
doxyfile: $(if $(findstring examples, $(ALL_TARGETS)),examples.doxy)
 | 
					doxyfile: libs.doxy_template libs.doxy examples.doxy
 | 
				
			||||||
doxyfile: libs.doxy_template libs.doxy
 | 
					 | 
				
			||||||
	@echo "    [CREATE] $@"
 | 
						@echo "    [CREATE] $@"
 | 
				
			||||||
	@cat $^ > $@
 | 
						@cat $^ > $@
 | 
				
			||||||
	@echo "STRIP_FROM_PATH += $(SRC_PATH_BARE) $(BUILD_ROOT)" >> $@
 | 
						@echo "STRIP_FROM_PATH += $(SRC_PATH_BARE) $(BUILD_ROOT)" >> $@
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										307
									
								
								example_xma.c
									
									
									
									
									
								
							
							
						
						
									
										307
									
								
								example_xma.c
									
									
									
									
									
								
							@@ -18,174 +18,197 @@
 | 
				
			|||||||
#include "vpx_config.h"
 | 
					#include "vpx_config.h"
 | 
				
			||||||
#include "vpx/vpx_decoder.h"
 | 
					#include "vpx/vpx_decoder.h"
 | 
				
			||||||
#include "vpx/vpx_integer.h"
 | 
					#include "vpx/vpx_integer.h"
 | 
				
			||||||
#if CONFIG_VP9_DECODER
 | 
					#if CONFIG_VP8_DECODER
 | 
				
			||||||
#include "vpx/vp8dx.h"
 | 
					#include "vpx/vp8dx.h"
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static char *exec_name;
 | 
					static char *exec_name;
 | 
				
			||||||
static int   verbose = 0;
 | 
					static int   verbose = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const struct {
 | 
					static const struct
 | 
				
			||||||
  const char *name;
 | 
					{
 | 
				
			||||||
  const vpx_codec_iface_t *iface;
 | 
					    const char *name;
 | 
				
			||||||
} ifaces[] = {
 | 
					    const vpx_codec_iface_t *iface;
 | 
				
			||||||
#if CONFIG_VP9_DECODER
 | 
					} ifaces[] =
 | 
				
			||||||
  {"vp9",  &vpx_codec_vp8_dx_algo},
 | 
					{
 | 
				
			||||||
 | 
					#if CONFIG_VP8_DECODER
 | 
				
			||||||
 | 
					    {"vp8",  &vpx_codec_vp8_dx_algo},
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void usage_exit(void) {
 | 
					static void usage_exit(void)
 | 
				
			||||||
  int i;
 | 
					{
 | 
				
			||||||
 | 
					    int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  printf("Usage: %s <options>\n\n"
 | 
					    printf("Usage: %s <options>\n\n"
 | 
				
			||||||
         "Options:\n"
 | 
					           "Options:\n"
 | 
				
			||||||
         "\t--codec <name>\tCodec to use (default=%s)\n"
 | 
					           "\t--codec <name>\tCodec to use (default=%s)\n"
 | 
				
			||||||
         "\t-h <height>\tHeight of the simulated video frame, in pixels\n"
 | 
					           "\t-h <height>\tHeight of the simulated video frame, in pixels\n"
 | 
				
			||||||
         "\t-w <width> \tWidth of the simulated video frame, in pixels\n"
 | 
					           "\t-w <width> \tWidth of the simulated video frame, in pixels\n"
 | 
				
			||||||
         "\t-v         \tVerbose mode (show individual segment sizes)\n"
 | 
					           "\t-v         \tVerbose mode (show individual segment sizes)\n"
 | 
				
			||||||
         "\t--help     \tShow this message\n"
 | 
					           "\t--help     \tShow this message\n"
 | 
				
			||||||
         "\n"
 | 
					           "\n"
 | 
				
			||||||
         "Included decoders:\n"
 | 
					           "Included decoders:\n"
 | 
				
			||||||
         "\n",
 | 
					           "\n",
 | 
				
			||||||
         exec_name,
 | 
					           exec_name,
 | 
				
			||||||
         ifaces[0].name);
 | 
					           ifaces[0].name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  for (i = 0; i < sizeof(ifaces) / sizeof(ifaces[0]); i++)
 | 
					    for (i = 0; i < sizeof(ifaces) / sizeof(ifaces[0]); i++)
 | 
				
			||||||
    printf("    %-6s - %s\n",
 | 
					        printf("    %-6s - %s\n",
 | 
				
			||||||
           ifaces[i].name,
 | 
					               ifaces[i].name,
 | 
				
			||||||
           vpx_codec_iface_name(ifaces[i].iface));
 | 
					               vpx_codec_iface_name(ifaces[i].iface));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  exit(EXIT_FAILURE);
 | 
					    exit(EXIT_FAILURE);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void usage_error(const char *fmt, ...) {
 | 
					static void usage_error(const char *fmt, ...)
 | 
				
			||||||
  va_list ap;
 | 
					{
 | 
				
			||||||
  va_start(ap, fmt);
 | 
					    va_list ap;
 | 
				
			||||||
  vprintf(fmt, ap);
 | 
					    va_start(ap, fmt);
 | 
				
			||||||
  printf("\n");
 | 
					    vprintf(fmt, ap);
 | 
				
			||||||
  usage_exit();
 | 
					    printf("\n");
 | 
				
			||||||
 | 
					    usage_exit();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void my_mem_dtor(vpx_codec_mmap_t *mmap) {
 | 
					void my_mem_dtor(vpx_codec_mmap_t *mmap)
 | 
				
			||||||
  if (verbose)
 | 
					{
 | 
				
			||||||
    printf("freeing segment %d\n", mmap->id);
 | 
					    if (verbose)
 | 
				
			||||||
 | 
					        printf("freeing segment %d\n", mmap->id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  free(mmap->priv);
 | 
					    free(mmap->priv);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int main(int argc, char **argv) {
 | 
					int main(int argc, char **argv)
 | 
				
			||||||
  vpx_codec_ctx_t           decoder;
 | 
					{
 | 
				
			||||||
  vpx_codec_iface_t        *iface = ifaces[0].iface;
 | 
					    vpx_codec_ctx_t           decoder;
 | 
				
			||||||
  vpx_codec_iter_t          iter;
 | 
					    vpx_codec_iface_t        *iface = ifaces[0].iface;
 | 
				
			||||||
  vpx_codec_dec_cfg_t       cfg;
 | 
					    vpx_codec_iter_t          iter;
 | 
				
			||||||
  vpx_codec_err_t           res = VPX_CODEC_OK;
 | 
					    vpx_codec_dec_cfg_t       cfg;
 | 
				
			||||||
  unsigned int            alloc_sz = 0;
 | 
					    vpx_codec_err_t           res = VPX_CODEC_OK;
 | 
				
			||||||
  unsigned int            w = 352;
 | 
					    unsigned int            alloc_sz = 0;
 | 
				
			||||||
  unsigned int            h = 288;
 | 
					    unsigned int            w = 352;
 | 
				
			||||||
  int                     i;
 | 
					    unsigned int            h = 288;
 | 
				
			||||||
 | 
					    int                     i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  exec_name = argv[0];
 | 
					    exec_name = argv[0];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  for (i = 1; i < argc; i++) {
 | 
					    for (i = 1; i < argc; i++)
 | 
				
			||||||
    if (!strcmp(argv[i], "--codec")) {
 | 
					    {
 | 
				
			||||||
      if (i + 1 < argc) {
 | 
					        if (!strcmp(argv[i], "--codec"))
 | 
				
			||||||
        int j, k = -1;
 | 
					        {
 | 
				
			||||||
 | 
					            if (i + 1 < argc)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                int j, k = -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        i++;
 | 
					                i++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for (j = 0; j < sizeof(ifaces) / sizeof(ifaces[0]); j++)
 | 
					                for (j = 0; j < sizeof(ifaces) / sizeof(ifaces[0]); j++)
 | 
				
			||||||
          if (!strcmp(ifaces[j].name, argv[i]))
 | 
					                    if (!strcmp(ifaces[j].name, argv[i]))
 | 
				
			||||||
            k = j;
 | 
					                        k = j;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (k >= 0)
 | 
					                if (k >= 0)
 | 
				
			||||||
          iface = ifaces[k].iface;
 | 
					                    iface = ifaces[k].iface;
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                    usage_error("Error: Unrecognized argument (%s) to --codec\n",
 | 
				
			||||||
 | 
					                                argv[i]);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					                usage_error("Error: Option --codec requires argument.\n");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else if (!strcmp(argv[i], "-v"))
 | 
				
			||||||
 | 
					            verbose = 1;
 | 
				
			||||||
 | 
					        else if (!strcmp(argv[i], "-h"))
 | 
				
			||||||
 | 
					            if (i + 1 < argc)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                h = atoi(argv[++i]);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					                usage_error("Error: Option -h requires argument.\n");
 | 
				
			||||||
 | 
					        else if (!strcmp(argv[i], "-w"))
 | 
				
			||||||
 | 
					            if (i + 1 < argc)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                w = atoi(argv[++i]);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					                usage_error("Error: Option -w requires argument.\n");
 | 
				
			||||||
 | 
					        else if (!strcmp(argv[i], "--help"))
 | 
				
			||||||
 | 
					            usage_exit();
 | 
				
			||||||
        else
 | 
					        else
 | 
				
			||||||
          usage_error("Error: Unrecognized argument (%s) to --codec\n",
 | 
					            usage_error("Error: Unrecognized option %s\n\n", argv[i]);
 | 
				
			||||||
                      argv[i]);
 | 
					 | 
				
			||||||
      } else
 | 
					 | 
				
			||||||
        usage_error("Error: Option --codec requires argument.\n");
 | 
					 | 
				
			||||||
    } else if (!strcmp(argv[i], "-v"))
 | 
					 | 
				
			||||||
      verbose = 1;
 | 
					 | 
				
			||||||
    else if (!strcmp(argv[i], "-h"))
 | 
					 | 
				
			||||||
      if (i + 1 < argc) {
 | 
					 | 
				
			||||||
        h = atoi(argv[++i]);
 | 
					 | 
				
			||||||
      } else
 | 
					 | 
				
			||||||
        usage_error("Error: Option -h requires argument.\n");
 | 
					 | 
				
			||||||
    else if (!strcmp(argv[i], "-w"))
 | 
					 | 
				
			||||||
      if (i + 1 < argc) {
 | 
					 | 
				
			||||||
        w = atoi(argv[++i]);
 | 
					 | 
				
			||||||
      } else
 | 
					 | 
				
			||||||
        usage_error("Error: Option -w requires argument.\n");
 | 
					 | 
				
			||||||
    else if (!strcmp(argv[i], "--help"))
 | 
					 | 
				
			||||||
      usage_exit();
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
      usage_error("Error: Unrecognized option %s\n\n", argv[i]);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (argc == 1)
 | 
					 | 
				
			||||||
    printf("Using built-in defaults. For options, rerun with --help\n\n");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /* XMA mode is not supported on all decoders! */
 | 
					 | 
				
			||||||
  if (!(vpx_codec_get_caps(iface) & VPX_CODEC_CAP_XMA)) {
 | 
					 | 
				
			||||||
    printf("%s does not support XMA mode!\n", vpx_codec_iface_name(iface));
 | 
					 | 
				
			||||||
    return EXIT_FAILURE;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /* The codec knows how much memory to allocate based on the size of the
 | 
					 | 
				
			||||||
   * encoded frames. This data can be parsed from the bitstream with
 | 
					 | 
				
			||||||
   * vpx_codec_peek_stream_info() if a bitstream is available. Otherwise,
 | 
					 | 
				
			||||||
   * a fixed size can be used that will be the upper limit on the frame
 | 
					 | 
				
			||||||
   * size the decoder can decode.
 | 
					 | 
				
			||||||
   */
 | 
					 | 
				
			||||||
  cfg.w = w;
 | 
					 | 
				
			||||||
  cfg.h = h;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /* Initialize the decoder in XMA mode. */
 | 
					 | 
				
			||||||
  if (vpx_codec_dec_init(&decoder, iface, &cfg, VPX_CODEC_USE_XMA)) {
 | 
					 | 
				
			||||||
    printf("Failed to initialize decoder in XMA mode: %s\n", vpx_codec_error(&decoder));
 | 
					 | 
				
			||||||
    return EXIT_FAILURE;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /* Iterate through the list of memory maps, allocating them with the
 | 
					 | 
				
			||||||
   * requested alignment.
 | 
					 | 
				
			||||||
   */
 | 
					 | 
				
			||||||
  iter = NULL;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  do {
 | 
					 | 
				
			||||||
    vpx_codec_mmap_t  mmap;
 | 
					 | 
				
			||||||
    unsigned int    align;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    res = vpx_codec_get_mem_map(&decoder, &mmap, &iter);
 | 
					 | 
				
			||||||
    align = mmap.align ? mmap.align - 1 : 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (!res) {
 | 
					 | 
				
			||||||
      if (verbose)
 | 
					 | 
				
			||||||
        printf("Allocating segment %u, size %lu, align %u %s\n",
 | 
					 | 
				
			||||||
               mmap.id, mmap.sz, mmap.align,
 | 
					 | 
				
			||||||
               mmap.flags & VPX_CODEC_MEM_ZERO ? "(ZEROED)" : "");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      if (mmap.flags & VPX_CODEC_MEM_ZERO)
 | 
					 | 
				
			||||||
        mmap.priv = calloc(1, mmap.sz + align);
 | 
					 | 
				
			||||||
      else
 | 
					 | 
				
			||||||
        mmap.priv = malloc(mmap.sz + align);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      mmap.base = (void *)((((uintptr_t)mmap.priv) + align) & ~(uintptr_t)align);
 | 
					 | 
				
			||||||
      mmap.dtor = my_mem_dtor;
 | 
					 | 
				
			||||||
      alloc_sz += mmap.sz + align;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      if (vpx_codec_set_mem_map(&decoder, &mmap, 1)) {
 | 
					 | 
				
			||||||
        printf("Failed to set mmap: %s\n", vpx_codec_error(&decoder));
 | 
					 | 
				
			||||||
        return EXIT_FAILURE;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    } else if (res != VPX_CODEC_LIST_END) {
 | 
					 | 
				
			||||||
      printf("Failed to get mmap: %s\n", vpx_codec_error(&decoder));
 | 
					 | 
				
			||||||
      return EXIT_FAILURE;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  } while (res != VPX_CODEC_LIST_END);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  printf("%s\n    %d bytes external memory required for %dx%d.\n",
 | 
					    if (argc == 1)
 | 
				
			||||||
         decoder.name, alloc_sz, cfg.w, cfg.h);
 | 
					        printf("Using built-in defaults. For options, rerun with --help\n\n");
 | 
				
			||||||
  vpx_codec_destroy(&decoder);
 | 
					
 | 
				
			||||||
  return EXIT_SUCCESS;
 | 
					    /* XMA mode is not supported on all decoders! */
 | 
				
			||||||
 | 
					    if (!(vpx_codec_get_caps(iface) & VPX_CODEC_CAP_XMA))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        printf("%s does not support XMA mode!\n", vpx_codec_iface_name(iface));
 | 
				
			||||||
 | 
					        return EXIT_FAILURE;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* The codec knows how much memory to allocate based on the size of the
 | 
				
			||||||
 | 
					     * encoded frames. This data can be parsed from the bitstream with
 | 
				
			||||||
 | 
					     * vpx_codec_peek_stream_info() if a bitstream is available. Otherwise,
 | 
				
			||||||
 | 
					     * a fixed size can be used that will be the upper limit on the frame
 | 
				
			||||||
 | 
					     * size the decoder can decode.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    cfg.w = w;
 | 
				
			||||||
 | 
					    cfg.h = h;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Initialize the decoder in XMA mode. */
 | 
				
			||||||
 | 
					    if (vpx_codec_dec_init(&decoder, iface, &cfg, VPX_CODEC_USE_XMA))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        printf("Failed to initialize decoder in XMA mode: %s\n", vpx_codec_error(&decoder));
 | 
				
			||||||
 | 
					        return EXIT_FAILURE;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Iterate through the list of memory maps, allocating them with the
 | 
				
			||||||
 | 
					     * requested alignment.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    iter = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    do
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        vpx_codec_mmap_t  mmap;
 | 
				
			||||||
 | 
					        unsigned int    align;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        res = vpx_codec_get_mem_map(&decoder, &mmap, &iter);
 | 
				
			||||||
 | 
					        align = mmap.align ? mmap.align - 1 : 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!res)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (verbose)
 | 
				
			||||||
 | 
					                printf("Allocating segment %u, size %lu, align %u %s\n",
 | 
				
			||||||
 | 
					                       mmap.id, mmap.sz, mmap.align,
 | 
				
			||||||
 | 
					                       mmap.flags & VPX_CODEC_MEM_ZERO ? "(ZEROED)" : "");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (mmap.flags & VPX_CODEC_MEM_ZERO)
 | 
				
			||||||
 | 
					                mmap.priv = calloc(1, mmap.sz + align);
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					                mmap.priv = malloc(mmap.sz + align);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            mmap.base = (void *)((((uintptr_t)mmap.priv) + align) & ~(uintptr_t)align);
 | 
				
			||||||
 | 
					            mmap.dtor = my_mem_dtor;
 | 
				
			||||||
 | 
					            alloc_sz += mmap.sz + align;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (vpx_codec_set_mem_map(&decoder, &mmap, 1))
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                printf("Failed to set mmap: %s\n", vpx_codec_error(&decoder));
 | 
				
			||||||
 | 
					                return EXIT_FAILURE;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else if (res != VPX_CODEC_LIST_END)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            printf("Failed to get mmap: %s\n", vpx_codec_error(&decoder));
 | 
				
			||||||
 | 
					            return EXIT_FAILURE;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    while (res != VPX_CODEC_LIST_END);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    printf("%s\n    %d bytes external memory required for %dx%d.\n",
 | 
				
			||||||
 | 
					           decoder.name, alloc_sz, cfg.w, cfg.h);
 | 
				
			||||||
 | 
					    vpx_codec_destroy(&decoder);
 | 
				
			||||||
 | 
					    return EXIT_SUCCESS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										106
									
								
								examples.mk
									
									
									
									
									
								
							
							
						
						
									
										106
									
								
								examples.mk
									
									
									
									
									
								
							@@ -8,12 +8,6 @@
 | 
				
			|||||||
##  be found in the AUTHORS file in the root of the source tree.
 | 
					##  be found in the AUTHORS file in the root of the source tree.
 | 
				
			||||||
##
 | 
					##
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LIBYUV_SRCS +=  third_party/libyuv/include/libyuv/basic_types.h  \
 | 
					 | 
				
			||||||
                third_party/libyuv/include/libyuv/cpu_id.h  \
 | 
					 | 
				
			||||||
                third_party/libyuv/include/libyuv/scale.h  \
 | 
					 | 
				
			||||||
                third_party/libyuv/source/row.h \
 | 
					 | 
				
			||||||
                third_party/libyuv/source/scale.c  \
 | 
					 | 
				
			||||||
                third_party/libyuv/source/cpu_id.c
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
# List of examples to build. UTILS are files that are taken from the source
 | 
					# List of examples to build. UTILS are files that are taken from the source
 | 
				
			||||||
# tree directly, and GEN_EXAMPLES are files that are created from the
 | 
					# tree directly, and GEN_EXAMPLES are files that are created from the
 | 
				
			||||||
@@ -22,7 +16,7 @@ UTILS-$(CONFIG_DECODERS)    += vpxdec.c
 | 
				
			|||||||
vpxdec.SRCS                 += md5_utils.c md5_utils.h
 | 
					vpxdec.SRCS                 += md5_utils.c md5_utils.h
 | 
				
			||||||
vpxdec.SRCS                 += vpx_ports/vpx_timer.h
 | 
					vpxdec.SRCS                 += vpx_ports/vpx_timer.h
 | 
				
			||||||
vpxdec.SRCS                 += vpx/vpx_integer.h
 | 
					vpxdec.SRCS                 += vpx/vpx_integer.h
 | 
				
			||||||
vpxdec.SRCS                 += args.c args.h
 | 
					vpxdec.SRCS                 += args.c args.h vpx_ports/config.h
 | 
				
			||||||
vpxdec.SRCS                 += tools_common.c tools_common.h
 | 
					vpxdec.SRCS                 += tools_common.c tools_common.h
 | 
				
			||||||
vpxdec.SRCS                 += nestegg/halloc/halloc.h
 | 
					vpxdec.SRCS                 += nestegg/halloc/halloc.h
 | 
				
			||||||
vpxdec.SRCS                 += nestegg/halloc/src/align.h
 | 
					vpxdec.SRCS                 += nestegg/halloc/src/align.h
 | 
				
			||||||
@@ -31,30 +25,18 @@ vpxdec.SRCS                 += nestegg/halloc/src/hlist.h
 | 
				
			|||||||
vpxdec.SRCS                 += nestegg/halloc/src/macros.h
 | 
					vpxdec.SRCS                 += nestegg/halloc/src/macros.h
 | 
				
			||||||
vpxdec.SRCS                 += nestegg/include/nestegg/nestegg.h
 | 
					vpxdec.SRCS                 += nestegg/include/nestegg/nestegg.h
 | 
				
			||||||
vpxdec.SRCS                 += nestegg/src/nestegg.c
 | 
					vpxdec.SRCS                 += nestegg/src/nestegg.c
 | 
				
			||||||
vpxdec.SRCS                 += $(LIBYUV_SRCS)
 | 
					 | 
				
			||||||
vpxdec.GUID                  = BA5FE66F-38DD-E034-F542-B1578C5FB950
 | 
					vpxdec.GUID                  = BA5FE66F-38DD-E034-F542-B1578C5FB950
 | 
				
			||||||
vpxdec.DESCRIPTION           = Full featured decoder
 | 
					vpxdec.DESCRIPTION           = Full featured decoder
 | 
				
			||||||
UTILS-$(CONFIG_ENCODERS)    += vpxenc.c
 | 
					UTILS-$(CONFIG_ENCODERS)    += vpxenc.c
 | 
				
			||||||
vpxenc.SRCS                 += args.c args.h y4minput.c y4minput.h
 | 
					vpxenc.SRCS                 += args.c args.h y4minput.c y4minput.h
 | 
				
			||||||
vpxenc.SRCS                 += tools_common.c tools_common.h
 | 
					vpxenc.SRCS                 += tools_common.c tools_common.h
 | 
				
			||||||
vpxenc.SRCS                 += webmenc.c webmenc.h
 | 
					vpxenc.SRCS                 += vpx_ports/config.h vpx_ports/mem_ops.h
 | 
				
			||||||
vpxenc.SRCS                 += vpx_ports/mem_ops.h
 | 
					 | 
				
			||||||
vpxenc.SRCS                 += vpx_ports/mem_ops_aligned.h
 | 
					vpxenc.SRCS                 += vpx_ports/mem_ops_aligned.h
 | 
				
			||||||
vpxenc.SRCS                 += vpx_ports/vpx_timer.h
 | 
					vpxenc.SRCS                 += libmkv/EbmlIDs.h
 | 
				
			||||||
vpxenc.SRCS                 += vpxstats.c vpxstats.h
 | 
					vpxenc.SRCS                 += libmkv/EbmlWriter.c
 | 
				
			||||||
vpxenc.SRCS                 += third_party/libmkv/EbmlIDs.h
 | 
					vpxenc.SRCS                 += libmkv/EbmlWriter.h
 | 
				
			||||||
vpxenc.SRCS                 += third_party/libmkv/EbmlWriter.c
 | 
					 | 
				
			||||||
vpxenc.SRCS                 += third_party/libmkv/EbmlWriter.h
 | 
					 | 
				
			||||||
vpxenc.SRCS                 += $(LIBYUV_SRCS)
 | 
					 | 
				
			||||||
vpxenc.GUID                  = 548DEC74-7A15-4B2B-AFC3-AA102E7C25C1
 | 
					vpxenc.GUID                  = 548DEC74-7A15-4B2B-AFC3-AA102E7C25C1
 | 
				
			||||||
vpxenc.DESCRIPTION           = Full featured encoder
 | 
					vpxenc.DESCRIPTION           = Full featured encoder
 | 
				
			||||||
UTILS-$(CONFIG_VP8_ENCODER)    += vp8_scalable_patterns.c
 | 
					 | 
				
			||||||
vp8_scalable_patterns.GUID   = 0D6A210B-F482-4D6F-8570-4A9C01ACC88C
 | 
					 | 
				
			||||||
vp8_scalable_patterns.DESCRIPTION = Temporal Scalability Encoder
 | 
					 | 
				
			||||||
UTILS-$(CONFIG_VP9_ENCODER)    += vp9_spatial_scalable_encoder.c
 | 
					 | 
				
			||||||
vp9_spatial_scalable_encoder.SRCS += args.c args.h
 | 
					 | 
				
			||||||
vp9_spatial_scalable_encoder.GUID   = 4A38598D-627D-4505-9C7B-D4020C84100D
 | 
					 | 
				
			||||||
vp9_spatial_scalable_encoder.DESCRIPTION = Spatial Scalable Encoder
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Clean up old ivfenc, ivfdec binaries.
 | 
					# Clean up old ivfenc, ivfdec binaries.
 | 
				
			||||||
ifeq ($(CONFIG_MSVS),yes)
 | 
					ifeq ($(CONFIG_MSVS),yes)
 | 
				
			||||||
@@ -70,40 +52,43 @@ endif
 | 
				
			|||||||
#example_xma.GUID             = A955FC4A-73F1-44F7-135E-30D84D32F022
 | 
					#example_xma.GUID             = A955FC4A-73F1-44F7-135E-30D84D32F022
 | 
				
			||||||
#example_xma.DESCRIPTION      = External Memory Allocation mode usage
 | 
					#example_xma.DESCRIPTION      = External Memory Allocation mode usage
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GEN_EXAMPLES-$(CONFIG_VP8_DECODER) += simple_decoder.c
 | 
					GEN_EXAMPLES-$(CONFIG_DECODERS) += simple_decoder.c
 | 
				
			||||||
simple_decoder.GUID              = D3BBF1E9-2427-450D-BBFF-B2843C1D44CC
 | 
					simple_decoder.GUID              = D3BBF1E9-2427-450D-BBFF-B2843C1D44CC
 | 
				
			||||||
simple_decoder.DESCRIPTION       = Simplified decoder loop
 | 
					simple_decoder.DESCRIPTION       = Simplified decoder loop
 | 
				
			||||||
GEN_EXAMPLES-$(CONFIG_VP8_DECODER) += postproc.c
 | 
					GEN_EXAMPLES-$(CONFIG_DECODERS) += postproc.c
 | 
				
			||||||
postproc.GUID                    = 65E33355-F35E-4088-884D-3FD4905881D7
 | 
					postproc.GUID                    = 65E33355-F35E-4088-884D-3FD4905881D7
 | 
				
			||||||
postproc.DESCRIPTION             = Decoder postprocessor control
 | 
					postproc.DESCRIPTION             = Decoder postprocessor control
 | 
				
			||||||
GEN_EXAMPLES-$(CONFIG_VP8_DECODER) += decode_to_md5.c
 | 
					GEN_EXAMPLES-$(CONFIG_DECODERS) += decode_to_md5.c
 | 
				
			||||||
decode_to_md5.SRCS              += md5_utils.h md5_utils.c
 | 
					decode_to_md5.SRCS              += md5_utils.h md5_utils.c
 | 
				
			||||||
decode_to_md5.GUID               = 59120B9B-2735-4BFE-B022-146CA340FE42
 | 
					decode_to_md5.GUID               = 59120B9B-2735-4BFE-B022-146CA340FE42
 | 
				
			||||||
decode_to_md5.DESCRIPTION        = Frame by frame MD5 checksum
 | 
					decode_to_md5.DESCRIPTION        = Frame by frame MD5 checksum
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GEN_EXAMPLES-$(CONFIG_VP8_ENCODER) += simple_encoder.c
 | 
					GEN_EXAMPLES-$(CONFIG_ENCODERS) += simple_encoder.c
 | 
				
			||||||
simple_encoder.GUID              = 4607D299-8A71-4D2C-9B1D-071899B6FBFD
 | 
					simple_encoder.GUID              = 4607D299-8A71-4D2C-9B1D-071899B6FBFD
 | 
				
			||||||
simple_encoder.DESCRIPTION       = Simplified encoder loop
 | 
					simple_encoder.DESCRIPTION       = Simplified encoder loop
 | 
				
			||||||
GEN_EXAMPLES-$(CONFIG_VP8_ENCODER) += twopass_encoder.c
 | 
					GEN_EXAMPLES-$(CONFIG_ENCODERS) += twopass_encoder.c
 | 
				
			||||||
twopass_encoder.GUID             = 73494FA6-4AF9-4763-8FBB-265C92402FD8
 | 
					twopass_encoder.GUID             = 73494FA6-4AF9-4763-8FBB-265C92402FD8
 | 
				
			||||||
twopass_encoder.DESCRIPTION      = Two-pass encoder loop
 | 
					twopass_encoder.DESCRIPTION      = Two-pass encoder loop
 | 
				
			||||||
GEN_EXAMPLES-$(CONFIG_VP8_ENCODER) += force_keyframe.c
 | 
					GEN_EXAMPLES-$(CONFIG_ENCODERS) += force_keyframe.c
 | 
				
			||||||
force_keyframe.GUID              = 3C67CADF-029F-4C86-81F5-D6D4F51177F0
 | 
					force_keyframe.GUID              = 3C67CADF-029F-4C86-81F5-D6D4F51177F0
 | 
				
			||||||
force_keyframe.DESCRIPTION       = Force generation of keyframes
 | 
					force_keyframe.DESCRIPTION       = Force generation of keyframes
 | 
				
			||||||
ifeq ($(CONFIG_DECODERS),yes)
 | 
					ifeq ($(CONFIG_DECODERS),yes)
 | 
				
			||||||
GEN_EXAMPLES-$(CONFIG_VP8_ENCODER) += decode_with_drops.c
 | 
					GEN_EXAMPLES-$(CONFIG_ENCODERS) += decode_with_drops.c
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
decode_with_drops.GUID           = CE5C53C4-8DDA-438A-86ED-0DDD3CDB8D26
 | 
					decode_with_drops.GUID           = CE5C53C4-8DDA-438A-86ED-0DDD3CDB8D26
 | 
				
			||||||
decode_with_drops.DESCRIPTION    = Drops frames while decoding
 | 
					decode_with_drops.DESCRIPTION    = Drops frames while decoding
 | 
				
			||||||
ifeq ($(CONFIG_VP8_DECODER),yes)
 | 
					ifeq ($(CONFIG_DECODERS),yes)
 | 
				
			||||||
GEN_EXAMPLES-$(CONFIG_ERROR_CONCEALMENT) += decode_with_partial_drops.c
 | 
					GEN_EXAMPLES-$(CONFIG_ENCODERS) += decode_packetdrop_eval.c
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
decode_with_partial_drops.GUID           = 61C2D026-5754-46AC-916F-1343ECC5537E
 | 
					decode_partial_with_drops.GUID           = CE5C53C4-8DDA-438A-86ED-0DDD3CDB8D28
 | 
				
			||||||
decode_with_partial_drops.DESCRIPTION    = Drops parts of frames while decoding
 | 
					decode_partial_with_drops.DESCRIPTION    = Drops parts of frames while decoding and evaluate quality
 | 
				
			||||||
GEN_EXAMPLES-$(CONFIG_VP8_ENCODER) += error_resilient.c
 | 
					GEN_EXAMPLES-$(CONFIG_ENCODERS) += error_resilient.c
 | 
				
			||||||
error_resilient.GUID             = DF5837B9-4145-4F92-A031-44E4F832E00C
 | 
					error_resilient.GUID             = DF5837B9-4145-4F92-A031-44E4F832E00C
 | 
				
			||||||
error_resilient.DESCRIPTION      = Error Resiliency Feature
 | 
					error_resilient.DESCRIPTION      = Error Resiliency Feature
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					GEN_EXAMPLES-$(CONFIG_VP8_ENCODER) += vp8_scalable_patterns.c
 | 
				
			||||||
 | 
					vp8_scalable_patterns.GUID          = 0D6A210B-F482-4D6F-8570-4A9C01ACC88C
 | 
				
			||||||
 | 
					vp8_scalable_patterns.DESCRIPTION   = VP8 Scalable Bitstream Patterns
 | 
				
			||||||
GEN_EXAMPLES-$(CONFIG_VP8_ENCODER) += vp8_set_maps.c
 | 
					GEN_EXAMPLES-$(CONFIG_VP8_ENCODER) += vp8_set_maps.c
 | 
				
			||||||
vp8_set_maps.GUID                   = ECB2D24D-98B8-4015-A465-A4AF3DCC145F
 | 
					vp8_set_maps.GUID                   = ECB2D24D-98B8-4015-A465-A4AF3DCC145F
 | 
				
			||||||
vp8_set_maps.DESCRIPTION            = VP8 set active and ROI maps
 | 
					vp8_set_maps.DESCRIPTION            = VP8 set active and ROI maps
 | 
				
			||||||
@@ -111,25 +96,10 @@ GEN_EXAMPLES-$(CONFIG_VP8_ENCODER) += vp8cx_set_ref.c
 | 
				
			|||||||
vp8cx_set_ref.GUID                  = C5E31F7F-96F6-48BD-BD3E-10EBF6E8057A
 | 
					vp8cx_set_ref.GUID                  = C5E31F7F-96F6-48BD-BD3E-10EBF6E8057A
 | 
				
			||||||
vp8cx_set_ref.DESCRIPTION           = VP8 set encoder reference frame
 | 
					vp8cx_set_ref.DESCRIPTION           = VP8 set encoder reference frame
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# C file is provided, not generated automatically.
 | 
					 | 
				
			||||||
UTILS-$(CONFIG_MULTI_RES_ENCODING) += vp8_multi_resolution_encoder.c
 | 
					 | 
				
			||||||
vp8_multi_resolution_encoder.SRCS         += $(LIBYUV_SRCS)
 | 
					 | 
				
			||||||
vp8_multi_resolution_encoder.GUID         = 04f8738e-63c8-423b-90fa-7c2703a374de
 | 
					 | 
				
			||||||
vp8_multi_resolution_encoder.DESCRIPTION  = VP8 Multiple-resolution Encoding
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Handle extra library flags depending on codec configuration
 | 
					# Handle extra library flags depending on codec configuration
 | 
				
			||||||
 | 
					 | 
				
			||||||
# We should not link to math library (libm) on RVCT
 | 
					 | 
				
			||||||
# when building for bare-metal targets
 | 
					 | 
				
			||||||
ifeq ($(CONFIG_OS_SUPPORT), yes)
 | 
					 | 
				
			||||||
CODEC_EXTRA_LIBS-$(CONFIG_VP8)         += m
 | 
					CODEC_EXTRA_LIBS-$(CONFIG_VP8)         += m
 | 
				
			||||||
CODEC_EXTRA_LIBS-$(CONFIG_VP9)         += m
 | 
					
 | 
				
			||||||
else
 | 
					 | 
				
			||||||
    ifeq ($(CONFIG_GCC), yes)
 | 
					 | 
				
			||||||
    CODEC_EXTRA_LIBS-$(CONFIG_VP8)         += m
 | 
					 | 
				
			||||||
    CODEC_EXTRA_LIBS-$(CONFIG_VP9)         += m
 | 
					 | 
				
			||||||
    endif
 | 
					 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# End of specified files. The rest of the build rules should happen
 | 
					# End of specified files. The rest of the build rules should happen
 | 
				
			||||||
# automagically from here.
 | 
					# automagically from here.
 | 
				
			||||||
@@ -146,13 +116,11 @@ else
 | 
				
			|||||||
    LIB_PATH-yes                     += $(if $(BUILD_PFX),$(BUILD_PFX),.)
 | 
					    LIB_PATH-yes                     += $(if $(BUILD_PFX),$(BUILD_PFX),.)
 | 
				
			||||||
    INC_PATH-$(CONFIG_VP8_DECODER)   += $(SRC_PATH_BARE)/vp8
 | 
					    INC_PATH-$(CONFIG_VP8_DECODER)   += $(SRC_PATH_BARE)/vp8
 | 
				
			||||||
    INC_PATH-$(CONFIG_VP8_ENCODER)   += $(SRC_PATH_BARE)/vp8
 | 
					    INC_PATH-$(CONFIG_VP8_ENCODER)   += $(SRC_PATH_BARE)/vp8
 | 
				
			||||||
    INC_PATH-$(CONFIG_VP9_DECODER)   += $(SRC_PATH_BARE)/vp9
 | 
					 | 
				
			||||||
    INC_PATH-$(CONFIG_VP9_ENCODER)   += $(SRC_PATH_BARE)/vp9
 | 
					 | 
				
			||||||
    LIB_PATH := $(call enabled,LIB_PATH)
 | 
					    LIB_PATH := $(call enabled,LIB_PATH)
 | 
				
			||||||
    INC_PATH := $(call enabled,INC_PATH)
 | 
					    INC_PATH := $(call enabled,INC_PATH)
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
INTERNAL_CFLAGS = $(addprefix -I,$(INC_PATH))
 | 
					CFLAGS += $(addprefix -I,$(INC_PATH))
 | 
				
			||||||
INTERNAL_LDFLAGS += $(addprefix -L,$(LIB_PATH))
 | 
					LDFLAGS += $(addprefix -L,$(LIB_PATH))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Expand list of selected examples to build (as specified above)
 | 
					# Expand list of selected examples to build (as specified above)
 | 
				
			||||||
@@ -181,23 +149,20 @@ $(eval $(if $(filter universal%,$(TOOLCHAIN)),LIPO_OBJS,BUILD_OBJS):=yes)
 | 
				
			|||||||
# Create build/install dependencies for all examples. The common case
 | 
					# Create build/install dependencies for all examples. The common case
 | 
				
			||||||
# is handled here. The MSVS case is handled below.
 | 
					# is handled here. The MSVS case is handled below.
 | 
				
			||||||
NOT_MSVS = $(if $(CONFIG_MSVS),,yes)
 | 
					NOT_MSVS = $(if $(CONFIG_MSVS),,yes)
 | 
				
			||||||
DIST-BINS-$(NOT_MSVS)      += $(addprefix bin/,$(ALL_EXAMPLES:.c=$(EXE_SFX)))
 | 
					DIST-BINS-$(NOT_MSVS)      += $(addprefix bin/,$(ALL_EXAMPLES:.c=))
 | 
				
			||||||
INSTALL-BINS-$(NOT_MSVS)   += $(addprefix bin/,$(UTILS:.c=$(EXE_SFX)))
 | 
					INSTALL-BINS-$(NOT_MSVS)   += $(addprefix bin/,$(UTILS:.c=))
 | 
				
			||||||
DIST-SRCS-yes              += $(ALL_SRCS)
 | 
					DIST-SRCS-yes              += $(ALL_SRCS)
 | 
				
			||||||
INSTALL-SRCS-yes           += $(UTIL_SRCS)
 | 
					INSTALL-SRCS-yes           += $(UTIL_SRCS)
 | 
				
			||||||
OBJS-$(NOT_MSVS)           += $(if $(BUILD_OBJS),$(call objs,$(ALL_SRCS)))
 | 
					OBJS-$(NOT_MSVS)           += $(if $(BUILD_OBJS),$(call objs,$(ALL_SRCS)))
 | 
				
			||||||
BINS-$(NOT_MSVS)           += $(addprefix $(BUILD_PFX),$(ALL_EXAMPLES:.c=$(EXE_SFX)))
 | 
					BINS-$(NOT_MSVS)           += $(addprefix $(BUILD_PFX),$(ALL_EXAMPLES:.c=))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Instantiate linker template for all examples.
 | 
					# Instantiate linker template for all examples.
 | 
				
			||||||
CODEC_LIB=$(if $(CONFIG_DEBUG_LIBS),vpx_g,vpx)
 | 
					CODEC_LIB=$(if $(CONFIG_DEBUG_LIBS),vpx_g,vpx)
 | 
				
			||||||
SHARED_LIB_SUF=$(if $(filter darwin%,$(TGT_OS)),.dylib,.so)
 | 
					 | 
				
			||||||
CODEC_LIB_SUF=$(if $(CONFIG_SHARED),$(SHARED_LIB_SUF),.a)
 | 
					 | 
				
			||||||
$(foreach bin,$(BINS-yes),\
 | 
					$(foreach bin,$(BINS-yes),\
 | 
				
			||||||
    $(if $(BUILD_OBJS),$(eval $(bin):\
 | 
					    $(if $(BUILD_OBJS),$(eval $(bin): $(LIB_PATH)/lib$(CODEC_LIB).a))\
 | 
				
			||||||
        $(LIB_PATH)/lib$(CODEC_LIB)$(CODEC_LIB_SUF)))\
 | 
					 | 
				
			||||||
    $(if $(BUILD_OBJS),$(eval $(call linker_template,$(bin),\
 | 
					    $(if $(BUILD_OBJS),$(eval $(call linker_template,$(bin),\
 | 
				
			||||||
        $(call objs,$($(notdir $(bin:$(EXE_SFX)=)).SRCS)) \
 | 
					        $(call objs,$($(notdir $(bin)).SRCS)) \
 | 
				
			||||||
        -l$(CODEC_LIB) $(addprefix -l,$(CODEC_EXTRA_LIBS))\
 | 
					        -l$(CODEC_LIB) $(addprefix -l,$(CODEC_EXTRA_LIBS))\
 | 
				
			||||||
        )))\
 | 
					        )))\
 | 
				
			||||||
    $(if $(LIPO_OBJS),$(eval $(call lipo_bin_template,$(bin))))\
 | 
					    $(if $(LIPO_OBJS),$(eval $(call lipo_bin_template,$(bin))))\
 | 
				
			||||||
@@ -222,7 +187,7 @@ INSTALL_MAPS += %         %
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# Set up additional MSVS environment
 | 
					# Set up additional MSVS environment
 | 
				
			||||||
ifeq ($(CONFIG_MSVS),yes)
 | 
					ifeq ($(CONFIG_MSVS),yes)
 | 
				
			||||||
CODEC_LIB=$(if $(CONFIG_SHARED),vpx,$(if $(CONFIG_STATIC_MSVCRT),vpxmt,vpxmd))
 | 
					CODEC_LIB=$(if $(CONFIG_STATIC_MSVCRT),vpxmt,vpxmd)
 | 
				
			||||||
# This variable uses deferred expansion intentionally, since the results of
 | 
					# This variable uses deferred expansion intentionally, since the results of
 | 
				
			||||||
# $(wildcard) may change during the course of the Make.
 | 
					# $(wildcard) may change during the course of the Make.
 | 
				
			||||||
VS_PLATFORMS = $(foreach d,$(wildcard */Release/$(CODEC_LIB).lib),$(word 1,$(subst /, ,$(d))))
 | 
					VS_PLATFORMS = $(foreach d,$(wildcard */Release/$(CODEC_LIB).lib),$(word 1,$(subst /, ,$(d))))
 | 
				
			||||||
@@ -237,19 +202,18 @@ endif
 | 
				
			|||||||
# even though there is no real dependency there (the dependency is on
 | 
					# even though there is no real dependency there (the dependency is on
 | 
				
			||||||
# the makefiles). We may want to revisit this.
 | 
					# the makefiles). We may want to revisit this.
 | 
				
			||||||
define vcproj_template
 | 
					define vcproj_template
 | 
				
			||||||
$(1): $($(1:.$(VCPROJ_SFX)=).SRCS) vpx.$(VCPROJ_SFX)
 | 
					$(1): $($(1:.vcproj=).SRCS)
 | 
				
			||||||
	@echo "    [vcproj] $$@"
 | 
						@echo "    [vcproj] $$@"
 | 
				
			||||||
	$$(GEN_VCPROJ)\
 | 
						$$(SRC_PATH_BARE)/build/make/gen_msvs_proj.sh\
 | 
				
			||||||
            --exe\
 | 
					            --exe\
 | 
				
			||||||
            --target=$$(TOOLCHAIN)\
 | 
					            --target=$$(TOOLCHAIN)\
 | 
				
			||||||
            --name=$$(@:.$(VCPROJ_SFX)=)\
 | 
					            --name=$$(@:.vcproj=)\
 | 
				
			||||||
            --ver=$$(CONFIG_VS_VERSION)\
 | 
					            --ver=$$(CONFIG_VS_VERSION)\
 | 
				
			||||||
            --proj-guid=$$($$(@:.$(VCPROJ_SFX)=).GUID)\
 | 
					            --proj-guid=$$($$(@:.vcproj=).GUID)\
 | 
				
			||||||
            $$(if $$(CONFIG_STATIC_MSVCRT),--static-crt) \
 | 
					            $$(if $$(CONFIG_STATIC_MSVCRT),--static-crt) \
 | 
				
			||||||
            --out=$$@ $$(INTERNAL_CFLAGS) $$(CFLAGS) \
 | 
					            --out=$$@ $$(CFLAGS) $$(LDFLAGS) -l$$(CODEC_LIB) -lwinmm $$^
 | 
				
			||||||
            $$(INTERNAL_LDFLAGS) $$(LDFLAGS) -l$$(CODEC_LIB) $$^
 | 
					 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
PROJECTS-$(CONFIG_MSVS) += $(ALL_EXAMPLES:.c=.$(VCPROJ_SFX))
 | 
					PROJECTS-$(CONFIG_MSVS) += $(ALL_EXAMPLES:.c=.vcproj)
 | 
				
			||||||
INSTALL-BINS-$(CONFIG_MSVS) += $(foreach p,$(VS_PLATFORMS),\
 | 
					INSTALL-BINS-$(CONFIG_MSVS) += $(foreach p,$(VS_PLATFORMS),\
 | 
				
			||||||
                               $(addprefix bin/$(p)/,$(ALL_EXAMPLES:.c=.exe)))
 | 
					                               $(addprefix bin/$(p)/,$(ALL_EXAMPLES:.c=.exe)))
 | 
				
			||||||
$(foreach proj,$(call enabled,PROJECTS),\
 | 
					$(foreach proj,$(call enabled,PROJECTS),\
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										415
									
								
								examples/decode_packetdrop_eval.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										415
									
								
								examples/decode_packetdrop_eval.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,415 @@
 | 
				
			|||||||
 | 
					@TEMPLATE decoder_tmpl.c
 | 
				
			||||||
 | 
					Decode With Drops Example
 | 
				
			||||||
 | 
					=========================
 | 
				
			||||||
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INTRODUCTION
 | 
				
			||||||
 | 
					This is an example utility which drops a series of frames, as specified
 | 
				
			||||||
 | 
					on the command line. This is useful for observing the error recovery
 | 
				
			||||||
 | 
					features of the codec.
 | 
				
			||||||
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INTRODUCTION
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ EXTRA_INCLUDES
 | 
				
			||||||
 | 
					#include <math.h>
 | 
				
			||||||
 | 
					#include <time.h>
 | 
				
			||||||
 | 
					#include "vpx_scale/yv12config.h"
 | 
				
			||||||
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ EXTRA_INCLUDES
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HELPERS
 | 
				
			||||||
 | 
					extern double vp8_calc_ssim
 | 
				
			||||||
 | 
					(
 | 
				
			||||||
 | 
					    YV12_BUFFER_CONFIG *source,
 | 
				
			||||||
 | 
					    YV12_BUFFER_CONFIG *dest,
 | 
				
			||||||
 | 
					    int lumamask,
 | 
				
			||||||
 | 
					    double *weight
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern double vp8_ssim
 | 
				
			||||||
 | 
					(
 | 
				
			||||||
 | 
					    const unsigned char *img1,
 | 
				
			||||||
 | 
					    const unsigned char *img2,
 | 
				
			||||||
 | 
					    int stride_img1,
 | 
				
			||||||
 | 
					    int stride_img2,
 | 
				
			||||||
 | 
					    int width,
 | 
				
			||||||
 | 
					    int height
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct detect_buffer {
 | 
				
			||||||
 | 
					    char buf[4];
 | 
				
			||||||
 | 
					    size_t buf_read;
 | 
				
			||||||
 | 
					    size_t position;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct parsed_header
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    char key_frame;
 | 
				
			||||||
 | 
					    int version;
 | 
				
			||||||
 | 
					    char show_frame;
 | 
				
			||||||
 | 
					    int first_part_size;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int next_packet(struct parsed_header* hdr, int pos, int length, int mtu)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int size = 0;
 | 
				
			||||||
 | 
					    int remaining = length - pos;
 | 
				
			||||||
 | 
					    /* Uncompressed part is 3 bytes for P frames and 10 bytes for I frames */
 | 
				
			||||||
 | 
					    int uncomp_part_size = (hdr->key_frame ? 10 : 3);
 | 
				
			||||||
 | 
					    /* number of bytes yet to send from header and the first partition */
 | 
				
			||||||
 | 
					    int remainFirst = uncomp_part_size + hdr->first_part_size - pos;
 | 
				
			||||||
 | 
					    if (remainFirst > 0)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (remainFirst <= mtu)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            size = remainFirst;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            size = mtu;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return size;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* second partition; just slot it up according to MTU */
 | 
				
			||||||
 | 
					    if (remaining <= mtu)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        size = remaining;
 | 
				
			||||||
 | 
					        return size;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return mtu;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void throw_packets(unsigned char* frame, int* size, int loss_rate, int* thrown, int* kept)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    unsigned char loss_frame[256*1024];
 | 
				
			||||||
 | 
					    int pkg_size = 1;
 | 
				
			||||||
 | 
					    int count = 0;
 | 
				
			||||||
 | 
					    int pos = 0;
 | 
				
			||||||
 | 
					    int loss_pos = 0;
 | 
				
			||||||
 | 
					    struct parsed_header hdr;
 | 
				
			||||||
 | 
					    unsigned int tmp;
 | 
				
			||||||
 | 
					    int mtu = 100;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (*size < 3)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    putc('|', stdout);
 | 
				
			||||||
 | 
					    /* parse uncompressed 3 bytes */
 | 
				
			||||||
 | 
					    tmp = (frame[2] << 16) | (frame[1] << 8) | frame[0];
 | 
				
			||||||
 | 
					    hdr.key_frame = !(tmp & 0x1); /* inverse logic */
 | 
				
			||||||
 | 
					    hdr.version = (tmp >> 1) & 0x7;
 | 
				
			||||||
 | 
					    hdr.show_frame = (tmp >> 4) & 0x1;
 | 
				
			||||||
 | 
					    hdr.first_part_size = (tmp >> 5) & 0x7FFFF;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* don't drop key frames */
 | 
				
			||||||
 | 
					    if (hdr.key_frame)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        int i;
 | 
				
			||||||
 | 
					        *kept = *size/mtu + ((*size % mtu > 0) ? 1 : 0); /* approximate */
 | 
				
			||||||
 | 
					        for (i=0; i < *kept; i++)
 | 
				
			||||||
 | 
					            putc('.', stdout);
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    while ((pkg_size = next_packet(&hdr, pos, *size, mtu)) > 0)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        int loss_event = ((rand() + 1.0)/(RAND_MAX + 1.0) < loss_rate/100.0);
 | 
				
			||||||
 | 
					        if (*thrown == 0 && !loss_event)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            memcpy(loss_frame + loss_pos, frame + pos, pkg_size);
 | 
				
			||||||
 | 
					            loss_pos += pkg_size;
 | 
				
			||||||
 | 
					            (*kept)++;
 | 
				
			||||||
 | 
					            putc('.', stdout);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            (*thrown)++;
 | 
				
			||||||
 | 
					            putc('X', stdout);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        pos += pkg_size;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    memcpy(frame, loss_frame, loss_pos);
 | 
				
			||||||
 | 
					    memset(frame + loss_pos, 0, *size - loss_pos);
 | 
				
			||||||
 | 
					    *size = loss_pos;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					double ssim_yuv(unsigned char *ptr_ref, 
 | 
				
			||||||
 | 
					                unsigned char *ptr_deg,
 | 
				
			||||||
 | 
					                int w,
 | 
				
			||||||
 | 
					                int h,
 | 
				
			||||||
 | 
					                double *weight) 
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /* insert ref and deg into YV12_BUFFER_CONFIG structs
 | 
				
			||||||
 | 
					     * and calculate SSIM for this frame
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    YV12_BUFFER_CONFIG ref, deg;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    ref.y_width = w;
 | 
				
			||||||
 | 
					    ref.y_height = h;
 | 
				
			||||||
 | 
					    ref.y_stride = w;
 | 
				
			||||||
 | 
					    ref.uv_width = w/2;
 | 
				
			||||||
 | 
					    ref.uv_height = h/2;
 | 
				
			||||||
 | 
					    ref.uv_stride = w/2;
 | 
				
			||||||
 | 
					    ref.y_buffer = ptr_ref;
 | 
				
			||||||
 | 
					    ref.u_buffer = ptr_ref + w*h;
 | 
				
			||||||
 | 
					    ref.v_buffer = ptr_ref + w*h + (w*h)/4;
 | 
				
			||||||
 | 
					    /* do not need the rest of the struct parameters; leave them as is */
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    deg.y_width = w;
 | 
				
			||||||
 | 
					    deg.y_height = h;
 | 
				
			||||||
 | 
					    deg.y_stride = w;
 | 
				
			||||||
 | 
					    deg.uv_width = w/2;
 | 
				
			||||||
 | 
					    deg.uv_height = h/2;
 | 
				
			||||||
 | 
					    deg.uv_stride = w/2;
 | 
				
			||||||
 | 
					    deg.y_buffer = ptr_deg;
 | 
				
			||||||
 | 
					    deg.u_buffer = ptr_deg + w*h;
 | 
				
			||||||
 | 
					    deg.v_buffer = ptr_deg + w*h + (w*h)/4;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    return vp8_calc_ssim(&ref, °, 1, weight);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void write_and_eval_frame(unsigned char *img_buf,
 | 
				
			||||||
 | 
					                         int w,
 | 
				
			||||||
 | 
					                         int h,
 | 
				
			||||||
 | 
					                         FILE *outfile,
 | 
				
			||||||
 | 
					                         FILE *reffile,
 | 
				
			||||||
 | 
					                         double *sum_ssim,
 | 
				
			||||||
 | 
					                         double *sum_weight)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /* write frame in img to output file and calculate SSIM */
 | 
				
			||||||
 | 
					    int img_sz = (w*h*3)/2;
 | 
				
			||||||
 | 
					    unsigned char *ref_buf = NULL;
 | 
				
			||||||
 | 
					    double temp_ssim;
 | 
				
			||||||
 | 
					    double weight = 0.0;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    if(!img_buf || !outfile || !reffile) 
 | 
				
			||||||
 | 
					        die("Failure in write_and_eval_frame");
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    if(fwrite(img_buf, 1, img_sz, outfile) != img_sz)
 | 
				
			||||||
 | 
					        die("Could not write to file");
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    /* Read next frame from reference file */
 | 
				
			||||||
 | 
					    ref_buf = (unsigned char *) malloc(img_sz);
 | 
				
			||||||
 | 
					    if(!ref_buf)
 | 
				
			||||||
 | 
					        die("Error allocating memory");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if(fread(ref_buf, 1, img_sz, reffile) != img_sz)
 | 
				
			||||||
 | 
					        die("Failed to read complete reference frame");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Calculate SSIM */
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    temp_ssim = ssim_yuv(ref_buf, img_buf, 
 | 
				
			||||||
 | 
					                         w, h, &weight);
 | 
				
			||||||
 | 
					    *sum_ssim += temp_ssim * weight;
 | 
				
			||||||
 | 
					    *sum_weight += weight;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    free(ref_buf);    
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HELPERS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Usage
 | 
				
			||||||
 | 
					-----
 | 
				
			||||||
 | 
					This example adds a single argument to the `simple_decoder` example,
 | 
				
			||||||
 | 
					which specifies the range or pattern of frames to drop. The parameter is
 | 
				
			||||||
 | 
					parsed as follows:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ USAGE
 | 
				
			||||||
 | 
					if(argc!=5 && argc != 6)
 | 
				
			||||||
 | 
					    die("Usage: %s <infile> <outfile> <reffile> <N-M|N/M|L,S>\n", 
 | 
				
			||||||
 | 
					        argv[0]);
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    char *nptr;
 | 
				
			||||||
 | 
					    n = strtol(argv[4], &nptr, 0);
 | 
				
			||||||
 | 
					    mode = (*nptr == '\0' || *nptr == ',') ? 2 : (*nptr == '-') ? 1 : 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    m = strtol(nptr+1, NULL, 0);
 | 
				
			||||||
 | 
					    if((!n && !m) || (*nptr != '-' && *nptr != '/' &&
 | 
				
			||||||
 | 
					        *nptr != '\0' && *nptr != ','))
 | 
				
			||||||
 | 
					        die("Couldn't parse pattern %s\n", argv[4]);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					seed = (m > 0) ? m : (unsigned int)time(NULL);
 | 
				
			||||||
 | 
					srand(seed);thrown_frame = 0;
 | 
				
			||||||
 | 
					printf("Seed: %u\n", seed);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if(!(reffile = fopen(argv[3], "rb")))
 | 
				
			||||||
 | 
					    die("Failed to open %s for reading", argv[3]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ USAGE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Dropping A Range Of Frames
 | 
				
			||||||
 | 
					--------------------------
 | 
				
			||||||
 | 
					To drop a range of frames, specify the starting frame and the ending
 | 
				
			||||||
 | 
					frame to drop, separated by a dash. The following command will drop
 | 
				
			||||||
 | 
					frames 5 through 10 (base 1).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  $ ./decode_with_drops in.ivf out.i420 5-10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Dropping A Pattern Of Frames
 | 
				
			||||||
 | 
					----------------------------
 | 
				
			||||||
 | 
					To drop a pattern of frames, specify the number of frames to drop and
 | 
				
			||||||
 | 
					the number of frames after which to repeat the pattern, separated by
 | 
				
			||||||
 | 
					a forward-slash. The following command will drop 3 of 7 frames.
 | 
				
			||||||
 | 
					Specifically, it will decode 4 frames, then drop 3 frames, and then
 | 
				
			||||||
 | 
					repeat.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  $ ./decode_with_drops in.ivf out.i420 3/7
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Extra Variables
 | 
				
			||||||
 | 
					---------------
 | 
				
			||||||
 | 
					This example maintains the pattern passed on the command line in the
 | 
				
			||||||
 | 
					`n`, `m`, and `is_range` variables:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ EXTRA_VARS
 | 
				
			||||||
 | 
					int              n, m, mode;                                        //
 | 
				
			||||||
 | 
					unsigned int     seed;
 | 
				
			||||||
 | 
					int              thrown=0, kept=0;
 | 
				
			||||||
 | 
					int              thrown_frame=0, kept_frame=0;
 | 
				
			||||||
 | 
					unsigned char   *last_yuv_buf = NULL;
 | 
				
			||||||
 | 
					int              last_sz = 0;
 | 
				
			||||||
 | 
					int              last_alloc_sz = 0;
 | 
				
			||||||
 | 
					unsigned char   *temp_last = NULL;
 | 
				
			||||||
 | 
					int              expected_decode = 1;
 | 
				
			||||||
 | 
					FILE            *reffile, *sttfile;
 | 
				
			||||||
 | 
					unsigned char   *ref_yuv_buf = NULL;
 | 
				
			||||||
 | 
					int              ref_sz = 0;
 | 
				
			||||||
 | 
					int              ref_alloc_sz = 0;
 | 
				
			||||||
 | 
					double           sum_ssim = 0.0, sum_weight = 0.0;
 | 
				
			||||||
 | 
					double           total_ssim;
 | 
				
			||||||
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ EXTRA_VARS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Making The Drop Decision
 | 
				
			||||||
 | 
					------------------------
 | 
				
			||||||
 | 
					The example decides whether to drop the frame based on the current
 | 
				
			||||||
 | 
					frame number, immediately before decoding the frame.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PRE_DECODE
 | 
				
			||||||
 | 
					/* Decide whether to throw parts of the frame or the whole frame
 | 
				
			||||||
 | 
					   depending on the drop mode */
 | 
				
			||||||
 | 
					thrown_frame = 0;
 | 
				
			||||||
 | 
					kept_frame = 0;
 | 
				
			||||||
 | 
					switch (mode)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					case 0:
 | 
				
			||||||
 | 
					    if (m - (frame_cnt-1)%m <= n)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        frame_sz = 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    break;
 | 
				
			||||||
 | 
					case 1:
 | 
				
			||||||
 | 
					    if (frame_cnt >= n && frame_cnt <= m)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        frame_sz = 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    break;
 | 
				
			||||||
 | 
					case 2:
 | 
				
			||||||
 | 
					    throw_packets(frame, &frame_sz, n, &thrown_frame, &kept_frame);
 | 
				
			||||||
 | 
					    break;
 | 
				
			||||||
 | 
					default: break;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					if (mode < 2)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (frame_sz == 0)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        putc('X', stdout);
 | 
				
			||||||
 | 
					        thrown_frame++;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        putc('.', stdout);
 | 
				
			||||||
 | 
					        kept_frame++;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					thrown += thrown_frame;
 | 
				
			||||||
 | 
					kept += kept_frame;
 | 
				
			||||||
 | 
					fflush(stdout);
 | 
				
			||||||
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PRE_DECODE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DECODE
 | 
				
			||||||
 | 
					/* Decode the frame, use frame_cnt as user-specific data */
 | 
				
			||||||
 | 
					if(vpx_codec_decode(&codec, frame, frame_sz, NULL /*(void *) frame_cnt*/, 0))
 | 
				
			||||||
 | 
					    die_codec(&codec, "Failed to decode frame");
 | 
				
			||||||
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DECODE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ GET_FRAME
 | 
				
			||||||
 | 
					while((img = vpx_codec_get_frame(&codec, &iter))) {
 | 
				
			||||||
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ GET_FRAME
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PROCESS_DX
 | 
				
			||||||
 | 
					/* Check if we are missing frames */
 | 
				
			||||||
 | 
					while(/*((int) img->user_priv)*/ frame_cnt > expected_decode) {
 | 
				
			||||||
 | 
					    write_and_eval_frame(last_yuv_buf,
 | 
				
			||||||
 | 
					                         img->d_w,
 | 
				
			||||||
 | 
					                         img->d_h,
 | 
				
			||||||
 | 
					                         outfile,
 | 
				
			||||||
 | 
					                         reffile,
 | 
				
			||||||
 | 
					                         &sum_ssim,
 | 
				
			||||||
 | 
					                         &sum_weight);
 | 
				
			||||||
 | 
					                         
 | 
				
			||||||
 | 
					    expected_decode++;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					expected_decode++; 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Check size of last_yuv_buf */
 | 
				
			||||||
 | 
					if(last_alloc_sz < (img->d_w * img->d_h * 3) / 2) {
 | 
				
			||||||
 | 
					    /* Re-allocate */
 | 
				
			||||||
 | 
					    if(last_yuv_buf) {
 | 
				
			||||||
 | 
					        free(last_yuv_buf);
 | 
				
			||||||
 | 
					        last_yuv_buf = NULL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    last_alloc_sz = (img->d_w * img->d_h * 3) / 2;
 | 
				
			||||||
 | 
					    last_yuv_buf = (unsigned char *) malloc(last_alloc_sz);
 | 
				
			||||||
 | 
					    last_sz = 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* First, write new frame to last_yuv_buf */
 | 
				
			||||||
 | 
					temp_last = last_yuv_buf;
 | 
				
			||||||
 | 
					last_sz = 0;
 | 
				
			||||||
 | 
					for(plane=0; plane < 3; plane++) {
 | 
				
			||||||
 | 
					    unsigned char *buf =img->planes[plane];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for(y=0; y<img->d_h >> (plane?1:0); y++) {
 | 
				
			||||||
 | 
					        memcpy(temp_last, buf, img->d_w >> (plane?1:0));
 | 
				
			||||||
 | 
					        temp_last += img->d_w >> (plane?1:0);
 | 
				
			||||||
 | 
					        last_sz += img->d_w >> (plane?1:0);
 | 
				
			||||||
 | 
					        buf += img->stride[plane];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Then, write it to file and calculate SSIM*/
 | 
				
			||||||
 | 
					write_and_eval_frame(last_yuv_buf,
 | 
				
			||||||
 | 
					                     img->d_w,
 | 
				
			||||||
 | 
					                     img->d_h,
 | 
				
			||||||
 | 
					                     outfile,
 | 
				
			||||||
 | 
					                     reffile,
 | 
				
			||||||
 | 
					                     &sum_ssim,
 | 
				
			||||||
 | 
					                     &sum_weight);
 | 
				
			||||||
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PROCESS_DX
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DESTROY
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					total_ssim = sum_ssim / sum_weight;
 | 
				
			||||||
 | 
					printf("SSIM = %f\n", total_ssim);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if(!(sttfile = fopen("loss.stt", "at")))
 | 
				
			||||||
 | 
					    die("Failed to open loss.stt for writing");
 | 
				
			||||||
 | 
					fprintf(sttfile, "lossparam \tSSIM\n");
 | 
				
			||||||
 | 
					fprintf(sttfile, "%s\t%f\n", argv[4], total_ssim);
 | 
				
			||||||
 | 
					fclose(sttfile);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if(last_yuv_buf)
 | 
				
			||||||
 | 
					    free(last_yuv_buf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if(vpx_codec_destroy(&codec))
 | 
				
			||||||
 | 
					    die_codec(&codec, "Failed to destroy codec");
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					fclose(reffile);
 | 
				
			||||||
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DESTROY
 | 
				
			||||||
@@ -34,8 +34,8 @@ MD5Init(&md5);
 | 
				
			|||||||
for(plane=0; plane < 3; plane++) {
 | 
					for(plane=0; plane < 3; plane++) {
 | 
				
			||||||
    unsigned char *buf =img->planes[plane];
 | 
					    unsigned char *buf =img->planes[plane];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for(y=0; y < (plane ? (img->d_h + 1) >> 1 : img->d_h); y++) {
 | 
					    for(y=0; y<img->d_h >> (plane?1:0); y++) {
 | 
				
			||||||
        MD5Update(&md5, buf, (plane ? (img->d_w + 1) >> 1 : img->d_w));
 | 
					        MD5Update(&md5, buf, img->d_w >> (plane?1:0));
 | 
				
			||||||
        buf += img->stride[plane];
 | 
					        buf += img->stride[plane];
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,238 +0,0 @@
 | 
				
			|||||||
@TEMPLATE decoder_tmpl.c
 | 
					 | 
				
			||||||
Decode With Partial Drops Example
 | 
					 | 
				
			||||||
=========================
 | 
					 | 
				
			||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INTRODUCTION
 | 
					 | 
				
			||||||
This is an example utility which drops a series of frames (or parts of frames),
 | 
					 | 
				
			||||||
as specified on the command line. This is useful for observing the error
 | 
					 | 
				
			||||||
recovery features of the codec.
 | 
					 | 
				
			||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INTRODUCTION
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ EXTRA_INCLUDES
 | 
					 | 
				
			||||||
#include <time.h>
 | 
					 | 
				
			||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ EXTRA_INCLUDES
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HELPERS
 | 
					 | 
				
			||||||
struct parsed_header
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    char key_frame;
 | 
					 | 
				
			||||||
    int version;
 | 
					 | 
				
			||||||
    char show_frame;
 | 
					 | 
				
			||||||
    int first_part_size;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int next_packet(struct parsed_header* hdr, int pos, int length, int mtu)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    int size = 0;
 | 
					 | 
				
			||||||
    int remaining = length - pos;
 | 
					 | 
				
			||||||
    /* Uncompressed part is 3 bytes for P frames and 10 bytes for I frames */
 | 
					 | 
				
			||||||
    int uncomp_part_size = (hdr->key_frame ? 10 : 3);
 | 
					 | 
				
			||||||
    /* number of bytes yet to send from header and the first partition */
 | 
					 | 
				
			||||||
    int remainFirst = uncomp_part_size + hdr->first_part_size - pos;
 | 
					 | 
				
			||||||
    if (remainFirst > 0)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        if (remainFirst <= mtu)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            size = remainFirst;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            size = mtu;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        return size;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* second partition; just slot it up according to MTU */
 | 
					 | 
				
			||||||
    if (remaining <= mtu)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        size = remaining;
 | 
					 | 
				
			||||||
        return size;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return mtu;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void throw_packets(unsigned char* frame, int* size, int loss_rate,
 | 
					 | 
				
			||||||
                   int* thrown, int* kept)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    unsigned char loss_frame[256*1024];
 | 
					 | 
				
			||||||
    int pkg_size = 1;
 | 
					 | 
				
			||||||
    int pos = 0;
 | 
					 | 
				
			||||||
    int loss_pos = 0;
 | 
					 | 
				
			||||||
    struct parsed_header hdr;
 | 
					 | 
				
			||||||
    unsigned int tmp;
 | 
					 | 
				
			||||||
    int mtu = 1500;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (*size < 3)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    putc('|', stdout);
 | 
					 | 
				
			||||||
    /* parse uncompressed 3 bytes */
 | 
					 | 
				
			||||||
    tmp = (frame[2] << 16) | (frame[1] << 8) | frame[0];
 | 
					 | 
				
			||||||
    hdr.key_frame = !(tmp & 0x1); /* inverse logic */
 | 
					 | 
				
			||||||
    hdr.version = (tmp >> 1) & 0x7;
 | 
					 | 
				
			||||||
    hdr.show_frame = (tmp >> 4) & 0x1;
 | 
					 | 
				
			||||||
    hdr.first_part_size = (tmp >> 5) & 0x7FFFF;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* don't drop key frames */
 | 
					 | 
				
			||||||
    if (hdr.key_frame)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        int i;
 | 
					 | 
				
			||||||
        *kept = *size/mtu + ((*size % mtu > 0) ? 1 : 0); /* approximate */
 | 
					 | 
				
			||||||
        for (i=0; i < *kept; i++)
 | 
					 | 
				
			||||||
            putc('.', stdout);
 | 
					 | 
				
			||||||
        return;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    while ((pkg_size = next_packet(&hdr, pos, *size, mtu)) > 0)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        int loss_event = ((rand() + 1.0)/(RAND_MAX + 1.0) < loss_rate/100.0);
 | 
					 | 
				
			||||||
        if (*thrown == 0 && !loss_event)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            memcpy(loss_frame + loss_pos, frame + pos, pkg_size);
 | 
					 | 
				
			||||||
            loss_pos += pkg_size;
 | 
					 | 
				
			||||||
            (*kept)++;
 | 
					 | 
				
			||||||
            putc('.', stdout);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            (*thrown)++;
 | 
					 | 
				
			||||||
            putc('X', stdout);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        pos += pkg_size;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    memcpy(frame, loss_frame, loss_pos);
 | 
					 | 
				
			||||||
    memset(frame + loss_pos, 0, *size - loss_pos);
 | 
					 | 
				
			||||||
    *size = loss_pos;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HELPERS
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DEC_INIT
 | 
					 | 
				
			||||||
/* Initialize codec */
 | 
					 | 
				
			||||||
flags = VPX_CODEC_USE_ERROR_CONCEALMENT;
 | 
					 | 
				
			||||||
res = vpx_codec_dec_init(&codec, interface, &dec_cfg, flags);
 | 
					 | 
				
			||||||
if(res)
 | 
					 | 
				
			||||||
    die_codec(&codec, "Failed to initialize decoder");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DEC_INIT
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Usage
 | 
					 | 
				
			||||||
-----
 | 
					 | 
				
			||||||
This example adds a single argument to the `simple_decoder` example,
 | 
					 | 
				
			||||||
which specifies the range or pattern of frames to drop. The parameter is
 | 
					 | 
				
			||||||
parsed as follows:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ USAGE
 | 
					 | 
				
			||||||
if(argc < 4 || argc > 6)
 | 
					 | 
				
			||||||
    die("Usage: %s <infile> <outfile> [-t <num threads>] <N-M|N/M|L,S>\n",
 | 
					 | 
				
			||||||
        argv[0]);
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    char *nptr;
 | 
					 | 
				
			||||||
    int arg_num = 3;
 | 
					 | 
				
			||||||
    if (argc == 6 && strncmp(argv[arg_num++], "-t", 2) == 0)
 | 
					 | 
				
			||||||
        dec_cfg.threads = strtol(argv[arg_num++], NULL, 0);
 | 
					 | 
				
			||||||
    n = strtol(argv[arg_num], &nptr, 0);
 | 
					 | 
				
			||||||
    mode = (*nptr == '\0' || *nptr == ',') ? 2 : (*nptr == '-') ? 1 : 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    m = strtol(nptr+1, NULL, 0);
 | 
					 | 
				
			||||||
    if((!n && !m) || (*nptr != '-' && *nptr != '/' &&
 | 
					 | 
				
			||||||
        *nptr != '\0' && *nptr != ','))
 | 
					 | 
				
			||||||
        die("Couldn't parse pattern %s\n", argv[3]);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
seed = (m > 0) ? m : (unsigned int)time(NULL);
 | 
					 | 
				
			||||||
srand(seed);thrown_frame = 0;
 | 
					 | 
				
			||||||
printf("Seed: %u\n", seed);
 | 
					 | 
				
			||||||
printf("Threads: %d\n", dec_cfg.threads);
 | 
					 | 
				
			||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ USAGE
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Dropping A Range Of Frames
 | 
					 | 
				
			||||||
--------------------------
 | 
					 | 
				
			||||||
To drop a range of frames, specify the starting frame and the ending
 | 
					 | 
				
			||||||
frame to drop, separated by a dash. The following command will drop
 | 
					 | 
				
			||||||
frames 5 through 10 (base 1).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  $ ./decode_with_partial_drops in.ivf out.i420 5-10
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Dropping A Pattern Of Frames
 | 
					 | 
				
			||||||
----------------------------
 | 
					 | 
				
			||||||
To drop a pattern of frames, specify the number of frames to drop and
 | 
					 | 
				
			||||||
the number of frames after which to repeat the pattern, separated by
 | 
					 | 
				
			||||||
a forward-slash. The following command will drop 3 of 7 frames.
 | 
					 | 
				
			||||||
Specifically, it will decode 4 frames, then drop 3 frames, and then
 | 
					 | 
				
			||||||
repeat.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  $ ./decode_with_partial_drops in.ivf out.i420 3/7
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Dropping Random Parts Of Frames
 | 
					 | 
				
			||||||
-------------------------------
 | 
					 | 
				
			||||||
A third argument tuple is available to split the frame into 1500 bytes pieces
 | 
					 | 
				
			||||||
and randomly drop pieces rather than frames. The frame will be split at
 | 
					 | 
				
			||||||
partition boundaries where possible. The following example will seed the RNG
 | 
					 | 
				
			||||||
with the seed 123 and drop approximately 5% of the pieces. Pieces which
 | 
					 | 
				
			||||||
are depending on an already dropped piece will also be dropped.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  $ ./decode_with_partial_drops in.ivf out.i420 5,123
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Extra Variables
 | 
					 | 
				
			||||||
---------------
 | 
					 | 
				
			||||||
This example maintains the pattern passed on the command line in the
 | 
					 | 
				
			||||||
`n`, `m`, and `is_range` variables:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ EXTRA_VARS
 | 
					 | 
				
			||||||
int              n, m, mode;
 | 
					 | 
				
			||||||
unsigned int     seed;
 | 
					 | 
				
			||||||
int              thrown=0, kept=0;
 | 
					 | 
				
			||||||
int              thrown_frame=0, kept_frame=0;
 | 
					 | 
				
			||||||
vpx_codec_dec_cfg_t  dec_cfg = {0};
 | 
					 | 
				
			||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ EXTRA_VARS
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Making The Drop Decision
 | 
					 | 
				
			||||||
------------------------
 | 
					 | 
				
			||||||
The example decides whether to drop the frame based on the current
 | 
					 | 
				
			||||||
frame number, immediately before decoding the frame.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PRE_DECODE
 | 
					 | 
				
			||||||
/* Decide whether to throw parts of the frame or the whole frame
 | 
					 | 
				
			||||||
   depending on the drop mode */
 | 
					 | 
				
			||||||
thrown_frame = 0;
 | 
					 | 
				
			||||||
kept_frame = 0;
 | 
					 | 
				
			||||||
switch (mode)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
case 0:
 | 
					 | 
				
			||||||
    if (m - (frame_cnt-1)%m <= n)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        frame_sz = 0;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    break;
 | 
					 | 
				
			||||||
case 1:
 | 
					 | 
				
			||||||
    if (frame_cnt >= n && frame_cnt <= m)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        frame_sz = 0;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    break;
 | 
					 | 
				
			||||||
case 2:
 | 
					 | 
				
			||||||
    throw_packets(frame, &frame_sz, n, &thrown_frame, &kept_frame);
 | 
					 | 
				
			||||||
    break;
 | 
					 | 
				
			||||||
default: break;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
if (mode < 2)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    if (frame_sz == 0)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        putc('X', stdout);
 | 
					 | 
				
			||||||
        thrown_frame++;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        putc('.', stdout);
 | 
					 | 
				
			||||||
        kept_frame++;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
thrown += thrown_frame;
 | 
					 | 
				
			||||||
kept += kept_frame;
 | 
					 | 
				
			||||||
fflush(stdout);
 | 
					 | 
				
			||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PRE_DECODE
 | 
					 | 
				
			||||||
@@ -12,15 +12,14 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
@*INTRODUCTION
 | 
					@*INTRODUCTION
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
#include <stdarg.h>
 | 
					 | 
				
			||||||
#include <stdio.h>
 | 
					#include <stdio.h>
 | 
				
			||||||
#include <stdlib.h>
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <stdarg.h>
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
#define VPX_CODEC_DISABLE_COMPAT 1
 | 
					#define VPX_CODEC_DISABLE_COMPAT 1
 | 
				
			||||||
#include "./vpx_config.h"
 | 
					 | 
				
			||||||
#include "vpx/vp8dx.h"
 | 
					 | 
				
			||||||
#include "vpx/vpx_decoder.h"
 | 
					#include "vpx/vpx_decoder.h"
 | 
				
			||||||
#define interface (vpx_codec_vp8_dx())
 | 
					#include "vpx/vp8dx.h"
 | 
				
			||||||
 | 
					#define interface (&vpx_codec_vp8_dx_algo)
 | 
				
			||||||
@EXTRA_INCLUDES
 | 
					@EXTRA_INCLUDES
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DEC_INCLUDES
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DEC_INCLUDES
 | 
				
			||||||
#define VPX_CODEC_DISABLE_COMPAT 1
 | 
					#define VPX_CODEC_DISABLE_COMPAT 1
 | 
				
			||||||
#include "vpx/vpx_decoder.h"
 | 
					#include "vpx/vpx_decoder.h"
 | 
				
			||||||
#include "vpx/vp9dx.h"
 | 
					#include "vpx/vp8dx.h"
 | 
				
			||||||
#define interface (vpx_codec_vp8_dx())
 | 
					#define interface (&vpx_codec_vp8_dx_algo)
 | 
				
			||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DEC_INCLUDES
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DEC_INCLUDES
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -47,9 +47,8 @@ while((img = vpx_codec_get_frame(&codec, &iter))) {
 | 
				
			|||||||
for(plane=0; plane < 3; plane++) {
 | 
					for(plane=0; plane < 3; plane++) {
 | 
				
			||||||
    unsigned char *buf =img->planes[plane];
 | 
					    unsigned char *buf =img->planes[plane];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for(y=0; y < (plane ? (img->d_h + 1) >> 1 : img->d_h); y++) {
 | 
					    for(y=0; y<img->d_h >> (plane?1:0); y++) {
 | 
				
			||||||
        (void) fwrite(buf, 1, (plane ? (img->d_w + 1) >> 1 : img->d_w),
 | 
					        if(fwrite(buf, 1, img->d_w >> (plane?1:0), outfile));
 | 
				
			||||||
                      outfile);
 | 
					 | 
				
			||||||
        buf += img->stride[plane];
 | 
					        buf += img->stride[plane];
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,7 +19,7 @@
 | 
				
			|||||||
#define VPX_CODEC_DISABLE_COMPAT 1
 | 
					#define VPX_CODEC_DISABLE_COMPAT 1
 | 
				
			||||||
#include "vpx/vpx_encoder.h"
 | 
					#include "vpx/vpx_encoder.h"
 | 
				
			||||||
#include "vpx/vp8cx.h"
 | 
					#include "vpx/vp8cx.h"
 | 
				
			||||||
#define interface (vpx_codec_vp8_cx())
 | 
					#define interface (&vpx_codec_vp8_cx_algo)
 | 
				
			||||||
#define fourcc    0x30385056
 | 
					#define fourcc    0x30385056
 | 
				
			||||||
@EXTRA_INCLUDES
 | 
					@EXTRA_INCLUDES
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -85,7 +85,7 @@ static void write_ivf_file_header(FILE *outfile,
 | 
				
			|||||||
    mem_put_le32(header+24, frame_cnt);           /* length */
 | 
					    mem_put_le32(header+24, frame_cnt);           /* length */
 | 
				
			||||||
    mem_put_le32(header+28, 0);                   /* unused */
 | 
					    mem_put_le32(header+28, 0);                   /* unused */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (void) fwrite(header, 1, 32, outfile);
 | 
					    if(fwrite(header, 1, 32, outfile));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -103,7 +103,7 @@ static void write_ivf_frame_header(FILE *outfile,
 | 
				
			|||||||
    mem_put_le32(header+4, pts&0xFFFFFFFF);
 | 
					    mem_put_le32(header+4, pts&0xFFFFFFFF);
 | 
				
			||||||
    mem_put_le32(header+8, pts >> 32);
 | 
					    mem_put_le32(header+8, pts >> 32);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (void) fwrite(header, 1, 12, outfile);
 | 
					    if(fwrite(header, 1, 12, outfile));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int main(int argc, char **argv) {
 | 
					int main(int argc, char **argv) {
 | 
				
			||||||
@@ -111,6 +111,8 @@ int main(int argc, char **argv) {
 | 
				
			|||||||
    vpx_codec_ctx_t      codec;
 | 
					    vpx_codec_ctx_t      codec;
 | 
				
			||||||
    vpx_codec_enc_cfg_t  cfg;
 | 
					    vpx_codec_enc_cfg_t  cfg;
 | 
				
			||||||
    int                  frame_cnt = 0;
 | 
					    int                  frame_cnt = 0;
 | 
				
			||||||
 | 
					    unsigned char        file_hdr[IVF_FILE_HDR_SZ];
 | 
				
			||||||
 | 
					    unsigned char        frame_hdr[IVF_FRAME_HDR_SZ];
 | 
				
			||||||
    vpx_image_t          raw;
 | 
					    vpx_image_t          raw;
 | 
				
			||||||
    vpx_codec_err_t      res;
 | 
					    vpx_codec_err_t      res;
 | 
				
			||||||
    long                 width;
 | 
					    long                 width;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_INCLUDES
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_INCLUDES
 | 
				
			||||||
#define VPX_CODEC_DISABLE_COMPAT 1
 | 
					#define VPX_CODEC_DISABLE_COMPAT 1
 | 
				
			||||||
#include "vpx/vpx_encoder.h"
 | 
					#include "vpx/vpx_encoder.h"
 | 
				
			||||||
#include "vpx/vp9cx.h"
 | 
					#include "vpx/vp8cx.h"
 | 
				
			||||||
#define interface (vpx_codec_vp8_cx())
 | 
					#define interface (&vpx_codec_vp8_cx_algo)
 | 
				
			||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_INCLUDES
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_INCLUDES
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -61,14 +61,13 @@ if(vpx_codec_encode(&codec, frame_avail? &raw : NULL, frame_cnt,
 | 
				
			|||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PROCESS_FRAME
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PROCESS_FRAME
 | 
				
			||||||
case VPX_CODEC_CX_FRAME_PKT:
 | 
					case VPX_CODEC_CX_FRAME_PKT:
 | 
				
			||||||
    write_ivf_frame_header(outfile, pkt);
 | 
					    write_ivf_frame_header(outfile, pkt);
 | 
				
			||||||
    (void) fwrite(pkt->data.frame.buf, 1, pkt->data.frame.sz,
 | 
					    if(fwrite(pkt->data.frame.buf, 1, pkt->data.frame.sz,
 | 
				
			||||||
                  outfile);
 | 
					              outfile));
 | 
				
			||||||
    break;
 | 
					    break;
 | 
				
			||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PROCESS_FRAME
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PROCESS_FRAME
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DESTROY
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DESTROY
 | 
				
			||||||
vpx_img_free(&raw);
 | 
					 | 
				
			||||||
if(vpx_codec_destroy(&codec))
 | 
					if(vpx_codec_destroy(&codec))
 | 
				
			||||||
    die_codec(&codec, "Failed to destroy codec");
 | 
					    die_codec(&codec, "Failed to destroy codec");
 | 
				
			||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DESTROY
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DESTROY
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,7 +21,7 @@ res = vpx_codec_dec_init(&codec, interface, NULL,
 | 
				
			|||||||
if(res == VPX_CODEC_INCAPABLE) {
 | 
					if(res == VPX_CODEC_INCAPABLE) {
 | 
				
			||||||
    printf("NOTICE: Postproc not supported by %s\n",
 | 
					    printf("NOTICE: Postproc not supported by %s\n",
 | 
				
			||||||
           vpx_codec_iface_name(interface));
 | 
					           vpx_codec_iface_name(interface));
 | 
				
			||||||
    res = vpx_codec_dec_init(&codec, interface, NULL, flags);
 | 
					    res = vpx_codec_dec_init(&codec, interface, NULL, 0);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
if(res)
 | 
					if(res)
 | 
				
			||||||
    die_codec(&codec, "Failed to initialize decoder");
 | 
					    die_codec(&codec, "Failed to initialize decoder");
 | 
				
			||||||
@@ -51,14 +51,14 @@ Some codecs provide fine grained controls over their built-in
 | 
				
			|||||||
postprocessors. VP8 is one example. The following sample code toggles
 | 
					postprocessors. VP8 is one example. The following sample code toggles
 | 
				
			||||||
postprocessing on and off every 15 frames.
 | 
					postprocessing on and off every 15 frames.
 | 
				
			||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PRE_DECODE
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PRE_DECODE
 | 
				
			||||||
#if CONFIG_VP9_DECODER
 | 
					#if CONFIG_VP8_DECODER
 | 
				
			||||||
if(frame_cnt%30 == 1) {
 | 
					if(frame_cnt%30 == 1) {
 | 
				
			||||||
    vp8_postproc_cfg_t  pp = {0, 0, 0};
 | 
					    vp8_postproc_cfg_t  pp = {0, 0, 0};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(vpx_codec_control(&codec, VP8_SET_POSTPROC, &pp))
 | 
					    if(vpx_codec_control(&codec, VP8_SET_POSTPROC, &pp))
 | 
				
			||||||
        die_codec(&codec, "Failed to turn off postproc");
 | 
					        die_codec(&codec, "Failed to turn off postproc");
 | 
				
			||||||
} else if(frame_cnt%30 == 16) {
 | 
					} else if(frame_cnt%30 == 16) {
 | 
				
			||||||
    vp8_postproc_cfg_t  pp = {VP8_DEBLOCK | VP8_DEMACROBLOCK | VP8_MFQE, 4, 0};
 | 
					    vp8_postproc_cfg_t  pp = {VP8_DEBLOCK | VP8_DEMACROBLOCK, 4, 0};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(vpx_codec_control(&codec, VP8_SET_POSTPROC, &pp))
 | 
					    if(vpx_codec_control(&codec, VP8_SET_POSTPROC, &pp))
 | 
				
			||||||
        die_codec(&codec, "Failed to turn on postproc");
 | 
					        die_codec(&codec, "Failed to turn on postproc");
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -33,7 +33,7 @@ Initializing The Codec
 | 
				
			|||||||
----------------------
 | 
					----------------------
 | 
				
			||||||
The decoder is initialized by the following code. This is an example for
 | 
					The decoder is initialized by the following code. This is an example for
 | 
				
			||||||
the VP8 decoder, but the code is analogous for all algorithms. Replace
 | 
					the VP8 decoder, but the code is analogous for all algorithms. Replace
 | 
				
			||||||
`vpx_codec_vp8_dx()` with a pointer to the interface exposed by the
 | 
					`&vpx_codec_vp8_dx_algo` with a pointer to the interface exposed by the
 | 
				
			||||||
algorithm you want to use. The `cfg` argument is left as NULL in this
 | 
					algorithm you want to use. The `cfg` argument is left as NULL in this
 | 
				
			||||||
example, because we want the algorithm to determine the stream
 | 
					example, because we want the algorithm to determine the stream
 | 
				
			||||||
configuration (width/height) and allocate memory automatically. This
 | 
					configuration (width/height) and allocate memory automatically. This
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -71,17 +71,5 @@ Pass Progress Reporting
 | 
				
			|||||||
It's sometimes helpful to see when each pass completes.
 | 
					It's sometimes helpful to see when each pass completes.
 | 
				
			||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ TWOPASS_LOOP_END
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ TWOPASS_LOOP_END
 | 
				
			||||||
    printf("Pass %d complete.\n", pass+1);
 | 
					    printf("Pass %d complete.\n", pass+1);
 | 
				
			||||||
    if(vpx_codec_destroy(&codec))
 | 
					 | 
				
			||||||
        die_codec(&codec, "Failed to destroy codec");
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ TWOPASS_LOOP_END
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ TWOPASS_LOOP_END
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Clean-up
 | 
					 | 
				
			||||||
-----------------------------
 | 
					 | 
				
			||||||
Destruction of the encoder instance must be done on each pass. The
 | 
					 | 
				
			||||||
raw image should be destroyed at the end as usual.
 | 
					 | 
				
			||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DESTROY
 | 
					 | 
				
			||||||
vpx_img_free(&raw);
 | 
					 | 
				
			||||||
free(stats.buf);
 | 
					 | 
				
			||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DESTROY
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										143
									
								
								examples/vp8_scalable_patterns.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										143
									
								
								examples/vp8_scalable_patterns.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,143 @@
 | 
				
			|||||||
 | 
					@TEMPLATE encoder_tmpl.c
 | 
				
			||||||
 | 
					VP8 Scalable Frame Patterns
 | 
				
			||||||
 | 
					===========================
 | 
				
			||||||
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INTRODUCTION
 | 
				
			||||||
 | 
					This is an example demonstrating how to control the VP8 encoder's
 | 
				
			||||||
 | 
					reference frame selection and update mechanism for video applications
 | 
				
			||||||
 | 
					that benefit from a scalable bitstream.
 | 
				
			||||||
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INTRODUCTION
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Configuration
 | 
				
			||||||
 | 
					-------------
 | 
				
			||||||
 | 
					Scalable frame patterns are most useful in an error resilient context,
 | 
				
			||||||
 | 
					so error resiliency mode is enabled, as in the `error_resilient.c`
 | 
				
			||||||
 | 
					example. In addition, we want to disable automatic keyframe selection,
 | 
				
			||||||
 | 
					so we force an interval of 1000 frames.
 | 
				
			||||||
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  ENC_SET_CFG2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Enable error resilient mode */
 | 
				
			||||||
 | 
					cfg.g_error_resilient = 1;
 | 
				
			||||||
 | 
					cfg.g_lag_in_frames   = 0;
 | 
				
			||||||
 | 
					cfg.kf_mode           = VPX_KF_FIXED;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Disable automatic keyframe placement */
 | 
				
			||||||
 | 
					cfg.kf_min_dist = cfg.kf_max_dist = 1000;
 | 
				
			||||||
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_SET_CFG2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This example uses the following frame pattern (L->last_frame,
 | 
				
			||||||
 | 
					G->golden_frame, A->alt_ref_frame):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					*  Frame  0  Intra, use none,  update L&G&A
 | 
				
			||||||
 | 
					*  Frame  1  Inter, use LGA,   update none
 | 
				
			||||||
 | 
					*  Frame  2  Inter, use LGA,   update L
 | 
				
			||||||
 | 
					*  Frame  3  Inter, use LGA,   update none
 | 
				
			||||||
 | 
					*  Frame  4  Inter, use GA,    update L&G
 | 
				
			||||||
 | 
					*  Frame  5  Inter, use LGA,   update none
 | 
				
			||||||
 | 
					*  Frame  6  Inter, use LGA,   update L
 | 
				
			||||||
 | 
					*  Frame  7  Inter, use LGA,   update none
 | 
				
			||||||
 | 
					*  Frame  8  Inter, use A,     update L&G&A
 | 
				
			||||||
 | 
					*  Frame  9  Inter, use LGA,   update none
 | 
				
			||||||
 | 
					*  Frame 10  Inter, use LGA,   update L
 | 
				
			||||||
 | 
					*  Frame 11  Inter, use LGA,   update none
 | 
				
			||||||
 | 
					*  Frame 12  Inter, use GA,    update L&G
 | 
				
			||||||
 | 
					*  Frame 13  Inter, use LGA,   update none
 | 
				
			||||||
 | 
					*  Frame 14  Inter, use LGA,   update L
 | 
				
			||||||
 | 
					*  Frame 15  Inter, use LGA,   update none
 | 
				
			||||||
 | 
					*  ...Repeats the pattern from frame 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Change this variable to test the 3 decodable streams case.
 | 
				
			||||||
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ TWOPASS_VARS
 | 
				
			||||||
 | 
					int                  num_streams = 5;
 | 
				
			||||||
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ TWOPASS_VARS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PER_FRAME_CFG
 | 
				
			||||||
 | 
					flags = 0;
 | 
				
			||||||
 | 
					if(num_streams == 5)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    switch(frame_cnt % 16) {
 | 
				
			||||||
 | 
					        case 0:
 | 
				
			||||||
 | 
					            flags |= VPX_EFLAG_FORCE_KF;
 | 
				
			||||||
 | 
					            flags |= VP8_EFLAG_FORCE_GF;
 | 
				
			||||||
 | 
					            flags |= VP8_EFLAG_FORCE_ARF;
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        case 1:
 | 
				
			||||||
 | 
					        case 3:
 | 
				
			||||||
 | 
					        case 5:
 | 
				
			||||||
 | 
					        case 7:
 | 
				
			||||||
 | 
					        case 9:
 | 
				
			||||||
 | 
					        case 11:
 | 
				
			||||||
 | 
					        case 13:
 | 
				
			||||||
 | 
					        case 15:
 | 
				
			||||||
 | 
					            flags |= VP8_EFLAG_NO_UPD_LAST;
 | 
				
			||||||
 | 
					            flags |= VP8_EFLAG_NO_UPD_GF;
 | 
				
			||||||
 | 
					            flags |= VP8_EFLAG_NO_UPD_ARF;
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        case 2:
 | 
				
			||||||
 | 
					        case 6:
 | 
				
			||||||
 | 
					        case 10:
 | 
				
			||||||
 | 
					        case 14:
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        case 4:
 | 
				
			||||||
 | 
					            flags |= VP8_EFLAG_NO_REF_LAST;
 | 
				
			||||||
 | 
					            flags |= VP8_EFLAG_FORCE_GF;
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        case 8:
 | 
				
			||||||
 | 
					            flags |= VP8_EFLAG_NO_REF_LAST;
 | 
				
			||||||
 | 
					            flags |= VP8_EFLAG_NO_REF_GF;
 | 
				
			||||||
 | 
					            flags |= VP8_EFLAG_FORCE_GF;
 | 
				
			||||||
 | 
					            flags |= VP8_EFLAG_FORCE_ARF;
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        case 12:
 | 
				
			||||||
 | 
					            flags |= VP8_EFLAG_NO_REF_LAST;
 | 
				
			||||||
 | 
					            flags |= VP8_EFLAG_FORCE_GF;
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    switch(frame_cnt % 9) {
 | 
				
			||||||
 | 
					        case 0:
 | 
				
			||||||
 | 
					            if(frame_cnt==0)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                flags |= VPX_EFLAG_FORCE_KF;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                cfg.rc_max_quantizer = 26;
 | 
				
			||||||
 | 
					                cfg.rc_min_quantizer = 0;
 | 
				
			||||||
 | 
					                cfg.rc_target_bitrate = 300;
 | 
				
			||||||
 | 
					                flags |= VP8_EFLAG_NO_REF_LAST;
 | 
				
			||||||
 | 
					                flags |= VP8_EFLAG_NO_REF_ARF;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            flags |= VP8_EFLAG_FORCE_GF;
 | 
				
			||||||
 | 
					            flags |= VP8_EFLAG_FORCE_ARF;
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        case 1:
 | 
				
			||||||
 | 
					        case 2:
 | 
				
			||||||
 | 
					        case 4:
 | 
				
			||||||
 | 
					        case 5:
 | 
				
			||||||
 | 
					        case 7:
 | 
				
			||||||
 | 
					        case 8:
 | 
				
			||||||
 | 
					            cfg.rc_max_quantizer = 45;
 | 
				
			||||||
 | 
					            cfg.rc_min_quantizer = 0;
 | 
				
			||||||
 | 
					            cfg.rc_target_bitrate = 230;
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        case 3:
 | 
				
			||||||
 | 
					        case 6:
 | 
				
			||||||
 | 
					            cfg.rc_max_quantizer = 45;
 | 
				
			||||||
 | 
					            cfg.rc_min_quantizer = 0;
 | 
				
			||||||
 | 
					            cfg.rc_target_bitrate = 215;
 | 
				
			||||||
 | 
					            flags |= VP8_EFLAG_NO_REF_LAST;
 | 
				
			||||||
 | 
					            flags |= VP8_EFLAG_FORCE_ARF;
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PER_FRAME_CFG
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Observing The Effects
 | 
				
			||||||
 | 
					---------------------
 | 
				
			||||||
 | 
					Use the `decode_with_drops` example to decode with various dropped frame
 | 
				
			||||||
 | 
					patterns. Good patterns to start with are 1/2, 3/4, 7/8, and 15/16
 | 
				
			||||||
 | 
					drops.
 | 
				
			||||||
							
								
								
									
										60
									
								
								libmkv/EbmlBufferWriter.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								libmkv/EbmlBufferWriter.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,60 @@
 | 
				
			|||||||
 | 
					//#include <strmif.h>
 | 
				
			||||||
 | 
					#include "EbmlBufferWriter.h"
 | 
				
			||||||
 | 
					#include "EbmlWriter.h"
 | 
				
			||||||
 | 
					//#include <cassert>
 | 
				
			||||||
 | 
					//#include <limits>
 | 
				
			||||||
 | 
					//#include <malloc.h>  //_alloca
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <wchar.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Ebml_Write(EbmlGlobal *glob, const void *buffer_in, unsigned long len)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    unsigned char *src = glob->buf;
 | 
				
			||||||
 | 
					    src += glob->offset;
 | 
				
			||||||
 | 
					    memcpy(src, buffer_in, len);
 | 
				
			||||||
 | 
					    glob->offset += len;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void _Serialize(EbmlGlobal *glob, const unsigned char *p, const unsigned char *q)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    while (q != p)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        --q;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        unsigned long cbWritten;
 | 
				
			||||||
 | 
					        memcpy(&(glob->buf[glob->offset]), q, 1);
 | 
				
			||||||
 | 
					        glob->offset ++;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Ebml_Serialize(EbmlGlobal *glob, const void *buffer_in, unsigned long len)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    //assert(buf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const unsigned char *const p = (const unsigned char *)(buffer_in);
 | 
				
			||||||
 | 
					    const unsigned char *const q = p + len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    _Serialize(glob, p, q);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Ebml_StartSubElement(EbmlGlobal *glob, EbmlLoc *ebmlLoc, unsigned long class_id)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    Ebml_WriteID(glob, class_id);
 | 
				
			||||||
 | 
					    ebmlLoc->offset = glob->offset;
 | 
				
			||||||
 | 
					    //todo this is always taking 8 bytes, this may need later optimization
 | 
				
			||||||
 | 
					    unsigned long long unknownLen =  0x01FFFFFFFFFFFFFFLLU;
 | 
				
			||||||
 | 
					    Ebml_Serialize(glob, (void *)&unknownLen, 8); //this is a key that says lenght unknown
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Ebml_EndSubElement(EbmlGlobal *glob, EbmlLoc *ebmlLoc)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    unsigned long long size = glob->offset - ebmlLoc->offset - 8;
 | 
				
			||||||
 | 
					    unsigned long long curOffset = glob->offset;
 | 
				
			||||||
 | 
					    glob->offset = ebmlLoc->offset;
 | 
				
			||||||
 | 
					    size |=  0x0100000000000000LLU;
 | 
				
			||||||
 | 
					    Ebml_Serialize(glob, &size, 8);
 | 
				
			||||||
 | 
					    glob->offset = curOffset;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1,14 +1,16 @@
 | 
				
			|||||||
#ifndef EBMLBUFFERWRITER_HPP
 | 
					#ifndef EBMLBUFFERWRITER_HPP
 | 
				
			||||||
#define EBMLBUFFERWRITER_HPP
 | 
					#define EBMLBUFFERWRITER_HPP
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct
 | 
				
			||||||
  unsigned long long offset;
 | 
					{
 | 
				
			||||||
 | 
					    unsigned long long offset;
 | 
				
			||||||
} EbmlLoc;
 | 
					} EbmlLoc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct
 | 
				
			||||||
  unsigned char *buf;
 | 
					{
 | 
				
			||||||
  unsigned int length;
 | 
					    unsigned char *buf;
 | 
				
			||||||
  unsigned int offset;
 | 
					    unsigned int length;
 | 
				
			||||||
 | 
					    unsigned int offset;
 | 
				
			||||||
} EbmlGlobal;
 | 
					} EbmlGlobal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										231
									
								
								libmkv/EbmlIDs.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										231
									
								
								libmkv/EbmlIDs.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,231 @@
 | 
				
			|||||||
 | 
					// Copyright (c) 2010 The WebM project authors. All Rights Reserved.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Use of this source code is governed by a BSD-style license
 | 
				
			||||||
 | 
					// that can be found in the LICENSE file in the root of the source
 | 
				
			||||||
 | 
					// tree. An additional intellectual property rights grant can be found
 | 
				
			||||||
 | 
					// in the file PATENTS.  All contributing project authors may
 | 
				
			||||||
 | 
					// be found in the AUTHORS file in the root of the source tree.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef MKV_DEFS_HPP
 | 
				
			||||||
 | 
					#define MKV_DEFS_HPP 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//Commenting out values not available in webm, but available in matroska
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum mkv
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    EBML = 0x1A45DFA3,
 | 
				
			||||||
 | 
					    EBMLVersion = 0x4286,
 | 
				
			||||||
 | 
					    EBMLReadVersion = 0x42F7,
 | 
				
			||||||
 | 
					    EBMLMaxIDLength = 0x42F2,
 | 
				
			||||||
 | 
					    EBMLMaxSizeLength = 0x42F3,
 | 
				
			||||||
 | 
					    DocType = 0x4282,
 | 
				
			||||||
 | 
					    DocTypeVersion = 0x4287,
 | 
				
			||||||
 | 
					    DocTypeReadVersion = 0x4285,
 | 
				
			||||||
 | 
					//  CRC_32 = 0xBF,
 | 
				
			||||||
 | 
					    Void = 0xEC,
 | 
				
			||||||
 | 
					    SignatureSlot = 0x1B538667,
 | 
				
			||||||
 | 
					    SignatureAlgo = 0x7E8A,
 | 
				
			||||||
 | 
					    SignatureHash = 0x7E9A,
 | 
				
			||||||
 | 
					    SignaturePublicKey = 0x7EA5,
 | 
				
			||||||
 | 
					    Signature = 0x7EB5,
 | 
				
			||||||
 | 
					    SignatureElements = 0x7E5B,
 | 
				
			||||||
 | 
					    SignatureElementList = 0x7E7B,
 | 
				
			||||||
 | 
					    SignedElement = 0x6532,
 | 
				
			||||||
 | 
					    //segment
 | 
				
			||||||
 | 
					    Segment = 0x18538067,
 | 
				
			||||||
 | 
					    //Meta Seek Information
 | 
				
			||||||
 | 
					    SeekHead = 0x114D9B74,
 | 
				
			||||||
 | 
					    Seek = 0x4DBB,
 | 
				
			||||||
 | 
					    SeekID = 0x53AB,
 | 
				
			||||||
 | 
					    SeekPosition = 0x53AC,
 | 
				
			||||||
 | 
					    //Segment Information
 | 
				
			||||||
 | 
					    Info = 0x1549A966,
 | 
				
			||||||
 | 
					//  SegmentUID = 0x73A4,
 | 
				
			||||||
 | 
					//  SegmentFilename = 0x7384,
 | 
				
			||||||
 | 
					//  PrevUID = 0x3CB923,
 | 
				
			||||||
 | 
					//  PrevFilename = 0x3C83AB,
 | 
				
			||||||
 | 
					//  NextUID = 0x3EB923,
 | 
				
			||||||
 | 
					//  NextFilename = 0x3E83BB,
 | 
				
			||||||
 | 
					//  SegmentFamily = 0x4444,
 | 
				
			||||||
 | 
					//  ChapterTranslate = 0x6924,
 | 
				
			||||||
 | 
					//  ChapterTranslateEditionUID = 0x69FC,
 | 
				
			||||||
 | 
					//  ChapterTranslateCodec = 0x69BF,
 | 
				
			||||||
 | 
					//  ChapterTranslateID = 0x69A5,
 | 
				
			||||||
 | 
					    TimecodeScale = 0x2AD7B1,
 | 
				
			||||||
 | 
					    Segment_Duration = 0x4489,
 | 
				
			||||||
 | 
					    DateUTC = 0x4461,
 | 
				
			||||||
 | 
					//  Title = 0x7BA9,
 | 
				
			||||||
 | 
					    MuxingApp = 0x4D80,
 | 
				
			||||||
 | 
					    WritingApp = 0x5741,
 | 
				
			||||||
 | 
					    //Cluster
 | 
				
			||||||
 | 
					    Cluster = 0x1F43B675,
 | 
				
			||||||
 | 
					    Timecode = 0xE7,
 | 
				
			||||||
 | 
					//  SilentTracks = 0x5854,
 | 
				
			||||||
 | 
					//  SilentTrackNumber = 0x58D7,
 | 
				
			||||||
 | 
					//  Position = 0xA7,
 | 
				
			||||||
 | 
					    PrevSize = 0xAB,
 | 
				
			||||||
 | 
					    BlockGroup = 0xA0,
 | 
				
			||||||
 | 
					    Block = 0xA1,
 | 
				
			||||||
 | 
					//  BlockVirtual = 0xA2,
 | 
				
			||||||
 | 
					//  BlockAdditions = 0x75A1,
 | 
				
			||||||
 | 
					//  BlockMore = 0xA6,
 | 
				
			||||||
 | 
					//  BlockAddID = 0xEE,
 | 
				
			||||||
 | 
					//  BlockAdditional = 0xA5,
 | 
				
			||||||
 | 
					    BlockDuration = 0x9B,
 | 
				
			||||||
 | 
					//  ReferencePriority = 0xFA,
 | 
				
			||||||
 | 
					    ReferenceBlock = 0xFB,
 | 
				
			||||||
 | 
					//  ReferenceVirtual = 0xFD,
 | 
				
			||||||
 | 
					//  CodecState = 0xA4,
 | 
				
			||||||
 | 
					//  Slices = 0x8E,
 | 
				
			||||||
 | 
					//  TimeSlice = 0xE8,
 | 
				
			||||||
 | 
					    LaceNumber = 0xCC,
 | 
				
			||||||
 | 
					//  FrameNumber = 0xCD,
 | 
				
			||||||
 | 
					//  BlockAdditionID = 0xCB,
 | 
				
			||||||
 | 
					//  MkvDelay = 0xCE,
 | 
				
			||||||
 | 
					//  Cluster_Duration = 0xCF,
 | 
				
			||||||
 | 
					    SimpleBlock = 0xA3,
 | 
				
			||||||
 | 
					//  EncryptedBlock = 0xAF,
 | 
				
			||||||
 | 
					    //Track
 | 
				
			||||||
 | 
					    Tracks = 0x1654AE6B,
 | 
				
			||||||
 | 
					    TrackEntry = 0xAE,
 | 
				
			||||||
 | 
					    TrackNumber = 0xD7,
 | 
				
			||||||
 | 
					    TrackUID = 0x73C5,
 | 
				
			||||||
 | 
					    TrackType = 0x83,
 | 
				
			||||||
 | 
					    FlagEnabled = 0xB9,
 | 
				
			||||||
 | 
					    FlagDefault = 0x88,
 | 
				
			||||||
 | 
					    FlagForced = 0x55AA,
 | 
				
			||||||
 | 
					    FlagLacing = 0x9C,
 | 
				
			||||||
 | 
					//  MinCache = 0x6DE7,
 | 
				
			||||||
 | 
					//  MaxCache = 0x6DF8,
 | 
				
			||||||
 | 
					    DefaultDuration = 0x23E383,
 | 
				
			||||||
 | 
					//  TrackTimecodeScale = 0x23314F,
 | 
				
			||||||
 | 
					//  TrackOffset = 0x537F,
 | 
				
			||||||
 | 
					//  MaxBlockAdditionID = 0x55EE,
 | 
				
			||||||
 | 
					    Name = 0x536E,
 | 
				
			||||||
 | 
					    Language = 0x22B59C,
 | 
				
			||||||
 | 
					    CodecID = 0x86,
 | 
				
			||||||
 | 
					    CodecPrivate = 0x63A2,
 | 
				
			||||||
 | 
					    CodecName = 0x258688,
 | 
				
			||||||
 | 
					//  AttachmentLink = 0x7446,
 | 
				
			||||||
 | 
					//  CodecSettings = 0x3A9697,
 | 
				
			||||||
 | 
					//  CodecInfoURL = 0x3B4040,
 | 
				
			||||||
 | 
					//  CodecDownloadURL = 0x26B240,
 | 
				
			||||||
 | 
					//  CodecDecodeAll = 0xAA,
 | 
				
			||||||
 | 
					//  TrackOverlay = 0x6FAB,
 | 
				
			||||||
 | 
					//  TrackTranslate = 0x6624,
 | 
				
			||||||
 | 
					//  TrackTranslateEditionUID = 0x66FC,
 | 
				
			||||||
 | 
					//  TrackTranslateCodec = 0x66BF,
 | 
				
			||||||
 | 
					//  TrackTranslateTrackID = 0x66A5,
 | 
				
			||||||
 | 
					    //video
 | 
				
			||||||
 | 
					    Video = 0xE0,
 | 
				
			||||||
 | 
					    FlagInterlaced = 0x9A,
 | 
				
			||||||
 | 
					//  StereoMode = 0x53B8,
 | 
				
			||||||
 | 
					    PixelWidth = 0xB0,
 | 
				
			||||||
 | 
					    PixelHeight = 0xBA,
 | 
				
			||||||
 | 
					    PixelCropBottom = 0x54AA,
 | 
				
			||||||
 | 
					    PixelCropTop = 0x54BB,
 | 
				
			||||||
 | 
					    PixelCropLeft = 0x54CC,
 | 
				
			||||||
 | 
					    PixelCropRight = 0x54DD,
 | 
				
			||||||
 | 
					    DisplayWidth = 0x54B0,
 | 
				
			||||||
 | 
					    DisplayHeight = 0x54BA,
 | 
				
			||||||
 | 
					    DisplayUnit = 0x54B2,
 | 
				
			||||||
 | 
					    AspectRatioType = 0x54B3,
 | 
				
			||||||
 | 
					//  ColourSpace = 0x2EB524,
 | 
				
			||||||
 | 
					//  GammaValue = 0x2FB523,
 | 
				
			||||||
 | 
					    FrameRate = 0x2383E3,
 | 
				
			||||||
 | 
					    //end video
 | 
				
			||||||
 | 
					    //audio
 | 
				
			||||||
 | 
					    Audio = 0xE1,
 | 
				
			||||||
 | 
					    SamplingFrequency = 0xB5,
 | 
				
			||||||
 | 
					    OutputSamplingFrequency = 0x78B5,
 | 
				
			||||||
 | 
					    Channels = 0x9F,
 | 
				
			||||||
 | 
					//  ChannelPositions = 0x7D7B,
 | 
				
			||||||
 | 
					    BitDepth = 0x6264,
 | 
				
			||||||
 | 
					    //end audio
 | 
				
			||||||
 | 
					    //content encoding
 | 
				
			||||||
 | 
					//  ContentEncodings = 0x6d80,
 | 
				
			||||||
 | 
					//  ContentEncoding = 0x6240,
 | 
				
			||||||
 | 
					//  ContentEncodingOrder = 0x5031,
 | 
				
			||||||
 | 
					//  ContentEncodingScope = 0x5032,
 | 
				
			||||||
 | 
					//  ContentEncodingType = 0x5033,
 | 
				
			||||||
 | 
					//  ContentCompression = 0x5034,
 | 
				
			||||||
 | 
					//  ContentCompAlgo = 0x4254,
 | 
				
			||||||
 | 
					//  ContentCompSettings = 0x4255,
 | 
				
			||||||
 | 
					//  ContentEncryption = 0x5035,
 | 
				
			||||||
 | 
					//  ContentEncAlgo = 0x47e1,
 | 
				
			||||||
 | 
					//  ContentEncKeyID = 0x47e2,
 | 
				
			||||||
 | 
					//  ContentSignature = 0x47e3,
 | 
				
			||||||
 | 
					//  ContentSigKeyID = 0x47e4,
 | 
				
			||||||
 | 
					//  ContentSigAlgo = 0x47e5,
 | 
				
			||||||
 | 
					//  ContentSigHashAlgo = 0x47e6,
 | 
				
			||||||
 | 
					    //end content encoding
 | 
				
			||||||
 | 
					    //Cueing Data
 | 
				
			||||||
 | 
					    Cues = 0x1C53BB6B,
 | 
				
			||||||
 | 
					    CuePoint = 0xBB,
 | 
				
			||||||
 | 
					    CueTime = 0xB3,
 | 
				
			||||||
 | 
					    CueTrackPositions = 0xB7,
 | 
				
			||||||
 | 
					    CueTrack = 0xF7,
 | 
				
			||||||
 | 
					    CueClusterPosition = 0xF1,
 | 
				
			||||||
 | 
					    CueBlockNumber = 0x5378,
 | 
				
			||||||
 | 
					//  CueCodecState = 0xEA,
 | 
				
			||||||
 | 
					//  CueReference = 0xDB,
 | 
				
			||||||
 | 
					//  CueRefTime = 0x96,
 | 
				
			||||||
 | 
					//  CueRefCluster = 0x97,
 | 
				
			||||||
 | 
					//  CueRefNumber = 0x535F,
 | 
				
			||||||
 | 
					//  CueRefCodecState = 0xEB,
 | 
				
			||||||
 | 
					    //Attachment
 | 
				
			||||||
 | 
					//  Attachments = 0x1941A469,
 | 
				
			||||||
 | 
					//  AttachedFile = 0x61A7,
 | 
				
			||||||
 | 
					//  FileDescription = 0x467E,
 | 
				
			||||||
 | 
					//  FileName = 0x466E,
 | 
				
			||||||
 | 
					//  FileMimeType = 0x4660,
 | 
				
			||||||
 | 
					//  FileData = 0x465C,
 | 
				
			||||||
 | 
					//  FileUID = 0x46AE,
 | 
				
			||||||
 | 
					//  FileReferral = 0x4675,
 | 
				
			||||||
 | 
					    //Chapters
 | 
				
			||||||
 | 
					//  Chapters = 0x1043A770,
 | 
				
			||||||
 | 
					//  EditionEntry = 0x45B9,
 | 
				
			||||||
 | 
					//  EditionUID = 0x45BC,
 | 
				
			||||||
 | 
					//  EditionFlagHidden = 0x45BD,
 | 
				
			||||||
 | 
					//  EditionFlagDefault = 0x45DB,
 | 
				
			||||||
 | 
					//  EditionFlagOrdered = 0x45DD,
 | 
				
			||||||
 | 
					//  ChapterAtom = 0xB6,
 | 
				
			||||||
 | 
					//  ChapterUID = 0x73C4,
 | 
				
			||||||
 | 
					//  ChapterTimeStart = 0x91,
 | 
				
			||||||
 | 
					//  ChapterTimeEnd = 0x92,
 | 
				
			||||||
 | 
					//  ChapterFlagHidden = 0x98,
 | 
				
			||||||
 | 
					//  ChapterFlagEnabled = 0x4598,
 | 
				
			||||||
 | 
					//  ChapterSegmentUID = 0x6E67,
 | 
				
			||||||
 | 
					//  ChapterSegmentEditionUID = 0x6EBC,
 | 
				
			||||||
 | 
					//  ChapterPhysicalEquiv = 0x63C3,
 | 
				
			||||||
 | 
					//  ChapterTrack = 0x8F,
 | 
				
			||||||
 | 
					//  ChapterTrackNumber = 0x89,
 | 
				
			||||||
 | 
					//  ChapterDisplay = 0x80,
 | 
				
			||||||
 | 
					//  ChapString = 0x85,
 | 
				
			||||||
 | 
					//  ChapLanguage = 0x437C,
 | 
				
			||||||
 | 
					//  ChapCountry = 0x437E,
 | 
				
			||||||
 | 
					//  ChapProcess = 0x6944,
 | 
				
			||||||
 | 
					//  ChapProcessCodecID = 0x6955,
 | 
				
			||||||
 | 
					//  ChapProcessPrivate = 0x450D,
 | 
				
			||||||
 | 
					//  ChapProcessCommand = 0x6911,
 | 
				
			||||||
 | 
					//  ChapProcessTime = 0x6922,
 | 
				
			||||||
 | 
					//  ChapProcessData = 0x6933,
 | 
				
			||||||
 | 
					    //Tagging
 | 
				
			||||||
 | 
					//  Tags = 0x1254C367,
 | 
				
			||||||
 | 
					//  Tag = 0x7373,
 | 
				
			||||||
 | 
					//  Targets = 0x63C0,
 | 
				
			||||||
 | 
					//  TargetTypeValue = 0x68CA,
 | 
				
			||||||
 | 
					//  TargetType = 0x63CA,
 | 
				
			||||||
 | 
					//  Tagging_TrackUID = 0x63C5,
 | 
				
			||||||
 | 
					//  Tagging_EditionUID = 0x63C9,
 | 
				
			||||||
 | 
					//  Tagging_ChapterUID = 0x63C4,
 | 
				
			||||||
 | 
					//  AttachmentUID = 0x63C6,
 | 
				
			||||||
 | 
					//  SimpleTag = 0x67C8,
 | 
				
			||||||
 | 
					//  TagName = 0x45A3,
 | 
				
			||||||
 | 
					//  TagLanguage = 0x447A,
 | 
				
			||||||
 | 
					//  TagDefault = 0x4484,
 | 
				
			||||||
 | 
					//  TagString = 0x4487,
 | 
				
			||||||
 | 
					//  TagBinary = 0x4485,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
							
								
								
									
										166
									
								
								libmkv/EbmlWriter.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										166
									
								
								libmkv/EbmlWriter.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,166 @@
 | 
				
			|||||||
 | 
					// Copyright (c) 2010 The WebM project authors. All Rights Reserved.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Use of this source code is governed by a BSD-style license
 | 
				
			||||||
 | 
					// that can be found in the LICENSE file in the root of the source
 | 
				
			||||||
 | 
					// tree. An additional intellectual property rights grant can be found
 | 
				
			||||||
 | 
					// in the file PATENTS.  All contributing project authors may
 | 
				
			||||||
 | 
					// be found in the AUTHORS file in the root of the source tree.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "EbmlWriter.h"
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <wchar.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#if defined(_MSC_VER)
 | 
				
			||||||
 | 
					#define LITERALU64(n) n
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define LITERALU64(n) n##LLU
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Ebml_WriteLen(EbmlGlobal *glob, long long val)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    //TODO check and make sure we are not > than 0x0100000000000000LLU
 | 
				
			||||||
 | 
					    unsigned char size = 8; //size in bytes to output
 | 
				
			||||||
 | 
					    unsigned long long minVal = LITERALU64(0x00000000000000ff); //mask to compare for byte size
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (size = 1; size < 8; size ++)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (val < minVal)
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        minVal = (minVal << 7);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    val |= (LITERALU64(0x000000000000080) << ((size - 1) * 7));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Ebml_Serialize(glob, (void *) &val, size);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Ebml_WriteString(EbmlGlobal *glob, const char *str)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    const size_t size_ = strlen(str);
 | 
				
			||||||
 | 
					    const unsigned long long  size = size_;
 | 
				
			||||||
 | 
					    Ebml_WriteLen(glob, size);
 | 
				
			||||||
 | 
					    //TODO: it's not clear from the spec whether the nul terminator
 | 
				
			||||||
 | 
					    //should be serialized too.  For now we omit the null terminator.
 | 
				
			||||||
 | 
					    Ebml_Write(glob, str, size);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Ebml_WriteUTF8(EbmlGlobal *glob, const wchar_t *wstr)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    const size_t strlen = wcslen(wstr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //TODO: it's not clear from the spec whether the nul terminator
 | 
				
			||||||
 | 
					    //should be serialized too.  For now we include it.
 | 
				
			||||||
 | 
					    const unsigned long long  size = strlen;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Ebml_WriteLen(glob, size);
 | 
				
			||||||
 | 
					    Ebml_Write(glob, wstr, size);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Ebml_WriteID(EbmlGlobal *glob, unsigned long class_id)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (class_id >= 0x01000000)
 | 
				
			||||||
 | 
					        Ebml_Serialize(glob, (void *)&class_id, 4);
 | 
				
			||||||
 | 
					    else if (class_id >= 0x00010000)
 | 
				
			||||||
 | 
					        Ebml_Serialize(glob, (void *)&class_id, 3);
 | 
				
			||||||
 | 
					    else if (class_id >= 0x00000100)
 | 
				
			||||||
 | 
					        Ebml_Serialize(glob, (void *)&class_id, 2);
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        Ebml_Serialize(glob, (void *)&class_id, 1);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					void Ebml_SerializeUnsigned64(EbmlGlobal *glob, unsigned long class_id, uint64_t ui)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    unsigned char sizeSerialized = 8 | 0x80;
 | 
				
			||||||
 | 
					    Ebml_WriteID(glob, class_id);
 | 
				
			||||||
 | 
					    Ebml_Serialize(glob, &sizeSerialized, 1);
 | 
				
			||||||
 | 
					    Ebml_Serialize(glob, &ui, 8);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Ebml_SerializeUnsigned(EbmlGlobal *glob, unsigned long class_id, unsigned long ui)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    unsigned char size = 8; //size in bytes to output
 | 
				
			||||||
 | 
					    unsigned char sizeSerialized = 0;
 | 
				
			||||||
 | 
					    unsigned long minVal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Ebml_WriteID(glob, class_id);
 | 
				
			||||||
 | 
					    minVal = 0x7fLU; //mask to compare for byte size
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (size = 1; size < 4; size ++)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (ui < minVal)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        minVal <<= 7;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    sizeSerialized = 0x80 | size;
 | 
				
			||||||
 | 
					    Ebml_Serialize(glob, &sizeSerialized, 1);
 | 
				
			||||||
 | 
					    Ebml_Serialize(glob, &ui, size);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					//TODO: perhaps this is a poor name for this id serializer helper function
 | 
				
			||||||
 | 
					void Ebml_SerializeBinary(EbmlGlobal *glob, unsigned long class_id, unsigned long bin)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int size;
 | 
				
			||||||
 | 
					    for (size=4; size > 1; size--)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (bin & 0x000000ff << ((size-1) * 8))
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    Ebml_WriteID(glob, class_id);
 | 
				
			||||||
 | 
					    Ebml_WriteLen(glob, size);
 | 
				
			||||||
 | 
					    Ebml_WriteID(glob, bin);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Ebml_SerializeFloat(EbmlGlobal *glob, unsigned long class_id, double d)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    unsigned char len = 0x88;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Ebml_WriteID(glob, class_id);
 | 
				
			||||||
 | 
					    Ebml_Serialize(glob, &len, 1);
 | 
				
			||||||
 | 
					    Ebml_Serialize(glob,  &d, 8);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Ebml_WriteSigned16(EbmlGlobal *glob, short val)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    signed long out = ((val & 0x003FFFFF) | 0x00200000) << 8;
 | 
				
			||||||
 | 
					    Ebml_Serialize(glob, &out, 3);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Ebml_SerializeString(EbmlGlobal *glob, unsigned long class_id, const char *s)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    Ebml_WriteID(glob, class_id);
 | 
				
			||||||
 | 
					    Ebml_WriteString(glob, s);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Ebml_SerializeUTF8(EbmlGlobal *glob, unsigned long class_id, wchar_t *s)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    Ebml_WriteID(glob,  class_id);
 | 
				
			||||||
 | 
					    Ebml_WriteUTF8(glob,  s);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Ebml_SerializeData(EbmlGlobal *glob, unsigned long class_id, unsigned char *data, unsigned long data_length)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    unsigned char size = 4;
 | 
				
			||||||
 | 
					    Ebml_WriteID(glob, class_id);
 | 
				
			||||||
 | 
					    Ebml_WriteLen(glob, data_length);
 | 
				
			||||||
 | 
					    Ebml_Write(glob,  data, data_length);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Ebml_WriteVoid(EbmlGlobal *glob, unsigned long vSize)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    unsigned char tmp = 0;
 | 
				
			||||||
 | 
					    unsigned long i = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Ebml_WriteID(glob, 0xEC);
 | 
				
			||||||
 | 
					    Ebml_WriteLen(glob, vSize);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (i = 0; i < vSize; i++)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        Ebml_Write(glob, &tmp, 1);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//TODO Serialize Date
 | 
				
			||||||
@@ -1,30 +1,26 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *  Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
 *  that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
 *  tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
 *  in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
 *  be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
#ifndef EBMLWRITER_HPP
 | 
					#ifndef EBMLWRITER_HPP
 | 
				
			||||||
#define EBMLWRITER_HPP
 | 
					#define EBMLWRITER_HPP
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Copyright (c) 2010 The WebM project authors. All Rights Reserved.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Use of this source code is governed by a BSD-style license
 | 
				
			||||||
 | 
					// that can be found in the LICENSE file in the root of the source
 | 
				
			||||||
 | 
					// tree. An additional intellectual property rights grant can be found
 | 
				
			||||||
 | 
					// in the file PATENTS.  All contributing project authors may
 | 
				
			||||||
 | 
					// be found in the AUTHORS file in the root of the source tree.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//note: you must define write and serialize functions as well as your own EBML_GLOBAL
 | 
				
			||||||
 | 
					//These functions MUST be implemented
 | 
				
			||||||
#include <stddef.h>
 | 
					#include <stddef.h>
 | 
				
			||||||
#include "vpx/vpx_integer.h"
 | 
					#include "vpx/vpx_integer.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* note: you must define write and serialize functions as well as your own
 | 
					 | 
				
			||||||
 * EBML_GLOBAL
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * These functions MUST be implemented
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef struct EbmlGlobal EbmlGlobal;
 | 
					typedef struct EbmlGlobal EbmlGlobal;
 | 
				
			||||||
void  Ebml_Serialize(EbmlGlobal *glob, const void *, int, unsigned long);
 | 
					void  Ebml_Serialize(EbmlGlobal *glob, const void *, unsigned long);
 | 
				
			||||||
void  Ebml_Write(EbmlGlobal *glob, const void *, unsigned long);
 | 
					void  Ebml_Write(EbmlGlobal *glob, const void *, unsigned long);
 | 
				
			||||||
 | 
					/////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*****/
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Ebml_WriteLen(EbmlGlobal *glob, int64_t val);
 | 
					void Ebml_WriteLen(EbmlGlobal *glob, long long val);
 | 
				
			||||||
void Ebml_WriteString(EbmlGlobal *glob, const char *str);
 | 
					void Ebml_WriteString(EbmlGlobal *glob, const char *str);
 | 
				
			||||||
void Ebml_WriteUTF8(EbmlGlobal *glob, const wchar_t *wstr);
 | 
					void Ebml_WriteUTF8(EbmlGlobal *glob, const wchar_t *wstr);
 | 
				
			||||||
void Ebml_WriteID(EbmlGlobal *glob, unsigned long class_id);
 | 
					void Ebml_WriteID(EbmlGlobal *glob, unsigned long class_id);
 | 
				
			||||||
@@ -32,11 +28,11 @@ void Ebml_SerializeUnsigned64(EbmlGlobal *glob, unsigned long class_id, uint64_t
 | 
				
			|||||||
void Ebml_SerializeUnsigned(EbmlGlobal *glob, unsigned long class_id, unsigned long ui);
 | 
					void Ebml_SerializeUnsigned(EbmlGlobal *glob, unsigned long class_id, unsigned long ui);
 | 
				
			||||||
void Ebml_SerializeBinary(EbmlGlobal *glob, unsigned long class_id, unsigned long ui);
 | 
					void Ebml_SerializeBinary(EbmlGlobal *glob, unsigned long class_id, unsigned long ui);
 | 
				
			||||||
void Ebml_SerializeFloat(EbmlGlobal *glob, unsigned long class_id, double d);
 | 
					void Ebml_SerializeFloat(EbmlGlobal *glob, unsigned long class_id, double d);
 | 
				
			||||||
/* TODO make this more generic to signed */
 | 
					//TODO make this more generic to signed
 | 
				
			||||||
void Ebml_WriteSigned16(EbmlGlobal *glob, short val);
 | 
					void Ebml_WriteSigned16(EbmlGlobal *glob, short val);
 | 
				
			||||||
void Ebml_SerializeString(EbmlGlobal *glob, unsigned long class_id, const char *s);
 | 
					void Ebml_SerializeString(EbmlGlobal *glob, unsigned long class_id, const char *s);
 | 
				
			||||||
void Ebml_SerializeUTF8(EbmlGlobal *glob, unsigned long class_id, wchar_t *s);
 | 
					void Ebml_SerializeUTF8(EbmlGlobal *glob, unsigned long class_id, wchar_t *s);
 | 
				
			||||||
void Ebml_SerializeData(EbmlGlobal *glob, unsigned long class_id, unsigned char *data, unsigned long data_length);
 | 
					void Ebml_SerializeData(EbmlGlobal *glob, unsigned long class_id, unsigned char *data, unsigned long data_length);
 | 
				
			||||||
void Ebml_WriteVoid(EbmlGlobal *glob, unsigned long vSize);
 | 
					void Ebml_WriteVoid(EbmlGlobal *glob, unsigned long vSize);
 | 
				
			||||||
/* TODO need date function */
 | 
					//TODO need date function
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
@@ -14,100 +14,106 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#define kVorbisPrivateMaxSize  4000
 | 
					#define kVorbisPrivateMaxSize  4000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void writeHeader(EbmlGlobal *glob) {
 | 
					void writeHeader(EbmlGlobal *glob)
 | 
				
			||||||
  EbmlLoc start;
 | 
					{
 | 
				
			||||||
  Ebml_StartSubElement(glob, &start, EBML);
 | 
					    EbmlLoc start;
 | 
				
			||||||
  Ebml_SerializeUnsigned(glob, EBMLVersion, 1);
 | 
					    Ebml_StartSubElement(glob, &start, EBML);
 | 
				
			||||||
  Ebml_SerializeUnsigned(glob, EBMLReadVersion, 1); // EBML Read Version
 | 
					    Ebml_SerializeUnsigned(glob, EBMLVersion, 1);
 | 
				
			||||||
  Ebml_SerializeUnsigned(glob, EBMLMaxIDLength, 4); // EBML Max ID Length
 | 
					    Ebml_SerializeUnsigned(glob, EBMLReadVersion, 1); //EBML Read Version
 | 
				
			||||||
  Ebml_SerializeUnsigned(glob, EBMLMaxSizeLength, 8); // EBML Max Size Length
 | 
					    Ebml_SerializeUnsigned(glob, EBMLMaxIDLength, 4); //EBML Max ID Length
 | 
				
			||||||
  Ebml_SerializeString(glob, DocType, "webm"); // Doc Type
 | 
					    Ebml_SerializeUnsigned(glob, EBMLMaxSizeLength, 8); //EBML Max Size Length
 | 
				
			||||||
  Ebml_SerializeUnsigned(glob, DocTypeVersion, 2); // Doc Type Version
 | 
					    Ebml_SerializeString(glob, DocType, "webm"); //Doc Type
 | 
				
			||||||
  Ebml_SerializeUnsigned(glob, DocTypeReadVersion, 2); // Doc Type Read Version
 | 
					    Ebml_SerializeUnsigned(glob, DocTypeVersion, 2); //Doc Type Version
 | 
				
			||||||
  Ebml_EndSubElement(glob, &start);
 | 
					    Ebml_SerializeUnsigned(glob, DocTypeReadVersion, 2); //Doc Type Read Version
 | 
				
			||||||
 | 
					    Ebml_EndSubElement(glob, &start);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void writeSimpleBlock(EbmlGlobal *glob, unsigned char trackNumber, short timeCode,
 | 
					void writeSimpleBlock(EbmlGlobal *glob, unsigned char trackNumber, short timeCode,
 | 
				
			||||||
                      int isKeyframe, unsigned char lacingFlag, int discardable,
 | 
					                      int isKeyframe, unsigned char lacingFlag, int discardable,
 | 
				
			||||||
                      unsigned char *data, unsigned long dataLength) {
 | 
					                      unsigned char *data, unsigned long dataLength)
 | 
				
			||||||
  Ebml_WriteID(glob, SimpleBlock);
 | 
					{
 | 
				
			||||||
  unsigned long blockLength = 4 + dataLength;
 | 
					    Ebml_WriteID(glob, SimpleBlock);
 | 
				
			||||||
  blockLength |= 0x10000000; // TODO check length < 0x0FFFFFFFF
 | 
					    unsigned long blockLength = 4 + dataLength;
 | 
				
			||||||
  Ebml_Serialize(glob, &blockLength, sizeof(blockLength), 4);
 | 
					    blockLength |= 0x10000000; //TODO check length < 0x0FFFFFFFF
 | 
				
			||||||
  trackNumber |= 0x80;  // TODO check track nubmer < 128
 | 
					    Ebml_Serialize(glob, &blockLength, 4);
 | 
				
			||||||
  Ebml_Write(glob, &trackNumber, 1);
 | 
					    trackNumber |= 0x80;  //TODO check track nubmer < 128
 | 
				
			||||||
  // Ebml_WriteSigned16(glob, timeCode,2); //this is 3 bytes
 | 
					    Ebml_Write(glob, &trackNumber, 1);
 | 
				
			||||||
  Ebml_Serialize(glob, &timeCode, sizeof(timeCode), 2);
 | 
					    //Ebml_WriteSigned16(glob, timeCode,2); //this is 3 bytes
 | 
				
			||||||
  unsigned char flags = 0x00 | (isKeyframe ? 0x80 : 0x00) | (lacingFlag << 1) | discardable;
 | 
					    Ebml_Serialize(glob, &timeCode, 2);
 | 
				
			||||||
  Ebml_Write(glob, &flags, 1);
 | 
					    unsigned char flags = 0x00 | (isKeyframe ? 0x80 : 0x00) | (lacingFlag << 1) | discardable;
 | 
				
			||||||
  Ebml_Write(glob, data, dataLength);
 | 
					    Ebml_Write(glob, &flags, 1);
 | 
				
			||||||
 | 
					    Ebml_Write(glob, data, dataLength);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static UInt64 generateTrackID(unsigned int trackNumber) {
 | 
					static UInt64 generateTrackID(unsigned int trackNumber)
 | 
				
			||||||
  UInt64 t = time(NULL) * trackNumber;
 | 
					{
 | 
				
			||||||
  UInt64 r = rand();
 | 
					    UInt64 t = time(NULL) * trackNumber;
 | 
				
			||||||
  r = r << 32;
 | 
					    UInt64 r = rand();
 | 
				
			||||||
  r +=  rand();
 | 
					    r = r << 32;
 | 
				
			||||||
  UInt64 rval = t ^ r;
 | 
					    r +=  rand();
 | 
				
			||||||
  return rval;
 | 
					    UInt64 rval = t ^ r;
 | 
				
			||||||
 | 
					    return rval;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void writeVideoTrack(EbmlGlobal *glob, unsigned int trackNumber, int flagLacing,
 | 
					void writeVideoTrack(EbmlGlobal *glob, unsigned int trackNumber, int flagLacing,
 | 
				
			||||||
                     char *codecId, unsigned int pixelWidth, unsigned int pixelHeight,
 | 
					                     char *codecId, unsigned int pixelWidth, unsigned int pixelHeight,
 | 
				
			||||||
                     double frameRate) {
 | 
					                     double frameRate)
 | 
				
			||||||
  EbmlLoc start;
 | 
					{
 | 
				
			||||||
  Ebml_StartSubElement(glob, &start, TrackEntry);
 | 
					    EbmlLoc start;
 | 
				
			||||||
  Ebml_SerializeUnsigned(glob, TrackNumber, trackNumber);
 | 
					    Ebml_StartSubElement(glob, &start, TrackEntry);
 | 
				
			||||||
  UInt64 trackID = generateTrackID(trackNumber);
 | 
					    Ebml_SerializeUnsigned(glob, TrackNumber, trackNumber);
 | 
				
			||||||
  Ebml_SerializeUnsigned(glob, TrackUID, trackID);
 | 
					    UInt64 trackID = generateTrackID(trackNumber);
 | 
				
			||||||
  Ebml_SerializeString(glob, CodecName, "VP8");  // TODO shouldn't be fixed
 | 
					    Ebml_SerializeUnsigned(glob, TrackUID, trackID);
 | 
				
			||||||
 | 
					    Ebml_SerializeString(glob, CodecName, "VP8");  //TODO shouldn't be fixed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Ebml_SerializeUnsigned(glob, TrackType, 1); // video is always 1
 | 
					    Ebml_SerializeUnsigned(glob, TrackType, 1); //video is always 1
 | 
				
			||||||
  Ebml_SerializeString(glob, CodecID, codecId);
 | 
					    Ebml_SerializeString(glob, CodecID, codecId);
 | 
				
			||||||
  {
 | 
					    {
 | 
				
			||||||
    EbmlLoc videoStart;
 | 
					        EbmlLoc videoStart;
 | 
				
			||||||
    Ebml_StartSubElement(glob, &videoStart, Video);
 | 
					        Ebml_StartSubElement(glob, &videoStart, Video);
 | 
				
			||||||
    Ebml_SerializeUnsigned(glob, PixelWidth, pixelWidth);
 | 
					        Ebml_SerializeUnsigned(glob, PixelWidth, pixelWidth);
 | 
				
			||||||
    Ebml_SerializeUnsigned(glob, PixelHeight, pixelHeight);
 | 
					        Ebml_SerializeUnsigned(glob, PixelHeight, pixelHeight);
 | 
				
			||||||
    Ebml_SerializeFloat(glob, FrameRate, frameRate);
 | 
					        Ebml_SerializeFloat(glob, FrameRate, frameRate);
 | 
				
			||||||
    Ebml_EndSubElement(glob, &videoStart); // Video
 | 
					        Ebml_EndSubElement(glob, &videoStart); //Video
 | 
				
			||||||
  }
 | 
					    }
 | 
				
			||||||
  Ebml_EndSubElement(glob, &start); // Track Entry
 | 
					    Ebml_EndSubElement(glob, &start); //Track Entry
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
void writeAudioTrack(EbmlGlobal *glob, unsigned int trackNumber, int flagLacing,
 | 
					void writeAudioTrack(EbmlGlobal *glob, unsigned int trackNumber, int flagLacing,
 | 
				
			||||||
                     char *codecId, double samplingFrequency, unsigned int channels,
 | 
					                     char *codecId, double samplingFrequency, unsigned int channels,
 | 
				
			||||||
                     unsigned char *private, unsigned long privateSize) {
 | 
					                     unsigned char *private, unsigned long privateSize)
 | 
				
			||||||
  EbmlLoc start;
 | 
					{
 | 
				
			||||||
  Ebml_StartSubElement(glob, &start, TrackEntry);
 | 
					    EbmlLoc start;
 | 
				
			||||||
  Ebml_SerializeUnsigned(glob, TrackNumber, trackNumber);
 | 
					    Ebml_StartSubElement(glob, &start, TrackEntry);
 | 
				
			||||||
  UInt64 trackID = generateTrackID(trackNumber);
 | 
					    Ebml_SerializeUnsigned(glob, TrackNumber, trackNumber);
 | 
				
			||||||
  Ebml_SerializeUnsigned(glob, TrackUID, trackID);
 | 
					    UInt64 trackID = generateTrackID(trackNumber);
 | 
				
			||||||
  Ebml_SerializeUnsigned(glob, TrackType, 2); // audio is always 2
 | 
					    Ebml_SerializeUnsigned(glob, TrackUID, trackID);
 | 
				
			||||||
  // I am using defaults for thesed required fields
 | 
					    Ebml_SerializeUnsigned(glob, TrackType, 2); //audio is always 2
 | 
				
			||||||
  /*  Ebml_SerializeUnsigned(glob, FlagEnabled, 1);
 | 
					    //I am using defaults for thesed required fields
 | 
				
			||||||
      Ebml_SerializeUnsigned(glob, FlagDefault, 1);
 | 
					    /*  Ebml_SerializeUnsigned(glob, FlagEnabled, 1);
 | 
				
			||||||
      Ebml_SerializeUnsigned(glob, FlagForced, 1);
 | 
					        Ebml_SerializeUnsigned(glob, FlagDefault, 1);
 | 
				
			||||||
      Ebml_SerializeUnsigned(glob, FlagLacing, flagLacing);*/
 | 
					        Ebml_SerializeUnsigned(glob, FlagForced, 1);
 | 
				
			||||||
  Ebml_SerializeString(glob, CodecID, codecId);
 | 
					        Ebml_SerializeUnsigned(glob, FlagLacing, flagLacing);*/
 | 
				
			||||||
  Ebml_SerializeData(glob, CodecPrivate, private, privateSize);
 | 
					    Ebml_SerializeString(glob, CodecID, codecId);
 | 
				
			||||||
 | 
					    Ebml_SerializeData(glob, CodecPrivate, private, privateSize);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Ebml_SerializeString(glob, CodecName, "VORBIS");  // fixed for now
 | 
					    Ebml_SerializeString(glob, CodecName, "VORBIS");  //fixed for now
 | 
				
			||||||
  {
 | 
					    {
 | 
				
			||||||
    EbmlLoc AudioStart;
 | 
					        EbmlLoc AudioStart;
 | 
				
			||||||
    Ebml_StartSubElement(glob, &AudioStart, Audio);
 | 
					        Ebml_StartSubElement(glob, &AudioStart, Audio);
 | 
				
			||||||
    Ebml_SerializeFloat(glob, SamplingFrequency, samplingFrequency);
 | 
					        Ebml_SerializeFloat(glob, SamplingFrequency, samplingFrequency);
 | 
				
			||||||
    Ebml_SerializeUnsigned(glob, Channels, channels);
 | 
					        Ebml_SerializeUnsigned(glob, Channels, channels);
 | 
				
			||||||
    Ebml_EndSubElement(glob, &AudioStart);
 | 
					        Ebml_EndSubElement(glob, &AudioStart);
 | 
				
			||||||
  }
 | 
					    }
 | 
				
			||||||
  Ebml_EndSubElement(glob, &start);
 | 
					    Ebml_EndSubElement(glob, &start);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
void writeSegmentInformation(EbmlGlobal *ebml, EbmlLoc *startInfo, unsigned long timeCodeScale, double duration) {
 | 
					void writeSegmentInformation(EbmlGlobal *ebml, EbmlLoc* startInfo, unsigned long timeCodeScale, double duration)
 | 
				
			||||||
  Ebml_StartSubElement(ebml, startInfo, Info);
 | 
					{
 | 
				
			||||||
  Ebml_SerializeUnsigned(ebml, TimecodeScale, timeCodeScale);
 | 
					    Ebml_StartSubElement(ebml, startInfo, Info);
 | 
				
			||||||
  Ebml_SerializeFloat(ebml, Segment_Duration, duration * 1000.0); // Currently fixed to using milliseconds
 | 
					    Ebml_SerializeUnsigned(ebml, TimecodeScale, timeCodeScale);
 | 
				
			||||||
  Ebml_SerializeString(ebml, 0x4D80, "QTmuxingAppLibWebM-0.0.1");
 | 
					    Ebml_SerializeFloat(ebml, Segment_Duration, duration * 1000.0); //Currently fixed to using milliseconds
 | 
				
			||||||
  Ebml_SerializeString(ebml, 0x5741, "QTwritingAppLibWebM-0.0.1");
 | 
					    Ebml_SerializeString(ebml, 0x4D80, "QTmuxingAppLibWebM-0.0.1");
 | 
				
			||||||
  Ebml_EndSubElement(ebml, startInfo);
 | 
					    Ebml_SerializeString(ebml, 0x5741, "QTwritingAppLibWebM-0.0.1");
 | 
				
			||||||
 | 
					    Ebml_EndSubElement(ebml, startInfo);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
@@ -136,7 +142,7 @@ void Mkv_WriteSegmentInformation(Ebml& ebml_out, SegmentInformationStruct& segme
 | 
				
			|||||||
        Ebml_SerializeString(ebml_out, 0x7384, segmentInformation.filename);
 | 
					        Ebml_SerializeString(ebml_out, 0x7384, segmentInformation.filename);
 | 
				
			||||||
    Ebml_SerializeUnsigned(ebml_out, 0x2AD7B1, segmentInformation.TimecodeScale);
 | 
					    Ebml_SerializeUnsigned(ebml_out, 0x2AD7B1, segmentInformation.TimecodeScale);
 | 
				
			||||||
    Ebml_SerializeUnsigned(ebml_out, 0x4489, segmentInformation.Duration);
 | 
					    Ebml_SerializeUnsigned(ebml_out, 0x4489, segmentInformation.Duration);
 | 
				
			||||||
    // TODO date
 | 
					    //TODO date
 | 
				
			||||||
    Ebml_SerializeWString(ebml_out, 0x4D80, L"MKVMUX");
 | 
					    Ebml_SerializeWString(ebml_out, 0x4D80, L"MKVMUX");
 | 
				
			||||||
    Ebml_SerializeWString(ebml_out, 0x5741, segmentInformation.WritingApp);
 | 
					    Ebml_SerializeWString(ebml_out, 0x5741, segmentInformation.WritingApp);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -167,9 +173,9 @@ static void Mkv_WriteGenericTrackData(Ebml& ebml_out, TrackStruct& track)
 | 
				
			|||||||
void Mkv_WriteVideoTrack(Ebml& ebml_out, TrackStruct & track, VideoTrackStruct& video)
 | 
					void Mkv_WriteVideoTrack(Ebml& ebml_out, TrackStruct & track, VideoTrackStruct& video)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EbmlLoc trackHeadLoc, videoHeadLoc;
 | 
					    EbmlLoc trackHeadLoc, videoHeadLoc;
 | 
				
			||||||
    Ebml_StartSubElement(ebml_out, trackHeadLoc, 0xAE);  // start Track
 | 
					    Ebml_StartSubElement(ebml_out, trackHeadLoc, 0xAE);  //start Track
 | 
				
			||||||
    Mkv_WriteGenericTrackData(ebml_out, track);
 | 
					    Mkv_WriteGenericTrackData(ebml_out, track);
 | 
				
			||||||
    Ebml_StartSubElement(ebml_out, videoHeadLoc, 0xE0);  // start Video
 | 
					    Ebml_StartSubElement(ebml_out, videoHeadLoc, 0xE0);  //start Video
 | 
				
			||||||
    Ebml_SerializeUnsigned(ebml_out, 0x9A, video.FlagInterlaced ? 1 :0);
 | 
					    Ebml_SerializeUnsigned(ebml_out, 0x9A, video.FlagInterlaced ? 1 :0);
 | 
				
			||||||
    Ebml_SerializeUnsigned(ebml_out, 0xB0, video.PixelWidth);
 | 
					    Ebml_SerializeUnsigned(ebml_out, 0xB0, video.PixelWidth);
 | 
				
			||||||
    Ebml_SerializeUnsigned(ebml_out, 0xBA, video.PixelHeight);
 | 
					    Ebml_SerializeUnsigned(ebml_out, 0xBA, video.PixelHeight);
 | 
				
			||||||
@@ -187,7 +193,7 @@ void Mkv_WriteAudioTrack(Ebml& ebml_out, TrackStruct & track, AudioTrackStruct&
 | 
				
			|||||||
    EbmlLoc trackHeadLoc, audioHeadLoc;
 | 
					    EbmlLoc trackHeadLoc, audioHeadLoc;
 | 
				
			||||||
    Ebml_StartSubElement(ebml_out, trackHeadLoc, 0xAE);
 | 
					    Ebml_StartSubElement(ebml_out, trackHeadLoc, 0xAE);
 | 
				
			||||||
    Mkv_WriteGenericTrackData(ebml_out, track);
 | 
					    Mkv_WriteGenericTrackData(ebml_out, track);
 | 
				
			||||||
    Ebml_StartSubElement(ebml_out, audioHeadLoc, 0xE0);  // start Audio
 | 
					    Ebml_StartSubElement(ebml_out, audioHeadLoc, 0xE0);  //start Audio
 | 
				
			||||||
    Ebml_SerializeFloat(ebml_out, 0xB5, video.SamplingFrequency);
 | 
					    Ebml_SerializeFloat(ebml_out, 0xB5, video.SamplingFrequency);
 | 
				
			||||||
    Ebml_SerializeUnsigned(ebml_out, 0x9F, video.Channels);
 | 
					    Ebml_SerializeUnsigned(ebml_out, 0x9F, video.Channels);
 | 
				
			||||||
    Ebml_SerializeUnsigned(ebml_out, 0x6264, video.BitDepth);
 | 
					    Ebml_SerializeUnsigned(ebml_out, 0x6264, video.BitDepth);
 | 
				
			||||||
@@ -207,7 +213,7 @@ void Mkv_WriteSimpleBlockHead(Ebml& ebml_out,  EbmlLoc& ebmlLoc, SimpleBlockStru
 | 
				
			|||||||
    Ebml_Write1UInt(ebml_out, block.TrackNumber);
 | 
					    Ebml_Write1UInt(ebml_out, block.TrackNumber);
 | 
				
			||||||
    Ebml_WriteSigned16(ebml_out,block.TimeCode);
 | 
					    Ebml_WriteSigned16(ebml_out,block.TimeCode);
 | 
				
			||||||
    unsigned char flags = 0x00 | (block.iskey ? 0x80:0x00) | (block.lacing << 1) | block.discardable;
 | 
					    unsigned char flags = 0x00 | (block.iskey ? 0x80:0x00) | (block.lacing << 1) | block.discardable;
 | 
				
			||||||
    Ebml_Write1UInt(ebml_out, flags);  // TODO this may be the wrong function
 | 
					    Ebml_Write1UInt(ebml_out, flags);  //TODO this may be the wrong function
 | 
				
			||||||
    Ebml_Serialize(ebml_out, block.data, block.dataLength);
 | 
					    Ebml_Serialize(ebml_out, block.data, block.dataLength);
 | 
				
			||||||
    Ebml_EndSubElement(ebml_out,ebmlLoc);
 | 
					    Ebml_EndSubElement(ebml_out,ebmlLoc);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -17,8 +17,8 @@ void writeSimpleBock(EbmlGlobal *ebml, unsigned char trackNumber, unsigned short
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// these are helper functions
 | 
					// these are helper functions
 | 
				
			||||||
void writeHeader(EbmlGlobal *ebml);
 | 
					void writeHeader(EbmlGlobal *ebml);
 | 
				
			||||||
void writeSegmentInformation(EbmlGlobal *ebml, EbmlLoc *startInfo, unsigned long timeCodeScale, double duration);
 | 
					void writeSegmentInformation(EbmlGlobal *ebml, EbmlLoc* startInfo , unsigned long timeCodeScale, double duration);
 | 
				
			||||||
// this function is a helper only, it assumes a lot of defaults
 | 
					//this function is a helper only, it assumes a lot of defaults
 | 
				
			||||||
void writeVideoTrack(EbmlGlobal *ebml, unsigned int trackNumber, int flagLacing,
 | 
					void writeVideoTrack(EbmlGlobal *ebml, unsigned int trackNumber, int flagLacing,
 | 
				
			||||||
                     char *codecId, unsigned int pixelWidth, unsigned int pixelHeight,
 | 
					                     char *codecId, unsigned int pixelWidth, unsigned int pixelHeight,
 | 
				
			||||||
                     double frameRate);
 | 
					                     double frameRate);
 | 
				
			||||||
							
								
								
									
										63
									
								
								libmkv/testlibmkv.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								libmkv/testlibmkv.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,63 @@
 | 
				
			|||||||
 | 
					// Copyright (c) 2010 The WebM project authors. All Rights Reserved.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Use of this source code is governed by a BSD-style license
 | 
				
			||||||
 | 
					// that can be found in the LICENSE file in the root of the source
 | 
				
			||||||
 | 
					// tree. An additional intellectual property rights grant can be found
 | 
				
			||||||
 | 
					// in the file PATENTS.  All contributing project authors may
 | 
				
			||||||
 | 
					// be found in the AUTHORS file in the root of the source tree.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "EbmlIDs.h"
 | 
				
			||||||
 | 
					#include "EbmlBufferWriter.h"
 | 
				
			||||||
 | 
					#include "WebMElement.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					int main(int argc, char *argv[])
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    //init the datatype we're using for ebml output
 | 
				
			||||||
 | 
					    unsigned char data[8192];
 | 
				
			||||||
 | 
					    EbmlGlobal ebml;
 | 
				
			||||||
 | 
					    ebml.buf = data;
 | 
				
			||||||
 | 
					    ebml.offset = 0;
 | 
				
			||||||
 | 
					    ebml.length = 8192;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    writeHeader(&ebml);
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        EbmlLoc startSegment;
 | 
				
			||||||
 | 
					        Ebml_StartSubElement(&ebml, &startSegment, Segment); //segment
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            //segment info
 | 
				
			||||||
 | 
					            EbmlLoc startInfo;
 | 
				
			||||||
 | 
					            Ebml_StartSubElement(&ebml, &startInfo, Info);
 | 
				
			||||||
 | 
					            Ebml_SerializeString(&ebml, 0x4D80, "muxingAppLibMkv");
 | 
				
			||||||
 | 
					            Ebml_SerializeString(&ebml, 0x5741, "writingAppLibMkv");
 | 
				
			||||||
 | 
					            Ebml_EndSubElement(&ebml, &startInfo);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            EbmlLoc trackStart;
 | 
				
			||||||
 | 
					            Ebml_StartSubElement(&ebml, &trackStart, Tracks);
 | 
				
			||||||
 | 
					            writeVideoTrack(&ebml, 1, 1, "V_MS/VFW/FOURCC", 320, 240, 29.97);
 | 
				
			||||||
 | 
					            //writeAudioTrack(&ebml,2,1, "A_VORBIS", 32000, 1, NULL, 0);
 | 
				
			||||||
 | 
					            Ebml_EndSubElement(&ebml, &trackStart);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            EbmlLoc clusterStart;
 | 
				
			||||||
 | 
					            Ebml_StartSubElement(&ebml, &clusterStart, Cluster); //cluster
 | 
				
			||||||
 | 
					            Ebml_SerializeUnsigned(&ebml, Timecode, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            unsigned char someData[4] = {1, 2, 3, 4};
 | 
				
			||||||
 | 
					            writeSimpleBlock(&ebml, 1, 0, 1, 0, 0, someData, 4);
 | 
				
			||||||
 | 
					            Ebml_EndSubElement(&ebml, &clusterStart);
 | 
				
			||||||
 | 
					        }    //end cluster
 | 
				
			||||||
 | 
					        Ebml_EndSubElement(&ebml, &startSegment);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //dump ebml stuff to the file
 | 
				
			||||||
 | 
					    FILE *file_out = fopen("test.mkv", "wb");
 | 
				
			||||||
 | 
					    size_t bytesWritten = fwrite(data, 1, ebml.offset, file_out);
 | 
				
			||||||
 | 
					    fclose(file_out);
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										429
									
								
								libs.mk
									
									
									
									
									
								
							
							
						
						
									
										429
									
								
								libs.mk
									
									
									
									
									
								
							@@ -9,74 +9,12 @@
 | 
				
			|||||||
##
 | 
					##
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# ARM assembly files are written in RVCT-style. We use some make magic to
 | 
					ASM:=$(if $(filter yes,$(CONFIG_GCC)),.asm.s,.asm)
 | 
				
			||||||
# filter those files to allow GCC compilation
 | 
					 | 
				
			||||||
ifeq ($(ARCH_ARM),yes)
 | 
					 | 
				
			||||||
  ASM:=$(if $(filter yes,$(CONFIG_GCC)$(CONFIG_MSVS)),.asm.s,.asm)
 | 
					 | 
				
			||||||
else
 | 
					 | 
				
			||||||
  ASM:=.asm
 | 
					 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# Calculate platform- and compiler-specific offsets for hand coded assembly
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
ifeq ($(filter icc gcc,$(TGT_CC)), $(TGT_CC))
 | 
					 | 
				
			||||||
OFFSET_PATTERN:='^[a-zA-Z0-9_]* EQU'
 | 
					 | 
				
			||||||
define asm_offsets_template
 | 
					 | 
				
			||||||
$$(BUILD_PFX)$(1): $$(BUILD_PFX)$(2).S
 | 
					 | 
				
			||||||
	@echo "    [CREATE] $$@"
 | 
					 | 
				
			||||||
	$$(qexec)LC_ALL=C grep $$(OFFSET_PATTERN) $$< | tr -d '$$$$\#' $$(ADS2GAS) > $$@
 | 
					 | 
				
			||||||
$$(BUILD_PFX)$(2).S: $(2)
 | 
					 | 
				
			||||||
CLEAN-OBJS += $$(BUILD_PFX)$(1) $(2).S
 | 
					 | 
				
			||||||
endef
 | 
					 | 
				
			||||||
else
 | 
					 | 
				
			||||||
  ifeq ($(filter rvct,$(TGT_CC)), $(TGT_CC))
 | 
					 | 
				
			||||||
define asm_offsets_template
 | 
					 | 
				
			||||||
$$(BUILD_PFX)$(1): obj_int_extract
 | 
					 | 
				
			||||||
$$(BUILD_PFX)$(1): $$(BUILD_PFX)$(2).o
 | 
					 | 
				
			||||||
	@echo "    [CREATE] $$@"
 | 
					 | 
				
			||||||
	$$(qexec)./obj_int_extract rvds $$< $$(ADS2GAS) > $$@
 | 
					 | 
				
			||||||
OBJS-yes += $$(BUILD_PFX)$(2).o
 | 
					 | 
				
			||||||
CLEAN-OBJS += $$(BUILD_PFX)$(1)
 | 
					 | 
				
			||||||
$$(filter %$$(ASM).o,$$(OBJS-yes)): $$(BUILD_PFX)$(1)
 | 
					 | 
				
			||||||
endef
 | 
					 | 
				
			||||||
endif # rvct
 | 
					 | 
				
			||||||
endif # !gcc
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# Rule to generate runtime cpu detection files
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
define rtcd_h_template
 | 
					 | 
				
			||||||
$$(BUILD_PFX)$(1).h: $$(SRC_PATH_BARE)/$(2)
 | 
					 | 
				
			||||||
	@echo "    [CREATE] $$@"
 | 
					 | 
				
			||||||
	$$(qexec)$$(SRC_PATH_BARE)/build/make/rtcd.sh --arch=$$(TGT_ISA) \
 | 
					 | 
				
			||||||
          --sym=$(1) \
 | 
					 | 
				
			||||||
          --config=$$(CONFIG_DIR)$$(target)$$(if $$(FAT_ARCHS),,-$$(TOOLCHAIN)).mk \
 | 
					 | 
				
			||||||
          $$(RTCD_OPTIONS) $$^ > $$@
 | 
					 | 
				
			||||||
CLEAN-OBJS += $$(BUILD_PFX)$(1).h
 | 
					 | 
				
			||||||
RTCD += $$(BUILD_PFX)$(1).h
 | 
					 | 
				
			||||||
endef
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# x86inc.asm is not compatible with pic 32bit builds. Restrict
 | 
					 | 
				
			||||||
# files which use it to 64bit builds or 32bit without pic
 | 
					 | 
				
			||||||
USE_X86INC = no
 | 
					 | 
				
			||||||
ifeq ($(CONFIG_USE_X86INC),yes)
 | 
					 | 
				
			||||||
  USE_X86INC = yes
 | 
					 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
CODEC_SRCS-yes += CHANGELOG
 | 
					 | 
				
			||||||
CODEC_SRCS-yes += libs.mk
 | 
					CODEC_SRCS-yes += libs.mk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# If this is a universal (fat) binary, then all the subarchitectures have
 | 
					 | 
				
			||||||
# already been built and our job is to stitch them together. The
 | 
					 | 
				
			||||||
# BUILD_LIBVPX variable indicates whether we should be building
 | 
					 | 
				
			||||||
# (compiling, linking) the library. The LIPO_LIBVPX variable indicates
 | 
					 | 
				
			||||||
# that we're stitching.
 | 
					 | 
				
			||||||
$(eval $(if $(filter universal%,$(TOOLCHAIN)),LIPO_LIBVPX,BUILD_LIBVPX):=yes)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
include $(SRC_PATH_BARE)/vpx/vpx_codec.mk
 | 
					include $(SRC_PATH_BARE)/vpx/vpx_codec.mk
 | 
				
			||||||
CODEC_SRCS-yes += $(addprefix vpx/,$(call enabled,API_SRCS))
 | 
					CODEC_SRCS-yes += $(addprefix vpx/,$(call enabled,API_SRCS))
 | 
				
			||||||
CODEC_DOC_SRCS += $(addprefix vpx/,$(call enabled,API_DOC_SRCS))
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
include $(SRC_PATH_BARE)/vpx_mem/vpx_mem.mk
 | 
					include $(SRC_PATH_BARE)/vpx_mem/vpx_mem.mk
 | 
				
			||||||
CODEC_SRCS-yes += $(addprefix vpx_mem/,$(call enabled,MEM_SRCS))
 | 
					CODEC_SRCS-yes += $(addprefix vpx_mem/,$(call enabled,MEM_SRCS))
 | 
				
			||||||
@@ -84,60 +22,29 @@ CODEC_SRCS-yes += $(addprefix vpx_mem/,$(call enabled,MEM_SRCS))
 | 
				
			|||||||
include $(SRC_PATH_BARE)/vpx_scale/vpx_scale.mk
 | 
					include $(SRC_PATH_BARE)/vpx_scale/vpx_scale.mk
 | 
				
			||||||
CODEC_SRCS-yes += $(addprefix vpx_scale/,$(call enabled,SCALE_SRCS))
 | 
					CODEC_SRCS-yes += $(addprefix vpx_scale/,$(call enabled,SCALE_SRCS))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
include $(SRC_PATH_BARE)/vpx_ports/vpx_ports.mk
 | 
					 | 
				
			||||||
CODEC_SRCS-yes += $(addprefix vpx_ports/,$(call enabled,PORTS_SRCS))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
ifneq ($(CONFIG_VP8_ENCODER)$(CONFIG_VP8_DECODER),)
 | 
					 | 
				
			||||||
  VP8_PREFIX=vp8/
 | 
					 | 
				
			||||||
  include $(SRC_PATH_BARE)/$(VP8_PREFIX)vp8_common.mk
 | 
					 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
ifeq ($(CONFIG_VP8_ENCODER),yes)
 | 
					ifeq ($(CONFIG_VP8_ENCODER),yes)
 | 
				
			||||||
 | 
					  VP8_PREFIX=vp8/
 | 
				
			||||||
  include $(SRC_PATH_BARE)/$(VP8_PREFIX)vp8cx.mk
 | 
					  include $(SRC_PATH_BARE)/$(VP8_PREFIX)vp8cx.mk
 | 
				
			||||||
  CODEC_SRCS-yes += $(addprefix $(VP8_PREFIX),$(call enabled,VP8_CX_SRCS))
 | 
					  CODEC_SRCS-yes += $(addprefix $(VP8_PREFIX),$(call enabled,VP8_CX_SRCS))
 | 
				
			||||||
  CODEC_EXPORTS-yes += $(addprefix $(VP8_PREFIX),$(VP8_CX_EXPORTS))
 | 
					  CODEC_EXPORTS-yes += $(addprefix $(VP8_PREFIX),$(VP8_CX_EXPORTS))
 | 
				
			||||||
  INSTALL-LIBS-yes += include/vpx/vp8.h include/vpx/vp8cx.h
 | 
					  CODEC_SRCS-yes += $(VP8_PREFIX)vp8cx.mk vpx/vp8.h vpx/vp8cx.h vpx/vp8e.h
 | 
				
			||||||
 | 
					  INSTALL-LIBS-yes += include/vpx/vp8.h include/vpx/vp8e.h include/vpx/vp8cx.h
 | 
				
			||||||
  INSTALL_MAPS += include/vpx/% $(SRC_PATH_BARE)/$(VP8_PREFIX)/%
 | 
					  INSTALL_MAPS += include/vpx/% $(SRC_PATH_BARE)/$(VP8_PREFIX)/%
 | 
				
			||||||
 | 
					  CODEC_DOC_SRCS += vpx/vp8.h vpx/vp8cx.h
 | 
				
			||||||
  CODEC_DOC_SECTIONS += vp8 vp8_encoder
 | 
					  CODEC_DOC_SECTIONS += vp8 vp8_encoder
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ifeq ($(CONFIG_VP8_DECODER),yes)
 | 
					ifeq ($(CONFIG_VP8_DECODER),yes)
 | 
				
			||||||
 | 
					  VP8_PREFIX=vp8/
 | 
				
			||||||
  include $(SRC_PATH_BARE)/$(VP8_PREFIX)vp8dx.mk
 | 
					  include $(SRC_PATH_BARE)/$(VP8_PREFIX)vp8dx.mk
 | 
				
			||||||
  CODEC_SRCS-yes += $(addprefix $(VP8_PREFIX),$(call enabled,VP8_DX_SRCS))
 | 
					  CODEC_SRCS-yes += $(addprefix $(VP8_PREFIX),$(call enabled,VP8_DX_SRCS))
 | 
				
			||||||
  CODEC_EXPORTS-yes += $(addprefix $(VP8_PREFIX),$(VP8_DX_EXPORTS))
 | 
					  CODEC_EXPORTS-yes += $(addprefix $(VP8_PREFIX),$(VP8_DX_EXPORTS))
 | 
				
			||||||
 | 
					  CODEC_SRCS-yes += $(VP8_PREFIX)vp8dx.mk vpx/vp8.h vpx/vp8dx.h
 | 
				
			||||||
  INSTALL-LIBS-yes += include/vpx/vp8.h include/vpx/vp8dx.h
 | 
					  INSTALL-LIBS-yes += include/vpx/vp8.h include/vpx/vp8dx.h
 | 
				
			||||||
  INSTALL_MAPS += include/vpx/% $(SRC_PATH_BARE)/$(VP8_PREFIX)/%
 | 
					  INSTALL_MAPS += include/vpx/% $(SRC_PATH_BARE)/$(VP8_PREFIX)/%
 | 
				
			||||||
  CODEC_DOC_SECTIONS += vp8 vp8_decoder
 | 
					 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
ifneq ($(CONFIG_VP9_ENCODER)$(CONFIG_VP9_DECODER),)
 | 
					 | 
				
			||||||
  VP9_PREFIX=vp9/
 | 
					 | 
				
			||||||
  include $(SRC_PATH_BARE)/$(VP9_PREFIX)vp9_common.mk
 | 
					 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
ifeq ($(CONFIG_VP9_ENCODER),yes)
 | 
					 | 
				
			||||||
  VP9_PREFIX=vp9/
 | 
					 | 
				
			||||||
  include $(SRC_PATH_BARE)/$(VP9_PREFIX)vp9cx.mk
 | 
					 | 
				
			||||||
  CODEC_SRCS-yes += $(addprefix $(VP9_PREFIX),$(call enabled,VP9_CX_SRCS))
 | 
					 | 
				
			||||||
  CODEC_EXPORTS-yes += $(addprefix $(VP9_PREFIX),$(VP9_CX_EXPORTS))
 | 
					 | 
				
			||||||
  CODEC_SRCS-yes += $(VP9_PREFIX)vp9cx.mk vpx/vp8.h vpx/vp8cx.h
 | 
					 | 
				
			||||||
  INSTALL-LIBS-yes += include/vpx/vp8.h include/vpx/vp8cx.h
 | 
					 | 
				
			||||||
  INSTALL-LIBS-yes += include/vpx/svc_context.h
 | 
					 | 
				
			||||||
  INSTALL_MAPS += include/vpx/% $(SRC_PATH_BARE)/$(VP9_PREFIX)/%
 | 
					 | 
				
			||||||
  CODEC_DOC_SRCS += vpx/vp8.h vpx/vp8cx.h
 | 
					 | 
				
			||||||
  CODEC_DOC_SECTIONS += vp9 vp9_encoder
 | 
					 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
ifeq ($(CONFIG_VP9_DECODER),yes)
 | 
					 | 
				
			||||||
  VP9_PREFIX=vp9/
 | 
					 | 
				
			||||||
  include $(SRC_PATH_BARE)/$(VP9_PREFIX)vp9dx.mk
 | 
					 | 
				
			||||||
  CODEC_SRCS-yes += $(addprefix $(VP9_PREFIX),$(call enabled,VP9_DX_SRCS))
 | 
					 | 
				
			||||||
  CODEC_EXPORTS-yes += $(addprefix $(VP9_PREFIX),$(VP9_DX_EXPORTS))
 | 
					 | 
				
			||||||
  CODEC_SRCS-yes += $(VP9_PREFIX)vp9dx.mk vpx/vp8.h vpx/vp8dx.h
 | 
					 | 
				
			||||||
  INSTALL-LIBS-yes += include/vpx/vp8.h include/vpx/vp8dx.h
 | 
					 | 
				
			||||||
  INSTALL_MAPS += include/vpx/% $(SRC_PATH_BARE)/$(VP9_PREFIX)/%
 | 
					 | 
				
			||||||
  CODEC_DOC_SRCS += vpx/vp8.h vpx/vp8dx.h
 | 
					  CODEC_DOC_SRCS += vpx/vp8.h vpx/vp8dx.h
 | 
				
			||||||
  CODEC_DOC_SECTIONS += vp9 vp9_decoder
 | 
					  CODEC_DOC_SECTIONS += vp8 vp8_decoder
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -151,7 +58,6 @@ endif
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
ifeq ($(CONFIG_MSVS),yes)
 | 
					ifeq ($(CONFIG_MSVS),yes)
 | 
				
			||||||
CODEC_LIB=$(if $(CONFIG_STATIC_MSVCRT),vpxmt,vpxmd)
 | 
					CODEC_LIB=$(if $(CONFIG_STATIC_MSVCRT),vpxmt,vpxmd)
 | 
				
			||||||
GTEST_LIB=$(if $(CONFIG_STATIC_MSVCRT),gtestmt,gtestmd)
 | 
					 | 
				
			||||||
# This variable uses deferred expansion intentionally, since the results of
 | 
					# This variable uses deferred expansion intentionally, since the results of
 | 
				
			||||||
# $(wildcard) may change during the course of the Make.
 | 
					# $(wildcard) may change during the course of the Make.
 | 
				
			||||||
VS_PLATFORMS = $(foreach d,$(wildcard */Release/$(CODEC_LIB).lib),$(word 1,$(subst /, ,$(d))))
 | 
					VS_PLATFORMS = $(foreach d,$(wildcard */Release/$(CODEC_LIB).lib),$(word 1,$(subst /, ,$(d))))
 | 
				
			||||||
@@ -168,15 +74,27 @@ INSTALL_MAPS += $(foreach p,$(VS_PLATFORMS),$(LIBSUBDIR)/$(p)/%  $(p)/Release/%)
 | 
				
			|||||||
INSTALL_MAPS += $(foreach p,$(VS_PLATFORMS),$(LIBSUBDIR)/$(p)/%  $(p)/Debug/%)
 | 
					INSTALL_MAPS += $(foreach p,$(VS_PLATFORMS),$(LIBSUBDIR)/$(p)/%  $(p)/Debug/%)
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# If this is a universal (fat) binary, then all the subarchitectures have
 | 
				
			||||||
 | 
					# already been built and our job is to stitch them together. The
 | 
				
			||||||
 | 
					# BUILD_LIBVPX variable indicates whether we should be building
 | 
				
			||||||
 | 
					# (compiling, linking) the library. The LIPO_LIBVPX variable indicates
 | 
				
			||||||
 | 
					# that we're stitching.
 | 
				
			||||||
 | 
					$(eval $(if $(filter universal%,$(TOOLCHAIN)),LIPO_LIBVPX,BUILD_LIBVPX):=yes)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CODEC_SRCS-$(BUILD_LIBVPX) += build/make/version.sh
 | 
					CODEC_SRCS-$(BUILD_LIBVPX) += build/make/version.sh
 | 
				
			||||||
CODEC_SRCS-$(BUILD_LIBVPX) += build/make/rtcd.sh
 | 
					CODEC_SRCS-$(BUILD_LIBVPX) += vpx/vpx_integer.h
 | 
				
			||||||
CODEC_SRCS-$(BUILD_LIBVPX) += vpx_ports/emmintrin_compat.h
 | 
					CODEC_SRCS-$(BUILD_LIBVPX) += vpx_ports/vpx_timer.h
 | 
				
			||||||
CODEC_SRCS-$(BUILD_LIBVPX) += vpx_ports/vpx_once.h
 | 
					CODEC_SRCS-$(BUILD_LIBVPX) += vpx_ports/mem.h
 | 
				
			||||||
CODEC_SRCS-$(BUILD_LIBVPX) += $(BUILD_PFX)vpx_config.c
 | 
					CODEC_SRCS-$(BUILD_LIBVPX) += $(BUILD_PFX)vpx_config.c
 | 
				
			||||||
INSTALL-SRCS-no += $(BUILD_PFX)vpx_config.c
 | 
					INSTALL-SRCS-no += $(BUILD_PFX)vpx_config.c
 | 
				
			||||||
ifeq ($(ARCH_X86)$(ARCH_X86_64),yes)
 | 
					ifeq ($(ARCH_X86)$(ARCH_X86_64),yes)
 | 
				
			||||||
CODEC_SRCS-$(BUILD_LIBVPX) += third_party/x86inc/x86inc.asm
 | 
					CODEC_SRCS-$(BUILD_LIBVPX) += vpx_ports/emms.asm
 | 
				
			||||||
 | 
					CODEC_SRCS-$(BUILD_LIBVPX) += vpx_ports/x86.h
 | 
				
			||||||
 | 
					CODEC_SRCS-$(BUILD_LIBVPX) += vpx_ports/x86_abi_support.asm
 | 
				
			||||||
 | 
					CODEC_SRCS-$(BUILD_LIBVPX) += vpx_ports/x86_cpuid.c
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
 | 
					CODEC_SRCS-$(ARCH_ARM) += vpx_ports/arm_cpudetect.c
 | 
				
			||||||
 | 
					CODEC_SRCS-$(ARCH_ARM) += $(BUILD_PFX)vpx_config.asm
 | 
				
			||||||
CODEC_EXPORTS-$(BUILD_LIBVPX) += vpx/exports_com
 | 
					CODEC_EXPORTS-$(BUILD_LIBVPX) += vpx/exports_com
 | 
				
			||||||
CODEC_EXPORTS-$(CONFIG_ENCODERS) += vpx/exports_enc
 | 
					CODEC_EXPORTS-$(CONFIG_ENCODERS) += vpx/exports_enc
 | 
				
			||||||
CODEC_EXPORTS-$(CONFIG_DECODERS) += vpx/exports_dec
 | 
					CODEC_EXPORTS-$(CONFIG_DECODERS) += vpx/exports_dec
 | 
				
			||||||
@@ -184,7 +102,10 @@ CODEC_EXPORTS-$(CONFIG_DECODERS) += vpx/exports_dec
 | 
				
			|||||||
INSTALL-LIBS-yes += include/vpx/vpx_codec.h
 | 
					INSTALL-LIBS-yes += include/vpx/vpx_codec.h
 | 
				
			||||||
INSTALL-LIBS-yes += include/vpx/vpx_image.h
 | 
					INSTALL-LIBS-yes += include/vpx/vpx_image.h
 | 
				
			||||||
INSTALL-LIBS-yes += include/vpx/vpx_integer.h
 | 
					INSTALL-LIBS-yes += include/vpx/vpx_integer.h
 | 
				
			||||||
 | 
					INSTALL-LIBS-yes += include/vpx/vpx_codec_impl_top.h
 | 
				
			||||||
 | 
					INSTALL-LIBS-yes += include/vpx/vpx_codec_impl_bottom.h
 | 
				
			||||||
INSTALL-LIBS-$(CONFIG_DECODERS) += include/vpx/vpx_decoder.h
 | 
					INSTALL-LIBS-$(CONFIG_DECODERS) += include/vpx/vpx_decoder.h
 | 
				
			||||||
 | 
					INSTALL-LIBS-$(CONFIG_DECODERS) += include/vpx/vpx_decoder_compat.h
 | 
				
			||||||
INSTALL-LIBS-$(CONFIG_ENCODERS) += include/vpx/vpx_encoder.h
 | 
					INSTALL-LIBS-$(CONFIG_ENCODERS) += include/vpx/vpx_encoder.h
 | 
				
			||||||
ifeq ($(CONFIG_EXTERNAL_BUILD),yes)
 | 
					ifeq ($(CONFIG_EXTERNAL_BUILD),yes)
 | 
				
			||||||
ifeq ($(CONFIG_MSVS),yes)
 | 
					ifeq ($(CONFIG_MSVS),yes)
 | 
				
			||||||
@@ -194,7 +115,7 @@ INSTALL-LIBS-$(CONFIG_SHARED) += $(foreach p,$(VS_PLATFORMS),$(LIBSUBDIR)/$(p)/v
 | 
				
			|||||||
INSTALL-LIBS-$(CONFIG_SHARED) += $(foreach p,$(VS_PLATFORMS),$(LIBSUBDIR)/$(p)/vpx.exp)
 | 
					INSTALL-LIBS-$(CONFIG_SHARED) += $(foreach p,$(VS_PLATFORMS),$(LIBSUBDIR)/$(p)/vpx.exp)
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
else
 | 
					else
 | 
				
			||||||
INSTALL-LIBS-$(CONFIG_STATIC) += $(LIBSUBDIR)/libvpx.a
 | 
					INSTALL-LIBS-yes += $(LIBSUBDIR)/libvpx.a
 | 
				
			||||||
INSTALL-LIBS-$(CONFIG_DEBUG_LIBS) += $(LIBSUBDIR)/libvpx_g.a
 | 
					INSTALL-LIBS-$(CONFIG_DEBUG_LIBS) += $(LIBSUBDIR)/libvpx_g.a
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -202,89 +123,72 @@ CODEC_SRCS=$(call enabled,CODEC_SRCS)
 | 
				
			|||||||
INSTALL-SRCS-$(CONFIG_CODEC_SRCS) += $(CODEC_SRCS)
 | 
					INSTALL-SRCS-$(CONFIG_CODEC_SRCS) += $(CODEC_SRCS)
 | 
				
			||||||
INSTALL-SRCS-$(CONFIG_CODEC_SRCS) += $(call enabled,CODEC_EXPORTS)
 | 
					INSTALL-SRCS-$(CONFIG_CODEC_SRCS) += $(call enabled,CODEC_EXPORTS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
# Generate a list of all enabled sources, in particular for exporting to gyp
 | 
					 | 
				
			||||||
# based build systems.
 | 
					 | 
				
			||||||
libvpx_srcs.txt:
 | 
					 | 
				
			||||||
	@echo "    [CREATE] $@"
 | 
					 | 
				
			||||||
	@echo $(CODEC_SRCS) | xargs -n1 echo | sort -u > $@
 | 
					 | 
				
			||||||
CLEAN-OBJS += libvpx_srcs.txt
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
ifeq ($(CONFIG_EXTERNAL_BUILD),yes)
 | 
					ifeq ($(CONFIG_EXTERNAL_BUILD),yes)
 | 
				
			||||||
ifeq ($(CONFIG_MSVS),yes)
 | 
					ifeq ($(CONFIG_MSVS),yes)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
obj_int_extract.$(VCPROJ_SFX): $(SRC_PATH_BARE)/build/make/obj_int_extract.c
 | 
					ifeq ($(ARCH_ARM),yes)
 | 
				
			||||||
	@cp $(SRC_PATH_BARE)/build/$(MSVS_ARCH_DIR)/obj_int_extract.bat .
 | 
					ifeq ($(HAVE_ARMV5TE),yes)
 | 
				
			||||||
 | 
					ARM_ARCH=v5
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					ifeq ($(HAVE_ARMV6),yes)
 | 
				
			||||||
 | 
					ARM_ARCH=v6
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					obj_int_extract.vcproj: $(SRC_PATH_BARE)/build/make/obj_int_extract.c
 | 
				
			||||||
 | 
						@cp $(SRC_PATH_BARE)/build/arm-wince-vs8/obj_int_extract.bat .
 | 
				
			||||||
	@echo "    [CREATE] $@"
 | 
						@echo "    [CREATE] $@"
 | 
				
			||||||
	$(qexec)$(GEN_VCPROJ) \
 | 
						$(SRC_PATH_BARE)/build/make/gen_msvs_proj.sh\
 | 
				
			||||||
    --exe \
 | 
								--exe\
 | 
				
			||||||
    --target=$(TOOLCHAIN) \
 | 
								--target=$(TOOLCHAIN)\
 | 
				
			||||||
    --name=obj_int_extract \
 | 
					            $(if $(CONFIG_STATIC_MSVCRT),--static-crt) \
 | 
				
			||||||
    --ver=$(CONFIG_VS_VERSION) \
 | 
					            --name=obj_int_extract\
 | 
				
			||||||
    --proj-guid=E1360C65-D375-4335-8057-7ED99CC3F9B2 \
 | 
					            --proj-guid=E1360C65-D375-4335-8057-7ED99CC3F9B2\
 | 
				
			||||||
    $(if $(CONFIG_STATIC_MSVCRT),--static-crt) \
 | 
					            --out=$@ $^\
 | 
				
			||||||
    --out=$@ $^ \
 | 
					            -I".";"$(SRC_PATH_BARE)"
 | 
				
			||||||
    -I. \
 | 
					 | 
				
			||||||
    -I"$(SRC_PATH_BARE)" \
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
PROJECTS-$(BUILD_LIBVPX) += obj_int_extract.$(VCPROJ_SFX)
 | 
					PROJECTS-$(BUILD_LIBVPX) += obj_int_extract.vcproj
 | 
				
			||||||
 | 
					PROJECTS-$(BUILD_LIBVPX) += obj_int_extract.bat
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
vpx.def: $(call enabled,CODEC_EXPORTS)
 | 
					vpx.def: $(call enabled,CODEC_EXPORTS)
 | 
				
			||||||
	@echo "    [CREATE] $@"
 | 
						@echo "    [CREATE] $@"
 | 
				
			||||||
	$(qexec)$(SRC_PATH_BARE)/build/make/gen_msvs_def.sh\
 | 
						$(SRC_PATH_BARE)/build/make/gen_msvs_def.sh\
 | 
				
			||||||
            --name=vpx\
 | 
					            --name=vpx\
 | 
				
			||||||
            --out=$@ $^
 | 
					            --out=$@ $^
 | 
				
			||||||
CLEAN-OBJS += vpx.def
 | 
					CLEAN-OBJS += vpx.def
 | 
				
			||||||
 | 
					
 | 
				
			||||||
vpx.$(VCPROJ_SFX): $(CODEC_SRCS) vpx.def obj_int_extract.$(VCPROJ_SFX)
 | 
					vpx.vcproj: $(CODEC_SRCS) vpx.def
 | 
				
			||||||
	@echo "    [CREATE] $@"
 | 
						@echo "    [CREATE] $@"
 | 
				
			||||||
	$(qexec)$(GEN_VCPROJ) \
 | 
						$(SRC_PATH_BARE)/build/make/gen_msvs_proj.sh\
 | 
				
			||||||
            $(if $(CONFIG_SHARED),--dll,--lib) \
 | 
								--lib\
 | 
				
			||||||
            --target=$(TOOLCHAIN) \
 | 
								--target=$(TOOLCHAIN)\
 | 
				
			||||||
            $(if $(CONFIG_STATIC_MSVCRT),--static-crt) \
 | 
					            $(if $(CONFIG_STATIC_MSVCRT),--static-crt) \
 | 
				
			||||||
            --name=vpx \
 | 
					            --name=vpx\
 | 
				
			||||||
            --proj-guid=DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74 \
 | 
					            --proj-guid=DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74\
 | 
				
			||||||
            --module-def=vpx.def \
 | 
					            --module-def=vpx.def\
 | 
				
			||||||
            --ver=$(CONFIG_VS_VERSION) \
 | 
					            --ver=$(CONFIG_VS_VERSION)\
 | 
				
			||||||
            --out=$@ $(CFLAGS) $^ \
 | 
					            --out=$@ $(CFLAGS) $^\
 | 
				
			||||||
            --src-path-bare="$(SRC_PATH_BARE)" \
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
PROJECTS-$(BUILD_LIBVPX) += vpx.$(VCPROJ_SFX)
 | 
					PROJECTS-$(BUILD_LIBVPX) += vpx.vcproj
 | 
				
			||||||
 | 
					
 | 
				
			||||||
vpx.$(VCPROJ_SFX): vpx_config.asm
 | 
					vpx.vcproj: vpx_config.asm
 | 
				
			||||||
vpx.$(VCPROJ_SFX): $(RTCD)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
else
 | 
					else
 | 
				
			||||||
LIBVPX_OBJS=$(call objs,$(CODEC_SRCS))
 | 
					LIBVPX_OBJS=$(call objs,$(CODEC_SRCS))
 | 
				
			||||||
OBJS-$(BUILD_LIBVPX) += $(LIBVPX_OBJS)
 | 
					OBJS-$(BUILD_LIBVPX) += $(LIBVPX_OBJS)
 | 
				
			||||||
LIBS-$(if $(BUILD_LIBVPX),$(CONFIG_STATIC)) += $(BUILD_PFX)libvpx.a $(BUILD_PFX)libvpx_g.a
 | 
					LIBS-$(BUILD_LIBVPX) += $(BUILD_PFX)libvpx.a $(BUILD_PFX)libvpx_g.a
 | 
				
			||||||
$(BUILD_PFX)libvpx_g.a: $(LIBVPX_OBJS)
 | 
					$(BUILD_PFX)libvpx_g.a: $(LIBVPX_OBJS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
BUILD_LIBVPX_SO         := $(if $(BUILD_LIBVPX),$(CONFIG_SHARED))
 | 
					BUILD_LIBVPX_SO         := $(if $(BUILD_LIBVPX),$(CONFIG_SHARED))
 | 
				
			||||||
 | 
					 | 
				
			||||||
ifeq ($(filter darwin%,$(TGT_OS)),$(TGT_OS))
 | 
					 | 
				
			||||||
LIBVPX_SO               := libvpx.$(VERSION_MAJOR).dylib
 | 
					 | 
				
			||||||
EXPORT_FILE             := libvpx.syms
 | 
					 | 
				
			||||||
LIBVPX_SO_SYMLINKS      := $(addprefix $(LIBSUBDIR)/, \
 | 
					 | 
				
			||||||
                             libvpx.dylib  )
 | 
					 | 
				
			||||||
else
 | 
					 | 
				
			||||||
LIBVPX_SO               := libvpx.so.$(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_PATCH)
 | 
					LIBVPX_SO               := libvpx.so.$(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_PATCH)
 | 
				
			||||||
EXPORT_FILE             := libvpx.ver
 | 
					LIBS-$(BUILD_LIBVPX_SO) += $(BUILD_PFX)$(LIBVPX_SO)
 | 
				
			||||||
SYM_LINK                := libvpx.so
 | 
					$(BUILD_PFX)$(LIBVPX_SO): $(LIBVPX_OBJS) libvpx.ver
 | 
				
			||||||
 | 
					$(BUILD_PFX)$(LIBVPX_SO): extralibs += -lm -pthread
 | 
				
			||||||
 | 
					$(BUILD_PFX)$(LIBVPX_SO): SONAME = libvpx.so.$(VERSION_MAJOR)
 | 
				
			||||||
 | 
					$(BUILD_PFX)$(LIBVPX_SO): SO_VERSION_SCRIPT = libvpx.ver
 | 
				
			||||||
LIBVPX_SO_SYMLINKS      := $(addprefix $(LIBSUBDIR)/, \
 | 
					LIBVPX_SO_SYMLINKS      := $(addprefix $(LIBSUBDIR)/, \
 | 
				
			||||||
                             libvpx.so libvpx.so.$(VERSION_MAJOR) \
 | 
					                             libvpx.so libvpx.so.$(VERSION_MAJOR) \
 | 
				
			||||||
                             libvpx.so.$(VERSION_MAJOR).$(VERSION_MINOR))
 | 
					                             libvpx.so.$(VERSION_MAJOR).$(VERSION_MINOR))
 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
LIBS-$(BUILD_LIBVPX_SO) += $(BUILD_PFX)$(LIBVPX_SO)\
 | 
					 | 
				
			||||||
                           $(notdir $(LIBVPX_SO_SYMLINKS))
 | 
					 | 
				
			||||||
$(BUILD_PFX)$(LIBVPX_SO): $(LIBVPX_OBJS) $(EXPORT_FILE)
 | 
					 | 
				
			||||||
$(BUILD_PFX)$(LIBVPX_SO): extralibs += -lm
 | 
					 | 
				
			||||||
$(BUILD_PFX)$(LIBVPX_SO): SONAME = libvpx.so.$(VERSION_MAJOR)
 | 
					 | 
				
			||||||
$(BUILD_PFX)$(LIBVPX_SO): EXPORTS_FILE = $(EXPORT_FILE)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
libvpx.ver: $(call enabled,CODEC_EXPORTS)
 | 
					libvpx.ver: $(call enabled,CODEC_EXPORTS)
 | 
				
			||||||
	@echo "    [CREATE] $@"
 | 
						@echo "    [CREATE] $@"
 | 
				
			||||||
@@ -293,54 +197,12 @@ libvpx.ver: $(call enabled,CODEC_EXPORTS)
 | 
				
			|||||||
	$(qexec)echo "local: *; };" >> $@
 | 
						$(qexec)echo "local: *; };" >> $@
 | 
				
			||||||
CLEAN-OBJS += libvpx.ver
 | 
					CLEAN-OBJS += libvpx.ver
 | 
				
			||||||
 | 
					
 | 
				
			||||||
libvpx.syms: $(call enabled,CODEC_EXPORTS)
 | 
					$(addprefix $(DIST_DIR)/,$(LIBVPX_SO_SYMLINKS)):
 | 
				
			||||||
	@echo "    [CREATE] $@"
 | 
						@echo "    [LN]      $@"
 | 
				
			||||||
	$(qexec)awk '{print "_"$$2}' $^ >$@
 | 
						$(qexec)ln -sf $(LIBVPX_SO) $@
 | 
				
			||||||
CLEAN-OBJS += libvpx.syms
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
define libvpx_symlink_template
 | 
					INSTALL-LIBS-$(CONFIG_SHARED) += $(LIBVPX_SO_SYMLINKS)
 | 
				
			||||||
$(1): $(2)
 | 
					INSTALL-LIBS-$(CONFIG_SHARED) += $(LIBSUBDIR)/$(LIBVPX_SO)
 | 
				
			||||||
	@echo "    [LN]     $(2) $$@"
 | 
					 | 
				
			||||||
	$(qexec)mkdir -p $$(dir $$@)
 | 
					 | 
				
			||||||
	$(qexec)ln -sf $(2) $$@
 | 
					 | 
				
			||||||
endef
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(eval $(call libvpx_symlink_template,\
 | 
					 | 
				
			||||||
    $(addprefix $(BUILD_PFX),$(notdir $(LIBVPX_SO_SYMLINKS))),\
 | 
					 | 
				
			||||||
    $(BUILD_PFX)$(LIBVPX_SO)))
 | 
					 | 
				
			||||||
$(eval $(call libvpx_symlink_template,\
 | 
					 | 
				
			||||||
    $(addprefix $(DIST_DIR)/,$(LIBVPX_SO_SYMLINKS)),\
 | 
					 | 
				
			||||||
    $(LIBVPX_SO)))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
INSTALL-LIBS-$(BUILD_LIBVPX_SO) += $(LIBVPX_SO_SYMLINKS)
 | 
					 | 
				
			||||||
INSTALL-LIBS-$(BUILD_LIBVPX_SO) += $(LIBSUBDIR)/$(LIBVPX_SO)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
LIBS-$(BUILD_LIBVPX) += vpx.pc
 | 
					 | 
				
			||||||
vpx.pc: config.mk libs.mk
 | 
					 | 
				
			||||||
	@echo "    [CREATE] $@"
 | 
					 | 
				
			||||||
	$(qexec)echo '# pkg-config file from libvpx $(VERSION_STRING)' > $@
 | 
					 | 
				
			||||||
	$(qexec)echo 'prefix=$(PREFIX)' >> $@
 | 
					 | 
				
			||||||
	$(qexec)echo 'exec_prefix=$${prefix}' >> $@
 | 
					 | 
				
			||||||
	$(qexec)echo 'libdir=$${prefix}/$(LIBSUBDIR)' >> $@
 | 
					 | 
				
			||||||
	$(qexec)echo 'includedir=$${prefix}/include' >> $@
 | 
					 | 
				
			||||||
	$(qexec)echo '' >> $@
 | 
					 | 
				
			||||||
	$(qexec)echo 'Name: vpx' >> $@
 | 
					 | 
				
			||||||
	$(qexec)echo 'Description: WebM Project VPx codec implementation' >> $@
 | 
					 | 
				
			||||||
	$(qexec)echo 'Version: $(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_PATCH)' >> $@
 | 
					 | 
				
			||||||
	$(qexec)echo 'Requires:' >> $@
 | 
					 | 
				
			||||||
	$(qexec)echo 'Conflicts:' >> $@
 | 
					 | 
				
			||||||
	$(qexec)echo 'Libs: -L$${libdir} -lvpx -lm' >> $@
 | 
					 | 
				
			||||||
ifeq ($(HAVE_PTHREAD_H),yes)
 | 
					 | 
				
			||||||
	$(qexec)echo 'Libs.private: -lm -lpthread' >> $@
 | 
					 | 
				
			||||||
else
 | 
					 | 
				
			||||||
	$(qexec)echo 'Libs.private: -lm' >> $@
 | 
					 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
	$(qexec)echo 'Cflags: -I$${includedir}' >> $@
 | 
					 | 
				
			||||||
INSTALL-LIBS-yes += $(LIBSUBDIR)/pkgconfig/vpx.pc
 | 
					 | 
				
			||||||
INSTALL_MAPS += $(LIBSUBDIR)/pkgconfig/%.pc %.pc
 | 
					 | 
				
			||||||
CLEAN-OBJS += vpx.pc
 | 
					 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LIBS-$(LIPO_LIBVPX) += libvpx.a
 | 
					LIBS-$(LIPO_LIBVPX) += libvpx.a
 | 
				
			||||||
@@ -368,147 +230,18 @@ endif
 | 
				
			|||||||
#
 | 
					#
 | 
				
			||||||
# Add assembler dependencies for configuration and offsets
 | 
					# Add assembler dependencies for configuration and offsets
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
$(filter %.s.o,$(OBJS-yes)):     $(BUILD_PFX)vpx_config.asm
 | 
					#$(filter %$(ASM).o,$(OBJS-yes)): $(BUILD_PFX)vpx_config.asm $(BUILD_PFX)vpx_asm_offsets.asm
 | 
				
			||||||
$(filter %$(ASM).o,$(OBJS-yes)): $(BUILD_PFX)vpx_config.asm
 | 
					$(filter %.s.o,$(OBJS-yes)):   $(BUILD_PFX)vpx_config.asm
 | 
				
			||||||
 | 
					$(filter %.asm.o,$(OBJS-yes)): $(BUILD_PFX)vpx_config.asm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$(shell $(SRC_PATH_BARE)/build/make/version.sh "$(SRC_PATH_BARE)" $(BUILD_PFX)vpx_version.h)
 | 
					$(shell $(SRC_PATH_BARE)/build/make/version.sh "$(SRC_PATH_BARE)" $(BUILD_PFX)vpx_version.h)
 | 
				
			||||||
CLEAN-OBJS += $(BUILD_PFX)vpx_version.h
 | 
					CLEAN-OBJS += $(BUILD_PFX)vpx_version.h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CODEC_DOC_SRCS += vpx/vpx_codec.h \
 | 
				
			||||||
 | 
					                  vpx/vpx_decoder.h \
 | 
				
			||||||
 | 
					                  vpx/vpx_encoder.h \
 | 
				
			||||||
 | 
					                  vpx/vpx_image.h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
##
 | 
					 | 
				
			||||||
## libvpx test directives
 | 
					 | 
				
			||||||
##
 | 
					 | 
				
			||||||
ifeq ($(CONFIG_UNIT_TESTS),yes)
 | 
					 | 
				
			||||||
LIBVPX_TEST_DATA_PATH ?= .
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
include $(SRC_PATH_BARE)/test/test.mk
 | 
					 | 
				
			||||||
LIBVPX_TEST_SRCS=$(addprefix test/,$(call enabled,LIBVPX_TEST_SRCS))
 | 
					 | 
				
			||||||
LIBVPX_TEST_BINS=./test_libvpx$(EXE_SFX)
 | 
					 | 
				
			||||||
LIBVPX_TEST_DATA=$(addprefix $(LIBVPX_TEST_DATA_PATH)/,\
 | 
					 | 
				
			||||||
                     $(call enabled,LIBVPX_TEST_DATA))
 | 
					 | 
				
			||||||
libvpx_test_data_url=http://downloads.webmproject.org/test_data/libvpx/$(1)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
libvpx_test_srcs.txt:
 | 
					 | 
				
			||||||
	@echo "    [CREATE] $@"
 | 
					 | 
				
			||||||
	@echo $(LIBVPX_TEST_SRCS) | xargs -n1 echo | sort -u > $@
 | 
					 | 
				
			||||||
CLEAN-OBJS += libvpx_test_srcs.txt
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(LIBVPX_TEST_DATA): $(SRC_PATH_BARE)/test/test-data.sha1
 | 
					 | 
				
			||||||
	@echo "    [DOWNLOAD] $@"
 | 
					 | 
				
			||||||
	$(qexec)trap 'rm -f $@' INT TERM &&\
 | 
					 | 
				
			||||||
            curl -L -o $@ $(call libvpx_test_data_url,$(@F))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
testdata:: $(LIBVPX_TEST_DATA)
 | 
					 | 
				
			||||||
	$(qexec)if [ -x "$$(which sha1sum)" ]; then\
 | 
					 | 
				
			||||||
            echo "Checking test data:";\
 | 
					 | 
				
			||||||
            if [ -n "$(LIBVPX_TEST_DATA)" ]; then\
 | 
					 | 
				
			||||||
                for f in $(call enabled,LIBVPX_TEST_DATA); do\
 | 
					 | 
				
			||||||
                    grep $$f $(SRC_PATH_BARE)/test/test-data.sha1 |\
 | 
					 | 
				
			||||||
                        (cd $(LIBVPX_TEST_DATA_PATH); sha1sum -c);\
 | 
					 | 
				
			||||||
                done; \
 | 
					 | 
				
			||||||
            fi; \
 | 
					 | 
				
			||||||
        else\
 | 
					 | 
				
			||||||
            echo "Skipping test data integrity check, sha1sum not found.";\
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
ifeq ($(CONFIG_EXTERNAL_BUILD),yes)
 | 
					 | 
				
			||||||
ifeq ($(CONFIG_MSVS),yes)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
gtest.$(VCPROJ_SFX): $(SRC_PATH_BARE)/third_party/googletest/src/src/gtest-all.cc
 | 
					 | 
				
			||||||
	@echo "    [CREATE] $@"
 | 
					 | 
				
			||||||
	$(qexec)$(GEN_VCPROJ) \
 | 
					 | 
				
			||||||
            --lib \
 | 
					 | 
				
			||||||
            --target=$(TOOLCHAIN) \
 | 
					 | 
				
			||||||
            $(if $(CONFIG_STATIC_MSVCRT),--static-crt) \
 | 
					 | 
				
			||||||
            --name=gtest \
 | 
					 | 
				
			||||||
            --proj-guid=EC00E1EC-AF68-4D92-A255-181690D1C9B1 \
 | 
					 | 
				
			||||||
            --ver=$(CONFIG_VS_VERSION) \
 | 
					 | 
				
			||||||
            --src-path-bare="$(SRC_PATH_BARE)" \
 | 
					 | 
				
			||||||
            -D_VARIADIC_MAX=10 \
 | 
					 | 
				
			||||||
            --out=gtest.$(VCPROJ_SFX) $(SRC_PATH_BARE)/third_party/googletest/src/src/gtest-all.cc \
 | 
					 | 
				
			||||||
            -I. -I"$(SRC_PATH_BARE)/third_party/googletest/src/include" -I"$(SRC_PATH_BARE)/third_party/googletest/src"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
PROJECTS-$(CONFIG_MSVS) += gtest.$(VCPROJ_SFX)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
test_libvpx.$(VCPROJ_SFX): $(LIBVPX_TEST_SRCS) vpx.$(VCPROJ_SFX) gtest.$(VCPROJ_SFX)
 | 
					 | 
				
			||||||
	@echo "    [CREATE] $@"
 | 
					 | 
				
			||||||
	$(qexec)$(GEN_VCPROJ) \
 | 
					 | 
				
			||||||
            --exe \
 | 
					 | 
				
			||||||
            --target=$(TOOLCHAIN) \
 | 
					 | 
				
			||||||
            --name=test_libvpx \
 | 
					 | 
				
			||||||
            -D_VARIADIC_MAX=10 \
 | 
					 | 
				
			||||||
            --proj-guid=CD837F5F-52D8-4314-A370-895D614166A7 \
 | 
					 | 
				
			||||||
            --ver=$(CONFIG_VS_VERSION) \
 | 
					 | 
				
			||||||
            $(if $(CONFIG_STATIC_MSVCRT),--static-crt) \
 | 
					 | 
				
			||||||
            --out=$@ $(INTERNAL_CFLAGS) $(CFLAGS) \
 | 
					 | 
				
			||||||
            -I. -I"$(SRC_PATH_BARE)/third_party/googletest/src/include" \
 | 
					 | 
				
			||||||
            -L. -l$(CODEC_LIB) -l$(GTEST_LIB) $^
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
PROJECTS-$(CONFIG_MSVS) += test_libvpx.$(VCPROJ_SFX)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
LIBVPX_TEST_BINS := $(addprefix $(TGT_OS:win64=x64)/Release/,$(notdir $(LIBVPX_TEST_BINS)))
 | 
					 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
else
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
include $(SRC_PATH_BARE)/third_party/googletest/gtest.mk
 | 
					 | 
				
			||||||
GTEST_SRCS := $(addprefix third_party/googletest/src/,$(call enabled,GTEST_SRCS))
 | 
					 | 
				
			||||||
GTEST_OBJS=$(call objs,$(GTEST_SRCS))
 | 
					 | 
				
			||||||
ifeq ($(filter win%,$(TGT_OS)),$(TGT_OS))
 | 
					 | 
				
			||||||
# Disabling pthreads globally will cause issues on darwin and possibly elsewhere
 | 
					 | 
				
			||||||
$(GTEST_OBJS) $(GTEST_OBJS:.o=.d): CXXFLAGS += -DGTEST_HAS_PTHREAD=0
 | 
					 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
$(GTEST_OBJS) $(GTEST_OBJS:.o=.d): CXXFLAGS += -I$(SRC_PATH_BARE)/third_party/googletest/src
 | 
					 | 
				
			||||||
$(GTEST_OBJS) $(GTEST_OBJS:.o=.d): CXXFLAGS += -I$(SRC_PATH_BARE)/third_party/googletest/src/include
 | 
					 | 
				
			||||||
OBJS-$(BUILD_LIBVPX) += $(GTEST_OBJS)
 | 
					 | 
				
			||||||
LIBS-$(BUILD_LIBVPX) += $(BUILD_PFX)libgtest.a $(BUILD_PFX)libgtest_g.a
 | 
					 | 
				
			||||||
$(BUILD_PFX)libgtest_g.a: $(GTEST_OBJS)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
LIBVPX_TEST_OBJS=$(sort $(call objs,$(LIBVPX_TEST_SRCS)))
 | 
					 | 
				
			||||||
$(LIBVPX_TEST_OBJS) $(LIBVPX_TEST_OBJS:.o=.d): CXXFLAGS += -I$(SRC_PATH_BARE)/third_party/googletest/src
 | 
					 | 
				
			||||||
$(LIBVPX_TEST_OBJS) $(LIBVPX_TEST_OBJS:.o=.d): CXXFLAGS += -I$(SRC_PATH_BARE)/third_party/googletest/src/include
 | 
					 | 
				
			||||||
OBJS-$(BUILD_LIBVPX) += $(LIBVPX_TEST_OBJS)
 | 
					 | 
				
			||||||
BINS-$(BUILD_LIBVPX) += $(LIBVPX_TEST_BINS)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Install test sources only if codec source is included
 | 
					 | 
				
			||||||
INSTALL-SRCS-$(CONFIG_CODEC_SRCS) += $(patsubst $(SRC_PATH_BARE)/%,%,\
 | 
					 | 
				
			||||||
    $(shell find $(SRC_PATH_BARE)/third_party/googletest -type f))
 | 
					 | 
				
			||||||
INSTALL-SRCS-$(CONFIG_CODEC_SRCS) += $(LIBVPX_TEST_SRCS)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
CODEC_LIB=$(if $(CONFIG_DEBUG_LIBS),vpx_g,vpx)
 | 
					 | 
				
			||||||
CODEC_LIB_SUF=$(if $(CONFIG_SHARED),.so,.a)
 | 
					 | 
				
			||||||
$(foreach bin,$(LIBVPX_TEST_BINS),\
 | 
					 | 
				
			||||||
    $(if $(BUILD_LIBVPX),$(eval $(bin): \
 | 
					 | 
				
			||||||
        lib$(CODEC_LIB)$(CODEC_LIB_SUF) libgtest.a ))\
 | 
					 | 
				
			||||||
    $(if $(BUILD_LIBVPX),$(eval $(call linkerxx_template,$(bin),\
 | 
					 | 
				
			||||||
        $(LIBVPX_TEST_OBJS) \
 | 
					 | 
				
			||||||
        -L. -lvpx -lgtest $(extralibs) -lm)\
 | 
					 | 
				
			||||||
        )))\
 | 
					 | 
				
			||||||
    $(if $(LIPO_LIBS),$(eval $(call lipo_bin_template,$(bin))))\
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
define test_shard_template
 | 
					 | 
				
			||||||
test:: test_shard.$(1)
 | 
					 | 
				
			||||||
test_shard.$(1): $(LIBVPX_TEST_BINS) testdata
 | 
					 | 
				
			||||||
	@set -e; \
 | 
					 | 
				
			||||||
	 for t in $(LIBVPX_TEST_BINS); do \
 | 
					 | 
				
			||||||
	   export GTEST_SHARD_INDEX=$(1); \
 | 
					 | 
				
			||||||
	   export GTEST_TOTAL_SHARDS=$(2); \
 | 
					 | 
				
			||||||
	   $$$$t; \
 | 
					 | 
				
			||||||
	 done
 | 
					 | 
				
			||||||
.PHONY: test_shard.$(1)
 | 
					 | 
				
			||||||
endef
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
NUM_SHARDS := 10
 | 
					 | 
				
			||||||
SHARDS := 0 1 2 3 4 5 6 7 8 9
 | 
					 | 
				
			||||||
$(foreach s,$(SHARDS),$(eval $(call test_shard_template,$(s),$(NUM_SHARDS))))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
##
 | 
					 | 
				
			||||||
## documentation directives
 | 
					 | 
				
			||||||
##
 | 
					 | 
				
			||||||
CLEAN-OBJS += libs.doxy
 | 
					CLEAN-OBJS += libs.doxy
 | 
				
			||||||
DOCS-yes += libs.doxy
 | 
					DOCS-yes += libs.doxy
 | 
				
			||||||
libs.doxy: $(CODEC_DOC_SRCS)
 | 
					libs.doxy: $(CODEC_DOC_SRCS)
 | 
				
			||||||
@@ -518,9 +251,3 @@ libs.doxy: $(CODEC_DOC_SRCS)
 | 
				
			|||||||
	@echo "PREDEFINED = VPX_CODEC_DISABLE_COMPAT" >> $@
 | 
						@echo "PREDEFINED = VPX_CODEC_DISABLE_COMPAT" >> $@
 | 
				
			||||||
	@echo "INCLUDE_PATH += ." >> $@;
 | 
						@echo "INCLUDE_PATH += ." >> $@;
 | 
				
			||||||
	@echo "ENABLED_SECTIONS += $(sort $(CODEC_DOC_SECTIONS))" >> $@
 | 
						@echo "ENABLED_SECTIONS += $(sort $(CODEC_DOC_SECTIONS))" >> $@
 | 
				
			||||||
 | 
					 | 
				
			||||||
## Generate rtcd.h for all objects
 | 
					 | 
				
			||||||
$(OBJS-yes:.o=.d): $(RTCD)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Update the global src list
 | 
					 | 
				
			||||||
SRCS += $(CODEC_SRCS) $(LIBVPX_TEST_SRCS) $(GTEST_SRCS)
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										18
									
								
								mainpage.dox
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								mainpage.dox
									
									
									
									
									
								
							@@ -12,12 +12,8 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  This distribution of the WebM VP8 Codec SDK includes the following support:
 | 
					  This distribution of the WebM VP8 Codec SDK includes the following support:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  \if vp8_encoder
 | 
					  \if vp8_encoder    - \ref vp8_encoder   \endif
 | 
				
			||||||
  - \ref vp8_encoder
 | 
					  \if vp8_decoder    - \ref vp8_decoder   \endif
 | 
				
			||||||
  \endif
 | 
					 | 
				
			||||||
  \if vp8_decoder
 | 
					 | 
				
			||||||
  - \ref vp8_decoder
 | 
					 | 
				
			||||||
  \endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  \section main_startpoints Starting Points
 | 
					  \section main_startpoints Starting Points
 | 
				
			||||||
@@ -28,18 +24,14 @@
 | 
				
			|||||||
  - Read the \ref samples "sample code" for examples of how to interact with the
 | 
					  - Read the \ref samples "sample code" for examples of how to interact with the
 | 
				
			||||||
    codec.
 | 
					    codec.
 | 
				
			||||||
  - \ref codec reference
 | 
					  - \ref codec reference
 | 
				
			||||||
    \if encoder
 | 
					    \if encoder - \ref encoder reference \endif
 | 
				
			||||||
    - \ref encoder reference
 | 
					    \if decoder - \ref decoder reference \endif
 | 
				
			||||||
    \endif
 | 
					 | 
				
			||||||
    \if decoder
 | 
					 | 
				
			||||||
    - \ref decoder reference
 | 
					 | 
				
			||||||
    \endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  \section main_support Support Options & FAQ
 | 
					  \section main_support Support Options & FAQ
 | 
				
			||||||
  The WebM project is an open source project supported by its community. For
 | 
					  The WebM project is an open source project supported by its community. For
 | 
				
			||||||
  questions about this SDK, please mail the apps-devel@webmproject.org list.
 | 
					  questions about this SDK, please mail the apps-devel@webmproject.org list.
 | 
				
			||||||
  To contribute, see http://www.webmproject.org/code/contribute and mail
 | 
					  To contribute, see http://www.webmproject.org/code/contribute and mail
 | 
				
			||||||
  codec-devel@webmproject.org.
 | 
					  vpx-devel@webmproject.org.
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*!\page changelog CHANGELOG
 | 
					/*!\page changelog CHANGELOG
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										300
									
								
								md5_utils.c
									
									
									
									
									
								
							
							
						
						
									
										300
									
								
								md5_utils.c
									
									
									
									
									
								
							@@ -20,27 +20,32 @@
 | 
				
			|||||||
 * Still in the public domain.
 | 
					 * Still in the public domain.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <sys/types.h>    /* for stupid systems */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <string.h>   /* for memcpy() */
 | 
					#include <string.h>   /* for memcpy() */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "md5_utils.h"
 | 
					#include "md5_utils.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
byteSwap(UWORD32 *buf, unsigned words) {
 | 
					byteSwap(UWORD32 *buf, unsigned words)
 | 
				
			||||||
  md5byte *p;
 | 
					{
 | 
				
			||||||
 | 
					    md5byte *p;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* Only swap bytes for big endian machines */
 | 
					    /* Only swap bytes for big endian machines */
 | 
				
			||||||
  int i = 1;
 | 
					    int i = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (*(char *)&i == 1)
 | 
					    if (*(char *)&i == 1)
 | 
				
			||||||
    return;
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  p = (md5byte *)buf;
 | 
					    p = (md5byte *)buf;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  do {
 | 
					    do
 | 
				
			||||||
    *buf++ = (UWORD32)((unsigned)p[3] << 8 | p[2]) << 16 |
 | 
					    {
 | 
				
			||||||
             ((unsigned)p[1] << 8 | p[0]);
 | 
					        *buf++ = (UWORD32)((unsigned)p[3] << 8 | p[2]) << 16 |
 | 
				
			||||||
    p += 4;
 | 
					                 ((unsigned)p[1] << 8 | p[0]);
 | 
				
			||||||
  } while (--words);
 | 
					        p += 4;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    while (--words);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
@@ -48,14 +53,15 @@ byteSwap(UWORD32 *buf, unsigned words) {
 | 
				
			|||||||
 * initialization constants.
 | 
					 * initialization constants.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
MD5Init(struct MD5Context *ctx) {
 | 
					MD5Init(struct MD5Context *ctx)
 | 
				
			||||||
  ctx->buf[0] = 0x67452301;
 | 
					{
 | 
				
			||||||
  ctx->buf[1] = 0xefcdab89;
 | 
					    ctx->buf[0] = 0x67452301;
 | 
				
			||||||
  ctx->buf[2] = 0x98badcfe;
 | 
					    ctx->buf[1] = 0xefcdab89;
 | 
				
			||||||
  ctx->buf[3] = 0x10325476;
 | 
					    ctx->buf[2] = 0x98badcfe;
 | 
				
			||||||
 | 
					    ctx->buf[3] = 0x10325476;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  ctx->bytes[0] = 0;
 | 
					    ctx->bytes[0] = 0;
 | 
				
			||||||
  ctx->bytes[1] = 0;
 | 
					    ctx->bytes[1] = 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
@@ -63,41 +69,44 @@ MD5Init(struct MD5Context *ctx) {
 | 
				
			|||||||
 * of bytes.
 | 
					 * of bytes.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
MD5Update(struct MD5Context *ctx, md5byte const *buf, unsigned len) {
 | 
					MD5Update(struct MD5Context *ctx, md5byte const *buf, unsigned len)
 | 
				
			||||||
  UWORD32 t;
 | 
					{
 | 
				
			||||||
 | 
					    UWORD32 t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* Update byte count */
 | 
					    /* Update byte count */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  t = ctx->bytes[0];
 | 
					    t = ctx->bytes[0];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if ((ctx->bytes[0] = t + len) < t)
 | 
					    if ((ctx->bytes[0] = t + len) < t)
 | 
				
			||||||
    ctx->bytes[1]++;  /* Carry from low to high */
 | 
					        ctx->bytes[1]++;  /* Carry from low to high */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  t = 64 - (t & 0x3f);  /* Space available in ctx->in (at least 1) */
 | 
					    t = 64 - (t & 0x3f);  /* Space available in ctx->in (at least 1) */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (t > len) {
 | 
					    if (t > len)
 | 
				
			||||||
    memcpy((md5byte *)ctx->in + 64 - t, buf, len);
 | 
					    {
 | 
				
			||||||
    return;
 | 
					        memcpy((md5byte *)ctx->in + 64 - t, buf, len);
 | 
				
			||||||
  }
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* First chunk is an odd size */
 | 
					    /* First chunk is an odd size */
 | 
				
			||||||
  memcpy((md5byte *)ctx->in + 64 - t, buf, t);
 | 
					    memcpy((md5byte *)ctx->in + 64 - t, buf, t);
 | 
				
			||||||
  byteSwap(ctx->in, 16);
 | 
					 | 
				
			||||||
  MD5Transform(ctx->buf, ctx->in);
 | 
					 | 
				
			||||||
  buf += t;
 | 
					 | 
				
			||||||
  len -= t;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /* Process data in 64-byte chunks */
 | 
					 | 
				
			||||||
  while (len >= 64) {
 | 
					 | 
				
			||||||
    memcpy(ctx->in, buf, 64);
 | 
					 | 
				
			||||||
    byteSwap(ctx->in, 16);
 | 
					    byteSwap(ctx->in, 16);
 | 
				
			||||||
    MD5Transform(ctx->buf, ctx->in);
 | 
					    MD5Transform(ctx->buf, ctx->in);
 | 
				
			||||||
    buf += 64;
 | 
					    buf += t;
 | 
				
			||||||
    len -= 64;
 | 
					    len -= t;
 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* Handle any remaining bytes of data. */
 | 
					    /* Process data in 64-byte chunks */
 | 
				
			||||||
  memcpy(ctx->in, buf, len);
 | 
					    while (len >= 64)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        memcpy(ctx->in, buf, 64);
 | 
				
			||||||
 | 
					        byteSwap(ctx->in, 16);
 | 
				
			||||||
 | 
					        MD5Transform(ctx->buf, ctx->in);
 | 
				
			||||||
 | 
					        buf += 64;
 | 
				
			||||||
 | 
					        len -= 64;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Handle any remaining bytes of data. */
 | 
				
			||||||
 | 
					    memcpy(ctx->in, buf, len);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
@@ -105,35 +114,37 @@ MD5Update(struct MD5Context *ctx, md5byte const *buf, unsigned len) {
 | 
				
			|||||||
 * 1 0* (64-bit count of bits processed, MSB-first)
 | 
					 * 1 0* (64-bit count of bits processed, MSB-first)
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
MD5Final(md5byte digest[16], struct MD5Context *ctx) {
 | 
					MD5Final(md5byte digest[16], struct MD5Context *ctx)
 | 
				
			||||||
  int count = ctx->bytes[0] & 0x3f; /* Number of bytes in ctx->in */
 | 
					{
 | 
				
			||||||
  md5byte *p = (md5byte *)ctx->in + count;
 | 
					    int count = ctx->bytes[0] & 0x3f; /* Number of bytes in ctx->in */
 | 
				
			||||||
 | 
					    md5byte *p = (md5byte *)ctx->in + count;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* Set the first char of padding to 0x80.  There is always room. */
 | 
					    /* Set the first char of padding to 0x80.  There is always room. */
 | 
				
			||||||
  *p++ = 0x80;
 | 
					    *p++ = 0x80;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* Bytes of padding needed to make 56 bytes (-8..55) */
 | 
					    /* Bytes of padding needed to make 56 bytes (-8..55) */
 | 
				
			||||||
  count = 56 - 1 - count;
 | 
					    count = 56 - 1 - count;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (count < 0) {  /* Padding forces an extra block */
 | 
					    if (count < 0)    /* Padding forces an extra block */
 | 
				
			||||||
    memset(p, 0, count + 8);
 | 
					    {
 | 
				
			||||||
    byteSwap(ctx->in, 16);
 | 
					        memset(p, 0, count + 8);
 | 
				
			||||||
 | 
					        byteSwap(ctx->in, 16);
 | 
				
			||||||
 | 
					        MD5Transform(ctx->buf, ctx->in);
 | 
				
			||||||
 | 
					        p = (md5byte *)ctx->in;
 | 
				
			||||||
 | 
					        count = 56;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    memset(p, 0, count);
 | 
				
			||||||
 | 
					    byteSwap(ctx->in, 14);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Append length in bits and transform */
 | 
				
			||||||
 | 
					    ctx->in[14] = ctx->bytes[0] << 3;
 | 
				
			||||||
 | 
					    ctx->in[15] = ctx->bytes[1] << 3 | ctx->bytes[0] >> 29;
 | 
				
			||||||
    MD5Transform(ctx->buf, ctx->in);
 | 
					    MD5Transform(ctx->buf, ctx->in);
 | 
				
			||||||
    p = (md5byte *)ctx->in;
 | 
					 | 
				
			||||||
    count = 56;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  memset(p, 0, count);
 | 
					    byteSwap(ctx->buf, 4);
 | 
				
			||||||
  byteSwap(ctx->in, 14);
 | 
					    memcpy(digest, ctx->buf, 16);
 | 
				
			||||||
 | 
					    memset(ctx, 0, sizeof(*ctx)); /* In case it's sensitive */
 | 
				
			||||||
  /* Append length in bits and transform */
 | 
					 | 
				
			||||||
  ctx->in[14] = ctx->bytes[0] << 3;
 | 
					 | 
				
			||||||
  ctx->in[15] = ctx->bytes[1] << 3 | ctx->bytes[0] >> 29;
 | 
					 | 
				
			||||||
  MD5Transform(ctx->buf, ctx->in);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  byteSwap(ctx->buf, 4);
 | 
					 | 
				
			||||||
  memcpy(digest, ctx->buf, 16);
 | 
					 | 
				
			||||||
  memset(ctx, 0, sizeof(*ctx)); /* In case it's sensitive */
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef ASM_MD5
 | 
					#ifndef ASM_MD5
 | 
				
			||||||
@@ -148,7 +159,7 @@ MD5Final(md5byte digest[16], struct MD5Context *ctx) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
/* This is the central step in the MD5 algorithm. */
 | 
					/* This is the central step in the MD5 algorithm. */
 | 
				
			||||||
#define MD5STEP(f,w,x,y,z,in,s) \
 | 
					#define MD5STEP(f,w,x,y,z,in,s) \
 | 
				
			||||||
  (w += f(x,y,z) + in, w = (w<<s | w>>(32-s)) + x)
 | 
					    (w += f(x,y,z) + in, w = (w<<s | w>>(32-s)) + x)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * The core of the MD5 algorithm, this alters an existing MD5 hash to
 | 
					 * The core of the MD5 algorithm, this alters an existing MD5 hash to
 | 
				
			||||||
@@ -156,86 +167,87 @@ MD5Final(md5byte digest[16], struct MD5Context *ctx) {
 | 
				
			|||||||
 * the data and converts bytes into longwords for this routine.
 | 
					 * the data and converts bytes into longwords for this routine.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
MD5Transform(UWORD32 buf[4], UWORD32 const in[16]) {
 | 
					MD5Transform(UWORD32 buf[4], UWORD32 const in[16])
 | 
				
			||||||
  register UWORD32 a, b, c, d;
 | 
					{
 | 
				
			||||||
 | 
					    register UWORD32 a, b, c, d;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  a = buf[0];
 | 
					    a = buf[0];
 | 
				
			||||||
  b = buf[1];
 | 
					    b = buf[1];
 | 
				
			||||||
  c = buf[2];
 | 
					    c = buf[2];
 | 
				
			||||||
  d = buf[3];
 | 
					    d = buf[3];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);
 | 
					    MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);
 | 
				
			||||||
  MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
 | 
					    MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
 | 
				
			||||||
  MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);
 | 
					    MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);
 | 
				
			||||||
  MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
 | 
					    MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
 | 
				
			||||||
  MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
 | 
					    MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
 | 
				
			||||||
  MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);
 | 
					    MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);
 | 
				
			||||||
  MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);
 | 
					    MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);
 | 
				
			||||||
  MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);
 | 
					    MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);
 | 
				
			||||||
  MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);
 | 
					    MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);
 | 
				
			||||||
  MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
 | 
					    MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
 | 
				
			||||||
  MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
 | 
					    MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
 | 
				
			||||||
  MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);
 | 
					    MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);
 | 
				
			||||||
  MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);
 | 
					    MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);
 | 
				
			||||||
  MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);
 | 
					    MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);
 | 
				
			||||||
  MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);
 | 
					    MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);
 | 
				
			||||||
  MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);
 | 
					    MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);
 | 
					    MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);
 | 
				
			||||||
  MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);
 | 
					    MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);
 | 
				
			||||||
  MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);
 | 
					    MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);
 | 
				
			||||||
  MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
 | 
					    MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
 | 
				
			||||||
  MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);
 | 
					    MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);
 | 
				
			||||||
  MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);
 | 
					    MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);
 | 
				
			||||||
  MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
 | 
					    MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
 | 
				
			||||||
  MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
 | 
					    MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
 | 
				
			||||||
  MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
 | 
					    MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
 | 
				
			||||||
  MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);
 | 
					    MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);
 | 
				
			||||||
  MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
 | 
					    MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
 | 
				
			||||||
  MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);
 | 
					    MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);
 | 
				
			||||||
  MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
 | 
					    MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
 | 
				
			||||||
  MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
 | 
					    MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
 | 
				
			||||||
  MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);
 | 
					    MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);
 | 
				
			||||||
  MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);
 | 
					    MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);
 | 
					    MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);
 | 
				
			||||||
  MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);
 | 
					    MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);
 | 
				
			||||||
  MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
 | 
					    MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
 | 
				
			||||||
  MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);
 | 
					    MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);
 | 
				
			||||||
  MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);
 | 
					    MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);
 | 
				
			||||||
  MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
 | 
					    MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
 | 
				
			||||||
  MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
 | 
					    MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
 | 
				
			||||||
  MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
 | 
					    MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
 | 
				
			||||||
  MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
 | 
					    MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
 | 
				
			||||||
  MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
 | 
					    MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
 | 
				
			||||||
  MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
 | 
					    MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
 | 
				
			||||||
  MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);
 | 
					    MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);
 | 
				
			||||||
  MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
 | 
					    MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
 | 
				
			||||||
  MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
 | 
					    MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
 | 
				
			||||||
  MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
 | 
					    MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
 | 
				
			||||||
  MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);
 | 
					    MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);
 | 
					    MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);
 | 
				
			||||||
  MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);
 | 
					    MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);
 | 
				
			||||||
  MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);
 | 
					    MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);
 | 
				
			||||||
  MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);
 | 
					    MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);
 | 
				
			||||||
  MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);
 | 
					    MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);
 | 
				
			||||||
  MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
 | 
					    MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
 | 
				
			||||||
  MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);
 | 
					    MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);
 | 
				
			||||||
  MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);
 | 
					    MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);
 | 
				
			||||||
  MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
 | 
					    MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
 | 
				
			||||||
  MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
 | 
					    MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
 | 
				
			||||||
  MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);
 | 
					    MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);
 | 
				
			||||||
  MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
 | 
					    MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
 | 
				
			||||||
  MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);
 | 
					    MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);
 | 
				
			||||||
  MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);
 | 
					    MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);
 | 
				
			||||||
  MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
 | 
					    MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
 | 
				
			||||||
  MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);
 | 
					    MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  buf[0] += a;
 | 
					    buf[0] += a;
 | 
				
			||||||
  buf[1] += b;
 | 
					    buf[1] += b;
 | 
				
			||||||
  buf[2] += c;
 | 
					    buf[2] += c;
 | 
				
			||||||
  buf[3] += d;
 | 
					    buf[3] += d;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,10 +27,11 @@
 | 
				
			|||||||
#define UWORD32 unsigned int
 | 
					#define UWORD32 unsigned int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct MD5Context MD5Context;
 | 
					typedef struct MD5Context MD5Context;
 | 
				
			||||||
struct MD5Context {
 | 
					struct MD5Context
 | 
				
			||||||
  UWORD32 buf[4];
 | 
					{
 | 
				
			||||||
  UWORD32 bytes[2];
 | 
					    UWORD32 buf[4];
 | 
				
			||||||
  UWORD32 in[16];
 | 
					    UWORD32 bytes[2];
 | 
				
			||||||
 | 
					    UWORD32 in[16];
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void MD5Init(struct MD5Context *context);
 | 
					void MD5Init(struct MD5Context *context);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,7 +20,7 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 	restore pointer to the structure by a pointer to its field
 | 
					 	restore pointer to the structure by a pointer to its field
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
#define structof(p,t,f) ((t*)(- (ptrdiff_t) offsetof(t,f) + (char*)(p)))
 | 
					#define structof(p,t,f) ((t*)(- offsetof(t,f) + (char*)(p)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 *	redefine for the target compiler
 | 
					 *	redefine for the target compiler
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -67,7 +67,6 @@ extern "C" {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#define NESTEGG_CODEC_VP8    0 /**< Track uses Google On2 VP8 codec. */
 | 
					#define NESTEGG_CODEC_VP8    0 /**< Track uses Google On2 VP8 codec. */
 | 
				
			||||||
#define NESTEGG_CODEC_VORBIS 1 /**< Track uses Xiph Vorbis codec. */
 | 
					#define NESTEGG_CODEC_VORBIS 1 /**< Track uses Xiph Vorbis codec. */
 | 
				
			||||||
#define NESTEGG_CODEC_VP9    2 /**< Track uses Google On2 VP9 codec. */
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define NESTEGG_SEEK_SET 0 /**< Seek offset relative to beginning of stream. */
 | 
					#define NESTEGG_SEEK_SET 0 /**< Seek offset relative to beginning of stream. */
 | 
				
			||||||
#define NESTEGG_SEEK_CUR 1 /**< Seek offset relative to current position in stream. */
 | 
					#define NESTEGG_SEEK_CUR 1 /**< Seek offset relative to current position in stream. */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -127,7 +127,6 @@ enum ebml_type_enum {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
/* Track IDs */
 | 
					/* Track IDs */
 | 
				
			||||||
#define TRACK_ID_VP8            "V_VP8"
 | 
					#define TRACK_ID_VP8            "V_VP8"
 | 
				
			||||||
#define TRACK_ID_VP9            "V_VP9"
 | 
					 | 
				
			||||||
#define TRACK_ID_VORBIS         "A_VORBIS"
 | 
					#define TRACK_ID_VORBIS         "A_VORBIS"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum vint_mask {
 | 
					enum vint_mask {
 | 
				
			||||||
@@ -1273,7 +1272,7 @@ ne_read_block(nestegg * ctx, uint64_t block_id, uint64_t block_size, nestegg_pac
 | 
				
			|||||||
  if (total > block_size)
 | 
					  if (total > block_size)
 | 
				
			||||||
    return -1;
 | 
					    return -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  entry = ne_find_track_entry(ctx, (unsigned int)(track - 1));
 | 
					  entry = ne_find_track_entry(ctx, track - 1);
 | 
				
			||||||
  if (!entry)
 | 
					  if (!entry)
 | 
				
			||||||
    return -1;
 | 
					    return -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1292,7 +1291,7 @@ ne_read_block(nestegg * ctx, uint64_t block_id, uint64_t block_size, nestegg_pac
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  pkt = ne_alloc(sizeof(*pkt));
 | 
					  pkt = ne_alloc(sizeof(*pkt));
 | 
				
			||||||
  pkt->track = track - 1;
 | 
					  pkt->track = track - 1;
 | 
				
			||||||
  pkt->timecode = (uint64_t)(abs_timecode * tc_scale * track_scale);
 | 
					  pkt->timecode = abs_timecode * tc_scale * track_scale;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  ctx->log(ctx, NESTEGG_LOG_DEBUG, "%sblock t %lld pts %f f %llx frames: %llu",
 | 
					  ctx->log(ctx, NESTEGG_LOG_DEBUG, "%sblock t %lld pts %f f %llx frames: %llu",
 | 
				
			||||||
           block_id == ID_BLOCK ? "" : "simple", pkt->track, pkt->timecode / 1e9, flags, frames);
 | 
					           block_id == ID_BLOCK ? "" : "simple", pkt->track, pkt->timecode / 1e9, flags, frames);
 | 
				
			||||||
@@ -1670,9 +1669,6 @@ nestegg_track_codec_id(nestegg * ctx, unsigned int track)
 | 
				
			|||||||
  if (strcmp(codec_id, TRACK_ID_VP8) == 0)
 | 
					  if (strcmp(codec_id, TRACK_ID_VP8) == 0)
 | 
				
			||||||
    return NESTEGG_CODEC_VP8;
 | 
					    return NESTEGG_CODEC_VP8;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (strcmp(codec_id, TRACK_ID_VP9) == 0)
 | 
					 | 
				
			||||||
    return NESTEGG_CODEC_VP9;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (strcmp(codec_id, TRACK_ID_VORBIS) == 0)
 | 
					  if (strcmp(codec_id, TRACK_ID_VORBIS) == 0)
 | 
				
			||||||
    return NESTEGG_CODEC_VORBIS;
 | 
					    return NESTEGG_CODEC_VORBIS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1778,35 +1774,35 @@ nestegg_track_video_params(nestegg * ctx, unsigned int track,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  if (ne_get_uint(entry->video.pixel_width, &value) != 0)
 | 
					  if (ne_get_uint(entry->video.pixel_width, &value) != 0)
 | 
				
			||||||
    return -1;
 | 
					    return -1;
 | 
				
			||||||
  params->width = (unsigned int)value;
 | 
					  params->width = value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (ne_get_uint(entry->video.pixel_height, &value) != 0)
 | 
					  if (ne_get_uint(entry->video.pixel_height, &value) != 0)
 | 
				
			||||||
    return -1;
 | 
					    return -1;
 | 
				
			||||||
  params->height = (unsigned int)value;
 | 
					  params->height = value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  value = 0;
 | 
					  value = 0;
 | 
				
			||||||
  ne_get_uint(entry->video.pixel_crop_bottom, &value);
 | 
					  ne_get_uint(entry->video.pixel_crop_bottom, &value);
 | 
				
			||||||
  params->crop_bottom = (unsigned int)value;
 | 
					  params->crop_bottom = value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  value = 0;
 | 
					  value = 0;
 | 
				
			||||||
  ne_get_uint(entry->video.pixel_crop_top, &value);
 | 
					  ne_get_uint(entry->video.pixel_crop_top, &value);
 | 
				
			||||||
  params->crop_top = (unsigned int)value;
 | 
					  params->crop_top = value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  value = 0;
 | 
					  value = 0;
 | 
				
			||||||
  ne_get_uint(entry->video.pixel_crop_left, &value);
 | 
					  ne_get_uint(entry->video.pixel_crop_left, &value);
 | 
				
			||||||
  params->crop_left = (unsigned int)value;
 | 
					  params->crop_left = value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  value = 0;
 | 
					  value = 0;
 | 
				
			||||||
  ne_get_uint(entry->video.pixel_crop_right, &value);
 | 
					  ne_get_uint(entry->video.pixel_crop_right, &value);
 | 
				
			||||||
  params->crop_right = (unsigned int)value;
 | 
					  params->crop_right = value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  value = params->width;
 | 
					  value = params->width;
 | 
				
			||||||
  ne_get_uint(entry->video.display_width, &value);
 | 
					  ne_get_uint(entry->video.display_width, &value);
 | 
				
			||||||
  params->display_width = (unsigned int)value;
 | 
					  params->display_width = value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  value = params->height;
 | 
					  value = params->height;
 | 
				
			||||||
  ne_get_uint(entry->video.display_height, &value);
 | 
					  ne_get_uint(entry->video.display_height, &value);
 | 
				
			||||||
  params->display_height = (unsigned int)value;
 | 
					  params->display_height = value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return 0;
 | 
					  return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -1832,11 +1828,11 @@ nestegg_track_audio_params(nestegg * ctx, unsigned int track,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  value = 1;
 | 
					  value = 1;
 | 
				
			||||||
  ne_get_uint(entry->audio.channels, &value);
 | 
					  ne_get_uint(entry->audio.channels, &value);
 | 
				
			||||||
  params->channels = (unsigned int)value;
 | 
					  params->channels = value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  value = 16;
 | 
					  value = 16;
 | 
				
			||||||
  ne_get_uint(entry->audio.bit_depth, &value);
 | 
					  ne_get_uint(entry->audio.bit_depth, &value);
 | 
				
			||||||
  params->depth = (unsigned int)value;
 | 
					  params->depth = value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return 0;
 | 
					  return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -1892,7 +1888,7 @@ nestegg_free_packet(nestegg_packet * pkt)
 | 
				
			|||||||
int
 | 
					int
 | 
				
			||||||
nestegg_packet_track(nestegg_packet * pkt, unsigned int * track)
 | 
					nestegg_packet_track(nestegg_packet * pkt, unsigned int * track)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  *track = (unsigned int)pkt->track;
 | 
					  *track = pkt->track;
 | 
				
			||||||
  return 0;
 | 
					  return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										39
									
								
								solution.mk
									
									
									
									
									
								
							
							
						
						
									
										39
									
								
								solution.mk
									
									
									
									
									
								
							@@ -8,17 +8,39 @@
 | 
				
			|||||||
##  be found in the AUTHORS file in the root of the source tree.
 | 
					##  be found in the AUTHORS file in the root of the source tree.
 | 
				
			||||||
##
 | 
					##
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# libvpx reverse dependencies (targets that depend on libvpx)
 | 
					 | 
				
			||||||
VPX_NONDEPS=$(addsuffix .$(VCPROJ_SFX),vpx gtest obj_int_extract)
 | 
					 | 
				
			||||||
VPX_RDEPS=$(foreach vcp,\
 | 
					 | 
				
			||||||
              $(filter-out $(VPX_NONDEPS),$^), --dep=$(vcp:.$(VCPROJ_SFX)=):vpx)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
vpx.sln: $(wildcard *.$(VCPROJ_SFX))
 | 
					ifeq ($(ARCH_ARM),yes)
 | 
				
			||||||
 | 
					ARM_DEVELOP=no
 | 
				
			||||||
 | 
					ARM_DEVELOP:=$(if $(filter %vpx.vcproj,$(wildcard *.vcproj)),yes)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ifeq ($(ARM_DEVELOP),yes)
 | 
				
			||||||
 | 
					vpx.sln:
 | 
				
			||||||
 | 
						@echo "    [COPY] $@"
 | 
				
			||||||
 | 
						@cp $(SRC_PATH_BARE)/build/arm-wince-vs8/vpx.sln .
 | 
				
			||||||
 | 
					PROJECTS-yes += vpx.sln
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
					vpx.sln: $(wildcard *.vcproj)
 | 
				
			||||||
	@echo "    [CREATE] $@"
 | 
						@echo "    [CREATE] $@"
 | 
				
			||||||
	$(SRC_PATH_BARE)/build/make/gen_msvs_sln.sh \
 | 
						$(SRC_PATH_BARE)/build/make/gen_msvs_sln.sh \
 | 
				
			||||||
            $(if $(filter vpx.$(VCPROJ_SFX),$^),$(VPX_RDEPS)) \
 | 
					            $(if $(filter %vpx.vcproj,$^),--dep=vpxdec:vpx) \
 | 
				
			||||||
            --dep=vpx:obj_int_extract \
 | 
					            $(if $(filter %vpx.vcproj,$^),--dep=xma:vpx) \
 | 
				
			||||||
            --dep=test_libvpx:gtest \
 | 
					            --ver=$(CONFIG_VS_VERSION)\
 | 
				
			||||||
 | 
					            --target=$(TOOLCHAIN)\
 | 
				
			||||||
 | 
					            --out=$@ $^
 | 
				
			||||||
 | 
					vpx.sln.mk: vpx.sln
 | 
				
			||||||
 | 
						@true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PROJECTS-yes += vpx.sln vpx.sln.mk
 | 
				
			||||||
 | 
					-include vpx.sln.mk
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
					vpx.sln: $(wildcard *.vcproj)
 | 
				
			||||||
 | 
						@echo "    [CREATE] $@"
 | 
				
			||||||
 | 
						$(SRC_PATH_BARE)/build/make/gen_msvs_sln.sh \
 | 
				
			||||||
 | 
					            $(if $(filter %vpx.vcproj,$^),\
 | 
				
			||||||
 | 
					                $(foreach vcp,$(filter-out %vpx.vcproj,$^),\
 | 
				
			||||||
 | 
					                  --dep=$(vcp:.vcproj=):vpx)) \
 | 
				
			||||||
            --ver=$(CONFIG_VS_VERSION)\
 | 
					            --ver=$(CONFIG_VS_VERSION)\
 | 
				
			||||||
            --out=$@ $^
 | 
					            --out=$@ $^
 | 
				
			||||||
vpx.sln.mk: vpx.sln
 | 
					vpx.sln.mk: vpx.sln
 | 
				
			||||||
@@ -26,6 +48,7 @@ vpx.sln.mk: vpx.sln
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
PROJECTS-yes += vpx.sln vpx.sln.mk
 | 
					PROJECTS-yes += vpx.sln vpx.sln.mk
 | 
				
			||||||
-include vpx.sln.mk
 | 
					-include vpx.sln.mk
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Always install this file, as it is an unconditional post-build rule.
 | 
					# Always install this file, as it is an unconditional post-build rule.
 | 
				
			||||||
INSTALL_MAPS += src/%     $(SRC_PATH_BARE)/%
 | 
					INSTALL_MAPS += src/%     $(SRC_PATH_BARE)/%
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,62 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *  Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
 *  that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
 *  tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
 *  in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
 *  be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef TEST_ACM_RANDOM_H_
 | 
					 | 
				
			||||||
#define TEST_ACM_RANDOM_H_
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "third_party/googletest/src/include/gtest/gtest.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "vpx/vpx_integer.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace libvpx_test {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class ACMRandom {
 | 
					 | 
				
			||||||
 public:
 | 
					 | 
				
			||||||
  ACMRandom() : random_(DeterministicSeed()) {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  explicit ACMRandom(int seed) : random_(seed) {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  void Reset(int seed) {
 | 
					 | 
				
			||||||
    random_.Reseed(seed);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  uint8_t Rand8(void) {
 | 
					 | 
				
			||||||
    const uint32_t value =
 | 
					 | 
				
			||||||
        random_.Generate(testing::internal::Random::kMaxRange);
 | 
					 | 
				
			||||||
    // There's a bit more entropy in the upper bits of this implementation.
 | 
					 | 
				
			||||||
    return (value >> 24) & 0xff;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  uint8_t Rand8Extremes(void) {
 | 
					 | 
				
			||||||
    // Returns a random value near 0 or near 255, to better exercise
 | 
					 | 
				
			||||||
    // saturation behavior.
 | 
					 | 
				
			||||||
    const uint8_t r = Rand8();
 | 
					 | 
				
			||||||
    return r < 128 ? r << 4 : r >> 4;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  int PseudoUniform(int range) {
 | 
					 | 
				
			||||||
    return random_.Generate(range);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  int operator()(int n) {
 | 
					 | 
				
			||||||
    return PseudoUniform(n);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  static int DeterministicSeed(void) {
 | 
					 | 
				
			||||||
    return 0xbaba;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 private:
 | 
					 | 
				
			||||||
  testing::internal::Random random_;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}  // namespace libvpx_test
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif  // TEST_ACM_RANDOM_H_
 | 
					 | 
				
			||||||
@@ -1,69 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *  Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
 *  that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
 *  tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
 *  in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
 *  be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
#include "third_party/googletest/src/include/gtest/gtest.h"
 | 
					 | 
				
			||||||
#include "test/codec_factory.h"
 | 
					 | 
				
			||||||
#include "test/encode_test_driver.h"
 | 
					 | 
				
			||||||
#include "test/i420_video_source.h"
 | 
					 | 
				
			||||||
#include "test/util.h"
 | 
					 | 
				
			||||||
namespace {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// lookahead range: [kLookAheadMin, kLookAheadMax).
 | 
					 | 
				
			||||||
const int kLookAheadMin = 5;
 | 
					 | 
				
			||||||
const int kLookAheadMax = 26;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class AltRefTest : public ::libvpx_test::EncoderTest,
 | 
					 | 
				
			||||||
    public ::libvpx_test::CodecTestWithParam<int> {
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  AltRefTest() : EncoderTest(GET_PARAM(0)), altref_count_(0) {}
 | 
					 | 
				
			||||||
  virtual ~AltRefTest() {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void SetUp() {
 | 
					 | 
				
			||||||
    InitializeConfig();
 | 
					 | 
				
			||||||
    SetMode(libvpx_test::kTwoPassGood);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void BeginPassHook(unsigned int pass) {
 | 
					 | 
				
			||||||
    altref_count_ = 0;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void PreEncodeFrameHook(libvpx_test::VideoSource *video,
 | 
					 | 
				
			||||||
                                  libvpx_test::Encoder *encoder) {
 | 
					 | 
				
			||||||
    if (video->frame() == 1) {
 | 
					 | 
				
			||||||
      encoder->Control(VP8E_SET_ENABLEAUTOALTREF, 1);
 | 
					 | 
				
			||||||
      encoder->Control(VP8E_SET_CPUUSED, 3);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void FramePktHook(const vpx_codec_cx_pkt_t *pkt) {
 | 
					 | 
				
			||||||
    if (pkt->data.frame.flags & VPX_FRAME_IS_INVISIBLE) ++altref_count_;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  int altref_count() const { return altref_count_; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 private:
 | 
					 | 
				
			||||||
  int altref_count_;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(AltRefTest, MonotonicTimestamps) {
 | 
					 | 
				
			||||||
  const vpx_rational timebase = { 33333333, 1000000000 };
 | 
					 | 
				
			||||||
  cfg_.g_timebase = timebase;
 | 
					 | 
				
			||||||
  cfg_.rc_target_bitrate = 1000;
 | 
					 | 
				
			||||||
  cfg_.g_lag_in_frames = GET_PARAM(1);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  libvpx_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288,
 | 
					 | 
				
			||||||
                                     timebase.den, timebase.num, 0, 30);
 | 
					 | 
				
			||||||
  ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
 | 
					 | 
				
			||||||
  EXPECT_GE(altref_count(), 1);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
VP8_INSTANTIATE_TEST_CASE(AltRefTest,
 | 
					 | 
				
			||||||
                          ::testing::Range(kLookAheadMin, kLookAheadMax));
 | 
					 | 
				
			||||||
}  // namespace
 | 
					 | 
				
			||||||
@@ -1,42 +0,0 @@
 | 
				
			|||||||
# Copyright (c) 2013 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
# that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
# tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
# in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
# be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# This make file builds vpx_test app for android.
 | 
					 | 
				
			||||||
# The test app itself runs on the command line through adb shell
 | 
					 | 
				
			||||||
# The paths are really messed up as the libvpx make file
 | 
					 | 
				
			||||||
# expects to be made from a parent directory.
 | 
					 | 
				
			||||||
CUR_WD := $(call my-dir)
 | 
					 | 
				
			||||||
BINDINGS_DIR := $(CUR_WD)/../../..
 | 
					 | 
				
			||||||
LOCAL_PATH := $(CUR_WD)/../../..
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#libvpx
 | 
					 | 
				
			||||||
include $(CLEAR_VARS)
 | 
					 | 
				
			||||||
include $(BINDINGS_DIR)/libvpx/build/make/Android.mk
 | 
					 | 
				
			||||||
LOCAL_PATH := $(CUR_WD)/../..
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#libgtest
 | 
					 | 
				
			||||||
include $(CLEAR_VARS)
 | 
					 | 
				
			||||||
LOCAL_ARM_MODE := arm
 | 
					 | 
				
			||||||
LOCAL_CPP_EXTENSION := .cc
 | 
					 | 
				
			||||||
LOCAL_MODULE := gtest
 | 
					 | 
				
			||||||
LOCAL_C_INCLUDES := $(LOCAL_PATH)/third_party/googletest/src/
 | 
					 | 
				
			||||||
LOCAL_C_INCLUDES += $(LOCAL_PATH)/third_party/googletest/src/include/
 | 
					 | 
				
			||||||
LOCAL_SRC_FILES := ./third_party/googletest/src/src/gtest-all.cc
 | 
					 | 
				
			||||||
include $(BUILD_STATIC_LIBRARY)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#libvpx_test
 | 
					 | 
				
			||||||
include $(CLEAR_VARS)
 | 
					 | 
				
			||||||
LOCAL_ARM_MODE := arm
 | 
					 | 
				
			||||||
LOCAL_MODULE := libvpx_test
 | 
					 | 
				
			||||||
LOCAL_STATIC_LIBRARIES := gtest
 | 
					 | 
				
			||||||
LOCAL_SHARED_LIBRARIES := vpx
 | 
					 | 
				
			||||||
include $(LOCAL_PATH)/test/test.mk
 | 
					 | 
				
			||||||
LOCAL_C_INCLUDES := $(BINDINGS_DIR)
 | 
					 | 
				
			||||||
FILTERED_SRC := $(sort $(filter %.cc %.c, $(LIBVPX_TEST_SRCS-yes)))
 | 
					 | 
				
			||||||
LOCAL_SRC_FILES := $(addprefix ./test/, $(FILTERED_SRC))
 | 
					 | 
				
			||||||
include $(BUILD_EXECUTABLE)
 | 
					 | 
				
			||||||
@@ -1,32 +0,0 @@
 | 
				
			|||||||
Android.mk will build vpx unittests on android.
 | 
					 | 
				
			||||||
1) Configure libvpx from the parent directory:
 | 
					 | 
				
			||||||
./libvpx/configure --target=armv7-android-gcc --enable-external-build \
 | 
					 | 
				
			||||||
  --enable-postproc --disable-install-srcs --enable-multi-res-encoding \
 | 
					 | 
				
			||||||
  --enable-temporal-denoising --disable-unit-tests --disable-install-docs \
 | 
					 | 
				
			||||||
  --disable-examples --disable-runtime-cpu-detect --sdk=$NDK
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
2) From the parent directory, invoke ndk-build:
 | 
					 | 
				
			||||||
NDK_PROJECT_PATH=. ndk-build APP_BUILD_SCRIPT=./libvpx/test/android/Android.mk \
 | 
					 | 
				
			||||||
  APP_ABI=armeabi-v7a APP_PLATFORM=android-18 APP_OPTIM=release \
 | 
					 | 
				
			||||||
  APP_STL=gnustl_static
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Note: Both adb and ndk-build are available prebuilt at:
 | 
					 | 
				
			||||||
  https://chromium.googlesource.com/android_tools
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
3) Run get_files.py to download the test files:
 | 
					 | 
				
			||||||
python get_files.py -i /path/to/test-data.sha1 -o /path/to/put/files \
 | 
					 | 
				
			||||||
  -u http://downloads.webmproject.org/test_data/libvpx
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
4) Transfer files to device using adb. Ensure you have proper permissions for
 | 
					 | 
				
			||||||
the target
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
adb push /path/to/test_files /data/local/tmp
 | 
					 | 
				
			||||||
adb push /path/to/built_libs /data/local/tmp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
NOTE: Built_libs defaults to parent_dir/libs/armeabi-v7a
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
5) Run tests:
 | 
					 | 
				
			||||||
adb shell
 | 
					 | 
				
			||||||
(on device)
 | 
					 | 
				
			||||||
cd /data/local/tmp
 | 
					 | 
				
			||||||
LD_LIBRARY_PATH=. ./vpx_test
 | 
					 | 
				
			||||||
@@ -1,118 +0,0 @@
 | 
				
			|||||||
# Copyright (c) 2013 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
# that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
# tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
# in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
# be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# This simple script pulls test files from the webm homepage
 | 
					 | 
				
			||||||
# It is intelligent enough to only pull files if
 | 
					 | 
				
			||||||
#   1) File / test_data folder does not exist
 | 
					 | 
				
			||||||
#   2) SHA mismatch
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import pycurl
 | 
					 | 
				
			||||||
import csv
 | 
					 | 
				
			||||||
import hashlib
 | 
					 | 
				
			||||||
import re
 | 
					 | 
				
			||||||
import os.path
 | 
					 | 
				
			||||||
import time
 | 
					 | 
				
			||||||
import itertools
 | 
					 | 
				
			||||||
import sys
 | 
					 | 
				
			||||||
import getopt
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#globals
 | 
					 | 
				
			||||||
url = ''
 | 
					 | 
				
			||||||
file_list_path = ''
 | 
					 | 
				
			||||||
local_resource_path = ''
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Helper functions:
 | 
					 | 
				
			||||||
# A simple function which returns the sha hash of a file in hex
 | 
					 | 
				
			||||||
def get_file_sha(filename):
 | 
					 | 
				
			||||||
  try:
 | 
					 | 
				
			||||||
    sha_hash = hashlib.sha1()
 | 
					 | 
				
			||||||
    with open(filename, 'rb') as file:
 | 
					 | 
				
			||||||
      buf = file.read(HASH_CHUNK)
 | 
					 | 
				
			||||||
      while len(buf) > 0:
 | 
					 | 
				
			||||||
        sha_hash.update(buf)
 | 
					 | 
				
			||||||
        buf = file.read(HASH_CHUNK)
 | 
					 | 
				
			||||||
      return sha_hash.hexdigest()
 | 
					 | 
				
			||||||
  except IOError:
 | 
					 | 
				
			||||||
    print "Error reading " + filename
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Downloads a file from a url, and then checks the sha against the passed
 | 
					 | 
				
			||||||
# in sha
 | 
					 | 
				
			||||||
def download_and_check_sha(url, filename, sha):
 | 
					 | 
				
			||||||
  path = os.path.join(local_resource_path, filename)
 | 
					 | 
				
			||||||
  fp = open(path, "wb")
 | 
					 | 
				
			||||||
  curl = pycurl.Curl()
 | 
					 | 
				
			||||||
  curl.setopt(pycurl.URL, url + "/" + filename)
 | 
					 | 
				
			||||||
  curl.setopt(pycurl.WRITEDATA, fp)
 | 
					 | 
				
			||||||
  curl.perform()
 | 
					 | 
				
			||||||
  curl.close()
 | 
					 | 
				
			||||||
  fp.close()
 | 
					 | 
				
			||||||
  return get_file_sha(path) == sha
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#constants
 | 
					 | 
				
			||||||
ftp_retries = 3
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SHA_COL = 0
 | 
					 | 
				
			||||||
NAME_COL = 1
 | 
					 | 
				
			||||||
EXPECTED_COL = 2
 | 
					 | 
				
			||||||
HASH_CHUNK = 65536
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Main script
 | 
					 | 
				
			||||||
try:
 | 
					 | 
				
			||||||
  opts, args = \
 | 
					 | 
				
			||||||
      getopt.getopt(sys.argv[1:], \
 | 
					 | 
				
			||||||
                    "u:i:o:", ["url=", "input_csv=", "output_dir="])
 | 
					 | 
				
			||||||
except:
 | 
					 | 
				
			||||||
  print 'get_files.py -u <url> -i <input_csv> -o <output_dir>'
 | 
					 | 
				
			||||||
  sys.exit(2)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
for opt, arg in opts:
 | 
					 | 
				
			||||||
  if opt == '-u':
 | 
					 | 
				
			||||||
    url = arg
 | 
					 | 
				
			||||||
  elif opt in ("-i", "--input_csv"):
 | 
					 | 
				
			||||||
    file_list_path = os.path.join(arg)
 | 
					 | 
				
			||||||
  elif opt in ("-o", "--output_dir"):
 | 
					 | 
				
			||||||
    local_resource_path = os.path.join(arg)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if len(sys.argv) != 7:
 | 
					 | 
				
			||||||
  print "Expects two paths and a url!"
 | 
					 | 
				
			||||||
  exit(1)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if not os.path.isdir(local_resource_path):
 | 
					 | 
				
			||||||
  os.makedirs(local_resource_path)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
file_list_csv = open(file_list_path, "rb")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Our 'csv' file uses multiple spaces as a delimiter, python's
 | 
					 | 
				
			||||||
# csv class only uses single character delimiters, so we convert them below
 | 
					 | 
				
			||||||
file_list_reader = csv.reader((re.sub(' +', ' ', line) \
 | 
					 | 
				
			||||||
    for line in file_list_csv), delimiter = ' ')
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
file_shas = []
 | 
					 | 
				
			||||||
file_names = []
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
for row in file_list_reader:
 | 
					 | 
				
			||||||
  if len(row) != EXPECTED_COL:
 | 
					 | 
				
			||||||
      continue
 | 
					 | 
				
			||||||
  file_shas.append(row[SHA_COL])
 | 
					 | 
				
			||||||
  file_names.append(row[NAME_COL])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
file_list_csv.close()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Download files, only if they don't already exist and have correct shas
 | 
					 | 
				
			||||||
for filename, sha in itertools.izip(file_names, file_shas):
 | 
					 | 
				
			||||||
  path = os.path.join(local_resource_path, filename)
 | 
					 | 
				
			||||||
  if os.path.isfile(path) \
 | 
					 | 
				
			||||||
      and get_file_sha(path) == sha:
 | 
					 | 
				
			||||||
    print path + ' exists, skipping'
 | 
					 | 
				
			||||||
    continue
 | 
					 | 
				
			||||||
  for retry in range(0, ftp_retries):
 | 
					 | 
				
			||||||
    print "Downloading " + path
 | 
					 | 
				
			||||||
    if not download_and_check_sha(url, filename, sha):
 | 
					 | 
				
			||||||
      print "Sha does not match, retrying..."
 | 
					 | 
				
			||||||
    else:
 | 
					 | 
				
			||||||
      break
 | 
					 | 
				
			||||||
@@ -1,82 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *  Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
 *  that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
 *  tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
 *  in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
 *  be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
#include <climits>
 | 
					 | 
				
			||||||
#include <vector>
 | 
					 | 
				
			||||||
#include "third_party/googletest/src/include/gtest/gtest.h"
 | 
					 | 
				
			||||||
#include "test/codec_factory.h"
 | 
					 | 
				
			||||||
#include "test/encode_test_driver.h"
 | 
					 | 
				
			||||||
#include "test/i420_video_source.h"
 | 
					 | 
				
			||||||
#include "test/util.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class BordersTest : public ::libvpx_test::EncoderTest,
 | 
					 | 
				
			||||||
    public ::libvpx_test::CodecTestWithParam<libvpx_test::TestMode> {
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  BordersTest() : EncoderTest(GET_PARAM(0)) {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void SetUp() {
 | 
					 | 
				
			||||||
    InitializeConfig();
 | 
					 | 
				
			||||||
    SetMode(GET_PARAM(1));
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void PreEncodeFrameHook(::libvpx_test::VideoSource *video,
 | 
					 | 
				
			||||||
                                  ::libvpx_test::Encoder *encoder) {
 | 
					 | 
				
			||||||
    if (video->frame() == 1) {
 | 
					 | 
				
			||||||
      encoder->Control(VP8E_SET_CPUUSED, 1);
 | 
					 | 
				
			||||||
      encoder->Control(VP8E_SET_ENABLEAUTOALTREF, 1);
 | 
					 | 
				
			||||||
      encoder->Control(VP8E_SET_ARNR_MAXFRAMES, 7);
 | 
					 | 
				
			||||||
      encoder->Control(VP8E_SET_ARNR_STRENGTH, 5);
 | 
					 | 
				
			||||||
      encoder->Control(VP8E_SET_ARNR_TYPE, 3);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void FramePktHook(const vpx_codec_cx_pkt_t *pkt) {
 | 
					 | 
				
			||||||
    if (pkt->data.frame.flags & VPX_FRAME_IS_KEY) {
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(BordersTest, TestEncodeHighBitrate) {
 | 
					 | 
				
			||||||
  // Validate that this non multiple of 64 wide clip encodes and decodes
 | 
					 | 
				
			||||||
  // without a mismatch when passing in a very low max q.  This pushes
 | 
					 | 
				
			||||||
  // the encoder to producing lots of big partitions which will likely
 | 
					 | 
				
			||||||
  // extend into the border and test the border condition.
 | 
					 | 
				
			||||||
  cfg_.g_lag_in_frames = 25;
 | 
					 | 
				
			||||||
  cfg_.rc_2pass_vbr_minsection_pct = 5;
 | 
					 | 
				
			||||||
  cfg_.rc_2pass_vbr_minsection_pct = 2000;
 | 
					 | 
				
			||||||
  cfg_.rc_target_bitrate = 2000;
 | 
					 | 
				
			||||||
  cfg_.rc_max_quantizer = 10;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  ::libvpx_test::I420VideoSource video("hantro_odd.yuv", 208, 144, 30, 1, 0,
 | 
					 | 
				
			||||||
                                       40);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
TEST_P(BordersTest, TestLowBitrate) {
 | 
					 | 
				
			||||||
  // Validate that this clip encodes and decodes without a mismatch
 | 
					 | 
				
			||||||
  // when passing in a very high min q.  This pushes the encoder to producing
 | 
					 | 
				
			||||||
  // lots of small partitions which might will test the other condition.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  cfg_.g_lag_in_frames = 25;
 | 
					 | 
				
			||||||
  cfg_.rc_2pass_vbr_minsection_pct = 5;
 | 
					 | 
				
			||||||
  cfg_.rc_2pass_vbr_minsection_pct = 2000;
 | 
					 | 
				
			||||||
  cfg_.rc_target_bitrate = 200;
 | 
					 | 
				
			||||||
  cfg_.rc_min_quantizer = 40;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  ::libvpx_test::I420VideoSource video("hantro_odd.yuv", 208, 144, 30, 1, 0,
 | 
					 | 
				
			||||||
                                       40);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
VP9_INSTANTIATE_TEST_CASE(BordersTest, ::testing::Values(
 | 
					 | 
				
			||||||
    ::libvpx_test::kTwoPassGood));
 | 
					 | 
				
			||||||
}  // namespace
 | 
					 | 
				
			||||||
@@ -1,31 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 *  Copyright (c) 2013 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *  Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
 *  that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
 *  tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
 *  in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
 *  be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
#ifndef TEST_CLEAR_SYSTEM_STATE_H_
 | 
					 | 
				
			||||||
#define TEST_CLEAR_SYSTEM_STATE_H_
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "./vpx_config.h"
 | 
					 | 
				
			||||||
extern "C" {
 | 
					 | 
				
			||||||
#if ARCH_X86 || ARCH_X86_64
 | 
					 | 
				
			||||||
# include "vpx_ports/x86.h"
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace libvpx_test {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Reset system to a known state. This function should be used for all non-API
 | 
					 | 
				
			||||||
// test cases.
 | 
					 | 
				
			||||||
inline void ClearSystemState() {
 | 
					 | 
				
			||||||
#if ARCH_X86 || ARCH_X86_64
 | 
					 | 
				
			||||||
  vpx_reset_mmx_state();
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}  // namespace libvpx_test
 | 
					 | 
				
			||||||
#endif  // TEST_CLEAR_SYSTEM_STATE_H_
 | 
					 | 
				
			||||||
@@ -1,232 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 *  Copyright (c) 2013 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *  Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
 *  that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
 *  tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
 *  in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
 *  be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
#ifndef TEST_CODEC_FACTORY_H_
 | 
					 | 
				
			||||||
#define TEST_CODEC_FACTORY_H_
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern "C" {
 | 
					 | 
				
			||||||
#include "./vpx_config.h"
 | 
					 | 
				
			||||||
#include "vpx/vpx_decoder.h"
 | 
					 | 
				
			||||||
#include "vpx/vpx_encoder.h"
 | 
					 | 
				
			||||||
#if CONFIG_VP8_ENCODER || CONFIG_VP9_ENCODER
 | 
					 | 
				
			||||||
#include "vpx/vp8cx.h"
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#if CONFIG_VP8_DECODER || CONFIG_VP9_DECODER
 | 
					 | 
				
			||||||
#include "vpx/vp8dx.h"
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "test/decode_test_driver.h"
 | 
					 | 
				
			||||||
#include "test/encode_test_driver.h"
 | 
					 | 
				
			||||||
namespace libvpx_test {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class CodecFactory {
 | 
					 | 
				
			||||||
 public:
 | 
					 | 
				
			||||||
  CodecFactory() {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual ~CodecFactory() {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual Decoder* CreateDecoder(vpx_codec_dec_cfg_t cfg,
 | 
					 | 
				
			||||||
                                 unsigned long deadline) const = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual Encoder* CreateEncoder(vpx_codec_enc_cfg_t cfg,
 | 
					 | 
				
			||||||
                                 unsigned long deadline,
 | 
					 | 
				
			||||||
                                 const unsigned long init_flags,
 | 
					 | 
				
			||||||
                                 TwopassStatsStore *stats) const = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual vpx_codec_err_t DefaultEncoderConfig(vpx_codec_enc_cfg_t *cfg,
 | 
					 | 
				
			||||||
                                               int usage) const = 0;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Provide CodecTestWith<n>Params classes for a variable number of parameters
 | 
					 | 
				
			||||||
 * to avoid having to include a pointer to the CodecFactory in every test
 | 
					 | 
				
			||||||
 * definition.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
template<class T1>
 | 
					 | 
				
			||||||
class CodecTestWithParam : public ::testing::TestWithParam<
 | 
					 | 
				
			||||||
    std::tr1::tuple< const libvpx_test::CodecFactory*, T1 > > {
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
template<class T1, class T2>
 | 
					 | 
				
			||||||
class CodecTestWith2Params : public ::testing::TestWithParam<
 | 
					 | 
				
			||||||
    std::tr1::tuple< const libvpx_test::CodecFactory*, T1, T2 > > {
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
template<class T1, class T2, class T3>
 | 
					 | 
				
			||||||
class CodecTestWith3Params : public ::testing::TestWithParam<
 | 
					 | 
				
			||||||
    std::tr1::tuple< const libvpx_test::CodecFactory*, T1, T2, T3 > > {
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * VP8 Codec Definitions
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
#if CONFIG_VP8
 | 
					 | 
				
			||||||
class VP8Decoder : public Decoder {
 | 
					 | 
				
			||||||
 public:
 | 
					 | 
				
			||||||
  VP8Decoder(vpx_codec_dec_cfg_t cfg, unsigned long deadline)
 | 
					 | 
				
			||||||
      : Decoder(cfg, deadline) {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  virtual const vpx_codec_iface_t* CodecInterface() const {
 | 
					 | 
				
			||||||
#if CONFIG_VP8_DECODER
 | 
					 | 
				
			||||||
    return &vpx_codec_vp8_dx_algo;
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
    return NULL;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class VP8Encoder : public Encoder {
 | 
					 | 
				
			||||||
 public:
 | 
					 | 
				
			||||||
  VP8Encoder(vpx_codec_enc_cfg_t cfg, unsigned long deadline,
 | 
					 | 
				
			||||||
             const unsigned long init_flags, TwopassStatsStore *stats)
 | 
					 | 
				
			||||||
      : Encoder(cfg, deadline, init_flags, stats) {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  virtual const vpx_codec_iface_t* CodecInterface() const {
 | 
					 | 
				
			||||||
#if CONFIG_VP8_ENCODER
 | 
					 | 
				
			||||||
    return &vpx_codec_vp8_cx_algo;
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
    return NULL;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class VP8CodecFactory : public CodecFactory {
 | 
					 | 
				
			||||||
 public:
 | 
					 | 
				
			||||||
  VP8CodecFactory() : CodecFactory() {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual Decoder* CreateDecoder(vpx_codec_dec_cfg_t cfg,
 | 
					 | 
				
			||||||
                                 unsigned long deadline) const {
 | 
					 | 
				
			||||||
#if CONFIG_VP8_DECODER
 | 
					 | 
				
			||||||
    return new VP8Decoder(cfg, deadline);
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
    return NULL;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual Encoder* CreateEncoder(vpx_codec_enc_cfg_t cfg,
 | 
					 | 
				
			||||||
                                 unsigned long deadline,
 | 
					 | 
				
			||||||
                                 const unsigned long init_flags,
 | 
					 | 
				
			||||||
                                 TwopassStatsStore *stats) const {
 | 
					 | 
				
			||||||
#if CONFIG_VP8_ENCODER
 | 
					 | 
				
			||||||
    return new VP8Encoder(cfg, deadline, init_flags, stats);
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
    return NULL;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual vpx_codec_err_t DefaultEncoderConfig(vpx_codec_enc_cfg_t *cfg,
 | 
					 | 
				
			||||||
                                               int usage) const {
 | 
					 | 
				
			||||||
#if CONFIG_VP8_ENCODER
 | 
					 | 
				
			||||||
    return vpx_codec_enc_config_default(&vpx_codec_vp8_cx_algo, cfg, usage);
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
    return VPX_CODEC_INCAPABLE;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const libvpx_test::VP8CodecFactory kVP8;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define VP8_INSTANTIATE_TEST_CASE(test, ...)\
 | 
					 | 
				
			||||||
  INSTANTIATE_TEST_CASE_P(VP8, test, \
 | 
					 | 
				
			||||||
      ::testing::Combine( \
 | 
					 | 
				
			||||||
          ::testing::Values(static_cast<const libvpx_test::CodecFactory*>( \
 | 
					 | 
				
			||||||
              &libvpx_test::kVP8)), \
 | 
					 | 
				
			||||||
          __VA_ARGS__))
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
#define VP8_INSTANTIATE_TEST_CASE(test, ...)
 | 
					 | 
				
			||||||
#endif  // CONFIG_VP8
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * VP9 Codec Definitions
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
#if CONFIG_VP9
 | 
					 | 
				
			||||||
class VP9Decoder : public Decoder {
 | 
					 | 
				
			||||||
 public:
 | 
					 | 
				
			||||||
  VP9Decoder(vpx_codec_dec_cfg_t cfg, unsigned long deadline)
 | 
					 | 
				
			||||||
      : Decoder(cfg, deadline) {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  virtual const vpx_codec_iface_t* CodecInterface() const {
 | 
					 | 
				
			||||||
#if CONFIG_VP9_DECODER
 | 
					 | 
				
			||||||
    return &vpx_codec_vp9_dx_algo;
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
    return NULL;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class VP9Encoder : public Encoder {
 | 
					 | 
				
			||||||
 public:
 | 
					 | 
				
			||||||
  VP9Encoder(vpx_codec_enc_cfg_t cfg, unsigned long deadline,
 | 
					 | 
				
			||||||
             const unsigned long init_flags, TwopassStatsStore *stats)
 | 
					 | 
				
			||||||
      : Encoder(cfg, deadline, init_flags, stats) {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  virtual const vpx_codec_iface_t* CodecInterface() const {
 | 
					 | 
				
			||||||
#if CONFIG_VP9_ENCODER
 | 
					 | 
				
			||||||
    return &vpx_codec_vp9_cx_algo;
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
    return NULL;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class VP9CodecFactory : public CodecFactory {
 | 
					 | 
				
			||||||
 public:
 | 
					 | 
				
			||||||
  VP9CodecFactory() : CodecFactory() {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual Decoder* CreateDecoder(vpx_codec_dec_cfg_t cfg,
 | 
					 | 
				
			||||||
                                 unsigned long deadline) const {
 | 
					 | 
				
			||||||
#if CONFIG_VP9_DECODER
 | 
					 | 
				
			||||||
    return new VP9Decoder(cfg, deadline);
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
    return NULL;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual Encoder* CreateEncoder(vpx_codec_enc_cfg_t cfg,
 | 
					 | 
				
			||||||
                                 unsigned long deadline,
 | 
					 | 
				
			||||||
                                 const unsigned long init_flags,
 | 
					 | 
				
			||||||
                                 TwopassStatsStore *stats) const {
 | 
					 | 
				
			||||||
#if CONFIG_VP9_ENCODER
 | 
					 | 
				
			||||||
    return new VP9Encoder(cfg, deadline, init_flags, stats);
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
    return NULL;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual vpx_codec_err_t DefaultEncoderConfig(vpx_codec_enc_cfg_t *cfg,
 | 
					 | 
				
			||||||
                                               int usage) const {
 | 
					 | 
				
			||||||
#if CONFIG_VP9_ENCODER
 | 
					 | 
				
			||||||
    return vpx_codec_enc_config_default(&vpx_codec_vp9_cx_algo, cfg, usage);
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
    return VPX_CODEC_INCAPABLE;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const libvpx_test::VP9CodecFactory kVP9;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define VP9_INSTANTIATE_TEST_CASE(test, ...)\
 | 
					 | 
				
			||||||
  INSTANTIATE_TEST_CASE_P(VP9, test, \
 | 
					 | 
				
			||||||
      ::testing::Combine( \
 | 
					 | 
				
			||||||
          ::testing::Values(static_cast<const libvpx_test::CodecFactory*>( \
 | 
					 | 
				
			||||||
               &libvpx_test::kVP9)), \
 | 
					 | 
				
			||||||
          __VA_ARGS__))
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
#define VP9_INSTANTIATE_TEST_CASE(test, ...)
 | 
					 | 
				
			||||||
#endif  // CONFIG_VP9
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}  // namespace libvpx_test
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif  // TEST_CODEC_FACTORY_H_
 | 
					 | 
				
			||||||
@@ -1,59 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *  Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
 *  that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
 *  tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
 *  in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
 *  be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
#include "third_party/googletest/src/include/gtest/gtest.h"
 | 
					 | 
				
			||||||
#include "test/codec_factory.h"
 | 
					 | 
				
			||||||
#include "test/encode_test_driver.h"
 | 
					 | 
				
			||||||
#include "test/util.h"
 | 
					 | 
				
			||||||
#include "test/video_source.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class ConfigTest : public ::libvpx_test::EncoderTest,
 | 
					 | 
				
			||||||
    public ::libvpx_test::CodecTestWithParam<libvpx_test::TestMode> {
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  ConfigTest() : EncoderTest(GET_PARAM(0)),
 | 
					 | 
				
			||||||
                 frame_count_in_(0), frame_count_out_(0), frame_count_max_(0) {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void SetUp() {
 | 
					 | 
				
			||||||
    InitializeConfig();
 | 
					 | 
				
			||||||
    SetMode(GET_PARAM(1));
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void BeginPassHook(unsigned int /*pass*/) {
 | 
					 | 
				
			||||||
    frame_count_in_ = 0;
 | 
					 | 
				
			||||||
    frame_count_out_ = 0;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void PreEncodeFrameHook(libvpx_test::VideoSource* /*video*/) {
 | 
					 | 
				
			||||||
    ++frame_count_in_;
 | 
					 | 
				
			||||||
    abort_ |= (frame_count_in_ >= frame_count_max_);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void FramePktHook(const vpx_codec_cx_pkt_t* /*pkt*/) {
 | 
					 | 
				
			||||||
    ++frame_count_out_;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  unsigned int frame_count_in_;
 | 
					 | 
				
			||||||
  unsigned int frame_count_out_;
 | 
					 | 
				
			||||||
  unsigned int frame_count_max_;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(ConfigTest, LagIsDisabled) {
 | 
					 | 
				
			||||||
  frame_count_max_ = 2;
 | 
					 | 
				
			||||||
  cfg_.g_lag_in_frames = 15;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  libvpx_test::DummyVideoSource video;
 | 
					 | 
				
			||||||
  ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  EXPECT_EQ(frame_count_in_, frame_count_out_);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
VP8_INSTANTIATE_TEST_CASE(ConfigTest, ONE_PASS_TEST_MODES);
 | 
					 | 
				
			||||||
}  // namespace
 | 
					 | 
				
			||||||
@@ -1,689 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *  Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
 *  that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
 *  tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
 *  in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
 *  be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <string.h>
 | 
					 | 
				
			||||||
#include "test/acm_random.h"
 | 
					 | 
				
			||||||
#include "test/register_state_check.h"
 | 
					 | 
				
			||||||
#include "test/util.h"
 | 
					 | 
				
			||||||
#include "third_party/googletest/src/include/gtest/gtest.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern "C" {
 | 
					 | 
				
			||||||
#include "./vpx_config.h"
 | 
					 | 
				
			||||||
#include "./vp9_rtcd.h"
 | 
					 | 
				
			||||||
#include "vp9/common/vp9_filter.h"
 | 
					 | 
				
			||||||
#include "vpx_mem/vpx_mem.h"
 | 
					 | 
				
			||||||
#include "vpx_ports/mem.h"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace {
 | 
					 | 
				
			||||||
typedef void (*convolve_fn_t)(const uint8_t *src, ptrdiff_t src_stride,
 | 
					 | 
				
			||||||
                              uint8_t *dst, ptrdiff_t dst_stride,
 | 
					 | 
				
			||||||
                              const int16_t *filter_x, int filter_x_stride,
 | 
					 | 
				
			||||||
                              const int16_t *filter_y, int filter_y_stride,
 | 
					 | 
				
			||||||
                              int w, int h);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct ConvolveFunctions {
 | 
					 | 
				
			||||||
  ConvolveFunctions(convolve_fn_t h8, convolve_fn_t h8_avg,
 | 
					 | 
				
			||||||
                    convolve_fn_t v8, convolve_fn_t v8_avg,
 | 
					 | 
				
			||||||
                    convolve_fn_t hv8, convolve_fn_t hv8_avg)
 | 
					 | 
				
			||||||
      : h8_(h8), v8_(v8), hv8_(hv8), h8_avg_(h8_avg), v8_avg_(v8_avg),
 | 
					 | 
				
			||||||
        hv8_avg_(hv8_avg) {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  convolve_fn_t h8_;
 | 
					 | 
				
			||||||
  convolve_fn_t v8_;
 | 
					 | 
				
			||||||
  convolve_fn_t hv8_;
 | 
					 | 
				
			||||||
  convolve_fn_t h8_avg_;
 | 
					 | 
				
			||||||
  convolve_fn_t v8_avg_;
 | 
					 | 
				
			||||||
  convolve_fn_t hv8_avg_;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Reference 8-tap subpixel filter, slightly modified to fit into this test.
 | 
					 | 
				
			||||||
#define VP9_FILTER_WEIGHT 128
 | 
					 | 
				
			||||||
#define VP9_FILTER_SHIFT 7
 | 
					 | 
				
			||||||
uint8_t clip_pixel(int x) {
 | 
					 | 
				
			||||||
  return x < 0 ? 0 :
 | 
					 | 
				
			||||||
         x > 255 ? 255 :
 | 
					 | 
				
			||||||
         x;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void filter_block2d_8_c(const uint8_t *src_ptr,
 | 
					 | 
				
			||||||
                        const unsigned int src_stride,
 | 
					 | 
				
			||||||
                        const int16_t *HFilter,
 | 
					 | 
				
			||||||
                        const int16_t *VFilter,
 | 
					 | 
				
			||||||
                        uint8_t *dst_ptr,
 | 
					 | 
				
			||||||
                        unsigned int dst_stride,
 | 
					 | 
				
			||||||
                        unsigned int output_width,
 | 
					 | 
				
			||||||
                        unsigned int output_height) {
 | 
					 | 
				
			||||||
  // Between passes, we use an intermediate buffer whose height is extended to
 | 
					 | 
				
			||||||
  // have enough horizontally filtered values as input for the vertical pass.
 | 
					 | 
				
			||||||
  // This buffer is allocated to be big enough for the largest block type we
 | 
					 | 
				
			||||||
  // support.
 | 
					 | 
				
			||||||
  const int kInterp_Extend = 4;
 | 
					 | 
				
			||||||
  const unsigned int intermediate_height =
 | 
					 | 
				
			||||||
      (kInterp_Extend - 1) + output_height + kInterp_Extend;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /* Size of intermediate_buffer is max_intermediate_height * filter_max_width,
 | 
					 | 
				
			||||||
   * where max_intermediate_height = (kInterp_Extend - 1) + filter_max_height
 | 
					 | 
				
			||||||
   *                                 + kInterp_Extend
 | 
					 | 
				
			||||||
   *                               = 3 + 16 + 4
 | 
					 | 
				
			||||||
   *                               = 23
 | 
					 | 
				
			||||||
   * and filter_max_width = 16
 | 
					 | 
				
			||||||
   */
 | 
					 | 
				
			||||||
  uint8_t intermediate_buffer[71 * 64];
 | 
					 | 
				
			||||||
  const int intermediate_next_stride = 1 - intermediate_height * output_width;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Horizontal pass (src -> transposed intermediate).
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    uint8_t *output_ptr = intermediate_buffer;
 | 
					 | 
				
			||||||
    const int src_next_row_stride = src_stride - output_width;
 | 
					 | 
				
			||||||
    unsigned int i, j;
 | 
					 | 
				
			||||||
    src_ptr -= (kInterp_Extend - 1) * src_stride + (kInterp_Extend - 1);
 | 
					 | 
				
			||||||
    for (i = 0; i < intermediate_height; ++i) {
 | 
					 | 
				
			||||||
      for (j = 0; j < output_width; ++j) {
 | 
					 | 
				
			||||||
        // Apply filter...
 | 
					 | 
				
			||||||
        const int temp = (src_ptr[0] * HFilter[0]) +
 | 
					 | 
				
			||||||
                         (src_ptr[1] * HFilter[1]) +
 | 
					 | 
				
			||||||
                         (src_ptr[2] * HFilter[2]) +
 | 
					 | 
				
			||||||
                         (src_ptr[3] * HFilter[3]) +
 | 
					 | 
				
			||||||
                         (src_ptr[4] * HFilter[4]) +
 | 
					 | 
				
			||||||
                         (src_ptr[5] * HFilter[5]) +
 | 
					 | 
				
			||||||
                         (src_ptr[6] * HFilter[6]) +
 | 
					 | 
				
			||||||
                         (src_ptr[7] * HFilter[7]) +
 | 
					 | 
				
			||||||
                         (VP9_FILTER_WEIGHT >> 1);  // Rounding
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // Normalize back to 0-255...
 | 
					 | 
				
			||||||
        *output_ptr = clip_pixel(temp >> VP9_FILTER_SHIFT);
 | 
					 | 
				
			||||||
        ++src_ptr;
 | 
					 | 
				
			||||||
        output_ptr += intermediate_height;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      src_ptr += src_next_row_stride;
 | 
					 | 
				
			||||||
      output_ptr += intermediate_next_stride;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Vertical pass (transposed intermediate -> dst).
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    uint8_t *src_ptr = intermediate_buffer;
 | 
					 | 
				
			||||||
    const int dst_next_row_stride = dst_stride - output_width;
 | 
					 | 
				
			||||||
    unsigned int i, j;
 | 
					 | 
				
			||||||
    for (i = 0; i < output_height; ++i) {
 | 
					 | 
				
			||||||
      for (j = 0; j < output_width; ++j) {
 | 
					 | 
				
			||||||
        // Apply filter...
 | 
					 | 
				
			||||||
        const int temp = (src_ptr[0] * VFilter[0]) +
 | 
					 | 
				
			||||||
                         (src_ptr[1] * VFilter[1]) +
 | 
					 | 
				
			||||||
                         (src_ptr[2] * VFilter[2]) +
 | 
					 | 
				
			||||||
                         (src_ptr[3] * VFilter[3]) +
 | 
					 | 
				
			||||||
                         (src_ptr[4] * VFilter[4]) +
 | 
					 | 
				
			||||||
                         (src_ptr[5] * VFilter[5]) +
 | 
					 | 
				
			||||||
                         (src_ptr[6] * VFilter[6]) +
 | 
					 | 
				
			||||||
                         (src_ptr[7] * VFilter[7]) +
 | 
					 | 
				
			||||||
                         (VP9_FILTER_WEIGHT >> 1);  // Rounding
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // Normalize back to 0-255...
 | 
					 | 
				
			||||||
        *dst_ptr++ = clip_pixel(temp >> VP9_FILTER_SHIFT);
 | 
					 | 
				
			||||||
        src_ptr += intermediate_height;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      src_ptr += intermediate_next_stride;
 | 
					 | 
				
			||||||
      dst_ptr += dst_next_row_stride;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void block2d_average_c(uint8_t *src,
 | 
					 | 
				
			||||||
                       unsigned int src_stride,
 | 
					 | 
				
			||||||
                       uint8_t *output_ptr,
 | 
					 | 
				
			||||||
                       unsigned int output_stride,
 | 
					 | 
				
			||||||
                       unsigned int output_width,
 | 
					 | 
				
			||||||
                       unsigned int output_height) {
 | 
					 | 
				
			||||||
  unsigned int i, j;
 | 
					 | 
				
			||||||
  for (i = 0; i < output_height; ++i) {
 | 
					 | 
				
			||||||
    for (j = 0; j < output_width; ++j) {
 | 
					 | 
				
			||||||
      output_ptr[j] = (output_ptr[j] + src[i * src_stride + j] + 1) >> 1;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    output_ptr += output_stride;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void filter_average_block2d_8_c(const uint8_t *src_ptr,
 | 
					 | 
				
			||||||
                                const unsigned int src_stride,
 | 
					 | 
				
			||||||
                                const int16_t *HFilter,
 | 
					 | 
				
			||||||
                                const int16_t *VFilter,
 | 
					 | 
				
			||||||
                                uint8_t *dst_ptr,
 | 
					 | 
				
			||||||
                                unsigned int dst_stride,
 | 
					 | 
				
			||||||
                                unsigned int output_width,
 | 
					 | 
				
			||||||
                                unsigned int output_height) {
 | 
					 | 
				
			||||||
  uint8_t tmp[64 * 64];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  assert(output_width <= 64);
 | 
					 | 
				
			||||||
  assert(output_height <= 64);
 | 
					 | 
				
			||||||
  filter_block2d_8_c(src_ptr, src_stride, HFilter, VFilter, tmp, 64,
 | 
					 | 
				
			||||||
                     output_width, output_height);
 | 
					 | 
				
			||||||
  block2d_average_c(tmp, 64, dst_ptr, dst_stride,
 | 
					 | 
				
			||||||
                    output_width, output_height);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class ConvolveTest : public PARAMS(int, int, const ConvolveFunctions*) {
 | 
					 | 
				
			||||||
 public:
 | 
					 | 
				
			||||||
  static void SetUpTestCase() {
 | 
					 | 
				
			||||||
    // Force input_ to be unaligned, output to be 16 byte aligned.
 | 
					 | 
				
			||||||
    input_ = reinterpret_cast<uint8_t*>(
 | 
					 | 
				
			||||||
        vpx_memalign(kDataAlignment, kInputBufferSize + 1)) + 1;
 | 
					 | 
				
			||||||
    output_ = reinterpret_cast<uint8_t*>(
 | 
					 | 
				
			||||||
        vpx_memalign(kDataAlignment, kOutputBufferSize));
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  static void TearDownTestCase() {
 | 
					 | 
				
			||||||
    vpx_free(input_ - 1);
 | 
					 | 
				
			||||||
    input_ = NULL;
 | 
					 | 
				
			||||||
    vpx_free(output_);
 | 
					 | 
				
			||||||
    output_ = NULL;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  static const int kDataAlignment = 16;
 | 
					 | 
				
			||||||
  static const int kOuterBlockSize = 256;
 | 
					 | 
				
			||||||
  static const int kInputStride = kOuterBlockSize;
 | 
					 | 
				
			||||||
  static const int kOutputStride = kOuterBlockSize;
 | 
					 | 
				
			||||||
  static const int kMaxDimension = 64;
 | 
					 | 
				
			||||||
  static const int kInputBufferSize = kOuterBlockSize * kOuterBlockSize;
 | 
					 | 
				
			||||||
  static const int kOutputBufferSize = kOuterBlockSize * kOuterBlockSize;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  int Width() const { return GET_PARAM(0); }
 | 
					 | 
				
			||||||
  int Height() const { return GET_PARAM(1); }
 | 
					 | 
				
			||||||
  int BorderLeft() const {
 | 
					 | 
				
			||||||
    const int center = (kOuterBlockSize - Width()) / 2;
 | 
					 | 
				
			||||||
    return (center + (kDataAlignment - 1)) & ~(kDataAlignment - 1);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  int BorderTop() const { return (kOuterBlockSize - Height()) / 2; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  bool IsIndexInBorder(int i) {
 | 
					 | 
				
			||||||
    return (i < BorderTop() * kOuterBlockSize ||
 | 
					 | 
				
			||||||
            i >= (BorderTop() + Height()) * kOuterBlockSize ||
 | 
					 | 
				
			||||||
            i % kOuterBlockSize < BorderLeft() ||
 | 
					 | 
				
			||||||
            i % kOuterBlockSize >= (BorderLeft() + Width()));
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void SetUp() {
 | 
					 | 
				
			||||||
    UUT_ = GET_PARAM(2);
 | 
					 | 
				
			||||||
    /* Set up guard blocks for an inner block centered in the outer block */
 | 
					 | 
				
			||||||
    for (int i = 0; i < kOutputBufferSize; ++i) {
 | 
					 | 
				
			||||||
      if (IsIndexInBorder(i))
 | 
					 | 
				
			||||||
        output_[i] = 255;
 | 
					 | 
				
			||||||
      else
 | 
					 | 
				
			||||||
        output_[i] = 0;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    ::libvpx_test::ACMRandom prng;
 | 
					 | 
				
			||||||
    for (int i = 0; i < kInputBufferSize; ++i)
 | 
					 | 
				
			||||||
      input_[i] = prng.Rand8Extremes();
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  void SetConstantInput(int value) {
 | 
					 | 
				
			||||||
    memset(input_, value, kInputBufferSize);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  void CheckGuardBlocks() {
 | 
					 | 
				
			||||||
    for (int i = 0; i < kOutputBufferSize; ++i) {
 | 
					 | 
				
			||||||
      if (IsIndexInBorder(i))
 | 
					 | 
				
			||||||
        EXPECT_EQ(255, output_[i]);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  uint8_t* input() const {
 | 
					 | 
				
			||||||
    return input_ + BorderTop() * kOuterBlockSize + BorderLeft();
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  uint8_t* output() const {
 | 
					 | 
				
			||||||
    return output_ + BorderTop() * kOuterBlockSize + BorderLeft();
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  const ConvolveFunctions* UUT_;
 | 
					 | 
				
			||||||
  static uint8_t* input_;
 | 
					 | 
				
			||||||
  static uint8_t* output_;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
uint8_t* ConvolveTest::input_ = NULL;
 | 
					 | 
				
			||||||
uint8_t* ConvolveTest::output_ = NULL;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(ConvolveTest, GuardBlocks) {
 | 
					 | 
				
			||||||
  CheckGuardBlocks();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(ConvolveTest, CopyHoriz) {
 | 
					 | 
				
			||||||
  uint8_t* const in = input();
 | 
					 | 
				
			||||||
  uint8_t* const out = output();
 | 
					 | 
				
			||||||
  DECLARE_ALIGNED(256, const int16_t, filter8[8]) = {0, 0, 0, 128, 0, 0, 0, 0};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  REGISTER_STATE_CHECK(
 | 
					 | 
				
			||||||
      UUT_->h8_(in, kInputStride, out, kOutputStride, filter8, 16, filter8, 16,
 | 
					 | 
				
			||||||
                Width(), Height()));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  CheckGuardBlocks();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  for (int y = 0; y < Height(); ++y)
 | 
					 | 
				
			||||||
    for (int x = 0; x < Width(); ++x)
 | 
					 | 
				
			||||||
      ASSERT_EQ(out[y * kOutputStride + x], in[y * kInputStride + x])
 | 
					 | 
				
			||||||
          << "(" << x << "," << y << ")";
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(ConvolveTest, CopyVert) {
 | 
					 | 
				
			||||||
  uint8_t* const in = input();
 | 
					 | 
				
			||||||
  uint8_t* const out = output();
 | 
					 | 
				
			||||||
  DECLARE_ALIGNED(256, const int16_t, filter8[8]) = {0, 0, 0, 128, 0, 0, 0, 0};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  REGISTER_STATE_CHECK(
 | 
					 | 
				
			||||||
      UUT_->v8_(in, kInputStride, out, kOutputStride, filter8, 16, filter8, 16,
 | 
					 | 
				
			||||||
                Width(), Height()));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  CheckGuardBlocks();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  for (int y = 0; y < Height(); ++y)
 | 
					 | 
				
			||||||
    for (int x = 0; x < Width(); ++x)
 | 
					 | 
				
			||||||
      ASSERT_EQ(out[y * kOutputStride + x], in[y * kInputStride + x])
 | 
					 | 
				
			||||||
          << "(" << x << "," << y << ")";
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(ConvolveTest, Copy2D) {
 | 
					 | 
				
			||||||
  uint8_t* const in = input();
 | 
					 | 
				
			||||||
  uint8_t* const out = output();
 | 
					 | 
				
			||||||
  DECLARE_ALIGNED(256, const int16_t, filter8[8]) = {0, 0, 0, 128, 0, 0, 0, 0};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  REGISTER_STATE_CHECK(
 | 
					 | 
				
			||||||
      UUT_->hv8_(in, kInputStride, out, kOutputStride, filter8, 16, filter8, 16,
 | 
					 | 
				
			||||||
                 Width(), Height()));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  CheckGuardBlocks();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  for (int y = 0; y < Height(); ++y)
 | 
					 | 
				
			||||||
    for (int x = 0; x < Width(); ++x)
 | 
					 | 
				
			||||||
      ASSERT_EQ(out[y * kOutputStride + x], in[y * kInputStride + x])
 | 
					 | 
				
			||||||
          << "(" << x << "," << y << ")";
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const int16_t (*kTestFilterList[])[8] = {
 | 
					 | 
				
			||||||
  vp9_bilinear_filters,
 | 
					 | 
				
			||||||
  vp9_sub_pel_filters_8,
 | 
					 | 
				
			||||||
  vp9_sub_pel_filters_8s,
 | 
					 | 
				
			||||||
  vp9_sub_pel_filters_8lp
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
const int kNumFilterBanks = sizeof(kTestFilterList) /
 | 
					 | 
				
			||||||
                            sizeof(kTestFilterList[0]);
 | 
					 | 
				
			||||||
const int kNumFilters = 16;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST(ConvolveTest, FiltersWontSaturateWhenAddedPairwise) {
 | 
					 | 
				
			||||||
  for (int filter_bank = 0; filter_bank < kNumFilterBanks; ++filter_bank) {
 | 
					 | 
				
			||||||
    const int16_t (*filters)[8] = kTestFilterList[filter_bank];
 | 
					 | 
				
			||||||
    for (int i = 0; i < kNumFilters; i++) {
 | 
					 | 
				
			||||||
      const int p0 = filters[i][0] + filters[i][1];
 | 
					 | 
				
			||||||
      const int p1 = filters[i][2] + filters[i][3];
 | 
					 | 
				
			||||||
      const int p2 = filters[i][4] + filters[i][5];
 | 
					 | 
				
			||||||
      const int p3 = filters[i][6] + filters[i][7];
 | 
					 | 
				
			||||||
      EXPECT_LE(p0, 128);
 | 
					 | 
				
			||||||
      EXPECT_LE(p1, 128);
 | 
					 | 
				
			||||||
      EXPECT_LE(p2, 128);
 | 
					 | 
				
			||||||
      EXPECT_LE(p3, 128);
 | 
					 | 
				
			||||||
      EXPECT_LE(p0 + p3, 128);
 | 
					 | 
				
			||||||
      EXPECT_LE(p0 + p3 + p1, 128);
 | 
					 | 
				
			||||||
      EXPECT_LE(p0 + p3 + p1 + p2, 128);
 | 
					 | 
				
			||||||
      EXPECT_EQ(p0 + p1 + p2 + p3, 128);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const int16_t kInvalidFilter[8] = { 0 };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(ConvolveTest, MatchesReferenceSubpixelFilter) {
 | 
					 | 
				
			||||||
  uint8_t* const in = input();
 | 
					 | 
				
			||||||
  uint8_t* const out = output();
 | 
					 | 
				
			||||||
  uint8_t ref[kOutputStride * kMaxDimension];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  for (int filter_bank = 0; filter_bank < kNumFilterBanks; ++filter_bank) {
 | 
					 | 
				
			||||||
    const int16_t (*filters)[8] = kTestFilterList[filter_bank];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (int filter_x = 0; filter_x < kNumFilters; ++filter_x) {
 | 
					 | 
				
			||||||
      for (int filter_y = 0; filter_y < kNumFilters; ++filter_y) {
 | 
					 | 
				
			||||||
        filter_block2d_8_c(in, kInputStride,
 | 
					 | 
				
			||||||
                           filters[filter_x], filters[filter_y],
 | 
					 | 
				
			||||||
                           ref, kOutputStride,
 | 
					 | 
				
			||||||
                           Width(), Height());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (filters == vp9_sub_pel_filters_8lp || (filter_x && filter_y))
 | 
					 | 
				
			||||||
          REGISTER_STATE_CHECK(
 | 
					 | 
				
			||||||
              UUT_->hv8_(in, kInputStride, out, kOutputStride,
 | 
					 | 
				
			||||||
                         filters[filter_x], 16, filters[filter_y], 16,
 | 
					 | 
				
			||||||
                         Width(), Height()));
 | 
					 | 
				
			||||||
        else if (filter_y)
 | 
					 | 
				
			||||||
          REGISTER_STATE_CHECK(
 | 
					 | 
				
			||||||
              UUT_->v8_(in, kInputStride, out, kOutputStride,
 | 
					 | 
				
			||||||
                        kInvalidFilter, 16, filters[filter_y], 16,
 | 
					 | 
				
			||||||
                        Width(), Height()));
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
          REGISTER_STATE_CHECK(
 | 
					 | 
				
			||||||
              UUT_->h8_(in, kInputStride, out, kOutputStride,
 | 
					 | 
				
			||||||
                        filters[filter_x], 16, kInvalidFilter, 16,
 | 
					 | 
				
			||||||
                        Width(), Height()));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        CheckGuardBlocks();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        for (int y = 0; y < Height(); ++y)
 | 
					 | 
				
			||||||
          for (int x = 0; x < Width(); ++x)
 | 
					 | 
				
			||||||
            ASSERT_EQ(ref[y * kOutputStride + x], out[y * kOutputStride + x])
 | 
					 | 
				
			||||||
                << "mismatch at (" << x << "," << y << "), "
 | 
					 | 
				
			||||||
                << "filters (" << filter_bank << ","
 | 
					 | 
				
			||||||
                << filter_x << "," << filter_y << ")";
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(ConvolveTest, MatchesReferenceAveragingSubpixelFilter) {
 | 
					 | 
				
			||||||
  uint8_t* const in = input();
 | 
					 | 
				
			||||||
  uint8_t* const out = output();
 | 
					 | 
				
			||||||
  uint8_t ref[kOutputStride * kMaxDimension];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Populate ref and out with some random data
 | 
					 | 
				
			||||||
  ::libvpx_test::ACMRandom prng;
 | 
					 | 
				
			||||||
  for (int y = 0; y < Height(); ++y) {
 | 
					 | 
				
			||||||
    for (int x = 0; x < Width(); ++x) {
 | 
					 | 
				
			||||||
      const uint8_t r = prng.Rand8Extremes();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      out[y * kOutputStride + x] = r;
 | 
					 | 
				
			||||||
      ref[y * kOutputStride + x] = r;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  const int kNumFilterBanks = sizeof(kTestFilterList) /
 | 
					 | 
				
			||||||
      sizeof(kTestFilterList[0]);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  for (int filter_bank = 0; filter_bank < kNumFilterBanks; ++filter_bank) {
 | 
					 | 
				
			||||||
    const int16_t (*filters)[8] = kTestFilterList[filter_bank];
 | 
					 | 
				
			||||||
    const int kNumFilters = 16;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (int filter_x = 0; filter_x < kNumFilters; ++filter_x) {
 | 
					 | 
				
			||||||
      for (int filter_y = 0; filter_y < kNumFilters; ++filter_y) {
 | 
					 | 
				
			||||||
        filter_average_block2d_8_c(in, kInputStride,
 | 
					 | 
				
			||||||
                                   filters[filter_x], filters[filter_y],
 | 
					 | 
				
			||||||
                                   ref, kOutputStride,
 | 
					 | 
				
			||||||
                                   Width(), Height());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (filters == vp9_sub_pel_filters_8lp || (filter_x && filter_y))
 | 
					 | 
				
			||||||
          REGISTER_STATE_CHECK(
 | 
					 | 
				
			||||||
              UUT_->hv8_avg_(in, kInputStride, out, kOutputStride,
 | 
					 | 
				
			||||||
                             filters[filter_x], 16, filters[filter_y], 16,
 | 
					 | 
				
			||||||
                             Width(), Height()));
 | 
					 | 
				
			||||||
        else if (filter_y)
 | 
					 | 
				
			||||||
          REGISTER_STATE_CHECK(
 | 
					 | 
				
			||||||
              UUT_->v8_avg_(in, kInputStride, out, kOutputStride,
 | 
					 | 
				
			||||||
                            filters[filter_x], 16, filters[filter_y], 16,
 | 
					 | 
				
			||||||
                            Width(), Height()));
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
          REGISTER_STATE_CHECK(
 | 
					 | 
				
			||||||
              UUT_->h8_avg_(in, kInputStride, out, kOutputStride,
 | 
					 | 
				
			||||||
                            filters[filter_x], 16, filters[filter_y], 16,
 | 
					 | 
				
			||||||
                            Width(), Height()));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        CheckGuardBlocks();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        for (int y = 0; y < Height(); ++y)
 | 
					 | 
				
			||||||
          for (int x = 0; x < Width(); ++x)
 | 
					 | 
				
			||||||
            ASSERT_EQ(ref[y * kOutputStride + x], out[y * kOutputStride + x])
 | 
					 | 
				
			||||||
                << "mismatch at (" << x << "," << y << "), "
 | 
					 | 
				
			||||||
                << "filters (" << filter_bank << ","
 | 
					 | 
				
			||||||
                << filter_x << "," << filter_y << ")";
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
DECLARE_ALIGNED(256, const int16_t, kChangeFilters[16][8]) = {
 | 
					 | 
				
			||||||
    { 0,   0,   0,   0,   0,   0,   0, 128},
 | 
					 | 
				
			||||||
    { 0,   0,   0,   0,   0,   0, 128},
 | 
					 | 
				
			||||||
    { 0,   0,   0,   0,   0, 128},
 | 
					 | 
				
			||||||
    { 0,   0,   0,   0, 128},
 | 
					 | 
				
			||||||
    { 0,   0,   0, 128},
 | 
					 | 
				
			||||||
    { 0,   0, 128},
 | 
					 | 
				
			||||||
    { 0, 128},
 | 
					 | 
				
			||||||
    { 128},
 | 
					 | 
				
			||||||
    { 0,   0,   0,   0,   0,   0,   0, 128},
 | 
					 | 
				
			||||||
    { 0,   0,   0,   0,   0,   0, 128},
 | 
					 | 
				
			||||||
    { 0,   0,   0,   0,   0, 128},
 | 
					 | 
				
			||||||
    { 0,   0,   0,   0, 128},
 | 
					 | 
				
			||||||
    { 0,   0,   0, 128},
 | 
					 | 
				
			||||||
    { 0,   0, 128},
 | 
					 | 
				
			||||||
    { 0, 128},
 | 
					 | 
				
			||||||
    { 128}
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* This test exercises the horizontal and vertical filter functions. */
 | 
					 | 
				
			||||||
TEST_P(ConvolveTest, ChangeFilterWorks) {
 | 
					 | 
				
			||||||
  uint8_t* const in = input();
 | 
					 | 
				
			||||||
  uint8_t* const out = output();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /* Assume that the first input sample is at the 8/16th position. */
 | 
					 | 
				
			||||||
  const int kInitialSubPelOffset = 8;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /* Filters are 8-tap, so the first filter tap will be applied to the pixel
 | 
					 | 
				
			||||||
   * at position -3 with respect to the current filtering position. Since
 | 
					 | 
				
			||||||
   * kInitialSubPelOffset is set to 8, we first select sub-pixel filter 8,
 | 
					 | 
				
			||||||
   * which is non-zero only in the last tap. So, applying the filter at the
 | 
					 | 
				
			||||||
   * current input position will result in an output equal to the pixel at
 | 
					 | 
				
			||||||
   * offset +4 (-3 + 7) with respect to the current filtering position.
 | 
					 | 
				
			||||||
   */
 | 
					 | 
				
			||||||
  const int kPixelSelected = 4;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /* Assume that each output pixel requires us to step on by 17/16th pixels in
 | 
					 | 
				
			||||||
   * the input.
 | 
					 | 
				
			||||||
   */
 | 
					 | 
				
			||||||
  const int kInputPixelStep = 17;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /* The filters are setup in such a way that the expected output produces
 | 
					 | 
				
			||||||
   * sets of 8 identical output samples. As the filter position moves to the
 | 
					 | 
				
			||||||
   * next 1/16th pixel position the only active (=128) filter tap moves one
 | 
					 | 
				
			||||||
   * position to the left, resulting in the same input pixel being replicated
 | 
					 | 
				
			||||||
   * in to the output for 8 consecutive samples. After each set of 8 positions
 | 
					 | 
				
			||||||
   * the filters select a different input pixel. kFilterPeriodAdjust below
 | 
					 | 
				
			||||||
   * computes which input pixel is written to the output for a specified
 | 
					 | 
				
			||||||
   * x or y position.
 | 
					 | 
				
			||||||
   */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /* Test the horizontal filter. */
 | 
					 | 
				
			||||||
  REGISTER_STATE_CHECK(UUT_->h8_(in, kInputStride, out, kOutputStride,
 | 
					 | 
				
			||||||
                                 kChangeFilters[kInitialSubPelOffset],
 | 
					 | 
				
			||||||
                                 kInputPixelStep, NULL, 0, Width(), Height()));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  for (int x = 0; x < Width(); ++x) {
 | 
					 | 
				
			||||||
    const int kFilterPeriodAdjust = (x >> 3) << 3;
 | 
					 | 
				
			||||||
    const int ref_x =
 | 
					 | 
				
			||||||
        kPixelSelected + ((kInitialSubPelOffset
 | 
					 | 
				
			||||||
            + kFilterPeriodAdjust * kInputPixelStep)
 | 
					 | 
				
			||||||
                          >> SUBPEL_BITS);
 | 
					 | 
				
			||||||
    ASSERT_EQ(in[ref_x], out[x]) << "x == " << x << "width = " << Width();
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /* Test the vertical filter. */
 | 
					 | 
				
			||||||
  REGISTER_STATE_CHECK(UUT_->v8_(in, kInputStride, out, kOutputStride,
 | 
					 | 
				
			||||||
                                 NULL, 0, kChangeFilters[kInitialSubPelOffset],
 | 
					 | 
				
			||||||
                                 kInputPixelStep, Width(), Height()));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  for (int y = 0; y < Height(); ++y) {
 | 
					 | 
				
			||||||
    const int kFilterPeriodAdjust = (y >> 3) << 3;
 | 
					 | 
				
			||||||
    const int ref_y =
 | 
					 | 
				
			||||||
        kPixelSelected + ((kInitialSubPelOffset
 | 
					 | 
				
			||||||
            + kFilterPeriodAdjust * kInputPixelStep)
 | 
					 | 
				
			||||||
                          >> SUBPEL_BITS);
 | 
					 | 
				
			||||||
    ASSERT_EQ(in[ref_y * kInputStride], out[y * kInputStride]) << "y == " << y;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /* Test the horizontal and vertical filters in combination. */
 | 
					 | 
				
			||||||
  REGISTER_STATE_CHECK(UUT_->hv8_(in, kInputStride, out, kOutputStride,
 | 
					 | 
				
			||||||
                                  kChangeFilters[kInitialSubPelOffset],
 | 
					 | 
				
			||||||
                                  kInputPixelStep,
 | 
					 | 
				
			||||||
                                  kChangeFilters[kInitialSubPelOffset],
 | 
					 | 
				
			||||||
                                  kInputPixelStep,
 | 
					 | 
				
			||||||
                                  Width(), Height()));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  for (int y = 0; y < Height(); ++y) {
 | 
					 | 
				
			||||||
    const int kFilterPeriodAdjustY = (y >> 3) << 3;
 | 
					 | 
				
			||||||
    const int ref_y =
 | 
					 | 
				
			||||||
        kPixelSelected + ((kInitialSubPelOffset
 | 
					 | 
				
			||||||
            + kFilterPeriodAdjustY * kInputPixelStep)
 | 
					 | 
				
			||||||
                          >> SUBPEL_BITS);
 | 
					 | 
				
			||||||
    for (int x = 0; x < Width(); ++x) {
 | 
					 | 
				
			||||||
      const int kFilterPeriodAdjustX = (x >> 3) << 3;
 | 
					 | 
				
			||||||
      const int ref_x =
 | 
					 | 
				
			||||||
          kPixelSelected + ((kInitialSubPelOffset
 | 
					 | 
				
			||||||
              + kFilterPeriodAdjustX * kInputPixelStep)
 | 
					 | 
				
			||||||
                            >> SUBPEL_BITS);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      ASSERT_EQ(in[ref_y * kInputStride + ref_x], out[y * kOutputStride + x])
 | 
					 | 
				
			||||||
          << "x == " << x << ", y == " << y;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* This test exercises that enough rows and columns are filtered with every
 | 
					 | 
				
			||||||
   possible initial fractional positions and scaling steps. */
 | 
					 | 
				
			||||||
TEST_P(ConvolveTest, CheckScalingFiltering) {
 | 
					 | 
				
			||||||
  uint8_t* const in = input();
 | 
					 | 
				
			||||||
  uint8_t* const out = output();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  SetConstantInput(127);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  for (int frac = 0; frac < 16; ++frac) {
 | 
					 | 
				
			||||||
    for (int step = 1; step <= 32; ++step) {
 | 
					 | 
				
			||||||
      /* Test the horizontal and vertical filters in combination. */
 | 
					 | 
				
			||||||
      REGISTER_STATE_CHECK(UUT_->hv8_(in, kInputStride, out, kOutputStride,
 | 
					 | 
				
			||||||
                                      vp9_sub_pel_filters_8[frac], step,
 | 
					 | 
				
			||||||
                                      vp9_sub_pel_filters_8[frac], step,
 | 
					 | 
				
			||||||
                                      Width(), Height()));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      CheckGuardBlocks();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      for (int y = 0; y < Height(); ++y) {
 | 
					 | 
				
			||||||
        for (int x = 0; x < Width(); ++x) {
 | 
					 | 
				
			||||||
          ASSERT_EQ(in[y * kInputStride + x], out[y * kOutputStride + x])
 | 
					 | 
				
			||||||
              << "x == " << x << ", y == " << y
 | 
					 | 
				
			||||||
              << ", frac == " << frac << ", step == " << step;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
using std::tr1::make_tuple;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const ConvolveFunctions convolve8_c(
 | 
					 | 
				
			||||||
    vp9_convolve8_horiz_c, vp9_convolve8_avg_horiz_c,
 | 
					 | 
				
			||||||
    vp9_convolve8_vert_c, vp9_convolve8_avg_vert_c,
 | 
					 | 
				
			||||||
    vp9_convolve8_c, vp9_convolve8_avg_c);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(C, ConvolveTest, ::testing::Values(
 | 
					 | 
				
			||||||
    make_tuple(4, 4, &convolve8_c),
 | 
					 | 
				
			||||||
    make_tuple(8, 4, &convolve8_c),
 | 
					 | 
				
			||||||
    make_tuple(4, 8, &convolve8_c),
 | 
					 | 
				
			||||||
    make_tuple(8, 8, &convolve8_c),
 | 
					 | 
				
			||||||
    make_tuple(16, 8, &convolve8_c),
 | 
					 | 
				
			||||||
    make_tuple(8, 16, &convolve8_c),
 | 
					 | 
				
			||||||
    make_tuple(16, 16, &convolve8_c),
 | 
					 | 
				
			||||||
    make_tuple(32, 16, &convolve8_c),
 | 
					 | 
				
			||||||
    make_tuple(16, 32, &convolve8_c),
 | 
					 | 
				
			||||||
    make_tuple(32, 32, &convolve8_c),
 | 
					 | 
				
			||||||
    make_tuple(64, 32, &convolve8_c),
 | 
					 | 
				
			||||||
    make_tuple(32, 64, &convolve8_c),
 | 
					 | 
				
			||||||
    make_tuple(64, 64, &convolve8_c)));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if HAVE_SSE2
 | 
					 | 
				
			||||||
const ConvolveFunctions convolve8_sse2(
 | 
					 | 
				
			||||||
    vp9_convolve8_horiz_sse2, vp9_convolve8_avg_horiz_sse2,
 | 
					 | 
				
			||||||
    vp9_convolve8_vert_sse2, vp9_convolve8_avg_vert_sse2,
 | 
					 | 
				
			||||||
    vp9_convolve8_sse2, vp9_convolve8_avg_sse2);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(SSE2, ConvolveTest, ::testing::Values(
 | 
					 | 
				
			||||||
    make_tuple(4, 4, &convolve8_sse2),
 | 
					 | 
				
			||||||
    make_tuple(8, 4, &convolve8_sse2),
 | 
					 | 
				
			||||||
    make_tuple(4, 8, &convolve8_sse2),
 | 
					 | 
				
			||||||
    make_tuple(8, 8, &convolve8_sse2),
 | 
					 | 
				
			||||||
    make_tuple(16, 8, &convolve8_sse2),
 | 
					 | 
				
			||||||
    make_tuple(8, 16, &convolve8_sse2),
 | 
					 | 
				
			||||||
    make_tuple(16, 16, &convolve8_sse2),
 | 
					 | 
				
			||||||
    make_tuple(32, 16, &convolve8_sse2),
 | 
					 | 
				
			||||||
    make_tuple(16, 32, &convolve8_sse2),
 | 
					 | 
				
			||||||
    make_tuple(32, 32, &convolve8_sse2),
 | 
					 | 
				
			||||||
    make_tuple(64, 32, &convolve8_sse2),
 | 
					 | 
				
			||||||
    make_tuple(32, 64, &convolve8_sse2),
 | 
					 | 
				
			||||||
    make_tuple(64, 64, &convolve8_sse2)));
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if HAVE_SSSE3
 | 
					 | 
				
			||||||
const ConvolveFunctions convolve8_ssse3(
 | 
					 | 
				
			||||||
    vp9_convolve8_horiz_ssse3, vp9_convolve8_avg_horiz_ssse3,
 | 
					 | 
				
			||||||
    vp9_convolve8_vert_ssse3, vp9_convolve8_avg_vert_ssse3,
 | 
					 | 
				
			||||||
    vp9_convolve8_ssse3, vp9_convolve8_avg_ssse3);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(SSSE3, ConvolveTest, ::testing::Values(
 | 
					 | 
				
			||||||
    make_tuple(4, 4, &convolve8_ssse3),
 | 
					 | 
				
			||||||
    make_tuple(8, 4, &convolve8_ssse3),
 | 
					 | 
				
			||||||
    make_tuple(4, 8, &convolve8_ssse3),
 | 
					 | 
				
			||||||
    make_tuple(8, 8, &convolve8_ssse3),
 | 
					 | 
				
			||||||
    make_tuple(16, 8, &convolve8_ssse3),
 | 
					 | 
				
			||||||
    make_tuple(8, 16, &convolve8_ssse3),
 | 
					 | 
				
			||||||
    make_tuple(16, 16, &convolve8_ssse3),
 | 
					 | 
				
			||||||
    make_tuple(32, 16, &convolve8_ssse3),
 | 
					 | 
				
			||||||
    make_tuple(16, 32, &convolve8_ssse3),
 | 
					 | 
				
			||||||
    make_tuple(32, 32, &convolve8_ssse3),
 | 
					 | 
				
			||||||
    make_tuple(64, 32, &convolve8_ssse3),
 | 
					 | 
				
			||||||
    make_tuple(32, 64, &convolve8_ssse3),
 | 
					 | 
				
			||||||
    make_tuple(64, 64, &convolve8_ssse3)));
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if HAVE_NEON
 | 
					 | 
				
			||||||
const ConvolveFunctions convolve8_neon(
 | 
					 | 
				
			||||||
    vp9_convolve8_horiz_neon, vp9_convolve8_avg_horiz_neon,
 | 
					 | 
				
			||||||
    vp9_convolve8_vert_neon, vp9_convolve8_avg_vert_neon,
 | 
					 | 
				
			||||||
    vp9_convolve8_neon, vp9_convolve8_avg_neon);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(NEON, ConvolveTest, ::testing::Values(
 | 
					 | 
				
			||||||
    make_tuple(4, 4, &convolve8_neon),
 | 
					 | 
				
			||||||
    make_tuple(8, 4, &convolve8_neon),
 | 
					 | 
				
			||||||
    make_tuple(4, 8, &convolve8_neon),
 | 
					 | 
				
			||||||
    make_tuple(8, 8, &convolve8_neon),
 | 
					 | 
				
			||||||
    make_tuple(16, 8, &convolve8_neon),
 | 
					 | 
				
			||||||
    make_tuple(8, 16, &convolve8_neon),
 | 
					 | 
				
			||||||
    make_tuple(16, 16, &convolve8_neon),
 | 
					 | 
				
			||||||
    make_tuple(32, 16, &convolve8_neon),
 | 
					 | 
				
			||||||
    make_tuple(16, 32, &convolve8_neon),
 | 
					 | 
				
			||||||
    make_tuple(32, 32, &convolve8_neon),
 | 
					 | 
				
			||||||
    make_tuple(64, 32, &convolve8_neon),
 | 
					 | 
				
			||||||
    make_tuple(32, 64, &convolve8_neon),
 | 
					 | 
				
			||||||
    make_tuple(64, 64, &convolve8_neon)));
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if HAVE_DSPR2
 | 
					 | 
				
			||||||
const ConvolveFunctions convolve8_dspr2(
 | 
					 | 
				
			||||||
    vp9_convolve8_horiz_dspr2, vp9_convolve8_avg_horiz_dspr2,
 | 
					 | 
				
			||||||
    vp9_convolve8_vert_dspr2, vp9_convolve8_avg_vert_dspr2,
 | 
					 | 
				
			||||||
    vp9_convolve8_dspr2, vp9_convolve8_avg_dspr2);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(DSPR2, ConvolveTest, ::testing::Values(
 | 
					 | 
				
			||||||
    make_tuple(4, 4, &convolve8_dspr2),
 | 
					 | 
				
			||||||
    make_tuple(8, 4, &convolve8_dspr2),
 | 
					 | 
				
			||||||
    make_tuple(4, 8, &convolve8_dspr2),
 | 
					 | 
				
			||||||
    make_tuple(8, 8, &convolve8_dspr2),
 | 
					 | 
				
			||||||
    make_tuple(16, 8, &convolve8_dspr2),
 | 
					 | 
				
			||||||
    make_tuple(8, 16, &convolve8_dspr2),
 | 
					 | 
				
			||||||
    make_tuple(16, 16, &convolve8_dspr2),
 | 
					 | 
				
			||||||
    make_tuple(32, 16, &convolve8_dspr2),
 | 
					 | 
				
			||||||
    make_tuple(16, 32, &convolve8_dspr2),
 | 
					 | 
				
			||||||
    make_tuple(32, 32, &convolve8_dspr2),
 | 
					 | 
				
			||||||
    make_tuple(64, 32, &convolve8_dspr2),
 | 
					 | 
				
			||||||
    make_tuple(32, 64, &convolve8_dspr2),
 | 
					 | 
				
			||||||
    make_tuple(64, 64, &convolve8_dspr2)));
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}  // namespace
 | 
					 | 
				
			||||||
@@ -1,112 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *  Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
 *  that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
 *  tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
 *  in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
 *  be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
#include <climits>
 | 
					 | 
				
			||||||
#include <vector>
 | 
					 | 
				
			||||||
#include "third_party/googletest/src/include/gtest/gtest.h"
 | 
					 | 
				
			||||||
#include "test/codec_factory.h"
 | 
					 | 
				
			||||||
#include "test/encode_test_driver.h"
 | 
					 | 
				
			||||||
#include "test/i420_video_source.h"
 | 
					 | 
				
			||||||
#include "test/util.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class CpuSpeedTest : public ::libvpx_test::EncoderTest,
 | 
					 | 
				
			||||||
    public ::libvpx_test::CodecTestWith2Params<
 | 
					 | 
				
			||||||
        libvpx_test::TestMode, int> {
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  CpuSpeedTest() : EncoderTest(GET_PARAM(0)) {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void SetUp() {
 | 
					 | 
				
			||||||
    InitializeConfig();
 | 
					 | 
				
			||||||
    SetMode(GET_PARAM(1));
 | 
					 | 
				
			||||||
    set_cpu_used_ = GET_PARAM(2);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void PreEncodeFrameHook(::libvpx_test::VideoSource *video,
 | 
					 | 
				
			||||||
                                  ::libvpx_test::Encoder *encoder) {
 | 
					 | 
				
			||||||
    if (video->frame() == 1) {
 | 
					 | 
				
			||||||
      encoder->Control(VP8E_SET_CPUUSED, set_cpu_used_);
 | 
					 | 
				
			||||||
      encoder->Control(VP8E_SET_ENABLEAUTOALTREF, 1);
 | 
					 | 
				
			||||||
      encoder->Control(VP8E_SET_ARNR_MAXFRAMES, 7);
 | 
					 | 
				
			||||||
      encoder->Control(VP8E_SET_ARNR_STRENGTH, 5);
 | 
					 | 
				
			||||||
      encoder->Control(VP8E_SET_ARNR_TYPE, 3);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void FramePktHook(const vpx_codec_cx_pkt_t *pkt) {
 | 
					 | 
				
			||||||
    if (pkt->data.frame.flags & VPX_FRAME_IS_KEY) {
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  int set_cpu_used_;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(CpuSpeedTest, TestQ0) {
 | 
					 | 
				
			||||||
  // Validate that this non multiple of 64 wide clip encodes and decodes
 | 
					 | 
				
			||||||
  // without a mismatch when passing in a very low max q.  This pushes
 | 
					 | 
				
			||||||
  // the encoder to producing lots of big partitions which will likely
 | 
					 | 
				
			||||||
  // extend into the border and test the border condition.
 | 
					 | 
				
			||||||
  cfg_.g_lag_in_frames = 25;
 | 
					 | 
				
			||||||
  cfg_.rc_2pass_vbr_minsection_pct = 5;
 | 
					 | 
				
			||||||
  cfg_.rc_2pass_vbr_minsection_pct = 2000;
 | 
					 | 
				
			||||||
  cfg_.rc_target_bitrate = 400;
 | 
					 | 
				
			||||||
  cfg_.rc_max_quantizer = 0;
 | 
					 | 
				
			||||||
  cfg_.rc_min_quantizer = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  ::libvpx_test::I420VideoSource video("hantro_odd.yuv", 208, 144, 30, 1, 0,
 | 
					 | 
				
			||||||
                                       20);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(CpuSpeedTest, TestEncodeHighBitrate) {
 | 
					 | 
				
			||||||
  // Validate that this non multiple of 64 wide clip encodes and decodes
 | 
					 | 
				
			||||||
  // without a mismatch when passing in a very low max q.  This pushes
 | 
					 | 
				
			||||||
  // the encoder to producing lots of big partitions which will likely
 | 
					 | 
				
			||||||
  // extend into the border and test the border condition.
 | 
					 | 
				
			||||||
  cfg_.g_lag_in_frames = 25;
 | 
					 | 
				
			||||||
  cfg_.rc_2pass_vbr_minsection_pct = 5;
 | 
					 | 
				
			||||||
  cfg_.rc_2pass_vbr_minsection_pct = 2000;
 | 
					 | 
				
			||||||
  cfg_.rc_target_bitrate = 12000;
 | 
					 | 
				
			||||||
  cfg_.rc_max_quantizer = 10;
 | 
					 | 
				
			||||||
  cfg_.rc_min_quantizer = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  ::libvpx_test::I420VideoSource video("hantro_odd.yuv", 208, 144, 30, 1, 0,
 | 
					 | 
				
			||||||
                                       40);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
TEST_P(CpuSpeedTest, TestLowBitrate) {
 | 
					 | 
				
			||||||
  // Validate that this clip encodes and decodes without a mismatch
 | 
					 | 
				
			||||||
  // when passing in a very high min q.  This pushes the encoder to producing
 | 
					 | 
				
			||||||
  // lots of small partitions which might will test the other condition.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  cfg_.g_lag_in_frames = 25;
 | 
					 | 
				
			||||||
  cfg_.rc_2pass_vbr_minsection_pct = 5;
 | 
					 | 
				
			||||||
  cfg_.rc_2pass_vbr_minsection_pct = 2000;
 | 
					 | 
				
			||||||
  cfg_.rc_target_bitrate = 200;
 | 
					 | 
				
			||||||
  cfg_.rc_min_quantizer = 40;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  ::libvpx_test::I420VideoSource video("hantro_odd.yuv", 208, 144, 30, 1, 0,
 | 
					 | 
				
			||||||
                                       40);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
using std::tr1::make_tuple;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define VP9_FACTORY \
 | 
					 | 
				
			||||||
  static_cast<const libvpx_test::CodecFactory*> (&libvpx_test::kVP9)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
VP9_INSTANTIATE_TEST_CASE(
 | 
					 | 
				
			||||||
    CpuSpeedTest,
 | 
					 | 
				
			||||||
    ::testing::Values(::libvpx_test::kTwoPassGood),
 | 
					 | 
				
			||||||
    ::testing::Range(0, 5));
 | 
					 | 
				
			||||||
}  // namespace
 | 
					 | 
				
			||||||
							
								
								
									
										107
									
								
								test/cq_test.cc
									
									
									
									
									
								
							
							
						
						
									
										107
									
								
								test/cq_test.cc
									
									
									
									
									
								
							@@ -1,107 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *  Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
 *  that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
 *  tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
 *  in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
 *  be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
#include <cmath>
 | 
					 | 
				
			||||||
#include "third_party/googletest/src/include/gtest/gtest.h"
 | 
					 | 
				
			||||||
#include "test/codec_factory.h"
 | 
					 | 
				
			||||||
#include "test/encode_test_driver.h"
 | 
					 | 
				
			||||||
#include "test/i420_video_source.h"
 | 
					 | 
				
			||||||
#include "test/util.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// CQ level range: [kCQLevelMin, kCQLevelMax).
 | 
					 | 
				
			||||||
const int kCQLevelMin = 4;
 | 
					 | 
				
			||||||
const int kCQLevelMax = 63;
 | 
					 | 
				
			||||||
const int kCQLevelStep = 8;
 | 
					 | 
				
			||||||
const int kCQTargetBitrate = 2000;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class CQTest : public ::libvpx_test::EncoderTest,
 | 
					 | 
				
			||||||
    public ::libvpx_test::CodecTestWithParam<int> {
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  CQTest() : EncoderTest(GET_PARAM(0)), cq_level_(GET_PARAM(1)) {
 | 
					 | 
				
			||||||
    init_flags_ = VPX_CODEC_USE_PSNR;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual ~CQTest() {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void SetUp() {
 | 
					 | 
				
			||||||
    InitializeConfig();
 | 
					 | 
				
			||||||
    SetMode(libvpx_test::kTwoPassGood);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void BeginPassHook(unsigned int /*pass*/) {
 | 
					 | 
				
			||||||
    file_size_ = 0;
 | 
					 | 
				
			||||||
    psnr_ = 0.0;
 | 
					 | 
				
			||||||
    n_frames_ = 0;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void PreEncodeFrameHook(libvpx_test::VideoSource *video,
 | 
					 | 
				
			||||||
                                  libvpx_test::Encoder *encoder) {
 | 
					 | 
				
			||||||
    if (video->frame() == 1) {
 | 
					 | 
				
			||||||
      if (cfg_.rc_end_usage == VPX_CQ) {
 | 
					 | 
				
			||||||
        encoder->Control(VP8E_SET_CQ_LEVEL, cq_level_);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      encoder->Control(VP8E_SET_CPUUSED, 3);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void PSNRPktHook(const vpx_codec_cx_pkt_t *pkt) {
 | 
					 | 
				
			||||||
    psnr_ += pow(10.0, pkt->data.psnr.psnr[0] / 10.0);
 | 
					 | 
				
			||||||
    n_frames_++;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void FramePktHook(const vpx_codec_cx_pkt_t *pkt) {
 | 
					 | 
				
			||||||
    file_size_ += pkt->data.frame.sz;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  double GetLinearPSNROverBitrate() const {
 | 
					 | 
				
			||||||
    double avg_psnr = log10(psnr_ / n_frames_) * 10.0;
 | 
					 | 
				
			||||||
    return pow(10.0, avg_psnr / 10.0) / file_size_;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  int file_size() const { return file_size_; }
 | 
					 | 
				
			||||||
  int n_frames() const { return n_frames_; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 private:
 | 
					 | 
				
			||||||
  int cq_level_;
 | 
					 | 
				
			||||||
  int file_size_;
 | 
					 | 
				
			||||||
  double psnr_;
 | 
					 | 
				
			||||||
  int n_frames_;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int prev_actual_bitrate = kCQTargetBitrate;
 | 
					 | 
				
			||||||
TEST_P(CQTest, LinearPSNRIsHigherForCQLevel) {
 | 
					 | 
				
			||||||
  const vpx_rational timebase = { 33333333, 1000000000 };
 | 
					 | 
				
			||||||
  cfg_.g_timebase = timebase;
 | 
					 | 
				
			||||||
  cfg_.rc_target_bitrate = kCQTargetBitrate;
 | 
					 | 
				
			||||||
  cfg_.g_lag_in_frames = 25;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  cfg_.rc_end_usage = VPX_CQ;
 | 
					 | 
				
			||||||
  libvpx_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288,
 | 
					 | 
				
			||||||
                                     timebase.den, timebase.num, 0, 30);
 | 
					 | 
				
			||||||
  ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
 | 
					 | 
				
			||||||
  const double cq_psnr_lin = GetLinearPSNROverBitrate();
 | 
					 | 
				
			||||||
  const int cq_actual_bitrate = file_size() * 8 * 30 / (n_frames() * 1000);
 | 
					 | 
				
			||||||
  EXPECT_LE(cq_actual_bitrate, kCQTargetBitrate);
 | 
					 | 
				
			||||||
  EXPECT_LE(cq_actual_bitrate, prev_actual_bitrate);
 | 
					 | 
				
			||||||
  prev_actual_bitrate = cq_actual_bitrate;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // try targeting the approximate same bitrate with VBR mode
 | 
					 | 
				
			||||||
  cfg_.rc_end_usage = VPX_VBR;
 | 
					 | 
				
			||||||
  cfg_.rc_target_bitrate = cq_actual_bitrate;
 | 
					 | 
				
			||||||
  ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
 | 
					 | 
				
			||||||
  const double vbr_psnr_lin = GetLinearPSNROverBitrate();
 | 
					 | 
				
			||||||
  EXPECT_GE(cq_psnr_lin, vbr_psnr_lin);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
VP8_INSTANTIATE_TEST_CASE(CQTest,
 | 
					 | 
				
			||||||
                          ::testing::Range(kCQLevelMin, kCQLevelMax,
 | 
					 | 
				
			||||||
                                           kCQLevelStep));
 | 
					 | 
				
			||||||
}  // namespace
 | 
					 | 
				
			||||||
@@ -1,262 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *  Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
 *  that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
 *  tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
 *  in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
 *  be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
#include "third_party/googletest/src/include/gtest/gtest.h"
 | 
					 | 
				
			||||||
#include "test/codec_factory.h"
 | 
					 | 
				
			||||||
#include "test/encode_test_driver.h"
 | 
					 | 
				
			||||||
#include "test/i420_video_source.h"
 | 
					 | 
				
			||||||
#include "test/util.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class DatarateTest : public ::libvpx_test::EncoderTest,
 | 
					 | 
				
			||||||
    public ::libvpx_test::CodecTestWithParam<libvpx_test::TestMode> {
 | 
					 | 
				
			||||||
 public:
 | 
					 | 
				
			||||||
  DatarateTest() : EncoderTest(GET_PARAM(0)) {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  virtual void SetUp() {
 | 
					 | 
				
			||||||
    InitializeConfig();
 | 
					 | 
				
			||||||
    SetMode(GET_PARAM(1));
 | 
					 | 
				
			||||||
    ResetModel();
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void ResetModel() {
 | 
					 | 
				
			||||||
    last_pts_ = 0;
 | 
					 | 
				
			||||||
    bits_in_buffer_model_ = cfg_.rc_target_bitrate * cfg_.rc_buf_initial_sz;
 | 
					 | 
				
			||||||
    frame_number_ = 0;
 | 
					 | 
				
			||||||
    first_drop_ = 0;
 | 
					 | 
				
			||||||
    bits_total_ = 0;
 | 
					 | 
				
			||||||
    duration_ = 0.0;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void PreEncodeFrameHook(::libvpx_test::VideoSource *video,
 | 
					 | 
				
			||||||
                                  ::libvpx_test::Encoder *encoder) {
 | 
					 | 
				
			||||||
    const vpx_rational_t tb = video->timebase();
 | 
					 | 
				
			||||||
    timebase_ = static_cast<double>(tb.num) / tb.den;
 | 
					 | 
				
			||||||
    duration_ = 0;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void FramePktHook(const vpx_codec_cx_pkt_t *pkt) {
 | 
					 | 
				
			||||||
    // Time since last timestamp = duration.
 | 
					 | 
				
			||||||
    vpx_codec_pts_t duration = pkt->data.frame.pts - last_pts_;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // TODO(jimbankoski): Remove these lines when the issue:
 | 
					 | 
				
			||||||
    // http://code.google.com/p/webm/issues/detail?id=496 is fixed.
 | 
					 | 
				
			||||||
    // For now the codec assumes buffer starts at starting buffer rate
 | 
					 | 
				
			||||||
    // plus one frame's time.
 | 
					 | 
				
			||||||
    if (last_pts_ == 0)
 | 
					 | 
				
			||||||
      duration = 1;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Add to the buffer the bits we'd expect from a constant bitrate server.
 | 
					 | 
				
			||||||
    bits_in_buffer_model_ += duration * timebase_ * cfg_.rc_target_bitrate
 | 
					 | 
				
			||||||
        * 1000;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* Test the buffer model here before subtracting the frame. Do so because
 | 
					 | 
				
			||||||
     * the way the leaky bucket model works in libvpx is to allow the buffer to
 | 
					 | 
				
			||||||
     * empty - and then stop showing frames until we've got enough bits to
 | 
					 | 
				
			||||||
     * show one. As noted in comment below (issue 495), this does not currently
 | 
					 | 
				
			||||||
     * apply to key frames. For now exclude key frames in condition below. */
 | 
					 | 
				
			||||||
    bool key_frame = (pkt->data.frame.flags & VPX_FRAME_IS_KEY) ? true: false;
 | 
					 | 
				
			||||||
    if (!key_frame) {
 | 
					 | 
				
			||||||
      ASSERT_GE(bits_in_buffer_model_, 0) << "Buffer Underrun at frame "
 | 
					 | 
				
			||||||
          << pkt->data.frame.pts;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    const int frame_size_in_bits = pkt->data.frame.sz * 8;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Subtract from the buffer the bits associated with a played back frame.
 | 
					 | 
				
			||||||
    bits_in_buffer_model_ -= frame_size_in_bits;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Update the running total of bits for end of test datarate checks.
 | 
					 | 
				
			||||||
    bits_total_ += frame_size_in_bits;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // If first drop not set and we have a drop set it to this time.
 | 
					 | 
				
			||||||
    if (!first_drop_ && duration > 1)
 | 
					 | 
				
			||||||
      first_drop_ = last_pts_ + 1;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Update the most recent pts.
 | 
					 | 
				
			||||||
    last_pts_ = pkt->data.frame.pts;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // We update this so that we can calculate the datarate minus the last
 | 
					 | 
				
			||||||
    // frame encoded in the file.
 | 
					 | 
				
			||||||
    bits_in_last_frame_ = frame_size_in_bits;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    ++frame_number_;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void EndPassHook(void) {
 | 
					 | 
				
			||||||
    if (bits_total_) {
 | 
					 | 
				
			||||||
      const double file_size_in_kb = bits_total_ / 1000;  /* bits per kilobit */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      duration_ = (last_pts_ + 1) * timebase_;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      // Effective file datarate includes the time spent prebuffering.
 | 
					 | 
				
			||||||
      effective_datarate_ = (bits_total_ - bits_in_last_frame_) / 1000.0
 | 
					 | 
				
			||||||
          / (cfg_.rc_buf_initial_sz / 1000.0 + duration_);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      file_datarate_ = file_size_in_kb / duration_;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  vpx_codec_pts_t last_pts_;
 | 
					 | 
				
			||||||
  int bits_in_buffer_model_;
 | 
					 | 
				
			||||||
  double timebase_;
 | 
					 | 
				
			||||||
  int frame_number_;
 | 
					 | 
				
			||||||
  vpx_codec_pts_t first_drop_;
 | 
					 | 
				
			||||||
  int64_t bits_total_;
 | 
					 | 
				
			||||||
  double duration_;
 | 
					 | 
				
			||||||
  double file_datarate_;
 | 
					 | 
				
			||||||
  double effective_datarate_;
 | 
					 | 
				
			||||||
  int bits_in_last_frame_;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(DatarateTest, BasicBufferModel) {
 | 
					 | 
				
			||||||
  cfg_.rc_buf_initial_sz = 500;
 | 
					 | 
				
			||||||
  cfg_.rc_dropframe_thresh = 1;
 | 
					 | 
				
			||||||
  cfg_.rc_max_quantizer = 56;
 | 
					 | 
				
			||||||
  cfg_.rc_end_usage = VPX_CBR;
 | 
					 | 
				
			||||||
  // 2 pass cbr datarate control has a bug hidden by the small # of
 | 
					 | 
				
			||||||
  // frames selected in this encode. The problem is that even if the buffer is
 | 
					 | 
				
			||||||
  // negative we produce a keyframe on a cutscene. Ignoring datarate
 | 
					 | 
				
			||||||
  // constraints
 | 
					 | 
				
			||||||
  // TODO(jimbankoski): ( Fix when issue
 | 
					 | 
				
			||||||
  // http://code.google.com/p/webm/issues/detail?id=495 is addressed. )
 | 
					 | 
				
			||||||
  ::libvpx_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288,
 | 
					 | 
				
			||||||
                                       30, 1, 0, 140);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // There is an issue for low bitrates in real-time mode, where the
 | 
					 | 
				
			||||||
  // effective_datarate slightly overshoots the target bitrate.
 | 
					 | 
				
			||||||
  // This is same the issue as noted about (#495).
 | 
					 | 
				
			||||||
  // TODO(jimbankoski/marpan): Update test to run for lower bitrates (< 100),
 | 
					 | 
				
			||||||
  // when the issue is resolved.
 | 
					 | 
				
			||||||
  for (int i = 100; i < 800; i += 200) {
 | 
					 | 
				
			||||||
    cfg_.rc_target_bitrate = i;
 | 
					 | 
				
			||||||
    ResetModel();
 | 
					 | 
				
			||||||
    ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
 | 
					 | 
				
			||||||
    ASSERT_GE(cfg_.rc_target_bitrate, effective_datarate_)
 | 
					 | 
				
			||||||
        << " The datarate for the file exceeds the target!";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    ASSERT_LE(cfg_.rc_target_bitrate, file_datarate_ * 1.3)
 | 
					 | 
				
			||||||
        << " The datarate for the file missed the target!";
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(DatarateTest, ChangingDropFrameThresh) {
 | 
					 | 
				
			||||||
  cfg_.rc_buf_initial_sz = 500;
 | 
					 | 
				
			||||||
  cfg_.rc_max_quantizer = 36;
 | 
					 | 
				
			||||||
  cfg_.rc_end_usage = VPX_CBR;
 | 
					 | 
				
			||||||
  cfg_.rc_target_bitrate = 200;
 | 
					 | 
				
			||||||
  cfg_.kf_mode = VPX_KF_DISABLED;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  const int frame_count = 40;
 | 
					 | 
				
			||||||
  ::libvpx_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288,
 | 
					 | 
				
			||||||
                                       30, 1, 0, frame_count);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Here we check that the first dropped frame gets earlier and earlier
 | 
					 | 
				
			||||||
  // as the drop frame threshold is increased.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  const int kDropFrameThreshTestStep = 30;
 | 
					 | 
				
			||||||
  vpx_codec_pts_t last_drop = frame_count;
 | 
					 | 
				
			||||||
  for (int i = 1; i < 91; i += kDropFrameThreshTestStep) {
 | 
					 | 
				
			||||||
    cfg_.rc_dropframe_thresh = i;
 | 
					 | 
				
			||||||
    ResetModel();
 | 
					 | 
				
			||||||
    ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
 | 
					 | 
				
			||||||
    ASSERT_LE(first_drop_, last_drop)
 | 
					 | 
				
			||||||
        << " The first dropped frame for drop_thresh " << i
 | 
					 | 
				
			||||||
        << " > first dropped frame for drop_thresh "
 | 
					 | 
				
			||||||
        << i - kDropFrameThreshTestStep;
 | 
					 | 
				
			||||||
    last_drop = first_drop_;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class DatarateTestVP9 : public ::libvpx_test::EncoderTest,
 | 
					 | 
				
			||||||
    public ::libvpx_test::CodecTestWith2Params<libvpx_test::TestMode, int> {
 | 
					 | 
				
			||||||
 public:
 | 
					 | 
				
			||||||
  DatarateTestVP9() : EncoderTest(GET_PARAM(0)) {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  virtual ~DatarateTestVP9() {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void SetUp() {
 | 
					 | 
				
			||||||
    InitializeConfig();
 | 
					 | 
				
			||||||
    SetMode(GET_PARAM(1));
 | 
					 | 
				
			||||||
    set_cpu_used_ = GET_PARAM(2);
 | 
					 | 
				
			||||||
    ResetModel();
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void ResetModel() {
 | 
					 | 
				
			||||||
    last_pts_ = 0;
 | 
					 | 
				
			||||||
    frame_number_ = 0;
 | 
					 | 
				
			||||||
    bits_total_ = 0;
 | 
					 | 
				
			||||||
    duration_ = 0.0;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void PreEncodeFrameHook(::libvpx_test::VideoSource *video,
 | 
					 | 
				
			||||||
                                    ::libvpx_test::Encoder *encoder) {
 | 
					 | 
				
			||||||
    if (video->frame() == 1) {
 | 
					 | 
				
			||||||
      encoder->Control(VP8E_SET_CPUUSED, set_cpu_used_);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    const vpx_rational_t tb = video->timebase();
 | 
					 | 
				
			||||||
    timebase_ = static_cast<double>(tb.num) / tb.den;
 | 
					 | 
				
			||||||
    duration_ = 0;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void FramePktHook(const vpx_codec_cx_pkt_t *pkt) {
 | 
					 | 
				
			||||||
    const int frame_size_in_bits = pkt->data.frame.sz * 8;
 | 
					 | 
				
			||||||
    bits_total_ += frame_size_in_bits;
 | 
					 | 
				
			||||||
    // Update the most recent pts.
 | 
					 | 
				
			||||||
    last_pts_ = pkt->data.frame.pts;
 | 
					 | 
				
			||||||
    ++frame_number_;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void EndPassHook(void) {
 | 
					 | 
				
			||||||
    if (bits_total_) {
 | 
					 | 
				
			||||||
      duration_ = (last_pts_ + 1) * timebase_;
 | 
					 | 
				
			||||||
      // Effective file datarate:
 | 
					 | 
				
			||||||
      effective_datarate_ = ((bits_total_) / 1000.0) / duration_;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  vpx_codec_pts_t last_pts_;
 | 
					 | 
				
			||||||
  double timebase_;
 | 
					 | 
				
			||||||
  int frame_number_;
 | 
					 | 
				
			||||||
  int64_t bits_total_;
 | 
					 | 
				
			||||||
  double duration_;
 | 
					 | 
				
			||||||
  double effective_datarate_;
 | 
					 | 
				
			||||||
  int set_cpu_used_;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// There is no buffer model/frame dropper in VP9 currently, so for now we
 | 
					 | 
				
			||||||
// have separate test for VP9 rate targeting for 1-pass CBR. We only check
 | 
					 | 
				
			||||||
// that effective datarate is within some range of target bitrate.
 | 
					 | 
				
			||||||
// No frame dropper, so we can't go to low bitrates.
 | 
					 | 
				
			||||||
TEST_P(DatarateTestVP9, BasicRateTargeting) {
 | 
					 | 
				
			||||||
  cfg_.rc_min_quantizer = 0;
 | 
					 | 
				
			||||||
  cfg_.rc_max_quantizer = 63;
 | 
					 | 
				
			||||||
  cfg_.rc_end_usage = VPX_CBR;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  ::libvpx_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288,
 | 
					 | 
				
			||||||
                                       30, 1, 0, 140);
 | 
					 | 
				
			||||||
  for (int i = 150; i < 800; i += 200) {
 | 
					 | 
				
			||||||
    cfg_.rc_target_bitrate = i;
 | 
					 | 
				
			||||||
    ResetModel();
 | 
					 | 
				
			||||||
    ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
 | 
					 | 
				
			||||||
    ASSERT_GE(cfg_.rc_target_bitrate, effective_datarate_ * 0.9)
 | 
					 | 
				
			||||||
        << " The datarate for the file exceeds the target by too much!";
 | 
					 | 
				
			||||||
    ASSERT_LE(cfg_.rc_target_bitrate, effective_datarate_ * 1.1)
 | 
					 | 
				
			||||||
        << " The datarate for the file missed the target!";
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
VP8_INSTANTIATE_TEST_CASE(DatarateTest, ALL_TEST_MODES);
 | 
					 | 
				
			||||||
VP9_INSTANTIATE_TEST_CASE(DatarateTestVP9,
 | 
					 | 
				
			||||||
                          ::testing::Values(::libvpx_test::kOnePassGood),
 | 
					 | 
				
			||||||
                          ::testing::Range(1, 5));
 | 
					 | 
				
			||||||
}  // namespace
 | 
					 | 
				
			||||||
@@ -1,523 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *  Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
 *  that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
 *  tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
 *  in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
 *  be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <math.h>
 | 
					 | 
				
			||||||
#include <stdlib.h>
 | 
					 | 
				
			||||||
#include <string.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "third_party/googletest/src/include/gtest/gtest.h"
 | 
					 | 
				
			||||||
#include "test/acm_random.h"
 | 
					 | 
				
			||||||
#include "test/clear_system_state.h"
 | 
					 | 
				
			||||||
#include "test/register_state_check.h"
 | 
					 | 
				
			||||||
#include "test/util.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern "C" {
 | 
					 | 
				
			||||||
#include "vp9/common/vp9_entropy.h"
 | 
					 | 
				
			||||||
#include "./vp9_rtcd.h"
 | 
					 | 
				
			||||||
void vp9_idct16x16_256_add_c(const int16_t *input, uint8_t *output, int pitch);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#include "vpx/vpx_integer.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
using libvpx_test::ACMRandom;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef _MSC_VER
 | 
					 | 
				
			||||||
static int round(double x) {
 | 
					 | 
				
			||||||
  if (x < 0)
 | 
					 | 
				
			||||||
    return static_cast<int>(ceil(x - 0.5));
 | 
					 | 
				
			||||||
  else
 | 
					 | 
				
			||||||
    return static_cast<int>(floor(x + 0.5));
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const int kNumCoeffs = 256;
 | 
					 | 
				
			||||||
const double PI = 3.1415926535898;
 | 
					 | 
				
			||||||
void reference2_16x16_idct_2d(double *input, double *output) {
 | 
					 | 
				
			||||||
  double x;
 | 
					 | 
				
			||||||
  for (int l = 0; l < 16; ++l) {
 | 
					 | 
				
			||||||
    for (int k = 0; k < 16; ++k) {
 | 
					 | 
				
			||||||
      double s = 0;
 | 
					 | 
				
			||||||
      for (int i = 0; i < 16; ++i) {
 | 
					 | 
				
			||||||
        for (int j = 0; j < 16; ++j) {
 | 
					 | 
				
			||||||
          x = cos(PI * j * (l + 0.5) / 16.0) *
 | 
					 | 
				
			||||||
              cos(PI * i * (k + 0.5) / 16.0) *
 | 
					 | 
				
			||||||
              input[i * 16 + j] / 256;
 | 
					 | 
				
			||||||
          if (i != 0)
 | 
					 | 
				
			||||||
            x *= sqrt(2.0);
 | 
					 | 
				
			||||||
          if (j != 0)
 | 
					 | 
				
			||||||
            x *= sqrt(2.0);
 | 
					 | 
				
			||||||
          s += x;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      output[k*16+l] = s;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const double C1 = 0.995184726672197;
 | 
					 | 
				
			||||||
const double C2 = 0.98078528040323;
 | 
					 | 
				
			||||||
const double C3 = 0.956940335732209;
 | 
					 | 
				
			||||||
const double C4 = 0.923879532511287;
 | 
					 | 
				
			||||||
const double C5 = 0.881921264348355;
 | 
					 | 
				
			||||||
const double C6 = 0.831469612302545;
 | 
					 | 
				
			||||||
const double C7 = 0.773010453362737;
 | 
					 | 
				
			||||||
const double C8 = 0.707106781186548;
 | 
					 | 
				
			||||||
const double C9 = 0.634393284163646;
 | 
					 | 
				
			||||||
const double C10 = 0.555570233019602;
 | 
					 | 
				
			||||||
const double C11 = 0.471396736825998;
 | 
					 | 
				
			||||||
const double C12 = 0.38268343236509;
 | 
					 | 
				
			||||||
const double C13 = 0.290284677254462;
 | 
					 | 
				
			||||||
const double C14 = 0.195090322016128;
 | 
					 | 
				
			||||||
const double C15 = 0.098017140329561;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void butterfly_16x16_dct_1d(double input[16], double output[16]) {
 | 
					 | 
				
			||||||
  double step[16];
 | 
					 | 
				
			||||||
  double intermediate[16];
 | 
					 | 
				
			||||||
  double temp1, temp2;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // step 1
 | 
					 | 
				
			||||||
  step[ 0] = input[0] + input[15];
 | 
					 | 
				
			||||||
  step[ 1] = input[1] + input[14];
 | 
					 | 
				
			||||||
  step[ 2] = input[2] + input[13];
 | 
					 | 
				
			||||||
  step[ 3] = input[3] + input[12];
 | 
					 | 
				
			||||||
  step[ 4] = input[4] + input[11];
 | 
					 | 
				
			||||||
  step[ 5] = input[5] + input[10];
 | 
					 | 
				
			||||||
  step[ 6] = input[6] + input[ 9];
 | 
					 | 
				
			||||||
  step[ 7] = input[7] + input[ 8];
 | 
					 | 
				
			||||||
  step[ 8] = input[7] - input[ 8];
 | 
					 | 
				
			||||||
  step[ 9] = input[6] - input[ 9];
 | 
					 | 
				
			||||||
  step[10] = input[5] - input[10];
 | 
					 | 
				
			||||||
  step[11] = input[4] - input[11];
 | 
					 | 
				
			||||||
  step[12] = input[3] - input[12];
 | 
					 | 
				
			||||||
  step[13] = input[2] - input[13];
 | 
					 | 
				
			||||||
  step[14] = input[1] - input[14];
 | 
					 | 
				
			||||||
  step[15] = input[0] - input[15];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // step 2
 | 
					 | 
				
			||||||
  output[0] = step[0] + step[7];
 | 
					 | 
				
			||||||
  output[1] = step[1] + step[6];
 | 
					 | 
				
			||||||
  output[2] = step[2] + step[5];
 | 
					 | 
				
			||||||
  output[3] = step[3] + step[4];
 | 
					 | 
				
			||||||
  output[4] = step[3] - step[4];
 | 
					 | 
				
			||||||
  output[5] = step[2] - step[5];
 | 
					 | 
				
			||||||
  output[6] = step[1] - step[6];
 | 
					 | 
				
			||||||
  output[7] = step[0] - step[7];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  temp1 = step[ 8] * C7;
 | 
					 | 
				
			||||||
  temp2 = step[15] * C9;
 | 
					 | 
				
			||||||
  output[ 8] = temp1 + temp2;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  temp1 = step[ 9] * C11;
 | 
					 | 
				
			||||||
  temp2 = step[14] * C5;
 | 
					 | 
				
			||||||
  output[ 9] = temp1 - temp2;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  temp1 = step[10] * C3;
 | 
					 | 
				
			||||||
  temp2 = step[13] * C13;
 | 
					 | 
				
			||||||
  output[10] = temp1 + temp2;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  temp1 = step[11] * C15;
 | 
					 | 
				
			||||||
  temp2 = step[12] * C1;
 | 
					 | 
				
			||||||
  output[11] = temp1 - temp2;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  temp1 = step[11] * C1;
 | 
					 | 
				
			||||||
  temp2 = step[12] * C15;
 | 
					 | 
				
			||||||
  output[12] = temp2 + temp1;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  temp1 = step[10] * C13;
 | 
					 | 
				
			||||||
  temp2 = step[13] * C3;
 | 
					 | 
				
			||||||
  output[13] = temp2 - temp1;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  temp1 = step[ 9] * C5;
 | 
					 | 
				
			||||||
  temp2 = step[14] * C11;
 | 
					 | 
				
			||||||
  output[14] = temp2 + temp1;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  temp1 = step[ 8] * C9;
 | 
					 | 
				
			||||||
  temp2 = step[15] * C7;
 | 
					 | 
				
			||||||
  output[15] = temp2 - temp1;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // step 3
 | 
					 | 
				
			||||||
  step[ 0] = output[0] + output[3];
 | 
					 | 
				
			||||||
  step[ 1] = output[1] + output[2];
 | 
					 | 
				
			||||||
  step[ 2] = output[1] - output[2];
 | 
					 | 
				
			||||||
  step[ 3] = output[0] - output[3];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  temp1 = output[4] * C14;
 | 
					 | 
				
			||||||
  temp2 = output[7] * C2;
 | 
					 | 
				
			||||||
  step[ 4] = temp1 + temp2;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  temp1 = output[5] * C10;
 | 
					 | 
				
			||||||
  temp2 = output[6] * C6;
 | 
					 | 
				
			||||||
  step[ 5] = temp1 + temp2;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  temp1 = output[5] * C6;
 | 
					 | 
				
			||||||
  temp2 = output[6] * C10;
 | 
					 | 
				
			||||||
  step[ 6] = temp2 - temp1;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  temp1 = output[4] * C2;
 | 
					 | 
				
			||||||
  temp2 = output[7] * C14;
 | 
					 | 
				
			||||||
  step[ 7] = temp2 - temp1;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  step[ 8] = output[ 8] + output[11];
 | 
					 | 
				
			||||||
  step[ 9] = output[ 9] + output[10];
 | 
					 | 
				
			||||||
  step[10] = output[ 9] - output[10];
 | 
					 | 
				
			||||||
  step[11] = output[ 8] - output[11];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  step[12] = output[12] + output[15];
 | 
					 | 
				
			||||||
  step[13] = output[13] + output[14];
 | 
					 | 
				
			||||||
  step[14] = output[13] - output[14];
 | 
					 | 
				
			||||||
  step[15] = output[12] - output[15];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // step 4
 | 
					 | 
				
			||||||
  output[ 0] = (step[ 0] + step[ 1]);
 | 
					 | 
				
			||||||
  output[ 8] = (step[ 0] - step[ 1]);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  temp1 = step[2] * C12;
 | 
					 | 
				
			||||||
  temp2 = step[3] * C4;
 | 
					 | 
				
			||||||
  temp1 = temp1 + temp2;
 | 
					 | 
				
			||||||
  output[ 4] = 2*(temp1 * C8);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  temp1 = step[2] * C4;
 | 
					 | 
				
			||||||
  temp2 = step[3] * C12;
 | 
					 | 
				
			||||||
  temp1 = temp2 - temp1;
 | 
					 | 
				
			||||||
  output[12] = 2 * (temp1 * C8);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  output[ 2] = 2 * ((step[4] + step[ 5]) * C8);
 | 
					 | 
				
			||||||
  output[14] = 2 * ((step[7] - step[ 6]) * C8);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  temp1 = step[4] - step[5];
 | 
					 | 
				
			||||||
  temp2 = step[6] + step[7];
 | 
					 | 
				
			||||||
  output[ 6] = (temp1 + temp2);
 | 
					 | 
				
			||||||
  output[10] = (temp1 - temp2);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  intermediate[8] = step[8] + step[14];
 | 
					 | 
				
			||||||
  intermediate[9] = step[9] + step[15];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  temp1 = intermediate[8] * C12;
 | 
					 | 
				
			||||||
  temp2 = intermediate[9] * C4;
 | 
					 | 
				
			||||||
  temp1 = temp1 - temp2;
 | 
					 | 
				
			||||||
  output[3] = 2 * (temp1 * C8);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  temp1 = intermediate[8] * C4;
 | 
					 | 
				
			||||||
  temp2 = intermediate[9] * C12;
 | 
					 | 
				
			||||||
  temp1 = temp2 + temp1;
 | 
					 | 
				
			||||||
  output[13] = 2 * (temp1 * C8);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  output[ 9] = 2 * ((step[10] + step[11]) * C8);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  intermediate[11] = step[10] - step[11];
 | 
					 | 
				
			||||||
  intermediate[12] = step[12] + step[13];
 | 
					 | 
				
			||||||
  intermediate[13] = step[12] - step[13];
 | 
					 | 
				
			||||||
  intermediate[14] = step[ 8] - step[14];
 | 
					 | 
				
			||||||
  intermediate[15] = step[ 9] - step[15];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  output[15] = (intermediate[11] + intermediate[12]);
 | 
					 | 
				
			||||||
  output[ 1] = -(intermediate[11] - intermediate[12]);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  output[ 7] = 2 * (intermediate[13] * C8);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  temp1 = intermediate[14] * C12;
 | 
					 | 
				
			||||||
  temp2 = intermediate[15] * C4;
 | 
					 | 
				
			||||||
  temp1 = temp1 - temp2;
 | 
					 | 
				
			||||||
  output[11] = -2 * (temp1 * C8);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  temp1 = intermediate[14] * C4;
 | 
					 | 
				
			||||||
  temp2 = intermediate[15] * C12;
 | 
					 | 
				
			||||||
  temp1 = temp2 + temp1;
 | 
					 | 
				
			||||||
  output[ 5] = 2 * (temp1 * C8);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void reference_16x16_dct_2d(int16_t input[256], double output[256]) {
 | 
					 | 
				
			||||||
  // First transform columns
 | 
					 | 
				
			||||||
  for (int i = 0; i < 16; ++i) {
 | 
					 | 
				
			||||||
    double temp_in[16], temp_out[16];
 | 
					 | 
				
			||||||
    for (int j = 0; j < 16; ++j)
 | 
					 | 
				
			||||||
      temp_in[j] = input[j * 16 + i];
 | 
					 | 
				
			||||||
    butterfly_16x16_dct_1d(temp_in, temp_out);
 | 
					 | 
				
			||||||
    for (int j = 0; j < 16; ++j)
 | 
					 | 
				
			||||||
      output[j * 16 + i] = temp_out[j];
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  // Then transform rows
 | 
					 | 
				
			||||||
  for (int i = 0; i < 16; ++i) {
 | 
					 | 
				
			||||||
    double temp_in[16], temp_out[16];
 | 
					 | 
				
			||||||
    for (int j = 0; j < 16; ++j)
 | 
					 | 
				
			||||||
      temp_in[j] = output[j + i * 16];
 | 
					 | 
				
			||||||
    butterfly_16x16_dct_1d(temp_in, temp_out);
 | 
					 | 
				
			||||||
    // Scale by some magic number
 | 
					 | 
				
			||||||
    for (int j = 0; j < 16; ++j)
 | 
					 | 
				
			||||||
      output[j + i * 16] = temp_out[j]/2;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef void (*fdct_t)(const int16_t *in, int16_t *out, int stride);
 | 
					 | 
				
			||||||
typedef void (*idct_t)(const int16_t *in, uint8_t *out, int stride);
 | 
					 | 
				
			||||||
typedef void (*fht_t) (const int16_t *in, int16_t *out, int stride,
 | 
					 | 
				
			||||||
                       int tx_type);
 | 
					 | 
				
			||||||
typedef void (*iht_t) (const int16_t *in, uint8_t *out, int stride,
 | 
					 | 
				
			||||||
                       int tx_type);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void fdct16x16_ref(const int16_t *in, int16_t *out, int stride, int tx_type) {
 | 
					 | 
				
			||||||
  vp9_fdct16x16_c(in, out, stride);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void fht16x16_ref(const int16_t *in, int16_t *out, int stride, int tx_type) {
 | 
					 | 
				
			||||||
  vp9_short_fht16x16_c(in, out, stride, tx_type);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class Trans16x16TestBase {
 | 
					 | 
				
			||||||
 public:
 | 
					 | 
				
			||||||
  virtual ~Trans16x16TestBase() {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  virtual void RunFwdTxfm(int16_t *in, int16_t *out, int stride) = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void RunInvTxfm(int16_t *out, uint8_t *dst, int stride) = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  void RunAccuracyCheck() {
 | 
					 | 
				
			||||||
    ACMRandom rnd(ACMRandom::DeterministicSeed());
 | 
					 | 
				
			||||||
    uint32_t max_error = 0;
 | 
					 | 
				
			||||||
    int64_t total_error = 0;
 | 
					 | 
				
			||||||
    const int count_test_block = 10000;
 | 
					 | 
				
			||||||
    for (int i = 0; i < count_test_block; ++i) {
 | 
					 | 
				
			||||||
      DECLARE_ALIGNED_ARRAY(16, int16_t, test_input_block, kNumCoeffs);
 | 
					 | 
				
			||||||
      DECLARE_ALIGNED_ARRAY(16, int16_t, test_temp_block, kNumCoeffs);
 | 
					 | 
				
			||||||
      DECLARE_ALIGNED_ARRAY(16, uint8_t, dst, kNumCoeffs);
 | 
					 | 
				
			||||||
      DECLARE_ALIGNED_ARRAY(16, uint8_t, src, kNumCoeffs);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      // Initialize a test block with input range [-255, 255].
 | 
					 | 
				
			||||||
      for (int j = 0; j < kNumCoeffs; ++j) {
 | 
					 | 
				
			||||||
        src[j] = rnd.Rand8();
 | 
					 | 
				
			||||||
        dst[j] = rnd.Rand8();
 | 
					 | 
				
			||||||
        test_input_block[j] = src[j] - dst[j];
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      REGISTER_STATE_CHECK(RunFwdTxfm(test_input_block,
 | 
					 | 
				
			||||||
                                      test_temp_block, pitch_));
 | 
					 | 
				
			||||||
      REGISTER_STATE_CHECK(RunInvTxfm(test_temp_block, dst, pitch_));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      for (int j = 0; j < kNumCoeffs; ++j) {
 | 
					 | 
				
			||||||
        const uint32_t diff = dst[j] - src[j];
 | 
					 | 
				
			||||||
        const uint32_t error = diff * diff;
 | 
					 | 
				
			||||||
        if (max_error < error)
 | 
					 | 
				
			||||||
          max_error = error;
 | 
					 | 
				
			||||||
        total_error += error;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    EXPECT_GE(1u, max_error)
 | 
					 | 
				
			||||||
        << "Error: 16x16 FHT/IHT has an individual round trip error > 1";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    EXPECT_GE(count_test_block , total_error)
 | 
					 | 
				
			||||||
        << "Error: 16x16 FHT/IHT has average round trip error > 1 per block";
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  void RunCoeffCheck() {
 | 
					 | 
				
			||||||
    ACMRandom rnd(ACMRandom::DeterministicSeed());
 | 
					 | 
				
			||||||
    const int count_test_block = 1000;
 | 
					 | 
				
			||||||
    DECLARE_ALIGNED_ARRAY(16, int16_t, input_block, kNumCoeffs);
 | 
					 | 
				
			||||||
    DECLARE_ALIGNED_ARRAY(16, int16_t, output_ref_block, kNumCoeffs);
 | 
					 | 
				
			||||||
    DECLARE_ALIGNED_ARRAY(16, int16_t, output_block, kNumCoeffs);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (int i = 0; i < count_test_block; ++i) {
 | 
					 | 
				
			||||||
      // Initialize a test block with input range [-255, 255].
 | 
					 | 
				
			||||||
      for (int j = 0; j < kNumCoeffs; ++j)
 | 
					 | 
				
			||||||
        input_block[j] = rnd.Rand8() - rnd.Rand8();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      fwd_txfm_ref(input_block, output_ref_block, pitch_, tx_type_);
 | 
					 | 
				
			||||||
      REGISTER_STATE_CHECK(RunFwdTxfm(input_block, output_block, pitch_));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      // The minimum quant value is 4.
 | 
					 | 
				
			||||||
      for (int j = 0; j < kNumCoeffs; ++j)
 | 
					 | 
				
			||||||
        EXPECT_EQ(output_block[j], output_ref_block[j]);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  void RunMemCheck() {
 | 
					 | 
				
			||||||
    ACMRandom rnd(ACMRandom::DeterministicSeed());
 | 
					 | 
				
			||||||
    const int count_test_block = 1000;
 | 
					 | 
				
			||||||
    DECLARE_ALIGNED_ARRAY(16, int16_t, input_block, kNumCoeffs);
 | 
					 | 
				
			||||||
    DECLARE_ALIGNED_ARRAY(16, int16_t, input_extreme_block, kNumCoeffs);
 | 
					 | 
				
			||||||
    DECLARE_ALIGNED_ARRAY(16, int16_t, output_ref_block, kNumCoeffs);
 | 
					 | 
				
			||||||
    DECLARE_ALIGNED_ARRAY(16, int16_t, output_block, kNumCoeffs);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (int i = 0; i < count_test_block; ++i) {
 | 
					 | 
				
			||||||
      // Initialize a test block with input range [-255, 255].
 | 
					 | 
				
			||||||
      for (int j = 0; j < kNumCoeffs; ++j) {
 | 
					 | 
				
			||||||
        input_block[j] = rnd.Rand8() - rnd.Rand8();
 | 
					 | 
				
			||||||
        input_extreme_block[j] = rnd.Rand8() % 2 ? 255 : -255;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      if (i == 0)
 | 
					 | 
				
			||||||
        for (int j = 0; j < kNumCoeffs; ++j)
 | 
					 | 
				
			||||||
          input_extreme_block[j] = 255;
 | 
					 | 
				
			||||||
      if (i == 1)
 | 
					 | 
				
			||||||
        for (int j = 0; j < kNumCoeffs; ++j)
 | 
					 | 
				
			||||||
          input_extreme_block[j] = -255;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      fwd_txfm_ref(input_extreme_block, output_ref_block, pitch_, tx_type_);
 | 
					 | 
				
			||||||
      REGISTER_STATE_CHECK(RunFwdTxfm(input_extreme_block,
 | 
					 | 
				
			||||||
                                      output_block, pitch_));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      // The minimum quant value is 4.
 | 
					 | 
				
			||||||
      for (int j = 0; j < kNumCoeffs; ++j) {
 | 
					 | 
				
			||||||
        EXPECT_EQ(output_block[j], output_ref_block[j]);
 | 
					 | 
				
			||||||
        EXPECT_GE(4 * DCT_MAX_VALUE, abs(output_block[j]))
 | 
					 | 
				
			||||||
            << "Error: 16x16 FDCT has coefficient larger than 4*DCT_MAX_VALUE";
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  void RunInvAccuracyCheck() {
 | 
					 | 
				
			||||||
    ACMRandom rnd(ACMRandom::DeterministicSeed());
 | 
					 | 
				
			||||||
    const int count_test_block = 1000;
 | 
					 | 
				
			||||||
    DECLARE_ALIGNED_ARRAY(16, int16_t, in, kNumCoeffs);
 | 
					 | 
				
			||||||
    DECLARE_ALIGNED_ARRAY(16, int16_t, coeff, kNumCoeffs);
 | 
					 | 
				
			||||||
    DECLARE_ALIGNED_ARRAY(16, uint8_t, dst, kNumCoeffs);
 | 
					 | 
				
			||||||
    DECLARE_ALIGNED_ARRAY(16, uint8_t, src, kNumCoeffs);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (int i = 0; i < count_test_block; ++i) {
 | 
					 | 
				
			||||||
      double out_r[kNumCoeffs];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      // Initialize a test block with input range [-255, 255].
 | 
					 | 
				
			||||||
      for (int j = 0; j < kNumCoeffs; ++j) {
 | 
					 | 
				
			||||||
        src[j] = rnd.Rand8();
 | 
					 | 
				
			||||||
        dst[j] = rnd.Rand8();
 | 
					 | 
				
			||||||
        in[j] = src[j] - dst[j];
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      reference_16x16_dct_2d(in, out_r);
 | 
					 | 
				
			||||||
      for (int j = 0; j < kNumCoeffs; ++j)
 | 
					 | 
				
			||||||
        coeff[j] = round(out_r[j]);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      REGISTER_STATE_CHECK(RunInvTxfm(coeff, dst, 16));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      for (int j = 0; j < kNumCoeffs; ++j) {
 | 
					 | 
				
			||||||
        const uint32_t diff = dst[j] - src[j];
 | 
					 | 
				
			||||||
        const uint32_t error = diff * diff;
 | 
					 | 
				
			||||||
        EXPECT_GE(1u, error)
 | 
					 | 
				
			||||||
            << "Error: 16x16 IDCT has error " << error
 | 
					 | 
				
			||||||
            << " at index " << j;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  int pitch_;
 | 
					 | 
				
			||||||
  int tx_type_;
 | 
					 | 
				
			||||||
  fht_t fwd_txfm_ref;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class Trans16x16DCT : public Trans16x16TestBase,
 | 
					 | 
				
			||||||
                      public PARAMS(fdct_t, idct_t, int) {
 | 
					 | 
				
			||||||
 public:
 | 
					 | 
				
			||||||
  virtual ~Trans16x16DCT() {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void SetUp() {
 | 
					 | 
				
			||||||
    fwd_txfm_ = GET_PARAM(0);
 | 
					 | 
				
			||||||
    inv_txfm_ = GET_PARAM(1);
 | 
					 | 
				
			||||||
    tx_type_  = GET_PARAM(2);
 | 
					 | 
				
			||||||
    pitch_    = 16;
 | 
					 | 
				
			||||||
    fwd_txfm_ref = fdct16x16_ref;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  virtual void TearDown() { libvpx_test::ClearSystemState(); }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  void RunFwdTxfm(int16_t *in, int16_t *out, int stride) {
 | 
					 | 
				
			||||||
    fwd_txfm_(in, out, stride);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  void RunInvTxfm(int16_t *out, uint8_t *dst, int stride) {
 | 
					 | 
				
			||||||
    inv_txfm_(out, dst, stride);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  fdct_t fwd_txfm_;
 | 
					 | 
				
			||||||
  idct_t inv_txfm_;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(Trans16x16DCT, AccuracyCheck) {
 | 
					 | 
				
			||||||
  RunAccuracyCheck();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(Trans16x16DCT, CoeffCheck) {
 | 
					 | 
				
			||||||
  RunCoeffCheck();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(Trans16x16DCT, MemCheck) {
 | 
					 | 
				
			||||||
  RunMemCheck();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(Trans16x16DCT, InvAccuracyCheck) {
 | 
					 | 
				
			||||||
  RunInvAccuracyCheck();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class Trans16x16HT : public Trans16x16TestBase,
 | 
					 | 
				
			||||||
                     public PARAMS(fht_t, iht_t, int) {
 | 
					 | 
				
			||||||
 public:
 | 
					 | 
				
			||||||
  virtual ~Trans16x16HT() {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void SetUp() {
 | 
					 | 
				
			||||||
    fwd_txfm_ = GET_PARAM(0);
 | 
					 | 
				
			||||||
    inv_txfm_ = GET_PARAM(1);
 | 
					 | 
				
			||||||
    tx_type_  = GET_PARAM(2);
 | 
					 | 
				
			||||||
    pitch_    = 16;
 | 
					 | 
				
			||||||
    fwd_txfm_ref = fht16x16_ref;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  virtual void TearDown() { libvpx_test::ClearSystemState(); }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  void RunFwdTxfm(int16_t *in, int16_t *out, int stride) {
 | 
					 | 
				
			||||||
    fwd_txfm_(in, out, stride, tx_type_);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  void RunInvTxfm(int16_t *out, uint8_t *dst, int stride) {
 | 
					 | 
				
			||||||
    inv_txfm_(out, dst, stride, tx_type_);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  fht_t fwd_txfm_;
 | 
					 | 
				
			||||||
  iht_t inv_txfm_;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(Trans16x16HT, AccuracyCheck) {
 | 
					 | 
				
			||||||
  RunAccuracyCheck();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(Trans16x16HT, CoeffCheck) {
 | 
					 | 
				
			||||||
  RunCoeffCheck();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(Trans16x16HT, MemCheck) {
 | 
					 | 
				
			||||||
  RunMemCheck();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
using std::tr1::make_tuple;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(
 | 
					 | 
				
			||||||
    C, Trans16x16DCT,
 | 
					 | 
				
			||||||
    ::testing::Values(
 | 
					 | 
				
			||||||
        make_tuple(&vp9_fdct16x16_c, &vp9_idct16x16_256_add_c, 0)));
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(
 | 
					 | 
				
			||||||
    C, Trans16x16HT,
 | 
					 | 
				
			||||||
    ::testing::Values(
 | 
					 | 
				
			||||||
        make_tuple(&vp9_short_fht16x16_c, &vp9_iht16x16_256_add_c, 0),
 | 
					 | 
				
			||||||
        make_tuple(&vp9_short_fht16x16_c, &vp9_iht16x16_256_add_c, 1),
 | 
					 | 
				
			||||||
        make_tuple(&vp9_short_fht16x16_c, &vp9_iht16x16_256_add_c, 2),
 | 
					 | 
				
			||||||
        make_tuple(&vp9_short_fht16x16_c, &vp9_iht16x16_256_add_c, 3)));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if HAVE_SSE2
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(
 | 
					 | 
				
			||||||
    SSE2, Trans16x16DCT,
 | 
					 | 
				
			||||||
    ::testing::Values(
 | 
					 | 
				
			||||||
        make_tuple(&vp9_fdct16x16_sse2,
 | 
					 | 
				
			||||||
                   &vp9_idct16x16_256_add_sse2, 0)));
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(
 | 
					 | 
				
			||||||
    SSE2, Trans16x16HT,
 | 
					 | 
				
			||||||
    ::testing::Values(
 | 
					 | 
				
			||||||
        make_tuple(&vp9_short_fht16x16_sse2, &vp9_iht16x16_256_add_sse2, 0),
 | 
					 | 
				
			||||||
        make_tuple(&vp9_short_fht16x16_sse2, &vp9_iht16x16_256_add_sse2, 1),
 | 
					 | 
				
			||||||
        make_tuple(&vp9_short_fht16x16_sse2, &vp9_iht16x16_256_add_sse2, 2),
 | 
					 | 
				
			||||||
        make_tuple(&vp9_short_fht16x16_sse2, &vp9_iht16x16_256_add_sse2, 3)));
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}  // namespace
 | 
					 | 
				
			||||||
@@ -1,261 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *  Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
 *  that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
 *  tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
 *  in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
 *  be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <math.h>
 | 
					 | 
				
			||||||
#include <stdlib.h>
 | 
					 | 
				
			||||||
#include <string.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "third_party/googletest/src/include/gtest/gtest.h"
 | 
					 | 
				
			||||||
#include "test/acm_random.h"
 | 
					 | 
				
			||||||
#include "test/clear_system_state.h"
 | 
					 | 
				
			||||||
#include "test/register_state_check.h"
 | 
					 | 
				
			||||||
#include "test/util.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern "C" {
 | 
					 | 
				
			||||||
#include "./vpx_config.h"
 | 
					 | 
				
			||||||
#include "vp9/common/vp9_entropy.h"
 | 
					 | 
				
			||||||
#include "./vp9_rtcd.h"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "vpx/vpx_integer.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
using libvpx_test::ACMRandom;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace {
 | 
					 | 
				
			||||||
#ifdef _MSC_VER
 | 
					 | 
				
			||||||
static int round(double x) {
 | 
					 | 
				
			||||||
  if (x < 0)
 | 
					 | 
				
			||||||
    return static_cast<int>(ceil(x - 0.5));
 | 
					 | 
				
			||||||
  else
 | 
					 | 
				
			||||||
    return static_cast<int>(floor(x + 0.5));
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const int kNumCoeffs = 1024;
 | 
					 | 
				
			||||||
const double kPi = 3.141592653589793238462643383279502884;
 | 
					 | 
				
			||||||
void reference_32x32_dct_1d(const double in[32], double out[32], int stride) {
 | 
					 | 
				
			||||||
  const double kInvSqrt2 = 0.707106781186547524400844362104;
 | 
					 | 
				
			||||||
  for (int k = 0; k < 32; k++) {
 | 
					 | 
				
			||||||
    out[k] = 0.0;
 | 
					 | 
				
			||||||
    for (int n = 0; n < 32; n++)
 | 
					 | 
				
			||||||
      out[k] += in[n] * cos(kPi * (2 * n + 1) * k / 64.0);
 | 
					 | 
				
			||||||
    if (k == 0)
 | 
					 | 
				
			||||||
      out[k] = out[k] * kInvSqrt2;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void reference_32x32_dct_2d(const int16_t input[kNumCoeffs],
 | 
					 | 
				
			||||||
                            double output[kNumCoeffs]) {
 | 
					 | 
				
			||||||
  // First transform columns
 | 
					 | 
				
			||||||
  for (int i = 0; i < 32; ++i) {
 | 
					 | 
				
			||||||
    double temp_in[32], temp_out[32];
 | 
					 | 
				
			||||||
    for (int j = 0; j < 32; ++j)
 | 
					 | 
				
			||||||
      temp_in[j] = input[j*32 + i];
 | 
					 | 
				
			||||||
    reference_32x32_dct_1d(temp_in, temp_out, 1);
 | 
					 | 
				
			||||||
    for (int j = 0; j < 32; ++j)
 | 
					 | 
				
			||||||
      output[j * 32 + i] = temp_out[j];
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  // Then transform rows
 | 
					 | 
				
			||||||
  for (int i = 0; i < 32; ++i) {
 | 
					 | 
				
			||||||
    double temp_in[32], temp_out[32];
 | 
					 | 
				
			||||||
    for (int j = 0; j < 32; ++j)
 | 
					 | 
				
			||||||
      temp_in[j] = output[j + i*32];
 | 
					 | 
				
			||||||
    reference_32x32_dct_1d(temp_in, temp_out, 1);
 | 
					 | 
				
			||||||
    // Scale by some magic number
 | 
					 | 
				
			||||||
    for (int j = 0; j < 32; ++j)
 | 
					 | 
				
			||||||
      output[j + i * 32] = temp_out[j] / 4;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef void (*fwd_txfm_t)(const int16_t *in, int16_t *out, int stride);
 | 
					 | 
				
			||||||
typedef void (*inv_txfm_t)(const int16_t *in, uint8_t *out, int stride);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class Trans32x32Test : public PARAMS(fwd_txfm_t, inv_txfm_t, int) {
 | 
					 | 
				
			||||||
 public:
 | 
					 | 
				
			||||||
  virtual ~Trans32x32Test() {}
 | 
					 | 
				
			||||||
  virtual void SetUp() {
 | 
					 | 
				
			||||||
    fwd_txfm_ = GET_PARAM(0);
 | 
					 | 
				
			||||||
    inv_txfm_ = GET_PARAM(1);
 | 
					 | 
				
			||||||
    version_  = GET_PARAM(2);  // 0: high precision forward transform
 | 
					 | 
				
			||||||
                               // 1: low precision version for rd loop
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void TearDown() { libvpx_test::ClearSystemState(); }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  int version_;
 | 
					 | 
				
			||||||
  fwd_txfm_t fwd_txfm_;
 | 
					 | 
				
			||||||
  inv_txfm_t inv_txfm_;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(Trans32x32Test, AccuracyCheck) {
 | 
					 | 
				
			||||||
  ACMRandom rnd(ACMRandom::DeterministicSeed());
 | 
					 | 
				
			||||||
  uint32_t max_error = 0;
 | 
					 | 
				
			||||||
  int64_t total_error = 0;
 | 
					 | 
				
			||||||
  const int count_test_block = 1000;
 | 
					 | 
				
			||||||
  DECLARE_ALIGNED_ARRAY(16, int16_t, test_input_block, kNumCoeffs);
 | 
					 | 
				
			||||||
  DECLARE_ALIGNED_ARRAY(16, int16_t, test_temp_block, kNumCoeffs);
 | 
					 | 
				
			||||||
  DECLARE_ALIGNED_ARRAY(16, uint8_t, dst, kNumCoeffs);
 | 
					 | 
				
			||||||
  DECLARE_ALIGNED_ARRAY(16, uint8_t, src, kNumCoeffs);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  for (int i = 0; i < count_test_block; ++i) {
 | 
					 | 
				
			||||||
    // Initialize a test block with input range [-255, 255].
 | 
					 | 
				
			||||||
    for (int j = 0; j < kNumCoeffs; ++j) {
 | 
					 | 
				
			||||||
      src[j] = rnd.Rand8();
 | 
					 | 
				
			||||||
      dst[j] = rnd.Rand8();
 | 
					 | 
				
			||||||
      test_input_block[j] = src[j] - dst[j];
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    REGISTER_STATE_CHECK(fwd_txfm_(test_input_block, test_temp_block, 32));
 | 
					 | 
				
			||||||
    REGISTER_STATE_CHECK(inv_txfm_(test_temp_block, dst, 32));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (int j = 0; j < kNumCoeffs; ++j) {
 | 
					 | 
				
			||||||
      const uint32_t diff = dst[j] - src[j];
 | 
					 | 
				
			||||||
      const uint32_t error = diff * diff;
 | 
					 | 
				
			||||||
      if (max_error < error)
 | 
					 | 
				
			||||||
        max_error = error;
 | 
					 | 
				
			||||||
      total_error += error;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (version_ == 1) {
 | 
					 | 
				
			||||||
    max_error /= 2;
 | 
					 | 
				
			||||||
    total_error /= 45;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  EXPECT_GE(1u, max_error)
 | 
					 | 
				
			||||||
      << "Error: 32x32 FDCT/IDCT has an individual round-trip error > 1";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  EXPECT_GE(count_test_block, total_error)
 | 
					 | 
				
			||||||
      << "Error: 32x32 FDCT/IDCT has average round-trip error > 1 per block";
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(Trans32x32Test, CoeffCheck) {
 | 
					 | 
				
			||||||
  ACMRandom rnd(ACMRandom::DeterministicSeed());
 | 
					 | 
				
			||||||
  const int count_test_block = 1000;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  DECLARE_ALIGNED_ARRAY(16, int16_t, input_block, kNumCoeffs);
 | 
					 | 
				
			||||||
  DECLARE_ALIGNED_ARRAY(16, int16_t, output_ref_block, kNumCoeffs);
 | 
					 | 
				
			||||||
  DECLARE_ALIGNED_ARRAY(16, int16_t, output_block, kNumCoeffs);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  for (int i = 0; i < count_test_block; ++i) {
 | 
					 | 
				
			||||||
    for (int j = 0; j < kNumCoeffs; ++j)
 | 
					 | 
				
			||||||
      input_block[j] = rnd.Rand8() - rnd.Rand8();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    const int stride = 32;
 | 
					 | 
				
			||||||
    vp9_fdct32x32_c(input_block, output_ref_block, stride);
 | 
					 | 
				
			||||||
    REGISTER_STATE_CHECK(fwd_txfm_(input_block, output_block, stride));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (version_ == 0) {
 | 
					 | 
				
			||||||
      for (int j = 0; j < kNumCoeffs; ++j)
 | 
					 | 
				
			||||||
        EXPECT_EQ(output_block[j], output_ref_block[j])
 | 
					 | 
				
			||||||
            << "Error: 32x32 FDCT versions have mismatched coefficients";
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
      for (int j = 0; j < kNumCoeffs; ++j)
 | 
					 | 
				
			||||||
        EXPECT_GE(6, abs(output_block[j] - output_ref_block[j]))
 | 
					 | 
				
			||||||
            << "Error: 32x32 FDCT rd has mismatched coefficients";
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(Trans32x32Test, MemCheck) {
 | 
					 | 
				
			||||||
  ACMRandom rnd(ACMRandom::DeterministicSeed());
 | 
					 | 
				
			||||||
  const int count_test_block = 2000;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  DECLARE_ALIGNED_ARRAY(16, int16_t, input_block, kNumCoeffs);
 | 
					 | 
				
			||||||
  DECLARE_ALIGNED_ARRAY(16, int16_t, input_extreme_block, kNumCoeffs);
 | 
					 | 
				
			||||||
  DECLARE_ALIGNED_ARRAY(16, int16_t, output_ref_block, kNumCoeffs);
 | 
					 | 
				
			||||||
  DECLARE_ALIGNED_ARRAY(16, int16_t, output_block, kNumCoeffs);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  for (int i = 0; i < count_test_block; ++i) {
 | 
					 | 
				
			||||||
    // Initialize a test block with input range [-255, 255].
 | 
					 | 
				
			||||||
    for (int j = 0; j < kNumCoeffs; ++j) {
 | 
					 | 
				
			||||||
      input_block[j] = rnd.Rand8() - rnd.Rand8();
 | 
					 | 
				
			||||||
      input_extreme_block[j] = rnd.Rand8() & 1 ? 255 : -255;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if (i == 0)
 | 
					 | 
				
			||||||
      for (int j = 0; j < kNumCoeffs; ++j)
 | 
					 | 
				
			||||||
        input_extreme_block[j] = 255;
 | 
					 | 
				
			||||||
    if (i == 1)
 | 
					 | 
				
			||||||
      for (int j = 0; j < kNumCoeffs; ++j)
 | 
					 | 
				
			||||||
        input_extreme_block[j] = -255;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    const int stride = 32;
 | 
					 | 
				
			||||||
    vp9_fdct32x32_c(input_extreme_block, output_ref_block, stride);
 | 
					 | 
				
			||||||
    REGISTER_STATE_CHECK(fwd_txfm_(input_extreme_block, output_block, stride));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // The minimum quant value is 4.
 | 
					 | 
				
			||||||
    for (int j = 0; j < kNumCoeffs; ++j) {
 | 
					 | 
				
			||||||
      if (version_ == 0) {
 | 
					 | 
				
			||||||
        EXPECT_EQ(output_block[j], output_ref_block[j])
 | 
					 | 
				
			||||||
            << "Error: 32x32 FDCT versions have mismatched coefficients";
 | 
					 | 
				
			||||||
      } else {
 | 
					 | 
				
			||||||
        EXPECT_GE(6, abs(output_block[j] - output_ref_block[j]))
 | 
					 | 
				
			||||||
            << "Error: 32x32 FDCT rd has mismatched coefficients";
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      EXPECT_GE(4 * DCT_MAX_VALUE, abs(output_ref_block[j]))
 | 
					 | 
				
			||||||
          << "Error: 32x32 FDCT C has coefficient larger than 4*DCT_MAX_VALUE";
 | 
					 | 
				
			||||||
      EXPECT_GE(4 * DCT_MAX_VALUE, abs(output_block[j]))
 | 
					 | 
				
			||||||
          << "Error: 32x32 FDCT has coefficient larger than "
 | 
					 | 
				
			||||||
          << "4*DCT_MAX_VALUE";
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(Trans32x32Test, InverseAccuracy) {
 | 
					 | 
				
			||||||
  ACMRandom rnd(ACMRandom::DeterministicSeed());
 | 
					 | 
				
			||||||
  const int count_test_block = 1000;
 | 
					 | 
				
			||||||
  DECLARE_ALIGNED_ARRAY(16, int16_t, in, kNumCoeffs);
 | 
					 | 
				
			||||||
  DECLARE_ALIGNED_ARRAY(16, int16_t, coeff, kNumCoeffs);
 | 
					 | 
				
			||||||
  DECLARE_ALIGNED_ARRAY(16, uint8_t, dst, kNumCoeffs);
 | 
					 | 
				
			||||||
  DECLARE_ALIGNED_ARRAY(16, uint8_t, src, kNumCoeffs);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  for (int i = 0; i < count_test_block; ++i) {
 | 
					 | 
				
			||||||
    double out_r[kNumCoeffs];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Initialize a test block with input range [-255, 255]
 | 
					 | 
				
			||||||
    for (int j = 0; j < kNumCoeffs; ++j) {
 | 
					 | 
				
			||||||
      src[j] = rnd.Rand8();
 | 
					 | 
				
			||||||
      dst[j] = rnd.Rand8();
 | 
					 | 
				
			||||||
      in[j] = src[j] - dst[j];
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    reference_32x32_dct_2d(in, out_r);
 | 
					 | 
				
			||||||
    for (int j = 0; j < kNumCoeffs; ++j)
 | 
					 | 
				
			||||||
      coeff[j] = round(out_r[j]);
 | 
					 | 
				
			||||||
    REGISTER_STATE_CHECK(inv_txfm_(coeff, dst, 32));
 | 
					 | 
				
			||||||
    for (int j = 0; j < kNumCoeffs; ++j) {
 | 
					 | 
				
			||||||
      const int diff = dst[j] - src[j];
 | 
					 | 
				
			||||||
      const int error = diff * diff;
 | 
					 | 
				
			||||||
      EXPECT_GE(1, error)
 | 
					 | 
				
			||||||
          << "Error: 32x32 IDCT has error " << error
 | 
					 | 
				
			||||||
          << " at index " << j;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
using std::tr1::make_tuple;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(
 | 
					 | 
				
			||||||
    C, Trans32x32Test,
 | 
					 | 
				
			||||||
    ::testing::Values(
 | 
					 | 
				
			||||||
        make_tuple(&vp9_fdct32x32_c, &vp9_idct32x32_1024_add_c, 0),
 | 
					 | 
				
			||||||
        make_tuple(&vp9_fdct32x32_rd_c, &vp9_idct32x32_1024_add_c, 1)));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if HAVE_SSE2
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(
 | 
					 | 
				
			||||||
    SSE2, Trans32x32Test,
 | 
					 | 
				
			||||||
    ::testing::Values(
 | 
					 | 
				
			||||||
        make_tuple(&vp9_fdct32x32_sse2,
 | 
					 | 
				
			||||||
                   &vp9_idct32x32_1024_add_sse2, 0),
 | 
					 | 
				
			||||||
        make_tuple(&vp9_fdct32x32_rd_sse2,
 | 
					 | 
				
			||||||
                   &vp9_idct32x32_1024_add_sse2, 1)));
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}  // namespace
 | 
					 | 
				
			||||||
@@ -1,47 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *  Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
 *  that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
 *  tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
 *  in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
 *  be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
#include "test/codec_factory.h"
 | 
					 | 
				
			||||||
#include "test/decode_test_driver.h"
 | 
					 | 
				
			||||||
#include "third_party/googletest/src/include/gtest/gtest.h"
 | 
					 | 
				
			||||||
#include "test/register_state_check.h"
 | 
					 | 
				
			||||||
#include "test/video_source.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace libvpx_test {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
vpx_codec_err_t Decoder::DecodeFrame(const uint8_t *cxdata, int size) {
 | 
					 | 
				
			||||||
  vpx_codec_err_t res_dec;
 | 
					 | 
				
			||||||
  InitOnce();
 | 
					 | 
				
			||||||
  REGISTER_STATE_CHECK(res_dec = vpx_codec_decode(&decoder_,
 | 
					 | 
				
			||||||
                                                  cxdata, size, NULL, 0));
 | 
					 | 
				
			||||||
  return res_dec;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void DecoderTest::RunLoop(CompressedVideoSource *video) {
 | 
					 | 
				
			||||||
  vpx_codec_dec_cfg_t dec_cfg = {0};
 | 
					 | 
				
			||||||
  Decoder* const decoder = codec_->CreateDecoder(dec_cfg, 0);
 | 
					 | 
				
			||||||
  ASSERT_TRUE(decoder != NULL);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Decode frames.
 | 
					 | 
				
			||||||
  for (video->Begin(); video->cxdata(); video->Next()) {
 | 
					 | 
				
			||||||
    vpx_codec_err_t res_dec = decoder->DecodeFrame(video->cxdata(),
 | 
					 | 
				
			||||||
                                                   video->frame_size());
 | 
					 | 
				
			||||||
    ASSERT_EQ(VPX_CODEC_OK, res_dec) << decoder->DecodeError();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    DxDataIterator dec_iter = decoder->GetDxData();
 | 
					 | 
				
			||||||
    const vpx_image_t *img = NULL;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Get decompressed data
 | 
					 | 
				
			||||||
    while ((img = dec_iter.Next()))
 | 
					 | 
				
			||||||
      DecompressedFrameHook(*img, video->frame_number());
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  delete decoder;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
}  // namespace libvpx_test
 | 
					 | 
				
			||||||
@@ -1,118 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *  Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
 *  that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
 *  tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
 *  in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
 *  be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef TEST_DECODE_TEST_DRIVER_H_
 | 
					 | 
				
			||||||
#define TEST_DECODE_TEST_DRIVER_H_
 | 
					 | 
				
			||||||
#include <cstring>
 | 
					 | 
				
			||||||
#include "third_party/googletest/src/include/gtest/gtest.h"
 | 
					 | 
				
			||||||
#include "./vpx_config.h"
 | 
					 | 
				
			||||||
#include "vpx/vpx_decoder.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace libvpx_test {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class CodecFactory;
 | 
					 | 
				
			||||||
class CompressedVideoSource;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Provides an object to handle decoding output
 | 
					 | 
				
			||||||
class DxDataIterator {
 | 
					 | 
				
			||||||
 public:
 | 
					 | 
				
			||||||
  explicit DxDataIterator(vpx_codec_ctx_t *decoder)
 | 
					 | 
				
			||||||
      : decoder_(decoder), iter_(NULL) {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  const vpx_image_t *Next() {
 | 
					 | 
				
			||||||
    return vpx_codec_get_frame(decoder_, &iter_);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 private:
 | 
					 | 
				
			||||||
  vpx_codec_ctx_t  *decoder_;
 | 
					 | 
				
			||||||
  vpx_codec_iter_t  iter_;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Provides a simplified interface to manage one video decoding.
 | 
					 | 
				
			||||||
// Similar to Encoder class, the exact services should be added
 | 
					 | 
				
			||||||
// as more tests are added.
 | 
					 | 
				
			||||||
class Decoder {
 | 
					 | 
				
			||||||
 public:
 | 
					 | 
				
			||||||
  Decoder(vpx_codec_dec_cfg_t cfg, unsigned long deadline)
 | 
					 | 
				
			||||||
      : cfg_(cfg), deadline_(deadline), init_done_(false) {
 | 
					 | 
				
			||||||
    memset(&decoder_, 0, sizeof(decoder_));
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual ~Decoder() {
 | 
					 | 
				
			||||||
    vpx_codec_destroy(&decoder_);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  vpx_codec_err_t DecodeFrame(const uint8_t *cxdata, int size);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  DxDataIterator GetDxData() {
 | 
					 | 
				
			||||||
    return DxDataIterator(&decoder_);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  void set_deadline(unsigned long deadline) {
 | 
					 | 
				
			||||||
    deadline_ = deadline;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  void Control(int ctrl_id, int arg) {
 | 
					 | 
				
			||||||
    InitOnce();
 | 
					 | 
				
			||||||
    const vpx_codec_err_t res = vpx_codec_control_(&decoder_, ctrl_id, arg);
 | 
					 | 
				
			||||||
    ASSERT_EQ(VPX_CODEC_OK, res) << DecodeError();
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  void Control(int ctrl_id, const void *arg) {
 | 
					 | 
				
			||||||
    InitOnce();
 | 
					 | 
				
			||||||
    const vpx_codec_err_t res = vpx_codec_control_(&decoder_, ctrl_id, arg);
 | 
					 | 
				
			||||||
    ASSERT_EQ(VPX_CODEC_OK, res) << DecodeError();
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  const char* DecodeError() {
 | 
					 | 
				
			||||||
    const char *detail = vpx_codec_error_detail(&decoder_);
 | 
					 | 
				
			||||||
    return detail ? detail : vpx_codec_error(&decoder_);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  virtual const vpx_codec_iface_t* CodecInterface() const = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  void InitOnce() {
 | 
					 | 
				
			||||||
    if (!init_done_) {
 | 
					 | 
				
			||||||
      const vpx_codec_err_t res = vpx_codec_dec_init(&decoder_,
 | 
					 | 
				
			||||||
                                                     CodecInterface(),
 | 
					 | 
				
			||||||
                                                     &cfg_, 0);
 | 
					 | 
				
			||||||
      ASSERT_EQ(VPX_CODEC_OK, res) << DecodeError();
 | 
					 | 
				
			||||||
      init_done_ = true;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  vpx_codec_ctx_t     decoder_;
 | 
					 | 
				
			||||||
  vpx_codec_dec_cfg_t cfg_;
 | 
					 | 
				
			||||||
  unsigned int        deadline_;
 | 
					 | 
				
			||||||
  bool                init_done_;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Common test functionality for all Decoder tests.
 | 
					 | 
				
			||||||
class DecoderTest {
 | 
					 | 
				
			||||||
 public:
 | 
					 | 
				
			||||||
  // Main decoding loop
 | 
					 | 
				
			||||||
  virtual void RunLoop(CompressedVideoSource *video);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Hook to be called on every decompressed frame.
 | 
					 | 
				
			||||||
  virtual void DecompressedFrameHook(const vpx_image_t& img,
 | 
					 | 
				
			||||||
                                     const unsigned int frame_number) {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  explicit DecoderTest(const CodecFactory *codec) : codec_(codec) {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual ~DecoderTest() {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  const CodecFactory *codec_;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}  // namespace libvpx_test
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif  // TEST_DECODE_TEST_DRIVER_H_
 | 
					 | 
				
			||||||
@@ -1,225 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *  Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
 *  that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
 *  tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
 *  in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
 *  be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "./vpx_config.h"
 | 
					 | 
				
			||||||
#include "test/codec_factory.h"
 | 
					 | 
				
			||||||
#include "test/encode_test_driver.h"
 | 
					 | 
				
			||||||
#include "test/decode_test_driver.h"
 | 
					 | 
				
			||||||
#include "test/register_state_check.h"
 | 
					 | 
				
			||||||
#include "test/video_source.h"
 | 
					 | 
				
			||||||
#include "third_party/googletest/src/include/gtest/gtest.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace libvpx_test {
 | 
					 | 
				
			||||||
void Encoder::EncodeFrame(VideoSource *video, const unsigned long frame_flags) {
 | 
					 | 
				
			||||||
  if (video->img())
 | 
					 | 
				
			||||||
    EncodeFrameInternal(*video, frame_flags);
 | 
					 | 
				
			||||||
  else
 | 
					 | 
				
			||||||
    Flush();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Handle twopass stats
 | 
					 | 
				
			||||||
  CxDataIterator iter = GetCxData();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  while (const vpx_codec_cx_pkt_t *pkt = iter.Next()) {
 | 
					 | 
				
			||||||
    if (pkt->kind != VPX_CODEC_STATS_PKT)
 | 
					 | 
				
			||||||
      continue;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    stats_->Append(*pkt);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void Encoder::EncodeFrameInternal(const VideoSource &video,
 | 
					 | 
				
			||||||
                                  const unsigned long frame_flags) {
 | 
					 | 
				
			||||||
  vpx_codec_err_t res;
 | 
					 | 
				
			||||||
  const vpx_image_t *img = video.img();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Handle first frame initialization
 | 
					 | 
				
			||||||
  if (!encoder_.priv) {
 | 
					 | 
				
			||||||
    cfg_.g_w = img->d_w;
 | 
					 | 
				
			||||||
    cfg_.g_h = img->d_h;
 | 
					 | 
				
			||||||
    cfg_.g_timebase = video.timebase();
 | 
					 | 
				
			||||||
    cfg_.rc_twopass_stats_in = stats_->buf();
 | 
					 | 
				
			||||||
    res = vpx_codec_enc_init(&encoder_, CodecInterface(), &cfg_,
 | 
					 | 
				
			||||||
                             init_flags_);
 | 
					 | 
				
			||||||
    ASSERT_EQ(VPX_CODEC_OK, res) << EncoderError();
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Handle frame resizing
 | 
					 | 
				
			||||||
  if (cfg_.g_w != img->d_w || cfg_.g_h != img->d_h) {
 | 
					 | 
				
			||||||
    cfg_.g_w = img->d_w;
 | 
					 | 
				
			||||||
    cfg_.g_h = img->d_h;
 | 
					 | 
				
			||||||
    res = vpx_codec_enc_config_set(&encoder_, &cfg_);
 | 
					 | 
				
			||||||
    ASSERT_EQ(VPX_CODEC_OK, res) << EncoderError();
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Encode the frame
 | 
					 | 
				
			||||||
  REGISTER_STATE_CHECK(
 | 
					 | 
				
			||||||
      res = vpx_codec_encode(&encoder_,
 | 
					 | 
				
			||||||
                             video.img(), video.pts(), video.duration(),
 | 
					 | 
				
			||||||
                             frame_flags, deadline_));
 | 
					 | 
				
			||||||
  ASSERT_EQ(VPX_CODEC_OK, res) << EncoderError();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void Encoder::Flush() {
 | 
					 | 
				
			||||||
  const vpx_codec_err_t res = vpx_codec_encode(&encoder_, NULL, 0, 0, 0,
 | 
					 | 
				
			||||||
                                               deadline_);
 | 
					 | 
				
			||||||
  ASSERT_EQ(VPX_CODEC_OK, res) << EncoderError();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void EncoderTest::InitializeConfig() {
 | 
					 | 
				
			||||||
  const vpx_codec_err_t res = codec_->DefaultEncoderConfig(&cfg_, 0);
 | 
					 | 
				
			||||||
  ASSERT_EQ(VPX_CODEC_OK, res);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void EncoderTest::SetMode(TestMode mode) {
 | 
					 | 
				
			||||||
  switch (mode) {
 | 
					 | 
				
			||||||
    case kRealTime:
 | 
					 | 
				
			||||||
      deadline_ = VPX_DL_REALTIME;
 | 
					 | 
				
			||||||
      break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    case kOnePassGood:
 | 
					 | 
				
			||||||
    case kTwoPassGood:
 | 
					 | 
				
			||||||
      deadline_ = VPX_DL_GOOD_QUALITY;
 | 
					 | 
				
			||||||
      break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    case kOnePassBest:
 | 
					 | 
				
			||||||
    case kTwoPassBest:
 | 
					 | 
				
			||||||
      deadline_ = VPX_DL_BEST_QUALITY;
 | 
					 | 
				
			||||||
      break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    default:
 | 
					 | 
				
			||||||
      ASSERT_TRUE(false) << "Unexpected mode " << mode;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (mode == kTwoPassGood || mode == kTwoPassBest)
 | 
					 | 
				
			||||||
    passes_ = 2;
 | 
					 | 
				
			||||||
  else
 | 
					 | 
				
			||||||
    passes_ = 1;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
// The function should return "true" most of the time, therefore no early
 | 
					 | 
				
			||||||
// break-out is implemented within the match checking process.
 | 
					 | 
				
			||||||
static bool compare_img(const vpx_image_t *img1,
 | 
					 | 
				
			||||||
                        const vpx_image_t *img2) {
 | 
					 | 
				
			||||||
  bool match = (img1->fmt == img2->fmt) &&
 | 
					 | 
				
			||||||
               (img1->d_w == img2->d_w) &&
 | 
					 | 
				
			||||||
               (img1->d_h == img2->d_h);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  const unsigned int width_y  = img1->d_w;
 | 
					 | 
				
			||||||
  const unsigned int height_y = img1->d_h;
 | 
					 | 
				
			||||||
  unsigned int i;
 | 
					 | 
				
			||||||
  for (i = 0; i < height_y; ++i)
 | 
					 | 
				
			||||||
    match = (memcmp(img1->planes[VPX_PLANE_Y] + i * img1->stride[VPX_PLANE_Y],
 | 
					 | 
				
			||||||
                    img2->planes[VPX_PLANE_Y] + i * img2->stride[VPX_PLANE_Y],
 | 
					 | 
				
			||||||
                    width_y) == 0) && match;
 | 
					 | 
				
			||||||
  const unsigned int width_uv  = (img1->d_w + 1) >> 1;
 | 
					 | 
				
			||||||
  const unsigned int height_uv = (img1->d_h + 1) >> 1;
 | 
					 | 
				
			||||||
  for (i = 0; i <  height_uv; ++i)
 | 
					 | 
				
			||||||
    match = (memcmp(img1->planes[VPX_PLANE_U] + i * img1->stride[VPX_PLANE_U],
 | 
					 | 
				
			||||||
                    img2->planes[VPX_PLANE_U] + i * img2->stride[VPX_PLANE_U],
 | 
					 | 
				
			||||||
                    width_uv) == 0) && match;
 | 
					 | 
				
			||||||
  for (i = 0; i < height_uv; ++i)
 | 
					 | 
				
			||||||
    match = (memcmp(img1->planes[VPX_PLANE_V] + i * img1->stride[VPX_PLANE_V],
 | 
					 | 
				
			||||||
                    img2->planes[VPX_PLANE_V] + i * img2->stride[VPX_PLANE_V],
 | 
					 | 
				
			||||||
                    width_uv) == 0) && match;
 | 
					 | 
				
			||||||
  return match;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void EncoderTest::MismatchHook(const vpx_image_t *img1,
 | 
					 | 
				
			||||||
                               const vpx_image_t *img2) {
 | 
					 | 
				
			||||||
  ASSERT_TRUE(0) << "Encode/Decode mismatch found";
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void EncoderTest::RunLoop(VideoSource *video) {
 | 
					 | 
				
			||||||
  vpx_codec_dec_cfg_t dec_cfg = {0};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  stats_.Reset();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  ASSERT_TRUE(passes_ == 1 || passes_ == 2);
 | 
					 | 
				
			||||||
  for (unsigned int pass = 0; pass < passes_; pass++) {
 | 
					 | 
				
			||||||
    last_pts_ = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (passes_ == 1)
 | 
					 | 
				
			||||||
      cfg_.g_pass = VPX_RC_ONE_PASS;
 | 
					 | 
				
			||||||
    else if (pass == 0)
 | 
					 | 
				
			||||||
      cfg_.g_pass = VPX_RC_FIRST_PASS;
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
      cfg_.g_pass = VPX_RC_LAST_PASS;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    BeginPassHook(pass);
 | 
					 | 
				
			||||||
    Encoder* const encoder = codec_->CreateEncoder(cfg_, deadline_, init_flags_,
 | 
					 | 
				
			||||||
                                                   &stats_);
 | 
					 | 
				
			||||||
    ASSERT_TRUE(encoder != NULL);
 | 
					 | 
				
			||||||
    Decoder* const decoder = codec_->CreateDecoder(dec_cfg, 0);
 | 
					 | 
				
			||||||
    bool again;
 | 
					 | 
				
			||||||
    for (again = true, video->Begin(); again; video->Next()) {
 | 
					 | 
				
			||||||
      again = (video->img() != NULL);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      PreEncodeFrameHook(video);
 | 
					 | 
				
			||||||
      PreEncodeFrameHook(video, encoder);
 | 
					 | 
				
			||||||
      encoder->EncodeFrame(video, frame_flags_);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      CxDataIterator iter = encoder->GetCxData();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      bool has_cxdata = false;
 | 
					 | 
				
			||||||
      bool has_dxdata = false;
 | 
					 | 
				
			||||||
      while (const vpx_codec_cx_pkt_t *pkt = iter.Next()) {
 | 
					 | 
				
			||||||
        pkt = MutateEncoderOutputHook(pkt);
 | 
					 | 
				
			||||||
        again = true;
 | 
					 | 
				
			||||||
        switch (pkt->kind) {
 | 
					 | 
				
			||||||
          case VPX_CODEC_CX_FRAME_PKT:
 | 
					 | 
				
			||||||
            has_cxdata = true;
 | 
					 | 
				
			||||||
            if (decoder && DoDecode()) {
 | 
					 | 
				
			||||||
              vpx_codec_err_t res_dec = decoder->DecodeFrame(
 | 
					 | 
				
			||||||
                  (const uint8_t*)pkt->data.frame.buf, pkt->data.frame.sz);
 | 
					 | 
				
			||||||
              ASSERT_EQ(VPX_CODEC_OK, res_dec) << decoder->DecodeError();
 | 
					 | 
				
			||||||
              has_dxdata = true;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            ASSERT_GE(pkt->data.frame.pts, last_pts_);
 | 
					 | 
				
			||||||
            last_pts_ = pkt->data.frame.pts;
 | 
					 | 
				
			||||||
            FramePktHook(pkt);
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
          case VPX_CODEC_PSNR_PKT:
 | 
					 | 
				
			||||||
            PSNRPktHook(pkt);
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
          default:
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      if (has_dxdata && has_cxdata) {
 | 
					 | 
				
			||||||
        const vpx_image_t *img_enc = encoder->GetPreviewFrame();
 | 
					 | 
				
			||||||
        DxDataIterator dec_iter = decoder->GetDxData();
 | 
					 | 
				
			||||||
        const vpx_image_t *img_dec = dec_iter.Next();
 | 
					 | 
				
			||||||
        if (img_enc && img_dec) {
 | 
					 | 
				
			||||||
          const bool res = compare_img(img_enc, img_dec);
 | 
					 | 
				
			||||||
          if (!res) {  // Mismatch
 | 
					 | 
				
			||||||
            MismatchHook(img_enc, img_dec);
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        if (img_dec)
 | 
					 | 
				
			||||||
          DecompressedFrameHook(*img_dec, video->pts());
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      if (!Continue())
 | 
					 | 
				
			||||||
        break;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    EndPassHook();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (decoder)
 | 
					 | 
				
			||||||
      delete decoder;
 | 
					 | 
				
			||||||
    delete encoder;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (!Continue())
 | 
					 | 
				
			||||||
      break;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}  // namespace libvpx_test
 | 
					 | 
				
			||||||
@@ -1,227 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *  Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
 *  that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
 *  tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
 *  in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
 *  be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
#ifndef TEST_ENCODE_TEST_DRIVER_H_
 | 
					 | 
				
			||||||
#define TEST_ENCODE_TEST_DRIVER_H_
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <string>
 | 
					 | 
				
			||||||
#include <vector>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "./vpx_config.h"
 | 
					 | 
				
			||||||
#include "third_party/googletest/src/include/gtest/gtest.h"
 | 
					 | 
				
			||||||
#include "vpx/vpx_encoder.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace libvpx_test {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class CodecFactory;
 | 
					 | 
				
			||||||
class VideoSource;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum TestMode {
 | 
					 | 
				
			||||||
  kRealTime,
 | 
					 | 
				
			||||||
  kOnePassGood,
 | 
					 | 
				
			||||||
  kOnePassBest,
 | 
					 | 
				
			||||||
  kTwoPassGood,
 | 
					 | 
				
			||||||
  kTwoPassBest
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
#define ALL_TEST_MODES ::testing::Values(::libvpx_test::kRealTime, \
 | 
					 | 
				
			||||||
                                         ::libvpx_test::kOnePassGood, \
 | 
					 | 
				
			||||||
                                         ::libvpx_test::kOnePassBest, \
 | 
					 | 
				
			||||||
                                         ::libvpx_test::kTwoPassGood, \
 | 
					 | 
				
			||||||
                                         ::libvpx_test::kTwoPassBest)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define ONE_PASS_TEST_MODES ::testing::Values(::libvpx_test::kRealTime, \
 | 
					 | 
				
			||||||
                                              ::libvpx_test::kOnePassGood, \
 | 
					 | 
				
			||||||
                                              ::libvpx_test::kOnePassBest)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define TWO_PASS_TEST_MODES ::testing::Values(::libvpx_test::kTwoPassGood, \
 | 
					 | 
				
			||||||
                                              ::libvpx_test::kTwoPassBest)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Provides an object to handle the libvpx get_cx_data() iteration pattern
 | 
					 | 
				
			||||||
class CxDataIterator {
 | 
					 | 
				
			||||||
 public:
 | 
					 | 
				
			||||||
  explicit CxDataIterator(vpx_codec_ctx_t *encoder)
 | 
					 | 
				
			||||||
      : encoder_(encoder), iter_(NULL) {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  const vpx_codec_cx_pkt_t *Next() {
 | 
					 | 
				
			||||||
    return vpx_codec_get_cx_data(encoder_, &iter_);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 private:
 | 
					 | 
				
			||||||
  vpx_codec_ctx_t  *encoder_;
 | 
					 | 
				
			||||||
  vpx_codec_iter_t  iter_;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Implements an in-memory store for libvpx twopass statistics
 | 
					 | 
				
			||||||
class TwopassStatsStore {
 | 
					 | 
				
			||||||
 public:
 | 
					 | 
				
			||||||
  void Append(const vpx_codec_cx_pkt_t &pkt) {
 | 
					 | 
				
			||||||
    buffer_.append(reinterpret_cast<char *>(pkt.data.twopass_stats.buf),
 | 
					 | 
				
			||||||
                   pkt.data.twopass_stats.sz);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  vpx_fixed_buf_t buf() {
 | 
					 | 
				
			||||||
    const vpx_fixed_buf_t buf = { &buffer_[0], buffer_.size() };
 | 
					 | 
				
			||||||
    return buf;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  void Reset() {
 | 
					 | 
				
			||||||
    buffer_.clear();
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  std::string  buffer_;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Provides a simplified interface to manage one video encoding pass, given
 | 
					 | 
				
			||||||
// a configuration and video source.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// TODO(jkoleszar): The exact services it provides and the appropriate
 | 
					 | 
				
			||||||
// level of abstraction will be fleshed out as more tests are written.
 | 
					 | 
				
			||||||
class Encoder {
 | 
					 | 
				
			||||||
 public:
 | 
					 | 
				
			||||||
  Encoder(vpx_codec_enc_cfg_t cfg, unsigned long deadline,
 | 
					 | 
				
			||||||
          const unsigned long init_flags, TwopassStatsStore *stats)
 | 
					 | 
				
			||||||
      : cfg_(cfg), deadline_(deadline), init_flags_(init_flags), stats_(stats) {
 | 
					 | 
				
			||||||
    memset(&encoder_, 0, sizeof(encoder_));
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual ~Encoder() {
 | 
					 | 
				
			||||||
    vpx_codec_destroy(&encoder_);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  CxDataIterator GetCxData() {
 | 
					 | 
				
			||||||
    return CxDataIterator(&encoder_);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  const vpx_image_t *GetPreviewFrame() {
 | 
					 | 
				
			||||||
    return vpx_codec_get_preview_frame(&encoder_);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  // This is a thin wrapper around vpx_codec_encode(), so refer to
 | 
					 | 
				
			||||||
  // vpx_encoder.h for its semantics.
 | 
					 | 
				
			||||||
  void EncodeFrame(VideoSource *video, const unsigned long frame_flags);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Convenience wrapper for EncodeFrame()
 | 
					 | 
				
			||||||
  void EncodeFrame(VideoSource *video) {
 | 
					 | 
				
			||||||
    EncodeFrame(video, 0);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  void Control(int ctrl_id, int arg) {
 | 
					 | 
				
			||||||
    const vpx_codec_err_t res = vpx_codec_control_(&encoder_, ctrl_id, arg);
 | 
					 | 
				
			||||||
    ASSERT_EQ(VPX_CODEC_OK, res) << EncoderError();
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  void Control(int ctrl_id, struct vpx_scaling_mode *arg) {
 | 
					 | 
				
			||||||
    const vpx_codec_err_t res = vpx_codec_control_(&encoder_, ctrl_id, arg);
 | 
					 | 
				
			||||||
    ASSERT_EQ(VPX_CODEC_OK, res) << EncoderError();
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  void set_deadline(unsigned long deadline) {
 | 
					 | 
				
			||||||
    deadline_ = deadline;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  virtual const vpx_codec_iface_t* CodecInterface() const = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  const char *EncoderError() {
 | 
					 | 
				
			||||||
    const char *detail = vpx_codec_error_detail(&encoder_);
 | 
					 | 
				
			||||||
    return detail ? detail : vpx_codec_error(&encoder_);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Encode an image
 | 
					 | 
				
			||||||
  void EncodeFrameInternal(const VideoSource &video,
 | 
					 | 
				
			||||||
                           const unsigned long frame_flags);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Flush the encoder on EOS
 | 
					 | 
				
			||||||
  void Flush();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  vpx_codec_ctx_t      encoder_;
 | 
					 | 
				
			||||||
  vpx_codec_enc_cfg_t  cfg_;
 | 
					 | 
				
			||||||
  unsigned long        deadline_;
 | 
					 | 
				
			||||||
  unsigned long        init_flags_;
 | 
					 | 
				
			||||||
  TwopassStatsStore   *stats_;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Common test functionality for all Encoder tests.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// This class is a mixin which provides the main loop common to all
 | 
					 | 
				
			||||||
// encoder tests. It provides hooks which can be overridden by subclasses
 | 
					 | 
				
			||||||
// to implement each test's specific behavior, while centralizing the bulk
 | 
					 | 
				
			||||||
// of the boilerplate. Note that it doesn't inherit the gtest testing
 | 
					 | 
				
			||||||
// classes directly, so that tests can be parameterized differently.
 | 
					 | 
				
			||||||
class EncoderTest {
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  explicit EncoderTest(const CodecFactory *codec)
 | 
					 | 
				
			||||||
      : codec_(codec), abort_(false), init_flags_(0), frame_flags_(0),
 | 
					 | 
				
			||||||
        last_pts_(0) {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual ~EncoderTest() {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Initialize the cfg_ member with the default configuration.
 | 
					 | 
				
			||||||
  void InitializeConfig();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Map the TestMode enum to the deadline_ and passes_ variables.
 | 
					 | 
				
			||||||
  void SetMode(TestMode mode);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Main loop
 | 
					 | 
				
			||||||
  virtual void RunLoop(VideoSource *video);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Hook to be called at the beginning of a pass.
 | 
					 | 
				
			||||||
  virtual void BeginPassHook(unsigned int pass) {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Hook to be called at the end of a pass.
 | 
					 | 
				
			||||||
  virtual void EndPassHook() {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Hook to be called before encoding a frame.
 | 
					 | 
				
			||||||
  virtual void PreEncodeFrameHook(VideoSource *video) {}
 | 
					 | 
				
			||||||
  virtual void PreEncodeFrameHook(VideoSource *video, Encoder *encoder) {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Hook to be called on every compressed data packet.
 | 
					 | 
				
			||||||
  virtual void FramePktHook(const vpx_codec_cx_pkt_t *pkt) {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Hook to be called on every PSNR packet.
 | 
					 | 
				
			||||||
  virtual void PSNRPktHook(const vpx_codec_cx_pkt_t *pkt) {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Hook to determine whether the encode loop should continue.
 | 
					 | 
				
			||||||
  virtual bool Continue() const {
 | 
					 | 
				
			||||||
    return !(::testing::Test::HasFatalFailure() || abort_);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  const CodecFactory   *codec_;
 | 
					 | 
				
			||||||
  // Hook to determine whether to decode frame after encoding
 | 
					 | 
				
			||||||
  virtual bool DoDecode() const { return 1; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Hook to handle encode/decode mismatch
 | 
					 | 
				
			||||||
  virtual void MismatchHook(const vpx_image_t *img1,
 | 
					 | 
				
			||||||
                            const vpx_image_t *img2);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Hook to be called on every decompressed frame.
 | 
					 | 
				
			||||||
  virtual void DecompressedFrameHook(const vpx_image_t& img,
 | 
					 | 
				
			||||||
                                     vpx_codec_pts_t pts) {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Hook that can modify the encoder's output data
 | 
					 | 
				
			||||||
  virtual const vpx_codec_cx_pkt_t * MutateEncoderOutputHook(
 | 
					 | 
				
			||||||
      const vpx_codec_cx_pkt_t *pkt) {
 | 
					 | 
				
			||||||
    return pkt;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  bool                 abort_;
 | 
					 | 
				
			||||||
  vpx_codec_enc_cfg_t  cfg_;
 | 
					 | 
				
			||||||
  unsigned int         passes_;
 | 
					 | 
				
			||||||
  unsigned long        deadline_;
 | 
					 | 
				
			||||||
  TwopassStatsStore    stats_;
 | 
					 | 
				
			||||||
  unsigned long        init_flags_;
 | 
					 | 
				
			||||||
  unsigned long        frame_flags_;
 | 
					 | 
				
			||||||
  vpx_codec_pts_t      last_pts_;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}  // namespace libvpx_test
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif  // TEST_ENCODE_TEST_DRIVER_H_
 | 
					 | 
				
			||||||
@@ -1,233 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
  that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
  tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
  in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
  be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "third_party/googletest/src/include/gtest/gtest.h"
 | 
					 | 
				
			||||||
#include "test/codec_factory.h"
 | 
					 | 
				
			||||||
#include "test/encode_test_driver.h"
 | 
					 | 
				
			||||||
#include "test/i420_video_source.h"
 | 
					 | 
				
			||||||
#include "test/util.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const int kMaxErrorFrames = 8;
 | 
					 | 
				
			||||||
const int kMaxDroppableFrames = 8;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class ErrorResilienceTest : public ::libvpx_test::EncoderTest,
 | 
					 | 
				
			||||||
    public ::libvpx_test::CodecTestWithParam<libvpx_test::TestMode> {
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  ErrorResilienceTest() : EncoderTest(GET_PARAM(0)),
 | 
					 | 
				
			||||||
                          psnr_(0.0),
 | 
					 | 
				
			||||||
                          nframes_(0),
 | 
					 | 
				
			||||||
                          mismatch_psnr_(0.0),
 | 
					 | 
				
			||||||
                          mismatch_nframes_(0),
 | 
					 | 
				
			||||||
                          encoding_mode_(GET_PARAM(1)) {
 | 
					 | 
				
			||||||
    Reset();
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual ~ErrorResilienceTest() {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  void Reset() {
 | 
					 | 
				
			||||||
    error_nframes_ = 0;
 | 
					 | 
				
			||||||
    droppable_nframes_ = 0;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void SetUp() {
 | 
					 | 
				
			||||||
    InitializeConfig();
 | 
					 | 
				
			||||||
    SetMode(encoding_mode_);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void BeginPassHook(unsigned int /*pass*/) {
 | 
					 | 
				
			||||||
    psnr_ = 0.0;
 | 
					 | 
				
			||||||
    nframes_ = 0;
 | 
					 | 
				
			||||||
    mismatch_psnr_ = 0.0;
 | 
					 | 
				
			||||||
    mismatch_nframes_ = 0;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void PSNRPktHook(const vpx_codec_cx_pkt_t *pkt) {
 | 
					 | 
				
			||||||
    psnr_ += pkt->data.psnr.psnr[0];
 | 
					 | 
				
			||||||
    nframes_++;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void PreEncodeFrameHook(libvpx_test::VideoSource *video) {
 | 
					 | 
				
			||||||
    frame_flags_ &= ~(VP8_EFLAG_NO_UPD_LAST |
 | 
					 | 
				
			||||||
                      VP8_EFLAG_NO_UPD_GF |
 | 
					 | 
				
			||||||
                      VP8_EFLAG_NO_UPD_ARF);
 | 
					 | 
				
			||||||
    if (droppable_nframes_ > 0 &&
 | 
					 | 
				
			||||||
        (cfg_.g_pass == VPX_RC_LAST_PASS || cfg_.g_pass == VPX_RC_ONE_PASS)) {
 | 
					 | 
				
			||||||
      for (unsigned int i = 0; i < droppable_nframes_; ++i) {
 | 
					 | 
				
			||||||
        if (droppable_frames_[i] == video->frame()) {
 | 
					 | 
				
			||||||
          std::cout << "             Encoding droppable frame: "
 | 
					 | 
				
			||||||
                    << droppable_frames_[i] << "\n";
 | 
					 | 
				
			||||||
          frame_flags_ |= (VP8_EFLAG_NO_UPD_LAST |
 | 
					 | 
				
			||||||
                           VP8_EFLAG_NO_UPD_GF |
 | 
					 | 
				
			||||||
                           VP8_EFLAG_NO_UPD_ARF);
 | 
					 | 
				
			||||||
          return;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  double GetAveragePsnr() const {
 | 
					 | 
				
			||||||
    if (nframes_)
 | 
					 | 
				
			||||||
      return psnr_ / nframes_;
 | 
					 | 
				
			||||||
    return 0.0;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  double GetAverageMismatchPsnr() const {
 | 
					 | 
				
			||||||
    if (mismatch_nframes_)
 | 
					 | 
				
			||||||
      return mismatch_psnr_ / mismatch_nframes_;
 | 
					 | 
				
			||||||
    return 0.0;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual bool DoDecode() const {
 | 
					 | 
				
			||||||
    if (error_nframes_ > 0 &&
 | 
					 | 
				
			||||||
        (cfg_.g_pass == VPX_RC_LAST_PASS || cfg_.g_pass == VPX_RC_ONE_PASS)) {
 | 
					 | 
				
			||||||
      for (unsigned int i = 0; i < error_nframes_; ++i) {
 | 
					 | 
				
			||||||
        if (error_frames_[i] == nframes_ - 1) {
 | 
					 | 
				
			||||||
          std::cout << "             Skipping decoding frame: "
 | 
					 | 
				
			||||||
                    << error_frames_[i] << "\n";
 | 
					 | 
				
			||||||
          return 0;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return 1;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void MismatchHook(const vpx_image_t *img1,
 | 
					 | 
				
			||||||
                            const vpx_image_t *img2) {
 | 
					 | 
				
			||||||
    double mismatch_psnr = compute_psnr(img1, img2);
 | 
					 | 
				
			||||||
    mismatch_psnr_ += mismatch_psnr;
 | 
					 | 
				
			||||||
    ++mismatch_nframes_;
 | 
					 | 
				
			||||||
    // std::cout << "Mismatch frame psnr: " << mismatch_psnr << "\n";
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  void SetErrorFrames(int num, unsigned int *list) {
 | 
					 | 
				
			||||||
    if (num > kMaxErrorFrames)
 | 
					 | 
				
			||||||
      num = kMaxErrorFrames;
 | 
					 | 
				
			||||||
    else if (num < 0)
 | 
					 | 
				
			||||||
      num = 0;
 | 
					 | 
				
			||||||
    error_nframes_ = num;
 | 
					 | 
				
			||||||
    for (unsigned int i = 0; i < error_nframes_; ++i)
 | 
					 | 
				
			||||||
      error_frames_[i] = list[i];
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  void SetDroppableFrames(int num, unsigned int *list) {
 | 
					 | 
				
			||||||
    if (num > kMaxDroppableFrames)
 | 
					 | 
				
			||||||
      num = kMaxDroppableFrames;
 | 
					 | 
				
			||||||
    else if (num < 0)
 | 
					 | 
				
			||||||
      num = 0;
 | 
					 | 
				
			||||||
    droppable_nframes_ = num;
 | 
					 | 
				
			||||||
    for (unsigned int i = 0; i < droppable_nframes_; ++i)
 | 
					 | 
				
			||||||
      droppable_frames_[i] = list[i];
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  unsigned int GetMismatchFrames() {
 | 
					 | 
				
			||||||
    return mismatch_nframes_;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 private:
 | 
					 | 
				
			||||||
  double psnr_;
 | 
					 | 
				
			||||||
  unsigned int nframes_;
 | 
					 | 
				
			||||||
  unsigned int error_nframes_;
 | 
					 | 
				
			||||||
  unsigned int droppable_nframes_;
 | 
					 | 
				
			||||||
  double mismatch_psnr_;
 | 
					 | 
				
			||||||
  unsigned int mismatch_nframes_;
 | 
					 | 
				
			||||||
  unsigned int error_frames_[kMaxErrorFrames];
 | 
					 | 
				
			||||||
  unsigned int droppable_frames_[kMaxDroppableFrames];
 | 
					 | 
				
			||||||
  libvpx_test::TestMode encoding_mode_;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(ErrorResilienceTest, OnVersusOff) {
 | 
					 | 
				
			||||||
  const vpx_rational timebase = { 33333333, 1000000000 };
 | 
					 | 
				
			||||||
  cfg_.g_timebase = timebase;
 | 
					 | 
				
			||||||
  cfg_.rc_target_bitrate = 2000;
 | 
					 | 
				
			||||||
  cfg_.g_lag_in_frames = 10;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  init_flags_ = VPX_CODEC_USE_PSNR;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  libvpx_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288,
 | 
					 | 
				
			||||||
                                     timebase.den, timebase.num, 0, 30);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Error resilient mode OFF.
 | 
					 | 
				
			||||||
  cfg_.g_error_resilient = 0;
 | 
					 | 
				
			||||||
  ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
 | 
					 | 
				
			||||||
  const double psnr_resilience_off = GetAveragePsnr();
 | 
					 | 
				
			||||||
  EXPECT_GT(psnr_resilience_off, 25.0);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Error resilient mode ON.
 | 
					 | 
				
			||||||
  cfg_.g_error_resilient = 1;
 | 
					 | 
				
			||||||
  ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
 | 
					 | 
				
			||||||
  const double psnr_resilience_on = GetAveragePsnr();
 | 
					 | 
				
			||||||
  EXPECT_GT(psnr_resilience_on, 25.0);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Test that turning on error resilient mode hurts by 10% at most.
 | 
					 | 
				
			||||||
  if (psnr_resilience_off > 0.0) {
 | 
					 | 
				
			||||||
    const double psnr_ratio = psnr_resilience_on / psnr_resilience_off;
 | 
					 | 
				
			||||||
    EXPECT_GE(psnr_ratio, 0.9);
 | 
					 | 
				
			||||||
    EXPECT_LE(psnr_ratio, 1.1);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(ErrorResilienceTest, DropFramesWithoutRecovery) {
 | 
					 | 
				
			||||||
  const vpx_rational timebase = { 33333333, 1000000000 };
 | 
					 | 
				
			||||||
  cfg_.g_timebase = timebase;
 | 
					 | 
				
			||||||
  cfg_.rc_target_bitrate = 500;
 | 
					 | 
				
			||||||
  // FIXME(debargha): Fix this to work for any lag.
 | 
					 | 
				
			||||||
  // Currently this test only works for lag = 0
 | 
					 | 
				
			||||||
  cfg_.g_lag_in_frames = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  init_flags_ = VPX_CODEC_USE_PSNR;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  libvpx_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288,
 | 
					 | 
				
			||||||
                                     timebase.den, timebase.num, 0, 30);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Error resilient mode ON.
 | 
					 | 
				
			||||||
  cfg_.g_error_resilient = 1;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Set an arbitrary set of error frames same as droppable frames
 | 
					 | 
				
			||||||
  unsigned int num_droppable_frames = 2;
 | 
					 | 
				
			||||||
  unsigned int droppable_frame_list[] = {5, 16};
 | 
					 | 
				
			||||||
  SetDroppableFrames(num_droppable_frames, droppable_frame_list);
 | 
					 | 
				
			||||||
  SetErrorFrames(num_droppable_frames, droppable_frame_list);
 | 
					 | 
				
			||||||
  ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
 | 
					 | 
				
			||||||
  // Test that no mismatches have been found
 | 
					 | 
				
			||||||
  std::cout << "             Mismatch frames: "
 | 
					 | 
				
			||||||
            << GetMismatchFrames() << "\n";
 | 
					 | 
				
			||||||
  EXPECT_EQ(GetMismatchFrames(), (unsigned int) 0);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // reset previously set error/droppable frames
 | 
					 | 
				
			||||||
  Reset();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if 0
 | 
					 | 
				
			||||||
  // TODO(jkoleszar): This test is disabled for the time being as too
 | 
					 | 
				
			||||||
  // sensitive. It's not clear how to set a reasonable threshold for
 | 
					 | 
				
			||||||
  // this behavior.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Now set an arbitrary set of error frames that are non-droppable
 | 
					 | 
				
			||||||
  unsigned int num_error_frames = 3;
 | 
					 | 
				
			||||||
  unsigned int error_frame_list[] = {3, 10, 20};
 | 
					 | 
				
			||||||
  SetErrorFrames(num_error_frames, error_frame_list);
 | 
					 | 
				
			||||||
  ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Test that dropping an arbitrary set of inter frames does not hurt too much
 | 
					 | 
				
			||||||
  // Note the Average Mismatch PSNR is the average of the PSNR between
 | 
					 | 
				
			||||||
  // decoded frame and encoder's version of the same frame for all frames
 | 
					 | 
				
			||||||
  // with mismatch.
 | 
					 | 
				
			||||||
  const double psnr_resilience_mismatch = GetAverageMismatchPsnr();
 | 
					 | 
				
			||||||
  std::cout << "             Mismatch PSNR: "
 | 
					 | 
				
			||||||
            << psnr_resilience_mismatch << "\n";
 | 
					 | 
				
			||||||
  EXPECT_GT(psnr_resilience_mismatch, 20.0);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
VP8_INSTANTIATE_TEST_CASE(ErrorResilienceTest, ONE_PASS_TEST_MODES);
 | 
					 | 
				
			||||||
VP9_INSTANTIATE_TEST_CASE(ErrorResilienceTest, ONE_PASS_TEST_MODES);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}  // namespace
 | 
					 | 
				
			||||||
@@ -1,300 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *  Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
 *  that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
 *  tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
 *  in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
 *  be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <math.h>
 | 
					 | 
				
			||||||
#include <stdlib.h>
 | 
					 | 
				
			||||||
#include <string.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "third_party/googletest/src/include/gtest/gtest.h"
 | 
					 | 
				
			||||||
#include "test/acm_random.h"
 | 
					 | 
				
			||||||
#include "test/clear_system_state.h"
 | 
					 | 
				
			||||||
#include "test/register_state_check.h"
 | 
					 | 
				
			||||||
#include "test/util.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern "C" {
 | 
					 | 
				
			||||||
#include "vp9/common/vp9_entropy.h"
 | 
					 | 
				
			||||||
#include "./vp9_rtcd.h"
 | 
					 | 
				
			||||||
void vp9_idct4x4_16_add_c(const int16_t *input, uint8_t *output, int pitch);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#include "vpx/vpx_integer.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
using libvpx_test::ACMRandom;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace {
 | 
					 | 
				
			||||||
const int kNumCoeffs = 16;
 | 
					 | 
				
			||||||
typedef void (*fdct_t)(const int16_t *in, int16_t *out, int stride);
 | 
					 | 
				
			||||||
typedef void (*idct_t)(const int16_t *in, uint8_t *out, int stride);
 | 
					 | 
				
			||||||
typedef void (*fht_t) (const int16_t *in, int16_t *out, int stride,
 | 
					 | 
				
			||||||
                       int tx_type);
 | 
					 | 
				
			||||||
typedef void (*iht_t) (const int16_t *in, uint8_t *out, int stride,
 | 
					 | 
				
			||||||
                       int tx_type);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void fdct4x4_ref(const int16_t *in, int16_t *out, int stride, int tx_type) {
 | 
					 | 
				
			||||||
  vp9_fdct4x4_c(in, out, stride);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void fht4x4_ref(const int16_t *in, int16_t *out, int stride, int tx_type) {
 | 
					 | 
				
			||||||
  vp9_short_fht4x4_c(in, out, stride, tx_type);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class Trans4x4TestBase {
 | 
					 | 
				
			||||||
 public:
 | 
					 | 
				
			||||||
  virtual ~Trans4x4TestBase() {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  virtual void RunFwdTxfm(const int16_t *in, int16_t *out, int stride) = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void RunInvTxfm(const int16_t *out, uint8_t *dst, int stride) = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  void RunAccuracyCheck() {
 | 
					 | 
				
			||||||
    ACMRandom rnd(ACMRandom::DeterministicSeed());
 | 
					 | 
				
			||||||
    uint32_t max_error = 0;
 | 
					 | 
				
			||||||
    int64_t total_error = 0;
 | 
					 | 
				
			||||||
    const int count_test_block = 10000;
 | 
					 | 
				
			||||||
    for (int i = 0; i < count_test_block; ++i) {
 | 
					 | 
				
			||||||
      DECLARE_ALIGNED_ARRAY(16, int16_t, test_input_block, kNumCoeffs);
 | 
					 | 
				
			||||||
      DECLARE_ALIGNED_ARRAY(16, int16_t, test_temp_block, kNumCoeffs);
 | 
					 | 
				
			||||||
      DECLARE_ALIGNED_ARRAY(16, uint8_t, dst, kNumCoeffs);
 | 
					 | 
				
			||||||
      DECLARE_ALIGNED_ARRAY(16, uint8_t, src, kNumCoeffs);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      // Initialize a test block with input range [-255, 255].
 | 
					 | 
				
			||||||
      for (int j = 0; j < kNumCoeffs; ++j) {
 | 
					 | 
				
			||||||
        src[j] = rnd.Rand8();
 | 
					 | 
				
			||||||
        dst[j] = rnd.Rand8();
 | 
					 | 
				
			||||||
        test_input_block[j] = src[j] - dst[j];
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      REGISTER_STATE_CHECK(RunFwdTxfm(test_input_block,
 | 
					 | 
				
			||||||
                                      test_temp_block, pitch_));
 | 
					 | 
				
			||||||
      REGISTER_STATE_CHECK(RunInvTxfm(test_temp_block, dst, pitch_));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      for (int j = 0; j < kNumCoeffs; ++j) {
 | 
					 | 
				
			||||||
        const uint32_t diff = dst[j] - src[j];
 | 
					 | 
				
			||||||
        const uint32_t error = diff * diff;
 | 
					 | 
				
			||||||
        if (max_error < error)
 | 
					 | 
				
			||||||
          max_error = error;
 | 
					 | 
				
			||||||
        total_error += error;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    EXPECT_GE(1u, max_error)
 | 
					 | 
				
			||||||
        << "Error: 4x4 FHT/IHT has an individual round trip error > 1";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    EXPECT_GE(count_test_block , total_error)
 | 
					 | 
				
			||||||
        << "Error: 4x4 FHT/IHT has average round trip error > 1 per block";
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  void RunCoeffCheck() {
 | 
					 | 
				
			||||||
    ACMRandom rnd(ACMRandom::DeterministicSeed());
 | 
					 | 
				
			||||||
    const int count_test_block = 5000;
 | 
					 | 
				
			||||||
    DECLARE_ALIGNED_ARRAY(16, int16_t, input_block, kNumCoeffs);
 | 
					 | 
				
			||||||
    DECLARE_ALIGNED_ARRAY(16, int16_t, output_ref_block, kNumCoeffs);
 | 
					 | 
				
			||||||
    DECLARE_ALIGNED_ARRAY(16, int16_t, output_block, kNumCoeffs);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (int i = 0; i < count_test_block; ++i) {
 | 
					 | 
				
			||||||
      // Initialize a test block with input range [-255, 255].
 | 
					 | 
				
			||||||
      for (int j = 0; j < kNumCoeffs; ++j)
 | 
					 | 
				
			||||||
        input_block[j] = rnd.Rand8() - rnd.Rand8();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      fwd_txfm_ref(input_block, output_ref_block, pitch_, tx_type_);
 | 
					 | 
				
			||||||
      REGISTER_STATE_CHECK(RunFwdTxfm(input_block, output_block, pitch_));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      // The minimum quant value is 4.
 | 
					 | 
				
			||||||
      for (int j = 0; j < kNumCoeffs; ++j)
 | 
					 | 
				
			||||||
        EXPECT_EQ(output_block[j], output_ref_block[j]);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  void RunMemCheck() {
 | 
					 | 
				
			||||||
    ACMRandom rnd(ACMRandom::DeterministicSeed());
 | 
					 | 
				
			||||||
    const int count_test_block = 5000;
 | 
					 | 
				
			||||||
    DECLARE_ALIGNED_ARRAY(16, int16_t, input_block, kNumCoeffs);
 | 
					 | 
				
			||||||
    DECLARE_ALIGNED_ARRAY(16, int16_t, input_extreme_block, kNumCoeffs);
 | 
					 | 
				
			||||||
    DECLARE_ALIGNED_ARRAY(16, int16_t, output_ref_block, kNumCoeffs);
 | 
					 | 
				
			||||||
    DECLARE_ALIGNED_ARRAY(16, int16_t, output_block, kNumCoeffs);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (int i = 0; i < count_test_block; ++i) {
 | 
					 | 
				
			||||||
      // Initialize a test block with input range [-255, 255].
 | 
					 | 
				
			||||||
      for (int j = 0; j < kNumCoeffs; ++j) {
 | 
					 | 
				
			||||||
        input_block[j] = rnd.Rand8() - rnd.Rand8();
 | 
					 | 
				
			||||||
        input_extreme_block[j] = rnd.Rand8() % 2 ? 255 : -255;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      if (i == 0)
 | 
					 | 
				
			||||||
        for (int j = 0; j < kNumCoeffs; ++j)
 | 
					 | 
				
			||||||
          input_extreme_block[j] = 255;
 | 
					 | 
				
			||||||
      if (i == 1)
 | 
					 | 
				
			||||||
        for (int j = 0; j < kNumCoeffs; ++j)
 | 
					 | 
				
			||||||
          input_extreme_block[j] = -255;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      fwd_txfm_ref(input_extreme_block, output_ref_block, pitch_, tx_type_);
 | 
					 | 
				
			||||||
      REGISTER_STATE_CHECK(RunFwdTxfm(input_extreme_block,
 | 
					 | 
				
			||||||
                                      output_block, pitch_));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      // The minimum quant value is 4.
 | 
					 | 
				
			||||||
      for (int j = 0; j < kNumCoeffs; ++j) {
 | 
					 | 
				
			||||||
        EXPECT_EQ(output_block[j], output_ref_block[j]);
 | 
					 | 
				
			||||||
        EXPECT_GE(4 * DCT_MAX_VALUE, abs(output_block[j]))
 | 
					 | 
				
			||||||
            << "Error: 16x16 FDCT has coefficient larger than 4*DCT_MAX_VALUE";
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  void RunInvAccuracyCheck() {
 | 
					 | 
				
			||||||
    ACMRandom rnd(ACMRandom::DeterministicSeed());
 | 
					 | 
				
			||||||
    const int count_test_block = 1000;
 | 
					 | 
				
			||||||
    DECLARE_ALIGNED_ARRAY(16, int16_t, in, kNumCoeffs);
 | 
					 | 
				
			||||||
    DECLARE_ALIGNED_ARRAY(16, int16_t, coeff, kNumCoeffs);
 | 
					 | 
				
			||||||
    DECLARE_ALIGNED_ARRAY(16, uint8_t, dst, kNumCoeffs);
 | 
					 | 
				
			||||||
    DECLARE_ALIGNED_ARRAY(16, uint8_t, src, kNumCoeffs);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (int i = 0; i < count_test_block; ++i) {
 | 
					 | 
				
			||||||
      // Initialize a test block with input range [-255, 255].
 | 
					 | 
				
			||||||
      for (int j = 0; j < kNumCoeffs; ++j) {
 | 
					 | 
				
			||||||
        src[j] = rnd.Rand8();
 | 
					 | 
				
			||||||
        dst[j] = rnd.Rand8();
 | 
					 | 
				
			||||||
        in[j] = src[j] - dst[j];
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      fwd_txfm_ref(in, coeff, pitch_, tx_type_);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      REGISTER_STATE_CHECK(RunInvTxfm(coeff, dst, pitch_));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      for (int j = 0; j < kNumCoeffs; ++j) {
 | 
					 | 
				
			||||||
        const uint32_t diff = dst[j] - src[j];
 | 
					 | 
				
			||||||
        const uint32_t error = diff * diff;
 | 
					 | 
				
			||||||
        EXPECT_GE(1u, error)
 | 
					 | 
				
			||||||
            << "Error: 16x16 IDCT has error " << error
 | 
					 | 
				
			||||||
            << " at index " << j;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  int pitch_;
 | 
					 | 
				
			||||||
  int tx_type_;
 | 
					 | 
				
			||||||
  fht_t fwd_txfm_ref;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class Trans4x4DCT
 | 
					 | 
				
			||||||
    : public Trans4x4TestBase,
 | 
					 | 
				
			||||||
      public PARAMS(fdct_t, idct_t, int) {
 | 
					 | 
				
			||||||
 public:
 | 
					 | 
				
			||||||
  virtual ~Trans4x4DCT() {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void SetUp() {
 | 
					 | 
				
			||||||
    fwd_txfm_ = GET_PARAM(0);
 | 
					 | 
				
			||||||
    inv_txfm_ = GET_PARAM(1);
 | 
					 | 
				
			||||||
    tx_type_  = GET_PARAM(2);
 | 
					 | 
				
			||||||
    pitch_    = 4;
 | 
					 | 
				
			||||||
    fwd_txfm_ref = fdct4x4_ref;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  virtual void TearDown() { libvpx_test::ClearSystemState(); }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  void RunFwdTxfm(const int16_t *in, int16_t *out, int stride) {
 | 
					 | 
				
			||||||
    fwd_txfm_(in, out, stride);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  void RunInvTxfm(const int16_t *out, uint8_t *dst, int stride) {
 | 
					 | 
				
			||||||
    inv_txfm_(out, dst, stride);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  fdct_t fwd_txfm_;
 | 
					 | 
				
			||||||
  idct_t inv_txfm_;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(Trans4x4DCT, AccuracyCheck) {
 | 
					 | 
				
			||||||
  RunAccuracyCheck();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(Trans4x4DCT, CoeffCheck) {
 | 
					 | 
				
			||||||
  RunCoeffCheck();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(Trans4x4DCT, MemCheck) {
 | 
					 | 
				
			||||||
  RunMemCheck();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(Trans4x4DCT, InvAccuracyCheck) {
 | 
					 | 
				
			||||||
  RunInvAccuracyCheck();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class Trans4x4HT
 | 
					 | 
				
			||||||
    : public Trans4x4TestBase,
 | 
					 | 
				
			||||||
      public PARAMS(fht_t, iht_t, int) {
 | 
					 | 
				
			||||||
 public:
 | 
					 | 
				
			||||||
  virtual ~Trans4x4HT() {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void SetUp() {
 | 
					 | 
				
			||||||
    fwd_txfm_ = GET_PARAM(0);
 | 
					 | 
				
			||||||
    inv_txfm_ = GET_PARAM(1);
 | 
					 | 
				
			||||||
    tx_type_  = GET_PARAM(2);
 | 
					 | 
				
			||||||
    pitch_    = 4;
 | 
					 | 
				
			||||||
    fwd_txfm_ref = fht4x4_ref;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  virtual void TearDown() { libvpx_test::ClearSystemState(); }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  void RunFwdTxfm(const int16_t *in, int16_t *out, int stride) {
 | 
					 | 
				
			||||||
    fwd_txfm_(in, out, stride, tx_type_);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  void RunInvTxfm(const int16_t *out, uint8_t *dst, int stride) {
 | 
					 | 
				
			||||||
    inv_txfm_(out, dst, stride, tx_type_);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  fht_t fwd_txfm_;
 | 
					 | 
				
			||||||
  iht_t inv_txfm_;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(Trans4x4HT, AccuracyCheck) {
 | 
					 | 
				
			||||||
  RunAccuracyCheck();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(Trans4x4HT, CoeffCheck) {
 | 
					 | 
				
			||||||
  RunCoeffCheck();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(Trans4x4HT, MemCheck) {
 | 
					 | 
				
			||||||
  RunMemCheck();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(Trans4x4HT, InvAccuracyCheck) {
 | 
					 | 
				
			||||||
  RunInvAccuracyCheck();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
using std::tr1::make_tuple;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(
 | 
					 | 
				
			||||||
    C, Trans4x4DCT,
 | 
					 | 
				
			||||||
    ::testing::Values(
 | 
					 | 
				
			||||||
        make_tuple(&vp9_fdct4x4_c, &vp9_idct4x4_16_add_c, 0)));
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(
 | 
					 | 
				
			||||||
    C, Trans4x4HT,
 | 
					 | 
				
			||||||
    ::testing::Values(
 | 
					 | 
				
			||||||
        make_tuple(&vp9_short_fht4x4_c, &vp9_iht4x4_16_add_c, 0),
 | 
					 | 
				
			||||||
        make_tuple(&vp9_short_fht4x4_c, &vp9_iht4x4_16_add_c, 1),
 | 
					 | 
				
			||||||
        make_tuple(&vp9_short_fht4x4_c, &vp9_iht4x4_16_add_c, 2),
 | 
					 | 
				
			||||||
        make_tuple(&vp9_short_fht4x4_c, &vp9_iht4x4_16_add_c, 3)));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if HAVE_SSE2
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(
 | 
					 | 
				
			||||||
    SSE2, Trans4x4DCT,
 | 
					 | 
				
			||||||
    ::testing::Values(
 | 
					 | 
				
			||||||
        make_tuple(&vp9_fdct4x4_sse2,
 | 
					 | 
				
			||||||
                   &vp9_idct4x4_16_add_sse2, 0)));
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(
 | 
					 | 
				
			||||||
    SSE2, Trans4x4HT,
 | 
					 | 
				
			||||||
    ::testing::Values(
 | 
					 | 
				
			||||||
        make_tuple(&vp9_short_fht4x4_sse2, &vp9_iht4x4_16_add_sse2, 0),
 | 
					 | 
				
			||||||
        make_tuple(&vp9_short_fht4x4_sse2, &vp9_iht4x4_16_add_sse2, 1),
 | 
					 | 
				
			||||||
        make_tuple(&vp9_short_fht4x4_sse2, &vp9_iht4x4_16_add_sse2, 2),
 | 
					 | 
				
			||||||
        make_tuple(&vp9_short_fht4x4_sse2, &vp9_iht4x4_16_add_sse2, 3)));
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}  // namespace
 | 
					 | 
				
			||||||
@@ -1,323 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *  Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
 *  that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
 *  tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
 *  in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
 *  be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <math.h>
 | 
					 | 
				
			||||||
#include <stdlib.h>
 | 
					 | 
				
			||||||
#include <string.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "third_party/googletest/src/include/gtest/gtest.h"
 | 
					 | 
				
			||||||
#include "test/acm_random.h"
 | 
					 | 
				
			||||||
#include "test/clear_system_state.h"
 | 
					 | 
				
			||||||
#include "test/register_state_check.h"
 | 
					 | 
				
			||||||
#include "test/util.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern "C" {
 | 
					 | 
				
			||||||
#include "vp9/common/vp9_entropy.h"
 | 
					 | 
				
			||||||
#include "./vp9_rtcd.h"
 | 
					 | 
				
			||||||
void vp9_idct8x8_64_add_c(const int16_t *input, uint8_t *output, int pitch);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#include "vpx/vpx_integer.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
using libvpx_test::ACMRandom;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace {
 | 
					 | 
				
			||||||
typedef void (*fdct_t)(const int16_t *in, int16_t *out, int stride);
 | 
					 | 
				
			||||||
typedef void (*idct_t)(const int16_t *in, uint8_t *out, int stride);
 | 
					 | 
				
			||||||
typedef void (*fht_t) (const int16_t *in, int16_t *out, int stride,
 | 
					 | 
				
			||||||
                       int tx_type);
 | 
					 | 
				
			||||||
typedef void (*iht_t) (const int16_t *in, uint8_t *out, int stride,
 | 
					 | 
				
			||||||
                       int tx_type);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void fdct8x8_ref(const int16_t *in, int16_t *out, int stride, int tx_type) {
 | 
					 | 
				
			||||||
  vp9_fdct8x8_c(in, out, stride);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void fht8x8_ref(const int16_t *in, int16_t *out, int stride, int tx_type) {
 | 
					 | 
				
			||||||
  vp9_short_fht8x8_c(in, out, stride, tx_type);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class FwdTrans8x8TestBase {
 | 
					 | 
				
			||||||
 public:
 | 
					 | 
				
			||||||
  virtual ~FwdTrans8x8TestBase() {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  virtual void RunFwdTxfm(int16_t *in, int16_t *out, int stride) = 0;
 | 
					 | 
				
			||||||
  virtual void RunInvTxfm(int16_t *out, uint8_t *dst, int stride) = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  void RunSignBiasCheck() {
 | 
					 | 
				
			||||||
    ACMRandom rnd(ACMRandom::DeterministicSeed());
 | 
					 | 
				
			||||||
    DECLARE_ALIGNED_ARRAY(16, int16_t, test_input_block, 64);
 | 
					 | 
				
			||||||
    DECLARE_ALIGNED_ARRAY(16, int16_t, test_output_block, 64);
 | 
					 | 
				
			||||||
    int count_sign_block[64][2];
 | 
					 | 
				
			||||||
    const int count_test_block = 100000;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    memset(count_sign_block, 0, sizeof(count_sign_block));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (int i = 0; i < count_test_block; ++i) {
 | 
					 | 
				
			||||||
      // Initialize a test block with input range [-255, 255].
 | 
					 | 
				
			||||||
      for (int j = 0; j < 64; ++j)
 | 
					 | 
				
			||||||
        test_input_block[j] = rnd.Rand8() - rnd.Rand8();
 | 
					 | 
				
			||||||
      REGISTER_STATE_CHECK(
 | 
					 | 
				
			||||||
          RunFwdTxfm(test_input_block, test_output_block, pitch_));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      for (int j = 0; j < 64; ++j) {
 | 
					 | 
				
			||||||
        if (test_output_block[j] < 0)
 | 
					 | 
				
			||||||
          ++count_sign_block[j][0];
 | 
					 | 
				
			||||||
        else if (test_output_block[j] > 0)
 | 
					 | 
				
			||||||
          ++count_sign_block[j][1];
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (int j = 0; j < 64; ++j) {
 | 
					 | 
				
			||||||
      const int diff = abs(count_sign_block[j][0] - count_sign_block[j][1]);
 | 
					 | 
				
			||||||
      const int max_diff = 1125;
 | 
					 | 
				
			||||||
      EXPECT_LT(diff, max_diff)
 | 
					 | 
				
			||||||
          << "Error: 8x8 FDCT/FHT has a sign bias > "
 | 
					 | 
				
			||||||
          << 1. * max_diff / count_test_block * 100 << "%"
 | 
					 | 
				
			||||||
          << " for input range [-255, 255] at index " << j
 | 
					 | 
				
			||||||
          << " count0: " << count_sign_block[j][0]
 | 
					 | 
				
			||||||
          << " count1: " << count_sign_block[j][1]
 | 
					 | 
				
			||||||
          << " diff: " << diff;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    memset(count_sign_block, 0, sizeof(count_sign_block));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (int i = 0; i < count_test_block; ++i) {
 | 
					 | 
				
			||||||
      // Initialize a test block with input range [-15, 15].
 | 
					 | 
				
			||||||
      for (int j = 0; j < 64; ++j)
 | 
					 | 
				
			||||||
        test_input_block[j] = (rnd.Rand8() >> 4) - (rnd.Rand8() >> 4);
 | 
					 | 
				
			||||||
      REGISTER_STATE_CHECK(
 | 
					 | 
				
			||||||
          RunFwdTxfm(test_input_block, test_output_block, pitch_));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      for (int j = 0; j < 64; ++j) {
 | 
					 | 
				
			||||||
        if (test_output_block[j] < 0)
 | 
					 | 
				
			||||||
          ++count_sign_block[j][0];
 | 
					 | 
				
			||||||
        else if (test_output_block[j] > 0)
 | 
					 | 
				
			||||||
          ++count_sign_block[j][1];
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (int j = 0; j < 64; ++j) {
 | 
					 | 
				
			||||||
      const int diff = abs(count_sign_block[j][0] - count_sign_block[j][1]);
 | 
					 | 
				
			||||||
      const int max_diff = 10000;
 | 
					 | 
				
			||||||
      EXPECT_LT(diff, max_diff)
 | 
					 | 
				
			||||||
          << "Error: 4x4 FDCT/FHT has a sign bias > "
 | 
					 | 
				
			||||||
          << 1. * max_diff / count_test_block * 100 << "%"
 | 
					 | 
				
			||||||
          << " for input range [-15, 15] at index " << j
 | 
					 | 
				
			||||||
          << " count0: " << count_sign_block[j][0]
 | 
					 | 
				
			||||||
          << " count1: " << count_sign_block[j][1]
 | 
					 | 
				
			||||||
          << " diff: " << diff;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  void RunRoundTripErrorCheck() {
 | 
					 | 
				
			||||||
    ACMRandom rnd(ACMRandom::DeterministicSeed());
 | 
					 | 
				
			||||||
    int max_error = 0;
 | 
					 | 
				
			||||||
    int total_error = 0;
 | 
					 | 
				
			||||||
    const int count_test_block = 100000;
 | 
					 | 
				
			||||||
    DECLARE_ALIGNED_ARRAY(16, int16_t, test_input_block, 64);
 | 
					 | 
				
			||||||
    DECLARE_ALIGNED_ARRAY(16, int16_t, test_temp_block, 64);
 | 
					 | 
				
			||||||
    DECLARE_ALIGNED_ARRAY(16, uint8_t, dst, 64);
 | 
					 | 
				
			||||||
    DECLARE_ALIGNED_ARRAY(16, uint8_t, src, 64);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (int i = 0; i < count_test_block; ++i) {
 | 
					 | 
				
			||||||
      // Initialize a test block with input range [-255, 255].
 | 
					 | 
				
			||||||
      for (int j = 0; j < 64; ++j) {
 | 
					 | 
				
			||||||
        src[j] = rnd.Rand8();
 | 
					 | 
				
			||||||
        dst[j] = rnd.Rand8();
 | 
					 | 
				
			||||||
        test_input_block[j] = src[j] - dst[j];
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      REGISTER_STATE_CHECK(
 | 
					 | 
				
			||||||
          RunFwdTxfm(test_input_block, test_temp_block, pitch_));
 | 
					 | 
				
			||||||
      for (int j = 0; j < 64; ++j) {
 | 
					 | 
				
			||||||
          if (test_temp_block[j] > 0) {
 | 
					 | 
				
			||||||
            test_temp_block[j] += 2;
 | 
					 | 
				
			||||||
            test_temp_block[j] /= 4;
 | 
					 | 
				
			||||||
            test_temp_block[j] *= 4;
 | 
					 | 
				
			||||||
          } else {
 | 
					 | 
				
			||||||
            test_temp_block[j] -= 2;
 | 
					 | 
				
			||||||
            test_temp_block[j] /= 4;
 | 
					 | 
				
			||||||
            test_temp_block[j] *= 4;
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      REGISTER_STATE_CHECK(
 | 
					 | 
				
			||||||
          RunInvTxfm(test_temp_block, dst, pitch_));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      for (int j = 0; j < 64; ++j) {
 | 
					 | 
				
			||||||
        const int diff = dst[j] - src[j];
 | 
					 | 
				
			||||||
        const int error = diff * diff;
 | 
					 | 
				
			||||||
        if (max_error < error)
 | 
					 | 
				
			||||||
          max_error = error;
 | 
					 | 
				
			||||||
        total_error += error;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    EXPECT_GE(1, max_error)
 | 
					 | 
				
			||||||
      << "Error: 8x8 FDCT/IDCT or FHT/IHT has an individual"
 | 
					 | 
				
			||||||
      << " roundtrip error > 1";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    EXPECT_GE(count_test_block/5, total_error)
 | 
					 | 
				
			||||||
      << "Error: 8x8 FDCT/IDCT or FHT/IHT has average roundtrip "
 | 
					 | 
				
			||||||
      << "error > 1/5 per block";
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  void RunExtremalCheck() {
 | 
					 | 
				
			||||||
    ACMRandom rnd(ACMRandom::DeterministicSeed());
 | 
					 | 
				
			||||||
    int max_error = 0;
 | 
					 | 
				
			||||||
    int total_error = 0;
 | 
					 | 
				
			||||||
    const int count_test_block = 100000;
 | 
					 | 
				
			||||||
    DECLARE_ALIGNED_ARRAY(16, int16_t, test_input_block, 64);
 | 
					 | 
				
			||||||
    DECLARE_ALIGNED_ARRAY(16, int16_t, test_temp_block, 64);
 | 
					 | 
				
			||||||
    DECLARE_ALIGNED_ARRAY(16, uint8_t, dst, 64);
 | 
					 | 
				
			||||||
    DECLARE_ALIGNED_ARRAY(16, uint8_t, src, 64);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (int i = 0; i < count_test_block; ++i) {
 | 
					 | 
				
			||||||
      // Initialize a test block with input range [-255, 255].
 | 
					 | 
				
			||||||
      for (int j = 0; j < 64; ++j) {
 | 
					 | 
				
			||||||
        src[j] = rnd.Rand8() % 2 ? 255 : 0;
 | 
					 | 
				
			||||||
        dst[j] = src[j] > 0 ? 0 : 255;
 | 
					 | 
				
			||||||
        test_input_block[j] = src[j] - dst[j];
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      REGISTER_STATE_CHECK(
 | 
					 | 
				
			||||||
          RunFwdTxfm(test_input_block, test_temp_block, pitch_));
 | 
					 | 
				
			||||||
      REGISTER_STATE_CHECK(
 | 
					 | 
				
			||||||
          RunInvTxfm(test_temp_block, dst, pitch_));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      for (int j = 0; j < 64; ++j) {
 | 
					 | 
				
			||||||
        const int diff = dst[j] - src[j];
 | 
					 | 
				
			||||||
        const int error = diff * diff;
 | 
					 | 
				
			||||||
        if (max_error < error)
 | 
					 | 
				
			||||||
          max_error = error;
 | 
					 | 
				
			||||||
        total_error += error;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      EXPECT_GE(1, max_error)
 | 
					 | 
				
			||||||
          << "Error: Extremal 8x8 FDCT/IDCT or FHT/IHT has"
 | 
					 | 
				
			||||||
          << "an individual roundtrip error > 1";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      EXPECT_GE(count_test_block/5, total_error)
 | 
					 | 
				
			||||||
          << "Error: Extremal 8x8 FDCT/IDCT or FHT/IHT has average"
 | 
					 | 
				
			||||||
          << " roundtrip error > 1/5 per block";
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  int pitch_;
 | 
					 | 
				
			||||||
  int tx_type_;
 | 
					 | 
				
			||||||
  fht_t fwd_txfm_ref;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class FwdTrans8x8DCT : public FwdTrans8x8TestBase,
 | 
					 | 
				
			||||||
                       public PARAMS(fdct_t, idct_t, int) {
 | 
					 | 
				
			||||||
 public:
 | 
					 | 
				
			||||||
  virtual ~FwdTrans8x8DCT() {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void SetUp() {
 | 
					 | 
				
			||||||
    fwd_txfm_ = GET_PARAM(0);
 | 
					 | 
				
			||||||
    inv_txfm_ = GET_PARAM(1);
 | 
					 | 
				
			||||||
    tx_type_  = GET_PARAM(2);
 | 
					 | 
				
			||||||
    pitch_    = 8;
 | 
					 | 
				
			||||||
    fwd_txfm_ref = fdct8x8_ref;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void TearDown() { libvpx_test::ClearSystemState(); }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  void RunFwdTxfm(int16_t *in, int16_t *out, int stride) {
 | 
					 | 
				
			||||||
    fwd_txfm_(in, out, stride);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  void RunInvTxfm(int16_t *out, uint8_t *dst, int stride) {
 | 
					 | 
				
			||||||
    inv_txfm_(out, dst, stride);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  fdct_t fwd_txfm_;
 | 
					 | 
				
			||||||
  idct_t inv_txfm_;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(FwdTrans8x8DCT, SignBiasCheck) {
 | 
					 | 
				
			||||||
  RunSignBiasCheck();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(FwdTrans8x8DCT, RoundTripErrorCheck) {
 | 
					 | 
				
			||||||
  RunRoundTripErrorCheck();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(FwdTrans8x8DCT, ExtremalCheck) {
 | 
					 | 
				
			||||||
  RunExtremalCheck();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class FwdTrans8x8HT : public FwdTrans8x8TestBase,
 | 
					 | 
				
			||||||
                      public PARAMS(fht_t, iht_t, int) {
 | 
					 | 
				
			||||||
 public:
 | 
					 | 
				
			||||||
  virtual ~FwdTrans8x8HT() {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void SetUp() {
 | 
					 | 
				
			||||||
    fwd_txfm_ = GET_PARAM(0);
 | 
					 | 
				
			||||||
    inv_txfm_ = GET_PARAM(1);
 | 
					 | 
				
			||||||
    tx_type_  = GET_PARAM(2);
 | 
					 | 
				
			||||||
    pitch_    = 8;
 | 
					 | 
				
			||||||
    fwd_txfm_ref = fht8x8_ref;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void TearDown() { libvpx_test::ClearSystemState(); }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  void RunFwdTxfm(int16_t *in, int16_t *out, int stride) {
 | 
					 | 
				
			||||||
    fwd_txfm_(in, out, stride, tx_type_);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  void RunInvTxfm(int16_t *out, uint8_t *dst, int stride) {
 | 
					 | 
				
			||||||
    inv_txfm_(out, dst, stride, tx_type_);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  fht_t fwd_txfm_;
 | 
					 | 
				
			||||||
  iht_t inv_txfm_;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(FwdTrans8x8HT, SignBiasCheck) {
 | 
					 | 
				
			||||||
  RunSignBiasCheck();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(FwdTrans8x8HT, RoundTripErrorCheck) {
 | 
					 | 
				
			||||||
  RunRoundTripErrorCheck();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(FwdTrans8x8HT, ExtremalCheck) {
 | 
					 | 
				
			||||||
  RunExtremalCheck();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
using std::tr1::make_tuple;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(
 | 
					 | 
				
			||||||
    C, FwdTrans8x8DCT,
 | 
					 | 
				
			||||||
    ::testing::Values(
 | 
					 | 
				
			||||||
        make_tuple(&vp9_fdct8x8_c, &vp9_idct8x8_64_add_c, 0)));
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(
 | 
					 | 
				
			||||||
    C, FwdTrans8x8HT,
 | 
					 | 
				
			||||||
    ::testing::Values(
 | 
					 | 
				
			||||||
        make_tuple(&vp9_short_fht8x8_c, &vp9_iht8x8_64_add_c, 0),
 | 
					 | 
				
			||||||
        make_tuple(&vp9_short_fht8x8_c, &vp9_iht8x8_64_add_c, 1),
 | 
					 | 
				
			||||||
        make_tuple(&vp9_short_fht8x8_c, &vp9_iht8x8_64_add_c, 2),
 | 
					 | 
				
			||||||
        make_tuple(&vp9_short_fht8x8_c, &vp9_iht8x8_64_add_c, 3)));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if HAVE_SSE2
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(
 | 
					 | 
				
			||||||
    SSE2, FwdTrans8x8DCT,
 | 
					 | 
				
			||||||
    ::testing::Values(
 | 
					 | 
				
			||||||
        make_tuple(&vp9_fdct8x8_sse2, &vp9_idct8x8_64_add_sse2, 0)));
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(
 | 
					 | 
				
			||||||
    SSE2, FwdTrans8x8HT,
 | 
					 | 
				
			||||||
    ::testing::Values(
 | 
					 | 
				
			||||||
        make_tuple(&vp9_short_fht8x8_sse2, &vp9_iht8x8_64_add_sse2, 0),
 | 
					 | 
				
			||||||
        make_tuple(&vp9_short_fht8x8_sse2, &vp9_iht8x8_64_add_sse2, 1),
 | 
					 | 
				
			||||||
        make_tuple(&vp9_short_fht8x8_sse2, &vp9_iht8x8_64_add_sse2, 2),
 | 
					 | 
				
			||||||
        make_tuple(&vp9_short_fht8x8_sse2, &vp9_iht8x8_64_add_sse2, 3)));
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}  // namespace
 | 
					 | 
				
			||||||
@@ -1,118 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *  Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
 *  that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
 *  tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
 *  in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
 *  be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
#ifndef TEST_I420_VIDEO_SOURCE_H_
 | 
					 | 
				
			||||||
#define TEST_I420_VIDEO_SOURCE_H_
 | 
					 | 
				
			||||||
#include <cstdio>
 | 
					 | 
				
			||||||
#include <cstdlib>
 | 
					 | 
				
			||||||
#include <string>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "test/video_source.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace libvpx_test {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// This class extends VideoSource to allow parsing of raw yv12
 | 
					 | 
				
			||||||
// so that we can do actual file encodes.
 | 
					 | 
				
			||||||
class I420VideoSource : public VideoSource {
 | 
					 | 
				
			||||||
 public:
 | 
					 | 
				
			||||||
  I420VideoSource(const std::string &file_name,
 | 
					 | 
				
			||||||
                  unsigned int width, unsigned int height,
 | 
					 | 
				
			||||||
                  int rate_numerator, int rate_denominator,
 | 
					 | 
				
			||||||
                  unsigned int start, int limit)
 | 
					 | 
				
			||||||
      : file_name_(file_name),
 | 
					 | 
				
			||||||
        input_file_(NULL),
 | 
					 | 
				
			||||||
        img_(NULL),
 | 
					 | 
				
			||||||
        start_(start),
 | 
					 | 
				
			||||||
        limit_(limit),
 | 
					 | 
				
			||||||
        frame_(0),
 | 
					 | 
				
			||||||
        width_(0),
 | 
					 | 
				
			||||||
        height_(0),
 | 
					 | 
				
			||||||
        framerate_numerator_(rate_numerator),
 | 
					 | 
				
			||||||
        framerate_denominator_(rate_denominator) {
 | 
					 | 
				
			||||||
    // This initializes raw_sz_, width_, height_ and allocates an img.
 | 
					 | 
				
			||||||
    SetSize(width, height);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual ~I420VideoSource() {
 | 
					 | 
				
			||||||
    vpx_img_free(img_);
 | 
					 | 
				
			||||||
    if (input_file_)
 | 
					 | 
				
			||||||
      fclose(input_file_);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void Begin() {
 | 
					 | 
				
			||||||
    if (input_file_)
 | 
					 | 
				
			||||||
      fclose(input_file_);
 | 
					 | 
				
			||||||
    input_file_ = OpenTestDataFile(file_name_);
 | 
					 | 
				
			||||||
    ASSERT_TRUE(input_file_ != NULL) << "Input file open failed. Filename: "
 | 
					 | 
				
			||||||
        << file_name_;
 | 
					 | 
				
			||||||
    if (start_) {
 | 
					 | 
				
			||||||
      fseek(input_file_, raw_sz_ * start_, SEEK_SET);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    frame_ = start_;
 | 
					 | 
				
			||||||
    FillFrame();
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void Next() {
 | 
					 | 
				
			||||||
    ++frame_;
 | 
					 | 
				
			||||||
    FillFrame();
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual vpx_image_t *img() const { return (frame_ < limit_) ? img_ : NULL;  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Models a stream where Timebase = 1/FPS, so pts == frame.
 | 
					 | 
				
			||||||
  virtual vpx_codec_pts_t pts() const { return frame_; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual unsigned long duration() const { return 1; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual vpx_rational_t timebase() const {
 | 
					 | 
				
			||||||
    const vpx_rational_t t = { framerate_denominator_, framerate_numerator_ };
 | 
					 | 
				
			||||||
    return t;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual unsigned int frame() const { return frame_; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual unsigned int limit() const { return limit_; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  void SetSize(unsigned int width, unsigned int height) {
 | 
					 | 
				
			||||||
    if (width != width_ || height != height_) {
 | 
					 | 
				
			||||||
      vpx_img_free(img_);
 | 
					 | 
				
			||||||
      img_ = vpx_img_alloc(NULL, VPX_IMG_FMT_I420, width, height, 1);
 | 
					 | 
				
			||||||
      ASSERT_TRUE(img_ != NULL);
 | 
					 | 
				
			||||||
      width_ = width;
 | 
					 | 
				
			||||||
      height_ = height;
 | 
					 | 
				
			||||||
      raw_sz_ = width * height * 3 / 2;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void FillFrame() {
 | 
					 | 
				
			||||||
    ASSERT_TRUE(input_file_ != NULL);
 | 
					 | 
				
			||||||
    // Read a frame from input_file.
 | 
					 | 
				
			||||||
    if (fread(img_->img_data, raw_sz_, 1, input_file_) == 0) {
 | 
					 | 
				
			||||||
      limit_ = frame_;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  std::string file_name_;
 | 
					 | 
				
			||||||
  FILE *input_file_;
 | 
					 | 
				
			||||||
  vpx_image_t *img_;
 | 
					 | 
				
			||||||
  size_t raw_sz_;
 | 
					 | 
				
			||||||
  unsigned int start_;
 | 
					 | 
				
			||||||
  unsigned int limit_;
 | 
					 | 
				
			||||||
  unsigned int frame_;
 | 
					 | 
				
			||||||
  unsigned int width_;
 | 
					 | 
				
			||||||
  unsigned int height_;
 | 
					 | 
				
			||||||
  int framerate_numerator_;
 | 
					 | 
				
			||||||
  int framerate_denominator_;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}  // namespace libvpx_test
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif  // TEST_I420_VIDEO_SOURCE_H_
 | 
					 | 
				
			||||||
@@ -1,140 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *  Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
 *  that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
 *  tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
 *  in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
 *  be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <math.h>
 | 
					 | 
				
			||||||
#include <stdlib.h>
 | 
					 | 
				
			||||||
#include <string.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "third_party/googletest/src/include/gtest/gtest.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern "C" {
 | 
					 | 
				
			||||||
#include "./vp9_rtcd.h"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "test/acm_random.h"
 | 
					 | 
				
			||||||
#include "vpx/vpx_integer.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
using libvpx_test::ACMRandom;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef _MSC_VER
 | 
					 | 
				
			||||||
static int round(double x) {
 | 
					 | 
				
			||||||
  if (x < 0)
 | 
					 | 
				
			||||||
    return static_cast<int>(ceil(x - 0.5));
 | 
					 | 
				
			||||||
  else
 | 
					 | 
				
			||||||
    return static_cast<int>(floor(x + 0.5));
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void reference_dct_1d(double input[8], double output[8]) {
 | 
					 | 
				
			||||||
  const double kPi = 3.141592653589793238462643383279502884;
 | 
					 | 
				
			||||||
  const double kInvSqrt2 = 0.707106781186547524400844362104;
 | 
					 | 
				
			||||||
  for (int k = 0; k < 8; k++) {
 | 
					 | 
				
			||||||
    output[k] = 0.0;
 | 
					 | 
				
			||||||
    for (int n = 0; n < 8; n++)
 | 
					 | 
				
			||||||
      output[k] += input[n]*cos(kPi*(2*n+1)*k/16.0);
 | 
					 | 
				
			||||||
    if (k == 0)
 | 
					 | 
				
			||||||
      output[k] = output[k]*kInvSqrt2;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void reference_dct_2d(int16_t input[64], double output[64]) {
 | 
					 | 
				
			||||||
  // First transform columns
 | 
					 | 
				
			||||||
  for (int i = 0; i < 8; ++i) {
 | 
					 | 
				
			||||||
    double temp_in[8], temp_out[8];
 | 
					 | 
				
			||||||
    for (int j = 0; j < 8; ++j)
 | 
					 | 
				
			||||||
      temp_in[j] = input[j*8 + i];
 | 
					 | 
				
			||||||
    reference_dct_1d(temp_in, temp_out);
 | 
					 | 
				
			||||||
    for (int j = 0; j < 8; ++j)
 | 
					 | 
				
			||||||
      output[j*8 + i] = temp_out[j];
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  // Then transform rows
 | 
					 | 
				
			||||||
  for (int i = 0; i < 8; ++i) {
 | 
					 | 
				
			||||||
    double temp_in[8], temp_out[8];
 | 
					 | 
				
			||||||
    for (int j = 0; j < 8; ++j)
 | 
					 | 
				
			||||||
      temp_in[j] = output[j + i*8];
 | 
					 | 
				
			||||||
    reference_dct_1d(temp_in, temp_out);
 | 
					 | 
				
			||||||
    for (int j = 0; j < 8; ++j)
 | 
					 | 
				
			||||||
      output[j + i*8] = temp_out[j];
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  // Scale by some magic number
 | 
					 | 
				
			||||||
  for (int i = 0; i < 64; ++i)
 | 
					 | 
				
			||||||
    output[i] *= 2;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void reference_idct_1d(double input[8], double output[8]) {
 | 
					 | 
				
			||||||
  const double kPi = 3.141592653589793238462643383279502884;
 | 
					 | 
				
			||||||
  const double kSqrt2 = 1.414213562373095048801688724209698;
 | 
					 | 
				
			||||||
  for (int k = 0; k < 8; k++) {
 | 
					 | 
				
			||||||
    output[k] = 0.0;
 | 
					 | 
				
			||||||
    for (int n = 0; n < 8; n++) {
 | 
					 | 
				
			||||||
      output[k] += input[n]*cos(kPi*(2*k+1)*n/16.0);
 | 
					 | 
				
			||||||
      if (n == 0)
 | 
					 | 
				
			||||||
        output[k] = output[k]/kSqrt2;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void reference_idct_2d(double input[64], int16_t output[64]) {
 | 
					 | 
				
			||||||
  double out[64], out2[64];
 | 
					 | 
				
			||||||
  // First transform rows
 | 
					 | 
				
			||||||
  for (int i = 0; i < 8; ++i) {
 | 
					 | 
				
			||||||
    double temp_in[8], temp_out[8];
 | 
					 | 
				
			||||||
    for (int j = 0; j < 8; ++j)
 | 
					 | 
				
			||||||
      temp_in[j] = input[j + i*8];
 | 
					 | 
				
			||||||
    reference_idct_1d(temp_in, temp_out);
 | 
					 | 
				
			||||||
    for (int j = 0; j < 8; ++j)
 | 
					 | 
				
			||||||
      out[j + i*8] = temp_out[j];
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  // Then transform columns
 | 
					 | 
				
			||||||
  for (int i = 0; i < 8; ++i) {
 | 
					 | 
				
			||||||
    double temp_in[8], temp_out[8];
 | 
					 | 
				
			||||||
    for (int j = 0; j < 8; ++j)
 | 
					 | 
				
			||||||
      temp_in[j] = out[j*8 + i];
 | 
					 | 
				
			||||||
    reference_idct_1d(temp_in, temp_out);
 | 
					 | 
				
			||||||
    for (int j = 0; j < 8; ++j)
 | 
					 | 
				
			||||||
      out2[j*8 + i] = temp_out[j];
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  for (int i = 0; i < 64; ++i)
 | 
					 | 
				
			||||||
    output[i] = round(out2[i]/32);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST(VP9Idct8x8Test, AccuracyCheck) {
 | 
					 | 
				
			||||||
  ACMRandom rnd(ACMRandom::DeterministicSeed());
 | 
					 | 
				
			||||||
  const int count_test_block = 10000;
 | 
					 | 
				
			||||||
  for (int i = 0; i < count_test_block; ++i) {
 | 
					 | 
				
			||||||
    int16_t input[64], coeff[64];
 | 
					 | 
				
			||||||
    double output_r[64];
 | 
					 | 
				
			||||||
    uint8_t dst[64], src[64];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (int j = 0; j < 64; ++j) {
 | 
					 | 
				
			||||||
      src[j] = rnd.Rand8();
 | 
					 | 
				
			||||||
      dst[j] = rnd.Rand8();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    // Initialize a test block with input range [-255, 255].
 | 
					 | 
				
			||||||
    for (int j = 0; j < 64; ++j)
 | 
					 | 
				
			||||||
      input[j] = src[j] - dst[j];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    reference_dct_2d(input, output_r);
 | 
					 | 
				
			||||||
    for (int j = 0; j < 64; ++j)
 | 
					 | 
				
			||||||
      coeff[j] = round(output_r[j]);
 | 
					 | 
				
			||||||
    vp9_idct8x8_64_add_c(coeff, dst, 8);
 | 
					 | 
				
			||||||
    for (int j = 0; j < 64; ++j) {
 | 
					 | 
				
			||||||
      const int diff = dst[j] - src[j];
 | 
					 | 
				
			||||||
      const int error = diff * diff;
 | 
					 | 
				
			||||||
      EXPECT_GE(1, error)
 | 
					 | 
				
			||||||
          << "Error: 8x8 FDCT/IDCT has error " << error
 | 
					 | 
				
			||||||
          << " at index " << j;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}  // namespace
 | 
					 | 
				
			||||||
@@ -1,118 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *  Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
 *  that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
 *  tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
 *  in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
 *  be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern "C" {
 | 
					 | 
				
			||||||
#include "./vpx_config.h"
 | 
					 | 
				
			||||||
#include "./vp8_rtcd.h"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#include "test/clear_system_state.h"
 | 
					 | 
				
			||||||
#include "test/register_state_check.h"
 | 
					 | 
				
			||||||
#include "third_party/googletest/src/include/gtest/gtest.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "vpx/vpx_integer.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef void (*idct_fn_t)(int16_t *input, unsigned char *pred_ptr,
 | 
					 | 
				
			||||||
                          int pred_stride, unsigned char *dst_ptr,
 | 
					 | 
				
			||||||
                          int dst_stride);
 | 
					 | 
				
			||||||
namespace {
 | 
					 | 
				
			||||||
class IDCTTest : public ::testing::TestWithParam<idct_fn_t> {
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  virtual void SetUp() {
 | 
					 | 
				
			||||||
    int i;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    UUT = GetParam();
 | 
					 | 
				
			||||||
    memset(input, 0, sizeof(input));
 | 
					 | 
				
			||||||
    /* Set up guard blocks */
 | 
					 | 
				
			||||||
    for (i = 0; i < 256; i++) output[i] = ((i & 0xF) < 4 && (i < 64)) ? 0 : -1;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void TearDown() { libvpx_test::ClearSystemState(); }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  idct_fn_t UUT;
 | 
					 | 
				
			||||||
  int16_t input[16];
 | 
					 | 
				
			||||||
  unsigned char output[256];
 | 
					 | 
				
			||||||
  unsigned char predict[256];
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(IDCTTest, TestGuardBlocks) {
 | 
					 | 
				
			||||||
  int i;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  for (i = 0; i < 256; i++)
 | 
					 | 
				
			||||||
    if ((i & 0xF) < 4 && i < 64)
 | 
					 | 
				
			||||||
      EXPECT_EQ(0, output[i]) << i;
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
      EXPECT_EQ(255, output[i]);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(IDCTTest, TestAllZeros) {
 | 
					 | 
				
			||||||
  int i;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  REGISTER_STATE_CHECK(UUT(input, output, 16, output, 16));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  for (i = 0; i < 256; i++)
 | 
					 | 
				
			||||||
    if ((i & 0xF) < 4 && i < 64)
 | 
					 | 
				
			||||||
      EXPECT_EQ(0, output[i]) << "i==" << i;
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
      EXPECT_EQ(255, output[i]) << "i==" << i;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(IDCTTest, TestAllOnes) {
 | 
					 | 
				
			||||||
  int i;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  input[0] = 4;
 | 
					 | 
				
			||||||
  REGISTER_STATE_CHECK(UUT(input, output, 16, output, 16));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  for (i = 0; i < 256; i++)
 | 
					 | 
				
			||||||
    if ((i & 0xF) < 4 && i < 64)
 | 
					 | 
				
			||||||
      EXPECT_EQ(1, output[i]) << "i==" << i;
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
      EXPECT_EQ(255, output[i]) << "i==" << i;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(IDCTTest, TestAddOne) {
 | 
					 | 
				
			||||||
  int i;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  for (i = 0; i < 256; i++) predict[i] = i;
 | 
					 | 
				
			||||||
  input[0] = 4;
 | 
					 | 
				
			||||||
  REGISTER_STATE_CHECK(UUT(input, predict, 16, output, 16));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  for (i = 0; i < 256; i++)
 | 
					 | 
				
			||||||
    if ((i & 0xF) < 4 && i < 64)
 | 
					 | 
				
			||||||
      EXPECT_EQ(i + 1, output[i]) << "i==" << i;
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
      EXPECT_EQ(255, output[i]) << "i==" << i;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(IDCTTest, TestWithData) {
 | 
					 | 
				
			||||||
  int i;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  for (i = 0; i < 16; i++) input[i] = i;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  REGISTER_STATE_CHECK(UUT(input, output, 16, output, 16));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  for (i = 0; i < 256; i++)
 | 
					 | 
				
			||||||
    if ((i & 0xF) > 3 || i > 63)
 | 
					 | 
				
			||||||
      EXPECT_EQ(255, output[i]) << "i==" << i;
 | 
					 | 
				
			||||||
    else if (i == 0)
 | 
					 | 
				
			||||||
      EXPECT_EQ(11, output[i]) << "i==" << i;
 | 
					 | 
				
			||||||
    else if (i == 34)
 | 
					 | 
				
			||||||
      EXPECT_EQ(1, output[i]) << "i==" << i;
 | 
					 | 
				
			||||||
    else if (i == 2 || i == 17 || i == 32)
 | 
					 | 
				
			||||||
      EXPECT_EQ(3, output[i]) << "i==" << i;
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
      EXPECT_EQ(0, output[i]) << "i==" << i;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(C, IDCTTest, ::testing::Values(vp8_short_idct4x4llm_c));
 | 
					 | 
				
			||||||
#if HAVE_MMX
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(MMX, IDCTTest,
 | 
					 | 
				
			||||||
                        ::testing::Values(vp8_short_idct4x4llm_mmx));
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,389 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *  Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
 *  that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
 *  tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
 *  in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
 *  be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <string.h>
 | 
					 | 
				
			||||||
#include "test/acm_random.h"
 | 
					 | 
				
			||||||
#include "test/clear_system_state.h"
 | 
					 | 
				
			||||||
#include "test/register_state_check.h"
 | 
					 | 
				
			||||||
#include "third_party/googletest/src/include/gtest/gtest.h"
 | 
					 | 
				
			||||||
extern "C" {
 | 
					 | 
				
			||||||
#include "./vpx_config.h"
 | 
					 | 
				
			||||||
#include "./vp8_rtcd.h"
 | 
					 | 
				
			||||||
#include "vp8/common/blockd.h"
 | 
					 | 
				
			||||||
#include "vpx_mem/vpx_mem.h"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
using libvpx_test::ACMRandom;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class IntraPredBase {
 | 
					 | 
				
			||||||
 public:
 | 
					 | 
				
			||||||
  virtual ~IntraPredBase() {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void TearDown() {
 | 
					 | 
				
			||||||
    libvpx_test::ClearSystemState();
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  void SetupMacroblock(MACROBLOCKD *mbptr,
 | 
					 | 
				
			||||||
                       MODE_INFO *miptr,
 | 
					 | 
				
			||||||
                       uint8_t *data,
 | 
					 | 
				
			||||||
                       int block_size,
 | 
					 | 
				
			||||||
                       int stride,
 | 
					 | 
				
			||||||
                       int num_planes) {
 | 
					 | 
				
			||||||
    mbptr_ = mbptr;
 | 
					 | 
				
			||||||
    miptr_ = miptr;
 | 
					 | 
				
			||||||
    mbptr_->up_available = 1;
 | 
					 | 
				
			||||||
    mbptr_->left_available = 1;
 | 
					 | 
				
			||||||
    mbptr_->mode_info_context = miptr_;
 | 
					 | 
				
			||||||
    stride_ = stride;
 | 
					 | 
				
			||||||
    block_size_ = block_size;
 | 
					 | 
				
			||||||
    num_planes_ = num_planes;
 | 
					 | 
				
			||||||
    for (int p = 0; p < num_planes; p++)
 | 
					 | 
				
			||||||
      data_ptr_[p] = data + stride * (block_size + 1) * p +
 | 
					 | 
				
			||||||
                     stride + block_size;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  void FillRandom() {
 | 
					 | 
				
			||||||
    // Fill edges with random data
 | 
					 | 
				
			||||||
    ACMRandom rnd(ACMRandom::DeterministicSeed());
 | 
					 | 
				
			||||||
    for (int p = 0; p < num_planes_; p++) {
 | 
					 | 
				
			||||||
      for (int x = -1 ; x <= block_size_; x++)
 | 
					 | 
				
			||||||
        data_ptr_[p][x - stride_] = rnd.Rand8();
 | 
					 | 
				
			||||||
      for (int y = 0; y < block_size_; y++)
 | 
					 | 
				
			||||||
        data_ptr_[p][y * stride_ - 1] = rnd.Rand8();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void Predict(MB_PREDICTION_MODE mode) = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  void SetLeftUnavailable() {
 | 
					 | 
				
			||||||
    mbptr_->left_available = 0;
 | 
					 | 
				
			||||||
    for (int p = 0; p < num_planes_; p++)
 | 
					 | 
				
			||||||
      for (int i = -1; i < block_size_; ++i)
 | 
					 | 
				
			||||||
        data_ptr_[p][stride_ * i - 1] = 129;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  void SetTopUnavailable() {
 | 
					 | 
				
			||||||
    mbptr_->up_available = 0;
 | 
					 | 
				
			||||||
    for (int p = 0; p < num_planes_; p++)
 | 
					 | 
				
			||||||
      memset(&data_ptr_[p][-1 - stride_], 127, block_size_ + 2);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  void SetTopLeftUnavailable() {
 | 
					 | 
				
			||||||
    SetLeftUnavailable();
 | 
					 | 
				
			||||||
    SetTopUnavailable();
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  int BlockSizeLog2Min1() const {
 | 
					 | 
				
			||||||
    switch (block_size_) {
 | 
					 | 
				
			||||||
      case 16:
 | 
					 | 
				
			||||||
        return 3;
 | 
					 | 
				
			||||||
      case 8:
 | 
					 | 
				
			||||||
        return 2;
 | 
					 | 
				
			||||||
      default:
 | 
					 | 
				
			||||||
        return 0;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // check DC prediction output against a reference
 | 
					 | 
				
			||||||
  void CheckDCPrediction() const {
 | 
					 | 
				
			||||||
    for (int p = 0; p < num_planes_; p++) {
 | 
					 | 
				
			||||||
      // calculate expected DC
 | 
					 | 
				
			||||||
      int expected;
 | 
					 | 
				
			||||||
      if (mbptr_->up_available || mbptr_->left_available) {
 | 
					 | 
				
			||||||
        int sum = 0, shift = BlockSizeLog2Min1() + mbptr_->up_available +
 | 
					 | 
				
			||||||
                             mbptr_->left_available;
 | 
					 | 
				
			||||||
        if (mbptr_->up_available)
 | 
					 | 
				
			||||||
          for (int x = 0; x < block_size_; x++)
 | 
					 | 
				
			||||||
            sum += data_ptr_[p][x - stride_];
 | 
					 | 
				
			||||||
        if (mbptr_->left_available)
 | 
					 | 
				
			||||||
          for (int y = 0; y < block_size_; y++)
 | 
					 | 
				
			||||||
            sum += data_ptr_[p][y * stride_ - 1];
 | 
					 | 
				
			||||||
        expected = (sum + (1 << (shift - 1))) >> shift;
 | 
					 | 
				
			||||||
      } else {
 | 
					 | 
				
			||||||
        expected = 0x80;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      // check that all subsequent lines are equal to the first
 | 
					 | 
				
			||||||
      for (int y = 1; y < block_size_; ++y)
 | 
					 | 
				
			||||||
        ASSERT_EQ(0, memcmp(data_ptr_[p], &data_ptr_[p][y * stride_],
 | 
					 | 
				
			||||||
                            block_size_));
 | 
					 | 
				
			||||||
      // within the first line, ensure that each pixel has the same value
 | 
					 | 
				
			||||||
      for (int x = 1; x < block_size_; ++x)
 | 
					 | 
				
			||||||
        ASSERT_EQ(data_ptr_[p][0], data_ptr_[p][x]);
 | 
					 | 
				
			||||||
      // now ensure that that pixel has the expected (DC) value
 | 
					 | 
				
			||||||
      ASSERT_EQ(expected, data_ptr_[p][0]);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // check V prediction output against a reference
 | 
					 | 
				
			||||||
  void CheckVPrediction() const {
 | 
					 | 
				
			||||||
    // check that all lines equal the top border
 | 
					 | 
				
			||||||
    for (int p = 0; p < num_planes_; p++)
 | 
					 | 
				
			||||||
      for (int y = 0; y < block_size_; y++)
 | 
					 | 
				
			||||||
        ASSERT_EQ(0, memcmp(&data_ptr_[p][-stride_],
 | 
					 | 
				
			||||||
                            &data_ptr_[p][y * stride_], block_size_));
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // check H prediction output against a reference
 | 
					 | 
				
			||||||
  void CheckHPrediction() const {
 | 
					 | 
				
			||||||
    // for each line, ensure that each pixel is equal to the left border
 | 
					 | 
				
			||||||
    for (int p = 0; p < num_planes_; p++)
 | 
					 | 
				
			||||||
      for (int y = 0; y < block_size_; y++)
 | 
					 | 
				
			||||||
        for (int x = 0; x < block_size_; x++)
 | 
					 | 
				
			||||||
          ASSERT_EQ(data_ptr_[p][-1 + y * stride_],
 | 
					 | 
				
			||||||
                    data_ptr_[p][x + y * stride_]);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  static int ClipByte(int value) {
 | 
					 | 
				
			||||||
    if (value > 255)
 | 
					 | 
				
			||||||
      return 255;
 | 
					 | 
				
			||||||
    else if (value < 0)
 | 
					 | 
				
			||||||
      return 0;
 | 
					 | 
				
			||||||
    return value;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // check TM prediction output against a reference
 | 
					 | 
				
			||||||
  void CheckTMPrediction() const {
 | 
					 | 
				
			||||||
    for (int p = 0; p < num_planes_; p++)
 | 
					 | 
				
			||||||
      for (int y = 0; y < block_size_; y++)
 | 
					 | 
				
			||||||
        for (int x = 0; x < block_size_; x++) {
 | 
					 | 
				
			||||||
          const int expected = ClipByte(data_ptr_[p][x - stride_]
 | 
					 | 
				
			||||||
                                      + data_ptr_[p][stride_ * y - 1]
 | 
					 | 
				
			||||||
                                      - data_ptr_[p][-1 - stride_]);
 | 
					 | 
				
			||||||
          ASSERT_EQ(expected, data_ptr_[p][y * stride_ + x]);
 | 
					 | 
				
			||||||
       }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Actual test
 | 
					 | 
				
			||||||
  void RunTest() {
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      SCOPED_TRACE("DC_PRED");
 | 
					 | 
				
			||||||
      FillRandom();
 | 
					 | 
				
			||||||
      Predict(DC_PRED);
 | 
					 | 
				
			||||||
      CheckDCPrediction();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      SCOPED_TRACE("DC_PRED LEFT");
 | 
					 | 
				
			||||||
      FillRandom();
 | 
					 | 
				
			||||||
      SetLeftUnavailable();
 | 
					 | 
				
			||||||
      Predict(DC_PRED);
 | 
					 | 
				
			||||||
      CheckDCPrediction();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      SCOPED_TRACE("DC_PRED TOP");
 | 
					 | 
				
			||||||
      FillRandom();
 | 
					 | 
				
			||||||
      SetTopUnavailable();
 | 
					 | 
				
			||||||
      Predict(DC_PRED);
 | 
					 | 
				
			||||||
      CheckDCPrediction();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      SCOPED_TRACE("DC_PRED TOP_LEFT");
 | 
					 | 
				
			||||||
      FillRandom();
 | 
					 | 
				
			||||||
      SetTopLeftUnavailable();
 | 
					 | 
				
			||||||
      Predict(DC_PRED);
 | 
					 | 
				
			||||||
      CheckDCPrediction();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      SCOPED_TRACE("H_PRED");
 | 
					 | 
				
			||||||
      FillRandom();
 | 
					 | 
				
			||||||
      Predict(H_PRED);
 | 
					 | 
				
			||||||
      CheckHPrediction();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      SCOPED_TRACE("V_PRED");
 | 
					 | 
				
			||||||
      FillRandom();
 | 
					 | 
				
			||||||
      Predict(V_PRED);
 | 
					 | 
				
			||||||
      CheckVPrediction();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      SCOPED_TRACE("TM_PRED");
 | 
					 | 
				
			||||||
      FillRandom();
 | 
					 | 
				
			||||||
      Predict(TM_PRED);
 | 
					 | 
				
			||||||
      CheckTMPrediction();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  MACROBLOCKD *mbptr_;
 | 
					 | 
				
			||||||
  MODE_INFO *miptr_;
 | 
					 | 
				
			||||||
  uint8_t *data_ptr_[2];  // in the case of Y, only [0] is used
 | 
					 | 
				
			||||||
  int stride_;
 | 
					 | 
				
			||||||
  int block_size_;
 | 
					 | 
				
			||||||
  int num_planes_;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef void (*intra_pred_y_fn_t)(MACROBLOCKD *x,
 | 
					 | 
				
			||||||
                                  uint8_t *yabove_row,
 | 
					 | 
				
			||||||
                                  uint8_t *yleft,
 | 
					 | 
				
			||||||
                                  int left_stride,
 | 
					 | 
				
			||||||
                                  uint8_t *ypred_ptr,
 | 
					 | 
				
			||||||
                                  int y_stride);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class IntraPredYTest : public ::testing::TestWithParam<intra_pred_y_fn_t>,
 | 
					 | 
				
			||||||
    protected IntraPredBase {
 | 
					 | 
				
			||||||
 public:
 | 
					 | 
				
			||||||
  static void SetUpTestCase() {
 | 
					 | 
				
			||||||
    mb_ = reinterpret_cast<MACROBLOCKD*>(
 | 
					 | 
				
			||||||
        vpx_memalign(32, sizeof(MACROBLOCKD)));
 | 
					 | 
				
			||||||
    mi_ = reinterpret_cast<MODE_INFO*>(
 | 
					 | 
				
			||||||
        vpx_memalign(32, sizeof(MODE_INFO)));
 | 
					 | 
				
			||||||
    data_array_ = reinterpret_cast<uint8_t*>(
 | 
					 | 
				
			||||||
        vpx_memalign(kDataAlignment, kDataBufferSize));
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  static void TearDownTestCase() {
 | 
					 | 
				
			||||||
    vpx_free(data_array_);
 | 
					 | 
				
			||||||
    vpx_free(mi_);
 | 
					 | 
				
			||||||
    vpx_free(mb_);
 | 
					 | 
				
			||||||
    data_array_ = NULL;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  static const int kBlockSize = 16;
 | 
					 | 
				
			||||||
  static const int kDataAlignment = 16;
 | 
					 | 
				
			||||||
  static const int kStride = kBlockSize * 3;
 | 
					 | 
				
			||||||
  // We use 48 so that the data pointer of the first pixel in each row of
 | 
					 | 
				
			||||||
  // each macroblock is 16-byte aligned, and this gives us access to the
 | 
					 | 
				
			||||||
  // top-left and top-right corner pixels belonging to the top-left/right
 | 
					 | 
				
			||||||
  // macroblocks.
 | 
					 | 
				
			||||||
  // We use 17 lines so we have one line above us for top-prediction.
 | 
					 | 
				
			||||||
  static const int kDataBufferSize = kStride * (kBlockSize + 1);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void SetUp() {
 | 
					 | 
				
			||||||
    pred_fn_ = GetParam();
 | 
					 | 
				
			||||||
    SetupMacroblock(mb_, mi_, data_array_, kBlockSize, kStride, 1);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void Predict(MB_PREDICTION_MODE mode) {
 | 
					 | 
				
			||||||
    mbptr_->mode_info_context->mbmi.mode = mode;
 | 
					 | 
				
			||||||
    REGISTER_STATE_CHECK(pred_fn_(mbptr_,
 | 
					 | 
				
			||||||
                                  data_ptr_[0] - kStride,
 | 
					 | 
				
			||||||
                                  data_ptr_[0] - 1, kStride,
 | 
					 | 
				
			||||||
                                  data_ptr_[0], kStride));
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  intra_pred_y_fn_t pred_fn_;
 | 
					 | 
				
			||||||
  static uint8_t* data_array_;
 | 
					 | 
				
			||||||
  static MACROBLOCKD * mb_;
 | 
					 | 
				
			||||||
  static MODE_INFO *mi_;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
MACROBLOCKD* IntraPredYTest::mb_ = NULL;
 | 
					 | 
				
			||||||
MODE_INFO* IntraPredYTest::mi_ = NULL;
 | 
					 | 
				
			||||||
uint8_t* IntraPredYTest::data_array_ = NULL;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(IntraPredYTest, IntraPredTests) {
 | 
					 | 
				
			||||||
  RunTest();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(C, IntraPredYTest,
 | 
					 | 
				
			||||||
                        ::testing::Values(
 | 
					 | 
				
			||||||
                            vp8_build_intra_predictors_mby_s_c));
 | 
					 | 
				
			||||||
#if HAVE_SSE2
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(SSE2, IntraPredYTest,
 | 
					 | 
				
			||||||
                        ::testing::Values(
 | 
					 | 
				
			||||||
                            vp8_build_intra_predictors_mby_s_sse2));
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#if HAVE_SSSE3
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(SSSE3, IntraPredYTest,
 | 
					 | 
				
			||||||
                        ::testing::Values(
 | 
					 | 
				
			||||||
                            vp8_build_intra_predictors_mby_s_ssse3));
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef void (*intra_pred_uv_fn_t)(MACROBLOCKD *x,
 | 
					 | 
				
			||||||
                                   uint8_t *uabove_row,
 | 
					 | 
				
			||||||
                                   uint8_t *vabove_row,
 | 
					 | 
				
			||||||
                                   uint8_t *uleft,
 | 
					 | 
				
			||||||
                                   uint8_t *vleft,
 | 
					 | 
				
			||||||
                                   int left_stride,
 | 
					 | 
				
			||||||
                                   uint8_t *upred_ptr,
 | 
					 | 
				
			||||||
                                   uint8_t *vpred_ptr,
 | 
					 | 
				
			||||||
                                   int pred_stride);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class IntraPredUVTest : public ::testing::TestWithParam<intra_pred_uv_fn_t>,
 | 
					 | 
				
			||||||
    protected IntraPredBase {
 | 
					 | 
				
			||||||
 public:
 | 
					 | 
				
			||||||
  static void SetUpTestCase() {
 | 
					 | 
				
			||||||
    mb_ = reinterpret_cast<MACROBLOCKD*>(
 | 
					 | 
				
			||||||
        vpx_memalign(32, sizeof(MACROBLOCKD)));
 | 
					 | 
				
			||||||
    mi_ = reinterpret_cast<MODE_INFO*>(
 | 
					 | 
				
			||||||
        vpx_memalign(32, sizeof(MODE_INFO)));
 | 
					 | 
				
			||||||
    data_array_ = reinterpret_cast<uint8_t*>(
 | 
					 | 
				
			||||||
        vpx_memalign(kDataAlignment, kDataBufferSize));
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  static void TearDownTestCase() {
 | 
					 | 
				
			||||||
    vpx_free(data_array_);
 | 
					 | 
				
			||||||
    vpx_free(mi_);
 | 
					 | 
				
			||||||
    vpx_free(mb_);
 | 
					 | 
				
			||||||
    data_array_ = NULL;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  static const int kBlockSize = 8;
 | 
					 | 
				
			||||||
  static const int kDataAlignment = 8;
 | 
					 | 
				
			||||||
  static const int kStride = kBlockSize * 3;
 | 
					 | 
				
			||||||
  // We use 24 so that the data pointer of the first pixel in each row of
 | 
					 | 
				
			||||||
  // each macroblock is 8-byte aligned, and this gives us access to the
 | 
					 | 
				
			||||||
  // top-left and top-right corner pixels belonging to the top-left/right
 | 
					 | 
				
			||||||
  // macroblocks.
 | 
					 | 
				
			||||||
  // We use 9 lines so we have one line above us for top-prediction.
 | 
					 | 
				
			||||||
  // [0] = U, [1] = V
 | 
					 | 
				
			||||||
  static const int kDataBufferSize = 2 * kStride * (kBlockSize + 1);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void SetUp() {
 | 
					 | 
				
			||||||
    pred_fn_ = GetParam();
 | 
					 | 
				
			||||||
    SetupMacroblock(mb_, mi_, data_array_, kBlockSize, kStride, 2);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void Predict(MB_PREDICTION_MODE mode) {
 | 
					 | 
				
			||||||
    mbptr_->mode_info_context->mbmi.uv_mode = mode;
 | 
					 | 
				
			||||||
    pred_fn_(mbptr_, data_ptr_[0] - kStride, data_ptr_[1] - kStride,
 | 
					 | 
				
			||||||
             data_ptr_[0] - 1, data_ptr_[1] - 1, kStride,
 | 
					 | 
				
			||||||
             data_ptr_[0], data_ptr_[1], kStride);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  intra_pred_uv_fn_t pred_fn_;
 | 
					 | 
				
			||||||
  // We use 24 so that the data pointer of the first pixel in each row of
 | 
					 | 
				
			||||||
  // each macroblock is 8-byte aligned, and this gives us access to the
 | 
					 | 
				
			||||||
  // top-left and top-right corner pixels belonging to the top-left/right
 | 
					 | 
				
			||||||
  // macroblocks.
 | 
					 | 
				
			||||||
  // We use 9 lines so we have one line above us for top-prediction.
 | 
					 | 
				
			||||||
  // [0] = U, [1] = V
 | 
					 | 
				
			||||||
  static uint8_t* data_array_;
 | 
					 | 
				
			||||||
  static MACROBLOCKD* mb_;
 | 
					 | 
				
			||||||
  static MODE_INFO* mi_;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
MACROBLOCKD* IntraPredUVTest::mb_ = NULL;
 | 
					 | 
				
			||||||
MODE_INFO* IntraPredUVTest::mi_ = NULL;
 | 
					 | 
				
			||||||
uint8_t* IntraPredUVTest::data_array_ = NULL;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(IntraPredUVTest, IntraPredTests) {
 | 
					 | 
				
			||||||
  RunTest();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(C, IntraPredUVTest,
 | 
					 | 
				
			||||||
                        ::testing::Values(
 | 
					 | 
				
			||||||
                            vp8_build_intra_predictors_mbuv_s_c));
 | 
					 | 
				
			||||||
#if HAVE_SSE2
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(SSE2, IntraPredUVTest,
 | 
					 | 
				
			||||||
                        ::testing::Values(
 | 
					 | 
				
			||||||
                            vp8_build_intra_predictors_mbuv_s_sse2));
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#if HAVE_SSSE3
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(SSSE3, IntraPredUVTest,
 | 
					 | 
				
			||||||
                        ::testing::Values(
 | 
					 | 
				
			||||||
                            vp8_build_intra_predictors_mbuv_s_ssse3));
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}  // namespace
 | 
					 | 
				
			||||||
@@ -1,111 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *  Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
 *  that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
 *  tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
 *  in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
 *  be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
#ifndef TEST_IVF_VIDEO_SOURCE_H_
 | 
					 | 
				
			||||||
#define TEST_IVF_VIDEO_SOURCE_H_
 | 
					 | 
				
			||||||
#include <cstdio>
 | 
					 | 
				
			||||||
#include <cstdlib>
 | 
					 | 
				
			||||||
#include <new>
 | 
					 | 
				
			||||||
#include <string>
 | 
					 | 
				
			||||||
#include "test/video_source.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace libvpx_test {
 | 
					 | 
				
			||||||
const unsigned int kCodeBufferSize = 256 * 1024;
 | 
					 | 
				
			||||||
const unsigned int kIvfFileHdrSize = 32;
 | 
					 | 
				
			||||||
const unsigned int kIvfFrameHdrSize = 12;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static unsigned int MemGetLe32(const uint8_t *mem) {
 | 
					 | 
				
			||||||
  return (mem[3] << 24) | (mem[2] << 16) | (mem[1] << 8) | (mem[0]);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// This class extends VideoSource to allow parsing of ivf files,
 | 
					 | 
				
			||||||
// so that we can do actual file decodes.
 | 
					 | 
				
			||||||
class IVFVideoSource : public CompressedVideoSource {
 | 
					 | 
				
			||||||
 public:
 | 
					 | 
				
			||||||
  explicit IVFVideoSource(const std::string &file_name)
 | 
					 | 
				
			||||||
      : file_name_(file_name),
 | 
					 | 
				
			||||||
        input_file_(NULL),
 | 
					 | 
				
			||||||
        compressed_frame_buf_(NULL),
 | 
					 | 
				
			||||||
        frame_sz_(0),
 | 
					 | 
				
			||||||
        frame_(0),
 | 
					 | 
				
			||||||
        end_of_file_(false) {
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual ~IVFVideoSource() {
 | 
					 | 
				
			||||||
    delete[] compressed_frame_buf_;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (input_file_)
 | 
					 | 
				
			||||||
      fclose(input_file_);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void Init() {
 | 
					 | 
				
			||||||
    // Allocate a buffer for read in the compressed video frame.
 | 
					 | 
				
			||||||
    compressed_frame_buf_ = new uint8_t[libvpx_test::kCodeBufferSize];
 | 
					 | 
				
			||||||
    ASSERT_TRUE(compressed_frame_buf_ != NULL)
 | 
					 | 
				
			||||||
        << "Allocate frame buffer failed";
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void Begin() {
 | 
					 | 
				
			||||||
    input_file_ = OpenTestDataFile(file_name_);
 | 
					 | 
				
			||||||
    ASSERT_TRUE(input_file_ != NULL) << "Input file open failed. Filename: "
 | 
					 | 
				
			||||||
        << file_name_;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Read file header
 | 
					 | 
				
			||||||
    uint8_t file_hdr[kIvfFileHdrSize];
 | 
					 | 
				
			||||||
    ASSERT_EQ(kIvfFileHdrSize, fread(file_hdr, 1, kIvfFileHdrSize, input_file_))
 | 
					 | 
				
			||||||
        << "File header read failed.";
 | 
					 | 
				
			||||||
    // Check file header
 | 
					 | 
				
			||||||
    ASSERT_TRUE(file_hdr[0] == 'D' && file_hdr[1] == 'K' && file_hdr[2] == 'I'
 | 
					 | 
				
			||||||
                && file_hdr[3] == 'F') << "Input is not an IVF file.";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    FillFrame();
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void Next() {
 | 
					 | 
				
			||||||
    ++frame_;
 | 
					 | 
				
			||||||
    FillFrame();
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  void FillFrame() {
 | 
					 | 
				
			||||||
    ASSERT_TRUE(input_file_ != NULL);
 | 
					 | 
				
			||||||
    uint8_t frame_hdr[kIvfFrameHdrSize];
 | 
					 | 
				
			||||||
    // Check frame header and read a frame from input_file.
 | 
					 | 
				
			||||||
    if (fread(frame_hdr, 1, kIvfFrameHdrSize, input_file_)
 | 
					 | 
				
			||||||
        != kIvfFrameHdrSize) {
 | 
					 | 
				
			||||||
      end_of_file_ = true;
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
      end_of_file_ = false;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      frame_sz_ = MemGetLe32(frame_hdr);
 | 
					 | 
				
			||||||
      ASSERT_LE(frame_sz_, kCodeBufferSize)
 | 
					 | 
				
			||||||
          << "Frame is too big for allocated code buffer";
 | 
					 | 
				
			||||||
      ASSERT_EQ(frame_sz_,
 | 
					 | 
				
			||||||
                fread(compressed_frame_buf_, 1, frame_sz_, input_file_))
 | 
					 | 
				
			||||||
          << "Failed to read complete frame";
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual const uint8_t *cxdata() const {
 | 
					 | 
				
			||||||
    return end_of_file_ ? NULL : compressed_frame_buf_;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  virtual const unsigned int frame_size() const { return frame_sz_; }
 | 
					 | 
				
			||||||
  virtual const unsigned int frame_number() const { return frame_; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  std::string file_name_;
 | 
					 | 
				
			||||||
  FILE *input_file_;
 | 
					 | 
				
			||||||
  uint8_t *compressed_frame_buf_;
 | 
					 | 
				
			||||||
  unsigned int frame_sz_;
 | 
					 | 
				
			||||||
  unsigned int frame_;
 | 
					 | 
				
			||||||
  bool end_of_file_;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}  // namespace libvpx_test
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif  // TEST_IVF_VIDEO_SOURCE_H_
 | 
					 | 
				
			||||||
@@ -1,144 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *  Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
 *  that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
 *  tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
 *  in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
 *  be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
#include <climits>
 | 
					 | 
				
			||||||
#include <vector>
 | 
					 | 
				
			||||||
#include "third_party/googletest/src/include/gtest/gtest.h"
 | 
					 | 
				
			||||||
#include "test/codec_factory.h"
 | 
					 | 
				
			||||||
#include "test/encode_test_driver.h"
 | 
					 | 
				
			||||||
#include "test/i420_video_source.h"
 | 
					 | 
				
			||||||
#include "test/util.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class KeyframeTest : public ::libvpx_test::EncoderTest,
 | 
					 | 
				
			||||||
    public ::libvpx_test::CodecTestWithParam<libvpx_test::TestMode> {
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  KeyframeTest() : EncoderTest(GET_PARAM(0)) {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void SetUp() {
 | 
					 | 
				
			||||||
    InitializeConfig();
 | 
					 | 
				
			||||||
    SetMode(GET_PARAM(1));
 | 
					 | 
				
			||||||
    kf_count_ = 0;
 | 
					 | 
				
			||||||
    kf_count_max_ = INT_MAX;
 | 
					 | 
				
			||||||
    kf_do_force_kf_ = false;
 | 
					 | 
				
			||||||
    set_cpu_used_ = 0;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void PreEncodeFrameHook(::libvpx_test::VideoSource *video,
 | 
					 | 
				
			||||||
                                  ::libvpx_test::Encoder *encoder) {
 | 
					 | 
				
			||||||
    if (kf_do_force_kf_)
 | 
					 | 
				
			||||||
      frame_flags_ = (video->frame() % 3) ? 0 : VPX_EFLAG_FORCE_KF;
 | 
					 | 
				
			||||||
    if (set_cpu_used_ && video->frame() == 1)
 | 
					 | 
				
			||||||
      encoder->Control(VP8E_SET_CPUUSED, set_cpu_used_);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void FramePktHook(const vpx_codec_cx_pkt_t *pkt) {
 | 
					 | 
				
			||||||
    if (pkt->data.frame.flags & VPX_FRAME_IS_KEY) {
 | 
					 | 
				
			||||||
      kf_pts_list_.push_back(pkt->data.frame.pts);
 | 
					 | 
				
			||||||
      kf_count_++;
 | 
					 | 
				
			||||||
      abort_ |= kf_count_ > kf_count_max_;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  bool kf_do_force_kf_;
 | 
					 | 
				
			||||||
  int kf_count_;
 | 
					 | 
				
			||||||
  int kf_count_max_;
 | 
					 | 
				
			||||||
  std::vector<vpx_codec_pts_t> kf_pts_list_;
 | 
					 | 
				
			||||||
  int set_cpu_used_;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(KeyframeTest, TestRandomVideoSource) {
 | 
					 | 
				
			||||||
  // Validate that encoding the RandomVideoSource produces multiple keyframes.
 | 
					 | 
				
			||||||
  // This validates the results of the TestDisableKeyframes test.
 | 
					 | 
				
			||||||
  kf_count_max_ = 2;  // early exit successful tests.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  ::libvpx_test::RandomVideoSource video;
 | 
					 | 
				
			||||||
  ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // In realtime mode - auto placed keyframes are exceedingly rare,  don't
 | 
					 | 
				
			||||||
  // bother with this check   if(GetParam() > 0)
 | 
					 | 
				
			||||||
  if (GET_PARAM(1) > 0)
 | 
					 | 
				
			||||||
    EXPECT_GT(kf_count_, 1);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(KeyframeTest, TestDisableKeyframes) {
 | 
					 | 
				
			||||||
  cfg_.kf_mode = VPX_KF_DISABLED;
 | 
					 | 
				
			||||||
  kf_count_max_ = 1;  // early exit failed tests.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  ::libvpx_test::RandomVideoSource video;
 | 
					 | 
				
			||||||
  ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  EXPECT_EQ(1, kf_count_);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(KeyframeTest, TestForceKeyframe) {
 | 
					 | 
				
			||||||
  cfg_.kf_mode = VPX_KF_DISABLED;
 | 
					 | 
				
			||||||
  kf_do_force_kf_ = true;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  ::libvpx_test::DummyVideoSource video;
 | 
					 | 
				
			||||||
  ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // verify that every third frame is a keyframe.
 | 
					 | 
				
			||||||
  for (std::vector<vpx_codec_pts_t>::const_iterator iter = kf_pts_list_.begin();
 | 
					 | 
				
			||||||
       iter != kf_pts_list_.end(); ++iter) {
 | 
					 | 
				
			||||||
    ASSERT_EQ(0, *iter % 3) << "Unexpected keyframe at frame " << *iter;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(KeyframeTest, TestKeyframeMaxDistance) {
 | 
					 | 
				
			||||||
  cfg_.kf_max_dist = 25;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  ::libvpx_test::DummyVideoSource video;
 | 
					 | 
				
			||||||
  ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // verify that keyframe interval matches kf_max_dist
 | 
					 | 
				
			||||||
  for (std::vector<vpx_codec_pts_t>::const_iterator iter = kf_pts_list_.begin();
 | 
					 | 
				
			||||||
       iter != kf_pts_list_.end(); ++iter) {
 | 
					 | 
				
			||||||
    ASSERT_EQ(0, *iter % 25) << "Unexpected keyframe at frame " << *iter;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(KeyframeTest, TestAutoKeyframe) {
 | 
					 | 
				
			||||||
  cfg_.kf_mode = VPX_KF_AUTO;
 | 
					 | 
				
			||||||
  kf_do_force_kf_ = false;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Force a deterministic speed step in Real Time mode, as the faster modes
 | 
					 | 
				
			||||||
  // may not produce a keyframe like we expect. This is necessary when running
 | 
					 | 
				
			||||||
  // on very slow environments (like Valgrind). The step -11 was determined
 | 
					 | 
				
			||||||
  // experimentally as the fastest mode that still throws the keyframe.
 | 
					 | 
				
			||||||
  if (deadline_ == VPX_DL_REALTIME)
 | 
					 | 
				
			||||||
    set_cpu_used_ = -11;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // This clip has a cut scene every 30 frames -> Frame 0, 30, 60, 90, 120.
 | 
					 | 
				
			||||||
  // I check only the first 40 frames to make sure there's a keyframe at frame
 | 
					 | 
				
			||||||
  // 0 and 30.
 | 
					 | 
				
			||||||
  ::libvpx_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288,
 | 
					 | 
				
			||||||
                                       30, 1, 0, 40);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // In realtime mode - auto placed keyframes are exceedingly rare,  don't
 | 
					 | 
				
			||||||
  // bother with this check
 | 
					 | 
				
			||||||
  if (GET_PARAM(1) > 0)
 | 
					 | 
				
			||||||
    EXPECT_EQ(2u, kf_pts_list_.size()) << " Not the right number of keyframes ";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Verify that keyframes match the file keyframes in the file.
 | 
					 | 
				
			||||||
  for (std::vector<vpx_codec_pts_t>::const_iterator iter = kf_pts_list_.begin();
 | 
					 | 
				
			||||||
       iter != kf_pts_list_.end(); ++iter) {
 | 
					 | 
				
			||||||
    if (deadline_ == VPX_DL_REALTIME && *iter > 0)
 | 
					 | 
				
			||||||
      EXPECT_EQ(0, (*iter - 1) % 30) << "Unexpected keyframe at frame "
 | 
					 | 
				
			||||||
        << *iter;
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
      EXPECT_EQ(0, *iter % 30) << "Unexpected keyframe at frame " << *iter;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
VP8_INSTANTIATE_TEST_CASE(KeyframeTest, ALL_TEST_MODES);
 | 
					 | 
				
			||||||
}  // namespace
 | 
					 | 
				
			||||||
@@ -1,70 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *  Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
 *  that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
 *  tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
 *  in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
 *  be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef TEST_MD5_HELPER_H_
 | 
					 | 
				
			||||||
#define TEST_MD5_HELPER_H_
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern "C" {
 | 
					 | 
				
			||||||
#include "./md5_utils.h"
 | 
					 | 
				
			||||||
#include "vpx/vpx_decoder.h"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace libvpx_test {
 | 
					 | 
				
			||||||
class MD5 {
 | 
					 | 
				
			||||||
 public:
 | 
					 | 
				
			||||||
  MD5() {
 | 
					 | 
				
			||||||
    MD5Init(&md5_);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  void Add(const vpx_image_t *img) {
 | 
					 | 
				
			||||||
    for (int plane = 0; plane < 3; ++plane) {
 | 
					 | 
				
			||||||
      const uint8_t *buf = img->planes[plane];
 | 
					 | 
				
			||||||
      // Calculate the width and height to do the md5 check. For the chroma
 | 
					 | 
				
			||||||
      // plane, we never want to round down and thus skip a pixel so if
 | 
					 | 
				
			||||||
      // we are shifting by 1 (chroma_shift) we add 1 before doing the shift.
 | 
					 | 
				
			||||||
      // This works only for chroma_shift of 0 and 1.
 | 
					 | 
				
			||||||
      const int h = plane ? (img->d_h + img->y_chroma_shift) >>
 | 
					 | 
				
			||||||
                    img->y_chroma_shift : img->d_h;
 | 
					 | 
				
			||||||
      const int w = plane ? (img->d_w + img->x_chroma_shift) >>
 | 
					 | 
				
			||||||
                    img->x_chroma_shift : img->d_w;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      for (int y = 0; y < h; ++y) {
 | 
					 | 
				
			||||||
        MD5Update(&md5_, buf, w);
 | 
					 | 
				
			||||||
        buf += img->stride[plane];
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  const char *Get(void) {
 | 
					 | 
				
			||||||
    static const char hex[16] = {
 | 
					 | 
				
			||||||
      '0', '1', '2', '3', '4', '5', '6', '7',
 | 
					 | 
				
			||||||
      '8', '9', 'a', 'b', 'c', 'd', 'e', 'f',
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
    uint8_t tmp[16];
 | 
					 | 
				
			||||||
    MD5Context ctx_tmp = md5_;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    MD5Final(tmp, &ctx_tmp);
 | 
					 | 
				
			||||||
    for (int i = 0; i < 16; i++) {
 | 
					 | 
				
			||||||
      res_[i * 2 + 0]  = hex[tmp[i] >> 4];
 | 
					 | 
				
			||||||
      res_[i * 2 + 1]  = hex[tmp[i] & 0xf];
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    res_[32] = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return res_;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  char res_[33];
 | 
					 | 
				
			||||||
  MD5Context md5_;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}  // namespace libvpx_test
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif  // TEST_MD5_HELPER_H_
 | 
					 | 
				
			||||||
@@ -1,114 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *  Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
 *  that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
 *  tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
 *  in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
 *  be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
#include "test/clear_system_state.h"
 | 
					 | 
				
			||||||
#include "test/register_state_check.h"
 | 
					 | 
				
			||||||
#include "third_party/googletest/src/include/gtest/gtest.h"
 | 
					 | 
				
			||||||
extern "C" {
 | 
					 | 
				
			||||||
#include "./vpx_config.h"
 | 
					 | 
				
			||||||
#include "./vp8_rtcd.h"
 | 
					 | 
				
			||||||
#include "vpx/vpx_integer.h"
 | 
					 | 
				
			||||||
#include "vpx_mem/vpx_mem.h"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef void (*post_proc_func_t)(unsigned char *src_ptr,
 | 
					 | 
				
			||||||
                                 unsigned char *dst_ptr,
 | 
					 | 
				
			||||||
                                 int src_pixels_per_line,
 | 
					 | 
				
			||||||
                                 int dst_pixels_per_line,
 | 
					 | 
				
			||||||
                                 int cols,
 | 
					 | 
				
			||||||
                                 unsigned char *flimit,
 | 
					 | 
				
			||||||
                                 int size);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class Vp8PostProcessingFilterTest
 | 
					 | 
				
			||||||
    : public ::testing::TestWithParam<post_proc_func_t> {
 | 
					 | 
				
			||||||
 public:
 | 
					 | 
				
			||||||
  virtual void TearDown() {
 | 
					 | 
				
			||||||
    libvpx_test::ClearSystemState();
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Test routine for the VP8 post-processing function
 | 
					 | 
				
			||||||
// vp8_post_proc_down_and_across_mb_row_c.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(Vp8PostProcessingFilterTest, FilterOutputCheck) {
 | 
					 | 
				
			||||||
  // Size of the underlying data block that will be filtered.
 | 
					 | 
				
			||||||
  const int block_width  = 16;
 | 
					 | 
				
			||||||
  const int block_height = 16;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // 5-tap filter needs 2 padding rows above and below the block in the input.
 | 
					 | 
				
			||||||
  const int input_width = block_width;
 | 
					 | 
				
			||||||
  const int input_height = block_height + 4;
 | 
					 | 
				
			||||||
  const int input_stride = input_width;
 | 
					 | 
				
			||||||
  const int input_size = input_width * input_height;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Filter extends output block by 8 samples at left and right edges.
 | 
					 | 
				
			||||||
  const int output_width = block_width + 16;
 | 
					 | 
				
			||||||
  const int output_height = block_height;
 | 
					 | 
				
			||||||
  const int output_stride = output_width;
 | 
					 | 
				
			||||||
  const int output_size = output_width * output_height;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  uint8_t *const src_image =
 | 
					 | 
				
			||||||
      reinterpret_cast<uint8_t*>(vpx_calloc(input_size, 1));
 | 
					 | 
				
			||||||
  uint8_t *const dst_image =
 | 
					 | 
				
			||||||
      reinterpret_cast<uint8_t*>(vpx_calloc(output_size, 1));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Pointers to top-left pixel of block in the input and output images.
 | 
					 | 
				
			||||||
  uint8_t *const src_image_ptr = src_image + (input_stride << 1);
 | 
					 | 
				
			||||||
  uint8_t *const dst_image_ptr = dst_image + 8;
 | 
					 | 
				
			||||||
  uint8_t *const flimits =
 | 
					 | 
				
			||||||
      reinterpret_cast<uint8_t *>(vpx_memalign(16, block_width));
 | 
					 | 
				
			||||||
  (void)vpx_memset(flimits, 255, block_width);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Initialize pixels in the input:
 | 
					 | 
				
			||||||
  //   block pixels to value 1,
 | 
					 | 
				
			||||||
  //   border pixels to value 10.
 | 
					 | 
				
			||||||
  (void)vpx_memset(src_image, 10, input_size);
 | 
					 | 
				
			||||||
  uint8_t *pixel_ptr = src_image_ptr;
 | 
					 | 
				
			||||||
  for (int i = 0; i < block_height; ++i) {
 | 
					 | 
				
			||||||
    for (int j = 0; j < block_width; ++j) {
 | 
					 | 
				
			||||||
      pixel_ptr[j] = 1;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    pixel_ptr += input_stride;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Initialize pixels in the output to 99.
 | 
					 | 
				
			||||||
  (void)vpx_memset(dst_image, 99, output_size);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  REGISTER_STATE_CHECK(GetParam()(src_image_ptr, dst_image_ptr, input_stride,
 | 
					 | 
				
			||||||
                                  output_stride, block_width, flimits, 16));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  static const uint8_t expected_data[block_height] = {
 | 
					 | 
				
			||||||
    4, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 4
 | 
					 | 
				
			||||||
  };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  pixel_ptr = dst_image_ptr;
 | 
					 | 
				
			||||||
  for (int i = 0; i < block_height; ++i) {
 | 
					 | 
				
			||||||
    for (int j = 0; j < block_width; ++j) {
 | 
					 | 
				
			||||||
      EXPECT_EQ(expected_data[i], pixel_ptr[j])
 | 
					 | 
				
			||||||
          << "Vp8PostProcessingFilterTest failed with invalid filter output";
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    pixel_ptr += output_stride;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  vpx_free(src_image);
 | 
					 | 
				
			||||||
  vpx_free(dst_image);
 | 
					 | 
				
			||||||
  vpx_free(flimits);
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(C, Vp8PostProcessingFilterTest,
 | 
					 | 
				
			||||||
    ::testing::Values(vp8_post_proc_down_and_across_mb_row_c));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if HAVE_SSE2
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(SSE2, Vp8PostProcessingFilterTest,
 | 
					 | 
				
			||||||
    ::testing::Values(vp8_post_proc_down_and_across_mb_row_sse2));
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}  // namespace
 | 
					 | 
				
			||||||
@@ -1,95 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *  Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
 *  that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
 *  tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
 *  in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
 *  be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef TEST_REGISTER_STATE_CHECK_H_
 | 
					 | 
				
			||||||
#define TEST_REGISTER_STATE_CHECK_H_
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef _WIN64
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define _WIN32_LEAN_AND_MEAN
 | 
					 | 
				
			||||||
#include <windows.h>
 | 
					 | 
				
			||||||
#include <winnt.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "third_party/googletest/src/include/gtest/gtest.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace testing {
 | 
					 | 
				
			||||||
namespace internal {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
inline bool operator==(const M128A& lhs, const M128A& rhs) {
 | 
					 | 
				
			||||||
  return (lhs.Low == rhs.Low && lhs.High == rhs.High);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}  // namespace internal
 | 
					 | 
				
			||||||
}  // namespace testing
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace libvpx_test {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Compares the state of xmm[6-15] at construction with their state at
 | 
					 | 
				
			||||||
// destruction. These registers should be preserved by the callee on
 | 
					 | 
				
			||||||
// Windows x64.
 | 
					 | 
				
			||||||
// Usage:
 | 
					 | 
				
			||||||
// {
 | 
					 | 
				
			||||||
//   RegisterStateCheck reg_check;
 | 
					 | 
				
			||||||
//   FunctionToVerify();
 | 
					 | 
				
			||||||
// }
 | 
					 | 
				
			||||||
class RegisterStateCheck {
 | 
					 | 
				
			||||||
 public:
 | 
					 | 
				
			||||||
  RegisterStateCheck() { initialized_ = StoreRegisters(&pre_context_); }
 | 
					 | 
				
			||||||
  ~RegisterStateCheck() { EXPECT_TRUE(Check()); }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 private:
 | 
					 | 
				
			||||||
  static bool StoreRegisters(CONTEXT* const context) {
 | 
					 | 
				
			||||||
    const HANDLE this_thread = GetCurrentThread();
 | 
					 | 
				
			||||||
    EXPECT_TRUE(this_thread != NULL);
 | 
					 | 
				
			||||||
    context->ContextFlags = CONTEXT_FLOATING_POINT;
 | 
					 | 
				
			||||||
    const bool context_saved = GetThreadContext(this_thread, context) == TRUE;
 | 
					 | 
				
			||||||
    EXPECT_TRUE(context_saved) << "GetLastError: " << GetLastError();
 | 
					 | 
				
			||||||
    return context_saved;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Compares the register state. Returns true if the states match.
 | 
					 | 
				
			||||||
  bool Check() const {
 | 
					 | 
				
			||||||
    if (!initialized_) return false;
 | 
					 | 
				
			||||||
    CONTEXT post_context;
 | 
					 | 
				
			||||||
    if (!StoreRegisters(&post_context)) return false;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    const M128A* xmm_pre = &pre_context_.Xmm6;
 | 
					 | 
				
			||||||
    const M128A* xmm_post = &post_context.Xmm6;
 | 
					 | 
				
			||||||
    for (int i = 6; i <= 15; ++i) {
 | 
					 | 
				
			||||||
      EXPECT_EQ(*xmm_pre, *xmm_post) << "xmm" << i << " has been modified!";
 | 
					 | 
				
			||||||
      ++xmm_pre;
 | 
					 | 
				
			||||||
      ++xmm_post;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return !testing::Test::HasNonfatalFailure();
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  bool initialized_;
 | 
					 | 
				
			||||||
  CONTEXT pre_context_;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define REGISTER_STATE_CHECK(statement) do { \
 | 
					 | 
				
			||||||
  libvpx_test::RegisterStateCheck reg_check; \
 | 
					 | 
				
			||||||
  statement;                               \
 | 
					 | 
				
			||||||
} while (false)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}  // namespace libvpx_test
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#else  // !_WIN64
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace libvpx_test {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class RegisterStateCheck {};
 | 
					 | 
				
			||||||
#define REGISTER_STATE_CHECK(statement) statement
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}  // namespace libvpx_test
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif  // _WIN64
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif  // TEST_REGISTER_STATE_CHECK_H_
 | 
					 | 
				
			||||||
@@ -1,266 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *  Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
 *  that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
 *  tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
 *  in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
 *  be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
#include <climits>
 | 
					 | 
				
			||||||
#include <vector>
 | 
					 | 
				
			||||||
#include "third_party/googletest/src/include/gtest/gtest.h"
 | 
					 | 
				
			||||||
#include "test/codec_factory.h"
 | 
					 | 
				
			||||||
#include "test/encode_test_driver.h"
 | 
					 | 
				
			||||||
#include "test/i420_video_source.h"
 | 
					 | 
				
			||||||
#include "test/video_source.h"
 | 
					 | 
				
			||||||
#include "test/util.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Enable(1) or Disable(0) writing of the compressed bitstream.
 | 
					 | 
				
			||||||
#define WRITE_COMPRESSED_STREAM 0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if WRITE_COMPRESSED_STREAM
 | 
					 | 
				
			||||||
static void mem_put_le16(char *const mem, const unsigned int val) {
 | 
					 | 
				
			||||||
  mem[0] = val;
 | 
					 | 
				
			||||||
  mem[1] = val >> 8;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void mem_put_le32(char *const mem, const unsigned int val) {
 | 
					 | 
				
			||||||
  mem[0] = val;
 | 
					 | 
				
			||||||
  mem[1] = val >> 8;
 | 
					 | 
				
			||||||
  mem[2] = val >> 16;
 | 
					 | 
				
			||||||
  mem[3] = val >> 24;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void write_ivf_file_header(const vpx_codec_enc_cfg_t *const cfg,
 | 
					 | 
				
			||||||
                                  int frame_cnt, FILE *const outfile) {
 | 
					 | 
				
			||||||
  char header[32];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  header[0] = 'D';
 | 
					 | 
				
			||||||
  header[1] = 'K';
 | 
					 | 
				
			||||||
  header[2] = 'I';
 | 
					 | 
				
			||||||
  header[3] = 'F';
 | 
					 | 
				
			||||||
  mem_put_le16(header + 4,  0);                   /* version */
 | 
					 | 
				
			||||||
  mem_put_le16(header + 6,  32);                  /* headersize */
 | 
					 | 
				
			||||||
  mem_put_le32(header + 8,  0x30395056);          /* fourcc (vp9) */
 | 
					 | 
				
			||||||
  mem_put_le16(header + 12, cfg->g_w);            /* width */
 | 
					 | 
				
			||||||
  mem_put_le16(header + 14, cfg->g_h);            /* height */
 | 
					 | 
				
			||||||
  mem_put_le32(header + 16, cfg->g_timebase.den); /* rate */
 | 
					 | 
				
			||||||
  mem_put_le32(header + 20, cfg->g_timebase.num); /* scale */
 | 
					 | 
				
			||||||
  mem_put_le32(header + 24, frame_cnt);           /* length */
 | 
					 | 
				
			||||||
  mem_put_le32(header + 28, 0);                   /* unused */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  (void)fwrite(header, 1, 32, outfile);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void write_ivf_frame_size(FILE *const outfile, const size_t size) {
 | 
					 | 
				
			||||||
  char header[4];
 | 
					 | 
				
			||||||
  mem_put_le32(header, static_cast<unsigned int>(size));
 | 
					 | 
				
			||||||
  (void)fwrite(header, 1, 4, outfile);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void write_ivf_frame_header(const vpx_codec_cx_pkt_t *const pkt,
 | 
					 | 
				
			||||||
                                   FILE *const outfile) {
 | 
					 | 
				
			||||||
  char header[12];
 | 
					 | 
				
			||||||
  vpx_codec_pts_t pts;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (pkt->kind != VPX_CODEC_CX_FRAME_PKT)
 | 
					 | 
				
			||||||
    return;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  pts = pkt->data.frame.pts;
 | 
					 | 
				
			||||||
  mem_put_le32(header, static_cast<unsigned int>(pkt->data.frame.sz));
 | 
					 | 
				
			||||||
  mem_put_le32(header + 4, pts & 0xFFFFFFFF);
 | 
					 | 
				
			||||||
  mem_put_le32(header + 8, pts >> 32);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  (void)fwrite(header, 1, 12, outfile);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#endif  // WRITE_COMPRESSED_STREAM
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const unsigned int kInitialWidth = 320;
 | 
					 | 
				
			||||||
const unsigned int kInitialHeight = 240;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
unsigned int ScaleForFrameNumber(unsigned int frame, unsigned int val) {
 | 
					 | 
				
			||||||
  if (frame < 10)
 | 
					 | 
				
			||||||
    return val;
 | 
					 | 
				
			||||||
  if (frame < 20)
 | 
					 | 
				
			||||||
    return val / 2;
 | 
					 | 
				
			||||||
  if (frame < 30)
 | 
					 | 
				
			||||||
    return val * 2 / 3;
 | 
					 | 
				
			||||||
  if (frame < 40)
 | 
					 | 
				
			||||||
    return val / 4;
 | 
					 | 
				
			||||||
  if (frame < 50)
 | 
					 | 
				
			||||||
    return val * 7 / 8;
 | 
					 | 
				
			||||||
  return val;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class ResizingVideoSource : public ::libvpx_test::DummyVideoSource {
 | 
					 | 
				
			||||||
 public:
 | 
					 | 
				
			||||||
  ResizingVideoSource() {
 | 
					 | 
				
			||||||
    SetSize(kInitialWidth, kInitialHeight);
 | 
					 | 
				
			||||||
    limit_ = 60;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual ~ResizingVideoSource() {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  virtual void Next() {
 | 
					 | 
				
			||||||
    ++frame_;
 | 
					 | 
				
			||||||
    SetSize(ScaleForFrameNumber(frame_, kInitialWidth),
 | 
					 | 
				
			||||||
            ScaleForFrameNumber(frame_, kInitialHeight));
 | 
					 | 
				
			||||||
    FillFrame();
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class ResizeTest : public ::libvpx_test::EncoderTest,
 | 
					 | 
				
			||||||
  public ::libvpx_test::CodecTestWithParam<libvpx_test::TestMode> {
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  ResizeTest() : EncoderTest(GET_PARAM(0)) {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual ~ResizeTest() {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  struct FrameInfo {
 | 
					 | 
				
			||||||
    FrameInfo(vpx_codec_pts_t _pts, unsigned int _w, unsigned int _h)
 | 
					 | 
				
			||||||
        : pts(_pts), w(_w), h(_h) {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    vpx_codec_pts_t pts;
 | 
					 | 
				
			||||||
    unsigned int w;
 | 
					 | 
				
			||||||
    unsigned int h;
 | 
					 | 
				
			||||||
  };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void SetUp() {
 | 
					 | 
				
			||||||
    InitializeConfig();
 | 
					 | 
				
			||||||
    SetMode(GET_PARAM(1));
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void DecompressedFrameHook(const vpx_image_t &img,
 | 
					 | 
				
			||||||
                                     vpx_codec_pts_t pts) {
 | 
					 | 
				
			||||||
    frame_info_list_.push_back(FrameInfo(pts, img.d_w, img.d_h));
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  std::vector< FrameInfo > frame_info_list_;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(ResizeTest, TestExternalResizeWorks) {
 | 
					 | 
				
			||||||
  ResizingVideoSource video;
 | 
					 | 
				
			||||||
  ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  for (std::vector<FrameInfo>::iterator info = frame_info_list_.begin();
 | 
					 | 
				
			||||||
       info != frame_info_list_.end(); ++info) {
 | 
					 | 
				
			||||||
    const vpx_codec_pts_t pts = info->pts;
 | 
					 | 
				
			||||||
    const unsigned int expected_w = ScaleForFrameNumber(pts, kInitialWidth);
 | 
					 | 
				
			||||||
    const unsigned int expected_h = ScaleForFrameNumber(pts, kInitialHeight);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    EXPECT_EQ(expected_w, info->w)
 | 
					 | 
				
			||||||
        << "Frame " << pts << "had unexpected width";
 | 
					 | 
				
			||||||
    EXPECT_EQ(expected_h, info->h)
 | 
					 | 
				
			||||||
        << "Frame " << pts << "had unexpected height";
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const unsigned int kStepDownFrame = 3;
 | 
					 | 
				
			||||||
const unsigned int kStepUpFrame = 6;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class ResizeInternalTest : public ResizeTest {
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
#if WRITE_COMPRESSED_STREAM
 | 
					 | 
				
			||||||
  ResizeInternalTest()
 | 
					 | 
				
			||||||
      : ResizeTest(),
 | 
					 | 
				
			||||||
        frame0_psnr_(0.0),
 | 
					 | 
				
			||||||
        outfile_(NULL),
 | 
					 | 
				
			||||||
        out_frames_(0) {}
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
  ResizeInternalTest() : ResizeTest(), frame0_psnr_(0.0) {}
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual ~ResizeInternalTest() {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void BeginPassHook(unsigned int /*pass*/) {
 | 
					 | 
				
			||||||
#if WRITE_COMPRESSED_STREAM
 | 
					 | 
				
			||||||
    outfile_ = fopen("vp90-2-05-resize.ivf", "wb");
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void EndPassHook() {
 | 
					 | 
				
			||||||
#if WRITE_COMPRESSED_STREAM
 | 
					 | 
				
			||||||
    if (outfile_) {
 | 
					 | 
				
			||||||
      if (!fseek(outfile_, 0, SEEK_SET))
 | 
					 | 
				
			||||||
        write_ivf_file_header(&cfg_, out_frames_, outfile_);
 | 
					 | 
				
			||||||
      fclose(outfile_);
 | 
					 | 
				
			||||||
      outfile_ = NULL;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void PreEncodeFrameHook(libvpx_test::VideoSource *video,
 | 
					 | 
				
			||||||
                                  libvpx_test::Encoder *encoder) {
 | 
					 | 
				
			||||||
    if (video->frame() == kStepDownFrame) {
 | 
					 | 
				
			||||||
      struct vpx_scaling_mode mode = {VP8E_FOURFIVE, VP8E_THREEFIVE};
 | 
					 | 
				
			||||||
      encoder->Control(VP8E_SET_SCALEMODE, &mode);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if (video->frame() == kStepUpFrame) {
 | 
					 | 
				
			||||||
      struct vpx_scaling_mode mode = {VP8E_NORMAL, VP8E_NORMAL};
 | 
					 | 
				
			||||||
      encoder->Control(VP8E_SET_SCALEMODE, &mode);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void PSNRPktHook(const vpx_codec_cx_pkt_t *pkt) {
 | 
					 | 
				
			||||||
    if (!frame0_psnr_)
 | 
					 | 
				
			||||||
      frame0_psnr_ = pkt->data.psnr.psnr[0];
 | 
					 | 
				
			||||||
    EXPECT_NEAR(pkt->data.psnr.psnr[0], frame0_psnr_, 1.5);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void FramePktHook(const vpx_codec_cx_pkt_t *pkt) {
 | 
					 | 
				
			||||||
#if WRITE_COMPRESSED_STREAM
 | 
					 | 
				
			||||||
    ++out_frames_;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Write initial file header if first frame.
 | 
					 | 
				
			||||||
    if (pkt->data.frame.pts == 0)
 | 
					 | 
				
			||||||
      write_ivf_file_header(&cfg_, 0, outfile_);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Write frame header and data.
 | 
					 | 
				
			||||||
    write_ivf_frame_header(pkt, outfile_);
 | 
					 | 
				
			||||||
    (void)fwrite(pkt->data.frame.buf, 1, pkt->data.frame.sz, outfile_);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  double frame0_psnr_;
 | 
					 | 
				
			||||||
#if WRITE_COMPRESSED_STREAM
 | 
					 | 
				
			||||||
  FILE *outfile_;
 | 
					 | 
				
			||||||
  unsigned int out_frames_;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(ResizeInternalTest, TestInternalResizeWorks) {
 | 
					 | 
				
			||||||
  ::libvpx_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288,
 | 
					 | 
				
			||||||
                                       30, 1, 0, 10);
 | 
					 | 
				
			||||||
  init_flags_ = VPX_CODEC_USE_PSNR;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // q picked such that initial keyframe on this clip is ~30dB PSNR
 | 
					 | 
				
			||||||
  cfg_.rc_min_quantizer = cfg_.rc_max_quantizer = 48;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // If the number of frames being encoded is smaller than g_lag_in_frames
 | 
					 | 
				
			||||||
  // the encoded frame is unavailable using the current API. Comparing
 | 
					 | 
				
			||||||
  // frames to detect mismatch would then not be possible. Set
 | 
					 | 
				
			||||||
  // g_lag_in_frames = 0 to get around this.
 | 
					 | 
				
			||||||
  cfg_.g_lag_in_frames = 0;
 | 
					 | 
				
			||||||
  ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  for (std::vector<FrameInfo>::iterator info = frame_info_list_.begin();
 | 
					 | 
				
			||||||
       info != frame_info_list_.end(); ++info) {
 | 
					 | 
				
			||||||
    const vpx_codec_pts_t pts = info->pts;
 | 
					 | 
				
			||||||
    if (pts >= kStepDownFrame && pts < kStepUpFrame) {
 | 
					 | 
				
			||||||
      ASSERT_EQ(282U, info->w) << "Frame " << pts << " had unexpected width";
 | 
					 | 
				
			||||||
      ASSERT_EQ(173U, info->h) << "Frame " << pts << " had unexpected height";
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
      EXPECT_EQ(352U, info->w) << "Frame " << pts << " had unexpected width";
 | 
					 | 
				
			||||||
      EXPECT_EQ(288U, info->h) << "Frame " << pts << " had unexpected height";
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
VP8_INSTANTIATE_TEST_CASE(ResizeTest, ONE_PASS_TEST_MODES);
 | 
					 | 
				
			||||||
VP9_INSTANTIATE_TEST_CASE(ResizeInternalTest,
 | 
					 | 
				
			||||||
                          ::testing::Values(::libvpx_test::kOnePassBest));
 | 
					 | 
				
			||||||
}  // namespace
 | 
					 | 
				
			||||||
							
								
								
									
										548
									
								
								test/sad_test.cc
									
									
									
									
									
								
							
							
						
						
									
										548
									
								
								test/sad_test.cc
									
									
									
									
									
								
							@@ -1,548 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *  Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
 *  that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
 *  tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
 *  in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
 *  be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <string.h>
 | 
					 | 
				
			||||||
#include <limits.h>
 | 
					 | 
				
			||||||
#include <stdio.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern "C" {
 | 
					 | 
				
			||||||
#include "./vpx_config.h"
 | 
					 | 
				
			||||||
#if CONFIG_VP8_ENCODER
 | 
					 | 
				
			||||||
#include "./vp8_rtcd.h"
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#if CONFIG_VP9_ENCODER
 | 
					 | 
				
			||||||
#include "./vp9_rtcd.h"
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#include "vpx_mem/vpx_mem.h"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "test/acm_random.h"
 | 
					 | 
				
			||||||
#include "test/clear_system_state.h"
 | 
					 | 
				
			||||||
#include "test/register_state_check.h"
 | 
					 | 
				
			||||||
#include "test/util.h"
 | 
					 | 
				
			||||||
#include "third_party/googletest/src/include/gtest/gtest.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef unsigned int (*sad_m_by_n_fn_t)(const unsigned char *source_ptr,
 | 
					 | 
				
			||||||
                                        int source_stride,
 | 
					 | 
				
			||||||
                                        const unsigned char *reference_ptr,
 | 
					 | 
				
			||||||
                                        int reference_stride,
 | 
					 | 
				
			||||||
                                        unsigned int max_sad);
 | 
					 | 
				
			||||||
typedef std::tr1::tuple<int, int, sad_m_by_n_fn_t> sad_m_by_n_test_param_t;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef void (*sad_n_by_n_by_4_fn_t)(const uint8_t *src_ptr,
 | 
					 | 
				
			||||||
                                     int src_stride,
 | 
					 | 
				
			||||||
                                     const unsigned char * const ref_ptr[],
 | 
					 | 
				
			||||||
                                     int ref_stride,
 | 
					 | 
				
			||||||
                                     unsigned int *sad_array);
 | 
					 | 
				
			||||||
typedef std::tr1::tuple<int, int, sad_n_by_n_by_4_fn_t>
 | 
					 | 
				
			||||||
        sad_n_by_n_by_4_test_param_t;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
using libvpx_test::ACMRandom;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace {
 | 
					 | 
				
			||||||
class SADTestBase : public ::testing::Test {
 | 
					 | 
				
			||||||
 public:
 | 
					 | 
				
			||||||
  SADTestBase(int width, int height) : width_(width), height_(height) {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  static void SetUpTestCase() {
 | 
					 | 
				
			||||||
    source_data_ = reinterpret_cast<uint8_t*>(
 | 
					 | 
				
			||||||
        vpx_memalign(kDataAlignment, kDataBlockSize));
 | 
					 | 
				
			||||||
    reference_data_ = reinterpret_cast<uint8_t*>(
 | 
					 | 
				
			||||||
        vpx_memalign(kDataAlignment, kDataBufferSize));
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  static void TearDownTestCase() {
 | 
					 | 
				
			||||||
    vpx_free(source_data_);
 | 
					 | 
				
			||||||
    source_data_ = NULL;
 | 
					 | 
				
			||||||
    vpx_free(reference_data_);
 | 
					 | 
				
			||||||
    reference_data_ = NULL;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void TearDown() {
 | 
					 | 
				
			||||||
    libvpx_test::ClearSystemState();
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  // Handle blocks up to 4 blocks 64x64 with stride up to 128
 | 
					 | 
				
			||||||
  static const int kDataAlignment = 16;
 | 
					 | 
				
			||||||
  static const int kDataBlockSize = 64 * 128;
 | 
					 | 
				
			||||||
  static const int kDataBufferSize = 4 * kDataBlockSize;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void SetUp() {
 | 
					 | 
				
			||||||
    source_stride_ = (width_ + 31) & ~31;
 | 
					 | 
				
			||||||
    reference_stride_ = width_ * 2;
 | 
					 | 
				
			||||||
    rnd_.Reset(ACMRandom::DeterministicSeed());
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual uint8_t* GetReference(int block_idx) {
 | 
					 | 
				
			||||||
    return reference_data_ + block_idx * kDataBlockSize;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Sum of Absolute Differences. Given two blocks, calculate the absolute
 | 
					 | 
				
			||||||
  // difference between two pixels in the same relative location; accumulate.
 | 
					 | 
				
			||||||
  unsigned int ReferenceSAD(unsigned int max_sad, int block_idx = 0) {
 | 
					 | 
				
			||||||
    unsigned int sad = 0;
 | 
					 | 
				
			||||||
    const uint8_t* const reference = GetReference(block_idx);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (int h = 0; h < height_; ++h) {
 | 
					 | 
				
			||||||
      for (int w = 0; w < width_; ++w) {
 | 
					 | 
				
			||||||
        sad += abs(source_data_[h * source_stride_ + w]
 | 
					 | 
				
			||||||
               - reference[h * reference_stride_ + w]);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      if (sad > max_sad) {
 | 
					 | 
				
			||||||
        break;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return sad;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  void FillConstant(uint8_t *data, int stride, uint8_t fill_constant) {
 | 
					 | 
				
			||||||
    for (int h = 0; h < height_; ++h) {
 | 
					 | 
				
			||||||
      for (int w = 0; w < width_; ++w) {
 | 
					 | 
				
			||||||
        data[h * stride + w] = fill_constant;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  void FillRandom(uint8_t *data, int stride) {
 | 
					 | 
				
			||||||
    for (int h = 0; h < height_; ++h) {
 | 
					 | 
				
			||||||
      for (int w = 0; w < width_; ++w) {
 | 
					 | 
				
			||||||
        data[h * stride + w] = rnd_.Rand8();
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  int width_, height_;
 | 
					 | 
				
			||||||
  static uint8_t* source_data_;
 | 
					 | 
				
			||||||
  int source_stride_;
 | 
					 | 
				
			||||||
  static uint8_t* reference_data_;
 | 
					 | 
				
			||||||
  int reference_stride_;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  ACMRandom rnd_;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class SADTest : public SADTestBase,
 | 
					 | 
				
			||||||
    public ::testing::WithParamInterface<sad_m_by_n_test_param_t> {
 | 
					 | 
				
			||||||
 public:
 | 
					 | 
				
			||||||
  SADTest() : SADTestBase(GET_PARAM(0), GET_PARAM(1)) {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  unsigned int SAD(unsigned int max_sad, int block_idx = 0) {
 | 
					 | 
				
			||||||
    unsigned int ret;
 | 
					 | 
				
			||||||
    const uint8_t* const reference = GetReference(block_idx);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    REGISTER_STATE_CHECK(ret = GET_PARAM(2)(source_data_, source_stride_,
 | 
					 | 
				
			||||||
                                            reference, reference_stride_,
 | 
					 | 
				
			||||||
                                            max_sad));
 | 
					 | 
				
			||||||
    return ret;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  void CheckSad(unsigned int max_sad) {
 | 
					 | 
				
			||||||
    unsigned int reference_sad, exp_sad;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    reference_sad = ReferenceSAD(max_sad);
 | 
					 | 
				
			||||||
    exp_sad = SAD(max_sad);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (reference_sad <= max_sad) {
 | 
					 | 
				
			||||||
      ASSERT_EQ(exp_sad, reference_sad);
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
      // Alternative implementations are not required to check max_sad
 | 
					 | 
				
			||||||
      ASSERT_GE(exp_sad, reference_sad);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class SADx4Test : public SADTestBase,
 | 
					 | 
				
			||||||
    public ::testing::WithParamInterface<sad_n_by_n_by_4_test_param_t> {
 | 
					 | 
				
			||||||
 public:
 | 
					 | 
				
			||||||
  SADx4Test() : SADTestBase(GET_PARAM(0), GET_PARAM(1)) {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  void SADs(unsigned int *results) {
 | 
					 | 
				
			||||||
    const uint8_t* refs[] = {GetReference(0), GetReference(1),
 | 
					 | 
				
			||||||
                             GetReference(2), GetReference(3)};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    REGISTER_STATE_CHECK(GET_PARAM(2)(source_data_, source_stride_,
 | 
					 | 
				
			||||||
                                      refs, reference_stride_,
 | 
					 | 
				
			||||||
                                      results));
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  void CheckSADs() {
 | 
					 | 
				
			||||||
    unsigned int reference_sad, exp_sad[4];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    SADs(exp_sad);
 | 
					 | 
				
			||||||
    for (int block = 0; block < 4; block++) {
 | 
					 | 
				
			||||||
      reference_sad = ReferenceSAD(UINT_MAX, block);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      EXPECT_EQ(exp_sad[block], reference_sad) << "block " << block;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t* SADTestBase::source_data_ = NULL;
 | 
					 | 
				
			||||||
uint8_t* SADTestBase::reference_data_ = NULL;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(SADTest, MaxRef) {
 | 
					 | 
				
			||||||
  FillConstant(source_data_, source_stride_, 0);
 | 
					 | 
				
			||||||
  FillConstant(reference_data_, reference_stride_, 255);
 | 
					 | 
				
			||||||
  CheckSad(UINT_MAX);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(SADx4Test, MaxRef) {
 | 
					 | 
				
			||||||
  FillConstant(source_data_, source_stride_, 0);
 | 
					 | 
				
			||||||
  FillConstant(GetReference(0), reference_stride_, 255);
 | 
					 | 
				
			||||||
  FillConstant(GetReference(1), reference_stride_, 255);
 | 
					 | 
				
			||||||
  FillConstant(GetReference(2), reference_stride_, 255);
 | 
					 | 
				
			||||||
  FillConstant(GetReference(3), reference_stride_, 255);
 | 
					 | 
				
			||||||
  CheckSADs();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(SADTest, MaxSrc) {
 | 
					 | 
				
			||||||
  FillConstant(source_data_, source_stride_, 255);
 | 
					 | 
				
			||||||
  FillConstant(reference_data_, reference_stride_, 0);
 | 
					 | 
				
			||||||
  CheckSad(UINT_MAX);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(SADx4Test, MaxSrc) {
 | 
					 | 
				
			||||||
  FillConstant(source_data_, source_stride_, 255);
 | 
					 | 
				
			||||||
  FillConstant(GetReference(0), reference_stride_, 0);
 | 
					 | 
				
			||||||
  FillConstant(GetReference(1), reference_stride_, 0);
 | 
					 | 
				
			||||||
  FillConstant(GetReference(2), reference_stride_, 0);
 | 
					 | 
				
			||||||
  FillConstant(GetReference(3), reference_stride_, 0);
 | 
					 | 
				
			||||||
  CheckSADs();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(SADTest, ShortRef) {
 | 
					 | 
				
			||||||
  int tmp_stride = reference_stride_;
 | 
					 | 
				
			||||||
  reference_stride_ >>= 1;
 | 
					 | 
				
			||||||
  FillRandom(source_data_, source_stride_);
 | 
					 | 
				
			||||||
  FillRandom(reference_data_, reference_stride_);
 | 
					 | 
				
			||||||
  CheckSad(UINT_MAX);
 | 
					 | 
				
			||||||
  reference_stride_ = tmp_stride;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(SADx4Test, ShortRef) {
 | 
					 | 
				
			||||||
  int tmp_stride = reference_stride_;
 | 
					 | 
				
			||||||
  reference_stride_ >>= 1;
 | 
					 | 
				
			||||||
  FillRandom(source_data_, source_stride_);
 | 
					 | 
				
			||||||
  FillRandom(GetReference(0), reference_stride_);
 | 
					 | 
				
			||||||
  FillRandom(GetReference(1), reference_stride_);
 | 
					 | 
				
			||||||
  FillRandom(GetReference(2), reference_stride_);
 | 
					 | 
				
			||||||
  FillRandom(GetReference(3), reference_stride_);
 | 
					 | 
				
			||||||
  CheckSADs();
 | 
					 | 
				
			||||||
  reference_stride_ = tmp_stride;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(SADTest, UnalignedRef) {
 | 
					 | 
				
			||||||
  // The reference frame, but not the source frame, may be unaligned for
 | 
					 | 
				
			||||||
  // certain types of searches.
 | 
					 | 
				
			||||||
  int tmp_stride = reference_stride_;
 | 
					 | 
				
			||||||
  reference_stride_ -= 1;
 | 
					 | 
				
			||||||
  FillRandom(source_data_, source_stride_);
 | 
					 | 
				
			||||||
  FillRandom(reference_data_, reference_stride_);
 | 
					 | 
				
			||||||
  CheckSad(UINT_MAX);
 | 
					 | 
				
			||||||
  reference_stride_ = tmp_stride;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(SADx4Test, UnalignedRef) {
 | 
					 | 
				
			||||||
  // The reference frame, but not the source frame, may be unaligned for
 | 
					 | 
				
			||||||
  // certain types of searches.
 | 
					 | 
				
			||||||
  int tmp_stride = reference_stride_;
 | 
					 | 
				
			||||||
  reference_stride_ -= 1;
 | 
					 | 
				
			||||||
  FillRandom(source_data_, source_stride_);
 | 
					 | 
				
			||||||
  FillRandom(GetReference(0), reference_stride_);
 | 
					 | 
				
			||||||
  FillRandom(GetReference(1), reference_stride_);
 | 
					 | 
				
			||||||
  FillRandom(GetReference(2), reference_stride_);
 | 
					 | 
				
			||||||
  FillRandom(GetReference(3), reference_stride_);
 | 
					 | 
				
			||||||
  CheckSADs();
 | 
					 | 
				
			||||||
  reference_stride_ = tmp_stride;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(SADTest, ShortSrc) {
 | 
					 | 
				
			||||||
  int tmp_stride = source_stride_;
 | 
					 | 
				
			||||||
  source_stride_ >>= 1;
 | 
					 | 
				
			||||||
  FillRandom(source_data_, source_stride_);
 | 
					 | 
				
			||||||
  FillRandom(reference_data_, reference_stride_);
 | 
					 | 
				
			||||||
  CheckSad(UINT_MAX);
 | 
					 | 
				
			||||||
  source_stride_ = tmp_stride;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(SADx4Test, ShortSrc) {
 | 
					 | 
				
			||||||
  int tmp_stride = source_stride_;
 | 
					 | 
				
			||||||
  source_stride_ >>= 1;
 | 
					 | 
				
			||||||
  FillRandom(source_data_, source_stride_);
 | 
					 | 
				
			||||||
  FillRandom(GetReference(0), reference_stride_);
 | 
					 | 
				
			||||||
  FillRandom(GetReference(1), reference_stride_);
 | 
					 | 
				
			||||||
  FillRandom(GetReference(2), reference_stride_);
 | 
					 | 
				
			||||||
  FillRandom(GetReference(3), reference_stride_);
 | 
					 | 
				
			||||||
  CheckSADs();
 | 
					 | 
				
			||||||
  source_stride_ = tmp_stride;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(SADTest, MaxSAD) {
 | 
					 | 
				
			||||||
  // Verify that, when max_sad is set, the implementation does not return a
 | 
					 | 
				
			||||||
  // value lower than the reference.
 | 
					 | 
				
			||||||
  FillConstant(source_data_, source_stride_, 255);
 | 
					 | 
				
			||||||
  FillConstant(reference_data_, reference_stride_, 0);
 | 
					 | 
				
			||||||
  CheckSad(128);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
using std::tr1::make_tuple;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if CONFIG_VP8_ENCODER
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_16x16_c = vp8_sad16x16_c;
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_8x16_c = vp8_sad8x16_c;
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_16x8_c = vp8_sad16x8_c;
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_8x8_c = vp8_sad8x8_c;
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_4x4_c = vp8_sad4x4_c;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#if CONFIG_VP9_ENCODER
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_64x64_c_vp9 = vp9_sad64x64_c;
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_32x32_c_vp9 = vp9_sad32x32_c;
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_16x16_c_vp9 = vp9_sad16x16_c;
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_8x16_c_vp9 = vp9_sad8x16_c;
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_16x8_c_vp9 = vp9_sad16x8_c;
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_8x8_c_vp9 = vp9_sad8x8_c;
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_8x4_c_vp9 = vp9_sad8x4_c;
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_4x8_c_vp9 = vp9_sad4x8_c;
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_4x4_c_vp9 = vp9_sad4x4_c;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
const sad_m_by_n_test_param_t c_tests[] = {
 | 
					 | 
				
			||||||
#if CONFIG_VP8_ENCODER
 | 
					 | 
				
			||||||
  make_tuple(16, 16, sad_16x16_c),
 | 
					 | 
				
			||||||
  make_tuple(8, 16, sad_8x16_c),
 | 
					 | 
				
			||||||
  make_tuple(16, 8, sad_16x8_c),
 | 
					 | 
				
			||||||
  make_tuple(8, 8, sad_8x8_c),
 | 
					 | 
				
			||||||
  make_tuple(4, 4, sad_4x4_c),
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#if CONFIG_VP9_ENCODER
 | 
					 | 
				
			||||||
  make_tuple(64, 64, sad_64x64_c_vp9),
 | 
					 | 
				
			||||||
  make_tuple(32, 32, sad_32x32_c_vp9),
 | 
					 | 
				
			||||||
  make_tuple(16, 16, sad_16x16_c_vp9),
 | 
					 | 
				
			||||||
  make_tuple(8, 16, sad_8x16_c_vp9),
 | 
					 | 
				
			||||||
  make_tuple(16, 8, sad_16x8_c_vp9),
 | 
					 | 
				
			||||||
  make_tuple(8, 8, sad_8x8_c_vp9),
 | 
					 | 
				
			||||||
  make_tuple(8, 4, sad_8x4_c_vp9),
 | 
					 | 
				
			||||||
  make_tuple(4, 8, sad_4x8_c_vp9),
 | 
					 | 
				
			||||||
  make_tuple(4, 4, sad_4x4_c_vp9),
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(C, SADTest, ::testing::ValuesIn(c_tests));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if CONFIG_VP9_ENCODER
 | 
					 | 
				
			||||||
const sad_n_by_n_by_4_fn_t sad_64x64x4d_c = vp9_sad64x64x4d_c;
 | 
					 | 
				
			||||||
const sad_n_by_n_by_4_fn_t sad_64x32x4d_c = vp9_sad64x32x4d_c;
 | 
					 | 
				
			||||||
const sad_n_by_n_by_4_fn_t sad_32x64x4d_c = vp9_sad32x64x4d_c;
 | 
					 | 
				
			||||||
const sad_n_by_n_by_4_fn_t sad_32x32x4d_c = vp9_sad32x32x4d_c;
 | 
					 | 
				
			||||||
const sad_n_by_n_by_4_fn_t sad_32x16x4d_c = vp9_sad32x16x4d_c;
 | 
					 | 
				
			||||||
const sad_n_by_n_by_4_fn_t sad_16x32x4d_c = vp9_sad16x32x4d_c;
 | 
					 | 
				
			||||||
const sad_n_by_n_by_4_fn_t sad_16x16x4d_c = vp9_sad16x16x4d_c;
 | 
					 | 
				
			||||||
const sad_n_by_n_by_4_fn_t sad_16x8x4d_c = vp9_sad16x8x4d_c;
 | 
					 | 
				
			||||||
const sad_n_by_n_by_4_fn_t sad_8x16x4d_c = vp9_sad8x16x4d_c;
 | 
					 | 
				
			||||||
const sad_n_by_n_by_4_fn_t sad_8x8x4d_c = vp9_sad8x8x4d_c;
 | 
					 | 
				
			||||||
const sad_n_by_n_by_4_fn_t sad_8x4x4d_c = vp9_sad8x4x4d_c;
 | 
					 | 
				
			||||||
const sad_n_by_n_by_4_fn_t sad_4x8x4d_c = vp9_sad4x8x4d_c;
 | 
					 | 
				
			||||||
const sad_n_by_n_by_4_fn_t sad_4x4x4d_c = vp9_sad4x4x4d_c;
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(C, SADx4Test, ::testing::Values(
 | 
					 | 
				
			||||||
                        make_tuple(64, 64, sad_64x64x4d_c),
 | 
					 | 
				
			||||||
                        make_tuple(64, 32, sad_64x32x4d_c),
 | 
					 | 
				
			||||||
                        make_tuple(32, 64, sad_32x64x4d_c),
 | 
					 | 
				
			||||||
                        make_tuple(32, 32, sad_32x32x4d_c),
 | 
					 | 
				
			||||||
                        make_tuple(32, 16, sad_32x16x4d_c),
 | 
					 | 
				
			||||||
                        make_tuple(16, 32, sad_16x32x4d_c),
 | 
					 | 
				
			||||||
                        make_tuple(16, 16, sad_16x16x4d_c),
 | 
					 | 
				
			||||||
                        make_tuple(16, 8, sad_16x8x4d_c),
 | 
					 | 
				
			||||||
                        make_tuple(8, 16, sad_8x16x4d_c),
 | 
					 | 
				
			||||||
                        make_tuple(8, 8, sad_8x8x4d_c),
 | 
					 | 
				
			||||||
                        make_tuple(8, 4, sad_8x4x4d_c),
 | 
					 | 
				
			||||||
                        make_tuple(4, 8, sad_4x8x4d_c),
 | 
					 | 
				
			||||||
                        make_tuple(4, 4, sad_4x4x4d_c)));
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ARM tests
 | 
					 | 
				
			||||||
#if HAVE_MEDIA
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_16x16_armv6 = vp8_sad16x16_armv6;
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(MEDIA, SADTest, ::testing::Values(
 | 
					 | 
				
			||||||
                        make_tuple(16, 16, sad_16x16_armv6)));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#if HAVE_NEON
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_16x16_neon = vp8_sad16x16_neon;
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_8x16_neon = vp8_sad8x16_neon;
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_16x8_neon = vp8_sad16x8_neon;
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_8x8_neon = vp8_sad8x8_neon;
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_4x4_neon = vp8_sad4x4_neon;
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(NEON, SADTest, ::testing::Values(
 | 
					 | 
				
			||||||
                        make_tuple(16, 16, sad_16x16_neon),
 | 
					 | 
				
			||||||
                        make_tuple(8, 16, sad_8x16_neon),
 | 
					 | 
				
			||||||
                        make_tuple(16, 8, sad_16x8_neon),
 | 
					 | 
				
			||||||
                        make_tuple(8, 8, sad_8x8_neon),
 | 
					 | 
				
			||||||
                        make_tuple(4, 4, sad_4x4_neon)));
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// X86 tests
 | 
					 | 
				
			||||||
#if HAVE_MMX
 | 
					 | 
				
			||||||
#if CONFIG_VP8_ENCODER
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_16x16_mmx = vp8_sad16x16_mmx;
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_8x16_mmx = vp8_sad8x16_mmx;
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_16x8_mmx = vp8_sad16x8_mmx;
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_8x8_mmx = vp8_sad8x8_mmx;
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_4x4_mmx = vp8_sad4x4_mmx;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#if CONFIG_VP9_ENCODER
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_16x16_mmx_vp9 = vp9_sad16x16_mmx;
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_8x16_mmx_vp9 = vp9_sad8x16_mmx;
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_16x8_mmx_vp9 = vp9_sad16x8_mmx;
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_8x8_mmx_vp9 = vp9_sad8x8_mmx;
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_4x4_mmx_vp9 = vp9_sad4x4_mmx;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const sad_m_by_n_test_param_t mmx_tests[] = {
 | 
					 | 
				
			||||||
#if CONFIG_VP8_ENCODER
 | 
					 | 
				
			||||||
  make_tuple(16, 16, sad_16x16_mmx),
 | 
					 | 
				
			||||||
  make_tuple(8, 16, sad_8x16_mmx),
 | 
					 | 
				
			||||||
  make_tuple(16, 8, sad_16x8_mmx),
 | 
					 | 
				
			||||||
  make_tuple(8, 8, sad_8x8_mmx),
 | 
					 | 
				
			||||||
  make_tuple(4, 4, sad_4x4_mmx),
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#if CONFIG_VP9_ENCODER
 | 
					 | 
				
			||||||
  make_tuple(16, 16, sad_16x16_mmx_vp9),
 | 
					 | 
				
			||||||
  make_tuple(8, 16, sad_8x16_mmx_vp9),
 | 
					 | 
				
			||||||
  make_tuple(16, 8, sad_16x8_mmx_vp9),
 | 
					 | 
				
			||||||
  make_tuple(8, 8, sad_8x8_mmx_vp9),
 | 
					 | 
				
			||||||
  make_tuple(4, 4, sad_4x4_mmx_vp9),
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(MMX, SADTest, ::testing::ValuesIn(mmx_tests));
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if HAVE_SSE
 | 
					 | 
				
			||||||
#if CONFIG_VP9_ENCODER
 | 
					 | 
				
			||||||
#if CONFIG_USE_X86INC
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_4x4_sse_vp9 = vp9_sad4x4_sse;
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_4x8_sse_vp9 = vp9_sad4x8_sse;
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(SSE, SADTest, ::testing::Values(
 | 
					 | 
				
			||||||
                        make_tuple(4, 4, sad_4x4_sse_vp9),
 | 
					 | 
				
			||||||
                        make_tuple(4, 8, sad_4x8_sse_vp9)));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const sad_n_by_n_by_4_fn_t sad_4x8x4d_sse = vp9_sad4x8x4d_sse;
 | 
					 | 
				
			||||||
const sad_n_by_n_by_4_fn_t sad_4x4x4d_sse = vp9_sad4x4x4d_sse;
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(SSE, SADx4Test, ::testing::Values(
 | 
					 | 
				
			||||||
                        make_tuple(4, 8, sad_4x8x4d_sse),
 | 
					 | 
				
			||||||
                        make_tuple(4, 4, sad_4x4x4d_sse)));
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if HAVE_SSE2
 | 
					 | 
				
			||||||
#if CONFIG_VP8_ENCODER
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_16x16_wmt = vp8_sad16x16_wmt;
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_8x16_wmt = vp8_sad8x16_wmt;
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_16x8_wmt = vp8_sad16x8_wmt;
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_8x8_wmt = vp8_sad8x8_wmt;
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_4x4_wmt = vp8_sad4x4_wmt;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#if CONFIG_VP9_ENCODER
 | 
					 | 
				
			||||||
#if CONFIG_USE_X86INC
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_64x64_sse2_vp9 = vp9_sad64x64_sse2;
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_64x32_sse2_vp9 = vp9_sad64x32_sse2;
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_32x64_sse2_vp9 = vp9_sad32x64_sse2;
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_32x32_sse2_vp9 = vp9_sad32x32_sse2;
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_32x16_sse2_vp9 = vp9_sad32x16_sse2;
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_16x32_sse2_vp9 = vp9_sad16x32_sse2;
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_16x16_sse2_vp9 = vp9_sad16x16_sse2;
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_16x8_sse2_vp9 = vp9_sad16x8_sse2;
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_8x16_sse2_vp9 = vp9_sad8x16_sse2;
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_8x8_sse2_vp9 = vp9_sad8x8_sse2;
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_8x4_sse2_vp9 = vp9_sad8x4_sse2;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
const sad_m_by_n_test_param_t sse2_tests[] = {
 | 
					 | 
				
			||||||
#if CONFIG_VP8_ENCODER
 | 
					 | 
				
			||||||
  make_tuple(16, 16, sad_16x16_wmt),
 | 
					 | 
				
			||||||
  make_tuple(8, 16, sad_8x16_wmt),
 | 
					 | 
				
			||||||
  make_tuple(16, 8, sad_16x8_wmt),
 | 
					 | 
				
			||||||
  make_tuple(8, 8, sad_8x8_wmt),
 | 
					 | 
				
			||||||
  make_tuple(4, 4, sad_4x4_wmt),
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#if CONFIG_VP9_ENCODER
 | 
					 | 
				
			||||||
#if CONFIG_USE_X86INC
 | 
					 | 
				
			||||||
  make_tuple(64, 64, sad_64x64_sse2_vp9),
 | 
					 | 
				
			||||||
  make_tuple(64, 32, sad_64x32_sse2_vp9),
 | 
					 | 
				
			||||||
  make_tuple(32, 64, sad_32x64_sse2_vp9),
 | 
					 | 
				
			||||||
  make_tuple(32, 32, sad_32x32_sse2_vp9),
 | 
					 | 
				
			||||||
  make_tuple(32, 16, sad_32x16_sse2_vp9),
 | 
					 | 
				
			||||||
  make_tuple(16, 32, sad_16x32_sse2_vp9),
 | 
					 | 
				
			||||||
  make_tuple(16, 16, sad_16x16_sse2_vp9),
 | 
					 | 
				
			||||||
  make_tuple(16, 8, sad_16x8_sse2_vp9),
 | 
					 | 
				
			||||||
  make_tuple(8, 16, sad_8x16_sse2_vp9),
 | 
					 | 
				
			||||||
  make_tuple(8, 8, sad_8x8_sse2_vp9),
 | 
					 | 
				
			||||||
  make_tuple(8, 4, sad_8x4_sse2_vp9),
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(SSE2, SADTest, ::testing::ValuesIn(sse2_tests));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if CONFIG_VP9_ENCODER
 | 
					 | 
				
			||||||
#if CONFIG_USE_X86INC
 | 
					 | 
				
			||||||
const sad_n_by_n_by_4_fn_t sad_64x64x4d_sse2 = vp9_sad64x64x4d_sse2;
 | 
					 | 
				
			||||||
const sad_n_by_n_by_4_fn_t sad_64x32x4d_sse2 = vp9_sad64x32x4d_sse2;
 | 
					 | 
				
			||||||
const sad_n_by_n_by_4_fn_t sad_32x64x4d_sse2 = vp9_sad32x64x4d_sse2;
 | 
					 | 
				
			||||||
const sad_n_by_n_by_4_fn_t sad_32x32x4d_sse2 = vp9_sad32x32x4d_sse2;
 | 
					 | 
				
			||||||
const sad_n_by_n_by_4_fn_t sad_32x16x4d_sse2 = vp9_sad32x16x4d_sse2;
 | 
					 | 
				
			||||||
const sad_n_by_n_by_4_fn_t sad_16x32x4d_sse2 = vp9_sad16x32x4d_sse2;
 | 
					 | 
				
			||||||
const sad_n_by_n_by_4_fn_t sad_16x16x4d_sse2 = vp9_sad16x16x4d_sse2;
 | 
					 | 
				
			||||||
const sad_n_by_n_by_4_fn_t sad_16x8x4d_sse2 = vp9_sad16x8x4d_sse2;
 | 
					 | 
				
			||||||
const sad_n_by_n_by_4_fn_t sad_8x16x4d_sse2 = vp9_sad8x16x4d_sse2;
 | 
					 | 
				
			||||||
const sad_n_by_n_by_4_fn_t sad_8x8x4d_sse2 = vp9_sad8x8x4d_sse2;
 | 
					 | 
				
			||||||
const sad_n_by_n_by_4_fn_t sad_8x4x4d_sse2 = vp9_sad8x4x4d_sse2;
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(SSE2, SADx4Test, ::testing::Values(
 | 
					 | 
				
			||||||
                        make_tuple(64, 64, sad_64x64x4d_sse2),
 | 
					 | 
				
			||||||
                        make_tuple(64, 32, sad_64x32x4d_sse2),
 | 
					 | 
				
			||||||
                        make_tuple(32, 64, sad_32x64x4d_sse2),
 | 
					 | 
				
			||||||
                        make_tuple(32, 32, sad_32x32x4d_sse2),
 | 
					 | 
				
			||||||
                        make_tuple(32, 16, sad_32x16x4d_sse2),
 | 
					 | 
				
			||||||
                        make_tuple(16, 32, sad_16x32x4d_sse2),
 | 
					 | 
				
			||||||
                        make_tuple(16, 16, sad_16x16x4d_sse2),
 | 
					 | 
				
			||||||
                        make_tuple(16, 8, sad_16x8x4d_sse2),
 | 
					 | 
				
			||||||
                        make_tuple(8, 16, sad_8x16x4d_sse2),
 | 
					 | 
				
			||||||
                        make_tuple(8, 8, sad_8x8x4d_sse2),
 | 
					 | 
				
			||||||
                        make_tuple(8, 4, sad_8x4x4d_sse2)));
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if HAVE_SSE3
 | 
					 | 
				
			||||||
#if CONFIG_VP8_ENCODER
 | 
					 | 
				
			||||||
const sad_n_by_n_by_4_fn_t sad_16x16x4d_sse3 = vp8_sad16x16x4d_sse3;
 | 
					 | 
				
			||||||
const sad_n_by_n_by_4_fn_t sad_16x8x4d_sse3 = vp8_sad16x8x4d_sse3;
 | 
					 | 
				
			||||||
const sad_n_by_n_by_4_fn_t sad_8x16x4d_sse3 = vp8_sad8x16x4d_sse3;
 | 
					 | 
				
			||||||
const sad_n_by_n_by_4_fn_t sad_8x8x4d_sse3 = vp8_sad8x8x4d_sse3;
 | 
					 | 
				
			||||||
const sad_n_by_n_by_4_fn_t sad_4x4x4d_sse3 = vp8_sad4x4x4d_sse3;
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(SSE3, SADx4Test, ::testing::Values(
 | 
					 | 
				
			||||||
                        make_tuple(16, 16, sad_16x16x4d_sse3),
 | 
					 | 
				
			||||||
                        make_tuple(16, 8, sad_16x8x4d_sse3),
 | 
					 | 
				
			||||||
                        make_tuple(8, 16, sad_8x16x4d_sse3),
 | 
					 | 
				
			||||||
                        make_tuple(8, 8, sad_8x8x4d_sse3),
 | 
					 | 
				
			||||||
                        make_tuple(4, 4, sad_4x4x4d_sse3)));
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if HAVE_SSSE3
 | 
					 | 
				
			||||||
#if CONFIG_USE_X86INC
 | 
					 | 
				
			||||||
const sad_m_by_n_fn_t sad_16x16_sse3 = vp8_sad16x16_sse3;
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(SSE3, SADTest, ::testing::Values(
 | 
					 | 
				
			||||||
                        make_tuple(16, 16, sad_16x16_sse3)));
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}  // namespace
 | 
					 | 
				
			||||||
							
								
								
									
										186
									
								
								test/set_roi.cc
									
									
									
									
									
								
							
							
						
						
									
										186
									
								
								test/set_roi.cc
									
									
									
									
									
								
							@@ -1,186 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *  Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
 *  that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
 *  tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
 *  in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
 *  be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <math.h>
 | 
					 | 
				
			||||||
#include <stddef.h>
 | 
					 | 
				
			||||||
#include <stdio.h>
 | 
					 | 
				
			||||||
#include <stdlib.h>
 | 
					 | 
				
			||||||
#include <string.h>
 | 
					 | 
				
			||||||
#include <sys/types.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "third_party/googletest/src/include/gtest/gtest.h"
 | 
					 | 
				
			||||||
#include "test/acm_random.h"
 | 
					 | 
				
			||||||
#include "vpx/vpx_integer.h"
 | 
					 | 
				
			||||||
#include "vpx_mem/vpx_mem.h"
 | 
					 | 
				
			||||||
extern "C" {
 | 
					 | 
				
			||||||
#include "vp8/encoder/onyx_int.h"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
using libvpx_test::ACMRandom;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST(Vp8RoiMapTest, ParameterCheck) {
 | 
					 | 
				
			||||||
  ACMRandom rnd(ACMRandom::DeterministicSeed());
 | 
					 | 
				
			||||||
  int delta_q[MAX_MB_SEGMENTS] = { -2, -25, 0, 31 };
 | 
					 | 
				
			||||||
  int delta_lf[MAX_MB_SEGMENTS] = { -2, -25, 0, 31 };
 | 
					 | 
				
			||||||
  unsigned int threshold[MAX_MB_SEGMENTS] = { 0, 100, 200, 300 };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  const int internalq_trans[] = {
 | 
					 | 
				
			||||||
    0,   1,  2,  3,  4,  5,  7,  8,
 | 
					 | 
				
			||||||
    9,  10, 12, 13, 15, 17, 18, 19,
 | 
					 | 
				
			||||||
    20,  21, 23, 24, 25, 26, 27, 28,
 | 
					 | 
				
			||||||
    29,  30, 31, 33, 35, 37, 39, 41,
 | 
					 | 
				
			||||||
    43,  45, 47, 49, 51, 53, 55, 57,
 | 
					 | 
				
			||||||
    59,  61, 64, 67, 70, 73, 76, 79,
 | 
					 | 
				
			||||||
    82,  85, 88, 91, 94, 97, 100, 103,
 | 
					 | 
				
			||||||
    106, 109, 112, 115, 118, 121, 124, 127,
 | 
					 | 
				
			||||||
  };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Initialize elements of cpi with valid defaults.
 | 
					 | 
				
			||||||
  VP8_COMP cpi;
 | 
					 | 
				
			||||||
  cpi.mb.e_mbd.mb_segement_abs_delta = SEGMENT_DELTADATA;
 | 
					 | 
				
			||||||
  cpi.cyclic_refresh_mode_enabled = 0;
 | 
					 | 
				
			||||||
  cpi.mb.e_mbd.segmentation_enabled = 0;
 | 
					 | 
				
			||||||
  cpi.mb.e_mbd.update_mb_segmentation_map = 0;
 | 
					 | 
				
			||||||
  cpi.mb.e_mbd.update_mb_segmentation_data = 0;
 | 
					 | 
				
			||||||
  cpi.common.mb_rows = 240 >> 4;
 | 
					 | 
				
			||||||
  cpi.common.mb_cols = 320 >> 4;
 | 
					 | 
				
			||||||
  const int mbs = (cpi.common.mb_rows * cpi.common.mb_cols);
 | 
					 | 
				
			||||||
  vpx_memset(cpi.segment_feature_data, 0, sizeof(cpi.segment_feature_data));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Segment map
 | 
					 | 
				
			||||||
  cpi.segmentation_map = reinterpret_cast<unsigned char *>(vpx_calloc(mbs, 1));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Allocate memory for the source memory map.
 | 
					 | 
				
			||||||
  unsigned char *roi_map =
 | 
					 | 
				
			||||||
    reinterpret_cast<unsigned char *>(vpx_calloc(mbs, 1));
 | 
					 | 
				
			||||||
  vpx_memset(&roi_map[mbs >> 2], 1, (mbs >> 2));
 | 
					 | 
				
			||||||
  vpx_memset(&roi_map[mbs >> 1], 2, (mbs >> 2));
 | 
					 | 
				
			||||||
  vpx_memset(&roi_map[mbs -(mbs >> 2)], 3, (mbs >> 2));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Do a test call with valid parameters.
 | 
					 | 
				
			||||||
  int roi_retval = vp8_set_roimap(&cpi, roi_map, cpi.common.mb_rows,
 | 
					 | 
				
			||||||
                                  cpi.common.mb_cols, delta_q, delta_lf,
 | 
					 | 
				
			||||||
                                  threshold);
 | 
					 | 
				
			||||||
  EXPECT_EQ(0, roi_retval)
 | 
					 | 
				
			||||||
        << "vp8_set_roimap roi failed with default test parameters";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Check that the values in the cpi structure get set as expected.
 | 
					 | 
				
			||||||
  if (roi_retval == 0) {
 | 
					 | 
				
			||||||
    // Check that the segment map got set.
 | 
					 | 
				
			||||||
    const int mapcompare = memcmp(roi_map, cpi.segmentation_map, mbs);
 | 
					 | 
				
			||||||
    EXPECT_EQ(0, mapcompare) << "segment map error";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Check the q deltas (note the need to translate into
 | 
					 | 
				
			||||||
    // the interanl range of 0-127.
 | 
					 | 
				
			||||||
    for (int i = 0; i < MAX_MB_SEGMENTS; ++i) {
 | 
					 | 
				
			||||||
      const int transq = internalq_trans[abs(delta_q[i])];
 | 
					 | 
				
			||||||
      if (abs(cpi.segment_feature_data[MB_LVL_ALT_Q][i]) != transq) {
 | 
					 | 
				
			||||||
          EXPECT_EQ(transq, cpi.segment_feature_data[MB_LVL_ALT_Q][i])
 | 
					 | 
				
			||||||
                    << "segment delta_q  error";
 | 
					 | 
				
			||||||
          break;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Check the loop filter deltas
 | 
					 | 
				
			||||||
    for (int i = 0; i < MAX_MB_SEGMENTS; ++i) {
 | 
					 | 
				
			||||||
      if (cpi.segment_feature_data[MB_LVL_ALT_LF][i] != delta_lf[i]) {
 | 
					 | 
				
			||||||
        EXPECT_EQ(delta_lf[i], cpi.segment_feature_data[MB_LVL_ALT_LF][i])
 | 
					 | 
				
			||||||
                  << "segment delta_lf error";
 | 
					 | 
				
			||||||
        break;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Check the breakout thresholds
 | 
					 | 
				
			||||||
    for (int i = 0; i < MAX_MB_SEGMENTS; ++i) {
 | 
					 | 
				
			||||||
      unsigned int breakout =
 | 
					 | 
				
			||||||
        static_cast<unsigned int>(cpi.segment_encode_breakout[i]);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      if (threshold[i] != breakout) {
 | 
					 | 
				
			||||||
        EXPECT_EQ(threshold[i], breakout)
 | 
					 | 
				
			||||||
                  << "breakout threshold error";
 | 
					 | 
				
			||||||
        break;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Segmentation, and segmentation update flages should be set.
 | 
					 | 
				
			||||||
    EXPECT_EQ(1, cpi.mb.e_mbd.segmentation_enabled)
 | 
					 | 
				
			||||||
              << "segmentation_enabled error";
 | 
					 | 
				
			||||||
    EXPECT_EQ(1, cpi.mb.e_mbd.update_mb_segmentation_map)
 | 
					 | 
				
			||||||
              << "update_mb_segmentation_map error";
 | 
					 | 
				
			||||||
    EXPECT_EQ(1, cpi.mb.e_mbd.update_mb_segmentation_data)
 | 
					 | 
				
			||||||
              << "update_mb_segmentation_data error";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Try a range of delta q and lf parameters (some legal, some not)
 | 
					 | 
				
			||||||
    for (int i = 0; i < 1000; ++i) {
 | 
					 | 
				
			||||||
      int rand_deltas[4];
 | 
					 | 
				
			||||||
      int deltas_valid;
 | 
					 | 
				
			||||||
      rand_deltas[0] = rnd(160) - 80;
 | 
					 | 
				
			||||||
      rand_deltas[1] = rnd(160) - 80;
 | 
					 | 
				
			||||||
      rand_deltas[2] = rnd(160) - 80;
 | 
					 | 
				
			||||||
      rand_deltas[3] = rnd(160) - 80;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      deltas_valid = ((abs(rand_deltas[0]) <= 63) &&
 | 
					 | 
				
			||||||
                      (abs(rand_deltas[1]) <= 63) &&
 | 
					 | 
				
			||||||
                      (abs(rand_deltas[2]) <= 63) &&
 | 
					 | 
				
			||||||
                      (abs(rand_deltas[3]) <= 63)) ? 0 : -1;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      // Test with random delta q values.
 | 
					 | 
				
			||||||
      roi_retval = vp8_set_roimap(&cpi, roi_map, cpi.common.mb_rows,
 | 
					 | 
				
			||||||
                                  cpi.common.mb_cols, rand_deltas,
 | 
					 | 
				
			||||||
                                  delta_lf, threshold);
 | 
					 | 
				
			||||||
      EXPECT_EQ(deltas_valid, roi_retval) << "dq range check error";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      // One delta_q error shown at a time
 | 
					 | 
				
			||||||
      if (deltas_valid != roi_retval)
 | 
					 | 
				
			||||||
        break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      // Test with random loop filter values.
 | 
					 | 
				
			||||||
      roi_retval = vp8_set_roimap(&cpi, roi_map, cpi.common.mb_rows,
 | 
					 | 
				
			||||||
                                  cpi.common.mb_cols, delta_q,
 | 
					 | 
				
			||||||
                                  rand_deltas, threshold);
 | 
					 | 
				
			||||||
      EXPECT_EQ(deltas_valid, roi_retval) << "dlf range check error";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      // One delta loop filter error shown at a time
 | 
					 | 
				
			||||||
      if (deltas_valid != roi_retval)
 | 
					 | 
				
			||||||
        break;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Test that we report and error if cyclic refresh is enabled.
 | 
					 | 
				
			||||||
    cpi.cyclic_refresh_mode_enabled = 1;
 | 
					 | 
				
			||||||
    roi_retval = vp8_set_roimap(&cpi, roi_map, cpi.common.mb_rows,
 | 
					 | 
				
			||||||
                                cpi.common.mb_cols, delta_q,
 | 
					 | 
				
			||||||
                                delta_lf, threshold);
 | 
					 | 
				
			||||||
    EXPECT_EQ(-1, roi_retval) << "cyclic refresh check error";
 | 
					 | 
				
			||||||
    cpi.cyclic_refresh_mode_enabled = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Test invalid number of rows or colums.
 | 
					 | 
				
			||||||
    roi_retval = vp8_set_roimap(&cpi, roi_map, cpi.common.mb_rows + 1,
 | 
					 | 
				
			||||||
                                cpi.common.mb_cols, delta_q,
 | 
					 | 
				
			||||||
                                delta_lf, threshold);
 | 
					 | 
				
			||||||
    EXPECT_EQ(-1, roi_retval) << "MB rows bounds check error";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    roi_retval = vp8_set_roimap(&cpi, roi_map, cpi.common.mb_rows,
 | 
					 | 
				
			||||||
                                cpi.common.mb_cols - 1, delta_q,
 | 
					 | 
				
			||||||
                                delta_lf, threshold);
 | 
					 | 
				
			||||||
    EXPECT_EQ(-1, roi_retval) << "MB cols bounds check error";
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Free allocated memory
 | 
					 | 
				
			||||||
  if (cpi.segmentation_map)
 | 
					 | 
				
			||||||
    vpx_free(cpi.segmentation_map);
 | 
					 | 
				
			||||||
  if (roi_map)
 | 
					 | 
				
			||||||
    vpx_free(roi_map);
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}  // namespace
 | 
					 | 
				
			||||||
@@ -1,229 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
*  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
*
 | 
					 | 
				
			||||||
*  Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
*  that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
*  tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
*  in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
*  be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <math.h>
 | 
					 | 
				
			||||||
#include <stdlib.h>
 | 
					 | 
				
			||||||
#include <string.h>
 | 
					 | 
				
			||||||
#include "test/acm_random.h"
 | 
					 | 
				
			||||||
#include "test/clear_system_state.h"
 | 
					 | 
				
			||||||
#include "test/register_state_check.h"
 | 
					 | 
				
			||||||
#include "test/util.h"
 | 
					 | 
				
			||||||
#include "third_party/googletest/src/include/gtest/gtest.h"
 | 
					 | 
				
			||||||
extern "C" {
 | 
					 | 
				
			||||||
#include "./vpx_config.h"
 | 
					 | 
				
			||||||
#include "./vp8_rtcd.h"
 | 
					 | 
				
			||||||
#include "vpx/vpx_integer.h"
 | 
					 | 
				
			||||||
#include "vpx_mem/vpx_mem.h"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef void (*sixtap_predict_fn_t)(uint8_t *src_ptr,
 | 
					 | 
				
			||||||
                                    int  src_pixels_per_line,
 | 
					 | 
				
			||||||
                                    int  xoffset,
 | 
					 | 
				
			||||||
                                    int  yoffset,
 | 
					 | 
				
			||||||
                                    uint8_t *dst_ptr,
 | 
					 | 
				
			||||||
                                    int  dst_pitch);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class SixtapPredictTest : public PARAMS(int, int, sixtap_predict_fn_t) {
 | 
					 | 
				
			||||||
 public:
 | 
					 | 
				
			||||||
  static void SetUpTestCase() {
 | 
					 | 
				
			||||||
    src_ = reinterpret_cast<uint8_t*>(vpx_memalign(kDataAlignment, kSrcSize));
 | 
					 | 
				
			||||||
    dst_ = reinterpret_cast<uint8_t*>(vpx_memalign(kDataAlignment, kDstSize));
 | 
					 | 
				
			||||||
    dst_c_ = reinterpret_cast<uint8_t*>(vpx_memalign(kDataAlignment, kDstSize));
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  static void TearDownTestCase() {
 | 
					 | 
				
			||||||
    vpx_free(src_);
 | 
					 | 
				
			||||||
    src_ = NULL;
 | 
					 | 
				
			||||||
    vpx_free(dst_);
 | 
					 | 
				
			||||||
    dst_ = NULL;
 | 
					 | 
				
			||||||
    vpx_free(dst_c_);
 | 
					 | 
				
			||||||
    dst_c_ = NULL;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void TearDown() {
 | 
					 | 
				
			||||||
    libvpx_test::ClearSystemState();
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  // Make test arrays big enough for 16x16 functions. Six-tap filters
 | 
					 | 
				
			||||||
  // need 5 extra pixels outside of the macroblock.
 | 
					 | 
				
			||||||
  static const int kSrcStride = 21;
 | 
					 | 
				
			||||||
  static const int kDstStride = 16;
 | 
					 | 
				
			||||||
  static const int kDataAlignment = 16;
 | 
					 | 
				
			||||||
  static const int kSrcSize = kSrcStride * kSrcStride + 1;
 | 
					 | 
				
			||||||
  static const int kDstSize = kDstStride * kDstStride;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void SetUp() {
 | 
					 | 
				
			||||||
    width_ = GET_PARAM(0);
 | 
					 | 
				
			||||||
    height_ = GET_PARAM(1);
 | 
					 | 
				
			||||||
    sixtap_predict_ = GET_PARAM(2);
 | 
					 | 
				
			||||||
    memset(src_, 0, kSrcSize);
 | 
					 | 
				
			||||||
    memset(dst_, 0, kDstSize);
 | 
					 | 
				
			||||||
    memset(dst_c_, 0, kDstSize);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  int width_;
 | 
					 | 
				
			||||||
  int height_;
 | 
					 | 
				
			||||||
  sixtap_predict_fn_t sixtap_predict_;
 | 
					 | 
				
			||||||
  // The src stores the macroblock we will filter on, and makes it 1 byte larger
 | 
					 | 
				
			||||||
  // in order to test unaligned access. The result is stored in dst and dst_c(c
 | 
					 | 
				
			||||||
  // reference code result).
 | 
					 | 
				
			||||||
  static uint8_t* src_;
 | 
					 | 
				
			||||||
  static uint8_t* dst_;
 | 
					 | 
				
			||||||
  static uint8_t* dst_c_;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t* SixtapPredictTest::src_ = NULL;
 | 
					 | 
				
			||||||
uint8_t* SixtapPredictTest::dst_ = NULL;
 | 
					 | 
				
			||||||
uint8_t* SixtapPredictTest::dst_c_ = NULL;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(SixtapPredictTest, TestWithPresetData) {
 | 
					 | 
				
			||||||
  // Test input
 | 
					 | 
				
			||||||
  static const uint8_t test_data[kSrcSize] = {
 | 
					 | 
				
			||||||
    216, 184, 4, 191, 82, 92, 41, 0, 1, 226, 236, 172, 20, 182, 42, 226, 177,
 | 
					 | 
				
			||||||
    79, 94, 77, 179, 203, 206, 198, 22, 192, 19, 75, 17, 192, 44, 233, 120,
 | 
					 | 
				
			||||||
    48, 168, 203, 141, 210, 203, 143, 180, 184, 59, 201, 110, 102, 171, 32,
 | 
					 | 
				
			||||||
    182, 10, 109, 105, 213, 60, 47, 236, 253, 67, 55, 14, 3, 99, 247, 124,
 | 
					 | 
				
			||||||
    148, 159, 71, 34, 114, 19, 177, 38, 203, 237, 239, 58, 83, 155, 91, 10,
 | 
					 | 
				
			||||||
    166, 201, 115, 124, 5, 163, 104, 2, 231, 160, 16, 234, 4, 8, 103, 153,
 | 
					 | 
				
			||||||
    167, 174, 187, 26, 193, 109, 64, 141, 90, 48, 200, 174, 204, 36, 184,
 | 
					 | 
				
			||||||
    114, 237, 43, 238, 242, 207, 86, 245, 182, 247, 6, 161, 251, 14, 8, 148,
 | 
					 | 
				
			||||||
    182, 182, 79, 208, 120, 188, 17, 6, 23, 65, 206, 197, 13, 242, 126, 128,
 | 
					 | 
				
			||||||
    224, 170, 110, 211, 121, 197, 200, 47, 188, 207, 208, 184, 221, 216, 76,
 | 
					 | 
				
			||||||
    148, 143, 156, 100, 8, 89, 117, 14, 112, 183, 221, 54, 197, 208, 180, 69,
 | 
					 | 
				
			||||||
    176, 94, 180, 131, 215, 121, 76, 7, 54, 28, 216, 238, 249, 176, 58, 142,
 | 
					 | 
				
			||||||
    64, 215, 242, 72, 49, 104, 87, 161, 32, 52, 216, 230, 4, 141, 44, 181,
 | 
					 | 
				
			||||||
    235, 224, 57, 195, 89, 134, 203, 144, 162, 163, 126, 156, 84, 185, 42,
 | 
					 | 
				
			||||||
    148, 145, 29, 221, 194, 134, 52, 100, 166, 105, 60, 140, 110, 201, 184,
 | 
					 | 
				
			||||||
    35, 181, 153, 93, 121, 243, 227, 68, 131, 134, 232, 2, 35, 60, 187, 77,
 | 
					 | 
				
			||||||
    209, 76, 106, 174, 15, 241, 227, 115, 151, 77, 175, 36, 187, 121, 221,
 | 
					 | 
				
			||||||
    223, 47, 118, 61, 168, 105, 32, 237, 236, 167, 213, 238, 202, 17, 170,
 | 
					 | 
				
			||||||
    24, 226, 247, 131, 145, 6, 116, 117, 121, 11, 194, 41, 48, 126, 162, 13,
 | 
					 | 
				
			||||||
    93, 209, 131, 154, 122, 237, 187, 103, 217, 99, 60, 200, 45, 78, 115, 69,
 | 
					 | 
				
			||||||
    49, 106, 200, 194, 112, 60, 56, 234, 72, 251, 19, 120, 121, 182, 134, 215,
 | 
					 | 
				
			||||||
    135, 10, 114, 2, 247, 46, 105, 209, 145, 165, 153, 191, 243, 12, 5, 36,
 | 
					 | 
				
			||||||
    119, 206, 231, 231, 11, 32, 209, 83, 27, 229, 204, 149, 155, 83, 109, 35,
 | 
					 | 
				
			||||||
    93, 223, 37, 84, 14, 142, 37, 160, 52, 191, 96, 40, 204, 101, 77, 67, 52,
 | 
					 | 
				
			||||||
    53, 43, 63, 85, 253, 147, 113, 226, 96, 6, 125, 179, 115, 161, 17, 83,
 | 
					 | 
				
			||||||
    198, 101, 98, 85, 139, 3, 137, 75, 99, 178, 23, 201, 255, 91, 253, 52,
 | 
					 | 
				
			||||||
    134, 60, 138, 131, 208, 251, 101, 48, 2, 227, 228, 118, 132, 245, 202,
 | 
					 | 
				
			||||||
    75, 91, 44, 160, 231, 47, 41, 50, 147, 220, 74, 92, 219, 165, 89, 16
 | 
					 | 
				
			||||||
  };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Expected result
 | 
					 | 
				
			||||||
  static const uint8_t expected_dst[kDstSize] = {
 | 
					 | 
				
			||||||
    117, 102, 74, 135, 42, 98, 175, 206, 70, 73, 222, 197, 50, 24, 39, 49, 38,
 | 
					 | 
				
			||||||
    105, 90, 47, 169, 40, 171, 215, 200, 73, 109, 141, 53, 85, 177, 164, 79,
 | 
					 | 
				
			||||||
    208, 124, 89, 212, 18, 81, 145, 151, 164, 217, 153, 91, 154, 102, 102,
 | 
					 | 
				
			||||||
    159, 75, 164, 152, 136, 51, 213, 219, 186, 116, 193, 224, 186, 36, 231,
 | 
					 | 
				
			||||||
    208, 84, 211, 155, 167, 35, 59, 42, 76, 216, 149, 73, 201, 78, 149, 184,
 | 
					 | 
				
			||||||
    100, 96, 196, 189, 198, 188, 235, 195, 117, 129, 120, 129, 49, 25, 133,
 | 
					 | 
				
			||||||
    113, 69, 221, 114, 70, 143, 99, 157, 108, 189, 140, 78, 6, 55, 65, 240,
 | 
					 | 
				
			||||||
    255, 245, 184, 72, 90, 100, 116, 131, 39, 60, 234, 167, 33, 160, 88, 185,
 | 
					 | 
				
			||||||
    200, 157, 159, 176, 127, 151, 138, 102, 168, 106, 170, 86, 82, 219, 189,
 | 
					 | 
				
			||||||
    76, 33, 115, 197, 106, 96, 198, 136, 97, 141, 237, 151, 98, 137, 191,
 | 
					 | 
				
			||||||
    185, 2, 57, 95, 142, 91, 255, 185, 97, 137, 76, 162, 94, 173, 131, 193,
 | 
					 | 
				
			||||||
    161, 81, 106, 72, 135, 222, 234, 137, 66, 137, 106, 243, 210, 147, 95,
 | 
					 | 
				
			||||||
    15, 137, 110, 85, 66, 16, 96, 167, 147, 150, 173, 203, 140, 118, 196,
 | 
					 | 
				
			||||||
    84, 147, 160, 19, 95, 101, 123, 74, 132, 202, 82, 166, 12, 131, 166,
 | 
					 | 
				
			||||||
    189, 170, 159, 85, 79, 66, 57, 152, 132, 203, 194, 0, 1, 56, 146, 180,
 | 
					 | 
				
			||||||
    224, 156, 28, 83, 181, 79, 76, 80, 46, 160, 175, 59, 106, 43, 87, 75,
 | 
					 | 
				
			||||||
    136, 85, 189, 46, 71, 200, 90
 | 
					 | 
				
			||||||
  };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  uint8_t *src = const_cast<uint8_t*>(test_data);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  REGISTER_STATE_CHECK(sixtap_predict_(&src[kSrcStride * 2 + 2 + 1], kSrcStride,
 | 
					 | 
				
			||||||
                                       2, 2, dst_, kDstStride));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  for (int i = 0; i < height_; ++i)
 | 
					 | 
				
			||||||
    for (int j = 0; j < width_; ++j)
 | 
					 | 
				
			||||||
      ASSERT_EQ(expected_dst[i * kDstStride + j], dst_[i * kDstStride + j])
 | 
					 | 
				
			||||||
          << "i==" << (i * width_ + j);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
using libvpx_test::ACMRandom;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(SixtapPredictTest, TestWithRandomData) {
 | 
					 | 
				
			||||||
  ACMRandom rnd(ACMRandom::DeterministicSeed());
 | 
					 | 
				
			||||||
  for (int i = 0; i < kSrcSize; ++i)
 | 
					 | 
				
			||||||
    src_[i] = rnd.Rand8();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Run tests for all possible offsets.
 | 
					 | 
				
			||||||
  for (int xoffset = 0; xoffset < 8; ++xoffset) {
 | 
					 | 
				
			||||||
    for (int yoffset = 0; yoffset < 8; ++yoffset) {
 | 
					 | 
				
			||||||
      // Call c reference function.
 | 
					 | 
				
			||||||
      // Move start point to next pixel to test if the function reads
 | 
					 | 
				
			||||||
      // unaligned data correctly.
 | 
					 | 
				
			||||||
      vp8_sixtap_predict16x16_c(&src_[kSrcStride * 2 + 2 + 1], kSrcStride,
 | 
					 | 
				
			||||||
                                xoffset, yoffset, dst_c_, kDstStride);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      // Run test.
 | 
					 | 
				
			||||||
      REGISTER_STATE_CHECK(
 | 
					 | 
				
			||||||
          sixtap_predict_(&src_[kSrcStride * 2 + 2 + 1], kSrcStride,
 | 
					 | 
				
			||||||
                          xoffset, yoffset, dst_, kDstStride));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      for (int i = 0; i < height_; ++i)
 | 
					 | 
				
			||||||
        for (int j = 0; j < width_; ++j)
 | 
					 | 
				
			||||||
          ASSERT_EQ(dst_c_[i * kDstStride + j], dst_[i * kDstStride + j])
 | 
					 | 
				
			||||||
              << "i==" << (i * width_ + j);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
using std::tr1::make_tuple;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const sixtap_predict_fn_t sixtap_16x16_c = vp8_sixtap_predict16x16_c;
 | 
					 | 
				
			||||||
const sixtap_predict_fn_t sixtap_8x8_c = vp8_sixtap_predict8x8_c;
 | 
					 | 
				
			||||||
const sixtap_predict_fn_t sixtap_8x4_c = vp8_sixtap_predict8x4_c;
 | 
					 | 
				
			||||||
const sixtap_predict_fn_t sixtap_4x4_c = vp8_sixtap_predict4x4_c;
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(
 | 
					 | 
				
			||||||
    C, SixtapPredictTest, ::testing::Values(
 | 
					 | 
				
			||||||
        make_tuple(16, 16, sixtap_16x16_c),
 | 
					 | 
				
			||||||
        make_tuple(8, 8, sixtap_8x8_c),
 | 
					 | 
				
			||||||
        make_tuple(8, 4, sixtap_8x4_c),
 | 
					 | 
				
			||||||
        make_tuple(4, 4, sixtap_4x4_c)));
 | 
					 | 
				
			||||||
#if HAVE_MMX
 | 
					 | 
				
			||||||
const sixtap_predict_fn_t sixtap_16x16_mmx = vp8_sixtap_predict16x16_mmx;
 | 
					 | 
				
			||||||
const sixtap_predict_fn_t sixtap_8x8_mmx = vp8_sixtap_predict8x8_mmx;
 | 
					 | 
				
			||||||
const sixtap_predict_fn_t sixtap_8x4_mmx = vp8_sixtap_predict8x4_mmx;
 | 
					 | 
				
			||||||
const sixtap_predict_fn_t sixtap_4x4_mmx = vp8_sixtap_predict4x4_mmx;
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(
 | 
					 | 
				
			||||||
    MMX, SixtapPredictTest, ::testing::Values(
 | 
					 | 
				
			||||||
        make_tuple(16, 16, sixtap_16x16_mmx),
 | 
					 | 
				
			||||||
        make_tuple(8, 8, sixtap_8x8_mmx),
 | 
					 | 
				
			||||||
        make_tuple(8, 4, sixtap_8x4_mmx),
 | 
					 | 
				
			||||||
        make_tuple(4, 4, sixtap_4x4_mmx)));
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#if HAVE_SSE2
 | 
					 | 
				
			||||||
const sixtap_predict_fn_t sixtap_16x16_sse2 = vp8_sixtap_predict16x16_sse2;
 | 
					 | 
				
			||||||
const sixtap_predict_fn_t sixtap_8x8_sse2 = vp8_sixtap_predict8x8_sse2;
 | 
					 | 
				
			||||||
const sixtap_predict_fn_t sixtap_8x4_sse2 = vp8_sixtap_predict8x4_sse2;
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(
 | 
					 | 
				
			||||||
    SSE2, SixtapPredictTest, ::testing::Values(
 | 
					 | 
				
			||||||
        make_tuple(16, 16, sixtap_16x16_sse2),
 | 
					 | 
				
			||||||
        make_tuple(8, 8, sixtap_8x8_sse2),
 | 
					 | 
				
			||||||
        make_tuple(8, 4, sixtap_8x4_sse2)));
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#if HAVE_SSSE3
 | 
					 | 
				
			||||||
const sixtap_predict_fn_t sixtap_16x16_ssse3 = vp8_sixtap_predict16x16_ssse3;
 | 
					 | 
				
			||||||
const sixtap_predict_fn_t sixtap_8x8_ssse3 = vp8_sixtap_predict8x8_ssse3;
 | 
					 | 
				
			||||||
const sixtap_predict_fn_t sixtap_8x4_ssse3 = vp8_sixtap_predict8x4_ssse3;
 | 
					 | 
				
			||||||
const sixtap_predict_fn_t sixtap_4x4_ssse3 = vp8_sixtap_predict4x4_ssse3;
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(
 | 
					 | 
				
			||||||
    SSSE3, SixtapPredictTest, ::testing::Values(
 | 
					 | 
				
			||||||
        make_tuple(16, 16, sixtap_16x16_ssse3),
 | 
					 | 
				
			||||||
        make_tuple(8, 8, sixtap_8x8_ssse3),
 | 
					 | 
				
			||||||
        make_tuple(8, 4, sixtap_8x4_ssse3),
 | 
					 | 
				
			||||||
        make_tuple(4, 4, sixtap_4x4_ssse3)));
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}  // namespace
 | 
					 | 
				
			||||||
@@ -1,120 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *  Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
 *  that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
 *  tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
 *  in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
 *  be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "third_party/googletest/src/include/gtest/gtest.h"
 | 
					 | 
				
			||||||
#include "test/acm_random.h"
 | 
					 | 
				
			||||||
#include "test/clear_system_state.h"
 | 
					 | 
				
			||||||
#include "test/register_state_check.h"
 | 
					 | 
				
			||||||
extern "C" {
 | 
					 | 
				
			||||||
#include "./vpx_config.h"
 | 
					 | 
				
			||||||
#include "./vp8_rtcd.h"
 | 
					 | 
				
			||||||
#include "vp8/common/blockd.h"
 | 
					 | 
				
			||||||
#include "vp8/encoder/block.h"
 | 
					 | 
				
			||||||
#include "vpx_mem/vpx_mem.h"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef void (*subtract_b_fn_t)(BLOCK *be, BLOCKD *bd, int pitch);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class SubtractBlockTest : public ::testing::TestWithParam<subtract_b_fn_t> {
 | 
					 | 
				
			||||||
 public:
 | 
					 | 
				
			||||||
  virtual void TearDown() {
 | 
					 | 
				
			||||||
    libvpx_test::ClearSystemState();
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
using libvpx_test::ACMRandom;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(SubtractBlockTest, SimpleSubtract) {
 | 
					 | 
				
			||||||
  ACMRandom rnd(ACMRandom::DeterministicSeed());
 | 
					 | 
				
			||||||
  BLOCK be;
 | 
					 | 
				
			||||||
  BLOCKD bd;
 | 
					 | 
				
			||||||
  // in libvpx, this stride is always 16
 | 
					 | 
				
			||||||
  const int kDiffPredStride = 16;
 | 
					 | 
				
			||||||
  const int kSrcStride[] = {32, 16, 8, 4, 0};
 | 
					 | 
				
			||||||
  const int kBlockWidth = 4;
 | 
					 | 
				
			||||||
  const int kBlockHeight = 4;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Allocate... align to 16 for mmx/sse tests
 | 
					 | 
				
			||||||
  uint8_t *source = reinterpret_cast<uint8_t*>(
 | 
					 | 
				
			||||||
      vpx_memalign(16, kBlockHeight * kSrcStride[0] * sizeof(*source)));
 | 
					 | 
				
			||||||
  be.src_diff = reinterpret_cast<int16_t*>(
 | 
					 | 
				
			||||||
      vpx_memalign(16, kBlockHeight * kDiffPredStride * sizeof(*be.src_diff)));
 | 
					 | 
				
			||||||
  bd.predictor = reinterpret_cast<unsigned char*>(
 | 
					 | 
				
			||||||
      vpx_memalign(16, kBlockHeight * kDiffPredStride * sizeof(*bd.predictor)));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  for (int i = 0; kSrcStride[i] > 0; ++i) {
 | 
					 | 
				
			||||||
    // start at block0
 | 
					 | 
				
			||||||
    be.src = 0;
 | 
					 | 
				
			||||||
    be.base_src = &source;
 | 
					 | 
				
			||||||
    be.src_stride = kSrcStride[i];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // set difference
 | 
					 | 
				
			||||||
    int16_t *src_diff = be.src_diff;
 | 
					 | 
				
			||||||
    for (int r = 0; r < kBlockHeight; ++r) {
 | 
					 | 
				
			||||||
      for (int c = 0; c < kBlockWidth; ++c) {
 | 
					 | 
				
			||||||
        src_diff[c] = static_cast<int16_t>(0xa5a5);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      src_diff += kDiffPredStride;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // set destination
 | 
					 | 
				
			||||||
    uint8_t *base_src = *be.base_src;
 | 
					 | 
				
			||||||
    for (int r = 0; r < kBlockHeight; ++r) {
 | 
					 | 
				
			||||||
      for (int c = 0; c < kBlockWidth; ++c) {
 | 
					 | 
				
			||||||
        base_src[c] = rnd.Rand8();
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      base_src += be.src_stride;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // set predictor
 | 
					 | 
				
			||||||
    uint8_t *predictor = bd.predictor;
 | 
					 | 
				
			||||||
    for (int r = 0; r < kBlockHeight; ++r) {
 | 
					 | 
				
			||||||
      for (int c = 0; c < kBlockWidth; ++c) {
 | 
					 | 
				
			||||||
        predictor[c] = rnd.Rand8();
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      predictor += kDiffPredStride;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    REGISTER_STATE_CHECK(GetParam()(&be, &bd, kDiffPredStride));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    base_src = *be.base_src;
 | 
					 | 
				
			||||||
    src_diff = be.src_diff;
 | 
					 | 
				
			||||||
    predictor = bd.predictor;
 | 
					 | 
				
			||||||
    for (int r = 0; r < kBlockHeight; ++r) {
 | 
					 | 
				
			||||||
      for (int c = 0; c < kBlockWidth; ++c) {
 | 
					 | 
				
			||||||
        EXPECT_EQ(base_src[c], (src_diff[c] + predictor[c])) << "r = " << r
 | 
					 | 
				
			||||||
                                                             << ", c = " << c;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      src_diff += kDiffPredStride;
 | 
					 | 
				
			||||||
      predictor += kDiffPredStride;
 | 
					 | 
				
			||||||
      base_src += be.src_stride;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  vpx_free(be.src_diff);
 | 
					 | 
				
			||||||
  vpx_free(source);
 | 
					 | 
				
			||||||
  vpx_free(bd.predictor);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(C, SubtractBlockTest,
 | 
					 | 
				
			||||||
                        ::testing::Values(vp8_subtract_b_c));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if HAVE_MMX
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(MMX, SubtractBlockTest,
 | 
					 | 
				
			||||||
                        ::testing::Values(vp8_subtract_b_mmx));
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if HAVE_SSE2
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(SSE2, SubtractBlockTest,
 | 
					 | 
				
			||||||
                        ::testing::Values(vp8_subtract_b_sse2));
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}  // namespace
 | 
					 | 
				
			||||||
@@ -1,96 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *  Use of this source code is governed by a BSD-style license
 | 
					 | 
				
			||||||
 *  that can be found in the LICENSE file in the root of the source
 | 
					 | 
				
			||||||
 *  tree. An additional intellectual property rights grant can be found
 | 
					 | 
				
			||||||
 *  in the file PATENTS.  All contributing project authors may
 | 
					 | 
				
			||||||
 *  be found in the AUTHORS file in the root of the source tree.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
#include <climits>
 | 
					 | 
				
			||||||
#include "third_party/googletest/src/include/gtest/gtest.h"
 | 
					 | 
				
			||||||
#include "test/codec_factory.h"
 | 
					 | 
				
			||||||
#include "test/encode_test_driver.h"
 | 
					 | 
				
			||||||
#include "test/i420_video_source.h"
 | 
					 | 
				
			||||||
#include "test/util.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class SuperframeTest : public ::libvpx_test::EncoderTest,
 | 
					 | 
				
			||||||
    public ::libvpx_test::CodecTestWithParam<libvpx_test::TestMode> {
 | 
					 | 
				
			||||||
 protected:
 | 
					 | 
				
			||||||
  SuperframeTest() : EncoderTest(GET_PARAM(0)), modified_buf_(NULL),
 | 
					 | 
				
			||||||
      last_sf_pts_(0) {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void SetUp() {
 | 
					 | 
				
			||||||
    InitializeConfig();
 | 
					 | 
				
			||||||
    SetMode(GET_PARAM(1));
 | 
					 | 
				
			||||||
    sf_count_ = 0;
 | 
					 | 
				
			||||||
    sf_count_max_ = INT_MAX;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void TearDown() {
 | 
					 | 
				
			||||||
    delete[] modified_buf_;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual void PreEncodeFrameHook(libvpx_test::VideoSource *video,
 | 
					 | 
				
			||||||
                                  libvpx_test::Encoder *encoder) {
 | 
					 | 
				
			||||||
    if (video->frame() == 1) {
 | 
					 | 
				
			||||||
      encoder->Control(VP8E_SET_ENABLEAUTOALTREF, 1);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  virtual const vpx_codec_cx_pkt_t * MutateEncoderOutputHook(
 | 
					 | 
				
			||||||
      const vpx_codec_cx_pkt_t *pkt) {
 | 
					 | 
				
			||||||
    if (pkt->kind != VPX_CODEC_CX_FRAME_PKT)
 | 
					 | 
				
			||||||
      return pkt;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    const uint8_t *buffer = reinterpret_cast<uint8_t*>(pkt->data.frame.buf);
 | 
					 | 
				
			||||||
    const uint8_t marker = buffer[pkt->data.frame.sz - 1];
 | 
					 | 
				
			||||||
    const int frames = (marker & 0x7) + 1;
 | 
					 | 
				
			||||||
    const int mag = ((marker >> 3) & 3) + 1;
 | 
					 | 
				
			||||||
    const unsigned int index_sz = 2 + mag  * frames;
 | 
					 | 
				
			||||||
    if ((marker & 0xe0) == 0xc0 &&
 | 
					 | 
				
			||||||
        pkt->data.frame.sz >= index_sz &&
 | 
					 | 
				
			||||||
        buffer[pkt->data.frame.sz - index_sz] == marker) {
 | 
					 | 
				
			||||||
      // frame is a superframe. strip off the index.
 | 
					 | 
				
			||||||
      if (modified_buf_)
 | 
					 | 
				
			||||||
        delete[] modified_buf_;
 | 
					 | 
				
			||||||
      modified_buf_ = new uint8_t[pkt->data.frame.sz - index_sz];
 | 
					 | 
				
			||||||
      memcpy(modified_buf_, pkt->data.frame.buf,
 | 
					 | 
				
			||||||
             pkt->data.frame.sz - index_sz);
 | 
					 | 
				
			||||||
      modified_pkt_ = *pkt;
 | 
					 | 
				
			||||||
      modified_pkt_.data.frame.buf = modified_buf_;
 | 
					 | 
				
			||||||
      modified_pkt_.data.frame.sz -= index_sz;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      sf_count_++;
 | 
					 | 
				
			||||||
      last_sf_pts_ = pkt->data.frame.pts;
 | 
					 | 
				
			||||||
      return &modified_pkt_;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Make sure we do a few frames after the last SF
 | 
					 | 
				
			||||||
    abort_ |= sf_count_ > sf_count_max_ &&
 | 
					 | 
				
			||||||
              pkt->data.frame.pts - last_sf_pts_ >= 5;
 | 
					 | 
				
			||||||
    return pkt;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  int sf_count_;
 | 
					 | 
				
			||||||
  int sf_count_max_;
 | 
					 | 
				
			||||||
  vpx_codec_cx_pkt_t modified_pkt_;
 | 
					 | 
				
			||||||
  uint8_t *modified_buf_;
 | 
					 | 
				
			||||||
  vpx_codec_pts_t last_sf_pts_;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_P(SuperframeTest, TestSuperframeIndexIsOptional) {
 | 
					 | 
				
			||||||
  sf_count_max_ = 0;  // early exit on successful test.
 | 
					 | 
				
			||||||
  cfg_.g_lag_in_frames = 25;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  ::libvpx_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288,
 | 
					 | 
				
			||||||
                                       30, 1, 0, 40);
 | 
					 | 
				
			||||||
  ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
 | 
					 | 
				
			||||||
  EXPECT_EQ(sf_count_, 1);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
VP9_INSTANTIATE_TEST_CASE(SuperframeTest, ::testing::Values(
 | 
					 | 
				
			||||||
    ::libvpx_test::kTwoPassGood));
 | 
					 | 
				
			||||||
}  // namespace
 | 
					 | 
				
			||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user