diff options
author | Natanael Copa <ncopa@alpinelinux.org> | 2010-06-17 12:16:09 +0000 |
---|---|---|
committer | Natanael Copa <ncopa@alpinelinux.org> | 2010-06-17 12:17:10 +0000 |
commit | 5e9ec9194376d0f0d2b440d23a8b86cd9d17652e (patch) | |
tree | cbbbbdde16dd9186dd1da228aa98ac24f754e865 /main | |
parent | 6797087d494f8707be1236bb1e420e60af35b903 (diff) | |
download | aports-5e9ec9194376d0f0d2b440d23a8b86cd9d17652e.tar.bz2 aports-5e9ec9194376d0f0d2b440d23a8b86cd9d17652e.tar.xz |
main/libvpx: new aport
Library for the vp8 codec
http://www.webmproject.org/
Diffstat (limited to 'main')
-rw-r--r-- | main/libvpx/APKBUILD | 42 | ||||
-rw-r--r-- | main/libvpx/git100617.patch | 27956 |
2 files changed, 27998 insertions, 0 deletions
diff --git a/main/libvpx/APKBUILD b/main/libvpx/APKBUILD new file mode 100644 index 0000000000..e5514282e9 --- /dev/null +++ b/main/libvpx/APKBUILD @@ -0,0 +1,42 @@ +# Maintainer: Natanael Copa <ncopa@alpinelinux.org> +pkgname=libvpx +_ver=0.9.0 +_git=100617 +pkgver=0.9.0_git$_git +pkgrel=0 +pkgdesc="Library for the vp8 codec" +url="http://www.webmproject.org/" +license="GPL" +depends= +makedepends="coreutils yasm" +install= +subpackages="$pkgname-dev" +source="http://webm.googlecode.com/files/libvpx-$_ver.tar.bz2 + git100617.patch" + +_builddir="$srcdir"/$pkgname-$_ver + +prepare() { + cd "$_builddir" + patch -p1 -i "$srcdir"/git100617.patch +} + +build() { + cd "$_builddir" + ./configure \ + --enable-pic \ + --enable-libs \ + --enable-runtime-cpu-detect \ + --enable-vp8 \ + --disable-install-srcs \ + || return 1 + make || return 1 +} + +package() { + cd "$_builddir" + make DIST_DIR="$pkgdir"/usr install +} + +md5sums="9eb8e818d2f3263623c258fe66924082 libvpx-0.9.0.tar.bz2 +4339d51cc3b95ce5b577f4a84c7b4d2c git100617.patch" diff --git a/main/libvpx/git100617.patch b/main/libvpx/git100617.patch new file mode 100644 index 0000000000..3c5eece135 --- /dev/null +++ b/main/libvpx/git100617.patch @@ -0,0 +1,27956 @@ +diff --git a/AUTHORS b/AUTHORS +index 9686ac1..4ab6881 100644 +--- a/AUTHORS ++++ b/AUTHORS +@@ -2,3 +2,6 @@ + # Name or Organization <email address> + + Google Inc. ++The Mozilla Foundation ++Timothy B. Terriberry <tterriberry@mozilla.com> ++The Xiph.Org Foundation +diff --git a/LICENSE b/LICENSE +index 6b0e867..7a6f995 100644 +--- a/LICENSE ++++ b/LICENSE +@@ -1,22 +1,20 @@ +-Copyright (c) 2010, Google, Inc. +- +-All rights reserved. ++Copyright (c) 2010, Google Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without +-modification, are permitted provided that the following conditions +-are met: ++modification, are permitted provided that the following conditions are ++met: + +-- Redistributions of source code must retain the above copyright +- notice, this list of conditions and the following disclaimer. ++ * Redistributions of source code must retain the above copyright ++ notice, this list of conditions and the following disclaimer. + +-- Redistributions in binary form must reproduce the above +- copyright notice, this list of conditions and the following +- disclaimer in the documentation and/or other materials provided +- with the distribution. ++ * Redistributions in binary form must reproduce the above copyright ++ notice, this list of conditions and the following disclaimer in ++ the documentation and/or other materials provided with the ++ distribution. + +-- Neither the name of Google nor the names of its contributors may +- be used to endorse or promote products derived from this software +- without specific prior written permission. ++ * Neither the name of Google nor the names of its contributors may ++ be used to endorse or promote products derived from this software ++ without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +@@ -30,19 +28,3 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +-Subject to the terms and conditions of the above License, Google +-hereby grants to You a perpetual, worldwide, non-exclusive, +-no-charge, royalty-free, irrevocable (except as stated in this +-section) patent license to make, have made, use, offer to sell, sell, +-import, and otherwise transfer this implementation of VP8, where such +-license applies only to those patent claims, both currently owned by +-Google and acquired in the future, licensable by Google that are +-necessarily infringed by this implementation of VP8. If You or your +-agent or exclusive licensee institute or order or agree to the +-institution of patent litigation against any entity (including a +-cross-claim or counterclaim in a lawsuit) alleging that this +-implementation of VP8 or any code incorporated within this +-implementation of VP8 constitutes direct or contributory patent +-infringement, or inducement of patent infringement, then any rights +-granted to You under this License for this implementation of VP8 +-shall terminate as of the date such litigation is filed. +diff --git a/PATENTS b/PATENTS +new file mode 100644 +index 0000000..4414d83 +--- /dev/null ++++ b/PATENTS +@@ -0,0 +1,22 @@ ++Additional IP Rights Grant (Patents) ++ ++"This implementation" means the copyrightable works distributed by ++Google as part of the WebM Project. ++ ++Google hereby grants to you a perpetual, worldwide, non-exclusive, ++no-charge, royalty-free, irrevocable (except as stated in this section) ++patent license to make, have made, use, offer to sell, sell, import, ++transfer, and otherwise run, modify and propagate the contents of this ++implementation of VP8, where such license applies only to those patent ++claims, both currently owned by Google and acquired in the future, ++licensable by Google that are necessarily infringed by this ++implementation of VP8. This grant does not include claims that would be ++infringed only as a consequence of further modification of this ++implementation. If you or your agent or exclusive licensee institute or ++order or agree to the institution of patent litigation against any ++entity (including a cross-claim or counterclaim in a lawsuit) alleging ++that this implementation of VP8 or any code incorporated within this ++implementation of VP8 constitutes direct or contributory patent ++infringement, or inducement of patent infringement, then any patent ++rights granted to you under this License for this implementation of VP8 ++shall terminate as of the date such litigation is filed. +diff --git a/args.c b/args.c +index f2ad697..5fd0466 100644 +--- a/args.c ++++ b/args.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/args.h b/args.h +index c063f53..f1ec6c0 100644 +--- a/args.h ++++ b/args.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/build/.gitattributes b/build/.gitattributes +new file mode 100644 +index 0000000..03db79b +--- /dev/null ++++ b/build/.gitattributes +@@ -0,0 +1,2 @@ ++*-vs8/*.rules -crlf ++*-msvs/*.rules -crlf +diff --git a/build/arm-wince-vs8/.gitattributes b/build/arm-wince-vs8/.gitattributes +deleted file mode 100644 +index be1eeb9..0000000 +--- a/build/arm-wince-vs8/.gitattributes ++++ /dev/null +@@ -1 +0,0 @@ +-*.rules -crlf +diff --git a/build/arm-wince-vs8/obj_int_extract.bat b/build/arm-wince-vs8/obj_int_extract.bat +index e58bdd6..3069160 100644 +--- a/build/arm-wince-vs8/obj_int_extract.bat ++++ b/build/arm-wince-vs8/obj_int_extract.bat +@@ -1,12 +1,13 @@ + @echo off + REM Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + REM +-REM Use of this source code is governed by a BSD-style license and patent +-REM grant that can be found in the LICENSE file in the root of the source +-REM tree. All contributing project authors may be found in the AUTHORS +-REM file in the root of the source tree. ++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" /D "HAVE_CONFIG_H" /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
++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"
+diff --git a/build/make/Makefile b/build/make/Makefile +index 412629e..4f7df43 100755 +--- a/build/make/Makefile ++++ b/build/make/Makefile +@@ -1,10 +1,11 @@ + ## + ## Copyright (c) 2010 The VP8 project authors. All Rights Reserved. +-## +-## Use of this source code is governed by a BSD-style license and patent +-## grant that can be found in the LICENSE file in the root of the source +-## tree. All contributing project authors may be found in the AUTHORS +-## file in the root of the source tree. ++## ++## 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. + ## + + +@@ -18,6 +19,7 @@ ifeq ($(target),) + done + all: .DEFAULT + clean:: .DEFAULT ++install:: .DEFAULT + + + # Note: md5sum is not installed on OS X, but openssl is. Openssl may not be +@@ -29,7 +31,7 @@ md5sum := $(firstword $(wildcard \ + md5sum := $(if $(filter %openssl,$(md5sum)),$(md5sum) dgst -md5,$(md5sum)) + + TGT_CC:=$(word 3, $(subst -, ,$(TOOLCHAIN))) +-install: ++dist: + @for t in $(ALL_TARGETS); do \ + $(MAKE) --no-print-directory target=$$t $(MAKECMDGOALS) || exit $$?;\ + done +@@ -37,7 +39,7 @@ install: + @if [ -d "$(DIST_DIR)/src" ]; then \ + mkdir -p "$(DIST_DIR)/build"; \ + cd "$(DIST_DIR)/build"; \ +- if [ $(TGT_CC) = "rvct" ] ; then \ ++ if [ "$(TGT_CC)" = "rvct" ] ; then \ + echo "../src/configure --target=$(TOOLCHAIN) --libc=$(ALT_LIBC)"; \ + ../src/configure --target=$(TOOLCHAIN) --libc=$(ALT_LIBC); \ + else \ +@@ -94,10 +96,10 @@ clean:: + rm -f $(OBJS-yes) $(OBJS-yes:.o=.d) $(OBJS-yes:.asm.s.o=.asm.s) + rm -f $(CLEAN-OBJS) + ++.PHONY: dist ++dist: + .PHONY: install +-install: +-.PHONY: install-helper +-install-helper: ++install:: + + $(BUILD_PFX)%.c.d: %.c + $(if $(quiet),@echo " [DEP] $@") +@@ -218,6 +220,20 @@ $(1): + $(qexec)$$(AR) $$(ARFLAGS) $$@ $$? + endef + ++define so_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. ++# ++# This needs further abstraction for dealing with non-GNU linkers. ++$(1): ++ $(if $(quiet),@echo " [LD] $$@") ++ $(qexec)$$(LD) -shared $$(LDFLAGS) \ ++ -Wl,--no-undefined -Wl,-soname,$$(SONAME) \ ++ -Wl,--version-script,$$(SO_VERSION_SCRIPT) -o $$@ \ ++ $$(filter %.o,$$?) $$(extralibs) ++endef ++ + define lipo_lib_template + $(1): $(addsuffix /$(1),$(FAT_ARCHS)) + $(if $(quiet),@echo " [LIPO] $$@") +@@ -254,6 +270,9 @@ DOCS=$(call cond_enabled,CONFIG_INSTALL_DOCS,DOCS) + @touch $@ + + INSTALL-DOCS=$(call cond_enabled,CONFIG_INSTALL_DOCS,INSTALL-DOCS) ++ifeq ($(MAKECMDGOALS),dist) ++INSTALL-DOCS+=$(call cond_enabled,CONFIG_INSTALL_DOCS,DIST-DOCS) ++endif + .install-docs: .docs $(addprefix $(DIST_DIR)/,$(INSTALL-DOCS)) + @touch $@ + +@@ -265,6 +284,9 @@ BINS=$(call enabled,BINS) + @touch $@ + + INSTALL-BINS=$(call cond_enabled,CONFIG_INSTALL_BINS,INSTALL-BINS) ++ifeq ($(MAKECMDGOALS),dist) ++INSTALL-BINS+=$(call cond_enabled,CONFIG_INSTALL_BINS,DIST-BINS) ++endif + .install-bins: .bins $(addprefix $(DIST_DIR)/,$(INSTALL-BINS)) + @touch $@ + +@@ -275,8 +297,12 @@ LIBS=$(call enabled,LIBS) + .libs: $(LIBS) + @touch $@ + $(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)))) + + INSTALL-LIBS=$(call cond_enabled,CONFIG_INSTALL_LIBS,INSTALL-LIBS) ++ifeq ($(MAKECMDGOALS),dist) ++INSTALL-LIBS+=$(call cond_enabled,CONFIG_INSTALL_LIBS,DIST-LIBS) ++endif + .install-libs: .libs $(addprefix $(DIST_DIR)/,$(INSTALL-LIBS)) + @touch $@ + +@@ -289,6 +315,9 @@ PROJECTS=$(call enabled,PROJECTS) + @touch $@ + + INSTALL-PROJECTS=$(call cond_enabled,CONFIG_INSTALL_PROJECTS,INSTALL-PROJECTS) ++ifeq ($(MAKECMDGOALS),dist) ++INSTALL-PROJECTS+=$(call cond_enabled,CONFIG_INSTALL_PROJECTS,DIST-PROJECTS) ++endif + .install-projects: .projects $(addprefix $(DIST_DIR)/,$(INSTALL-PROJECTS)) + @touch $@ + +@@ -296,26 +325,29 @@ clean:: + rm -f .projects .install-projects $(PROJECTS) + endif + +-# If there are any source files to be installed, then include the build ++# If there are any source files to be distributed, then include the build + # system too. +-ifneq ($(call enabled,INSTALL-SRCS),) +- INSTALL-SRCS-yes += configure +- INSTALL-SRCS-yes += build/make/configure.sh +- INSTALL-SRCS-yes += build/make/gen_asm_deps.sh +- INSTALL-SRCS-yes += build/make/Makefile +- INSTALL-SRCS-$(CONFIG_MSVS) += build/make/gen_msvs_def.sh +- INSTALL-SRCS-$(CONFIG_MSVS) += build/make/gen_msvs_proj.sh +- INSTALL-SRCS-$(CONFIG_MSVS) += build/make/gen_msvs_sln.sh +- INSTALL-SRCS-$(CONFIG_RVCT) += build/make/armlink_adapter.sh ++ifneq ($(call enabled,DIST-SRCS),) ++ DIST-SRCS-yes += configure ++ DIST-SRCS-yes += build/make/configure.sh ++ DIST-SRCS-yes += build/make/gen_asm_deps.sh ++ DIST-SRCS-yes += build/make/Makefile ++ DIST-SRCS-$(CONFIG_MSVS) += build/make/gen_msvs_def.sh ++ DIST-SRCS-$(CONFIG_MSVS) += build/make/gen_msvs_proj.sh ++ DIST-SRCS-$(CONFIG_MSVS) += build/make/gen_msvs_sln.sh ++ DIST-SRCS-$(CONFIG_RVCT) += build/make/armlink_adapter.sh + # + # 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. +- INSTALL-SRCS-$(ARCH_ARM) += build/make/obj_int_extract.c +- INSTALL-SRCS-$(ARCH_ARM) += build/make/ads2gas.pl +- INSTALL-SRCS-yes += $(target:-$(TOOLCHAIN)=).mk ++ DIST-SRCS-$(ARCH_ARM) += build/make/obj_int_extract.c ++ DIST-SRCS-$(ARCH_ARM) += build/make/ads2gas.pl ++ DIST-SRCS-yes += $(target:-$(TOOLCHAIN)=).mk + endif + INSTALL-SRCS := $(call cond_enabled,CONFIG_INSTALL_SRCS,INSTALL-SRCS) ++ifeq ($(MAKECMDGOALS),dist) ++INSTALL-SRCS += $(call cond_enabled,CONFIG_INSTALL_SRCS,DIST-SRCS) ++endif + .install-srcs: $(addprefix $(DIST_DIR)/src/,$(INSTALL-SRCS)) + @touch $@ + +@@ -329,7 +361,8 @@ endif + BUILD_TARGETS += .docs .libs .bins + INSTALL_TARGETS += .install-docs .install-srcs .install-libs .install-bins + all-$(target): $(BUILD_TARGETS) +-install: $(INSTALL_TARGETS) ++install:: $(INSTALL_TARGETS) ++dist: $(INSTALL_TARGETS) + + # + # Development helper targets +diff --git a/build/make/ads2gas.pl b/build/make/ads2gas.pl +index 6fcba84..bd5e772 100755 +--- a/build/make/ads2gas.pl ++++ b/build/make/ads2gas.pl +@@ -1,11 +1,12 @@ + #!/usr/bin/perl + ## + ## Copyright (c) 2010 The VP8 project authors. All Rights Reserved. +-## +-## Use of this source code is governed by a BSD-style license and patent +-## grant that can be found in the LICENSE file in the root of the source +-## tree. All contributing project authors may be found in the AUTHORS +-## file in the root of the source tree. ++## ++## 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. + ## + + +diff --git a/build/make/ads2gas_apple.pl b/build/make/ads2gas_apple.pl +index 569c3e7..7a32445 100755 +--- a/build/make/ads2gas_apple.pl ++++ b/build/make/ads2gas_apple.pl +@@ -1,11 +1,12 @@ + #!/usr/bin/env perl + ## + ## Copyright (c) 2010 The VP8 project authors. All Rights Reserved. +-## +-## Use of this source code is governed by a BSD-style license and patent +-## grant that can be found in the LICENSE file in the root of the source +-## tree. All contributing project authors may be found in the AUTHORS +-## file in the root of the source tree. ++## ++## 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. + ## + + +diff --git a/build/make/armlink_adapter.sh b/build/make/armlink_adapter.sh +index dcaa82c..25fb627 100755 +--- a/build/make/armlink_adapter.sh ++++ b/build/make/armlink_adapter.sh +@@ -2,10 +2,11 @@ + ## + ## Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ## +-## Use of this source code is governed by a BSD-style license and patent +-## grant that can be found in the LICENSE file in the root of the source +-## tree. All contributing project authors may be found in the AUTHORS +-## file in the root of the source tree. ++## 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. + ## + + +diff --git a/build/make/configure.sh b/build/make/configure.sh +index ed3a34f..05e550f 100755 +--- a/build/make/configure.sh ++++ b/build/make/configure.sh +@@ -1,13 +1,13 @@ + #!/bin/bash + ## +-## Copyright (c) 2010 The VP8 project authors. All Rights Reserved. ++## configure.sh + ## +-## Use of this source code is governed by a BSD-style license and patent +-## grant that can be found in the LICENSE file in the root of the source +-## tree. All contributing project authors may be found in the AUTHORS +-## file in the root of the source tree. ++## This script is sourced by the main configure script and contains ++## utility functions and other common bits that aren't strictly libvpx ++## related. ++## ++## This build system is based in part on the FFmpeg configure script. + ## +- + + + # +@@ -120,8 +120,8 @@ EOF + + show_targets() { + while [ -n "$*" ]; do +- if [ "${1%%-*}" == "${2%%-*}" ]; then +- if [ "${2%%-*}" == "${3%%-*}" ]; then ++ if [ "${1%%-*}" = "${2%%-*}" ]; then ++ if [ "${2%%-*}" = "${3%%-*}" ]; then + printf " %-24s %-24s %-24s\n" "$1" "$2" "$3" + shift; shift; shift + else +@@ -348,7 +348,6 @@ true + } + + write_common_target_config_mk() { +- [ -n "$2" ] && local have_config_h="-DHAVE_CONFIG_H=\"${2##*/}\"" + local CC=${CC} + enabled ccache && CC="ccache ${CC}" + +@@ -367,7 +366,7 @@ AS=${AS} + STRIP=${STRIP} + NM=${NM} + +-CFLAGS = ${CFLAGS} ${have_config_h} ++CFLAGS = ${CFLAGS} + ARFLAGS = -rus\$(if \$(quiet),c,v) + LDFLAGS = ${LDFLAGS} + ASFLAGS = ${ASFLAGS} +@@ -443,7 +442,13 @@ process_common_cmdline() { + disable builtin_libc + alt_libc="${optval}" + ;; +- --libc) ++ --prefix=*) ++ prefix="${optval}" ++ ;; ++ --libdir=*) ++ libdir="${optval}" ++ ;; ++ --libc|--prefix|--libdir) + die "Option ${opt} requires argument" + ;; + --help|-h) show_help +@@ -464,6 +469,18 @@ process_cmdline() { + done + } + ++ ++post_process_common_cmdline() { ++ prefix="${prefix:-/usr/local}" ++ prefix="${prefix%/}" ++ libdir="${libdir:-${prefix}/lib}" ++ libdir="${libdir%/}" ++ if [ "${libdir#${prefix}}" = "${libdir}" ]; then ++ die "Libdir ${libdir} must be a subdirectory of ${prefix}" ++ fi ++} ++ ++ + post_process_cmdline() { + true; + } +@@ -479,6 +496,42 @@ setup_gnu_toolchain() { + } + + process_common_toolchain() { ++ if [ -z "$toolchain" ]; then ++ gcctarget="$(gcc -dumpmachine 2> /dev/null)" ++ ++ # detect tgt_isa ++ case "$gcctarget" in ++ *x86_64*|*amd64*) ++ tgt_isa=x86_64 ++ ;; ++ *i[3456]86*) ++ tgt_isa=x86 ++ ;; ++ esac ++ ++ # detect tgt_os ++ case "$gcctarget" in ++ *darwin8*) ++ tgt_isa=universal ++ tgt_os=darwin8 ++ ;; ++ *darwin9*) ++ tgt_isa=universal ++ tgt_os=darwin9 ++ ;; ++ *mingw32*|*cygwin*) ++ tgt_os=win32 ++ ;; ++ *linux*|*bsd*) ++ tgt_os=linux ++ ;; ++ esac ++ ++ if [ -n "$tgt_isa" ] && [ -n "$tgt_os" ]; then ++ toolchain=${tgt_isa}-${tgt_os}-gcc ++ fi ++ fi ++ + toolchain=${toolchain:-generic-gnu} + + is_in ${toolchain} ${all_platforms} || enabled force_toolchain \ +@@ -781,6 +834,7 @@ process_common_toolchain() { + ;; + universal*|*-gcc|generic-gnu) + link_with_cc=gcc ++ enable gcc + setup_gnu_toolchain + ;; + esac +@@ -844,8 +898,8 @@ process_toolchain() { + } + + print_config_mk() { +- prefix=$1 +- makefile=$2 ++ local prefix=$1 ++ local makefile=$2 + shift 2 + for cfg; do + upname="`toupper $cfg`" +@@ -856,8 +910,8 @@ print_config_mk() { + } + + print_config_h() { +- prefix=$1 +- header=$2 ++ local prefix=$1 ++ local header=$2 + shift 2 + for cfg; do + upname="`toupper $cfg`" +@@ -888,6 +942,7 @@ process() { + else + echo "# ${self} $@" > ${logfile} + fi ++ post_process_common_cmdline + post_process_cmdline + process_toolchain + process_detect +diff --git a/build/make/gen_asm_deps.sh b/build/make/gen_asm_deps.sh +index c1118e1..2c972e5 100755 +--- a/build/make/gen_asm_deps.sh ++++ b/build/make/gen_asm_deps.sh +@@ -2,10 +2,11 @@ + ## + ## Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ## +-## Use of this source code is governed by a BSD-style license and patent +-## grant that can be found in the LICENSE file in the root of the source +-## tree. All contributing project authors may be found in the AUTHORS +-## file in the root of the source tree. ++## 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. + ## + + +diff --git a/build/make/gen_msvs_def.sh b/build/make/gen_msvs_def.sh +index 68b2406..b5c54fd 100755 +--- a/build/make/gen_msvs_def.sh ++++ b/build/make/gen_msvs_def.sh +@@ -2,10 +2,11 @@ + ## + ## Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ## +-## Use of this source code is governed by a BSD-style license and patent +-## grant that can be found in the LICENSE file in the root of the source +-## tree. All contributing project authors may be found in the AUTHORS +-## file in the root of the source tree. ++## 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. + ## + + +diff --git a/build/make/gen_msvs_proj.sh b/build/make/gen_msvs_proj.sh +index eb482a4..d94ae4d 100755 +--- a/build/make/gen_msvs_proj.sh ++++ b/build/make/gen_msvs_proj.sh +@@ -2,15 +2,17 @@ + ## + ## Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ## +-## Use of this source code is governed by a BSD-style license and patent +-## grant that can be found in the LICENSE file in the root of the source +-## tree. All contributing project authors may be found in the AUTHORS +-## file in the root of the source tree. ++## 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() { +@@ -291,8 +293,8 @@ case "$target" in + x86*) + platforms[0]="Win32" + # these are only used by vs7 +- asm_Debug_cmdline="yasm -Xvc -g cv8 -f \$(PlatformName) ${yasmincs} \$(InputPath)" +- asm_Release_cmdline="yasm -Xvc -f \$(PlatformName) ${yasmincs} \$(InputPath)" ++ asm_Debug_cmdline="yasm -Xvc -g cv8 -f \$(PlatformName) ${yasmincs} "\$(InputPath)"" ++ asm_Release_cmdline="yasm -Xvc -f \$(PlatformName) ${yasmincs} "\$(InputPath)"" + ;; + arm*|iwmmx*) + case "${name}" in +@@ -342,19 +344,19 @@ generate_vcproj() { + + open_tag ToolFiles + case "$target" in +- x86*) $uses_asm && tag DefaultToolFile FileName="yasm.rules" ++ x86*) $uses_asm && tag ToolFile RelativePath="$self_dirname/../x86-msvs/yasm.rules" + ;; + arm*|iwmmx*) + if [ "$name" == "vpx_decoder" ];then + case "$target" in + armv5*) +- tag DefaultToolFile FileName="armasmv5.rules" ++ tag ToolFile RelativePath="$self_dirname/../arm-wince-vs8/armasmv5.rules" + ;; + armv6*) +- tag DefaultToolFile FileName="armasmv6.rules" ++ tag ToolFile RelativePath="$self_dirname/../arm-wince-vs8/armasmv6.rules" + ;; + iwmmxt*) +- tag DefaultToolFile FileName="armasmxscale.rules" ++ tag ToolFile RelativePath="$self_dirname/../arm-wince-vs8/armasmxscale.rules" + ;; + esac + fi +@@ -385,7 +387,7 @@ generate_vcproj() { + ExecutionBucket="7" \ + Optimization="0" \ + AdditionalIncludeDirectories="$incs" \ +- PreprocessorDefinitions="_DEBUG;_WIN32_WCE=\$(CEVER);UNDER_CE;\$(PLATFORMDEFINES);WINCE;DEBUG;_LIB;\$(ARCHFAM);\$(_ARCHFAM_);_UNICODE;UNICODE;HAVE_CONFIG_H" \ ++ PreprocessorDefinitions="_DEBUG;_WIN32_WCE=\$(CEVER);UNDER_CE;\$(PLATFORMDEFINES);WINCE;DEBUG;_LIB;\$(ARCHFAM);\$(_ARCHFAM_);_UNICODE;UNICODE;" \ + MinimalRebuild="true" \ + RuntimeLibrary="1" \ + BufferSecurityCheck="false" \ +@@ -404,7 +406,7 @@ generate_vcproj() { + ExecutionBucket="7" \ + Optimization="0" \ + AdditionalIncludeDirectories="$incs" \ +- PreprocessorDefinitions="_DEBUG;_WIN32_WCE=\$(CEVER);UNDER_CE;\$(PLATFORMDEFINES);WINCE;DEBUG;_CONSOLE;\$(ARCHFAM);\$(_ARCHFAM_);_UNICODE;UNICODE;HAVE_CONFIG_H" \ ++ PreprocessorDefinitions="_DEBUG;_WIN32_WCE=\$(CEVER);UNDER_CE;\$(PLATFORMDEFINES);WINCE;DEBUG;_CONSOLE;\$(ARCHFAM);\$(_ARCHFAM_);_UNICODE;UNICODE;" \ + MinimalRebuild="true" \ + RuntimeLibrary="1" \ + BufferSecurityCheck="false" \ +@@ -544,7 +546,7 @@ generate_vcproj() { + Optimization="2" \ + FavorSizeOrSpeed="1" \ + AdditionalIncludeDirectories="$incs" \ +- PreprocessorDefinitions="NDEBUG;_WIN32_WCE=\$(CEVER);UNDER_CE;\$(PLATFORMDEFINES);WINCE;_LIB;\$(ARCHFAM);\$(_ARCHFAM_);_UNICODE;UNICODE;HAVE_CONFIG_H" \ ++ PreprocessorDefinitions="NDEBUG;_WIN32_WCE=\$(CEVER);UNDER_CE;\$(PLATFORMDEFINES);WINCE;_LIB;\$(ARCHFAM);\$(_ARCHFAM_);_UNICODE;UNICODE;" \ + RuntimeLibrary="0" \ + BufferSecurityCheck="false" \ + UsePrecompiledHeader="0" \ +@@ -563,7 +565,7 @@ generate_vcproj() { + Optimization="2" \ + FavorSizeOrSpeed="1" \ + AdditionalIncludeDirectories="$incs" \ +- PreprocessorDefinitions="NDEBUG;_WIN32_WCE=\$(CEVER);UNDER_CE;\$(PLATFORMDEFINES);WINCE;_CONSOLE;\$(ARCHFAM);\$(_ARCHFAM_);_UNICODE;UNICODE;HAVE_CONFIG_H" \ ++ PreprocessorDefinitions="NDEBUG;_WIN32_WCE=\$(CEVER);UNDER_CE;\$(PLATFORMDEFINES);WINCE;_CONSOLE;\$(ARCHFAM);\$(_ARCHFAM_);_UNICODE;UNICODE;" \ + RuntimeLibrary="0" \ + BufferSecurityCheck="false" \ + UsePrecompiledHeader="0" \ +diff --git a/build/make/gen_msvs_sln.sh b/build/make/gen_msvs_sln.sh +index b670ec5..ef425f5 100755 +--- a/build/make/gen_msvs_sln.sh ++++ b/build/make/gen_msvs_sln.sh +@@ -2,10 +2,11 @@ + ## + ## Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ## +-## Use of this source code is governed by a BSD-style license and patent +-## grant that can be found in the LICENSE file in the root of the source +-## tree. All contributing project authors may be found in the AUTHORS +-## file in the root of the source tree. ++## 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. + ## + + +diff --git a/build/make/obj_int_extract.c b/build/make/obj_int_extract.c +index cef14e7..0f64e89 100644 +--- a/build/make/obj_int_extract.c ++++ b/build/make/obj_int_extract.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +@@ -16,7 +17,7 @@ + #if defined(_MSC_VER) + #include <io.h> + #include <share.h> +-#include "vpx_ports/vpx_integer.h" ++#include "vpx/vpx_integer.h" + #else + #include <stdint.h> + #include <unistd.h> +diff --git a/build/make/version.sh b/build/make/version.sh +index 2bda701..81682d6 100755 +--- a/build/make/version.sh ++++ b/build/make/version.sh +@@ -2,10 +2,11 @@ + ## + ## Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ## +-## Use of this source code is governed by a BSD-style license and patent +-## grant that can be found in the LICENSE file in the root of the source +-## tree. All contributing project authors may be found in the AUTHORS +-## file in the root of the source tree. ++## 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. + ## + + +diff --git a/build/x86-msvs/yasm.rules b/build/x86-msvs/yasm.rules +new file mode 100644 +index 0000000..ee1fefb +--- /dev/null ++++ b/build/x86-msvs/yasm.rules +@@ -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>
++
+diff --git a/configure b/configure +index 3083343..9a3269a 100755 +--- a/configure ++++ b/configure +@@ -1,13 +1,16 @@ + #!/bin/bash + ## +-## Copyright (c) 2010 The VP8 project authors. All Rights Reserved. ++## configure + ## +-## Use of this source code is governed by a BSD-style license and patent +-## grant that can be found in the LICENSE file in the root of the source +-## tree. All contributing project authors may be found in the AUTHORS +-## file in the root of the source tree. ++## This script is the front-end to the build system. It provides a similar ++## interface to standard configure scripts with some extra bits for dealing ++## with toolchains that differ from the standard POSIX interface and ++## for extracting subsets of the source tree. In theory, reusable parts ++## of this script were intended to live in build/make/configure.sh, ++## but in practice, the line is pretty blurry. ++## ++## This build system is based in part on the FFmpeg configure script. + ## +- + + #source_path="`dirname \"$0\"`" + source_path=${0%/*} +@@ -24,18 +27,17 @@ Advanced options: + supported by hardware [auto] + ${toggle_codec_srcs} in/exclude codec library source code + ${toggle_debug_libs} in/exclude debug version of libraries +- ${toggle_eval_limit} enable limited evaluation build + ${toggle_md5} support for output of checksum data + ${toggle_static_msvcrt} use static MSVCRT (VS builds only) + ${toggle_vp8} VP8 codec support + ${toggle_psnr} output of PSNR data, if supported (encoders) + ${toggle_mem_tracker} track memory usage +- ${toggle_eval_limit} decoder limitted to 500 frames + ${toggle_postproc} postprocessing + ${toggle_multithread} multithreaded encoding and decoding. + ${toggle_spatial_resampling} spatial sampling (scaling) support + ${toggle_realtime_only} enable this option while building for real-time encoding + ${toggle_runtime_cpu_detect} runtime cpu detection ++ ${toggle_shared} shared library support + + Codecs: + Codecs can be selectively enabled or disabled individually, or by family: +@@ -135,11 +137,12 @@ if [ ${doxy_major:-0} -ge 1 ]; then + [ $doxy_minor -eq 5 ] && [ $doxy_patch -ge 3 ] && enable doxygen + fi + +-# install everything, by default ++# install everything except the sources, by default. sources will have ++# to be enabled when doing dist builds, since that's no longer a common ++# case. + enabled doxygen && php -v >/dev/null 2>&1 && enable install_docs + enable install_bins + enable install_libs +-enable install_srcs + + enable optimizations + enable fast_unaligned #allow unaligned accesses, if supported by hw +@@ -157,8 +160,8 @@ if ! enabled alt_tree_layout; then + [ -d ${source_path}/vp8 ] && CODECS="${CODECS} vp8_encoder vp8_decoder" + else + # customer environment +-[ -f ${source_path}/../include/vp8cx.h ] && CODECS="${CODECS} vp8_encoder" +-[ -f ${source_path}/../include/vp8dx.h ] && CODECS="${CODECS} vp8_decoder" ++[ -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}/../lib/*/*mt.lib ] && soft_enable static_msvcrt + fi +@@ -225,7 +228,6 @@ CONFIG_LIST=" + dequant_tokens + dc_recon + new_tokens +- eval_limit + runtime_cpu_detect + postproc + postproc_generic +@@ -238,6 +240,7 @@ CONFIG_LIST=" + static_msvcrt + spatial_resampling + realtime_only ++ shared + " + CMDLINE_SELECT=" + extra_warnings +@@ -265,7 +268,6 @@ CMDLINE_SELECT=" + dequant_tokens + dc_recon + new_tokens +- eval_limit + postproc + postproc_generic + multithread +@@ -276,6 +278,7 @@ CMDLINE_SELECT=" + mem_tracker + spatial_resampling + realtime_only ++ shared + " + + process_cmdline() { +@@ -354,7 +357,6 @@ process_targets() { + enabled codec_srcs && DIST_DIR="${DIST_DIR}-src" + ! enabled postproc && DIST_DIR="${DIST_DIR}-nopost" + ! enabled multithread && DIST_DIR="${DIST_DIR}-nomt" +- enabled eval_limit && DIST_DIR="${DIST_DIR}-eval" + ! enabled install_docs && DIST_DIR="${DIST_DIR}-nodocs" + DIST_DIR="${DIST_DIR}-${tgt_isa}-${tgt_os}" + case "${tgt_os}" in +@@ -365,8 +367,26 @@ process_targets() { + if [ -f "${source_path}/build/make/version.sh" ]; then + local ver=`"$source_path/build/make/version.sh" --bare $source_path` + DIST_DIR="${DIST_DIR}-${ver}" ++ ver=${ver%%-*} ++ VERSION_PATCH=${ver##*.} ++ ver=${ver%.*} ++ VERSION_MINOR=${ver##*.} ++ ver=${ver#v} ++ VERSION_MAJOR=${ver%.*} + fi +- enabled child || echo "DIST_DIR?=${DIST_DIR}" >> config.mk ++ enabled child || cat <<EOF >> config.mk ++ifeq (\$(MAKECMDGOALS),dist) ++DIST_DIR?=${DIST_DIR} ++else ++DIST_DIR?=\$(DESTDIR)${prefix} ++endif ++LIBSUBDIR=${libdir##${prefix}/} ++ ++VERSION_MAJOR=${VERSION_MAJOR} ++VERSION_MINOR=${VERSION_MINOR} ++VERSION_PATCH=${VERSION_PATCH} ++ ++EOF + enabled child || echo "CONFIGURE_ARGS?=${CONFIGURE_ARGS}" >> config.mk + + # +@@ -385,6 +405,12 @@ process_targets() { + } + + process_detect() { ++ if enabled shared; then ++ # 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 ++ # magic happens after the command line has been parsed. ++ enabled linux || die "--enable-shared only supported on ELF for now" ++ fi + if [ -z "$CC" ]; then + echo "Bypassing toolchain for environment detection." + enable external_build +@@ -419,7 +445,7 @@ EOF + check_header pthread.h + check_header sys/mman.h + +- check_header vpx_ports/vpx_integer.h -I${source_path} && enable vpx_ports ++ check_header vpx/vpx_integer.h -I${source_path} && enable vpx_ports + } + + process_toolchain() { +diff --git a/docs.mk b/docs.mk +index 3e7b5cd..f60a482 100644 +--- a/docs.mk ++++ b/docs.mk +@@ -1,10 +1,11 @@ + ## + ## Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ## +-## Use of this source code is governed by a BSD-style license and patent +-## grant that can be found in the LICENSE file in the root of the source +-## tree. All contributing project authors may be found in the AUTHORS +-## file in the root of the source tree. ++## 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. + ## + + +@@ -47,8 +48,8 @@ docs/html/index.html: doxyfile $(CODEC_DOX) $(TXT_DOX) + @doxygen $< + DOCS-yes += docs/html/index.html + +-INSTALL-DOCS-yes = $(wildcard docs/html/*) +-INSTALL-DOCS-$(CONFIG_CODEC_SRCS) += $(addprefix src/,$(CODEC_DOX)) +-INSTALL-DOCS-$(CONFIG_CODEC_SRCS) += src/libs.doxy_template +-INSTALL-DOCS-yes += CHANGELOG +-INSTALL-DOCS-yes += README ++DIST-DOCS-yes = $(wildcard docs/html/*) ++DIST-DOCS-$(CONFIG_CODEC_SRCS) += $(addprefix src/,$(CODEC_DOX)) ++DIST-DOCS-$(CONFIG_CODEC_SRCS) += src/libs.doxy_template ++DIST-DOCS-yes += CHANGELOG ++DIST-DOCS-yes += README +diff --git a/example_xma.c b/example_xma.c +index cc4e591..e5eca7a 100644 +--- a/example_xma.c ++++ b/example_xma.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +@@ -15,10 +16,10 @@ + #include <string.h> + #define VPX_CODEC_DISABLE_COMPAT 1 + #include "vpx_config.h" +-#include "vpx_decoder.h" +-#include "vpx_integer.h" ++#include "vpx/vpx_decoder.h" ++#include "vpx/vpx_integer.h" + #if CONFIG_VP8_DECODER +-#include "vp8dx.h" ++#include "vpx/vp8dx.h" + #endif + + static char *exec_name; +diff --git a/examples.mk b/examples.mk +index 036a423..bca0d9c 100644 +--- a/examples.mk ++++ b/examples.mk +@@ -1,10 +1,11 @@ + ## + ## Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ## +-## Use of this source code is governed by a BSD-style license and patent +-## grant that can be found in the LICENSE file in the root of the source +-## tree. All contributing project authors may be found in the AUTHORS +-## file in the root of the source tree. ++## 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. + ## + + +@@ -14,18 +15,21 @@ + UTILS-$(CONFIG_DECODERS) += ivfdec.c + ivfdec.SRCS += md5_utils.c md5_utils.h + ivfdec.SRCS += vpx_ports/vpx_timer.h +-ivfdec.SRCS += vpx_ports/vpx_integer.h ++ivfdec.SRCS += vpx/vpx_integer.h + ivfdec.SRCS += args.c args.h vpx_ports/config.h + ivfdec.GUID = BA5FE66F-38DD-E034-F542-B1578C5FB950 + ivfdec.DESCRIPTION = Full featured decoder + UTILS-$(CONFIG_ENCODERS) += ivfenc.c +-ivfenc.SRCS += args.c args.h vpx_ports/config.h +-ivfenc.SRCS += vpx_ports/mem_ops.h vpx_ports/mem_ops_aligned.h ++ivfenc.SRCS += args.c args.h y4minput.c y4minput.h ++ivfenc.SRCS += vpx_ports/config.h vpx_ports/mem_ops.h ++ivfenc.SRCS += vpx_ports/mem_ops_aligned.h + ivfenc.GUID = 548DEC74-7A15-4B2B-AFC3-AA102E7C25C1 + ivfenc.DESCRIPTION = Full featured encoder +-UTILS-$(CONFIG_DECODERS) += example_xma.c +-example_xma.GUID = A955FC4A-73F1-44F7-135E-30D84D32F022 +-example_xma.DESCRIPTION = External Memory Allocation mode usage ++ ++# XMA example disabled for now, not used in VP8 ++#UTILS-$(CONFIG_DECODERS) += example_xma.c ++#example_xma.GUID = A955FC4A-73F1-44F7-135E-30D84D32F022 ++#example_xma.DESCRIPTION = External Memory Allocation mode usage + + GEN_EXAMPLES-$(CONFIG_DECODERS) += simple_decoder.c + simple_decoder.GUID = D3BBF1E9-2427-450D-BBFF-B2843C1D44CC +@@ -84,8 +88,6 @@ ifeq ($(HAVE_ALT_TREE_LAYOUT),yes) + INC_PATH := $(SRC_PATH_BARE)/../include + else + LIB_PATH-yes += $(if $(BUILD_PFX),$(BUILD_PFX),.) +- INC_PATH-yes += $(SRC_PATH_BARE)/vpx_codec +- INC_PATH-yes += $(SRC_PATH_BARE)/vpx_ports + INC_PATH-$(CONFIG_VP8_DECODER) += $(SRC_PATH_BARE)/vp8 + INC_PATH-$(CONFIG_VP8_ENCODER) += $(SRC_PATH_BARE)/vp8 + LIB_PATH := $(call enabled,LIB_PATH) +@@ -99,6 +101,7 @@ LDFLAGS += $(addprefix -L,$(LIB_PATH)) + UTILS = $(call enabled,UTILS) + GEN_EXAMPLES = $(call enabled,GEN_EXAMPLES) + ALL_EXAMPLES = $(UTILS) $(GEN_EXAMPLES) ++UTIL_SRCS = $(foreach ex,$(UTILS),$($(ex:.c=).SRCS)) + ALL_SRCS = $(foreach ex,$(ALL_EXAMPLES),$($(ex:.c=).SRCS)) + CODEC_EXTRA_LIBS=$(sort $(call enabled,CODEC_EXTRA_LIBS)) + +@@ -120,8 +123,10 @@ $(eval $(if $(filter universal%,$(TOOLCHAIN)),LIPO_OBJS,BUILD_OBJS):=yes) + # Create build/install dependencies for all examples. The common case + # is handled here. The MSVS case is handled below. + NOT_MSVS = $(if $(CONFIG_MSVS),,yes) +-INSTALL-BINS-$(NOT_MSVS) += $(addprefix bin/,$(ALL_EXAMPLES:.c=)) +-INSTALL-SRCS-yes += $(ALL_SRCS) ++DIST-BINS-$(NOT_MSVS) += $(addprefix bin/,$(ALL_EXAMPLES:.c=)) ++INSTALL-BINS-$(NOT_MSVS) += $(addprefix bin/,$(UTILS:.c=)) ++DIST-SRCS-yes += $(ALL_SRCS) ++INSTALL-SRCS-yes += $(UTIL_SRCS) + OBJS-$(NOT_MSVS) += $(if $(BUILD_OBJS),$(call objs,$(ALL_SRCS))) + BINS-$(NOT_MSVS) += $(addprefix $(BUILD_PFX),$(ALL_EXAMPLES:.c=)) + +diff --git a/examples/decode_to_md5.txt b/examples/decode_to_md5.txt +index 0599b13..b3dd568 100644 +--- a/examples/decode_to_md5.txt ++++ b/examples/decode_to_md5.txt +@@ -26,21 +26,21 @@ is processed, then U, then V. It is important to honor the image's `stride` + values. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PROCESS_DX + unsigned char md5_sum[16]; +-md5_ctx_t md5; ++MD5Context md5; + int i; + +-md5_init(&md5); ++MD5Init(&md5); + + for(plane=0; plane < 3; plane++) { + unsigned char *buf =img->planes[plane]; + + for(y=0; y<img->d_h >> (plane?1:0); y++) { +- md5_update(&md5, buf, img->d_w >> (plane?1:0)); ++ MD5Update(&md5, buf, img->d_w >> (plane?1:0)); + buf += img->stride[plane]; + } + } + +-md5_finalize(&md5, md5_sum); ++MD5Final(md5_sum, &md5); + for(i=0; i<16; i++) + fprintf(outfile, "%02x",md5_sum[i]); + fprintf(outfile, " img-%dx%d-%04d.i420\n", img->d_w, img->d_h, +diff --git a/examples/decoder_tmpl.c b/examples/decoder_tmpl.c +index deea449..826ad20 100644 +--- a/examples/decoder_tmpl.c ++++ b/examples/decoder_tmpl.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +@@ -16,11 +17,9 @@ + #include <stdarg.h> + #include <string.h> + #define VPX_CODEC_DISABLE_COMPAT 1 +-#include "vpx_decoder.h" +-#if CONFIG_VP8_DECODER && !defined(interface) +-#include "vp8dx.h" ++#include "vpx/vpx_decoder.h" ++#include "vpx/vp8dx.h" + #define interface (&vpx_codec_vp8_dx_algo) +-#endif + @EXTRA_INCLUDES + + +diff --git a/examples/decoder_tmpl.txt b/examples/decoder_tmpl.txt +index 3287d50..6da38c2 100644 +--- a/examples/decoder_tmpl.txt ++++ b/examples/decoder_tmpl.txt +@@ -1,7 +1,7 @@ + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DEC_INCLUDES + #define VPX_CODEC_DISABLE_COMPAT 1 +-#include "vpx_decoder.h" +-#include "vp8dx.h" ++#include "vpx/vpx_decoder.h" ++#include "vpx/vp8dx.h" + #define interface (&vpx_codec_vp8_dx_algo) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DEC_INCLUDES + +diff --git a/examples/encoder_tmpl.c b/examples/encoder_tmpl.c +index 2df893a..9e262e9 100644 +--- a/examples/encoder_tmpl.c ++++ b/examples/encoder_tmpl.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +@@ -16,12 +17,10 @@ + #include <stdarg.h> + #include <string.h> + #define VPX_CODEC_DISABLE_COMPAT 1 +-#include "vpx_encoder.h" +-#if CONFIG_VP8_ENCODER && !defined(interface) +-#include "vp8cx.h" ++#include "vpx/vpx_encoder.h" ++#include "vpx/vp8cx.h" + #define interface (&vpx_codec_vp8_cx_algo) + #define fourcc 0x30385056 +-#endif + @EXTRA_INCLUDES + + #define IVF_FILE_HDR_SZ (32) +@@ -129,7 +128,7 @@ int main(int argc, char **argv) { + height = strtol(argv[2], NULL, 0); + if(width < 16 || width%2 || height <16 || height%2) + die("Invalid resolution: %ldx%ld", width, height); +- if(!vpx_img_alloc(&raw, IMG_FMT_YV12, width, height, 1)) ++ if(!vpx_img_alloc(&raw, VPX_IMG_FMT_I420, width, height, 1)) + die("Faile to allocate image", width, height); + if(!(outfile = fopen(argv[4], "wb"))) + die("Failed to open %s for writing", argv[4]); +diff --git a/examples/encoder_tmpl.txt b/examples/encoder_tmpl.txt +index db1ea77..87055ca 100644 +--- a/examples/encoder_tmpl.txt ++++ b/examples/encoder_tmpl.txt +@@ -1,7 +1,7 @@ + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_INCLUDES + #define VPX_CODEC_DISABLE_COMPAT 1 +-#include "vpx_encoder.h" +-#include "vp8cx.h" ++#include "vpx/vpx_encoder.h" ++#include "vpx/vp8cx.h" + #define interface (&vpx_codec_vp8_cx_algo) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_INCLUDES + +diff --git a/examples/gen_example_code.sh b/examples/gen_example_code.sh +index f2e45c5..dc7ad72 100755 +--- a/examples/gen_example_code.sh ++++ b/examples/gen_example_code.sh +@@ -2,10 +2,11 @@ + ## + ## Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ## +-## Use of this source code is governed by a BSD-style license and patent +-## grant that can be found in the LICENSE file in the root of the source +-## tree. All contributing project authors may be found in the AUTHORS +-## file in the root of the source tree. ++## 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. + ## + + +diff --git a/examples/gen_example_doxy.php b/examples/gen_example_doxy.php +index 08beade..ba2617f 100755 +--- a/examples/gen_example_doxy.php ++++ b/examples/gen_example_doxy.php +@@ -2,10 +2,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/examples/gen_example_text.sh b/examples/gen_example_text.sh +index 0e1f796..fcc73d8 100755 +--- a/examples/gen_example_text.sh ++++ b/examples/gen_example_text.sh +@@ -2,10 +2,11 @@ + ## + ## Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ## +-## Use of this source code is governed by a BSD-style license and patent +-## grant that can be found in the LICENSE file in the root of the source +-## tree. All contributing project authors may be found in the AUTHORS +-## file in the root of the source tree. ++## 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. + ## + + +diff --git a/examples/includes/PHP-Markdown-Extra-1.2.3/markdown.php.orig b/examples/includes/PHP-Markdown-Extra-1.2.3/markdown.php.orig +deleted file mode 100644 +index b0ed7c9..0000000 +--- a/examples/includes/PHP-Markdown-Extra-1.2.3/markdown.php.orig ++++ /dev/null +@@ -1,2909 +0,0 @@ +-<?php +-# +-# Markdown Extra - A text-to-HTML conversion tool for web writers +-# +-# PHP Markdown & Extra +-# Copyright (c) 2004-2008 Michel Fortin +-# <http://www.michelf.com/projects/php-markdown/> +-# +-# Original Markdown +-# Copyright (c) 2004-2006 John Gruber +-# <http://daringfireball.net/projects/markdown/> +-# +- +- +-define( 'MARKDOWN_VERSION', "1.0.1m" ); # Sat 21 Jun 2008 +-define( 'MARKDOWNEXTRA_VERSION', "1.2.3" ); # Wed 31 Dec 2008 +- +- +-# +-# Global default settings: +-# +- +-# Change to ">" for HTML output +-@define( 'MARKDOWN_EMPTY_ELEMENT_SUFFIX', " />"); +- +-# Define the width of a tab for code blocks. +-@define( 'MARKDOWN_TAB_WIDTH', 4 ); +- +-# Optional title attribute for footnote links and backlinks. +-@define( 'MARKDOWN_FN_LINK_TITLE', "" ); +-@define( 'MARKDOWN_FN_BACKLINK_TITLE', "" ); +- +-# Optional class attribute for footnote links and backlinks. +-@define( 'MARKDOWN_FN_LINK_CLASS', "" ); +-@define( 'MARKDOWN_FN_BACKLINK_CLASS', "" ); +- +- +-# +-# WordPress settings: +-# +- +-# Change to false to remove Markdown from posts and/or comments. +-@define( 'MARKDOWN_WP_POSTS', true ); +-@define( 'MARKDOWN_WP_COMMENTS', true ); +- +- +- +-### Standard Function Interface ### +- +-@define( 'MARKDOWN_PARSER_CLASS', 'MarkdownExtra_Parser' ); +- +-function Markdown($text) { +-# +-# Initialize the parser and return the result of its transform method. +-# +- # Setup static parser variable. +- static $parser; +- if (!isset($parser)) { +- $parser_class = MARKDOWN_PARSER_CLASS; +- $parser = new $parser_class; +- } +- +- # Transform text using parser. +- return $parser->transform($text); +-} +- +- +-### WordPress Plugin Interface ### +- +-/* +-Plugin Name: Markdown Extra +-Plugin URI: http://www.michelf.com/projects/php-markdown/ +-Description: <a href="http://daringfireball.net/projects/markdown/syntax">Markdown syntax</a> allows you to write using an easy-to-read, easy-to-write plain text format. Based on the original Perl version by <a href="http://daringfireball.net/">John Gruber</a>. <a href="http://www.michelf.com/projects/php-markdown/">More...</a> +-Version: 1.2.2 +-Author: Michel Fortin +-Author URI: http://www.michelf.com/ +-*/ +- +-if (isset($wp_version)) { +- # More details about how it works here: +- # <http://www.michelf.com/weblog/2005/wordpress-text-flow-vs-markdown/> +- +- # Post content and excerpts +- # - Remove WordPress paragraph generator. +- # - Run Markdown on excerpt, then remove all tags. +- # - Add paragraph tag around the excerpt, but remove it for the excerpt rss. +- if (MARKDOWN_WP_POSTS) { +- remove_filter('the_content', 'wpautop'); +- remove_filter('the_content_rss', 'wpautop'); +- remove_filter('the_excerpt', 'wpautop'); +- add_filter('the_content', 'mdwp_MarkdownPost', 6); +- add_filter('the_content_rss', 'mdwp_MarkdownPost', 6); +- add_filter('get_the_excerpt', 'mdwp_MarkdownPost', 6); +- add_filter('get_the_excerpt', 'trim', 7); +- add_filter('the_excerpt', 'mdwp_add_p'); +- add_filter('the_excerpt_rss', 'mdwp_strip_p'); +- +- remove_filter('content_save_pre', 'balanceTags', 50); +- remove_filter('excerpt_save_pre', 'balanceTags', 50); +- add_filter('the_content', 'balanceTags', 50); +- add_filter('get_the_excerpt', 'balanceTags', 9); +- } +- +- # Add a footnote id prefix to posts when inside a loop. +- function mdwp_MarkdownPost($text) { +- static $parser; +- if (!$parser) { +- $parser_class = MARKDOWN_PARSER_CLASS; +- $parser = new $parser_class; +- } +- if (is_single() || is_page() || is_feed()) { +- $parser->fn_id_prefix = ""; +- } else { +- $parser->fn_id_prefix = get_the_ID() . "."; +- } +- return $parser->transform($text); +- } +- +- # Comments +- # - Remove WordPress paragraph generator. +- # - Remove WordPress auto-link generator. +- # - Scramble important tags before passing them to the kses filter. +- # - Run Markdown on excerpt then remove paragraph tags. +- if (MARKDOWN_WP_COMMENTS) { +- remove_filter('comment_text', 'wpautop', 30); +- remove_filter('comment_text', 'make_clickable'); +- add_filter('pre_comment_content', 'Markdown', 6); +- add_filter('pre_comment_content', 'mdwp_hide_tags', 8); +- add_filter('pre_comment_content', 'mdwp_show_tags', 12); +- add_filter('get_comment_text', 'Markdown', 6); +- add_filter('get_comment_excerpt', 'Markdown', 6); +- add_filter('get_comment_excerpt', 'mdwp_strip_p', 7); +- +- global $mdwp_hidden_tags, $mdwp_placeholders; +- $mdwp_hidden_tags = explode(' ', +- '<p> </p> <pre> </pre> <ol> </ol> <ul> </ul> <li> </li>'); +- $mdwp_placeholders = explode(' ', str_rot13( +- 'pEj07ZbbBZ U1kqgh4w4p pre2zmeN6K QTi31t9pre ol0MP1jzJR '. +- 'ML5IjmbRol ulANi1NsGY J7zRLJqPul liA8ctl16T K9nhooUHli')); +- } +- +- function mdwp_add_p($text) { +- if (!preg_match('{^$|^<(p|ul|ol|dl|pre|blockquote)>}i', $text)) { +- $text = '<p>'.$text.'</p>'; +- $text = preg_replace('{\n{2,}}', "</p>\n\n<p>", $text); +- } +- return $text; +- } +- +- function mdwp_strip_p($t) { return preg_replace('{</?p>}i', '', $t); } +- +- function mdwp_hide_tags($text) { +- global $mdwp_hidden_tags, $mdwp_placeholders; +- return str_replace($mdwp_hidden_tags, $mdwp_placeholders, $text); +- } +- function mdwp_show_tags($text) { +- global $mdwp_hidden_tags, $mdwp_placeholders; +- return str_replace($mdwp_placeholders, $mdwp_hidden_tags, $text); +- } +-} +- +- +-### bBlog Plugin Info ### +- +-function identify_modifier_markdown() { +- return array( +- 'name' => 'markdown', +- 'type' => 'modifier', +- 'nicename' => 'PHP Markdown Extra', +- 'description' => 'A text-to-HTML conversion tool for web writers', +- 'authors' => 'Michel Fortin and John Gruber', +- 'licence' => 'GPL', +- 'version' => MARKDOWNEXTRA_VERSION, +- 'help' => '<a href="http://daringfireball.net/projects/markdown/syntax">Markdown syntax</a> allows you to write using an easy-to-read, easy-to-write plain text format. Based on the original Perl version by <a href="http://daringfireball.net/">John Gruber</a>. <a href="http://www.michelf.com/projects/php-markdown/">More...</a>', +- ); +-} +- +- +-### Smarty Modifier Interface ### +- +-function smarty_modifier_markdown($text) { +- return Markdown($text); +-} +- +- +-### Textile Compatibility Mode ### +- +-# Rename this file to "classTextile.php" and it can replace Textile everywhere. +- +-if (strcasecmp(substr(__FILE__, -16), "classTextile.php") == 0) { +- # Try to include PHP SmartyPants. Should be in the same directory. +- @include_once 'smartypants.php'; +- # Fake Textile class. It calls Markdown instead. +- class Textile { +- function TextileThis($text, $lite='', $encode='') { +- if ($lite == '' && $encode == '') $text = Markdown($text); +- if (function_exists('SmartyPants')) $text = SmartyPants($text); +- return $text; +- } +- # Fake restricted version: restrictions are not supported for now. +- function TextileRestricted($text, $lite='', $noimage='') { +- return $this->TextileThis($text, $lite); +- } +- # Workaround to ensure compatibility with TextPattern 4.0.3. +- function blockLite($text) { return $text; } +- } +-} +- +- +- +-# +-# Markdown Parser Class +-# +- +-class Markdown_Parser { +- +- # Regex to match balanced [brackets]. +- # Needed to insert a maximum bracked depth while converting to PHP. +- var $nested_brackets_depth = 6; +- var $nested_brackets_re; +- +- var $nested_url_parenthesis_depth = 4; +- var $nested_url_parenthesis_re; +- +- # Table of hash values for escaped characters: +- var $escape_chars = '\`*_{}[]()>#+-.!'; +- var $escape_chars_re; +- +- # Change to ">" for HTML output. +- var $empty_element_suffix = MARKDOWN_EMPTY_ELEMENT_SUFFIX; +- var $tab_width = MARKDOWN_TAB_WIDTH; +- +- # Change to `true` to disallow markup or entities. +- var $no_markup = false; +- var $no_entities = true; +- +- # Predefined urls and titles for reference links and images. +- var $predef_urls = array(); +- var $predef_titles = array(); +- +- +- function Markdown_Parser() { +- # +- # Constructor function. Initialize appropriate member variables. +- # +- $this->_initDetab(); +- $this->prepareItalicsAndBold(); +- +- $this->nested_brackets_re = +- str_repeat('(?>[^\[\]]+|\[', $this->nested_brackets_depth). +- str_repeat('\])*', $this->nested_brackets_depth); +- +- $this->nested_url_parenthesis_re = +- str_repeat('(?>[^()\s]+|\(', $this->nested_url_parenthesis_depth). +- str_repeat('(?>\)))*', $this->nested_url_parenthesis_depth); +- +- $this->escape_chars_re = '['.preg_quote($this->escape_chars).']'; +- +- # Sort document, block, and span gamut in ascendent priority order. +- asort($this->document_gamut); +- asort($this->block_gamut); +- asort($this->span_gamut); +- } +- +- +- # Internal hashes used during transformation. +- var $urls = array(); +- var $titles = array(); +- var $html_hashes = array(); +- +- # Status flag to avoid invalid nesting. +- var $in_anchor = false; +- +- +- function setup() { +- # +- # Called before the transformation process starts to setup parser +- # states. +- # +- # Clear global hashes. +- $this->urls = $this->predef_urls; +- $this->titles = $this->predef_titles; +- $this->html_hashes = array(); +- +- $in_anchor = false; +- } +- +- function teardown() { +- # +- # Called after the transformation process to clear any variable +- # which may be taking up memory unnecessarly. +- # +- $this->urls = array(); +- $this->titles = array(); +- $this->html_hashes = array(); +- } +- +- +- function transform($text) { +- # +- # Main function. Performs some preprocessing on the input text +- # and pass it through the document gamut. +- # +- $this->setup(); +- +- # Remove UTF-8 BOM and marker character in input, if present. +- $text = preg_replace('{^\xEF\xBB\xBF|\x1A}', '', $text); +- +- # Standardize line endings: +- # DOS to Unix and Mac to Unix +- $text = preg_replace('{\r\n?}', "\n", $text); +- +- # Make sure $text ends with a couple of newlines: +- $text .= "\n\n"; +- +- # Convert all tabs to spaces. +- $text = $this->detab($text); +- +- # Turn block-level HTML blocks into hash entries +- $text = $this->hashHTMLBlocks($text); +- +- # Strip any lines consisting only of spaces and tabs. +- # This makes subsequent regexen easier to write, because we can +- # match consecutive blank lines with /\n+/ instead of something +- # contorted like /[ ]*\n+/ . +- $text = preg_replace('/^[ ]+$/m', '', $text); +- +- # Run document gamut methods. +- foreach ($this->document_gamut as $method => $priority) { +- $text = $this->$method($text); +- } +- +- $this->teardown(); +- +- return $text . "\n"; +- } +- +- var $document_gamut = array( +- # Strip link definitions, store in hashes. +- "stripLinkDefinitions" => 20, +- +- "runBasicBlockGamut" => 30, +- ); +- +- +- function stripLinkDefinitions($text) { +- # +- # Strips link definitions from text, stores the URLs and titles in +- # hash references. +- # +- $less_than_tab = $this->tab_width - 1; +- +- # Link defs are in the form: ^[id]: url "optional title" +- $text = preg_replace_callback('{ +- ^[ ]{0,'.$less_than_tab.'}\[(.+)\][ ]?: # id = $1 +- [ ]* +- \n? # maybe *one* newline +- [ ]* +- <?(\S+?)>? # url = $2 +- [ ]* +- \n? # maybe one newline +- [ ]* +- (?: +- (?<=\s) # lookbehind for whitespace +- ["(] +- (.*?) # title = $3 +- [")] +- [ ]* +- )? # title is optional +- (?:\n+|\Z) +- }xm', +- array(&$this, '_stripLinkDefinitions_callback'), +- $text); +- return $text; +- } +- function _stripLinkDefinitions_callback($matches) { +- $link_id = strtolower($matches[1]); +- $this->urls[$link_id] = $matches[2]; +- $this->titles[$link_id] =& $matches[3]; +- return ''; # String that will replace the block +- } +- +- +- function hashHTMLBlocks($text) { +- if ($this->no_markup) return $text; +- +- $less_than_tab = $this->tab_width - 1; +- +- # Hashify HTML blocks: +- # We only want to do this for block-level HTML tags, such as headers, +- # lists, and tables. That's because we still want to wrap <p>s around +- # "paragraphs" that are wrapped in non-block-level tags, such as anchors, +- # phrase emphasis, and spans. The list of tags we're looking for is +- # hard-coded: +- # +- # * List "a" is made of tags which can be both inline or block-level. +- # These will be treated block-level when the start tag is alone on +- # its line, otherwise they're not matched here and will be taken as +- # inline later. +- # * List "b" is made of tags which are always block-level; +- # +- $block_tags_a_re = 'ins|del'; +- $block_tags_b_re = 'p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|address|'. +- 'script|noscript|form|fieldset|iframe|math'; +- +- # Regular expression for the content of a block tag. +- $nested_tags_level = 4; +- $attr = ' +- (?> # optional tag attributes +- \s # starts with whitespace +- (?> +- [^>"/]+ # text outside quotes +- | +- /+(?!>) # slash not followed by ">" +- | +- "[^"]*" # text inside double quotes (tolerate ">") +- | +- \'[^\']*\' # text inside single quotes (tolerate ">") +- )* +- )? +- '; +- $content = +- str_repeat(' +- (?> +- [^<]+ # content without tag +- | +- <\2 # nested opening tag +- '.$attr.' # attributes +- (?> +- /> +- | +- >', $nested_tags_level). # end of opening tag +- '.*?'. # last level nested tag content +- str_repeat(' +- </\2\s*> # closing nested tag +- ) +- | +- <(?!/\2\s*> # other tags with a different name +- ) +- )*', +- $nested_tags_level); +- $content2 = str_replace('\2', '\3', $content); +- +- # First, look for nested blocks, e.g.: +- # <div> +- # <div> +- # tags for inner block must be indented. +- # </div> +- # </div> +- # +- # The outermost tags must start at the left margin for this to match, and +- # the inner nested divs must be indented. +- # We need to do this before the next, more liberal match, because the next +- # match will start at the first `<div>` and stop at the first `</div>`. +- $text = preg_replace_callback('{(?> +- (?> +- (?<=\n\n) # Starting after a blank line +- | # or +- \A\n? # the beginning of the doc +- ) +- ( # save in $1 +- +- # Match from `\n<tag>` to `</tag>\n`, handling nested tags +- # in between. +- +- [ ]{0,'.$less_than_tab.'} +- <('.$block_tags_b_re.')# start tag = $2 +- '.$attr.'> # attributes followed by > and \n +- '.$content.' # content, support nesting +- </\2> # the matching end tag +- [ ]* # trailing spaces/tabs +- (?=\n+|\Z) # followed by a newline or end of document +- +- | # Special version for tags of group a. +- +- [ ]{0,'.$less_than_tab.'} +- <('.$block_tags_a_re.')# start tag = $3 +- '.$attr.'>[ ]*\n # attributes followed by > +- '.$content2.' # content, support nesting +- </\3> # the matching end tag +- [ ]* # trailing spaces/tabs +- (?=\n+|\Z) # followed by a newline or end of document +- +- | # Special case just for <hr />. It was easier to make a special +- # case than to make the other regex more complicated. +- +- [ ]{0,'.$less_than_tab.'} +- <(hr) # start tag = $2 +- '.$attr.' # attributes +- /?> # the matching end tag +- [ ]* +- (?=\n{2,}|\Z) # followed by a blank line or end of document +- +- | # Special case for standalone HTML comments: +- +- [ ]{0,'.$less_than_tab.'} +- (?s: +- <!-- .*? --> +- ) +- [ ]* +- (?=\n{2,}|\Z) # followed by a blank line or end of document +- +- | # PHP and ASP-style processor instructions (<? and <%) +- +- [ ]{0,'.$less_than_tab.'} +- (?s: +- <([?%]) # $2 +- .*? +- \2> +- ) +- [ ]* +- (?=\n{2,}|\Z) # followed by a blank line or end of document +- +- ) +- )}Sxmi', +- array(&$this, '_hashHTMLBlocks_callback'), +- $text); +- +- return $text; +- } +- function _hashHTMLBlocks_callback($matches) { +- $text = $matches[1]; +- $key = $this->hashBlock($text); +- return "\n\n$key\n\n"; +- } +- +- +- function hashPart($text, $boundary = 'X') { +- # +- # Called whenever a tag must be hashed when a function insert an atomic +- # element in the text stream. Passing $text to through this function gives +- # a unique text-token which will be reverted back when calling unhash. +- # +- # The $boundary argument specify what character should be used to surround +- # the token. By convension, "B" is used for block elements that needs not +- # to be wrapped into paragraph tags at the end, ":" is used for elements +- # that are word separators and "X" is used in the general case. +- # +- # Swap back any tag hash found in $text so we do not have to `unhash` +- # multiple times at the end. +- $text = $this->unhash($text); +- +- # Then hash the block. +- static $i = 0; +- $key = "$boundary\x1A" . ++$i . $boundary; +- $this->html_hashes[$key] = $text; +- return $key; # String that will replace the tag. +- } +- +- +- function hashBlock($text) { +- # +- # Shortcut function for hashPart with block-level boundaries. +- # +- return $this->hashPart($text, 'B'); +- } +- +- +- var $block_gamut = array( +- # +- # These are all the transformations that form block-level +- # tags like paragraphs, headers, and list items. +- # +- "doHeaders" => 10, +- "doHorizontalRules" => 20, +- +- "doLists" => 40, +- "doCodeBlocks" => 50, +- "doBlockQuotes" => 60, +- ); +- +- function runBlockGamut($text) { +- # +- # Run block gamut tranformations. +- # +- # We need to escape raw HTML in Markdown source before doing anything +- # else. This need to be done for each block, and not only at the +- # begining in the Markdown function since hashed blocks can be part of +- # list items and could have been indented. Indented blocks would have +- # been seen as a code block in a previous pass of hashHTMLBlocks. +- $text = $this->hashHTMLBlocks($text); +- +- return $this->runBasicBlockGamut($text); +- } +- +- function runBasicBlockGamut($text) { +- # +- # Run block gamut tranformations, without hashing HTML blocks. This is +- # useful when HTML blocks are known to be already hashed, like in the first +- # whole-document pass. +- # +- foreach ($this->block_gamut as $method => $priority) { +- $text = $this->$method($text); +- } +- +- # Finally form paragraph and restore hashed blocks. +- $text = $this->formParagraphs($text); +- +- return $text; +- } +- +- +- function doHorizontalRules($text) { +- # Do Horizontal Rules: +- return preg_replace( +- '{ +- ^[ ]{0,3} # Leading space +- ([-*_]) # $1: First marker +- (?> # Repeated marker group +- [ ]{0,2} # Zero, one, or two spaces. +- \1 # Marker character +- ){2,} # Group repeated at least twice +- [ ]* # Tailing spaces +- $ # End of line. +- }mx', +- "\n".$this->hashBlock("<hr$this->empty_element_suffix")."\n", +- $text); +- } +- +- +- var $span_gamut = array( +- # +- # These are all the transformations that occur *within* block-level +- # tags like paragraphs, headers, and list items. +- # +- # Process character escapes, code spans, and inline HTML +- # in one shot. +- "parseSpan" => -30, +- +- # Process anchor and image tags. Images must come first, +- # because ![foo][f] looks like an anchor. +- "doImages" => 10, +- "doAnchors" => 20, +- +- # Make links out of things like `<http://example.com/>` +- # Must come after doAnchors, because you can use < and > +- # delimiters in inline links like [this](<url>). +- "doAutoLinks" => 30, +- "encodeAmpsAndAngles" => 40, +- +- "doItalicsAndBold" => 50, +- "doHardBreaks" => 60, +- ); +- +- function runSpanGamut($text) { +- # +- # Run span gamut tranformations. +- # +- foreach ($this->span_gamut as $method => $priority) { +- $text = $this->$method($text); +- } +- +- return $text; +- } +- +- +- function doHardBreaks($text) { +- # Do hard breaks: +- return preg_replace_callback('/ {2,}\n/', +- array(&$this, '_doHardBreaks_callback'), $text); +- } +- function _doHardBreaks_callback($matches) { +- return $this->hashPart("<br$this->empty_element_suffix\n"); +- } +- +- +- function doAnchors($text) { +- # +- # Turn Markdown link shortcuts into XHTML <a> tags. +- # +- if ($this->in_anchor) return $text; +- $this->in_anchor = true; +- +- # +- # First, handle reference-style links: [link text] [id] +- # +- $text = preg_replace_callback('{ +- ( # wrap whole match in $1 +- \[ +- ('.$this->nested_brackets_re.') # link text = $2 +- \] +- +- [ ]? # one optional space +- (?:\n[ ]*)? # one optional newline followed by spaces +- +- \[ +- (.*?) # id = $3 +- \] +- ) +- }xs', +- array(&$this, '_doAnchors_reference_callback'), $text); +- +- # +- # Next, inline-style links: [link text](url "optional title") +- # +- $text = preg_replace_callback('{ +- ( # wrap whole match in $1 +- \[ +- ('.$this->nested_brackets_re.') # link text = $2 +- \] +- \( # literal paren +- [ ]* +- (?: +- <(\S*)> # href = $3 +- | +- ('.$this->nested_url_parenthesis_re.') # href = $4 +- ) +- [ ]* +- ( # $5 +- ([\'"]) # quote char = $6 +- (.*?) # Title = $7 +- \6 # matching quote +- [ ]* # ignore any spaces/tabs between closing quote and ) +- )? # title is optional +- \) +- ) +- }xs', +- array(&$this, '_DoAnchors_inline_callback'), $text); +- +- # +- # Last, handle reference-style shortcuts: [link text] +- # These must come last in case you've also got [link test][1] +- # or [link test](/foo) +- # +-// $text = preg_replace_callback('{ +-// ( # wrap whole match in $1 +-// \[ +-// ([^\[\]]+) # link text = $2; can\'t contain [ or ] +-// \] +-// ) +-// }xs', +-// array(&$this, '_doAnchors_reference_callback'), $text); +- +- $this->in_anchor = false; +- return $text; +- } +- function _doAnchors_reference_callback($matches) { +- $whole_match = $matches[1]; +- $link_text = $matches[2]; +- $link_id =& $matches[3]; +- +- if ($link_id == "") { +- # for shortcut links like [this][] or [this]. +- $link_id = $link_text; +- } +- +- # lower-case and turn embedded newlines into spaces +- $link_id = strtolower($link_id); +- $link_id = preg_replace('{[ ]?\n}', ' ', $link_id); +- +- if (isset($this->urls[$link_id])) { +- $url = $this->urls[$link_id]; +- $url = $this->encodeAttribute($url); +- +- $result = "<a href=\"$url\""; +- if ( isset( $this->titles[$link_id] ) ) { +- $title = $this->titles[$link_id]; +- $title = $this->encodeAttribute($title); +- $result .= " title=\"$title\""; +- } +- +- $link_text = $this->runSpanGamut($link_text); +- $result .= ">$link_text</a>"; +- $result = $this->hashPart($result); +- } +- else { +- $result = $whole_match; +- } +- return $result; +- } +- function _doAnchors_inline_callback($matches) { +- $whole_match = $matches[1]; +- $link_text = $this->runSpanGamut($matches[2]); +- $url = $matches[3] == '' ? $matches[4] : $matches[3]; +- $title =& $matches[7]; +- +- $url = $this->encodeAttribute($url); +- +- $result = "<a href=\"$url\""; +- if (isset($title)) { +- $title = $this->encodeAttribute($title); +- $result .= " title=\"$title\""; +- } +- +- $link_text = $this->runSpanGamut($link_text); +- $result .= ">$link_text</a>"; +- +- return $this->hashPart($result); +- } +- +- +- function doImages($text) { +- # +- # Turn Markdown image shortcuts into <img> tags. +- # +- # +- # First, handle reference-style labeled images: ![alt text][id] +- # +- $text = preg_replace_callback('{ +- ( # wrap whole match in $1 +- !\[ +- ('.$this->nested_brackets_re.') # alt text = $2 +- \] +- +- [ ]? # one optional space +- (?:\n[ ]*)? # one optional newline followed by spaces +- +- \[ +- (.*?) # id = $3 +- \] +- +- ) +- }xs', +- array(&$this, '_doImages_reference_callback'), $text); +- +- # +- # Next, handle inline images: ![alt text](url "optional title") +- # Don't forget: encode * and _ +- # +- $text = preg_replace_callback('{ +- ( # wrap whole match in $1 +- !\[ +- ('.$this->nested_brackets_re.') # alt text = $2 +- \] +- \s? # One optional whitespace character +- \( # literal paren +- [ ]* +- (?: +- <(\S*)> # src url = $3 +- | +- ('.$this->nested_url_parenthesis_re.') # src url = $4 +- ) +- [ ]* +- ( # $5 +- ([\'"]) # quote char = $6 +- (.*?) # title = $7 +- \6 # matching quote +- [ ]* +- )? # title is optional +- \) +- ) +- }xs', +- array(&$this, '_doImages_inline_callback'), $text); +- +- return $text; +- } +- function _doImages_reference_callback($matches) { +- $whole_match = $matches[1]; +- $alt_text = $matches[2]; +- $link_id = strtolower($matches[3]); +- +- if ($link_id == "") { +- $link_id = strtolower($alt_text); # for shortcut links like ![this][]. +- } +- +- $alt_text = $this->encodeAttribute($alt_text); +- if (isset($this->urls[$link_id])) { +- $url = $this->encodeAttribute($this->urls[$link_id]); +- $result = "<img src=\"$url\" alt=\"$alt_text\""; +- if (isset($this->titles[$link_id])) { +- $title = $this->titles[$link_id]; +- $title = $this->encodeAttribute($title); +- $result .= " title=\"$title\""; +- } +- $result .= $this->empty_element_suffix; +- $result = $this->hashPart($result); +- } +- else { +- # If there's no such link ID, leave intact: +- $result = $whole_match; +- } +- +- return $result; +- } +- function _doImages_inline_callback($matches) { +- $whole_match = $matches[1]; +- $alt_text = $matches[2]; +- $url = $matches[3] == '' ? $matches[4] : $matches[3]; +- $title =& $matches[7]; +- +- $alt_text = $this->encodeAttribute($alt_text); +- $url = $this->encodeAttribute($url); +- $result = "<img src=\"$url\" alt=\"$alt_text\""; +- if (isset($title)) { +- $title = $this->encodeAttribute($title); +- $result .= " title=\"$title\""; # $title already quoted +- } +- $result .= $this->empty_element_suffix; +- +- return $this->hashPart($result); +- } +- +- +- function doHeaders($text) { +- # Setext-style headers: +- # Header 1 +- # ======== +- # +- # Header 2 +- # -------- +- # +- $text = preg_replace_callback('{ ^(.+?)[ ]*\n(=+|-+)[ ]*\n+ }mx', +- array(&$this, '_doHeaders_callback_setext'), $text); +- +- # atx-style headers: +- # # Header 1 +- # ## Header 2 +- # ## Header 2 with closing hashes ## +- # ... +- # ###### Header 6 +- # +- $text = preg_replace_callback('{ +- ^(\#{1,6}) # $1 = string of #\'s +- [ ]* +- (.+?) # $2 = Header text +- [ ]* +- \#* # optional closing #\'s (not counted) +- \n+ +- }xm', +- array(&$this, '_doHeaders_callback_atx'), $text); +- +- return $text; +- } +- function _doHeaders_callback_setext($matches) { +- # Terrible hack to check we haven't found an empty list item. +- if ($matches[2] == '-' && preg_match('{^-(?: |$)}', $matches[1])) +- return $matches[0]; +- +- $level = $matches[2]{0} == '=' ? 1 : 2; +- $block = "<h$level>".$this->runSpanGamut($matches[1])."</h$level>"; +- return "\n" . $this->hashBlock($block) . "\n\n"; +- } +- function _doHeaders_callback_atx($matches) { +- $level = strlen($matches[1]); +- $block = "<h$level>".$this->runSpanGamut($matches[2])."</h$level>"; +- return "\n" . $this->hashBlock($block) . "\n\n"; +- } +- +- +- function doLists($text) { +- # +- # Form HTML ordered (numbered) and unordered (bulleted) lists. +- # +- $less_than_tab = $this->tab_width - 1; +- +- # Re-usable patterns to match list item bullets and number markers: +- $marker_ul_re = '[*+-]'; +- $marker_ol_re = '\d+[.]'; +- $marker_any_re = "(?:$marker_ul_re|$marker_ol_re)"; +- +- $markers_relist = array($marker_ul_re, $marker_ol_re); +- +- foreach ($markers_relist as $marker_re) { +- # Re-usable pattern to match any entirel ul or ol list: +- $whole_list_re = ' +- ( # $1 = whole list +- ( # $2 +- [ ]{0,'.$less_than_tab.'} +- ('.$marker_re.') # $3 = first list item marker +- [ ]+ +- ) +- (?s:.+?) +- ( # $4 +- \z +- | +- \n{2,} +- (?=\S) +- (?! # Negative lookahead for another list item marker +- [ ]* +- '.$marker_re.'[ ]+ +- ) +- ) +- ) +- '; // mx +- +- # We use a different prefix before nested lists than top-level lists. +- # See extended comment in _ProcessListItems(). +- +- if ($this->list_level) { +- $text = preg_replace_callback('{ +- ^ +- '.$whole_list_re.' +- }mx', +- array(&$this, '_doLists_callback'), $text); +- } +- else { +- $text = preg_replace_callback('{ +- (?:(?<=\n)\n|\A\n?) # Must eat the newline +- '.$whole_list_re.' +- }mx', +- array(&$this, '_doLists_callback'), $text); +- } +- } +- +- return $text; +- } +- function _doLists_callback($matches) { +- # Re-usable patterns to match list item bullets and number markers: +- $marker_ul_re = '[*+-]'; +- $marker_ol_re = '\d+[.]'; +- $marker_any_re = "(?:$marker_ul_re|$marker_ol_re)"; +- +- $list = $matches[1]; +- $list_type = preg_match("/$marker_ul_re/", $matches[3]) ? "ul" : "ol"; +- +- $marker_any_re = ( $list_type == "ul" ? $marker_ul_re : $marker_ol_re ); +- +- $list .= "\n"; +- $result = $this->processListItems($list, $marker_any_re); +- +- $result = $this->hashBlock("<$list_type>\n" . $result . "</$list_type>"); +- return "\n". $result ."\n\n"; +- } +- +- var $list_level = 0; +- +- function processListItems($list_str, $marker_any_re) { +- # +- # Process the contents of a single ordered or unordered list, splitting it +- # into individual list items. +- # +- # The $this->list_level global keeps track of when we're inside a list. +- # Each time we enter a list, we increment it; when we leave a list, +- # we decrement. If it's zero, we're not in a list anymore. +- # +- # We do this because when we're not inside a list, we want to treat +- # something like this: +- # +- # I recommend upgrading to version +- # 8. Oops, now this line is treated +- # as a sub-list. +- # +- # As a single paragraph, despite the fact that the second line starts +- # with a digit-period-space sequence. +- # +- # Whereas when we're inside a list (or sub-list), that line will be +- # treated as the start of a sub-list. What a kludge, huh? This is +- # an aspect of Markdown's syntax that's hard to parse perfectly +- # without resorting to mind-reading. Perhaps the solution is to +- # change the syntax rules such that sub-lists must start with a +- # starting cardinal number; e.g. "1." or "a.". +- +- $this->list_level++; +- +- # trim trailing blank lines: +- $list_str = preg_replace("/\n{2,}\\z/", "\n", $list_str); +- +- $list_str = preg_replace_callback('{ +- (\n)? # leading line = $1 +- (^[ ]*) # leading whitespace = $2 +- ('.$marker_any_re.' # list marker and space = $3 +- (?:[ ]+|(?=\n)) # space only required if item is not empty +- ) +- ((?s:.*?)) # list item text = $4 +- (?:(\n+(?=\n))|\n) # tailing blank line = $5 +- (?= \n* (\z | \2 ('.$marker_any_re.') (?:[ ]+|(?=\n)))) +- }xm', +- array(&$this, '_processListItems_callback'), $list_str); +- +- $this->list_level--; +- return $list_str; +- } +- function _processListItems_callback($matches) { +- $item = $matches[4]; +- $leading_line =& $matches[1]; +- $leading_space =& $matches[2]; +- $marker_space = $matches[3]; +- $tailing_blank_line =& $matches[5]; +- +- if ($leading_line || $tailing_blank_line || +- preg_match('/\n{2,}/', $item)) +- { +- # Replace marker with the appropriate whitespace indentation +- $item = $leading_space . str_repeat(' ', strlen($marker_space)) . $item; +- $item = $this->runBlockGamut($this->outdent($item)."\n"); +- } +- else { +- # Recursion for sub-lists: +- $item = $this->doLists($this->outdent($item)); +- $item = preg_replace('/\n+$/', '', $item); +- $item = $this->runSpanGamut($item); +- } +- +- return "<li>" . $item . "</li>\n"; +- } +- +- +- function doCodeBlocks($text) { +- # +- # Process Markdown `<pre><code>` blocks. +- # +- $text = preg_replace_callback('{ +- (?:\n\n|\A\n?) +- ( # $1 = the code block -- one or more lines, starting with a space/tab +- (?> +- [ ]{'.$this->tab_width.'} # Lines must start with a tab or a tab-width of spaces +- .*\n+ +- )+ +- ) +- ((?=^[ ]{0,'.$this->tab_width.'}\S)|\Z) # Lookahead for non-space at line-start, or end of doc +- }xm', +- array(&$this, '_doCodeBlocks_callback'), $text); +- +- return $text; +- } +- function _doCodeBlocks_callback($matches) { +- $codeblock = $matches[1]; +- +- $codeblock = $this->outdent($codeblock); +- $codeblock = htmlspecialchars($codeblock, ENT_NOQUOTES); +- +- # trim leading newlines and trailing newlines +- $codeblock = preg_replace('/\A\n+|\n+\z/', '', $codeblock); +- +- $codeblock = "<pre><code>$codeblock\n</code></pre>"; +- return "\n\n".$this->hashBlock($codeblock)."\n\n"; +- } +- +- +- function makeCodeSpan($code) { +- # +- # Create a code span markup for $code. Called from handleSpanToken. +- # +- $code = htmlspecialchars(trim($code), ENT_NOQUOTES); +- return $this->hashPart("<code>$code</code>"); +- } +- +- +- var $em_relist = array( +- '' => '(?:(?<!\*)\*(?!\*)|(?<!_)_(?!_))(?=\S)(?![.,:;]\s)', +- '*' => '(?<=\S)(?<!\*)\*(?!\*)', +- '_' => '(?<=\S)(?<!_)_(?!_)', +- ); +- var $strong_relist = array( +- '' => '(?:(?<!\*)\*\*(?!\*)|(?<!_)__(?!_))(?=\S)(?![.,:;]\s)', +- '**' => '(?<=\S)(?<!\*)\*\*(?!\*)', +- '__' => '(?<=\S)(?<!_)__(?!_)', +- ); +- var $em_strong_relist = array( +- '' => '(?:(?<!\*)\*\*\*(?!\*)|(?<!_)___(?!_))(?=\S)(?![.,:;]\s)', +- '***' => '(?<=\S)(?<!\*)\*\*\*(?!\*)', +- '___' => '(?<=\S)(?<!_)___(?!_)', +- ); +- var $em_strong_prepared_relist; +- +- function prepareItalicsAndBold() { +- # +- # Prepare regular expressions for seraching emphasis tokens in any +- # context. +- # +- foreach ($this->em_relist as $em => $em_re) { +- foreach ($this->strong_relist as $strong => $strong_re) { +- # Construct list of allowed token expressions. +- $token_relist = array(); +- if (isset($this->em_strong_relist["$em$strong"])) { +- $token_relist[] = $this->em_strong_relist["$em$strong"]; +- } +- $token_relist[] = $em_re; +- $token_relist[] = $strong_re; +- +- # Construct master expression from list. +- $token_re = '{('. implode('|', $token_relist) .')}'; +- $this->em_strong_prepared_relist["$em$strong"] = $token_re; +- } +- } +- } +- +- function doItalicsAndBold($text) { +- $token_stack = array(''); +- $text_stack = array(''); +- $em = ''; +- $strong = ''; +- $tree_char_em = false; +- +- while (1) { +- # +- # Get prepared regular expression for seraching emphasis tokens +- # in current context. +- # +- $token_re = $this->em_strong_prepared_relist["$em$strong"]; +- +- # +- # Each loop iteration seach for the next emphasis token. +- # Each token is then passed to handleSpanToken. +- # +- $parts = preg_split($token_re, $text, 2, PREG_SPLIT_DELIM_CAPTURE); +- $text_stack[0] .= $parts[0]; +- $token =& $parts[1]; +- $text =& $parts[2]; +- +- if (empty($token)) { +- # Reached end of text span: empty stack without emitting. +- # any more emphasis. +- while ($token_stack[0]) { +- $text_stack[1] .= array_shift($token_stack); +- $text_stack[0] .= array_shift($text_stack); +- } +- break; +- } +- +- $token_len = strlen($token); +- if ($tree_char_em) { +- # Reached closing marker while inside a three-char emphasis. +- if ($token_len == 3) { +- # Three-char closing marker, close em and strong. +- array_shift($token_stack); +- $span = array_shift($text_stack); +- $span = $this->runSpanGamut($span); +- $span = "<strong><em>$span</em></strong>"; +- $text_stack[0] .= $this->hashPart($span); +- $em = ''; +- $strong = ''; +- } else { +- # Other closing marker: close one em or strong and +- # change current token state to match the other +- $token_stack[0] = str_repeat($token{0}, 3-$token_len); +- $tag = $token_len == 2 ? "strong" : "em"; +- $span = $text_stack[0]; +- $span = $this->runSpanGamut($span); +- $span = "<$tag>$span</$tag>"; +- $text_stack[0] = $this->hashPart($span); +- $$tag = ''; # $$tag stands for $em or $strong +- } +- $tree_char_em = false; +- } else if ($token_len == 3) { +- if ($em) { +- # Reached closing marker for both em and strong. +- # Closing strong marker: +- for ($i = 0; $i < 2; ++$i) { +- $shifted_token = array_shift($token_stack); +- $tag = strlen($shifted_token) == 2 ? "strong" : "em"; +- $span = array_shift($text_stack); +- $span = $this->runSpanGamut($span); +- $span = "<$tag>$span</$tag>"; +- $text_stack[0] .= $this->hashPart($span); +- $$tag = ''; # $$tag stands for $em or $strong +- } +- } else { +- # Reached opening three-char emphasis marker. Push on token +- # stack; will be handled by the special condition above. +- $em = $token{0}; +- $strong = "$em$em"; +- array_unshift($token_stack, $token); +- array_unshift($text_stack, ''); +- $tree_char_em = true; +- } +- } else if ($token_len == 2) { +- if ($strong) { +- # Unwind any dangling emphasis marker: +- if (strlen($token_stack[0]) == 1) { +- $text_stack[1] .= array_shift($token_stack); +- $text_stack[0] .= array_shift($text_stack); +- } +- # Closing strong marker: +- array_shift($token_stack); +- $span = array_shift($text_stack); +- $span = $this->runSpanGamut($span); +- $span = "<strong>$span</strong>"; +- $text_stack[0] .= $this->hashPart($span); +- $strong = ''; +- } else { +- array_unshift($token_stack, $token); +- array_unshift($text_stack, ''); +- $strong = $token; +- } +- } else { +- # Here $token_len == 1 +- if ($em) { +- if (strlen($token_stack[0]) == 1) { +- # Closing emphasis marker: +- array_shift($token_stack); +- $span = array_shift($text_stack); +- $span = $this->runSpanGamut($span); +- $span = "<em>$span</em>"; +- $text_stack[0] .= $this->hashPart($span); +- $em = ''; +- } else { +- $text_stack[0] .= $token; +- } +- } else { +- array_unshift($token_stack, $token); +- array_unshift($text_stack, ''); +- $em = $token; +- } +- } +- } +- return $text_stack[0]; +- } +- +- +- function doBlockQuotes($text) { +- $text = preg_replace_callback('/ +- ( # Wrap whole match in $1 +- (?> +- ^[ ]*>[ ]? # ">" at the start of a line +- .+\n # rest of the first line +- (.+\n)* # subsequent consecutive lines +- \n* # blanks +- )+ +- ) +- /xm', +- array(&$this, '_doBlockQuotes_callback'), $text); +- +- return $text; +- } +- function _doBlockQuotes_callback($matches) { +- $bq = $matches[1]; +- # trim one level of quoting - trim whitespace-only lines +- $bq = preg_replace('/^[ ]*>[ ]?|^[ ]+$/m', '', $bq); +- $bq = $this->runBlockGamut($bq); # recurse +- +- $bq = preg_replace('/^/m', " ", $bq); +- # These leading spaces cause problem with <pre> content, +- # so we need to fix that: +- $bq = preg_replace_callback('{(\s*<pre>.+?</pre>)}sx', +- array(&$this, '_DoBlockQuotes_callback2'), $bq); +- +- return "\n". $this->hashBlock("<blockquote>\n$bq\n</blockquote>")."\n\n"; +- } +- function _doBlockQuotes_callback2($matches) { +- $pre = $matches[1]; +- $pre = preg_replace('/^ /m', '', $pre); +- return $pre; +- } +- +- +- function formParagraphs($text) { +- # +- # Params: +- # $text - string to process with html <p> tags +- # +- # Strip leading and trailing lines: +- $text = preg_replace('/\A\n+|\n+\z/', '', $text); +- +- $grafs = preg_split('/\n{2,}/', $text, -1, PREG_SPLIT_NO_EMPTY); +- +- # +- # Wrap <p> tags and unhashify HTML blocks +- # +- foreach ($grafs as $key => $value) { +- if (!preg_match('/^B\x1A[0-9]+B$/', $value)) { +- # Is a paragraph. +- $value = $this->runSpanGamut($value); +- $value = preg_replace('/^([ ]*)/', "<p>", $value); +- $value .= "</p>"; +- $grafs[$key] = $this->unhash($value); +- } +- else { +- # Is a block. +- # Modify elements of @grafs in-place... +- $graf = $value; +- $block = $this->html_hashes[$graf]; +- $graf = $block; +-// if (preg_match('{ +-// \A +-// ( # $1 = <div> tag +-// <div \s+ +-// [^>]* +-// \b +-// markdown\s*=\s* ([\'"]) # $2 = attr quote char +-// 1 +-// \2 +-// [^>]* +-// > +-// ) +-// ( # $3 = contents +-// .* +-// ) +-// (</div>) # $4 = closing tag +-// \z +-// }xs', $block, $matches)) +-// { +-// list(, $div_open, , $div_content, $div_close) = $matches; +-// +-// # We can't call Markdown(), because that resets the hash; +-// # that initialization code should be pulled into its own sub, though. +-// $div_content = $this->hashHTMLBlocks($div_content); +-// +-// # Run document gamut methods on the content. +-// foreach ($this->document_gamut as $method => $priority) { +-// $div_content = $this->$method($div_content); +-// } +-// +-// $div_open = preg_replace( +-// '{\smarkdown\s*=\s*([\'"]).+?\1}', '', $div_open); +-// +-// $graf = $div_open . "\n" . $div_content . "\n" . $div_close; +-// } +- $grafs[$key] = $graf; +- } +- } +- +- return implode("\n\n", $grafs); +- } +- +- +- function encodeAttribute($text) { +- # +- # Encode text for a double-quoted HTML attribute. This function +- # is *not* suitable for attributes enclosed in single quotes. +- # +- $text = $this->encodeAmpsAndAngles($text); +- $text = str_replace('"', '"', $text); +- return $text; +- } +- +- +- function encodeAmpsAndAngles($text) { +- # +- # Smart processing for ampersands and angle brackets that need to +- # be encoded. Valid character entities are left alone unless the +- # no-entities mode is set. +- # +- if ($this->no_entities) { +- $text = str_replace('&', '&', $text); +- } else { +- # Ampersand-encoding based entirely on Nat Irons's Amputator +- # MT plugin: <http://bumppo.net/projects/amputator/> +- $text = preg_replace('/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/', +- '&', $text);; +- } +- # Encode remaining <'s +- $text = str_replace('<', '<', $text); +- +- return $text; +- } +- +- +- function doAutoLinks($text) { +- $text = preg_replace_callback('{<((https?|ftp|dict):[^\'">\s]+)>}i', +- array(&$this, '_doAutoLinks_url_callback'), $text); +- +- # Email addresses: <address@domain.foo> +- $text = preg_replace_callback('{ +- < +- (?:mailto:)? +- ( +- [-.\w\x80-\xFF]+ +- \@ +- [-a-z0-9\x80-\xFF]+(\.[-a-z0-9\x80-\xFF]+)*\.[a-z]+ +- ) +- > +- }xi', +- array(&$this, '_doAutoLinks_email_callback'), $text); +- +- return $text; +- } +- function _doAutoLinks_url_callback($matches) { +- $url = $this->encodeAttribute($matches[1]); +- $link = "<a href=\"$url\">$url</a>"; +- return $this->hashPart($link); +- } +- function _doAutoLinks_email_callback($matches) { +- $address = $matches[1]; +- $link = $this->encodeEmailAddress($address); +- return $this->hashPart($link); +- } +- +- +- function encodeEmailAddress($addr) { +- # +- # Input: an email address, e.g. "foo@example.com" +- # +- # Output: the email address as a mailto link, with each character +- # of the address encoded as either a decimal or hex entity, in +- # the hopes of foiling most address harvesting spam bots. E.g.: +- # +- # <p><a href="mailto:foo +- # @example.co +- # m">foo@exampl +- # e.com</a></p> +- # +- # Based by a filter by Matthew Wickline, posted to BBEdit-Talk. +- # With some optimizations by Milian Wolff. +- # +- $addr = "mailto:" . $addr; +- $chars = preg_split('/(?<!^)(?!$)/', $addr); +- $seed = (int)abs(crc32($addr) / strlen($addr)); # Deterministic seed. +- +- foreach ($chars as $key => $char) { +- $ord = ord($char); +- # Ignore non-ascii chars. +- if ($ord < 128) { +- $r = ($seed * (1 + $key)) % 100; # Pseudo-random function. +- # roughly 10% raw, 45% hex, 45% dec +- # '@' *must* be encoded. I insist. +- if ($r > 90 && $char != '@') /* do nothing */; +- else if ($r < 45) $chars[$key] = '&#x'.dechex($ord).';'; +- else $chars[$key] = '&#'.$ord.';'; +- } +- } +- +- $addr = implode('', $chars); +- $text = implode('', array_slice($chars, 7)); # text without `mailto:` +- $addr = "<a href=\"$addr\">$text</a>"; +- +- return $addr; +- } +- +- +- function parseSpan($str) { +- # +- # Take the string $str and parse it into tokens, hashing embeded HTML, +- # escaped characters and handling code spans. +- # +- $output = ''; +- +- $span_re = '{ +- ( +- \\\\'.$this->escape_chars_re.' +- | +- (?<![`\\\\]) +- `+ # code span marker +- '.( $this->no_markup ? '' : ' +- | +- <!-- .*? --> # comment +- | +- <\?.*?\?> | <%.*?%> # processing instruction +- | +- <[/!$]?[-a-zA-Z0-9:]+ # regular tags +- (?> +- \s +- (?>[^"\'>]+|"[^"]*"|\'[^\']*\')* +- )? +- > +- ').' +- ) +- }xs'; +- +- while (1) { +- # +- # Each loop iteration seach for either the next tag, the next +- # openning code span marker, or the next escaped character. +- # Each token is then passed to handleSpanToken. +- # +- $parts = preg_split($span_re, $str, 2, PREG_SPLIT_DELIM_CAPTURE); +- +- # Create token from text preceding tag. +- if ($parts[0] != "") { +- $output .= $parts[0]; +- } +- +- # Check if we reach the end. +- if (isset($parts[1])) { +- $output .= $this->handleSpanToken($parts[1], $parts[2]); +- $str = $parts[2]; +- } +- else { +- break; +- } +- } +- +- return $output; +- } +- +- +- function handleSpanToken($token, &$str) { +- # +- # Handle $token provided by parseSpan by determining its nature and +- # returning the corresponding value that should replace it. +- # +- switch ($token{0}) { +- case "\\": +- return $this->hashPart("&#". ord($token{1}). ";"); +- case "`": +- # Search for end marker in remaining text. +- if (preg_match('/^(.*?[^`])'.preg_quote($token).'(?!`)(.*)$/sm', +- $str, $matches)) +- { +- $str = $matches[2]; +- $codespan = $this->makeCodeSpan($matches[1]); +- return $this->hashPart($codespan); +- } +- return $token; // return as text since no ending marker found. +- default: +- return $this->hashPart($token); +- } +- } +- +- +- function outdent($text) { +- # +- # Remove one level of line-leading tabs or spaces +- # +- return preg_replace('/^(\t|[ ]{1,'.$this->tab_width.'})/m', '', $text); +- } +- +- +- # String length function for detab. `_initDetab` will create a function to +- # hanlde UTF-8 if the default function does not exist. +- var $utf8_strlen = 'mb_strlen'; +- +- function detab($text) { +- # +- # Replace tabs with the appropriate amount of space. +- # +- # For each line we separate the line in blocks delemited by +- # tab characters. Then we reconstruct every line by adding the +- # appropriate number of space between each blocks. +- +- $text = preg_replace_callback('/^.*\t.*$/m', +- array(&$this, '_detab_callback'), $text); +- +- return $text; +- } +- function _detab_callback($matches) { +- $line = $matches[0]; +- $strlen = $this->utf8_strlen; # strlen function for UTF-8. +- +- # Split in blocks. +- $blocks = explode("\t", $line); +- # Add each blocks to the line. +- $line = $blocks[0]; +- unset($blocks[0]); # Do not add first block twice. +- foreach ($blocks as $block) { +- # Calculate amount of space, insert spaces, insert block. +- $amount = $this->tab_width - +- $strlen($line, 'UTF-8') % $this->tab_width; +- $line .= str_repeat(" ", $amount) . $block; +- } +- return $line; +- } +- function _initDetab() { +- # +- # Check for the availability of the function in the `utf8_strlen` property +- # (initially `mb_strlen`). If the function is not available, create a +- # function that will loosely count the number of UTF-8 characters with a +- # regular expression. +- # +- if (function_exists($this->utf8_strlen)) return; +- $this->utf8_strlen = create_function('$text', 'return preg_match_all( +- "/[\\\\x00-\\\\xBF]|[\\\\xC0-\\\\xFF][\\\\x80-\\\\xBF]*/", +- $text, $m);'); +- } +- +- +- function unhash($text) { +- # +- # Swap back in all the tags hashed by _HashHTMLBlocks. +- # +- return preg_replace_callback('/(.)\x1A[0-9]+\1/', +- array(&$this, '_unhash_callback'), $text); +- } +- function _unhash_callback($matches) { +- return $this->html_hashes[$matches[0]]; +- } +- +-} +- +- +-# +-# Markdown Extra Parser Class +-# +- +-class MarkdownExtra_Parser extends Markdown_Parser { +- +- # Prefix for footnote ids. +- var $fn_id_prefix = ""; +- +- # Optional title attribute for footnote links and backlinks. +- var $fn_link_title = MARKDOWN_FN_LINK_TITLE; +- var $fn_backlink_title = MARKDOWN_FN_BACKLINK_TITLE; +- +- # Optional class attribute for footnote links and backlinks. +- var $fn_link_class = MARKDOWN_FN_LINK_CLASS; +- var $fn_backlink_class = MARKDOWN_FN_BACKLINK_CLASS; +- +- # Predefined abbreviations. +- var $predef_abbr = array(); +- +- +- function MarkdownExtra_Parser() { +- # +- # Constructor function. Initialize the parser object. +- # +- # Add extra escapable characters before parent constructor +- # initialize the table. +- $this->escape_chars .= ':|'; +- +- # Insert extra document, block, and span transformations. +- # Parent constructor will do the sorting. +- $this->document_gamut += array( +- "doFencedCodeBlocks" => 5, +- "stripFootnotes" => 15, +- "stripAbbreviations" => 25, +- "appendFootnotes" => 50, +- ); +- $this->block_gamut += array( +- "doFencedCodeBlocks" => 5, +- "doTables" => 15, +- "doDefLists" => 45, +- ); +- $this->span_gamut += array( +- "doFootnotes" => 5, +- "doAbbreviations" => 70, +- ); +- +- parent::Markdown_Parser(); +- } +- +- +- # Extra variables used during extra transformations. +- var $footnotes = array(); +- var $footnotes_ordered = array(); +- var $abbr_desciptions = array(); +- var $abbr_word_re = ''; +- +- # Give the current footnote number. +- var $footnote_counter = 1; +- +- +- function setup() { +- # +- # Setting up Extra-specific variables. +- # +- parent::setup(); +- +- $this->footnotes = array(); +- $this->footnotes_ordered = array(); +- $this->abbr_desciptions = array(); +- $this->abbr_word_re = ''; +- $this->footnote_counter = 1; +- +- foreach ($this->predef_abbr as $abbr_word => $abbr_desc) { +- if ($this->abbr_word_re) +- $this->abbr_word_re .= '|'; +- $this->abbr_word_re .= preg_quote($abbr_word); +- $this->abbr_desciptions[$abbr_word] = trim($abbr_desc); +- } +- } +- +- function teardown() { +- # +- # Clearing Extra-specific variables. +- # +- $this->footnotes = array(); +- $this->footnotes_ordered = array(); +- $this->abbr_desciptions = array(); +- $this->abbr_word_re = ''; +- +- parent::teardown(); +- } +- +- +- ### HTML Block Parser ### +- +- # Tags that are always treated as block tags: +- var $block_tags_re = 'p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|address|form|fieldset|iframe|hr|legend'; +- +- # Tags treated as block tags only if the opening tag is alone on it's line: +- var $context_block_tags_re = 'script|noscript|math|ins|del'; +- +- # Tags where markdown="1" default to span mode: +- var $contain_span_tags_re = 'p|h[1-6]|li|dd|dt|td|th|legend|address'; +- +- # Tags which must not have their contents modified, no matter where +- # they appear: +- var $clean_tags_re = 'script|math'; +- +- # Tags that do not need to be closed. +- var $auto_close_tags_re = 'hr|img'; +- +- +- function hashHTMLBlocks($text) { +- # +- # Hashify HTML Blocks and "clean tags". +- # +- # We only want to do this for block-level HTML tags, such as headers, +- # lists, and tables. That's because we still want to wrap <p>s around +- # "paragraphs" that are wrapped in non-block-level tags, such as anchors, +- # phrase emphasis, and spans. The list of tags we're looking for is +- # hard-coded. +- # +- # This works by calling _HashHTMLBlocks_InMarkdown, which then calls +- # _HashHTMLBlocks_InHTML when it encounter block tags. When the markdown="1" +- # attribute is found whitin a tag, _HashHTMLBlocks_InHTML calls back +- # _HashHTMLBlocks_InMarkdown to handle the Markdown syntax within the tag. +- # These two functions are calling each other. It's recursive! +- # +- # +- # Call the HTML-in-Markdown hasher. +- # +- list($text, ) = $this->_hashHTMLBlocks_inMarkdown($text); +- +- return $text; +- } +- function _hashHTMLBlocks_inMarkdown($text, $indent = 0, +- $enclosing_tag_re = '', $span = false) +- { +- # +- # Parse markdown text, calling _HashHTMLBlocks_InHTML for block tags. +- # +- # * $indent is the number of space to be ignored when checking for code +- # blocks. This is important because if we don't take the indent into +- # account, something like this (which looks right) won't work as expected: +- # +- # <div> +- # <div markdown="1"> +- # Hello World. <-- Is this a Markdown code block or text? +- # </div> <-- Is this a Markdown code block or a real tag? +- # <div> +- # +- # If you don't like this, just don't indent the tag on which +- # you apply the markdown="1" attribute. +- # +- # * If $enclosing_tag_re is not empty, stops at the first unmatched closing +- # tag with that name. Nested tags supported. +- # +- # * If $span is true, text inside must treated as span. So any double +- # newline will be replaced by a single newline so that it does not create +- # paragraphs. +- # +- # Returns an array of that form: ( processed text , remaining text ) +- # +- if ($text === '') return array('', ''); +- +- # Regex to check for the presense of newlines around a block tag. +- $newline_before_re = '/(?:^\n?|\n\n)*$/'; +- $newline_after_re = +- '{ +- ^ # Start of text following the tag. +- (?>[ ]*<!--.*?-->)? # Optional comment. +- [ ]*\n # Must be followed by newline. +- }xs'; +- +- # Regex to match any tag. +- $block_tag_re = +- '{ +- ( # $2: Capture hole tag. +- </? # Any opening or closing tag. +- (?> # Tag name. +- '.$this->block_tags_re.' | +- '.$this->context_block_tags_re.' | +- '.$this->clean_tags_re.' | +- (?!\s)'.$enclosing_tag_re.' +- ) +- (?: +- (?=[\s"\'/a-zA-Z0-9]) # Allowed characters after tag name. +- (?> +- ".*?" | # Double quotes (can contain `>`) +- \'.*?\' | # Single quotes (can contain `>`) +- .+? # Anything but quotes and `>`. +- )*? +- )? +- > # End of tag. +- | +- <!-- .*? --> # HTML Comment +- | +- <\?.*?\?> | <%.*?%> # Processing instruction +- | +- <!\[CDATA\[.*?\]\]> # CData Block +- | +- # Code span marker +- `+ +- '. ( !$span ? ' # If not in span. +- | +- # Indented code block +- (?> ^[ ]*\n? | \n[ ]*\n ) +- [ ]{'.($indent+4).'}[^\n]* \n +- (?> +- (?: [ ]{'.($indent+4).'}[^\n]* | [ ]* ) \n +- )* +- | +- # Fenced code block marker +- (?> ^ | \n ) +- [ ]{'.($indent).'}~~~+[ ]*\n +- ' : '' ). ' # End (if not is span). +- ) +- }xs'; +- +- +- $depth = 0; # Current depth inside the tag tree. +- $parsed = ""; # Parsed text that will be returned. +- +- # +- # Loop through every tag until we find the closing tag of the parent +- # or loop until reaching the end of text if no parent tag specified. +- # +- do { +- # +- # Split the text using the first $tag_match pattern found. +- # Text before pattern will be first in the array, text after +- # pattern will be at the end, and between will be any catches made +- # by the pattern. +- # +- $parts = preg_split($block_tag_re, $text, 2, +- PREG_SPLIT_DELIM_CAPTURE); +- +- # If in Markdown span mode, add a empty-string span-level hash +- # after each newline to prevent triggering any block element. +- if ($span) { +- $void = $this->hashPart("", ':'); +- $newline = "$void\n"; +- $parts[0] = $void . str_replace("\n", $newline, $parts[0]) . $void; +- } +- +- $parsed .= $parts[0]; # Text before current tag. +- +- # If end of $text has been reached. Stop loop. +- if (count($parts) < 3) { +- $text = ""; +- break; +- } +- +- $tag = $parts[1]; # Tag to handle. +- $text = $parts[2]; # Remaining text after current tag. +- $tag_re = preg_quote($tag); # For use in a regular expression. +- +- # +- # Check for: Code span marker +- # +- if ($tag{0} == "`") { +- # Find corresponding end marker. +- $tag_re = preg_quote($tag); +- if (preg_match('{^(?>.+?|\n(?!\n))*?(?<!`)'.$tag_re.'(?!`)}', +- $text, $matches)) +- { +- # End marker found: pass text unchanged until marker. +- $parsed .= $tag . $matches[0]; +- $text = substr($text, strlen($matches[0])); +- } +- else { +- # Unmatched marker: just skip it. +- $parsed .= $tag; +- } +- } +- # +- # Check for: Indented code block or fenced code block marker. +- # +- else if ($tag{0} == "\n" || $tag{0} == "~") { +- if ($tag{1} == "\n" || $tag{1} == " ") { +- # Indented code block: pass it unchanged, will be handled +- # later. +- $parsed .= $tag; +- } +- else { +- # Fenced code block marker: find matching end marker. +- $tag_re = preg_quote(trim($tag)); +- if (preg_match('{^(?>.*\n)+?'.$tag_re.' *\n}', $text, +- $matches)) +- { +- # End marker found: pass text unchanged until marker. +- $parsed .= $tag . $matches[0]; +- $text = substr($text, strlen($matches[0])); +- } +- else { +- # No end marker: just skip it. +- $parsed .= $tag; +- } +- } +- } +- # +- # Check for: Opening Block level tag or +- # Opening Context Block tag (like ins and del) +- # used as a block tag (tag is alone on it's line). +- # +- else if (preg_match('{^<(?:'.$this->block_tags_re.')\b}', $tag) || +- ( preg_match('{^<(?:'.$this->context_block_tags_re.')\b}', $tag) && +- preg_match($newline_before_re, $parsed) && +- preg_match($newline_after_re, $text) ) +- ) +- { +- # Need to parse tag and following text using the HTML parser. +- list($block_text, $text) = +- $this->_hashHTMLBlocks_inHTML($tag . $text, "hashBlock", true); +- +- # Make sure it stays outside of any paragraph by adding newlines. +- $parsed .= "\n\n$block_text\n\n"; +- } +- # +- # Check for: Clean tag (like script, math) +- # HTML Comments, processing instructions. +- # +- else if (preg_match('{^<(?:'.$this->clean_tags_re.')\b}', $tag) || +- $tag{1} == '!' || $tag{1} == '?') +- { +- # Need to parse tag and following text using the HTML parser. +- # (don't check for markdown attribute) +- list($block_text, $text) = +- $this->_hashHTMLBlocks_inHTML($tag . $text, "hashClean", false); +- +- $parsed .= $block_text; +- } +- # +- # Check for: Tag with same name as enclosing tag. +- # +- else if ($enclosing_tag_re !== '' && +- # Same name as enclosing tag. +- preg_match('{^</?(?:'.$enclosing_tag_re.')\b}', $tag)) +- { +- # +- # Increase/decrease nested tag count. +- # +- if ($tag{1} == '/') $depth--; +- else if ($tag{strlen($tag)-2} != '/') $depth++; +- +- if ($depth < 0) { +- # +- # Going out of parent element. Clean up and break so we +- # return to the calling function. +- # +- $text = $tag . $text; +- break; +- } +- +- $parsed .= $tag; +- } +- else { +- $parsed .= $tag; +- } +- } while ($depth >= 0); +- +- return array($parsed, $text); +- } +- function _hashHTMLBlocks_inHTML($text, $hash_method, $md_attr) { +- # +- # Parse HTML, calling _HashHTMLBlocks_InMarkdown for block tags. +- # +- # * Calls $hash_method to convert any blocks. +- # * Stops when the first opening tag closes. +- # * $md_attr indicate if the use of the `markdown="1"` attribute is allowed. +- # (it is not inside clean tags) +- # +- # Returns an array of that form: ( processed text , remaining text ) +- # +- if ($text === '') return array('', ''); +- +- # Regex to match `markdown` attribute inside of a tag. +- $markdown_attr_re = ' +- { +- \s* # Eat whitespace before the `markdown` attribute +- markdown +- \s*=\s* +- (?> +- (["\']) # $1: quote delimiter +- (.*?) # $2: attribute value +- \1 # matching delimiter +- | +- ([^\s>]*) # $3: unquoted attribute value +- ) +- () # $4: make $3 always defined (avoid warnings) +- }xs'; +- +- # Regex to match any tag. +- $tag_re = '{ +- ( # $2: Capture hole tag. +- </? # Any opening or closing tag. +- [\w:$]+ # Tag name. +- (?: +- (?=[\s"\'/a-zA-Z0-9]) # Allowed characters after tag name. +- (?> +- ".*?" | # Double quotes (can contain `>`) +- \'.*?\' | # Single quotes (can contain `>`) +- .+? # Anything but quotes and `>`. +- )*? +- )? +- > # End of tag. +- | +- <!-- .*? --> # HTML Comment +- | +- <\?.*?\?> | <%.*?%> # Processing instruction +- | +- <!\[CDATA\[.*?\]\]> # CData Block +- ) +- }xs'; +- +- $original_text = $text; # Save original text in case of faliure. +- +- $depth = 0; # Current depth inside the tag tree. +- $block_text = ""; # Temporary text holder for current text. +- $parsed = ""; # Parsed text that will be returned. +- +- # +- # Get the name of the starting tag. +- # (This pattern makes $base_tag_name_re safe without quoting.) +- # +- if (preg_match('/^<([\w:$]*)\b/', $text, $matches)) +- $base_tag_name_re = $matches[1]; +- +- # +- # Loop through every tag until we find the corresponding closing tag. +- # +- do { +- # +- # Split the text using the first $tag_match pattern found. +- # Text before pattern will be first in the array, text after +- # pattern will be at the end, and between will be any catches made +- # by the pattern. +- # +- $parts = preg_split($tag_re, $text, 2, PREG_SPLIT_DELIM_CAPTURE); +- +- if (count($parts) < 3) { +- # +- # End of $text reached with unbalenced tag(s). +- # In that case, we return original text unchanged and pass the +- # first character as filtered to prevent an infinite loop in the +- # parent function. +- # +- return array($original_text{0}, substr($original_text, 1)); +- } +- +- $block_text .= $parts[0]; # Text before current tag. +- $tag = $parts[1]; # Tag to handle. +- $text = $parts[2]; # Remaining text after current tag. +- +- # +- # Check for: Auto-close tag (like <hr/>) +- # Comments and Processing Instructions. +- # +- if (preg_match('{^</?(?:'.$this->auto_close_tags_re.')\b}', $tag) || +- $tag{1} == '!' || $tag{1} == '?') +- { +- # Just add the tag to the block as if it was text. +- $block_text .= $tag; +- } +- else { +- # +- # Increase/decrease nested tag count. Only do so if +- # the tag's name match base tag's. +- # +- if (preg_match('{^</?'.$base_tag_name_re.'\b}', $tag)) { +- if ($tag{1} == '/') $depth--; +- else if ($tag{strlen($tag)-2} != '/') $depth++; +- } +- +- # +- # Check for `markdown="1"` attribute and handle it. +- # +- if ($md_attr && +- preg_match($markdown_attr_re, $tag, $attr_m) && +- preg_match('/^1|block|span$/', $attr_m[2] . $attr_m[3])) +- { +- # Remove `markdown` attribute from opening tag. +- $tag = preg_replace($markdown_attr_re, '', $tag); +- +- # Check if text inside this tag must be parsed in span mode. +- $this->mode = $attr_m[2] . $attr_m[3]; +- $span_mode = $this->mode == 'span' || $this->mode != 'block' && +- preg_match('{^<(?:'.$this->contain_span_tags_re.')\b}', $tag); +- +- # Calculate indent before tag. +- if (preg_match('/(?:^|\n)( *?)(?! ).*?$/', $block_text, $matches)) { +- $strlen = $this->utf8_strlen; +- $indent = $strlen($matches[1], 'UTF-8'); +- } else { +- $indent = 0; +- } +- +- # End preceding block with this tag. +- $block_text .= $tag; +- $parsed .= $this->$hash_method($block_text); +- +- # Get enclosing tag name for the ParseMarkdown function. +- # (This pattern makes $tag_name_re safe without quoting.) +- preg_match('/^<([\w:$]*)\b/', $tag, $matches); +- $tag_name_re = $matches[1]; +- +- # Parse the content using the HTML-in-Markdown parser. +- list ($block_text, $text) +- = $this->_hashHTMLBlocks_inMarkdown($text, $indent, +- $tag_name_re, $span_mode); +- +- # Outdent markdown text. +- if ($indent > 0) { +- $block_text = preg_replace("/^[ ]{1,$indent}/m", "", +- $block_text); +- } +- +- # Append tag content to parsed text. +- if (!$span_mode) $parsed .= "\n\n$block_text\n\n"; +- else $parsed .= "$block_text"; +- +- # Start over a new block. +- $block_text = ""; +- } +- else $block_text .= $tag; +- } +- +- } while ($depth > 0); +- +- # +- # Hash last block text that wasn't processed inside the loop. +- # +- $parsed .= $this->$hash_method($block_text); +- +- return array($parsed, $text); +- } +- +- +- function hashClean($text) { +- # +- # Called whenever a tag must be hashed when a function insert a "clean" tag +- # in $text, it pass through this function and is automaticaly escaped, +- # blocking invalid nested overlap. +- # +- return $this->hashPart($text, 'C'); +- } +- +- +- function doHeaders($text) { +- # +- # Redefined to add id attribute support. +- # +- # Setext-style headers: +- # Header 1 {#header1} +- # ======== +- # +- # Header 2 {#header2} +- # -------- +- # +- $text = preg_replace_callback( +- '{ +- (^.+?) # $1: Header text +- (?:[ ]+\{\#([-_:a-zA-Z0-9]+)\})? # $2: Id attribute +- [ ]*\n(=+|-+)[ ]*\n+ # $3: Header footer +- }mx', +- array(&$this, '_doHeaders_callback_setext'), $text); +- +- # atx-style headers: +- # # Header 1 {#header1} +- # ## Header 2 {#header2} +- # ## Header 2 with closing hashes ## {#header3} +- # ... +- # ###### Header 6 {#header2} +- # +- $text = preg_replace_callback('{ +- ^(\#{1,6}) # $1 = string of #\'s +- [ ]* +- (.+?) # $2 = Header text +- [ ]* +- \#* # optional closing #\'s (not counted) +- (?:[ ]+\{\#([-_:a-zA-Z0-9]+)\})? # id attribute +- [ ]* +- \n+ +- }xm', +- array(&$this, '_doHeaders_callback_atx'), $text); +- +- return $text; +- } +- function _doHeaders_attr($attr) { +- if (empty($attr)) return ""; +- return " id=\"$attr\""; +- } +- function _doHeaders_callback_setext($matches) { +- if ($matches[3] == '-' && preg_match('{^- }', $matches[1])) +- return $matches[0]; +- $level = $matches[3]{0} == '=' ? 1 : 2; +- $attr = $this->_doHeaders_attr($id =& $matches[2]); +- $block = "<h$level$attr>".$this->runSpanGamut($matches[1])."</h$level>"; +- return "\n" . $this->hashBlock($block) . "\n\n"; +- } +- function _doHeaders_callback_atx($matches) { +- $level = strlen($matches[1]); +- $attr = $this->_doHeaders_attr($id =& $matches[3]); +- $block = "<h$level$attr>".$this->runSpanGamut($matches[2])."</h$level>"; +- return "\n" . $this->hashBlock($block) . "\n\n"; +- } +- +- +- function doTables($text) { +- # +- # Form HTML tables. +- # +- $less_than_tab = $this->tab_width - 1; +- # +- # Find tables with leading pipe. +- # +- # | Header 1 | Header 2 +- # | -------- | -------- +- # | Cell 1 | Cell 2 +- # | Cell 3 | Cell 4 +- # +- $text = preg_replace_callback(' +- { +- ^ # Start of a line +- [ ]{0,'.$less_than_tab.'} # Allowed whitespace. +- [|] # Optional leading pipe (present) +- (.+) \n # $1: Header row (at least one pipe) +- +- [ ]{0,'.$less_than_tab.'} # Allowed whitespace. +- [|] ([ ]*[-:]+[-| :]*) \n # $2: Header underline +- +- ( # $3: Cells +- (?> +- [ ]* # Allowed whitespace. +- [|] .* \n # Row content. +- )* +- ) +- (?=\n|\Z) # Stop at final double newline. +- }xm', +- array(&$this, '_doTable_leadingPipe_callback'), $text); +- +- # +- # Find tables without leading pipe. +- # +- # Header 1 | Header 2 +- # -------- | -------- +- # Cell 1 | Cell 2 +- # Cell 3 | Cell 4 +- # +- $text = preg_replace_callback(' +- { +- ^ # Start of a line +- [ ]{0,'.$less_than_tab.'} # Allowed whitespace. +- (\S.*[|].*) \n # $1: Header row (at least one pipe) +- +- [ ]{0,'.$less_than_tab.'} # Allowed whitespace. +- ([-:]+[ ]*[|][-| :]*) \n # $2: Header underline +- +- ( # $3: Cells +- (?> +- .* [|] .* \n # Row content +- )* +- ) +- (?=\n|\Z) # Stop at final double newline. +- }xm', +- array(&$this, '_DoTable_callback'), $text); +- +- return $text; +- } +- function _doTable_leadingPipe_callback($matches) { +- $head = $matches[1]; +- $underline = $matches[2]; +- $content = $matches[3]; +- +- # Remove leading pipe for each row. +- $content = preg_replace('/^ *[|]/m', '', $content); +- +- return $this->_doTable_callback(array($matches[0], $head, $underline, $content)); +- } +- function _doTable_callback($matches) { +- $head = $matches[1]; +- $underline = $matches[2]; +- $content = $matches[3]; +- +- # Remove any tailing pipes for each line. +- $head = preg_replace('/[|] *$/m', '', $head); +- $underline = preg_replace('/[|] *$/m', '', $underline); +- $content = preg_replace('/[|] *$/m', '', $content); +- +- # Reading alignement from header underline. +- $separators = preg_split('/ *[|] */', $underline); +- foreach ($separators as $n => $s) { +- if (preg_match('/^ *-+: *$/', $s)) $attr[$n] = ' align="right"'; +- else if (preg_match('/^ *:-+: *$/', $s))$attr[$n] = ' align="center"'; +- else if (preg_match('/^ *:-+ *$/', $s)) $attr[$n] = ' align="left"'; +- else $attr[$n] = ''; +- } +- +- # Parsing span elements, including code spans, character escapes, +- # and inline HTML tags, so that pipes inside those gets ignored. +- $head = $this->parseSpan($head); +- $headers = preg_split('/ *[|] */', $head); +- $col_count = count($headers); +- +- # Write column headers. +- $text = "<table>\n"; +- $text .= "<thead>\n"; +- $text .= "<tr>\n"; +- foreach ($headers as $n => $header) +- $text .= " <th$attr[$n]>".$this->runSpanGamut(trim($header))."</th>\n"; +- $text .= "</tr>\n"; +- $text .= "</thead>\n"; +- +- # Split content by row. +- $rows = explode("\n", trim($content, "\n")); +- +- $text .= "<tbody>\n"; +- foreach ($rows as $row) { +- # Parsing span elements, including code spans, character escapes, +- # and inline HTML tags, so that pipes inside those gets ignored. +- $row = $this->parseSpan($row); +- +- # Split row by cell. +- $row_cells = preg_split('/ *[|] */', $row, $col_count); +- $row_cells = array_pad($row_cells, $col_count, ''); +- +- $text .= "<tr>\n"; +- foreach ($row_cells as $n => $cell) +- $text .= " <td$attr[$n]>".$this->runSpanGamut(trim($cell))."</td>\n"; +- $text .= "</tr>\n"; +- } +- $text .= "</tbody>\n"; +- $text .= "</table>"; +- +- return $this->hashBlock($text) . "\n"; +- } +- +- +- function doDefLists($text) { +- # +- # Form HTML definition lists. +- # +- $less_than_tab = $this->tab_width - 1; +- +- # Re-usable pattern to match any entire dl list: +- $whole_list_re = '(?> +- ( # $1 = whole list +- ( # $2 +- [ ]{0,'.$less_than_tab.'} +- ((?>.*\S.*\n)+) # $3 = defined term +- \n? +- [ ]{0,'.$less_than_tab.'}:[ ]+ # colon starting definition +- ) +- (?s:.+?) +- ( # $4 +- \z +- | +- \n{2,} +- (?=\S) +- (?! # Negative lookahead for another term +- [ ]{0,'.$less_than_tab.'} +- (?: \S.*\n )+? # defined term +- \n? +- [ ]{0,'.$less_than_tab.'}:[ ]+ # colon starting definition +- ) +- (?! # Negative lookahead for another definition +- [ ]{0,'.$less_than_tab.'}:[ ]+ # colon starting definition +- ) +- ) +- ) +- )'; // mx +- +- $text = preg_replace_callback('{ +- (?>\A\n?|(?<=\n\n)) +- '.$whole_list_re.' +- }mx', +- array(&$this, '_doDefLists_callback'), $text); +- +- return $text; +- } +- function _doDefLists_callback($matches) { +- # Re-usable patterns to match list item bullets and number markers: +- $list = $matches[1]; +- +- # Turn double returns into triple returns, so that we can make a +- # paragraph for the last item in a list, if necessary: +- $result = trim($this->processDefListItems($list)); +- $result = "<dl>\n" . $result . "\n</dl>"; +- return $this->hashBlock($result) . "\n\n"; +- } +- +- +- function processDefListItems($list_str) { +- # +- # Process the contents of a single definition list, splitting it +- # into individual term and definition list items. +- # +- $less_than_tab = $this->tab_width - 1; +- +- # trim trailing blank lines: +- $list_str = preg_replace("/\n{2,}\\z/", "\n", $list_str); +- +- # Process definition terms. +- $list_str = preg_replace_callback('{ +- (?>\A\n?|\n\n+) # leading line +- ( # definition terms = $1 +- [ ]{0,'.$less_than_tab.'} # leading whitespace +- (?![:][ ]|[ ]) # negative lookahead for a definition +- # mark (colon) or more whitespace. +- (?> \S.* \n)+? # actual term (not whitespace). +- ) +- (?=\n?[ ]{0,3}:[ ]) # lookahead for following line feed +- # with a definition mark. +- }xm', +- array(&$this, '_processDefListItems_callback_dt'), $list_str); +- +- # Process actual definitions. +- $list_str = preg_replace_callback('{ +- \n(\n+)? # leading line = $1 +- ( # marker space = $2 +- [ ]{0,'.$less_than_tab.'} # whitespace before colon +- [:][ ]+ # definition mark (colon) +- ) +- ((?s:.+?)) # definition text = $3 +- (?= \n+ # stop at next definition mark, +- (?: # next term or end of text +- [ ]{0,'.$less_than_tab.'} [:][ ] | +- <dt> | \z +- ) +- ) +- }xm', +- array(&$this, '_processDefListItems_callback_dd'), $list_str); +- +- return $list_str; +- } +- function _processDefListItems_callback_dt($matches) { +- $terms = explode("\n", trim($matches[1])); +- $text = ''; +- foreach ($terms as $term) { +- $term = $this->runSpanGamut(trim($term)); +- $text .= "\n<dt>" . $term . "</dt>"; +- } +- return $text . "\n"; +- } +- function _processDefListItems_callback_dd($matches) { +- $leading_line = $matches[1]; +- $marker_space = $matches[2]; +- $def = $matches[3]; +- +- if ($leading_line || preg_match('/\n{2,}/', $def)) { +- # Replace marker with the appropriate whitespace indentation +- $def = str_repeat(' ', strlen($marker_space)) . $def; +- $def = $this->runBlockGamut($this->outdent($def . "\n\n")); +- $def = "\n". $def ."\n"; +- } +- else { +- $def = rtrim($def); +- $def = $this->runSpanGamut($this->outdent($def)); +- } +- +- return "\n<dd>" . $def . "</dd>\n"; +- } +- +- +- function doFencedCodeBlocks($text) { +- # +- # Adding the fenced code block syntax to regular Markdown: +- # +- # ~~~ +- # Code block +- # ~~~ +- # +- $less_than_tab = $this->tab_width; +- +- $text = preg_replace_callback('{ +- (?:\n|\A) +- # 1: Opening marker +- ( +- ~{3,} # Marker: three tilde or more. +- ) +- [ ]* \n # Whitespace and newline following marker. +- +- # 2: Content +- ( +- (?> +- (?!\1 [ ]* \n) # Not a closing marker. +- .*\n+ +- )+ +- ) +- +- # Closing marker. +- \1 [ ]* \n +- }xm', +- array(&$this, '_doFencedCodeBlocks_callback'), $text); +- +- return $text; +- } +- function _doFencedCodeBlocks_callback($matches) { +- $codeblock = $matches[2]; +- $codeblock = htmlspecialchars($codeblock, ENT_NOQUOTES); +- $codeblock = preg_replace_callback('/^\n+/', +- array(&$this, '_doFencedCodeBlocks_newlines'), $codeblock); +- $codeblock = "<pre><code>$codeblock</code></pre>"; +- return "\n\n".$this->hashBlock($codeblock)."\n\n"; +- } +- function _doFencedCodeBlocks_newlines($matches) { +- return str_repeat("<br$this->empty_element_suffix", +- strlen($matches[0])); +- } +- +- +- # +- # Redefining emphasis markers so that emphasis by underscore does not +- # work in the middle of a word. +- # +- var $em_relist = array( +- '' => '(?:(?<!\*)\*(?!\*)|(?<![a-zA-Z0-9_])_(?!_))(?=\S)(?![.,:;]\s)', +- '*' => '(?<=\S)(?<!\*)\*(?!\*)', +- '_' => '(?<=\S)(?<!_)_(?![a-zA-Z0-9_])', +- ); +- var $strong_relist = array( +- '' => '(?:(?<!\*)\*\*(?!\*)|(?<![a-zA-Z0-9_])__(?!_))(?=\S)(?![.,:;]\s)', +- '**' => '(?<=\S)(?<!\*)\*\*(?!\*)', +- '__' => '(?<=\S)(?<!_)__(?![a-zA-Z0-9_])', +- ); +- var $em_strong_relist = array( +- '' => '(?:(?<!\*)\*\*\*(?!\*)|(?<![a-zA-Z0-9_])___(?!_))(?=\S)(?![.,:;]\s)', +- '***' => '(?<=\S)(?<!\*)\*\*\*(?!\*)', +- '___' => '(?<=\S)(?<!_)___(?![a-zA-Z0-9_])', +- ); +- +- +- function formParagraphs($text) { +- # +- # Params: +- # $text - string to process with html <p> tags +- # +- # Strip leading and trailing lines: +- $text = preg_replace('/\A\n+|\n+\z/', '', $text); +- +- $grafs = preg_split('/\n{2,}/', $text, -1, PREG_SPLIT_NO_EMPTY); +- +- # +- # Wrap <p> tags and unhashify HTML blocks +- # +- foreach ($grafs as $key => $value) { +- $value = trim($this->runSpanGamut($value)); +- +- # Check if this should be enclosed in a paragraph. +- # Clean tag hashes & block tag hashes are left alone. +- $is_p = !preg_match('/^B\x1A[0-9]+B|^C\x1A[0-9]+C$/', $value); +- +- if ($is_p) { +- $value = "<p>$value</p>"; +- } +- $grafs[$key] = $value; +- } +- +- # Join grafs in one text, then unhash HTML tags. +- $text = implode("\n\n", $grafs); +- +- # Finish by removing any tag hashes still present in $text. +- $text = $this->unhash($text); +- +- return $text; +- } +- +- +- ### Footnotes +- +- function stripFootnotes($text) { +- # +- # Strips link definitions from text, stores the URLs and titles in +- # hash references. +- # +- $less_than_tab = $this->tab_width - 1; +- +- # Link defs are in the form: [^id]: url "optional title" +- $text = preg_replace_callback('{ +- ^[ ]{0,'.$less_than_tab.'}\[\^(.+?)\][ ]?: # note_id = $1 +- [ ]* +- \n? # maybe *one* newline +- ( # text = $2 (no blank lines allowed) +- (?: +- .+ # actual text +- | +- \n # newlines but +- (?!\[\^.+?\]:\s)# negative lookahead for footnote marker. +- (?!\n+[ ]{0,3}\S)# ensure line is not blank and followed +- # by non-indented content +- )* +- ) +- }xm', +- array(&$this, '_stripFootnotes_callback'), +- $text); +- return $text; +- } +- function _stripFootnotes_callback($matches) { +- $note_id = $this->fn_id_prefix . $matches[1]; +- $this->footnotes[$note_id] = $this->outdent($matches[2]); +- return ''; # String that will replace the block +- } +- +- +- function doFootnotes($text) { +- # +- # Replace footnote references in $text [^id] with a special text-token +- # which will be replaced by the actual footnote marker in appendFootnotes. +- # +- if (!$this->in_anchor) { +- $text = preg_replace('{\[\^(.+?)\]}', "F\x1Afn:\\1\x1A:", $text); +- } +- return $text; +- } +- +- +- function appendFootnotes($text) { +- # +- # Append footnote list to text. +- # +- $text = preg_replace_callback('{F\x1Afn:(.*?)\x1A:}', +- array(&$this, '_appendFootnotes_callback'), $text); +- +- if (!empty($this->footnotes_ordered)) { +- $text .= "\n\n"; +- $text .= "<div class=\"footnotes\">\n"; +- $text .= "<hr". MARKDOWN_EMPTY_ELEMENT_SUFFIX ."\n"; +- $text .= "<ol>\n\n"; +- +- $attr = " rev=\"footnote\""; +- if ($this->fn_backlink_class != "") { +- $class = $this->fn_backlink_class; +- $class = $this->encodeAttribute($class); +- $attr .= " class=\"$class\""; +- } +- if ($this->fn_backlink_title != "") { +- $title = $this->fn_backlink_title; +- $title = $this->encodeAttribute($title); +- $attr .= " title=\"$title\""; +- } +- $num = 0; +- +- while (!empty($this->footnotes_ordered)) { +- $footnote = reset($this->footnotes_ordered); +- $note_id = key($this->footnotes_ordered); +- unset($this->footnotes_ordered[$note_id]); +- +- $footnote .= "\n"; # Need to append newline before parsing. +- $footnote = $this->runBlockGamut("$footnote\n"); +- $footnote = preg_replace_callback('{F\x1Afn:(.*?)\x1A:}', +- array(&$this, '_appendFootnotes_callback'), $footnote); +- +- $attr = str_replace("%%", ++$num, $attr); +- $note_id = $this->encodeAttribute($note_id); +- +- # Add backlink to last paragraph; create new paragraph if needed. +- $backlink = "<a href=\"#fnref:$note_id\"$attr>↩</a>"; +- if (preg_match('{</p>$}', $footnote)) { +- $footnote = substr($footnote, 0, -4) . " $backlink</p>"; +- } else { +- $footnote .= "\n\n<p>$backlink</p>"; +- } +- +- $text .= "<li id=\"fn:$note_id\">\n"; +- $text .= $footnote . "\n"; +- $text .= "</li>\n\n"; +- } +- +- $text .= "</ol>\n"; +- $text .= "</div>"; +- } +- return $text; +- } +- function _appendFootnotes_callback($matches) { +- $node_id = $this->fn_id_prefix . $matches[1]; +- +- # Create footnote marker only if it has a corresponding footnote *and* +- # the footnote hasn't been used by another marker. +- if (isset($this->footnotes[$node_id])) { +- # Transfert footnote content to the ordered list. +- $this->footnotes_ordered[$node_id] = $this->footnotes[$node_id]; +- unset($this->footnotes[$node_id]); +- +- $num = $this->footnote_counter++; +- $attr = " rel=\"footnote\""; +- if ($this->fn_link_class != "") { +- $class = $this->fn_link_class; +- $class = $this->encodeAttribute($class); +- $attr .= " class=\"$class\""; +- } +- if ($this->fn_link_title != "") { +- $title = $this->fn_link_title; +- $title = $this->encodeAttribute($title); +- $attr .= " title=\"$title\""; +- } +- +- $attr = str_replace("%%", $num, $attr); +- $node_id = $this->encodeAttribute($node_id); +- +- return +- "<sup id=\"fnref:$node_id\">". +- "<a href=\"#fn:$node_id\"$attr>$num</a>". +- "</sup>"; +- } +- +- return "[^".$matches[1]."]"; +- } +- +- +- ### Abbreviations ### +- +- function stripAbbreviations($text) { +- # +- # Strips abbreviations from text, stores titles in hash references. +- # +- $less_than_tab = $this->tab_width - 1; +- +- # Link defs are in the form: [id]*: url "optional title" +- $text = preg_replace_callback('{ +- ^[ ]{0,'.$less_than_tab.'}\*\[(.+?)\][ ]?: # abbr_id = $1 +- (.*) # text = $2 (no blank lines allowed) +- }xm', +- array(&$this, '_stripAbbreviations_callback'), +- $text); +- return $text; +- } +- function _stripAbbreviations_callback($matches) { +- $abbr_word = $matches[1]; +- $abbr_desc = $matches[2]; +- if ($this->abbr_word_re) +- $this->abbr_word_re .= '|'; +- $this->abbr_word_re .= preg_quote($abbr_word); +- $this->abbr_desciptions[$abbr_word] = trim($abbr_desc); +- return ''; # String that will replace the block +- } +- +- +- function doAbbreviations($text) { +- # +- # Find defined abbreviations in text and wrap them in <abbr> elements. +- # +- if ($this->abbr_word_re) { +- // cannot use the /x modifier because abbr_word_re may +- // contain significant spaces: +- $text = preg_replace_callback('{'. +- '(?<![\w\x1A])'. +- '(?:'.$this->abbr_word_re.')'. +- '(?![\w\x1A])'. +- '}', +- array(&$this, '_doAbbreviations_callback'), $text); +- } +- return $text; +- } +- function _doAbbreviations_callback($matches) { +- $abbr = $matches[0]; +- if (isset($this->abbr_desciptions[$abbr])) { +- $desc = $this->abbr_desciptions[$abbr]; +- if (empty($desc)) { +- return $this->hashPart("<abbr>$abbr</abbr>"); +- } else { +- $desc = $this->encodeAttribute($desc); +- return $this->hashPart("<abbr title=\"$desc\">$abbr</abbr>"); +- } +- } else { +- return $matches[0]; +- } +- } +- +-} +- +- +-/* +- +-PHP Markdown Extra +-================== +- +-Description +------------ +- +-This is a PHP port of the original Markdown formatter written in Perl +-by John Gruber. This special "Extra" version of PHP Markdown features +-further enhancements to the syntax for making additional constructs +-such as tables and definition list. +- +-Markdown is a text-to-HTML filter; it translates an easy-to-read / +-easy-to-write structured text format into HTML. Markdown's text format +-is most similar to that of plain text email, and supports features such +-as headers, *emphasis*, code blocks, blockquotes, and links. +- +-Markdown's syntax is designed not as a generic markup language, but +-specifically to serve as a front-end to (X)HTML. You can use span-level +-HTML tags anywhere in a Markdown document, and you can use block level +-HTML tags (like <div> and <table> as well). +- +-For more information about Markdown's syntax, see: +- +-<http://daringfireball.net/projects/markdown/> +- +- +-Bugs +----- +- +-To file bug reports please send email to: +- +-<michel.fortin@michelf.com> +- +-Please include with your report: (1) the example input; (2) the output you +-expected; (3) the output Markdown actually produced. +- +- +-Version History +---------------- +- +-See the readme file for detailed release notes for this version. +- +- +-Copyright and License +---------------------- +- +-PHP Markdown & Extra +-Copyright (c) 2004-2008 Michel Fortin +-<http://www.michelf.com/> +-All rights reserved. +- +-Based on Markdown +-Copyright (c) 2003-2006 John Gruber +-<http://daringfireball.net/> +-All rights reserved. +- +-Redistribution and use in source and binary forms, with or without +-modification, are permitted provided that the following conditions are +-met: +- +-* Redistributions of source code must retain the above copyright notice, +- this list of conditions and the following disclaimer. +- +-* Redistributions in binary form must reproduce the above copyright +- notice, this list of conditions and the following disclaimer in the +- documentation and/or other materials provided with the distribution. +- +-* Neither the name "Markdown" nor the names of its contributors may +- be used to endorse or promote products derived from this software +- without specific prior written permission. +- +-This software is provided by the copyright holders and contributors "as +-is" and any express or implied warranties, including, but not limited +-to, the implied warranties of merchantability and fitness for a +-particular purpose are disclaimed. In no event shall the copyright owner +-or contributors be liable for any direct, indirect, incidental, special, +-exemplary, or consequential damages (including, but not limited to, +-procurement of substitute goods or services; loss of use, data, or +-profits; or business interruption) however caused and on any theory of +-liability, whether in contract, strict liability, or tort (including +-negligence or otherwise) arising in any way out of the use of this +-software, even if advised of the possibility of such damage. +- +-*/ +-?> +\ No newline at end of file +diff --git a/ivfdec.c b/ivfdec.c +index e4c9981..2b26d55 100644 +--- a/ivfdec.c ++++ b/ivfdec.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +@@ -17,10 +18,10 @@ + #include <string.h> + #define VPX_CODEC_DISABLE_COMPAT 1 + #include "vpx_config.h" +-#include "vpx_decoder.h" ++#include "vpx/vpx_decoder.h" + #include "vpx_ports/vpx_timer.h" + #if CONFIG_VP8_DECODER +-#include "vp8dx.h" ++#include "vpx/vp8dx.h" + #endif + #if CONFIG_MD5 + #include "md5_utils.h" +@@ -62,8 +63,10 @@ static const arg_def_t postprocarg = ARG_DEF(NULL, "postproc", 0, + "Postprocess decoded frames"); + static const arg_def_t summaryarg = ARG_DEF(NULL, "summary", 0, + "Show timing summary"); +-static const arg_def_t outputfile = ARG_DEF("o", "output-raw-file", 1, ++static const arg_def_t outputfile = ARG_DEF("o", "output", 1, + "Output raw yv12 file instead of images"); ++static const arg_def_t usey4marg = ARG_DEF("y", "y4m", 0, ++ "Output file is YUV4MPEG2"); + static const arg_def_t threadsarg = ARG_DEF("t", "threads", 1, + "Max threads to use"); + static const arg_def_t quietarg = ARG_DEF("q", "quiet", 0, +@@ -77,7 +80,7 @@ static const arg_def_t *all_args[] = + { + &codecarg, &prefixarg, &use_yv12, &use_i420, &flipuvarg, &noblitarg, + &progressarg, &limitarg, &postprocarg, &summaryarg, &outputfile, +- &threadsarg, &quietarg, ++ &usey4marg, &threadsarg, &quietarg, + #if CONFIG_MD5 + &md5arg, + #endif +@@ -232,9 +235,9 @@ void *out_open(const char *out_fn, int do_md5) + if (do_md5) + { + #if CONFIG_MD5 +- md5_ctx_t *md5_ctx = out = malloc(sizeof(md5_ctx_t)); ++ MD5Context *md5_ctx = out = malloc(sizeof(MD5Context)); + (void)out_fn; +- md5_init(md5_ctx); ++ MD5Init(md5_ctx); + #endif + } + else +@@ -256,7 +259,7 @@ void out_put(void *out, const uint8_t *buf, unsigned int len, int do_md5) + if (do_md5) + { + #if CONFIG_MD5 +- md5_update(out, buf, len); ++ MD5Update(out, buf, len); + #endif + } + else +@@ -273,7 +276,7 @@ void out_close(void *out, const char *out_fn, int do_md5) + uint8_t md5[16]; + int i; + +- md5_finalize(out, md5); ++ MD5Final(md5, out); + free(out); + + for (i = 0; i < 16; i++) +@@ -288,7 +291,12 @@ void out_close(void *out, const char *out_fn, int do_md5) + } + } + +-unsigned int file_is_ivf(FILE *infile, unsigned int *fourcc) ++unsigned int file_is_ivf(FILE *infile, ++ unsigned int *fourcc, ++ unsigned int *width, ++ unsigned int *height, ++ unsigned int *timebase_num, ++ unsigned int *timebase_den) + { + char raw_hdr[32]; + int is_ivf = 0; +@@ -305,6 +313,10 @@ unsigned int file_is_ivf(FILE *infile, unsigned int *fourcc) + " decode properly."); + + *fourcc = mem_get_le32(raw_hdr + 8); ++ *width = mem_get_le16(raw_hdr + 12); ++ *height = mem_get_le16(raw_hdr + 14); ++ *timebase_den = mem_get_le32(raw_hdr + 16); ++ *timebase_num = mem_get_le32(raw_hdr + 20); + } + } + +@@ -330,6 +342,11 @@ int main(int argc, const char **argv_) + struct arg arg; + char **argv, **argi, **argj; + const char *fn2 = 0; ++ int use_y4m = 0; ++ unsigned int width; ++ unsigned int height; ++ unsigned int timebase_num; ++ unsigned int timebase_den; + void *out = NULL; + vpx_codec_dec_cfg_t cfg = {0}; + #if CONFIG_VP8_DECODER +@@ -361,6 +378,8 @@ int main(int argc, const char **argv_) + } + else if (arg_match(&arg, &outputfile, argi)) + fn2 = arg.val; ++ else if (arg_match(&arg, &usey4marg, argi)) ++ use_y4m = 1; + else if (arg_match(&arg, &prefixarg, argi)) + prefix = strdup(arg.val); + else if (arg_match(&arg, &use_yv12, argi)) +@@ -446,10 +465,31 @@ int main(int argc, const char **argv_) + if (fn2) + out = out_open(fn2, do_md5); + +- is_ivf = file_is_ivf(infile, &fourcc); ++ is_ivf = file_is_ivf(infile, &fourcc, &width, &height, ++ &timebase_num, &timebase_den); + + if (is_ivf) + { ++ if (use_y4m) ++ { ++ char buffer[128]; ++ if (!fn2) ++ { ++ fprintf(stderr, "YUV4MPEG2 output only supported with -o.\n"); ++ return EXIT_FAILURE; ++ } ++ /*Correct for the factor of 2 applied to the timebase in the ++ encoder.*/ ++ if(timebase_den&1)timebase_num<<=1; ++ else timebase_den>>=1; ++ /*Note: We can't output an aspect ratio here because IVF doesn't ++ store one, and neither does VP8. ++ That will have to wait until these tools support WebM natively.*/ ++ sprintf(buffer, "YUV4MPEG2 C%s W%u H%u F%u:%u I%c\n", ++ "420jpeg", width, height, timebase_den, timebase_num, 'p'); ++ out_put(out, (unsigned char *)buffer, strlen(buffer), do_md5); ++ } ++ + /* Try to determine the codec from the fourcc. */ + for (i = 0; i < sizeof(ifaces) / sizeof(ifaces[0]); i++) + if ((fourcc & ifaces[i].fourcc_mask) == ifaces[i].fourcc) +@@ -465,6 +505,11 @@ int main(int argc, const char **argv_) + break; + } + } ++ else if(use_y4m) ++ { ++ fprintf(stderr, "YUV4MPEG2 output only supported from IVF input.\n"); ++ return EXIT_FAILURE; ++ } + + if (vpx_codec_dec_init(&decoder, iface ? iface : ifaces[0].iface, &cfg, + postproc ? VPX_CODEC_USE_POSTPROC : 0)) +@@ -533,29 +578,31 @@ int main(int argc, const char **argv_) + prefix, img->d_w, img->d_h, frame_in, sfx); + out = out_open(out_fn, do_md5); + } ++ else if(use_y4m) ++ out_put(out, (unsigned char *)"FRAME\n", 6, do_md5); + +- buf = img->planes[PLANE_Y]; ++ buf = img->planes[VPX_PLANE_Y]; + + for (y = 0; y < img->d_h; y++) + { + out_put(out, buf, img->d_w, do_md5); +- buf += img->stride[PLANE_Y]; ++ buf += img->stride[VPX_PLANE_Y]; + } + +- buf = img->planes[flipuv?PLANE_V:PLANE_U]; ++ buf = img->planes[flipuv?VPX_PLANE_V:VPX_PLANE_U]; + + for (y = 0; y < (1 + img->d_h) / 2; y++) + { + out_put(out, buf, (1 + img->d_w) / 2, do_md5); +- buf += img->stride[PLANE_U]; ++ buf += img->stride[VPX_PLANE_U]; + } + +- buf = img->planes[flipuv?PLANE_U:PLANE_V]; ++ buf = img->planes[flipuv?VPX_PLANE_U:VPX_PLANE_V]; + + for (y = 0; y < (1 + img->d_h) / 2; y++) + { + out_put(out, buf, (1 + img->d_w) / 2, do_md5); +- buf += img->stride[PLANE_V]; ++ buf += img->stride[VPX_PLANE_V]; + } + + if (!fn2) +diff --git a/ivfenc.c b/ivfenc.c +index bef3d58..11f2a8f 100644 +--- a/ivfenc.c ++++ b/ivfenc.c +@@ -1,23 +1,28 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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 is a simple program that encodes YV12 files and generates ivf + * files using the new interface. + */ +-#define USE_POSIX_MMAP HAVE_SYS_MMAN_H ++#if defined(_WIN32) ++#define USE_POSIX_MMAP 0 ++#else ++#define USE_POSIX_MMAP 1 ++#endif + + #include <stdio.h> + #include <stdlib.h> + #include <stdarg.h> + #include <string.h> +-#include "vpx_encoder.h" ++#include "vpx/vpx_encoder.h" + #if USE_POSIX_MMAP + #include <sys/types.h> + #include <sys/stat.h> +@@ -25,11 +30,10 @@ + #include <fcntl.h> + #include <unistd.h> + #endif +-#if CONFIG_VP8_ENCODER +-#include "vp8cx.h" +-#endif ++#include "vpx/vp8cx.h" + #include "vpx_ports/mem_ops.h" + #include "vpx_ports/vpx_timer.h" ++#include "y4minput.h" + + static const char *exec_name; + +@@ -51,8 +55,8 @@ void die(const char *fmt, ...) + { + va_list ap; + va_start(ap, fmt); +- vprintf(fmt, ap); +- printf("\n"); ++ vfprintf(stderr, fmt, ap); ++ fprintf(stderr, "\n"); + usage_exit(); + } + +@@ -62,10 +66,10 @@ static void ctx_exit_on_error(vpx_codec_ctx_t *ctx, const char *s) + { + const char *detail = vpx_codec_error_detail(ctx); + +- printf("%s: %s\n", s, vpx_codec_error(ctx)); ++ fprintf(stderr, "%s: %s\n", s, vpx_codec_error(ctx)); + + if (detail) +- printf(" %s\n", detail); ++ fprintf(stderr, " %s\n", detail); + + exit(EXIT_FAILURE); + } +@@ -215,49 +219,79 @@ vpx_fixed_buf_t stats_get(stats_io_t *stats) + return stats->buf; + } + ++enum video_file_type ++{ ++ FILE_TYPE_RAW, ++ FILE_TYPE_IVF, ++ FILE_TYPE_Y4M ++}; ++ ++struct detect_buffer { ++ char buf[4]; ++ int valid; ++}; ++ ++ + #define IVF_FRAME_HDR_SZ (4+8) /* 4 byte size + 8 byte timestamp */ +-static int read_frame(FILE *f, vpx_image_t *img, unsigned int is_ivf) ++static int read_frame(FILE *f, vpx_image_t *img, unsigned int file_type, ++ y4m_input *y4m, struct detect_buffer *detect) + { + int plane = 0; + +- if (is_ivf) ++ if (file_type == FILE_TYPE_Y4M) + { +- char junk[IVF_FRAME_HDR_SZ]; +- +- /* Skip the frame header. We know how big the frame should be. See +- * write_ivf_frame_header() for documentation on the frame header +- * layout. +- */ +- fread(junk, 1, IVF_FRAME_HDR_SZ, f); ++ if (y4m_input_fetch_frame(y4m, f, img) < 0) ++ return 0; + } +- +- for (plane = 0; plane < 3; plane++) ++ else + { +- unsigned char *ptr; +- int w = (plane ? (1 + img->d_w) / 2 : img->d_w); +- int h = (plane ? (1 + img->d_h) / 2 : img->d_h); +- int r; +- +- /* Determine the correct plane based on the image format. The for-loop +- * always counts in Y,U,V order, but this may not match the order of +- * the data on disk. +- */ +- switch (plane) ++ if (file_type == FILE_TYPE_IVF) + { +- case 1: +- ptr = img->planes[img->fmt==IMG_FMT_YV12? PLANE_V : PLANE_U]; +- break; +- case 2: +- ptr = img->planes[img->fmt==IMG_FMT_YV12?PLANE_U : PLANE_V]; +- break; +- default: +- ptr = img->planes[plane]; ++ char junk[IVF_FRAME_HDR_SZ]; ++ ++ /* Skip the frame header. We know how big the frame should be. See ++ * write_ivf_frame_header() for documentation on the frame header ++ * layout. ++ */ ++ fread(junk, 1, IVF_FRAME_HDR_SZ, f); + } + +- for (r = 0; r < h; r++) ++ for (plane = 0; plane < 3; plane++) + { +- fread(ptr, 1, w, f); +- ptr += img->stride[plane]; ++ unsigned char *ptr; ++ int w = (plane ? (1 + img->d_w) / 2 : img->d_w); ++ int h = (plane ? (1 + img->d_h) / 2 : img->d_h); ++ int r; ++ ++ /* Determine the correct plane based on the image format. The for-loop ++ * always counts in Y,U,V order, but this may not match the order of ++ * the data on disk. ++ */ ++ switch (plane) ++ { ++ case 1: ++ ptr = img->planes[img->fmt==VPX_IMG_FMT_YV12? VPX_PLANE_V : VPX_PLANE_U]; ++ break; ++ case 2: ++ ptr = img->planes[img->fmt==VPX_IMG_FMT_YV12?VPX_PLANE_U : VPX_PLANE_V]; ++ break; ++ default: ++ ptr = img->planes[plane]; ++ } ++ ++ for (r = 0; r < h; r++) ++ { ++ if (detect->valid) ++ { ++ memcpy(ptr, detect->buf, 4); ++ fread(ptr+4, 1, w-4, f); ++ detect->valid = 0; ++ } ++ else ++ fread(ptr, 1, w, f); ++ ++ ptr += img->stride[plane]; ++ } + } + } + +@@ -265,22 +299,36 @@ static int read_frame(FILE *f, vpx_image_t *img, unsigned int is_ivf) + } + + ++unsigned int file_is_y4m(FILE *infile, ++ y4m_input *y4m, ++ char detect[4]) ++{ ++ if(memcmp(detect, "YUV4", 4) == 0) ++ { ++ return 1; ++ } ++ return 0; ++} ++ + #define IVF_FILE_HDR_SZ (32) + unsigned int file_is_ivf(FILE *infile, + unsigned int *fourcc, + unsigned int *width, +- unsigned int *height) ++ unsigned int *height, ++ char detect[4]) + { + char raw_hdr[IVF_FILE_HDR_SZ]; + int is_ivf = 0; + ++ if(memcmp(detect, "DKIF", 4) != 0) ++ return 0; ++ + /* See write_ivf_file_header() for more documentation on the file header + * layout. + */ +- if (fread(raw_hdr, 1, IVF_FILE_HDR_SZ, infile) == IVF_FILE_HDR_SZ) ++ if (fread(raw_hdr + 4, 1, IVF_FILE_HDR_SZ - 4, infile) ++ == IVF_FILE_HDR_SZ - 4) + { +- if (raw_hdr[0] == 'D' && raw_hdr[1] == 'K' +- && raw_hdr[2] == 'I' && raw_hdr[3] == 'F') + { + is_ivf = 1; + +@@ -297,8 +345,6 @@ unsigned int file_is_ivf(FILE *infile, + *width = mem_get_le16(raw_hdr + 12); + *height = mem_get_le16(raw_hdr + 14); + } +- else +- rewind(infile); + + return is_ivf; + } +@@ -512,28 +558,28 @@ static void usage_exit() + { + int i; + +- printf("Usage: %s <options> src_filename dst_filename\n", exec_name); ++ fprintf(stderr, "Usage: %s <options> src_filename dst_filename\n", exec_name); + +- printf("\n_options:\n"); ++ fprintf(stderr, "\n_options:\n"); + arg_show_usage(stdout, main_args); +- printf("\n_encoder Global Options:\n"); ++ fprintf(stderr, "\n_encoder Global Options:\n"); + arg_show_usage(stdout, global_args); +- printf("\n_rate Control Options:\n"); ++ fprintf(stderr, "\n_rate Control Options:\n"); + arg_show_usage(stdout, rc_args); +- printf("\n_twopass Rate Control Options:\n"); ++ fprintf(stderr, "\n_twopass Rate Control Options:\n"); + arg_show_usage(stdout, rc_twopass_args); +- printf("\n_keyframe Placement Options:\n"); ++ fprintf(stderr, "\n_keyframe Placement Options:\n"); + arg_show_usage(stdout, kf_args); + #if CONFIG_VP8_ENCODER +- printf("\n_vp8 Specific Options:\n"); ++ fprintf(stderr, "\n_vp8 Specific Options:\n"); + arg_show_usage(stdout, vp8_args); + #endif +- printf("\n" ++ fprintf(stderr, "\n" + "Included encoders:\n" + "\n"); + + for (i = 0; i < sizeof(codecs) / sizeof(codecs[0]); i++) +- printf(" %-6s - %s\n", ++ fprintf(stderr, " %-6s - %s\n", + codecs[i].name, + vpx_codec_iface_name(codecs[i].iface)); + +@@ -566,8 +612,10 @@ int main(int argc, const char **argv_) + static const int *ctrl_args_map = NULL; + int verbose = 0, show_psnr = 0; + int arg_use_i420 = 1; ++ int arg_have_timebase = 0; + unsigned long cx_time = 0; +- unsigned int is_ivf, fourcc; ++ unsigned int file_type, fourcc; ++ y4m_input y4m; + + exec_name = argv_[0]; + +@@ -651,7 +699,7 @@ int main(int argc, const char **argv_) + /* DWIM: Assume the user meant passes=2 if pass=2 is specified */ + if (one_pass_only > arg_passes) + { +- printf("Warning: Assuming --pass=%d implies --passes=%d\n", ++ fprintf(stderr, "Warning: Assuming --pass=%d implies --passes=%d\n", + one_pass_only, one_pass_only); + arg_passes = one_pass_only; + } +@@ -665,7 +713,8 @@ int main(int argc, const char **argv_) + + if (res) + { +- printf("Failed to get config: %s\n", vpx_codec_err_to_string(res)); ++ fprintf(stderr, "Failed to get config: %s\n", ++ vpx_codec_err_to_string(res)); + return EXIT_FAILURE; + } + +@@ -684,7 +733,10 @@ int main(int argc, const char **argv_) + else if (arg_match(&arg, &height, argi)) + cfg.g_h = arg_parse_uint(&arg); + else if (arg_match(&arg, &timebase, argi)) ++ { + cfg.g_timebase = arg_parse_rational(&arg); ++ arg_have_timebase = 1; ++ } + else if (arg_match(&arg, &error_resilient, argi)) + cfg.g_error_resilient = arg_parse_uint(&arg); + else if (arg_match(&arg, &lag_in_frames, argi)) +@@ -722,24 +774,27 @@ int main(int argc, const char **argv_) + cfg.rc_2pass_vbr_bias_pct = arg_parse_uint(&arg); + + if (arg_passes < 2) +- printf("Warning: option %s ignored in one-pass mode.\n", +- arg.name); ++ fprintf(stderr, ++ "Warning: option %s ignored in one-pass mode.\n", ++ arg.name); + } + else if (arg_match(&arg, &minsection_pct, argi)) + { + cfg.rc_2pass_vbr_minsection_pct = arg_parse_uint(&arg); + + if (arg_passes < 2) +- printf("Warning: option %s ignored in one-pass mode.\n", +- arg.name); ++ fprintf(stderr, ++ "Warning: option %s ignored in one-pass mode.\n", ++ arg.name); + } + else if (arg_match(&arg, &maxsection_pct, argi)) + { + cfg.rc_2pass_vbr_maxsection_pct = arg_parse_uint(&arg); + + if (arg_passes < 2) +- printf("Warning: option %s ignored in one-pass mode.\n", +- arg.name); ++ fprintf(stderr, ++ "Warning: option %s ignored in one-pass mode.\n", ++ arg.name); + } + else if (arg_match(&arg, &kf_min_dist, argi)) + cfg.kf_min_dist = arg_parse_uint(&arg); +@@ -787,7 +842,7 @@ int main(int argc, const char **argv_) + + /* Check for unrecognized options */ + for (argi = argv; *argi; argi++) +- if (argi[0][0] == '-') ++ if (argi[0][0] == '-' && argi[0][1]) + die("Error: Unrecognized option %s\n", *argi); + + /* Handle non-option arguments */ +@@ -797,106 +852,134 @@ int main(int argc, const char **argv_) + if (!in_fn || !out_fn) + usage_exit(); + +- /* Parse certain options from the input file, if possible */ +- infile = fopen(in_fn, "rb"); +- +- if (!infile) +- { +- printf("Failed to open input file"); +- return EXIT_FAILURE; +- } +- +- is_ivf = file_is_ivf(infile, &fourcc, &cfg.g_w, &cfg.g_h); +- +- if (is_ivf) +- { +- switch (fourcc) +- { +- case 0x32315659: +- arg_use_i420 = 0; +- break; +- case 0x30323449: +- arg_use_i420 = 1; +- break; +- default: +- printf("Unsupported fourcc (%08x) in IVF\n", fourcc); +- return EXIT_FAILURE; +- } +- } +- +- fclose(infile); +- +- +-#define SHOW(field) printf(" %-28s = %d\n", #field, cfg.field) +- +- if (verbose) +- { +- printf("Codec: %s\n", vpx_codec_iface_name(codec->iface)); +- printf("Source file: %s Format: %s\n", in_fn, arg_use_i420 ? "I420" : "YV12"); +- printf("Destination file: %s\n", out_fn); +- printf("Encoder parameters:\n"); +- +- SHOW(g_usage); +- SHOW(g_threads); +- SHOW(g_profile); +- SHOW(g_w); +- SHOW(g_h); +- SHOW(g_timebase.num); +- SHOW(g_timebase.den); +- SHOW(g_error_resilient); +- SHOW(g_pass); +- SHOW(g_lag_in_frames); +- SHOW(rc_dropframe_thresh); +- SHOW(rc_resize_allowed); +- SHOW(rc_resize_up_thresh); +- SHOW(rc_resize_down_thresh); +- SHOW(rc_end_usage); +- SHOW(rc_target_bitrate); +- SHOW(rc_min_quantizer); +- SHOW(rc_max_quantizer); +- SHOW(rc_undershoot_pct); +- SHOW(rc_overshoot_pct); +- SHOW(rc_buf_sz); +- SHOW(rc_buf_initial_sz); +- SHOW(rc_buf_optimal_sz); +- SHOW(rc_2pass_vbr_bias_pct); +- SHOW(rc_2pass_vbr_minsection_pct); +- SHOW(rc_2pass_vbr_maxsection_pct); +- SHOW(kf_mode); +- SHOW(kf_min_dist); +- SHOW(kf_max_dist); +- } +- +- vpx_img_alloc(&raw, arg_use_i420 ? IMG_FMT_I420 : IMG_FMT_YV12, +- cfg.g_w, cfg.g_h, 1); +- +- // This was added so that ivfenc will create monotically increasing +- // timestamps. Since we create new timestamps for alt-reference frames +- // we need to make room in the series of timestamps. Since there can +- // only be 1 alt-ref frame ( current bitstream) multiplying by 2 +- // gives us enough room. +- cfg.g_timebase.den *= 2; +- + memset(&stats, 0, sizeof(stats)); + + for (pass = one_pass_only ? one_pass_only - 1 : 0; pass < arg_passes; pass++) + { + int frames_in = 0, frames_out = 0; + unsigned long nbytes = 0; ++ struct detect_buffer detect; + +- infile = fopen(in_fn, "rb"); ++ /* Parse certain options from the input file, if possible */ ++ infile = strcmp(in_fn, "-") ? fopen(in_fn, "rb") : stdin; + + if (!infile) + { +- printf("Failed to open input file"); ++ fprintf(stderr, "Failed to open input file\n"); + return EXIT_FAILURE; + } + +- outfile = fopen(out_fn, "wb"); ++ fread(detect.buf, 1, 4, infile); ++ detect.valid = 0; ++ ++ if (file_is_y4m(infile, &y4m, detect.buf)) ++ { ++ if (y4m_input_open(&y4m, infile, detect.buf, 4) >= 0) ++ { ++ file_type = FILE_TYPE_Y4M; ++ cfg.g_w = y4m.pic_w; ++ cfg.g_h = y4m.pic_h; ++ /* Use the frame rate from the file only if none was specified ++ * on the command-line. ++ */ ++ if (!arg_have_timebase) ++ { ++ cfg.g_timebase.num = y4m.fps_d; ++ cfg.g_timebase.den = y4m.fps_n; ++ } ++ arg_use_i420 = 0; ++ } ++ else ++ { ++ fprintf(stderr, "Unsupported Y4M stream.\n"); ++ return EXIT_FAILURE; ++ } ++ } ++ else if (file_is_ivf(infile, &fourcc, &cfg.g_w, &cfg.g_h, detect.buf)) ++ { ++ file_type = FILE_TYPE_IVF; ++ switch (fourcc) ++ { ++ case 0x32315659: ++ arg_use_i420 = 0; ++ break; ++ case 0x30323449: ++ arg_use_i420 = 1; ++ break; ++ default: ++ fprintf(stderr, "Unsupported fourcc (%08x) in IVF\n", fourcc); ++ return EXIT_FAILURE; ++ } ++ } ++ else ++ { ++ file_type = FILE_TYPE_RAW; ++ detect.valid = 1; ++ } ++#define SHOW(field) fprintf(stderr, " %-28s = %d\n", #field, cfg.field) ++ ++ if (verbose && pass == 0) ++ { ++ fprintf(stderr, "Codec: %s\n", vpx_codec_iface_name(codec->iface)); ++ fprintf(stderr, "Source file: %s Format: %s\n", in_fn, ++ arg_use_i420 ? "I420" : "YV12"); ++ fprintf(stderr, "Destination file: %s\n", out_fn); ++ fprintf(stderr, "Encoder parameters:\n"); ++ ++ SHOW(g_usage); ++ SHOW(g_threads); ++ SHOW(g_profile); ++ SHOW(g_w); ++ SHOW(g_h); ++ SHOW(g_timebase.num); ++ SHOW(g_timebase.den); ++ SHOW(g_error_resilient); ++ SHOW(g_pass); ++ SHOW(g_lag_in_frames); ++ SHOW(rc_dropframe_thresh); ++ SHOW(rc_resize_allowed); ++ SHOW(rc_resize_up_thresh); ++ SHOW(rc_resize_down_thresh); ++ SHOW(rc_end_usage); ++ SHOW(rc_target_bitrate); ++ SHOW(rc_min_quantizer); ++ SHOW(rc_max_quantizer); ++ SHOW(rc_undershoot_pct); ++ SHOW(rc_overshoot_pct); ++ SHOW(rc_buf_sz); ++ SHOW(rc_buf_initial_sz); ++ SHOW(rc_buf_optimal_sz); ++ SHOW(rc_2pass_vbr_bias_pct); ++ SHOW(rc_2pass_vbr_minsection_pct); ++ SHOW(rc_2pass_vbr_maxsection_pct); ++ SHOW(kf_mode); ++ SHOW(kf_min_dist); ++ SHOW(kf_max_dist); ++ } ++ ++ if(pass == (one_pass_only ? one_pass_only - 1 : 0)) { ++ if (file_type == FILE_TYPE_Y4M) ++ /*The Y4M reader does its own allocation. ++ Just initialize this here to avoid problems if we never read any ++ frames.*/ ++ memset(&raw, 0, sizeof(raw)); ++ else ++ vpx_img_alloc(&raw, arg_use_i420 ? VPX_IMG_FMT_I420 : VPX_IMG_FMT_YV12, ++ cfg.g_w, cfg.g_h, 1); ++ ++ // This was added so that ivfenc will create monotically increasing ++ // timestamps. Since we create new timestamps for alt-reference frames ++ // we need to make room in the series of timestamps. Since there can ++ // only be 1 alt-ref frame ( current bitstream) multiplying by 2 ++ // gives us enough room. ++ cfg.g_timebase.den *= 2; ++ } ++ ++ outfile = strcmp(out_fn, "-") ? fopen(out_fn, "wb") : stdout; + + if (!outfile) + { +- printf("Failed to open output file"); ++ fprintf(stderr, "Failed to open output file\n"); + return EXIT_FAILURE; + } + +@@ -904,7 +987,7 @@ int main(int argc, const char **argv_) + { + if (!stats_open_file(&stats, stats_fn, pass)) + { +- printf("Failed to open statistics store\n"); ++ fprintf(stderr, "Failed to open statistics store\n"); + return EXIT_FAILURE; + } + } +@@ -912,7 +995,7 @@ int main(int argc, const char **argv_) + { + if (!stats_open_mem(&stats, pass)) + { +- printf("Failed to open statistics store\n"); ++ fprintf(stderr, "Failed to open statistics store\n"); + return EXIT_FAILURE; + } + } +@@ -947,8 +1030,8 @@ int main(int argc, const char **argv_) + for (i = 0; i < arg_ctrl_cnt; i++) + { + if (vpx_codec_control_(&encoder, arg_ctrls[i][0], arg_ctrls[i][1])) +- printf("Error: Tried to set control %d = %d\n", +- arg_ctrls[i][0], arg_ctrls[i][1]); ++ fprintf(stderr, "Error: Tried to set control %d = %d\n", ++ arg_ctrls[i][0], arg_ctrls[i][1]); + + ctx_exit_on_error(&encoder, "Failed to control codec"); + } +@@ -964,13 +1047,15 @@ int main(int argc, const char **argv_) + + if (!arg_limit || frames_in < arg_limit) + { +- frame_avail = read_frame(infile, &raw, is_ivf); ++ frame_avail = read_frame(infile, &raw, file_type, &y4m, ++ &detect); + + if (frame_avail) + frames_in++; + +- printf("\rPass %d/%d frame %4d/%-4d %7ldB \033[K", pass + 1, +- arg_passes, frames_in, frames_out, nbytes); ++ fprintf(stderr, ++ "\rPass %d/%d frame %4d/%-4d %7ldB \033[K", pass + 1, ++ arg_passes, frames_in, frames_out, nbytes); + } + else + frame_avail = 0; +@@ -989,24 +1074,25 @@ int main(int argc, const char **argv_) + while ((pkt = vpx_codec_get_cx_data(&encoder, &iter))) + { + got_data = 1; +- nbytes += pkt->data.raw.sz; + + switch (pkt->kind) + { + case VPX_CODEC_CX_FRAME_PKT: + frames_out++; +- printf(" %6luF", +- (unsigned long)pkt->data.frame.sz); ++ fprintf(stderr, " %6luF", ++ (unsigned long)pkt->data.frame.sz); + write_ivf_frame_header(outfile, pkt); + fwrite(pkt->data.frame.buf, 1, pkt->data.frame.sz, outfile); ++ nbytes += pkt->data.raw.sz; + break; + case VPX_CODEC_STATS_PKT: + frames_out++; +- printf(" %6luS", ++ fprintf(stderr, " %6luS", + (unsigned long)pkt->data.twopass_stats.sz); + stats_write(&stats, + pkt->data.twopass_stats.buf, + pkt->data.twopass_stats.sz); ++ nbytes += pkt->data.raw.sz; + break; + case VPX_CODEC_PSNR_PKT: + +@@ -1015,7 +1101,7 @@ int main(int argc, const char **argv_) + int i; + + for (i = 0; i < 4; i++) +- printf("%.3lf ", pkt->data.psnr.psnr[i]); ++ fprintf(stderr, "%.3lf ", pkt->data.psnr.psnr[i]); + } + + break; +@@ -1030,10 +1116,11 @@ int main(int argc, const char **argv_) + /* this bitrate calc is simplified and relies on the fact that this + * application uses 1/timebase for framerate. + */ +- printf("\rPass %d/%d frame %4d/%-4d %7ldB %7ldb/f %7"PRId64"b/s" ++ fprintf(stderr, ++ "\rPass %d/%d frame %4d/%-4d %7ldB %7ldb/f %7"PRId64"b/s" + " %7lu %s (%.2f fps)\033[K", pass + 1, + arg_passes, frames_in, frames_out, nbytes, nbytes * 8 / frames_in, +- nbytes * 8 *(int64_t)cfg.g_timebase.den / cfg.g_timebase.num / frames_in, ++ nbytes * 8 *(int64_t)cfg.g_timebase.den/2/ cfg.g_timebase.num / frames_in, + cx_time > 9999999 ? cx_time / 1000 : cx_time, + cx_time > 9999999 ? "ms" : "us", + (float)frames_in * 1000000.0 / (float)cx_time); +@@ -1047,7 +1134,7 @@ int main(int argc, const char **argv_) + + fclose(outfile); + stats_close(&stats); +- printf("\n"); ++ fprintf(stderr, "\n"); + + if (one_pass_only) + break; +diff --git a/libs.doxy_template b/libs.doxy_template +index eb37dfc..ce8fde6 100644 +--- a/libs.doxy_template ++++ b/libs.doxy_template +@@ -1,10 +1,11 @@ + ## + ## Copyright (c) 2010 The VP8 project authors. All Rights Reserved. +-## +-## Use of this source code is governed by a BSD-style license and patent +-## grant that can be found in the LICENSE file in the root of the source +-## tree. All contributing project authors may be found in the AUTHORS +-## file in the root of the source tree. ++## ++## 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. + ## + + +diff --git a/libs.mk b/libs.mk +index f741dba..115ceb5 100644 +--- a/libs.mk ++++ b/libs.mk +@@ -1,17 +1,18 @@ + ## + ## Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ## +-## Use of this source code is governed by a BSD-style license and patent +-## grant that can be found in the LICENSE file in the root of the source +-## tree. All contributing project authors may be found in the AUTHORS +-## file in the root of the source tree. ++## 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. + ## + + + ASM:=$(if $(filter yes,$(CONFIG_GCC)),.asm.s,.asm) + +-include $(SRC_PATH_BARE)/vpx_codec/vpx_codec.mk +-CODEC_SRCS-yes += $(addprefix vpx_codec/,$(call enabled,API_SRCS)) ++include $(SRC_PATH_BARE)/vpx/vpx_codec.mk ++CODEC_SRCS-yes += $(addprefix vpx/,$(call enabled,API_SRCS)) + + include $(SRC_PATH_BARE)/vpx_mem/vpx_mem.mk + CODEC_SRCS-yes += $(addprefix vpx_mem/,$(call enabled,MEM_SRCS)) +@@ -19,18 +20,16 @@ CODEC_SRCS-yes += $(addprefix vpx_mem/,$(call enabled,MEM_SRCS)) + include $(SRC_PATH_BARE)/vpx_scale/vpx_scale.mk + CODEC_SRCS-yes += $(addprefix vpx_scale/,$(call enabled,SCALE_SRCS)) + +-# Add vpx_codec/ to the include path to allow vp_n[cd]x.h to reference +-# vpx_codec_impl_*.h without extra ifdeffery +-CFLAGS += -I$(SRC_PATH_BARE)/vpx_codec + + ifeq ($(CONFIG_VP8_ENCODER),yes) + VP8_PREFIX=vp8/ + include $(SRC_PATH_BARE)/$(VP8_PREFIX)vp8cx.mk + CODEC_SRCS-yes += $(addprefix $(VP8_PREFIX),$(call enabled,VP8_CX_SRCS)) + CODEC_EXPORTS-yes += $(addprefix $(VP8_PREFIX),$(VP8_CX_EXPORTS)) +- CODEC_SRCS-yes += $(VP8_PREFIX)vp8cx.mk +- INSTALL_MAPS += include/% $(SRC_PATH_BARE)/$(VP8_PREFIX)/% +- CODEC_DOC_SRCS += vp8/vp8.h vp8/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)/% ++ CODEC_DOC_SRCS += vpx/vp8.h vpx/vp8cx.h + CODEC_DOC_SECTIONS += vp8 vp8_encoder + endif + +@@ -39,9 +38,10 @@ ifeq ($(CONFIG_VP8_DECODER),yes) + include $(SRC_PATH_BARE)/$(VP8_PREFIX)vp8dx.mk + CODEC_SRCS-yes += $(addprefix $(VP8_PREFIX),$(call enabled,VP8_DX_SRCS)) + CODEC_EXPORTS-yes += $(addprefix $(VP8_PREFIX),$(VP8_DX_EXPORTS)) +- CODEC_SRCS-yes += $(VP8_PREFIX)vp8dx.mk +- INSTALL_MAPS += include/% $(SRC_PATH_BARE)/$(VP8_PREFIX)/% +- CODEC_DOC_SRCS += vp8/vp8.h vp8/vp8dx.h ++ 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_MAPS += include/vpx/% $(SRC_PATH_BARE)/$(VP8_PREFIX)/% ++ CODEC_DOC_SRCS += vpx/vp8.h vpx/vp8dx.h + CODEC_DOC_SECTIONS += vp8 vp8_decoder + endif + +@@ -64,13 +64,13 @@ endif + + # The following pairs define a mapping of locations in the distribution + # tree to locations in the source/build trees. +-INSTALL_MAPS += include/% $(SRC_PATH_BARE)/vpx_codec/% +-INSTALL_MAPS += include/% $(SRC_PATH_BARE)/vpx_ports/% +-INSTALL_MAPS += lib/% % ++INSTALL_MAPS += include/vpx/% $(SRC_PATH_BARE)/vpx/% ++INSTALL_MAPS += include/vpx/% $(SRC_PATH_BARE)/vpx_ports/% ++INSTALL_MAPS += $(LIBSUBDIR)/% % + INSTALL_MAPS += src/% $(SRC_PATH_BARE)/% + ifeq ($(CONFIG_MSVS),yes) +-INSTALL_MAPS += $(foreach p,$(VS_PLATFORMS),lib/$(p)/% $(p)/Release/%) +-INSTALL_MAPS += $(foreach p,$(VS_PLATFORMS),lib/$(p)/% $(p)/Debug/%) ++INSTALL_MAPS += $(foreach p,$(VS_PLATFORMS),$(LIBSUBDIR)/$(p)/% $(p)/Release/%) ++INSTALL_MAPS += $(foreach p,$(VS_PLATFORMS),$(LIBSUBDIR)/$(p)/% $(p)/Debug/%) + endif + + # If this is a universal (fat) binary, then all the subarchitectures have +@@ -81,7 +81,7 @@ endif + $(eval $(if $(filter universal%,$(TOOLCHAIN)),LIPO_LIBVPX,BUILD_LIBVPX):=yes) + + CODEC_SRCS-$(BUILD_LIBVPX) += build/make/version.sh +-CODEC_SRCS-$(BUILD_LIBVPX) += vpx_ports/vpx_integer.h ++CODEC_SRCS-$(BUILD_LIBVPX) += vpx/vpx_integer.h + CODEC_SRCS-$(BUILD_LIBVPX) += vpx_ports/vpx_timer.h + CODEC_SRCS-$(BUILD_LIBVPX) += vpx_ports/mem.h + CODEC_SRCS-$(BUILD_LIBVPX) += $(BUILD_PFX)vpx_config.c +@@ -92,26 +92,28 @@ CODEC_SRCS-$(BUILD_LIBVPX) += vpx_ports/x86.h + CODEC_SRCS-$(BUILD_LIBVPX) += vpx_ports/x86_abi_support.asm + endif + CODEC_SRCS-$(ARCH_ARM) += $(BUILD_PFX)vpx_config.asm +-CODEC_EXPORTS-$(BUILD_LIBVPX) += vpx_codec/exports +- +-INSTALL-LIBS-yes += include/vpx_codec.h +-INSTALL-LIBS-yes += include/vpx_image.h +-INSTALL-LIBS-yes += include/vpx_integer.h +-INSTALL-LIBS-yes += include/vpx_codec_impl_top.h +-INSTALL-LIBS-yes += include/vpx_codec_impl_bottom.h +-INSTALL-LIBS-$(CONFIG_DECODERS) += include/vpx_decoder.h +-INSTALL-LIBS-$(CONFIG_DECODERS) += include/vpx_decoder_compat.h +-INSTALL-LIBS-$(CONFIG_ENCODERS) += include/vpx_encoder.h ++CODEC_EXPORTS-$(BUILD_LIBVPX) += vpx/exports_com ++CODEC_EXPORTS-$(CONFIG_ENCODERS) += vpx/exports_enc ++CODEC_EXPORTS-$(CONFIG_DECODERS) += vpx/exports_dec ++ ++INSTALL-LIBS-yes += include/vpx/vpx_codec.h ++INSTALL-LIBS-yes += include/vpx/vpx_image.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_compat.h ++INSTALL-LIBS-$(CONFIG_ENCODERS) += include/vpx/vpx_encoder.h + ifeq ($(CONFIG_EXTERNAL_BUILD),yes) + ifeq ($(CONFIG_MSVS),yes) +-INSTALL-LIBS-yes += $(foreach p,$(VS_PLATFORMS),lib/$(p)/$(CODEC_LIB).lib) +-INSTALL-LIBS-$(CONFIG_DEBUG_LIBS) += $(foreach p,$(VS_PLATFORMS),lib/$(p)/$(CODEC_LIB)d.lib) +-INSTALL-LIBS-$(CONFIG_SHARED) += $(foreach p,$(VS_PLATFORMS),lib/$(p)/vpx.dll) +-INSTALL-LIBS-$(CONFIG_SHARED) += $(foreach p,$(VS_PLATFORMS),lib/$(p)/vpx.exp) ++INSTALL-LIBS-yes += $(foreach p,$(VS_PLATFORMS),$(LIBSUBDIR)/$(p)/$(CODEC_LIB).lib) ++INSTALL-LIBS-$(CONFIG_DEBUG_LIBS) += $(foreach p,$(VS_PLATFORMS),$(LIBSUBDIR)/$(p)/$(CODEC_LIB)d.lib) ++INSTALL-LIBS-$(CONFIG_SHARED) += $(foreach p,$(VS_PLATFORMS),$(LIBSUBDIR)/$(p)/vpx.dll) ++INSTALL-LIBS-$(CONFIG_SHARED) += $(foreach p,$(VS_PLATFORMS),$(LIBSUBDIR)/$(p)/vpx.exp) + endif + else +-INSTALL-LIBS-yes += lib/libvpx.a +-INSTALL-LIBS-$(CONFIG_DEBUG_LIBS) += lib/libvpx_g.a ++INSTALL-LIBS-yes += $(LIBSUBDIR)/libvpx.a ++INSTALL-LIBS-$(CONFIG_DEBUG_LIBS) += $(LIBSUBDIR)/libvpx_g.a + endif + + CODEC_SRCS=$(call enabled,CODEC_SRCS) +@@ -130,7 +132,6 @@ 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 . +- @cp $(SRC_PATH_BARE)/build/arm-wince-vs8/armasm$(ARM_ARCH).rules . + @echo " [CREATE] $@" + $(SRC_PATH_BARE)/build/make/gen_msvs_proj.sh\ + --exe\ +@@ -175,6 +176,31 @@ LIBVPX_OBJS=$(call objs,$(CODEC_SRCS)) + OBJS-$(BUILD_LIBVPX) += $(LIBVPX_OBJS) + LIBS-$(BUILD_LIBVPX) += $(BUILD_PFX)libvpx.a $(BUILD_PFX)libvpx_g.a + $(BUILD_PFX)libvpx_g.a: $(LIBVPX_OBJS) ++ ++BUILD_LIBVPX_SO := $(if $(BUILD_LIBVPX),$(CONFIG_SHARED)) ++LIBVPX_SO := libvpx.so.$(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_PATCH) ++LIBS-$(BUILD_LIBVPX_SO) += $(BUILD_PFX)$(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 libvpx.so.$(VERSION_MAJOR) \ ++ libvpx.so.$(VERSION_MAJOR).$(VERSION_MINOR)) ++ ++libvpx.ver: $(call enabled,CODEC_EXPORTS) ++ @echo " [CREATE] $@" ++ $(qexec)echo "{ global:" > $@ ++ $(qexec)for f in $?; do awk '{print $$2";"}' < $$f >>$@; done ++ $(qexec)echo "local: *; };" >> $@ ++CLEAN-OBJS += libvpx.ver ++ ++$(addprefix $(DIST_DIR)/,$(LIBVPX_SO_SYMLINKS)): ++ @echo " [LN] $@" ++ $(qexec)ln -sf $(LIBVPX_SO) $@ ++ ++INSTALL-LIBS-$(CONFIG_SHARED) += $(LIBVPX_SO_SYMLINKS) ++INSTALL-LIBS-$(CONFIG_SHARED) += $(LIBSUBDIR)/$(LIBVPX_SO) + endif + + LIBS-$(LIPO_LIBVPX) += libvpx.a +@@ -209,10 +235,10 @@ $(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) + CLEAN-OBJS += $(BUILD_PFX)vpx_version.h + +-CODEC_DOC_SRCS += vpx_codec/vpx_codec.h \ +- vpx_codec/vpx_decoder.h \ +- vpx_codec/vpx_encoder.h \ +- vpx_codec/vpx_image.h ++CODEC_DOC_SRCS += vpx/vpx_codec.h \ ++ vpx/vpx_decoder.h \ ++ vpx/vpx_encoder.h \ ++ vpx/vpx_image.h + + CLEAN-OBJS += libs.doxy + DOCS-yes += libs.doxy +diff --git a/md5_utils.c b/md5_utils.c +index 16c6f7e..455d9cd 100644 +--- a/md5_utils.c ++++ b/md5_utils.c +@@ -1,298 +1,253 @@ + /* +- * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. ++ * This code implements the MD5 message-digest algorithm. ++ * The algorithm is due to Ron Rivest. This code was ++ * written by Colin Plumb in 1993, no copyright is claimed. ++ * This code is in the public domain; do with it what you wish. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * Equivalent code is available from RSA Data Security, Inc. ++ * This code has been tested against that, and is equivalent, ++ * except that you don't need to include two pages of legalese ++ * with every copy. ++ * ++ * To compute the message digest of a chunk of bytes, declare an ++ * MD5Context structure, pass it to MD5Init, call MD5Update as ++ * needed on buffers full of bytes, and then call MD5Final, which ++ * will fill a supplied 16-byte array with the digest. ++ * ++ * Changed so as no longer to depend on Colin Plumb's `usual.h' header ++ * definitions ++ * - Ian Jackson <ian@chiark.greenend.org.uk>. ++ * Still in the public domain. + */ + ++#include <sys/types.h> /* for stupid systems */ + +-/* +-Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All +-rights reserved. +- +-License to copy and use this software is granted provided that it +-is identified as the "RSA Data Security, Inc. MD5 Message-Digest +-Algorithm" in all material mentioning or referencing this software +-or this function. +- +-License is also granted to make and use derivative works provided +-that such works are identified as "derived from the RSA Data +-Security, Inc. MD5 Message-Digest Algorithm" in all material +-mentioning or referencing the derived work. +- +-RSA Data Security, Inc. makes no representations concerning either +-the merchantability of this software or the suitability of this +-software for any particular purpose. It is provided "as is" +-without express or implied warranty of any kind. +- +-These notices must be retained in any copies of any part of this +-documentation and/or software. +-*/ ++#include <string.h> /* for memcpy() */ + + #include "md5_utils.h" +-#include <string.h> + +-/* Constants for md5_transform routine. +- */ +-#define S11 7 +-#define S12 12 +-#define S13 17 +-#define S14 22 +-#define S21 5 +-#define S22 9 +-#define S23 14 +-#define S24 20 +-#define S31 4 +-#define S32 11 +-#define S33 16 +-#define S34 23 +-#define S41 6 +-#define S42 10 +-#define S43 15 +-#define S44 21 +- +-static void md5_transform(uint32_t state[4], const uint8_t block[64]); +-static void Encode(uint8_t *output, const uint32_t *input, unsigned int len); +-static void Decode(uint32_t *output, const uint8_t *input, unsigned int len); +-#define md5_memset memset +-#define md5_memcpy memcpy +- +-static unsigned char PADDING[64] = ++void ++byteSwap(UWORD32 *buf, unsigned words) + { +- 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +-}; ++ md5byte *p; + +-/* F, G, H and I are basic MD5 functions. +- */ +-#define F(x, y, z) (((x) & (y)) | ((~x) & (z))) +-#define G(x, y, z) (((x) & (z)) | ((y) & (~z))) +-#define H(x, y, z) ((x) ^ (y) ^ (z)) +-#define I(x, y, z) ((y) ^ ((x) | (~z))) ++ /* Only swap bytes for big endian machines */ ++ int i = 1; + +-/* ROTATE_LEFT rotates x left n bits. +- */ +-#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) ++ if (*(char *)&i == 1) ++ return; + +-/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. +-Rotation is separate from addition to prevent recomputation. +- */ +-#define FF(a, b, c, d, x, s, ac) { \ +- (a) += F ((b), (c), (d)) + (x) + (uint32_t)(ac); \ +- (a) = ROTATE_LEFT ((a), (s)); \ +- (a) += (b); \ +- } +-#define GG(a, b, c, d, x, s, ac) { \ +- (a) += G ((b), (c), (d)) + (x) + (uint32_t)(ac); \ +- (a) = ROTATE_LEFT ((a), (s)); \ +- (a) += (b); \ +- } +-#define HH(a, b, c, d, x, s, ac) { \ +- (a) += H ((b), (c), (d)) + (x) + (uint32_t)(ac); \ +- (a) = ROTATE_LEFT ((a), (s)); \ +- (a) += (b); \ +- } +-#define II(a, b, c, d, x, s, ac) { \ +- (a) += I ((b), (c), (d)) + (x) + (uint32_t)(ac); \ +- (a) = ROTATE_LEFT ((a), (s)); \ +- (a) += (b); \ ++ p = (md5byte *)buf; ++ ++ do ++ { ++ *buf++ = (UWORD32)((unsigned)p[3] << 8 | p[2]) << 16 | ++ ((unsigned)p[1] << 8 | p[0]); ++ p += 4; + } ++ while (--words); ++} + +-/* MD5 initialization. Begins an MD5 operation, writing a new context. ++/* ++ * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious ++ * initialization constants. + */ +-void md5_init(md5_ctx_t *context) ++void ++MD5Init(struct MD5Context *ctx) + { +- context->count[0] = context->count[1] = 0; +- /* Load magic initialization constants. +- */ +- context->state[0] = 0x67452301; +- context->state[1] = 0xefcdab89; +- context->state[2] = 0x98badcfe; +- context->state[3] = 0x10325476; ++ ctx->buf[0] = 0x67452301; ++ ctx->buf[1] = 0xefcdab89; ++ ctx->buf[2] = 0x98badcfe; ++ ctx->buf[3] = 0x10325476; ++ ++ ctx->bytes[0] = 0; ++ ctx->bytes[1] = 0; + } + +-/* MD5 block update operation. Continues an MD5 message-digest +- operation, processing another message block, and updating the +- context. ++/* ++ * Update context to reflect the concatenation of another buffer full ++ * of bytes. + */ +-void md5_update(md5_ctx_t *context, const uint8_t *input, unsigned int input_len) ++void ++MD5Update(struct MD5Context *ctx, md5byte const *buf, unsigned len) + { +- unsigned int i, index, part_len; ++ UWORD32 t; + +- /* Compute number of bytes mod 64 */ +- index = (unsigned int)((context->count[0] >> 3) & 0x3F); ++ /* Update byte count */ + +- /* Update number of bits */ +- if ((context->count[0] += ((uint32_t)input_len << 3)) +- < ((uint32_t)input_len << 3)) +- context->count[1]++; ++ t = ctx->bytes[0]; + +- context->count[1] += ((uint32_t)input_len >> 29); ++ if ((ctx->bytes[0] = t + len) < t) ++ ctx->bytes[1]++; /* Carry from low to high */ + +- part_len = 64 - index; ++ t = 64 - (t & 0x3f); /* Space available in ctx->in (at least 1) */ + +- /* Transform as many times as possible. */ +- if (input_len >= part_len) ++ if (t > len) + { +- memcpy(&context->buffer[index], input, part_len); +- md5_transform(context->state, context->buffer); ++ memcpy((md5byte *)ctx->in + 64 - t, buf, len); ++ return; ++ } + +- for (i = part_len; i + 63 < input_len; i += 64) +- md5_transform(context->state, &input[i]); ++ /* First chunk is an odd size */ ++ memcpy((md5byte *)ctx->in + 64 - t, buf, t); ++ byteSwap(ctx->in, 16); ++ MD5Transform(ctx->buf, ctx->in); ++ buf += t; ++ len -= t; + +- index = 0; ++ /* Process data in 64-byte chunks */ ++ while (len >= 64) ++ { ++ memcpy(ctx->in, buf, 64); ++ byteSwap(ctx->in, 16); ++ MD5Transform(ctx->buf, ctx->in); ++ buf += 64; ++ len -= 64; + } +- else +- i = 0; + +- /* Buffer remaining input */ +- memcpy(&context->buffer[index], &input[i], input_len - i); ++ /* Handle any remaining bytes of data. */ ++ memcpy(ctx->in, buf, len); + } + +-/* MD5 finalization. Ends an MD5 message-digest operation, writing the +- the message digest and zeroizing the context. ++/* ++ * Final wrapup - pad to 64-byte boundary with the bit pattern ++ * 1 0* (64-bit count of bits processed, MSB-first) + */ +-void md5_finalize(md5_ctx_t *context, uint8_t digest[16]) ++void ++MD5Final(md5byte digest[16], struct MD5Context *ctx) + { +- unsigned char bits[8]; +- unsigned int index, pad_len; +- +- /* Save number of bits */ +- Encode(bits, context->count, 8); +- +- /* Pad out to 56 mod 64. +- */ +- index = (unsigned int)((context->count[0] >> 3) & 0x3f); +- pad_len = (index < 56) ? (56 - index) : (120 - index); +- md5_update(context, PADDING, pad_len); +- +- /* Append length (before padding) */ +- md5_update(context, bits, 8); +- /* Store state in digest */ +- Encode(digest, context->state, 16); +- +- /* Zeroize sensitive information. +- */ +- memset(context, 0, sizeof(*context)); +-} ++ int count = ctx->bytes[0] & 0x3f; /* Number of bytes in ctx->in */ ++ md5byte *p = (md5byte *)ctx->in + count; + +-/* MD5 basic transformation. Transforms state based on block. +- */ +-static void md5_transform(uint32_t state[4], const uint8_t block[64]) +-{ +- uint32_t a = state[0], b = state[1], c = state[2], d = state[3], x[16]; +- +- Decode(x, block, 64); +- +- /* Round 1 */ +- FF(a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */ +- FF(d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */ +- FF(c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */ +- FF(b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */ +- FF(a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */ +- FF(d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */ +- FF(c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */ +- FF(b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */ +- FF(a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */ +- FF(d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */ +- FF(c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ +- FF(b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ +- FF(a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ +- FF(d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ +- FF(c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ +- FF(b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ +- +- /* Round 2 */ +- GG(a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */ +- GG(d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */ +- GG(c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ +- GG(b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */ +- GG(a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */ +- GG(d, a, b, c, x[10], S22, 0x2441453); /* 22 */ +- GG(c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ +- GG(b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */ +- GG(a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */ +- GG(d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ +- GG(c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */ +- GG(b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */ +- GG(a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ +- GG(d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */ +- GG(c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */ +- GG(b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ +- +- /* Round 3 */ +- HH(a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */ +- HH(d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */ +- HH(c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ +- HH(b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ +- HH(a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */ +- HH(d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */ +- HH(c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */ +- HH(b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ +- HH(a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ +- HH(d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */ +- HH(c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */ +- HH(b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */ +- HH(a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */ +- HH(d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ +- HH(c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ +- HH(b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */ +- +- /* Round 4 */ +- II(a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */ +- II(d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */ +- II(c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ +- II(b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */ +- II(a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ +- II(d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */ +- II(c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ +- II(b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */ +- II(a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */ +- II(d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ +- II(c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */ +- II(b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ +- II(a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */ +- II(d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ +- II(c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */ +- II(b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */ +- +- state[0] += a; +- state[1] += b; +- state[2] += c; +- state[3] += d; +- +- /* Zeroize sensitive information. +- */ +- memset(x, 0, sizeof(x)); +-} ++ /* Set the first char of padding to 0x80. There is always room. */ ++ *p++ = 0x80; + +-/* Encodes input (uint32_t) into output (unsigned char). Assumes len is +- a multiple of 4. +- */ +-static void Encode(uint8_t *output, const uint32_t *input, unsigned int len) +-{ +- unsigned int i, j; ++ /* Bytes of padding needed to make 56 bytes (-8..55) */ ++ count = 56 - 1 - count; + +- for (i = 0, j = 0; j < len; i++, j += 4) ++ if (count < 0) /* Padding forces an extra block */ + { +- output[j] = (unsigned char)(input[i] & 0xff); +- output[j+1] = (unsigned char)((input[i] >> 8) & 0xff); +- output[j+2] = (unsigned char)((input[i] >> 16) & 0xff); +- output[j+3] = (unsigned char)((input[i] >> 24) & 0xff); ++ 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); ++ ++ byteSwap(ctx->buf, 4); ++ memcpy(digest, ctx->buf, 16); ++ memset(ctx, 0, sizeof(*ctx)); /* In case it's sensitive */ + } + +-/* Decodes input (unsigned char) into output (uint32_t). Assumes len is +- a multiple of 4. ++#ifndef ASM_MD5 ++ ++/* The four core functions - F1 is optimized somewhat */ ++ ++/* #define F1(x, y, z) (x & y | ~x & z) */ ++#define F1(x, y, z) (z ^ (x & (y ^ z))) ++#define F2(x, y, z) F1(z, x, y) ++#define F3(x, y, z) (x ^ y ^ z) ++#define F4(x, y, z) (y ^ (x | ~z)) ++ ++/* This is the central step in the MD5 algorithm. */ ++#define MD5STEP(f,w,x,y,z,in,s) \ ++ (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 ++ * reflect the addition of 16 longwords of new data. MD5Update blocks ++ * the data and converts bytes into longwords for this routine. + */ +-static void Decode(uint32_t *output, const uint8_t *input, unsigned int len) ++void ++MD5Transform(UWORD32 buf[4], UWORD32 const in[16]) + { +- unsigned int i, j; +- +- for (i = 0, j = 0; j < len; i++, j += 4) +- output[i] = ((uint32_t)input[j]) | (((uint32_t)input[j+1]) << 8) | +- (((uint32_t)input[j+2]) << 16) | (((uint32_t)input[j+3]) << 24); ++ register UWORD32 a, b, c, d; ++ ++ a = buf[0]; ++ b = buf[1]; ++ c = buf[2]; ++ d = buf[3]; ++ ++ MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7); ++ MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12); ++ MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17); ++ MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22); ++ MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7); ++ MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12); ++ MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17); ++ MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22); ++ MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7); ++ MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12); ++ MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); ++ MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); ++ MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); ++ MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); ++ MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); ++ MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); ++ ++ MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5); ++ MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9); ++ MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); ++ MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); ++ MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5); ++ MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); ++ MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); ++ MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); ++ MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5); ++ MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); ++ MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14); ++ MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20); ++ MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); ++ MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); ++ MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14); ++ MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); ++ ++ MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4); ++ MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11); ++ MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); ++ MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); ++ MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4); ++ MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); ++ MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); ++ MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); ++ MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); ++ MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11); ++ MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16); ++ MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23); ++ MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4); ++ MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); ++ MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); ++ MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23); ++ ++ MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6); ++ MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10); ++ MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); ++ MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21); ++ MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); ++ MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); ++ MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); ++ MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21); ++ MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); ++ MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); ++ MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15); ++ MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); ++ MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6); ++ MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); ++ MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); ++ MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21); ++ ++ buf[0] += a; ++ buf[1] += b; ++ buf[2] += c; ++ buf[3] += d; + } ++ ++#endif +diff --git a/md5_utils.h b/md5_utils.h +index 8dda8d1..5ca1b5f 100644 +--- a/md5_utils.h ++++ b/md5_utils.h +@@ -1,51 +1,42 @@ + /* +- * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. ++ * This is the header file for the MD5 message-digest algorithm. ++ * The algorithm is due to Ron Rivest. This code was ++ * written by Colin Plumb in 1993, no copyright is claimed. ++ * This code is in the public domain; do with it what you wish. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * Equivalent code is available from RSA Data Security, Inc. ++ * This code has been tested against that, and is equivalent, ++ * except that you don't need to include two pages of legalese ++ * with every copy. ++ * ++ * To compute the message digest of a chunk of bytes, declare an ++ * MD5Context structure, pass it to MD5Init, call MD5Update as ++ * needed on buffers full of bytes, and then call MD5Final, which ++ * will fill a supplied 16-byte array with the digest. ++ * ++ * Changed so as no longer to depend on Colin Plumb's `usual.h' ++ * header definitions ++ * - Ian Jackson <ian@chiark.greenend.org.uk>. ++ * Still in the public domain. + */ + +-/* +-Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All +-rights reserved. +- +-License to copy and use this software is granted provided that it +-is identified as the "RSA Data Security, Inc. MD5 Message-Digest +-Algorithm" in all material mentioning or referencing this software +-or this function. ++#ifndef MD5_H ++#define MD5_H + +-License is also granted to make and use derivative works provided +-that such works are identified as "derived from the RSA Data +-Security, Inc. MD5 Message-Digest Algorithm" in all material +-mentioning or referencing the derived work. ++#define md5byte unsigned char ++#define UWORD32 unsigned int + +-RSA Data Security, Inc. makes no representations concerning either +-the merchantability of this software or the suitability of this +-software for any particular purpose. It is provided "as is" +-without express or implied warranty of any kind. +- +-These notices must be retained in any copies of any part of this +-documentation and/or software. +-*/ +-#ifndef HAVE_VPX_PORTS +-#define HAVE_VPX_PORTS 0 +-#endif +-#if HAVE_VPX_PORTS +-#include "vpx_ports/vpx_integer.h" +-#else +-#include "vpx_integer.h" +-#endif +- +-/* MD5 context. */ +-typedef struct ++typedef struct MD5Context MD5Context; ++struct MD5Context + { +- uint32_t state[4]; /* state (ABCD) */ +- uint32_t count[2]; /* number of bits, modulo 2^64 (lsb first) */ +- uint8_t buffer[64]; /* input buffer */ +-} md5_ctx_t; ++ UWORD32 buf[4]; ++ UWORD32 bytes[2]; ++ UWORD32 in[16]; ++}; ++ ++void MD5Init(struct MD5Context *context); ++void MD5Update(struct MD5Context *context, md5byte const *buf, unsigned len); ++void MD5Final(unsigned char digest[16], struct MD5Context *context); ++void MD5Transform(UWORD32 buf[4], UWORD32 const in[16]); + +-void md5_init(md5_ctx_t *ctx); +-void md5_update(md5_ctx_t *ctx, const uint8_t *buf, unsigned int len); +-void md5_finalize(md5_ctx_t *ctx, uint8_t md5[16]); ++#endif /* !MD5_H */ +diff --git a/release.sh b/release.sh +index 3b77dad..880ad0f 100755 +--- a/release.sh ++++ b/release.sh +@@ -1,11 +1,12 @@ +-#!/bin/bash ++#!/bin/sh + ## + ## Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ## +-## Use of this source code is governed by a BSD-style license and patent +-## grant that can be found in the LICENSE file in the root of the source +-## tree. All contributing project authors may be found in the AUTHORS +-## file in the root of the source tree. ++## 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. + ## + + +@@ -20,7 +21,7 @@ for opt; do + esac + done + +-TAB=$'\t' ++TAB="$(printf '\t')" + cat > release.mk << EOF + %\$(BUILD_SFX).tar.bz2: %/.done + ${TAB}@echo "\$(subst .tar.bz2,,\$@): tarball" +@@ -185,7 +186,7 @@ for cfg in $CONFIGS; do + esac + opts="$opts --enable-postproc" + +- [ "x${clean}" == "xyes" ] \ ++ [ "x${clean}" = "xyes" ] \ + && rm -rf ${full_cfg}${BUILD_SFX}${TAR_SFX} \ + && rm -rf logs/${full_cfg}${BUILD_SFX}.log.bz2 + +diff --git a/solution.mk b/solution.mk +index 783c6f8..21bf065 100644 +--- a/solution.mk ++++ b/solution.mk +@@ -1,10 +1,11 @@ + ## + ## Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ## +-## Use of this source code is governed by a BSD-style license and patent +-## grant that can be found in the LICENSE file in the root of the source +-## tree. All contributing project authors may be found in the AUTHORS +-## file in the root of the source tree. ++## 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. + ## + + +diff --git a/tools/gen_authors.sh b/tools/gen_authors.sh +new file mode 100755 +index 0000000..e1246f0 +--- /dev/null ++++ b/tools/gen_authors.sh +@@ -0,0 +1,13 @@ ++#!/bin/bash ++ ++# Add organization names manually. ++ ++cat <<EOF ++# This file is automatically generated from the git commit history ++# by tools/gen_authors.sh. ++ ++$(git log --pretty=format:"%aN <%aE>" | sort | uniq) ++Google Inc. ++The Mozilla Foundation ++The Xiph.Org Foundation ++EOF +diff --git a/vp8/common/alloccommon.c b/vp8/common/alloccommon.c +index ac110f7..9f6397e 100644 +--- a/vp8/common/alloccommon.c ++++ b/vp8/common/alloccommon.c +@@ -1,13 +1,15 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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_ports/config.h" + #include "blockd.h" + #include "vpx_mem/vpx_mem.h" + #include "onyxc_int.h" +@@ -16,9 +18,6 @@ + #include "systemdependent.h" + #include "vpxerrors.h" + +-#ifdef HAVE_CONFIG_H +-#include "vpx_config.h" +-#endif + + extern void vp8_init_scan_order_mask(); + +diff --git a/vp8/common/alloccommon.h b/vp8/common/alloccommon.h +index 73c7383..b877412 100644 +--- a/vp8/common/alloccommon.h ++++ b/vp8/common/alloccommon.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/arm/armv6/bilinearfilter_v6.asm b/vp8/common/arm/armv6/bilinearfilter_v6.asm +index 4428cf8..ac0d333 100644 +--- a/vp8/common/arm/armv6/bilinearfilter_v6.asm ++++ b/vp8/common/arm/armv6/bilinearfilter_v6.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/arm/armv6/copymem16x16_v6.asm b/vp8/common/arm/armv6/copymem16x16_v6.asm +index 00e9739..344c453 100644 +--- a/vp8/common/arm/armv6/copymem16x16_v6.asm ++++ b/vp8/common/arm/armv6/copymem16x16_v6.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/arm/armv6/copymem8x4_v6.asm b/vp8/common/arm/armv6/copymem8x4_v6.asm +index 94473ca..3556b3a 100644 +--- a/vp8/common/arm/armv6/copymem8x4_v6.asm ++++ b/vp8/common/arm/armv6/copymem8x4_v6.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/arm/armv6/copymem8x8_v6.asm b/vp8/common/arm/armv6/copymem8x8_v6.asm +index 7cfa533..1da0ff5 100644 +--- a/vp8/common/arm/armv6/copymem8x8_v6.asm ++++ b/vp8/common/arm/armv6/copymem8x8_v6.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/arm/armv6/filter_v6.asm b/vp8/common/arm/armv6/filter_v6.asm +index a7863fc..cdc74ba 100644 +--- a/vp8/common/arm/armv6/filter_v6.asm ++++ b/vp8/common/arm/armv6/filter_v6.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/arm/armv6/idct_v6.asm b/vp8/common/arm/armv6/idct_v6.asm +index 25c5165..9e932fa 100644 +--- a/vp8/common/arm/armv6/idct_v6.asm ++++ b/vp8/common/arm/armv6/idct_v6.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/arm/armv6/iwalsh_v6.asm b/vp8/common/arm/armv6/iwalsh_v6.asm +index 8747568..4606783 100644 +--- a/vp8/common/arm/armv6/iwalsh_v6.asm ++++ b/vp8/common/arm/armv6/iwalsh_v6.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + EXPORT |vp8_short_inv_walsh4x4_armv6| +diff --git a/vp8/common/arm/armv6/loopfilter_v6.asm b/vp8/common/arm/armv6/loopfilter_v6.asm +index c2b02dc..eeeacd3 100644 +--- a/vp8/common/arm/armv6/loopfilter_v6.asm ++++ b/vp8/common/arm/armv6/loopfilter_v6.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/arm/armv6/recon_v6.asm b/vp8/common/arm/armv6/recon_v6.asm +index 085ff80..6f3ccbe 100644 +--- a/vp8/common/arm/armv6/recon_v6.asm ++++ b/vp8/common/arm/armv6/recon_v6.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/arm/armv6/simpleloopfilter_v6.asm b/vp8/common/arm/armv6/simpleloopfilter_v6.asm +index 15c6c7d..b820ced 100644 +--- a/vp8/common/arm/armv6/simpleloopfilter_v6.asm ++++ b/vp8/common/arm/armv6/simpleloopfilter_v6.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/arm/armv6/sixtappredict8x4_v6.asm b/vp8/common/arm/armv6/sixtappredict8x4_v6.asm +index 551d863..6415463 100644 +--- a/vp8/common/arm/armv6/sixtappredict8x4_v6.asm ++++ b/vp8/common/arm/armv6/sixtappredict8x4_v6.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/arm/bilinearfilter_arm.c b/vp8/common/arm/bilinearfilter_arm.c +index bf972a3..b93539c 100644 +--- a/vp8/common/arm/bilinearfilter_arm.c ++++ b/vp8/common/arm/bilinearfilter_arm.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/arm/filter_arm.c b/vp8/common/arm/filter_arm.c +index 2a4640c..233be24 100644 +--- a/vp8/common/arm/filter_arm.c ++++ b/vp8/common/arm/filter_arm.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/arm/idct_arm.h b/vp8/common/arm/idct_arm.h +index f9ed21e..cfd9d76 100644 +--- a/vp8/common/arm/idct_arm.h ++++ b/vp8/common/arm/idct_arm.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/arm/loopfilter_arm.c b/vp8/common/arm/loopfilter_arm.c +index fa7c626..d98c908 100644 +--- a/vp8/common/arm/loopfilter_arm.c ++++ b/vp8/common/arm/loopfilter_arm.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/arm/loopfilter_arm.h b/vp8/common/arm/loopfilter_arm.h +index 4bb4945..b59e2b5 100644 +--- a/vp8/common/arm/loopfilter_arm.h ++++ b/vp8/common/arm/loopfilter_arm.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/arm/neon/bilinearpredict16x16_neon.asm b/vp8/common/arm/neon/bilinearpredict16x16_neon.asm +index a2fea2b..076a3d3 100644 +--- a/vp8/common/arm/neon/bilinearpredict16x16_neon.asm ++++ b/vp8/common/arm/neon/bilinearpredict16x16_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/arm/neon/bilinearpredict4x4_neon.asm b/vp8/common/arm/neon/bilinearpredict4x4_neon.asm +index 74d2db5..f199ba3 100644 +--- a/vp8/common/arm/neon/bilinearpredict4x4_neon.asm ++++ b/vp8/common/arm/neon/bilinearpredict4x4_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/arm/neon/bilinearpredict8x4_neon.asm b/vp8/common/arm/neon/bilinearpredict8x4_neon.asm +index 46ebb0e..9a3a039 100644 +--- a/vp8/common/arm/neon/bilinearpredict8x4_neon.asm ++++ b/vp8/common/arm/neon/bilinearpredict8x4_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/arm/neon/bilinearpredict8x8_neon.asm b/vp8/common/arm/neon/bilinearpredict8x8_neon.asm +index 80728d4..10a6366 100644 +--- a/vp8/common/arm/neon/bilinearpredict8x8_neon.asm ++++ b/vp8/common/arm/neon/bilinearpredict8x8_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/arm/neon/buildintrapredictorsmby_neon.asm b/vp8/common/arm/neon/buildintrapredictorsmby_neon.asm +index f42ac63..7cd9d75 100644 +--- a/vp8/common/arm/neon/buildintrapredictorsmby_neon.asm ++++ b/vp8/common/arm/neon/buildintrapredictorsmby_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/arm/neon/copymem16x16_neon.asm b/vp8/common/arm/neon/copymem16x16_neon.asm +index 89d5e10..b25bfdc 100644 +--- a/vp8/common/arm/neon/copymem16x16_neon.asm ++++ b/vp8/common/arm/neon/copymem16x16_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/arm/neon/copymem8x4_neon.asm b/vp8/common/arm/neon/copymem8x4_neon.asm +index 302f734..0c62ee2 100644 +--- a/vp8/common/arm/neon/copymem8x4_neon.asm ++++ b/vp8/common/arm/neon/copymem8x4_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/arm/neon/copymem8x8_neon.asm b/vp8/common/arm/neon/copymem8x8_neon.asm +index 50d39ef..84e0afd 100644 +--- a/vp8/common/arm/neon/copymem8x8_neon.asm ++++ b/vp8/common/arm/neon/copymem8x8_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/arm/neon/iwalsh_neon.asm b/vp8/common/arm/neon/iwalsh_neon.asm +index 4fc744c..b8199ce 100644 +--- a/vp8/common/arm/neon/iwalsh_neon.asm ++++ b/vp8/common/arm/neon/iwalsh_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + EXPORT |vp8_short_inv_walsh4x4_neon| + EXPORT |vp8_short_inv_walsh4x4_1_neon| +diff --git a/vp8/common/arm/neon/loopfilterhorizontaledge_uv_neon.asm b/vp8/common/arm/neon/loopfilterhorizontaledge_uv_neon.asm +index e3e8e8a..5d25e3d 100644 +--- a/vp8/common/arm/neon/loopfilterhorizontaledge_uv_neon.asm ++++ b/vp8/common/arm/neon/loopfilterhorizontaledge_uv_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/arm/neon/loopfilterhorizontaledge_y_neon.asm b/vp8/common/arm/neon/loopfilterhorizontaledge_y_neon.asm +index f11055d..ebe52fc 100644 +--- a/vp8/common/arm/neon/loopfilterhorizontaledge_y_neon.asm ++++ b/vp8/common/arm/neon/loopfilterhorizontaledge_y_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/arm/neon/loopfiltersimplehorizontaledge_neon.asm b/vp8/common/arm/neon/loopfiltersimplehorizontaledge_neon.asm +index 6d74fab..dbbdd74 100644 +--- a/vp8/common/arm/neon/loopfiltersimplehorizontaledge_neon.asm ++++ b/vp8/common/arm/neon/loopfiltersimplehorizontaledge_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/arm/neon/loopfiltersimpleverticaledge_neon.asm b/vp8/common/arm/neon/loopfiltersimpleverticaledge_neon.asm +index 2bb6222..480e318 100644 +--- a/vp8/common/arm/neon/loopfiltersimpleverticaledge_neon.asm ++++ b/vp8/common/arm/neon/loopfiltersimpleverticaledge_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/arm/neon/loopfilterverticaledge_uv_neon.asm b/vp8/common/arm/neon/loopfilterverticaledge_uv_neon.asm +index d79cc68..a402282 100644 +--- a/vp8/common/arm/neon/loopfilterverticaledge_uv_neon.asm ++++ b/vp8/common/arm/neon/loopfilterverticaledge_uv_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/arm/neon/loopfilterverticaledge_y_neon.asm b/vp8/common/arm/neon/loopfilterverticaledge_y_neon.asm +index 3a230a9..18eba9f 100644 +--- a/vp8/common/arm/neon/loopfilterverticaledge_y_neon.asm ++++ b/vp8/common/arm/neon/loopfilterverticaledge_y_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/arm/neon/mbloopfilterhorizontaledge_uv_neon.asm b/vp8/common/arm/neon/mbloopfilterhorizontaledge_uv_neon.asm +index 86eddaa..21b85da 100644 +--- a/vp8/common/arm/neon/mbloopfilterhorizontaledge_uv_neon.asm ++++ b/vp8/common/arm/neon/mbloopfilterhorizontaledge_uv_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/arm/neon/mbloopfilterhorizontaledge_y_neon.asm b/vp8/common/arm/neon/mbloopfilterhorizontaledge_y_neon.asm +index 2ab0fc2..64d98c6 100644 +--- a/vp8/common/arm/neon/mbloopfilterhorizontaledge_y_neon.asm ++++ b/vp8/common/arm/neon/mbloopfilterhorizontaledge_y_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/arm/neon/mbloopfilterverticaledge_uv_neon.asm b/vp8/common/arm/neon/mbloopfilterverticaledge_uv_neon.asm +index ad5afba..0e72e80 100644 +--- a/vp8/common/arm/neon/mbloopfilterverticaledge_uv_neon.asm ++++ b/vp8/common/arm/neon/mbloopfilterverticaledge_uv_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/arm/neon/mbloopfilterverticaledge_y_neon.asm b/vp8/common/arm/neon/mbloopfilterverticaledge_y_neon.asm +index 60e5175..91396a1 100644 +--- a/vp8/common/arm/neon/mbloopfilterverticaledge_y_neon.asm ++++ b/vp8/common/arm/neon/mbloopfilterverticaledge_y_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/arm/neon/recon16x16mb_neon.asm b/vp8/common/arm/neon/recon16x16mb_neon.asm +index b9ba1cb..7c06c03 100644 +--- a/vp8/common/arm/neon/recon16x16mb_neon.asm ++++ b/vp8/common/arm/neon/recon16x16mb_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/arm/neon/recon2b_neon.asm b/vp8/common/arm/neon/recon2b_neon.asm +index 25aaf8c..3d87e2d 100644 +--- a/vp8/common/arm/neon/recon2b_neon.asm ++++ b/vp8/common/arm/neon/recon2b_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/arm/neon/recon4b_neon.asm b/vp8/common/arm/neon/recon4b_neon.asm +index a4f5b80..63cd987 100644 +--- a/vp8/common/arm/neon/recon4b_neon.asm ++++ b/vp8/common/arm/neon/recon4b_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/arm/neon/reconb_neon.asm b/vp8/common/arm/neon/reconb_neon.asm +index 16d85a0..0ecdc14 100644 +--- a/vp8/common/arm/neon/reconb_neon.asm ++++ b/vp8/common/arm/neon/reconb_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/arm/neon/save_neon_reg.asm b/vp8/common/arm/neon/save_neon_reg.asm +index 4873e44..f5db2a8 100644 +--- a/vp8/common/arm/neon/save_neon_reg.asm ++++ b/vp8/common/arm/neon/save_neon_reg.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/arm/neon/shortidct4x4llm_1_neon.asm b/vp8/common/arm/neon/shortidct4x4llm_1_neon.asm +index 7d06ff9..24e5fed 100644 +--- a/vp8/common/arm/neon/shortidct4x4llm_1_neon.asm ++++ b/vp8/common/arm/neon/shortidct4x4llm_1_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/arm/neon/shortidct4x4llm_neon.asm b/vp8/common/arm/neon/shortidct4x4llm_neon.asm +index ffecfbf..c566c67 100644 +--- a/vp8/common/arm/neon/shortidct4x4llm_neon.asm ++++ b/vp8/common/arm/neon/shortidct4x4llm_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/arm/neon/sixtappredict16x16_neon.asm b/vp8/common/arm/neon/sixtappredict16x16_neon.asm +index 9f5f0d2..6f3716d 100644 +--- a/vp8/common/arm/neon/sixtappredict16x16_neon.asm ++++ b/vp8/common/arm/neon/sixtappredict16x16_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/arm/neon/sixtappredict4x4_neon.asm b/vp8/common/arm/neon/sixtappredict4x4_neon.asm +index c23a9db..6fe9ead 100644 +--- a/vp8/common/arm/neon/sixtappredict4x4_neon.asm ++++ b/vp8/common/arm/neon/sixtappredict4x4_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/arm/neon/sixtappredict8x4_neon.asm b/vp8/common/arm/neon/sixtappredict8x4_neon.asm +index 18e19f9..a6ff4f7 100644 +--- a/vp8/common/arm/neon/sixtappredict8x4_neon.asm ++++ b/vp8/common/arm/neon/sixtappredict8x4_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/arm/neon/sixtappredict8x8_neon.asm b/vp8/common/arm/neon/sixtappredict8x8_neon.asm +index d27485e..bb35ae4 100644 +--- a/vp8/common/arm/neon/sixtappredict8x8_neon.asm ++++ b/vp8/common/arm/neon/sixtappredict8x8_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/arm/recon_arm.c b/vp8/common/arm/recon_arm.c +index 130059e..2cc9ee7 100644 +--- a/vp8/common/arm/recon_arm.c ++++ b/vp8/common/arm/recon_arm.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/arm/recon_arm.h b/vp8/common/arm/recon_arm.h +index fd9f85e..392297b 100644 +--- a/vp8/common/arm/recon_arm.h ++++ b/vp8/common/arm/recon_arm.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/arm/reconintra4x4_arm.c b/vp8/common/arm/reconintra4x4_arm.c +index 334d352..65fb1f0 100644 +--- a/vp8/common/arm/reconintra4x4_arm.c ++++ b/vp8/common/arm/reconintra4x4_arm.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/arm/reconintra_arm.c b/vp8/common/arm/reconintra_arm.c +index d7ee1dd..29f4a2c 100644 +--- a/vp8/common/arm/reconintra_arm.c ++++ b/vp8/common/arm/reconintra_arm.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/arm/subpixel_arm.h b/vp8/common/arm/subpixel_arm.h +index 56aec55..0eb2c58 100644 +--- a/vp8/common/arm/subpixel_arm.h ++++ b/vp8/common/arm/subpixel_arm.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/arm/systemdependent.c b/vp8/common/arm/systemdependent.c +index ecc6929..27d3dee 100644 +--- a/vp8/common/arm/systemdependent.c ++++ b/vp8/common/arm/systemdependent.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/arm/vpx_asm_offsets.c b/vp8/common/arm/vpx_asm_offsets.c +index 68634bf..ff4d752 100644 +--- a/vp8/common/arm/vpx_asm_offsets.c ++++ b/vp8/common/arm/vpx_asm_offsets.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/bigend.h b/vp8/common/bigend.h +index 6a91ba1..cd6b988 100644 +--- a/vp8/common/bigend.h ++++ b/vp8/common/bigend.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/blockd.c b/vp8/common/blockd.c +index 53f5e72..e0ed561 100644 +--- a/vp8/common/blockd.c ++++ b/vp8/common/blockd.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/blockd.h b/vp8/common/blockd.h +index 84ed53a..2b25f62 100644 +--- a/vp8/common/blockd.h ++++ b/vp8/common/blockd.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +@@ -173,9 +174,8 @@ typedef struct + int dc_diff; + unsigned char segment_id; // Which set of segmentation parameters should be used for this MB + int force_no_skip; +- ++ int need_to_clamp_mvs; + B_MODE_INFO partition_bmi[16]; +- + } MB_MODE_INFO; + + +diff --git a/vp8/common/boolcoder.h b/vp8/common/boolcoder.h +index 0659d48..66f67c2 100644 +--- a/vp8/common/boolcoder.h ++++ b/vp8/common/boolcoder.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/codec_common_interface.h b/vp8/common/codec_common_interface.h +index 7881b0a..d836564 100644 +--- a/vp8/common/codec_common_interface.h ++++ b/vp8/common/codec_common_interface.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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 CODEC_COMMON_INTERFACE_H +diff --git a/vp8/common/coefupdateprobs.h b/vp8/common/coefupdateprobs.h +index 99affd6..6131d12 100644 +--- a/vp8/common/coefupdateprobs.h ++++ b/vp8/common/coefupdateprobs.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/common.h b/vp8/common/common.h +index 29f6d37..bfa8a9c 100644 +--- a/vp8/common/common.h ++++ b/vp8/common/common.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/common_types.h b/vp8/common/common_types.h +index deb5ed8..a307ed6 100644 +--- a/vp8/common/common_types.h ++++ b/vp8/common/common_types.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/context.c b/vp8/common/context.c +index 17ee8c3..f0cb838 100644 +--- a/vp8/common/context.c ++++ b/vp8/common/context.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/debugmodes.c b/vp8/common/debugmodes.c +index e2d2d2c..e669814 100644 +--- a/vp8/common/debugmodes.c ++++ b/vp8/common/debugmodes.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/defaultcoefcounts.h b/vp8/common/defaultcoefcounts.h +index ccdf326..f9247d2 100644 +--- a/vp8/common/defaultcoefcounts.h ++++ b/vp8/common/defaultcoefcounts.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/dma_desc.h b/vp8/common/dma_desc.h +index 5e6fa0c..765405d 100644 +--- a/vp8/common/dma_desc.h ++++ b/vp8/common/dma_desc.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/duck_io.h b/vp8/common/duck_io.h +index f63a5cd..02f6895 100644 +--- a/vp8/common/duck_io.h ++++ b/vp8/common/duck_io.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/entropy.c b/vp8/common/entropy.c +index e524c2a..8d01bf8 100644 +--- a/vp8/common/entropy.c ++++ b/vp8/common/entropy.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/entropy.h b/vp8/common/entropy.h +index 1415832..29be82c 100644 +--- a/vp8/common/entropy.h ++++ b/vp8/common/entropy.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/entropymode.c b/vp8/common/entropymode.c +index 7dc1acd..72cbd64 100644 +--- a/vp8/common/entropymode.c ++++ b/vp8/common/entropymode.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/entropymode.h b/vp8/common/entropymode.h +index ff630a4..bd44b83 100644 +--- a/vp8/common/entropymode.h ++++ b/vp8/common/entropymode.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/entropymv.c b/vp8/common/entropymv.c +index 2b00c17..176fecd 100644 +--- a/vp8/common/entropymv.c ++++ b/vp8/common/entropymv.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/entropymv.h b/vp8/common/entropymv.h +index d940c59..395984c 100644 +--- a/vp8/common/entropymv.h ++++ b/vp8/common/entropymv.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/extend.c b/vp8/common/extend.c +index 7407952..43d7aed 100644 +--- a/vp8/common/extend.c ++++ b/vp8/common/extend.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/extend.h b/vp8/common/extend.h +index 6809ae7..bb8a016 100644 +--- a/vp8/common/extend.h ++++ b/vp8/common/extend.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/filter_c.c b/vp8/common/filter_c.c +index 38991cb..f24f8a2 100644 +--- a/vp8/common/filter_c.c ++++ b/vp8/common/filter_c.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/findnearmv.c b/vp8/common/findnearmv.c +index fcb1f20..550681e 100644 +--- a/vp8/common/findnearmv.c ++++ b/vp8/common/findnearmv.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/findnearmv.h b/vp8/common/findnearmv.h +index 2c02033..3e0718a 100644 +--- a/vp8/common/findnearmv.h ++++ b/vp8/common/findnearmv.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/fourcc.hpp b/vp8/common/fourcc.hpp +index 5f1faed..9823b56 100644 +--- a/vp8/common/fourcc.hpp ++++ b/vp8/common/fourcc.hpp +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/g_common.h b/vp8/common/g_common.h +index e68c53e..3f43401 100644 +--- a/vp8/common/g_common.h ++++ b/vp8/common/g_common.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/generic/systemdependent.c b/vp8/common/generic/systemdependent.c +index 0011ae0..6e64885 100644 +--- a/vp8/common/generic/systemdependent.c ++++ b/vp8/common/generic/systemdependent.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/header.h b/vp8/common/header.h +index 8b2b009..b8b9059 100644 +--- a/vp8/common/header.h ++++ b/vp8/common/header.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/idct.h b/vp8/common/idct.h +index 47b5f05..2185bd3 100644 +--- a/vp8/common/idct.h ++++ b/vp8/common/idct.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/idctllm.c b/vp8/common/idctllm.c +index 57cf858..4261d24 100644 +--- a/vp8/common/idctllm.c ++++ b/vp8/common/idctllm.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/invtrans.c b/vp8/common/invtrans.c +index 1ff596e..00502c6 100644 +--- a/vp8/common/invtrans.c ++++ b/vp8/common/invtrans.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/invtrans.h b/vp8/common/invtrans.h +index 93a40f9..be30ca0 100644 +--- a/vp8/common/invtrans.h ++++ b/vp8/common/invtrans.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/littlend.h b/vp8/common/littlend.h +index 08c525c..0961163 100644 +--- a/vp8/common/littlend.h ++++ b/vp8/common/littlend.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/loopfilter.c b/vp8/common/loopfilter.c +index 79e6177..4937195 100644 +--- a/vp8/common/loopfilter.c ++++ b/vp8/common/loopfilter.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/loopfilter.h b/vp8/common/loopfilter.h +index c6ce508..a9a976e 100644 +--- a/vp8/common/loopfilter.h ++++ b/vp8/common/loopfilter.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/loopfilter_filters.c b/vp8/common/loopfilter_filters.c +index 7d16e48..eaf7327 100644 +--- a/vp8/common/loopfilter_filters.c ++++ b/vp8/common/loopfilter_filters.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/mac_specs.h b/vp8/common/mac_specs.h +index 97bffc7..a12b8d5 100644 +--- a/vp8/common/mac_specs.h ++++ b/vp8/common/mac_specs.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/mbpitch.c b/vp8/common/mbpitch.c +index a7e0ce9..b183b8e 100644 +--- a/vp8/common/mbpitch.c ++++ b/vp8/common/mbpitch.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/modecont.c b/vp8/common/modecont.c +index 9301a25..c008eef 100644 +--- a/vp8/common/modecont.c ++++ b/vp8/common/modecont.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/modecont.h b/vp8/common/modecont.h +index 0c57651..4b79722 100644 +--- a/vp8/common/modecont.h ++++ b/vp8/common/modecont.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/modecontext.c b/vp8/common/modecontext.c +index ceee74c..a4b2f76 100644 +--- a/vp8/common/modecontext.c ++++ b/vp8/common/modecontext.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/mv.h b/vp8/common/mv.h +index 3d84181..c3db5f0 100644 +--- a/vp8/common/mv.h ++++ b/vp8/common/mv.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/onyx.h b/vp8/common/onyx.h +index b66c400..3ed6f2d 100644 +--- a/vp8/common/onyx.h ++++ b/vp8/common/onyx.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +@@ -16,7 +17,7 @@ extern "C" + { + #endif + +-#include "vpx_codec/internal/vpx_codec_internal.h" ++#include "vpx/internal/vpx_codec_internal.h" + #include "vpx_scale/yv12config.h" + #include "type_aliases.h" + #include "ppflags.h" +diff --git a/vp8/common/onyxc_int.h b/vp8/common/onyxc_int.h +index a40ffb9..d1cb766 100644 +--- a/vp8/common/onyxc_int.h ++++ b/vp8/common/onyxc_int.h +@@ -1,18 +1,19 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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 __INC_VP8C_INT_H + #define __INC_VP8C_INT_H + +-#include "vpx_ports/config.h" +-#include "vpx_codec/internal/vpx_codec_internal.h" ++#include "vpx_config.h" ++#include "vpx/internal/vpx_codec_internal.h" + #include "loopfilter.h" + #include "entropymv.h" + #include "entropy.h" +diff --git a/vp8/common/onyxd.h b/vp8/common/onyxd.h +index 644c0ec..ea04c14 100644 +--- a/vp8/common/onyxd.h ++++ b/vp8/common/onyxd.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/partialgfupdate.h b/vp8/common/partialgfupdate.h +index 32a55ee..355aa79 100644 +--- a/vp8/common/partialgfupdate.h ++++ b/vp8/common/partialgfupdate.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/postproc.c b/vp8/common/postproc.c +index f019925..1f36d4e 100644 +--- a/vp8/common/postproc.c ++++ b/vp8/common/postproc.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +@@ -274,7 +275,7 @@ static void vp8_deblock_and_de_macro_block(YV12_BUFFER_CONFIG *source, + + } + +-extern void vp8_deblock(YV12_BUFFER_CONFIG *source, ++void vp8_deblock(YV12_BUFFER_CONFIG *source, + YV12_BUFFER_CONFIG *post, + int q, + int low_var_thresh, +diff --git a/vp8/common/postproc.h b/vp8/common/postproc.h +index c45fe92..e148f2a 100644 +--- a/vp8/common/postproc.h ++++ b/vp8/common/postproc.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +@@ -87,4 +88,11 @@ void vp8_de_noise(YV12_BUFFER_CONFIG *source, + int low_var_thresh, + int flag, + vp8_postproc_rtcd_vtable_t *rtcd); ++ ++void vp8_deblock(YV12_BUFFER_CONFIG *source, ++ YV12_BUFFER_CONFIG *post, ++ int q, ++ int low_var_thresh, ++ int flag, ++ vp8_postproc_rtcd_vtable_t *rtcd); + #endif +diff --git a/vp8/common/ppc/copy_altivec.asm b/vp8/common/ppc/copy_altivec.asm +index e87eb21..5ca2d17 100644 +--- a/vp8/common/ppc/copy_altivec.asm ++++ b/vp8/common/ppc/copy_altivec.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/ppc/filter_altivec.asm b/vp8/common/ppc/filter_altivec.asm +index 2a35507..1a7ebf7 100644 +--- a/vp8/common/ppc/filter_altivec.asm ++++ b/vp8/common/ppc/filter_altivec.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/ppc/filter_bilinear_altivec.asm b/vp8/common/ppc/filter_bilinear_altivec.asm +index 27e02a8..73e758e 100644 +--- a/vp8/common/ppc/filter_bilinear_altivec.asm ++++ b/vp8/common/ppc/filter_bilinear_altivec.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/ppc/idctllm_altivec.asm b/vp8/common/ppc/idctllm_altivec.asm +index e88af8d..9ebe6af 100644 +--- a/vp8/common/ppc/idctllm_altivec.asm ++++ b/vp8/common/ppc/idctllm_altivec.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/ppc/loopfilter_altivec.c b/vp8/common/ppc/loopfilter_altivec.c +index 586eed4..8bf5e57 100644 +--- a/vp8/common/ppc/loopfilter_altivec.c ++++ b/vp8/common/ppc/loopfilter_altivec.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/ppc/loopfilter_filters_altivec.asm b/vp8/common/ppc/loopfilter_filters_altivec.asm +index 78a5cf9..26c51a6 100644 +--- a/vp8/common/ppc/loopfilter_filters_altivec.asm ++++ b/vp8/common/ppc/loopfilter_filters_altivec.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/ppc/platform_altivec.asm b/vp8/common/ppc/platform_altivec.asm +index 227ef2a..23680c9 100644 +--- a/vp8/common/ppc/platform_altivec.asm ++++ b/vp8/common/ppc/platform_altivec.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/ppc/recon_altivec.asm b/vp8/common/ppc/recon_altivec.asm +index f478b95..212664d 100644 +--- a/vp8/common/ppc/recon_altivec.asm ++++ b/vp8/common/ppc/recon_altivec.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/ppc/systemdependent.c b/vp8/common/ppc/systemdependent.c +index 2847310..4ccf690 100644 +--- a/vp8/common/ppc/systemdependent.c ++++ b/vp8/common/ppc/systemdependent.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/ppflags.h b/vp8/common/ppflags.h +index c663976..57aeb1d 100644 +--- a/vp8/common/ppflags.h ++++ b/vp8/common/ppflags.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/pragmas.h b/vp8/common/pragmas.h +index 25a4b77..523c8b7 100644 +--- a/vp8/common/pragmas.h ++++ b/vp8/common/pragmas.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/predictdc.c b/vp8/common/predictdc.c +index df4c96e..18d7da8 100644 +--- a/vp8/common/predictdc.c ++++ b/vp8/common/predictdc.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/predictdc.h b/vp8/common/predictdc.h +index b8871e4..69036ee 100644 +--- a/vp8/common/predictdc.h ++++ b/vp8/common/predictdc.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/preproc.h b/vp8/common/preproc.h +index 00ec9a8..a02745c 100644 +--- a/vp8/common/preproc.h ++++ b/vp8/common/preproc.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/preprocif.h b/vp8/common/preprocif.h +index 986c45b..f700f76 100644 +--- a/vp8/common/preprocif.h ++++ b/vp8/common/preprocif.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/proposed.h b/vp8/common/proposed.h +index 1171ede..65b7834 100644 +--- a/vp8/common/proposed.h ++++ b/vp8/common/proposed.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/quant_common.c b/vp8/common/quant_common.c +index 09fe31f..6fd3bc0 100644 +--- a/vp8/common/quant_common.c ++++ b/vp8/common/quant_common.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/quant_common.h b/vp8/common/quant_common.h +index 0c92ce8..49d11bc 100644 +--- a/vp8/common/quant_common.h ++++ b/vp8/common/quant_common.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/recon.c b/vp8/common/recon.c +index d1268ea..b09ef37 100644 +--- a/vp8/common/recon.c ++++ b/vp8/common/recon.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/recon.h b/vp8/common/recon.h +index f65a90f..607895c 100644 +--- a/vp8/common/recon.h ++++ b/vp8/common/recon.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/reconinter.c b/vp8/common/reconinter.c +index c48886d..91ec76b 100644 +--- a/vp8/common/reconinter.c ++++ b/vp8/common/reconinter.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/reconinter.h b/vp8/common/reconinter.h +index b2d1ae9..9df4806 100644 +--- a/vp8/common/reconinter.h ++++ b/vp8/common/reconinter.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/reconintra.c b/vp8/common/reconintra.c +index e33bce3..23d87ee 100644 +--- a/vp8/common/reconintra.c ++++ b/vp8/common/reconintra.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/reconintra.h b/vp8/common/reconintra.h +index d63aa15..b7c4d1d 100644 +--- a/vp8/common/reconintra.h ++++ b/vp8/common/reconintra.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/reconintra4x4.c b/vp8/common/reconintra4x4.c +index d92d5c9..3b22423 100644 +--- a/vp8/common/reconintra4x4.c ++++ b/vp8/common/reconintra4x4.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/reconintra4x4.h b/vp8/common/reconintra4x4.h +index 788c8c4..881d091 100644 +--- a/vp8/common/reconintra4x4.h ++++ b/vp8/common/reconintra4x4.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/segmentation_common.c b/vp8/common/segmentation_common.c +index 72b8c87..2568c7c 100644 +--- a/vp8/common/segmentation_common.c ++++ b/vp8/common/segmentation_common.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/segmentation_common.h b/vp8/common/segmentation_common.h +index bb93533..7b36b49 100644 +--- a/vp8/common/segmentation_common.h ++++ b/vp8/common/segmentation_common.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/setupintrarecon.c b/vp8/common/setupintrarecon.c +index dcaafe6..e796d42 100644 +--- a/vp8/common/setupintrarecon.c ++++ b/vp8/common/setupintrarecon.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +@@ -16,21 +17,15 @@ void vp8_setup_intra_recon(YV12_BUFFER_CONFIG *ybf) + int i; + + // set up frame new frame for intra coded blocks +- vpx_memset(ybf->y_buffer - 1 - 2 * ybf->y_stride, 127, ybf->y_width + 5); + vpx_memset(ybf->y_buffer - 1 - ybf->y_stride, 127, ybf->y_width + 5); +- + for (i = 0; i < ybf->y_height; i++) + ybf->y_buffer[ybf->y_stride *i - 1] = (unsigned char) 129; + +- vpx_memset(ybf->u_buffer - 1 - 2 * ybf->uv_stride, 127, ybf->uv_width + 5); + vpx_memset(ybf->u_buffer - 1 - ybf->uv_stride, 127, ybf->uv_width + 5); +- + for (i = 0; i < ybf->uv_height; i++) + ybf->u_buffer[ybf->uv_stride *i - 1] = (unsigned char) 129; + +- vpx_memset(ybf->v_buffer - 1 - 2 * ybf->uv_stride, 127, ybf->uv_width + 5); + vpx_memset(ybf->v_buffer - 1 - ybf->uv_stride, 127, ybf->uv_width + 5); +- + for (i = 0; i < ybf->uv_height; i++) + ybf->v_buffer[ybf->uv_stride *i - 1] = (unsigned char) 129; + +diff --git a/vp8/common/setupintrarecon.h b/vp8/common/setupintrarecon.h +index 6ec79b2..ea4e342 100644 +--- a/vp8/common/setupintrarecon.h ++++ b/vp8/common/setupintrarecon.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/subpixel.h b/vp8/common/subpixel.h +index fbd5f4d..446697c 100644 +--- a/vp8/common/subpixel.h ++++ b/vp8/common/subpixel.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/swapyv12buffer.c b/vp8/common/swapyv12buffer.c +index afe6a88..5bdf431 100644 +--- a/vp8/common/swapyv12buffer.c ++++ b/vp8/common/swapyv12buffer.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/swapyv12buffer.h b/vp8/common/swapyv12buffer.h +index caf9499..f2c3b74 100644 +--- a/vp8/common/swapyv12buffer.h ++++ b/vp8/common/swapyv12buffer.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/systemdependent.h b/vp8/common/systemdependent.h +index 1829b64..56218e6 100644 +--- a/vp8/common/systemdependent.h ++++ b/vp8/common/systemdependent.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/textblit.c b/vp8/common/textblit.c +index a45937b..5d117f1 100644 +--- a/vp8/common/textblit.c ++++ b/vp8/common/textblit.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/threading.h b/vp8/common/threading.h +index a02cb24..7c94645 100644 +--- a/vp8/common/threading.h ++++ b/vp8/common/threading.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/treecoder.c b/vp8/common/treecoder.c +index 4ad018d..0ccd64d 100644 +--- a/vp8/common/treecoder.c ++++ b/vp8/common/treecoder.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/treecoder.h b/vp8/common/treecoder.h +index 0356d2b..908dbcb 100644 +--- a/vp8/common/treecoder.h ++++ b/vp8/common/treecoder.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/type_aliases.h b/vp8/common/type_aliases.h +index addd264..a0d8717 100644 +--- a/vp8/common/type_aliases.h ++++ b/vp8/common/type_aliases.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/vfwsetting.hpp b/vp8/common/vfwsetting.hpp +index e352e7a..c01a0dd 100644 +--- a/vp8/common/vfwsetting.hpp ++++ b/vp8/common/vfwsetting.hpp +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/vpx_ref_build_prefix.h b/vp8/common/vpx_ref_build_prefix.h +index 40608c6..cded66c 100644 +--- a/vp8/common/vpx_ref_build_prefix.h ++++ b/vp8/common/vpx_ref_build_prefix.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/vpxblit.h b/vp8/common/vpxblit.h +index d03e0bd..2c7f673 100644 +--- a/vp8/common/vpxblit.h ++++ b/vp8/common/vpxblit.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/vpxblit_c64.h b/vp8/common/vpxblit_c64.h +index a8e28f5..7659b5c 100644 +--- a/vp8/common/vpxblit_c64.h ++++ b/vp8/common/vpxblit_c64.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/vpxerrors.h b/vp8/common/vpxerrors.h +index e4c9f3e..f0ec707 100644 +--- a/vp8/common/vpxerrors.h ++++ b/vp8/common/vpxerrors.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/x86/boolcoder.cxx b/vp8/common/x86/boolcoder.cxx +index 06faca6..cd9c495 100644 +--- a/vp8/common/x86/boolcoder.cxx ++++ b/vp8/common/x86/boolcoder.cxx +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/x86/idct_x86.h b/vp8/common/x86/idct_x86.h +index 5dfb212..1f2cb63 100644 +--- a/vp8/common/x86/idct_x86.h ++++ b/vp8/common/x86/idct_x86.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/x86/idctllm_mmx.asm b/vp8/common/x86/idctllm_mmx.asm +index 2751c69..5ec01e9 100644 +--- a/vp8/common/x86/idctllm_mmx.asm ++++ b/vp8/common/x86/idctllm_mmx.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/x86/iwalsh_mmx.asm b/vp8/common/x86/iwalsh_mmx.asm +index 562e590..6cb8979 100644 +--- a/vp8/common/x86/iwalsh_mmx.asm ++++ b/vp8/common/x86/iwalsh_mmx.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/x86/iwalsh_sse2.asm b/vp8/common/x86/iwalsh_sse2.asm +index 96943df..bb0d1d7 100644 +--- a/vp8/common/x86/iwalsh_sse2.asm ++++ b/vp8/common/x86/iwalsh_sse2.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +@@ -16,6 +17,7 @@ sym(vp8_short_inv_walsh4x4_sse2): + push rbp + mov rbp, rsp + SHADOW_ARGS_TO_STACK 2 ++ SAVE_XMM + push rsi + push rdi + ; end prolog +@@ -100,6 +102,7 @@ sym(vp8_short_inv_walsh4x4_sse2): + ; begin epilog + pop rdi + pop rsi ++ RESTORE_XMM + UNSHADOW_ARGS + pop rbp + ret +diff --git a/vp8/common/x86/loopfilter_mmx.asm b/vp8/common/x86/loopfilter_mmx.asm +index 6e4d2b6..6e6efab 100644 +--- a/vp8/common/x86/loopfilter_mmx.asm ++++ b/vp8/common/x86/loopfilter_mmx.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/x86/loopfilter_sse2.asm b/vp8/common/x86/loopfilter_sse2.asm +index 5275dfa..d160dd6 100644 +--- a/vp8/common/x86/loopfilter_sse2.asm ++++ b/vp8/common/x86/loopfilter_sse2.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +@@ -25,6 +26,7 @@ sym(vp8_loop_filter_horizontal_edge_sse2): + push rbp + mov rbp, rsp + SHADOW_ARGS_TO_STACK 6 ++ SAVE_XMM + GET_GOT rbx + push rsi + push rdi +@@ -211,6 +213,7 @@ sym(vp8_loop_filter_horizontal_edge_sse2): + pop rdi + pop rsi + RESTORE_GOT ++ RESTORE_XMM + UNSHADOW_ARGS + pop rbp + ret +@@ -230,6 +233,7 @@ sym(vp8_loop_filter_vertical_edge_sse2): + push rbp + mov rbp, rsp + SHADOW_ARGS_TO_STACK 6 ++ SAVE_XMM + GET_GOT rbx + push rsi + push rdi +@@ -651,6 +655,7 @@ sym(vp8_loop_filter_vertical_edge_sse2): + pop rdi + pop rsi + RESTORE_GOT ++ RESTORE_XMM + UNSHADOW_ARGS + pop rbp + ret +@@ -670,6 +675,7 @@ sym(vp8_mbloop_filter_horizontal_edge_sse2): + push rbp + mov rbp, rsp + SHADOW_ARGS_TO_STACK 6 ++ SAVE_XMM + GET_GOT rbx + push rsi + push rdi +@@ -1001,6 +1007,7 @@ sym(vp8_mbloop_filter_horizontal_edge_sse2): + pop rdi + pop rsi + RESTORE_GOT ++ RESTORE_XMM + UNSHADOW_ARGS + pop rbp + ret +@@ -1020,6 +1027,7 @@ sym(vp8_mbloop_filter_vertical_edge_sse2): + push rbp + mov rbp, rsp + SHADOW_ARGS_TO_STACK 6 ++ SAVE_XMM + GET_GOT rbx + push rsi + push rdi +@@ -1563,6 +1571,7 @@ sym(vp8_mbloop_filter_vertical_edge_sse2): + pop rdi + pop rsi + RESTORE_GOT ++ RESTORE_XMM + UNSHADOW_ARGS + pop rbp + ret +@@ -1582,6 +1591,7 @@ sym(vp8_loop_filter_simple_horizontal_edge_sse2): + push rbp + mov rbp, rsp + SHADOW_ARGS_TO_STACK 6 ++ SAVE_XMM + GET_GOT rbx + push rsi + push rdi +@@ -1678,6 +1688,7 @@ sym(vp8_loop_filter_simple_horizontal_edge_sse2): + pop rdi + pop rsi + RESTORE_GOT ++ RESTORE_XMM + UNSHADOW_ARGS + pop rbp + ret +@@ -1697,6 +1708,7 @@ sym(vp8_loop_filter_simple_vertical_edge_sse2): + push rbp ; save old base pointer value. + mov rbp, rsp ; set new base pointer value. + SHADOW_ARGS_TO_STACK 6 ++ SAVE_XMM + GET_GOT rbx ; save callee-saved reg + push rsi + push rdi +@@ -1941,6 +1953,7 @@ sym(vp8_loop_filter_simple_vertical_edge_sse2): + pop rdi + pop rsi + RESTORE_GOT ++ RESTORE_XMM + UNSHADOW_ARGS + pop rbp + ret +diff --git a/vp8/common/x86/loopfilter_x86.c b/vp8/common/x86/loopfilter_x86.c +index 143ee74..f5af7cf 100644 +--- a/vp8/common/x86/loopfilter_x86.c ++++ b/vp8/common/x86/loopfilter_x86.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/x86/loopfilter_x86.h b/vp8/common/x86/loopfilter_x86.h +index c87f38a..503bf5b 100644 +--- a/vp8/common/x86/loopfilter_x86.h ++++ b/vp8/common/x86/loopfilter_x86.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/x86/postproc_mmx.asm b/vp8/common/x86/postproc_mmx.asm +index 721c8d6..0707651 100644 +--- a/vp8/common/x86/postproc_mmx.asm ++++ b/vp8/common/x86/postproc_mmx.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/x86/postproc_mmx.c b/vp8/common/x86/postproc_mmx.c +index 095797b..f3b2923 100644 +--- a/vp8/common/x86/postproc_mmx.c ++++ b/vp8/common/x86/postproc_mmx.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/x86/postproc_sse2.asm b/vp8/common/x86/postproc_sse2.asm +index bfa36fa..9e56429 100644 +--- a/vp8/common/x86/postproc_sse2.asm ++++ b/vp8/common/x86/postproc_sse2.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +@@ -25,6 +26,7 @@ sym(vp8_post_proc_down_and_across_xmm): + push rbp + mov rbp, rsp + SHADOW_ARGS_TO_STACK 7 ++ SAVE_XMM + GET_GOT rbx + push rsi + push rdi +@@ -239,6 +241,7 @@ acrossnextcol: + pop rdi + pop rsi + RESTORE_GOT ++ RESTORE_XMM + UNSHADOW_ARGS + pop rbp + ret +@@ -253,6 +256,7 @@ sym(vp8_mbpost_proc_down_xmm): + push rbp + mov rbp, rsp + SHADOW_ARGS_TO_STACK 5 ++ SAVE_XMM + GET_GOT rbx + push rsi + push rdi +@@ -438,6 +442,7 @@ loop_row: + pop rdi + pop rsi + RESTORE_GOT ++ RESTORE_XMM + UNSHADOW_ARGS + pop rbp + ret +@@ -451,6 +456,7 @@ sym(vp8_mbpost_proc_across_ip_xmm): + push rbp + mov rbp, rsp + SHADOW_ARGS_TO_STACK 5 ++ SAVE_XMM + GET_GOT rbx + push rsi + push rdi +@@ -611,6 +617,7 @@ nextcol4: + pop rdi + pop rsi + RESTORE_GOT ++ RESTORE_XMM + UNSHADOW_ARGS + pop rbp + ret +diff --git a/vp8/common/x86/postproc_x86.h b/vp8/common/x86/postproc_x86.h +index 49a1907..f939427 100644 +--- a/vp8/common/x86/postproc_x86.h ++++ b/vp8/common/x86/postproc_x86.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/x86/recon_mmx.asm b/vp8/common/x86/recon_mmx.asm +index ba60c5d..95c308d 100644 +--- a/vp8/common/x86/recon_mmx.asm ++++ b/vp8/common/x86/recon_mmx.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/x86/recon_sse2.asm b/vp8/common/x86/recon_sse2.asm +index f2685a7..cfdbfad 100644 +--- a/vp8/common/x86/recon_sse2.asm ++++ b/vp8/common/x86/recon_sse2.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +@@ -66,6 +67,7 @@ sym(vp8_recon4b_sse2): + push rbp + mov rbp, rsp + SHADOW_ARGS_TO_STACK 4 ++ SAVE_XMM + push rsi + push rdi + ; end prolog +@@ -118,6 +120,7 @@ sym(vp8_recon4b_sse2): + ; begin epilog + pop rdi + pop rsi ++ RESTORE_XMM + UNSHADOW_ARGS + pop rbp + ret +diff --git a/vp8/common/x86/recon_x86.h b/vp8/common/x86/recon_x86.h +index c469778..fcd429c 100644 +--- a/vp8/common/x86/recon_x86.h ++++ b/vp8/common/x86/recon_x86.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/x86/subpixel_mmx.asm b/vp8/common/x86/subpixel_mmx.asm +index c502118..b3e4ad5 100644 +--- a/vp8/common/x86/subpixel_mmx.asm ++++ b/vp8/common/x86/subpixel_mmx.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/common/x86/subpixel_sse2.asm b/vp8/common/x86/subpixel_sse2.asm +index dee04f2..ee383ad 100644 +--- a/vp8/common/x86/subpixel_sse2.asm ++++ b/vp8/common/x86/subpixel_sse2.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +@@ -36,6 +37,7 @@ sym(vp8_filter_block1d8_h6_sse2): + push rbp + mov rbp, rsp + SHADOW_ARGS_TO_STACK 7 ++ SAVE_XMM + GET_GOT rbx + push rsi + push rdi +@@ -128,6 +130,7 @@ filter_block1d8_h6_rowloop: + pop rdi + pop rsi + RESTORE_GOT ++ RESTORE_XMM + UNSHADOW_ARGS + pop rbp + ret +@@ -154,6 +157,7 @@ sym(vp8_filter_block1d16_h6_sse2): + push rbp + mov rbp, rsp + SHADOW_ARGS_TO_STACK 7 ++ SAVE_XMM + GET_GOT rbx + push rsi + push rdi +@@ -303,6 +307,7 @@ filter_block1d16_h6_sse2_rowloop: + pop rdi + pop rsi + RESTORE_GOT ++ RESTORE_XMM + UNSHADOW_ARGS + pop rbp + ret +@@ -328,6 +333,7 @@ sym(vp8_filter_block1d8_v6_sse2): + push rbp + mov rbp, rsp + SHADOW_ARGS_TO_STACK 8 ++ SAVE_XMM + GET_GOT rbx + push rsi + push rdi +@@ -396,221 +402,553 @@ vp8_filter_block1d8_v6_sse2_loop: + pop rdi + pop rsi + RESTORE_GOT ++ RESTORE_XMM + UNSHADOW_ARGS + pop rbp + ret + + +-;void vp8_unpack_block1d16_h6_sse2 ++;void vp8_filter_block1d16_v6_sse2 ++;( ++; unsigned short *src_ptr, ++; unsigned char *output_ptr, ++; int dst_ptich, ++; unsigned int pixels_per_line, ++; unsigned int pixel_step, ++; unsigned int output_height, ++; unsigned int output_width, ++; const short *vp8_filter ++;) ++;/************************************************************************************ ++; Notes: filter_block1d16_v6 applies a 6 tap filter vertically to the input pixels. The ++; input pixel array has output_height rows. ++;*************************************************************************************/ ++global sym(vp8_filter_block1d16_v6_sse2) ++sym(vp8_filter_block1d16_v6_sse2): ++ push rbp ++ mov rbp, rsp ++ SHADOW_ARGS_TO_STACK 8 ++ SAVE_XMM ++ GET_GOT rbx ++ push rsi ++ push rdi ++ ; end prolog ++ ++ mov rax, arg(7) ;vp8_filter ++ movsxd rdx, dword ptr arg(3) ;pixels_per_line ++ ++ mov rdi, arg(1) ;output_ptr ++ mov rsi, arg(0) ;src_ptr ++ ++ sub rsi, rdx ++ sub rsi, rdx ++ ++ movsxd rcx, DWORD PTR arg(5) ;[output_height] ++%if ABI_IS_32BIT=0 ++ movsxd r8, dword ptr arg(2) ; dst_ptich ++%endif ++ ++vp8_filter_block1d16_v6_sse2_loop: ++; The order for adding 6-tap is 2 5 3 1 4 6. Read in data in that order. ++ movdqa xmm1, XMMWORD PTR [rsi + rdx] ; line 2 ++ movdqa xmm2, XMMWORD PTR [rsi + rdx + 16] ++ pmullw xmm1, [rax + 16] ++ pmullw xmm2, [rax + 16] ++ ++ movdqa xmm3, XMMWORD PTR [rsi + rdx * 4] ; line 5 ++ movdqa xmm4, XMMWORD PTR [rsi + rdx * 4 + 16] ++ pmullw xmm3, [rax + 64] ++ pmullw xmm4, [rax + 64] ++ ++ movdqa xmm5, XMMWORD PTR [rsi + rdx * 2] ; line 3 ++ movdqa xmm6, XMMWORD PTR [rsi + rdx * 2 + 16] ++ pmullw xmm5, [rax + 32] ++ pmullw xmm6, [rax + 32] ++ ++ movdqa xmm7, XMMWORD PTR [rsi] ; line 1 ++ movdqa xmm0, XMMWORD PTR [rsi + 16] ++ pmullw xmm7, [rax] ++ pmullw xmm0, [rax] ++ ++ paddsw xmm1, xmm3 ++ paddsw xmm2, xmm4 ++ paddsw xmm1, xmm5 ++ paddsw xmm2, xmm6 ++ paddsw xmm1, xmm7 ++ paddsw xmm2, xmm0 ++ ++ add rsi, rdx ++ ++ movdqa xmm3, XMMWORD PTR [rsi + rdx * 2] ; line 4 ++ movdqa xmm4, XMMWORD PTR [rsi + rdx * 2 + 16] ++ pmullw xmm3, [rax + 48] ++ pmullw xmm4, [rax + 48] ++ ++ movdqa xmm5, XMMWORD PTR [rsi + rdx * 4] ; line 6 ++ movdqa xmm6, XMMWORD PTR [rsi + rdx * 4 + 16] ++ pmullw xmm5, [rax + 80] ++ pmullw xmm6, [rax + 80] ++ ++ movdqa xmm7, XMMWORD PTR [rd GLOBAL] ++ pxor xmm0, xmm0 ; clear xmm0 ++ ++ paddsw xmm1, xmm3 ++ paddsw xmm2, xmm4 ++ paddsw xmm1, xmm5 ++ paddsw xmm2, xmm6 ++ ++ paddsw xmm1, xmm7 ++ paddsw xmm2, xmm7 ++ ++ psraw xmm1, 7 ++ psraw xmm2, 7 ++ ++ packuswb xmm1, xmm2 ; pack and saturate ++ movdqa XMMWORD PTR [rdi], xmm1 ; store the results in the destination ++%if ABI_IS_32BIT ++ add rdi, DWORD PTR arg(2) ;[dst_ptich] ++%else ++ add rdi, r8 ++%endif ++ dec rcx ; decrement count ++ jnz vp8_filter_block1d16_v6_sse2_loop ; next row ++ ++ ; begin epilog ++ pop rdi ++ pop rsi ++ RESTORE_GOT ++ RESTORE_XMM ++ UNSHADOW_ARGS ++ pop rbp ++ ret ++ ++ ++;void vp8_filter_block1d8_h6_only_sse2 + ;( + ; unsigned char *src_ptr, +-; unsigned short *output_ptr, + ; unsigned int src_pixels_per_line, ++; unsigned char *output_ptr, ++; int dst_ptich, + ; unsigned int output_height, +-; unsigned int output_width ++; const short *vp8_filter + ;) +-global sym(vp8_unpack_block1d16_h6_sse2) +-sym(vp8_unpack_block1d16_h6_sse2): ++; First-pass filter only when yoffset==0 ++global sym(vp8_filter_block1d8_h6_only_sse2) ++sym(vp8_filter_block1d8_h6_only_sse2): + push rbp + mov rbp, rsp +- SHADOW_ARGS_TO_STACK 5 ++ SHADOW_ARGS_TO_STACK 6 ++ SAVE_XMM + GET_GOT rbx + push rsi + push rdi + ; end prolog + ++ mov rdx, arg(5) ;vp8_filter + mov rsi, arg(0) ;src_ptr +- mov rdi, arg(1) ;output_ptr + +- movsxd rcx, dword ptr arg(3) ;output_height +- movsxd rax, dword ptr arg(2) ;src_pixels_per_line ; Pitch for Source ++ mov rdi, arg(2) ;output_ptr + +- pxor xmm0, xmm0 ; clear xmm0 for unpack ++ movsxd rcx, dword ptr arg(4) ;output_height ++ movsxd rax, dword ptr arg(1) ;src_pixels_per_line ; Pitch for Source + %if ABI_IS_32BIT=0 +- movsxd r8, dword ptr arg(4) ;output_width ; Pitch for Source ++ movsxd r8, dword ptr arg(3) ;dst_ptich + %endif ++ pxor xmm0, xmm0 ; clear xmm0 for unpack + +-unpack_block1d16_h6_sse2_rowloop: +- movq xmm1, MMWORD PTR [rsi] ; 0d 0c 0b 0a 09 08 07 06 05 04 03 02 01 00 -1 -2 +- movq xmm3, MMWORD PTR [rsi+8] ; make copy of xmm1 ++filter_block1d8_h6_only_rowloop: ++ movq xmm3, MMWORD PTR [rsi - 2] ++ movq xmm1, MMWORD PTR [rsi + 6] ++ ++ prefetcht2 [rsi+rax-2] ++ ++ pslldq xmm1, 8 ++ por xmm1, xmm3 ++ ++ movdqa xmm4, xmm1 ++ movdqa xmm5, xmm1 ++ ++ movdqa xmm6, xmm1 ++ movdqa xmm7, xmm1 + + punpcklbw xmm3, xmm0 ; xx05 xx04 xx03 xx02 xx01 xx01 xx-1 xx-2 +- punpcklbw xmm1, xmm0 ++ psrldq xmm4, 1 ; xx 0d 0c 0b 0a 09 08 07 06 05 04 03 02 01 00 -1 ++ ++ pmullw xmm3, XMMWORD PTR [rdx] ; x[-2] * H[-2]; Tap 1 ++ punpcklbw xmm4, xmm0 ; xx06 xx05 xx04 xx03 xx02 xx01 xx00 xx-1 ++ ++ psrldq xmm5, 2 ; xx xx 0d 0c 0b 0a 09 08 07 06 05 04 03 02 01 00 ++ pmullw xmm4, XMMWORD PTR [rdx+16] ; x[-1] * H[-1]; Tap 2 ++ ++ ++ punpcklbw xmm5, xmm0 ; xx07 xx06 xx05 xx04 xx03 xx02 xx01 xx00 ++ psrldq xmm6, 3 ; xx xx xx 0d 0c 0b 0a 09 08 07 06 05 04 03 02 01 ++ ++ pmullw xmm5, [rdx+32] ; x[ 0] * H[ 0]; Tap 3 ++ ++ punpcklbw xmm6, xmm0 ; xx08 xx07 xx06 xx05 xx04 xx03 xx02 xx01 ++ psrldq xmm7, 4 ; xx xx xx xx 0d 0c 0b 0a 09 08 07 06 05 04 03 02 ++ ++ pmullw xmm6, [rdx+48] ; x[ 1] * h[ 1] ; Tap 4 ++ ++ punpcklbw xmm7, xmm0 ; xx09 xx08 xx07 xx06 xx05 xx04 xx03 xx02 ++ psrldq xmm1, 5 ; xx xx xx xx xx 0d 0c 0b 0a 09 08 07 06 05 04 03 ++ ++ ++ pmullw xmm7, [rdx+64] ; x[ 2] * h[ 2] ; Tap 5 ++ ++ punpcklbw xmm1, xmm0 ; xx0a xx09 xx08 xx07 xx06 xx05 xx04 xx03 ++ pmullw xmm1, [rdx+80] ; x[ 3] * h[ 3] ; Tap 6 + +- movdqa XMMWORD Ptr [rdi], xmm1 +- movdqa XMMWORD Ptr [rdi + 16], xmm3 + ++ paddsw xmm4, xmm7 ++ paddsw xmm4, xmm5 ++ ++ paddsw xmm4, xmm3 ++ paddsw xmm4, xmm6 ++ ++ paddsw xmm4, xmm1 ++ paddsw xmm4, [rd GLOBAL] ++ ++ psraw xmm4, 7 ++ ++ packuswb xmm4, xmm0 ++ ++ movq QWORD PTR [rdi], xmm4 ; store the results in the destination + lea rsi, [rsi + rax] ++ + %if ABI_IS_32BIT +- add rdi, DWORD Ptr arg(4) ;[output_width] ++ add rdi, DWORD Ptr arg(3) ;dst_ptich + %else + add rdi, r8 + %endif + dec rcx +- jnz unpack_block1d16_h6_sse2_rowloop ; next row ++ ++ jnz filter_block1d8_h6_only_rowloop ; next row + + ; begin epilog + pop rdi + pop rsi + RESTORE_GOT ++ RESTORE_XMM + UNSHADOW_ARGS + pop rbp + ret + + +-;void vp8_unpack_block1d8_h6_sse2 ++;void vp8_filter_block1d16_h6_only_sse2 + ;( + ; unsigned char *src_ptr, +-; unsigned short *output_ptr, + ; unsigned int src_pixels_per_line, ++; unsigned char *output_ptr, ++; int dst_ptich, + ; unsigned int output_height, +-; unsigned int output_width ++; const short *vp8_filter + ;) +-global sym(vp8_unpack_block1d8_h6_sse2) +-sym(vp8_unpack_block1d8_h6_sse2): ++; First-pass filter only when yoffset==0 ++global sym(vp8_filter_block1d16_h6_only_sse2) ++sym(vp8_filter_block1d16_h6_only_sse2): + push rbp + mov rbp, rsp +- SHADOW_ARGS_TO_STACK 5 ++ SHADOW_ARGS_TO_STACK 6 ++ SAVE_XMM + GET_GOT rbx + push rsi + push rdi + ; end prolog + ++ mov rdx, arg(5) ;vp8_filter + mov rsi, arg(0) ;src_ptr +- mov rdi, arg(1) ;output_ptr + +- movsxd rcx, dword ptr arg(3) ;output_height +- movsxd rax, dword ptr arg(2) ;src_pixels_per_line ; Pitch for Source ++ mov rdi, arg(2) ;output_ptr + +- pxor xmm0, xmm0 ; clear xmm0 for unpack ++ movsxd rcx, dword ptr arg(4) ;output_height ++ movsxd rax, dword ptr arg(1) ;src_pixels_per_line ; Pitch for Source + %if ABI_IS_32BIT=0 +- movsxd r8, dword ptr arg(4) ;output_width ; Pitch for Source ++ movsxd r8, dword ptr arg(3) ;dst_ptich + %endif + +-unpack_block1d8_h6_sse2_rowloop: +- movq xmm1, MMWORD PTR [rsi] ; 0d 0c 0b 0a 09 08 07 06 05 04 03 02 01 00 -1 -2 +- lea rsi, [rsi + rax] ++ pxor xmm0, xmm0 ; clear xmm0 for unpack + +- punpcklbw xmm1, xmm0 +- movdqa XMMWORD Ptr [rdi], xmm1 ++filter_block1d16_h6_only_sse2_rowloop: ++ movq xmm3, MMWORD PTR [rsi - 2] ++ movq xmm1, MMWORD PTR [rsi + 6] ++ ++ movq xmm2, MMWORD PTR [rsi +14] ++ pslldq xmm2, 8 ++ ++ por xmm2, xmm1 ++ prefetcht2 [rsi+rax-2] ++ ++ pslldq xmm1, 8 ++ por xmm1, xmm3 + ++ movdqa xmm4, xmm1 ++ movdqa xmm5, xmm1 ++ ++ movdqa xmm6, xmm1 ++ movdqa xmm7, xmm1 ++ ++ punpcklbw xmm3, xmm0 ; xx05 xx04 xx03 xx02 xx01 xx01 xx-1 xx-2 ++ psrldq xmm4, 1 ; xx 0d 0c 0b 0a 09 08 07 06 05 04 03 02 01 00 -1 ++ ++ pmullw xmm3, XMMWORD PTR [rdx] ; x[-2] * H[-2]; Tap 1 ++ punpcklbw xmm4, xmm0 ; xx06 xx05 xx04 xx03 xx02 xx01 xx00 xx-1 ++ ++ psrldq xmm5, 2 ; xx xx 0d 0c 0b 0a 09 08 07 06 05 04 03 02 01 00 ++ pmullw xmm4, XMMWORD PTR [rdx+16] ; x[-1] * H[-1]; Tap 2 ++ ++ punpcklbw xmm5, xmm0 ; xx07 xx06 xx05 xx04 xx03 xx02 xx01 xx00 ++ psrldq xmm6, 3 ; xx xx xx 0d 0c 0b 0a 09 08 07 06 05 04 03 02 01 ++ ++ pmullw xmm5, [rdx+32] ; x[ 0] * H[ 0]; Tap 3 ++ ++ punpcklbw xmm6, xmm0 ; xx08 xx07 xx06 xx05 xx04 xx03 xx02 xx01 ++ psrldq xmm7, 4 ; xx xx xx xx 0d 0c 0b 0a 09 08 07 06 05 04 03 02 ++ ++ pmullw xmm6, [rdx+48] ; x[ 1] * h[ 1] ; Tap 4 ++ ++ punpcklbw xmm7, xmm0 ; xx09 xx08 xx07 xx06 xx05 xx04 xx03 xx02 ++ psrldq xmm1, 5 ; xx xx xx xx xx 0d 0c 0b 0a 09 08 07 06 05 04 03 ++ ++ pmullw xmm7, [rdx+64] ; x[ 2] * h[ 2] ; Tap 5 ++ ++ punpcklbw xmm1, xmm0 ; xx0a xx09 xx08 xx07 xx06 xx05 xx04 xx03 ++ pmullw xmm1, [rdx+80] ; x[ 3] * h[ 3] ; Tap 6 ++ ++ paddsw xmm4, xmm7 ++ paddsw xmm4, xmm5 ++ ++ paddsw xmm4, xmm3 ++ paddsw xmm4, xmm6 ++ ++ paddsw xmm4, xmm1 ++ paddsw xmm4, [rd GLOBAL] ++ ++ psraw xmm4, 7 ++ ++ packuswb xmm4, xmm0 ; lower 8 bytes ++ ++ movq QWORD Ptr [rdi], xmm4 ; store the results in the destination ++ ++ movdqa xmm3, xmm2 ++ movdqa xmm4, xmm2 ++ ++ movdqa xmm5, xmm2 ++ movdqa xmm6, xmm2 ++ ++ movdqa xmm7, xmm2 ++ ++ punpcklbw xmm3, xmm0 ; xx05 xx04 xx03 xx02 xx01 xx01 xx-1 xx-2 ++ psrldq xmm4, 1 ; xx 0d 0c 0b 0a 09 08 07 06 05 04 03 02 01 00 -1 ++ ++ pmullw xmm3, XMMWORD PTR [rdx] ; x[-2] * H[-2]; Tap 1 ++ punpcklbw xmm4, xmm0 ; xx06 xx05 xx04 xx03 xx02 xx01 xx00 xx-1 ++ ++ psrldq xmm5, 2 ; xx xx 0d 0c 0b 0a 09 08 07 06 05 04 03 02 01 00 ++ pmullw xmm4, XMMWORD PTR [rdx+16] ; x[-1] * H[-1]; Tap 2 ++ ++ punpcklbw xmm5, xmm0 ; xx07 xx06 xx05 xx04 xx03 xx02 xx01 xx00 ++ psrldq xmm6, 3 ; xx xx xx 0d 0c 0b 0a 09 08 07 06 05 04 03 02 01 ++ ++ pmullw xmm5, [rdx+32] ; x[ 0] * H[ 0]; Tap 3 ++ ++ punpcklbw xmm6, xmm0 ; xx08 xx07 xx06 xx05 xx04 xx03 xx02 xx01 ++ psrldq xmm7, 4 ; xx xx xx xx 0d 0c 0b 0a 09 08 07 06 05 04 03 02 ++ ++ pmullw xmm6, [rdx+48] ; x[ 1] * h[ 1] ; Tap 4 ++ ++ punpcklbw xmm7, xmm0 ; xx09 xx08 xx07 xx06 xx05 xx04 xx03 xx02 ++ psrldq xmm2, 5 ; xx xx xx xx xx 0d 0c 0b 0a 09 08 07 06 05 04 03 ++ ++ pmullw xmm7, [rdx+64] ; x[ 2] * h[ 2] ; Tap 5 ++ ++ punpcklbw xmm2, xmm0 ; xx0a xx09 xx08 xx07 xx06 xx05 xx04 xx03 ++ pmullw xmm2, [rdx+80] ; x[ 3] * h[ 3] ; Tap 6 ++ ++ paddsw xmm4, xmm7 ++ paddsw xmm4, xmm5 ++ ++ paddsw xmm4, xmm3 ++ paddsw xmm4, xmm6 ++ ++ paddsw xmm4, xmm2 ++ paddsw xmm4, [rd GLOBAL] ++ ++ psraw xmm4, 7 ++ ++ packuswb xmm4, xmm0 ; higher 8 bytes ++ ++ movq QWORD Ptr [rdi+8], xmm4 ; store the results in the destination ++ ++ lea rsi, [rsi + rax] + %if ABI_IS_32BIT +- add rdi, DWORD Ptr arg(4) ;[output_width] ++ add rdi, DWORD Ptr arg(3) ;dst_ptich + %else + add rdi, r8 + %endif ++ + dec rcx +- jnz unpack_block1d8_h6_sse2_rowloop ; next row ++ jnz filter_block1d16_h6_only_sse2_rowloop ; next row + + ; begin epilog + pop rdi + pop rsi + RESTORE_GOT ++ RESTORE_XMM + UNSHADOW_ARGS + pop rbp + ret + + +-;void vp8_pack_block1d8_v6_sse2 ++;void vp8_filter_block1d8_v6_only_sse2 + ;( +-; short *src_ptr, ++; unsigned char *src_ptr, ++; unsigned int src_pixels_per_line, + ; unsigned char *output_ptr, + ; int dst_ptich, +-; unsigned int pixels_per_line, + ; unsigned int output_height, +-; unsigned int output_width ++; const short *vp8_filter + ;) +-global sym(vp8_pack_block1d8_v6_sse2) +-sym(vp8_pack_block1d8_v6_sse2): ++; Second-pass filter only when xoffset==0 ++global sym(vp8_filter_block1d8_v6_only_sse2) ++sym(vp8_filter_block1d8_v6_only_sse2): + push rbp + mov rbp, rsp + SHADOW_ARGS_TO_STACK 6 ++ SAVE_XMM + GET_GOT rbx + push rsi + push rdi + ; end prolog + +- movsxd rdx, dword ptr arg(3) ;pixels_per_line +- mov rdi, arg(1) ;output_ptr +- + mov rsi, arg(0) ;src_ptr +- movsxd rcx, DWORD PTR arg(4) ;[output_height] ++ mov rdi, arg(2) ;output_ptr ++ ++ movsxd rcx, dword ptr arg(4) ;output_height ++ movsxd rdx, dword ptr arg(1) ;src_pixels_per_line ++ ++ mov rax, arg(5) ;vp8_filter ++ ++ pxor xmm0, xmm0 ; clear xmm0 ++ ++ movdqa xmm7, XMMWORD PTR [rd GLOBAL] + %if ABI_IS_32BIT=0 +- movsxd r8, dword ptr arg(5) ;output_width ; Pitch for Source ++ movsxd r8, dword ptr arg(3) ; dst_ptich + %endif + +-pack_block1d8_v6_sse2_loop: +- movdqa xmm0, XMMWORD PTR [rsi] +- packuswb xmm0, xmm0 ++vp8_filter_block1d8_v6_only_sse2_loop: ++ movq xmm1, MMWORD PTR [rsi] ++ movq xmm2, MMWORD PTR [rsi + rdx] ++ movq xmm3, MMWORD PTR [rsi + rdx * 2] ++ movq xmm5, MMWORD PTR [rsi + rdx * 4] ++ add rsi, rdx ++ movq xmm4, MMWORD PTR [rsi + rdx * 2] ++ movq xmm6, MMWORD PTR [rsi + rdx * 4] ++ ++ punpcklbw xmm1, xmm0 ++ pmullw xmm1, [rax] ++ ++ punpcklbw xmm2, xmm0 ++ pmullw xmm2, [rax + 16] ++ ++ punpcklbw xmm3, xmm0 ++ pmullw xmm3, [rax + 32] ++ ++ punpcklbw xmm5, xmm0 ++ pmullw xmm5, [rax + 64] ++ ++ punpcklbw xmm4, xmm0 ++ pmullw xmm4, [rax + 48] ++ ++ punpcklbw xmm6, xmm0 ++ pmullw xmm6, [rax + 80] ++ ++ paddsw xmm2, xmm5 ++ paddsw xmm2, xmm3 ++ ++ paddsw xmm2, xmm1 ++ paddsw xmm2, xmm4 ++ ++ paddsw xmm2, xmm6 ++ paddsw xmm2, xmm7 + +- movq QWORD PTR [rdi], xmm0 ; store the results in the destination +- lea rsi, [rsi+rdx] ++ psraw xmm2, 7 ++ packuswb xmm2, xmm0 ; pack and saturate + ++ movq QWORD PTR [rdi], xmm2 ; store the results in the destination + %if ABI_IS_32BIT +- add rdi, DWORD Ptr arg(5) ;[output_width] ++ add rdi, DWORD PTR arg(3) ;[dst_ptich] + %else + add rdi, r8 + %endif + dec rcx ; decrement count +- jnz pack_block1d8_v6_sse2_loop ; next row ++ jnz vp8_filter_block1d8_v6_only_sse2_loop ; next row + + ; begin epilog + pop rdi + pop rsi + RESTORE_GOT ++ RESTORE_XMM + UNSHADOW_ARGS + pop rbp + ret + + +-;void vp8_pack_block1d16_v6_sse2 ++;void vp8_unpack_block1d16_h6_sse2 + ;( +-; short *src_ptr, +-; unsigned char *output_ptr, +-; int dst_ptich, +-; unsigned int pixels_per_line, +-; unsigned int output_height, +-; unsigned int output_width ++; unsigned char *src_ptr, ++; unsigned short *output_ptr, ++; unsigned int src_pixels_per_line, ++; unsigned int output_height, ++; unsigned int output_width + ;) +-global sym(vp8_pack_block1d16_v6_sse2) +-sym(vp8_pack_block1d16_v6_sse2): ++global sym(vp8_unpack_block1d16_h6_sse2) ++sym(vp8_unpack_block1d16_h6_sse2): + push rbp + mov rbp, rsp +- SHADOW_ARGS_TO_STACK 6 ++ SHADOW_ARGS_TO_STACK 5 ++ ;SAVE_XMM ;xmm6, xmm7 are not used here. + GET_GOT rbx + push rsi + push rdi + ; end prolog + +- movsxd rdx, dword ptr arg(3) ;pixels_per_line ++ mov rsi, arg(0) ;src_ptr + mov rdi, arg(1) ;output_ptr + +- mov rsi, arg(0) ;src_ptr +- movsxd rcx, DWORD PTR arg(4) ;[output_height] ++ movsxd rcx, dword ptr arg(3) ;output_height ++ movsxd rax, dword ptr arg(2) ;src_pixels_per_line ; Pitch for Source ++ ++ pxor xmm0, xmm0 ; clear xmm0 for unpack + %if ABI_IS_32BIT=0 +- movsxd r8, dword ptr arg(2) ;dst_pitch ++ movsxd r8, dword ptr arg(4) ;output_width ; Pitch for Source + %endif + +-pack_block1d16_v6_sse2_loop: +- movdqa xmm0, XMMWORD PTR [rsi] +- movdqa xmm1, XMMWORD PTR [rsi+16] ++unpack_block1d16_h6_sse2_rowloop: ++ movq xmm1, MMWORD PTR [rsi] ; 0d 0c 0b 0a 09 08 07 06 05 04 03 02 01 00 -1 -2 ++ movq xmm3, MMWORD PTR [rsi+8] ; make copy of xmm1 ++ ++ punpcklbw xmm3, xmm0 ; xx05 xx04 xx03 xx02 xx01 xx01 xx-1 xx-2 ++ punpcklbw xmm1, xmm0 + +- packuswb xmm0, xmm1 +- movdqa XMMWORD PTR [rdi], xmm0 ; store the results in the destination ++ movdqa XMMWORD Ptr [rdi], xmm1 ++ movdqa XMMWORD Ptr [rdi + 16], xmm3 + +- add rsi, rdx ++ lea rsi, [rsi + rax] + %if ABI_IS_32BIT +- add rdi, DWORD Ptr arg(2) ;dst_pitch ++ add rdi, DWORD Ptr arg(4) ;[output_width] + %else + add rdi, r8 + %endif +- dec rcx ; decrement count +- jnz pack_block1d16_v6_sse2_loop ; next row ++ dec rcx ++ jnz unpack_block1d16_h6_sse2_rowloop ; next row + + ; begin epilog + pop rdi + pop rsi + RESTORE_GOT ++ ;RESTORE_XMM + UNSHADOW_ARGS + pop rbp + ret +@@ -631,6 +969,7 @@ sym(vp8_bilinear_predict16x16_sse2): + push rbp + mov rbp, rsp + SHADOW_ARGS_TO_STACK 6 ++ SAVE_XMM + GET_GOT rbx + push rsi + push rdi +@@ -878,6 +1217,7 @@ done: + pop rdi + pop rsi + RESTORE_GOT ++ RESTORE_XMM + UNSHADOW_ARGS + pop rbp + ret +@@ -898,6 +1238,7 @@ sym(vp8_bilinear_predict8x8_sse2): + push rbp + mov rbp, rsp + SHADOW_ARGS_TO_STACK 6 ++ SAVE_XMM + GET_GOT rbx + push rsi + push rdi +@@ -1021,6 +1362,7 @@ next_row8x8: + pop rdi + pop rsi + RESTORE_GOT ++ RESTORE_XMM + UNSHADOW_ARGS + pop rbp + ret +diff --git a/vp8/common/x86/subpixel_x86.h b/vp8/common/x86/subpixel_x86.h +index efa7b2e..bd6859c 100644 +--- a/vp8/common/x86/subpixel_x86.h ++++ b/vp8/common/x86/subpixel_x86.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/common/x86/vp8_asm_stubs.c b/vp8/common/x86/vp8_asm_stubs.c +index 68454f7..163ec5b 100644 +--- a/vp8/common/x86/vp8_asm_stubs.c ++++ b/vp8/common/x86/vp8_asm_stubs.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +@@ -67,6 +68,17 @@ extern void vp8_filter_block1d8_v6_sse2 + unsigned int output_width, + const short *vp8_filter + ); ++extern void vp8_filter_block1d16_v6_sse2 ++( ++ unsigned short *src_ptr, ++ unsigned char *output_ptr, ++ int dst_ptich, ++ unsigned int pixels_per_line, ++ unsigned int pixel_step, ++ unsigned int output_height, ++ unsigned int output_width, ++ const short *vp8_filter ++); + extern void vp8_unpack_block1d16_h6_sse2 + ( + unsigned char *src_ptr, +@@ -75,31 +87,32 @@ extern void vp8_unpack_block1d16_h6_sse2 + unsigned int output_height, + unsigned int output_width + ); +-extern void vp8_unpack_block1d8_h6_sse2 ++extern void vp8_filter_block1d8_h6_only_sse2 + ( + unsigned char *src_ptr, +- unsigned short *output_ptr, + unsigned int src_pixels_per_line, ++ unsigned char *output_ptr, ++ int dst_ptich, + unsigned int output_height, +- unsigned int output_width ++ const short *vp8_filter + ); +-extern void vp8_pack_block1d8_v6_sse2 ++extern void vp8_filter_block1d16_h6_only_sse2 + ( +- unsigned short *src_ptr, +- unsigned char *output_ptr, ++ unsigned char *src_ptr, ++ unsigned int src_pixels_per_line, ++ unsigned char *output_ptr, + int dst_ptich, +- unsigned int pixels_per_line, +- unsigned int output_height, +- unsigned int output_width ++ unsigned int output_height, ++ const short *vp8_filter + ); +-extern void vp8_pack_block1d16_v6_sse2 ++extern void vp8_filter_block1d8_v6_only_sse2 + ( +- unsigned short *src_ptr, ++ unsigned char *src_ptr, ++ unsigned int src_pixels_per_line, + unsigned char *output_ptr, + int dst_ptich, +- unsigned int pixels_per_line, +- unsigned int output_height, +- unsigned int output_width ++ unsigned int output_height, ++ const short *vp8_filter + ); + extern prototype_subpixel_predict(vp8_bilinear_predict8x8_mmx); + +@@ -246,23 +259,26 @@ void vp8_sixtap_predict16x16_sse2 + + if (xoffset) + { +- HFilter = vp8_six_tap_mmx[xoffset]; +- vp8_filter_block1d16_h6_sse2(src_ptr - (2 * src_pixels_per_line), FData2, src_pixels_per_line, 1, 21, 32, HFilter); ++ if (yoffset) ++ { ++ HFilter = vp8_six_tap_mmx[xoffset]; ++ vp8_filter_block1d16_h6_sse2(src_ptr - (2 * src_pixels_per_line), FData2, src_pixels_per_line, 1, 21, 32, HFilter); ++ VFilter = vp8_six_tap_mmx[yoffset]; ++ vp8_filter_block1d16_v6_sse2(FData2 + 32, dst_ptr, dst_pitch, 32, 16 , 16, dst_pitch, VFilter); ++ } ++ else ++ { ++ // First-pass only ++ HFilter = vp8_six_tap_mmx[xoffset]; ++ vp8_filter_block1d16_h6_only_sse2(src_ptr, src_pixels_per_line, dst_ptr, dst_pitch, 16, HFilter); ++ } + } + else + { +- vp8_unpack_block1d16_h6_sse2(src_ptr - (2 * src_pixels_per_line), FData2, src_pixels_per_line, 21, 32); +- } +- +- if (yoffset) +- { ++ // Second-pass only + VFilter = vp8_six_tap_mmx[yoffset]; +- vp8_filter_block1d8_v6_sse2(FData2 + 32, dst_ptr, dst_pitch, 32, 16 , 16, 16, VFilter); +- vp8_filter_block1d8_v6_sse2(FData2 + 40, dst_ptr + 8, dst_pitch, 32, 16 , 16, 16, VFilter); +- } +- else +- { +- vp8_pack_block1d16_v6_sse2(FData2 + 32, dst_ptr, dst_pitch, 32, 16, 16); ++ vp8_unpack_block1d16_h6_sse2(src_ptr - (2 * src_pixels_per_line), FData2, src_pixels_per_line, 21, 32); ++ vp8_filter_block1d16_v6_sse2(FData2 + 32, dst_ptr, dst_pitch, 32, 16 , 16, dst_pitch, VFilter); + } + } + +@@ -282,25 +298,26 @@ void vp8_sixtap_predict8x8_sse2 + + if (xoffset) + { +- HFilter = vp8_six_tap_mmx[xoffset]; +- vp8_filter_block1d8_h6_sse2(src_ptr - (2 * src_pixels_per_line), FData2, src_pixels_per_line, 1, 13, 16, HFilter); ++ if (yoffset) ++ { ++ HFilter = vp8_six_tap_mmx[xoffset]; ++ vp8_filter_block1d8_h6_sse2(src_ptr - (2 * src_pixels_per_line), FData2, src_pixels_per_line, 1, 13, 16, HFilter); ++ VFilter = vp8_six_tap_mmx[yoffset]; ++ vp8_filter_block1d8_v6_sse2(FData2 + 16, dst_ptr, dst_pitch, 16, 8 , 8, dst_pitch, VFilter); ++ } ++ else ++ { ++ // First-pass only ++ HFilter = vp8_six_tap_mmx[xoffset]; ++ vp8_filter_block1d8_h6_only_sse2(src_ptr, src_pixels_per_line, dst_ptr, dst_pitch, 8, HFilter); ++ } + } + else + { +- vp8_unpack_block1d8_h6_sse2(src_ptr - (2 * src_pixels_per_line), FData2, src_pixels_per_line, 13, 16); +- } +- +- if (yoffset) +- { ++ // Second-pass only + VFilter = vp8_six_tap_mmx[yoffset]; +- vp8_filter_block1d8_v6_sse2(FData2 + 16, dst_ptr, dst_pitch, 16, 8 , 8, dst_pitch, VFilter); +- } +- else +- { +- vp8_pack_block1d8_v6_sse2(FData2 + 16, dst_ptr, dst_pitch, 16, 8, dst_pitch); ++ vp8_filter_block1d8_v6_only_sse2(src_ptr - (2 * src_pixels_per_line), src_pixels_per_line, dst_ptr, dst_pitch, 8, VFilter); + } +- +- + } + + +@@ -319,24 +336,26 @@ void vp8_sixtap_predict8x4_sse2 + + if (xoffset) + { +- HFilter = vp8_six_tap_mmx[xoffset]; +- vp8_filter_block1d8_h6_sse2(src_ptr - (2 * src_pixels_per_line), FData2, src_pixels_per_line, 1, 9, 16, HFilter); ++ if (yoffset) ++ { ++ HFilter = vp8_six_tap_mmx[xoffset]; ++ vp8_filter_block1d8_h6_sse2(src_ptr - (2 * src_pixels_per_line), FData2, src_pixels_per_line, 1, 9, 16, HFilter); ++ VFilter = vp8_six_tap_mmx[yoffset]; ++ vp8_filter_block1d8_v6_sse2(FData2 + 16, dst_ptr, dst_pitch, 16, 8 , 4, dst_pitch, VFilter); ++ } ++ else ++ { ++ // First-pass only ++ HFilter = vp8_six_tap_mmx[xoffset]; ++ vp8_filter_block1d8_h6_only_sse2(src_ptr, src_pixels_per_line, dst_ptr, dst_pitch, 4, HFilter); ++ } + } + else + { +- vp8_unpack_block1d8_h6_sse2(src_ptr - (2 * src_pixels_per_line), FData2, src_pixels_per_line, 9, 16); +- } +- +- if (yoffset) +- { ++ // Second-pass only + VFilter = vp8_six_tap_mmx[yoffset]; +- vp8_filter_block1d8_v6_sse2(FData2 + 16, dst_ptr, dst_pitch, 16, 8 , 4, dst_pitch, VFilter); ++ vp8_filter_block1d8_v6_only_sse2(src_ptr - (2 * src_pixels_per_line), src_pixels_per_line, dst_ptr, dst_pitch, 4, VFilter); + } +- else +- { +- vp8_pack_block1d8_v6_sse2(FData2 + 16, dst_ptr, dst_pitch, 16, 4, dst_pitch); +- } +- +- + } ++ + #endif +diff --git a/vp8/common/x86/x86_systemdependent.c b/vp8/common/x86/x86_systemdependent.c +index 5312e06..09ff3c5 100644 +--- a/vp8/common/x86/x86_systemdependent.c ++++ b/vp8/common/x86/x86_systemdependent.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/decoder/arm/armv5/dequantize_v5.asm b/vp8/decoder/arm/armv5/dequantize_v5.asm +index eb3f030..80b2e0c 100644 +--- a/vp8/decoder/arm/armv5/dequantize_v5.asm ++++ b/vp8/decoder/arm/armv5/dequantize_v5.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/decoder/arm/armv6/dboolhuff_v6.asm b/vp8/decoder/arm/armv6/dboolhuff_v6.asm +index 143e33e..eca8eeb 100644 +--- a/vp8/decoder/arm/armv6/dboolhuff_v6.asm ++++ b/vp8/decoder/arm/armv6/dboolhuff_v6.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/decoder/arm/armv6/dequantdcidct_v6.asm b/vp8/decoder/arm/armv6/dequantdcidct_v6.asm +index 3daa9b3..c5b0b7b 100644 +--- a/vp8/decoder/arm/armv6/dequantdcidct_v6.asm ++++ b/vp8/decoder/arm/armv6/dequantdcidct_v6.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/decoder/arm/armv6/dequantidct_v6.asm b/vp8/decoder/arm/armv6/dequantidct_v6.asm +index 61bb48d..0d1c6b4 100644 +--- a/vp8/decoder/arm/armv6/dequantidct_v6.asm ++++ b/vp8/decoder/arm/armv6/dequantidct_v6.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/decoder/arm/armv6/dequantize_v6.asm b/vp8/decoder/arm/armv6/dequantize_v6.asm +index 95e3859..c35e7c6 100644 +--- a/vp8/decoder/arm/armv6/dequantize_v6.asm ++++ b/vp8/decoder/arm/armv6/dequantize_v6.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/decoder/arm/dequantize_arm.c b/vp8/decoder/arm/dequantize_arm.c +index 54006a9..913267d 100644 +--- a/vp8/decoder/arm/dequantize_arm.c ++++ b/vp8/decoder/arm/dequantize_arm.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/decoder/arm/dequantize_arm.h b/vp8/decoder/arm/dequantize_arm.h +index c8a61a4..ae7cf8e 100644 +--- a/vp8/decoder/arm/dequantize_arm.h ++++ b/vp8/decoder/arm/dequantize_arm.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/decoder/arm/detokenizearm_sjl.c b/vp8/decoder/arm/detokenizearm_sjl.c +index c714452..a126a05 100644 +--- a/vp8/decoder/arm/detokenizearm_sjl.c ++++ b/vp8/decoder/arm/detokenizearm_sjl.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/decoder/arm/detokenizearm_v6.asm b/vp8/decoder/arm/detokenizearm_v6.asm +index 4d87ee5..439c9ab 100644 +--- a/vp8/decoder/arm/detokenizearm_v6.asm ++++ b/vp8/decoder/arm/detokenizearm_v6.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/decoder/arm/dsystemdependent.c b/vp8/decoder/arm/dsystemdependent.c +index 455c83a..f146d60 100644 +--- a/vp8/decoder/arm/dsystemdependent.c ++++ b/vp8/decoder/arm/dsystemdependent.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/decoder/arm/neon/dboolhuff_neon.asm b/vp8/decoder/arm/neon/dboolhuff_neon.asm +index 7ec62a3..01315a4 100644 +--- a/vp8/decoder/arm/neon/dboolhuff_neon.asm ++++ b/vp8/decoder/arm/neon/dboolhuff_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/decoder/arm/neon/dequantdcidct_neon.asm b/vp8/decoder/arm/neon/dequantdcidct_neon.asm +index 3392f2c..482f02d 100644 +--- a/vp8/decoder/arm/neon/dequantdcidct_neon.asm ++++ b/vp8/decoder/arm/neon/dequantdcidct_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/decoder/arm/neon/dequantidct_neon.asm b/vp8/decoder/arm/neon/dequantidct_neon.asm +index bba4d5d..3d00dbf 100644 +--- a/vp8/decoder/arm/neon/dequantidct_neon.asm ++++ b/vp8/decoder/arm/neon/dequantidct_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/decoder/arm/neon/dequantizeb_neon.asm b/vp8/decoder/arm/neon/dequantizeb_neon.asm +index 1bde946..14698f8 100644 +--- a/vp8/decoder/arm/neon/dequantizeb_neon.asm ++++ b/vp8/decoder/arm/neon/dequantizeb_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/decoder/dboolhuff.c b/vp8/decoder/dboolhuff.c +index 442054e..7027c0f 100644 +--- a/vp8/decoder/dboolhuff.c ++++ b/vp8/decoder/dboolhuff.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/decoder/dboolhuff.h b/vp8/decoder/dboolhuff.h +index f5c9822..c6d69e7 100644 +--- a/vp8/decoder/dboolhuff.h ++++ b/vp8/decoder/dboolhuff.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +@@ -12,7 +13,7 @@ + #define DBOOLHUFF_H + #include "vpx_ports/config.h" + #include "vpx_ports/mem.h" +-#include "vpx_ports/vpx_integer.h" ++#include "vpx/vpx_integer.h" + + /* Size of the bool decoder backing storage + * +diff --git a/vp8/decoder/decodemv.c b/vp8/decoder/decodemv.c +index 6035f3e..7e00423 100644 +--- a/vp8/decoder/decodemv.c ++++ b/vp8/decoder/decodemv.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +@@ -170,6 +171,7 @@ void vp8_decode_mode_mvs(VP8D_COMP *pbi) + VP8_COMMON *const pc = &pbi->common; + MACROBLOCKD *xd = &pbi->mb; + ++ mbmi->need_to_clamp_mvs = 0; + vp8dx_bool_decoder_fill(bc); + + // Distance of Mb to the various image edges. +@@ -268,6 +270,17 @@ void vp8_decode_mode_mvs(VP8D_COMP *pbi) + break; + } + ++ if (mv->col < xd->mb_to_left_edge ++ - LEFT_TOP_MARGIN ++ || mv->col > xd->mb_to_right_edge ++ + RIGHT_BOTTOM_MARGIN ++ || mv->row < xd->mb_to_top_edge ++ - LEFT_TOP_MARGIN ++ || mv->row > xd->mb_to_bottom_edge ++ + RIGHT_BOTTOM_MARGIN ++ ) ++ mbmi->need_to_clamp_mvs = 1; ++ + /* Fill (uniform) modes, mvs of jth subset. + Must do it here because ensuing subsets can + refer back to us via "left" or "above". */ +@@ -324,27 +337,18 @@ void vp8_decode_mode_mvs(VP8D_COMP *pbi) + read_mv(bc, mv, (const MV_CONTEXT *) mvc); + mv->row += best_mv.row; + mv->col += best_mv.col; +- /* Encoder should not produce invalid motion vectors, but since +- * arbitrary length MVs can be parsed from the bitstream, we +- * need to clamp them here in case we're reading bad data to +- * avoid a crash. +- */ +-#if CONFIG_DEBUG +- assert(mv->col >= (xd->mb_to_left_edge - LEFT_TOP_MARGIN)); +- assert(mv->col <= (xd->mb_to_right_edge + RIGHT_BOTTOM_MARGIN)); +- assert(mv->row >= (xd->mb_to_top_edge - LEFT_TOP_MARGIN)); +- assert(mv->row <= (xd->mb_to_bottom_edge + RIGHT_BOTTOM_MARGIN)); +-#endif + +- if (mv->col < (xd->mb_to_left_edge - LEFT_TOP_MARGIN)) +- mv->col = xd->mb_to_left_edge - LEFT_TOP_MARGIN; +- else if (mv->col > xd->mb_to_right_edge + RIGHT_BOTTOM_MARGIN) +- mv->col = xd->mb_to_right_edge + RIGHT_BOTTOM_MARGIN; +- +- if (mv->row < (xd->mb_to_top_edge - LEFT_TOP_MARGIN)) +- mv->row = xd->mb_to_top_edge - LEFT_TOP_MARGIN; +- else if (mv->row > xd->mb_to_bottom_edge + RIGHT_BOTTOM_MARGIN) +- mv->row = xd->mb_to_bottom_edge + RIGHT_BOTTOM_MARGIN; ++ /* Don't need to check this on NEARMV and NEARESTMV modes ++ * since those modes clamp the MV. The NEWMV mode does not, ++ * so signal to the prediction stage whether special ++ * handling may be required. ++ */ ++ if (mv->col < xd->mb_to_left_edge - LEFT_TOP_MARGIN ++ || mv->col > xd->mb_to_right_edge + RIGHT_BOTTOM_MARGIN ++ || mv->row < xd->mb_to_top_edge - LEFT_TOP_MARGIN ++ || mv->row > xd->mb_to_bottom_edge + RIGHT_BOTTOM_MARGIN ++ ) ++ mbmi->need_to_clamp_mvs = 1; + + propagate_mv: /* same MV throughout */ + { +@@ -380,7 +384,6 @@ void vp8_decode_mode_mvs(VP8D_COMP *pbi) + assert(0); + #endif + } +- + } + else + { +diff --git a/vp8/decoder/decodemv.h b/vp8/decoder/decodemv.h +index 4030071..8b7fb68 100644 +--- a/vp8/decoder/decodemv.h ++++ b/vp8/decoder/decodemv.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/decoder/decoderthreading.h b/vp8/decoder/decoderthreading.h +index ebc5c27..6c0363b 100644 +--- a/vp8/decoder/decoderthreading.h ++++ b/vp8/decoder/decoderthreading.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/decoder/decodframe.c b/vp8/decoder/decodframe.c +index 4edf4f6..0f1b879 100644 +--- a/vp8/decoder/decodframe.c ++++ b/vp8/decoder/decodframe.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +@@ -125,6 +126,62 @@ static void skip_recon_mb(VP8D_COMP *pbi, MACROBLOCKD *xd) + } + } + ++ ++static void clamp_mv_to_umv_border(MV *mv, const MACROBLOCKD *xd) ++{ ++ /* If the MV points so far into the UMV border that no visible pixels ++ * are used for reconstruction, the subpel part of the MV can be ++ * discarded and the MV limited to 16 pixels with equivalent results. ++ * ++ * This limit kicks in at 19 pixels for the top and left edges, for ++ * the 16 pixels plus 3 taps right of the central pixel when subpel ++ * filtering. The bottom and right edges use 16 pixels plus 2 pixels ++ * left of the central pixel when filtering. ++ */ ++ if (mv->col < (xd->mb_to_left_edge - (19 << 3))) ++ mv->col = xd->mb_to_left_edge - (16 << 3); ++ else if (mv->col > xd->mb_to_right_edge + (18 << 3)) ++ mv->col = xd->mb_to_right_edge + (16 << 3); ++ ++ if (mv->row < (xd->mb_to_top_edge - (19 << 3))) ++ mv->row = xd->mb_to_top_edge - (16 << 3); ++ else if (mv->row > xd->mb_to_bottom_edge + (18 << 3)) ++ mv->row = xd->mb_to_bottom_edge + (16 << 3); ++} ++ ++/* A version of the above function for chroma block MVs.*/ ++static void clamp_uvmv_to_umv_border(MV *mv, const MACROBLOCKD *xd) ++{ ++ if (2*mv->col < (xd->mb_to_left_edge - (19 << 3))) ++ mv->col = (xd->mb_to_left_edge - (16 << 3)) >> 1; ++ else if (2*mv->col > xd->mb_to_right_edge + (18 << 3)) ++ mv->col = (xd->mb_to_right_edge + (16 << 3)) >> 1; ++ ++ if (2*mv->row < (xd->mb_to_top_edge - (19 << 3))) ++ mv->row = (xd->mb_to_top_edge - (16 << 3)) >> 1; ++ else if (2*mv->row > xd->mb_to_bottom_edge + (18 << 3)) ++ mv->row = (xd->mb_to_bottom_edge + (16 << 3)) >> 1; ++} ++ ++static void clamp_mvs(MACROBLOCKD *xd) ++{ ++ if (xd->mbmi.mode == SPLITMV) ++ { ++ int i; ++ ++ for (i=0; i<16; i++) ++ clamp_mv_to_umv_border(&xd->block[i].bmi.mv.as_mv, xd); ++ for (i=16; i<24; i++) ++ clamp_uvmv_to_umv_border(&xd->block[i].bmi.mv.as_mv, xd); ++ } ++ else ++ { ++ clamp_mv_to_umv_border(&xd->mbmi.mv.as_mv, xd); ++ clamp_uvmv_to_umv_border(&xd->block[16].bmi.mv.as_mv, xd); ++ } ++ ++} ++ + static void reconstruct_mb(VP8D_COMP *pbi, MACROBLOCKD *xd) + { + if (xd->frame_type == KEY_FRAME || xd->mbmi.ref_frame == INTRA_FRAME) +@@ -232,6 +289,8 @@ static void de_quantand_idct(VP8D_COMP *pbi, MACROBLOCKD *xd) + void vp8_decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd) + { + int eobtotal = 0; ++ MV orig_mvs[24]; ++ int i, do_clamp = xd->mbmi.need_to_clamp_mvs; + + if (xd->mbmi.mb_skip_coeff) + { +@@ -242,20 +301,49 @@ void vp8_decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd) + eobtotal = vp8_decode_mb_tokens(pbi, xd); + } + ++ /* Perform temporary clamping of the MV to be used for prediction */ ++ if (do_clamp) ++ { ++ if (xd->mbmi.mode == SPLITMV) ++ for (i=0; i<24; i++) ++ orig_mvs[i] = xd->block[i].bmi.mv.as_mv; ++ else ++ { ++ orig_mvs[0] = xd->mbmi.mv.as_mv; ++ orig_mvs[1] = xd->block[16].bmi.mv.as_mv; ++ } ++ clamp_mvs(xd); ++ } ++ + xd->mode_info_context->mbmi.dc_diff = 1; + + if (xd->mbmi.mode != B_PRED && xd->mbmi.mode != SPLITMV && eobtotal == 0) + { + xd->mode_info_context->mbmi.dc_diff = 0; + skip_recon_mb(pbi, xd); +- return; + } ++ else ++ { ++ if (xd->segmentation_enabled) ++ mb_init_dequantizer(pbi, xd); + +- if (xd->segmentation_enabled) +- mb_init_dequantizer(pbi, xd); ++ de_quantand_idct(pbi, xd); ++ reconstruct_mb(pbi, xd); ++ } + +- de_quantand_idct(pbi, xd); +- reconstruct_mb(pbi, xd); ++ ++ /* Restore the original MV so as not to affect the entropy context. */ ++ if (do_clamp) ++ { ++ if (xd->mbmi.mode == SPLITMV) ++ for (i=0; i<24; i++) ++ xd->block[i].bmi.mv.as_mv = orig_mvs[i]; ++ else ++ { ++ xd->mbmi.mv.as_mv = orig_mvs[0]; ++ xd->block[16].bmi.mv.as_mv = orig_mvs[1]; ++ } ++ } + } + + static int get_delta_q(vp8_reader *bc, int prev, int *q_update) +@@ -313,7 +401,9 @@ void vp8_decode_mb_row(VP8D_COMP *pbi, + for (mb_col = 0; mb_col < pc->mb_cols; mb_col++) + { + // Take a copy of the mode and Mv information for this macroblock into the xd->mbmi +- vpx_memcpy(&xd->mbmi, &xd->mode_info_context->mbmi, 32); //sizeof(MB_MODE_INFO) ); ++ // the partition_bmi array is unused in the decoder, so don't copy it. ++ vpx_memcpy(&xd->mbmi, &xd->mode_info_context->mbmi, ++ sizeof(MB_MODE_INFO) - sizeof(xd->mbmi.partition_bmi)); + + if (xd->mbmi.mode == SPLITMV || xd->mbmi.mode == B_PRED) + { +@@ -360,7 +450,7 @@ void vp8_decode_mb_row(VP8D_COMP *pbi, + vp8_build_uvmvs(xd, pc->full_pixel); + + /* +- if(pbi->common.current_video_frame==0 &&mb_col==1 && mb_row==0) ++ if(pc->current_video_frame==0 &&mb_col==1 && mb_row==0) + pbi->debugoutput =1; + else + pbi->debugoutput =0; +@@ -609,7 +699,7 @@ int vp8_decode_frame(VP8D_COMP *pbi) + "Invalid frame height"); + } + +- if (vp8_alloc_frame_buffers(&pbi->common, pc->Width, pc->Height)) ++ if (vp8_alloc_frame_buffers(pc, pc->Width, pc->Height)) + vpx_internal_error(&pc->error, VPX_CODEC_MEM_ERROR, + "Failed to allocate frame buffers"); + } +@@ -846,17 +936,17 @@ int vp8_decode_frame(VP8D_COMP *pbi) + vpx_memcpy(&xd->block[0].bmi, &xd->mode_info_context->bmi[0], sizeof(B_MODE_INFO)); + + +- if (pbi->b_multithreaded_lf && pbi->common.filter_level != 0) ++ if (pbi->b_multithreaded_lf && pc->filter_level != 0) + vp8_start_lfthread(pbi); + +- if (pbi->b_multithreaded_rd && pbi->common.multi_token_partition != ONE_PARTITION) ++ if (pbi->b_multithreaded_rd && pc->multi_token_partition != ONE_PARTITION) + { + vp8_mtdecode_mb_rows(pbi, xd); + } + else + { + int ibc = 0; +- int num_part = 1 << pbi->common.multi_token_partition; ++ int num_part = 1 << pc->multi_token_partition; + + // Decode the individual macro block + for (mb_row = 0; mb_row < pc->mb_rows; mb_row++) +@@ -885,8 +975,11 @@ int vp8_decode_frame(VP8D_COMP *pbi) + // vpx_log("Decoder: Frame Decoded, Size Roughly:%d bytes \n",bc->pos+pbi->bc2.pos); + + // If this was a kf or Gf note the Q used +- if ((pc->frame_type == KEY_FRAME) || (pc->refresh_golden_frame) || pbi->common.refresh_alt_ref_frame) ++ if ((pc->frame_type == KEY_FRAME) || ++ pc->refresh_golden_frame || pc->refresh_alt_ref_frame) ++ { + pc->last_kf_gf_q = pc->base_qindex; ++ } + + if (pc->refresh_entropy_probs == 0) + { +diff --git a/vp8/decoder/demode.c b/vp8/decoder/demode.c +index fd05e6d..881b49e 100644 +--- a/vp8/decoder/demode.c ++++ b/vp8/decoder/demode.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/decoder/demode.h b/vp8/decoder/demode.h +index 51bbc5e..8d2fbee 100644 +--- a/vp8/decoder/demode.h ++++ b/vp8/decoder/demode.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/decoder/dequantize.c b/vp8/decoder/dequantize.c +index 14798d9..2c286ec 100644 +--- a/vp8/decoder/dequantize.c ++++ b/vp8/decoder/dequantize.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/decoder/dequantize.h b/vp8/decoder/dequantize.h +index d16b02e..7fd7cbb 100644 +--- a/vp8/decoder/dequantize.h ++++ b/vp8/decoder/dequantize.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/decoder/detokenize.c b/vp8/decoder/detokenize.c +index a42f18d..d6f5ca2 100644 +--- a/vp8/decoder/detokenize.c ++++ b/vp8/decoder/detokenize.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +@@ -65,25 +66,43 @@ void vp8_reset_mb_tokens_context(MACROBLOCKD *x) + + ENTROPY_CONTEXT *a; + ENTROPY_CONTEXT *l; +- int i; +- +- for (i = 0; i < 24; i++) +- { +- +- a = A[ vp8_block2context[i] ] + vp8_block2above[i]; +- l = L[ vp8_block2context[i] ] + vp8_block2left[i]; +- +- *a = *l = 0; +- } + ++ /* Clear entropy contexts for Y blocks */ ++ a = A[Y1CONTEXT]; ++ l = L[Y1CONTEXT]; ++ *a = 0; ++ *(a+1) = 0; ++ *(a+2) = 0; ++ *(a+3) = 0; ++ *l = 0; ++ *(l+1) = 0; ++ *(l+2) = 0; ++ *(l+3) = 0; ++ ++ /* Clear entropy contexts for U blocks */ ++ a = A[UCONTEXT]; ++ l = L[UCONTEXT]; ++ *a = 0; ++ *(a+1) = 0; ++ *l = 0; ++ *(l+1) = 0; ++ ++ /* Clear entropy contexts for V blocks */ ++ a = A[VCONTEXT]; ++ l = L[VCONTEXT]; ++ *a = 0; ++ *(a+1) = 0; ++ *l = 0; ++ *(l+1) = 0; ++ ++ /* Clear entropy contexts for Y2 blocks */ + if (x->mbmi.mode != B_PRED && x->mbmi.mode != SPLITMV) + { +- a = A[Y2CONTEXT] + vp8_block2above[24]; +- l = L[Y2CONTEXT] + vp8_block2left[24]; +- *a = *l = 0; ++ a = A[Y2CONTEXT]; ++ l = L[Y2CONTEXT]; ++ *a = 0; ++ *l = 0; + } +- +- + } + DECLARE_ALIGNED(16, extern const unsigned int, vp8dx_bitreader_norm[256]); + #define NORMALIZE \ +diff --git a/vp8/decoder/detokenize.h b/vp8/decoder/detokenize.h +index 6a9a476..6cfb66b 100644 +--- a/vp8/decoder/detokenize.h ++++ b/vp8/decoder/detokenize.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/decoder/generic/dsystemdependent.c b/vp8/decoder/generic/dsystemdependent.c +index 302b64b..ad64a38 100644 +--- a/vp8/decoder/generic/dsystemdependent.c ++++ b/vp8/decoder/generic/dsystemdependent.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/decoder/onyxd_if.c b/vp8/decoder/onyxd_if.c +index 6875585..76387f5 100644 +--- a/vp8/decoder/onyxd_if.c ++++ b/vp8/decoder/onyxd_if.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/decoder/onyxd_if_sjl.c b/vp8/decoder/onyxd_if_sjl.c +index 363ad5d..12d28a5 100644 +--- a/vp8/decoder/onyxd_if_sjl.c ++++ b/vp8/decoder/onyxd_if_sjl.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/decoder/onyxd_int.h b/vp8/decoder/onyxd_int.h +index fa4fa48..2eea614 100644 +--- a/vp8/decoder/onyxd_int.h ++++ b/vp8/decoder/onyxd_int.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/decoder/threading.c b/vp8/decoder/threading.c +index e35d175..87bba20 100644 +--- a/vp8/decoder/threading.c ++++ b/vp8/decoder/threading.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +@@ -153,7 +154,9 @@ THREAD_FUNCTION vp8_thread_decoding_proc(void *p_data) + } + + // Take a copy of the mode and Mv information for this macroblock into the xd->mbmi +- vpx_memcpy(&xd->mbmi, &xd->mode_info_context->mbmi, 32); //sizeof(MB_MODE_INFO) ); ++ // the partition_bmi array is unused in the decoder, so don't copy it. ++ vpx_memcpy(&xd->mbmi, &xd->mode_info_context->mbmi, ++ sizeof(MB_MODE_INFO) - sizeof(xd->mbmi.partition_bmi)); + + if (xd->mbmi.mode == SPLITMV || xd->mbmi.mode == B_PRED) + { +diff --git a/vp8/decoder/treereader.h b/vp8/decoder/treereader.h +index eb10e24..f1893df 100644 +--- a/vp8/decoder/treereader.h ++++ b/vp8/decoder/treereader.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/decoder/x86/dequantize_mmx.asm b/vp8/decoder/x86/dequantize_mmx.asm +index 02be487..1611e03 100644 +--- a/vp8/decoder/x86/dequantize_mmx.asm ++++ b/vp8/decoder/x86/dequantize_mmx.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/decoder/x86/dequantize_x86.h b/vp8/decoder/x86/dequantize_x86.h +index 5def406..4c91633 100644 +--- a/vp8/decoder/x86/dequantize_x86.h ++++ b/vp8/decoder/x86/dequantize_x86.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/decoder/x86/onyxdxv.c b/vp8/decoder/x86/onyxdxv.c +index 75a676a..22d0548 100644 +--- a/vp8/decoder/x86/onyxdxv.c ++++ b/vp8/decoder/x86/onyxdxv.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/decoder/x86/x86_dsystemdependent.c b/vp8/decoder/x86/x86_dsystemdependent.c +index 6d7cc36..2dfb469 100644 +--- a/vp8/decoder/x86/x86_dsystemdependent.c ++++ b/vp8/decoder/x86/x86_dsystemdependent.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/decoder/xprintf.c b/vp8/decoder/xprintf.c +index cb2221c..7465010 100644 +--- a/vp8/decoder/xprintf.c ++++ b/vp8/decoder/xprintf.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/decoder/xprintf.h b/vp8/decoder/xprintf.h +index 2f175e9..7656075 100644 +--- a/vp8/decoder/xprintf.h ++++ b/vp8/decoder/xprintf.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/arm/armv6/walsh_v6.asm b/vp8/encoder/arm/armv6/walsh_v6.asm +index 608c9ae..461e492 100644 +--- a/vp8/encoder/arm/armv6/walsh_v6.asm ++++ b/vp8/encoder/arm/armv6/walsh_v6.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + EXPORT |vp8_short_walsh4x4_armv6| +diff --git a/vp8/encoder/arm/boolhuff_arm.c b/vp8/encoder/arm/boolhuff_arm.c +index e70b3ad..8c0faff 100644 +--- a/vp8/encoder/arm/boolhuff_arm.c ++++ b/vp8/encoder/arm/boolhuff_arm.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/arm/csystemdependent.c b/vp8/encoder/arm/csystemdependent.c +index 0039796..7fba995 100644 +--- a/vp8/encoder/arm/csystemdependent.c ++++ b/vp8/encoder/arm/csystemdependent.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/arm/dct_arm.h b/vp8/encoder/arm/dct_arm.h +index a671862..bb60c9d 100644 +--- a/vp8/encoder/arm/dct_arm.h ++++ b/vp8/encoder/arm/dct_arm.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/arm/encodemb_arm.c b/vp8/encoder/arm/encodemb_arm.c +index 3f1d053..7d58f94 100644 +--- a/vp8/encoder/arm/encodemb_arm.c ++++ b/vp8/encoder/arm/encodemb_arm.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/arm/encodemb_arm.h b/vp8/encoder/arm/encodemb_arm.h +index 28f9e5c..525135a 100644 +--- a/vp8/encoder/arm/encodemb_arm.h ++++ b/vp8/encoder/arm/encodemb_arm.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/arm/mcomp_arm.c b/vp8/encoder/arm/mcomp_arm.c +index 07f2186..9418a60 100644 +--- a/vp8/encoder/arm/mcomp_arm.c ++++ b/vp8/encoder/arm/mcomp_arm.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/arm/neon/boolhuff_armv7.asm b/vp8/encoder/arm/neon/boolhuff_armv7.asm +index 9a5f366..674eea9 100644 +--- a/vp8/encoder/arm/neon/boolhuff_armv7.asm ++++ b/vp8/encoder/arm/neon/boolhuff_armv7.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/encoder/arm/neon/fastfdct4x4_neon.asm b/vp8/encoder/arm/neon/fastfdct4x4_neon.asm +index d5dec44..44e6dfc 100644 +--- a/vp8/encoder/arm/neon/fastfdct4x4_neon.asm ++++ b/vp8/encoder/arm/neon/fastfdct4x4_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/encoder/arm/neon/fastfdct8x4_neon.asm b/vp8/encoder/arm/neon/fastfdct8x4_neon.asm +index de1c254..6a286f6 100644 +--- a/vp8/encoder/arm/neon/fastfdct8x4_neon.asm ++++ b/vp8/encoder/arm/neon/fastfdct8x4_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/encoder/arm/neon/fastquantizeb_neon.asm b/vp8/encoder/arm/neon/fastquantizeb_neon.asm +index 1107037..e3a94a6 100644 +--- a/vp8/encoder/arm/neon/fastquantizeb_neon.asm ++++ b/vp8/encoder/arm/neon/fastquantizeb_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/encoder/arm/neon/sad16_neon.asm b/vp8/encoder/arm/neon/sad16_neon.asm +index 6169f10..7e2ab13 100644 +--- a/vp8/encoder/arm/neon/sad16_neon.asm ++++ b/vp8/encoder/arm/neon/sad16_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/encoder/arm/neon/sad8_neon.asm b/vp8/encoder/arm/neon/sad8_neon.asm +index 28604dd..fc8c4e1 100644 +--- a/vp8/encoder/arm/neon/sad8_neon.asm ++++ b/vp8/encoder/arm/neon/sad8_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/encoder/arm/neon/shortfdct_neon.asm b/vp8/encoder/arm/neon/shortfdct_neon.asm +index 26bc0d0..4399c97 100644 +--- a/vp8/encoder/arm/neon/shortfdct_neon.asm ++++ b/vp8/encoder/arm/neon/shortfdct_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/encoder/arm/neon/subtract_neon.asm b/vp8/encoder/arm/neon/subtract_neon.asm +index 8781ca0..d4803ff 100644 +--- a/vp8/encoder/arm/neon/subtract_neon.asm ++++ b/vp8/encoder/arm/neon/subtract_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/encoder/arm/neon/variance_neon.asm b/vp8/encoder/arm/neon/variance_neon.asm +index 64b83ca..b901693 100644 +--- a/vp8/encoder/arm/neon/variance_neon.asm ++++ b/vp8/encoder/arm/neon/variance_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/encoder/arm/neon/vp8_memcpy_neon.asm b/vp8/encoder/arm/neon/vp8_memcpy_neon.asm +index f26b4d7..0a372c3 100644 +--- a/vp8/encoder/arm/neon/vp8_memcpy_neon.asm ++++ b/vp8/encoder/arm/neon/vp8_memcpy_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/encoder/arm/neon/vp8_mse16x16_neon.asm b/vp8/encoder/arm/neon/vp8_mse16x16_neon.asm +index f535967..087ea17 100644 +--- a/vp8/encoder/arm/neon/vp8_mse16x16_neon.asm ++++ b/vp8/encoder/arm/neon/vp8_mse16x16_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/encoder/arm/neon/vp8_packtokens_armv7.asm b/vp8/encoder/arm/neon/vp8_packtokens_armv7.asm +index 9c52c52..bfa97d7 100644 +--- a/vp8/encoder/arm/neon/vp8_packtokens_armv7.asm ++++ b/vp8/encoder/arm/neon/vp8_packtokens_armv7.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/encoder/arm/neon/vp8_packtokens_mbrow_armv7.asm b/vp8/encoder/arm/neon/vp8_packtokens_mbrow_armv7.asm +index 92b0989..334c88f 100644 +--- a/vp8/encoder/arm/neon/vp8_packtokens_mbrow_armv7.asm ++++ b/vp8/encoder/arm/neon/vp8_packtokens_mbrow_armv7.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/encoder/arm/neon/vp8_packtokens_partitions_armv7.asm b/vp8/encoder/arm/neon/vp8_packtokens_partitions_armv7.asm +index 6d5f882..267e216 100644 +--- a/vp8/encoder/arm/neon/vp8_packtokens_partitions_armv7.asm ++++ b/vp8/encoder/arm/neon/vp8_packtokens_partitions_armv7.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/encoder/arm/neon/vp8_shortwalsh4x4_neon.asm b/vp8/encoder/arm/neon/vp8_shortwalsh4x4_neon.asm +index 5269c0a..ebd5dc1 100644 +--- a/vp8/encoder/arm/neon/vp8_shortwalsh4x4_neon.asm ++++ b/vp8/encoder/arm/neon/vp8_shortwalsh4x4_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/encoder/arm/neon/vp8_subpixelvariance16x16_neon.asm b/vp8/encoder/arm/neon/vp8_subpixelvariance16x16_neon.asm +index aec716e..185277f 100644 +--- a/vp8/encoder/arm/neon/vp8_subpixelvariance16x16_neon.asm ++++ b/vp8/encoder/arm/neon/vp8_subpixelvariance16x16_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/encoder/arm/neon/vp8_subpixelvariance16x16s_neon.asm b/vp8/encoder/arm/neon/vp8_subpixelvariance16x16s_neon.asm +index 3d02d7c..611b1e4 100644 +--- a/vp8/encoder/arm/neon/vp8_subpixelvariance16x16s_neon.asm ++++ b/vp8/encoder/arm/neon/vp8_subpixelvariance16x16s_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/encoder/arm/neon/vp8_subpixelvariance8x8_neon.asm b/vp8/encoder/arm/neon/vp8_subpixelvariance8x8_neon.asm +index bd56761..614d48f 100644 +--- a/vp8/encoder/arm/neon/vp8_subpixelvariance8x8_neon.asm ++++ b/vp8/encoder/arm/neon/vp8_subpixelvariance8x8_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/encoder/arm/picklpf_arm.c b/vp8/encoder/arm/picklpf_arm.c +index 0586e55..fb0b3bd 100644 +--- a/vp8/encoder/arm/picklpf_arm.c ++++ b/vp8/encoder/arm/picklpf_arm.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/arm/quantize_arm.c b/vp8/encoder/arm/quantize_arm.c +index 46906d3..e8bd44b 100644 +--- a/vp8/encoder/arm/quantize_arm.c ++++ b/vp8/encoder/arm/quantize_arm.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/arm/quantize_arm.h b/vp8/encoder/arm/quantize_arm.h +index e93f0fe..14bc923 100644 +--- a/vp8/encoder/arm/quantize_arm.h ++++ b/vp8/encoder/arm/quantize_arm.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/arm/variance_arm.h b/vp8/encoder/arm/variance_arm.h +index d9fc9b3..1c16020 100644 +--- a/vp8/encoder/arm/variance_arm.h ++++ b/vp8/encoder/arm/variance_arm.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/arm/vpx_vp8_enc_asm_offsets.c b/vp8/encoder/arm/vpx_vp8_enc_asm_offsets.c +index 8cdf079..28aac70 100644 +--- a/vp8/encoder/arm/vpx_vp8_enc_asm_offsets.c ++++ b/vp8/encoder/arm/vpx_vp8_enc_asm_offsets.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/bitstream.c b/vp8/encoder/bitstream.c +index 31ad56a..ce9d2fd 100644 +--- a/vp8/encoder/bitstream.c ++++ b/vp8/encoder/bitstream.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +@@ -1385,8 +1386,6 @@ void vp8_pack_bitstream(VP8_COMP *cpi, unsigned char *dest, unsigned long *size) + // every keyframe send startcode, width, height, scale factor, clamp and color type + if (oh.type == KEY_FRAME) + { +- int w, h, hs, vs; +- + // Start / synch code + cx_data[0] = 0x9D; + cx_data[1] = 0x01; +diff --git a/vp8/encoder/bitstream.h b/vp8/encoder/bitstream.h +index ee69f66..de4b94d 100644 +--- a/vp8/encoder/bitstream.h ++++ b/vp8/encoder/bitstream.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/block.h b/vp8/encoder/block.h +index cc4cbe0..2e866dd 100644 +--- a/vp8/encoder/block.h ++++ b/vp8/encoder/block.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +@@ -101,11 +102,9 @@ typedef struct + void (*vp8_short_fdct8x4)(short *input, short *output, int pitch); + void (*short_fdct4x4rd)(short *input, short *output, int pitch); + void (*short_fdct8x4rd)(short *input, short *output, int pitch); +- void (*vp8_short_fdct4x4_ptr)(short *input, short *output, int pitch); + void (*short_walsh4x4)(short *input, short *output, int pitch); + + void (*quantize_b)(BLOCK *b, BLOCKD *d); +- void (*quantize_brd)(BLOCK *b, BLOCKD *d); + + + +diff --git a/vp8/encoder/boolhuff.c b/vp8/encoder/boolhuff.c +index c101384..2e95c75 100644 +--- a/vp8/encoder/boolhuff.c ++++ b/vp8/encoder/boolhuff.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/boolhuff.h b/vp8/encoder/boolhuff.h +index 0d929f0..95635e3 100644 +--- a/vp8/encoder/boolhuff.h ++++ b/vp8/encoder/boolhuff.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/dct.c b/vp8/encoder/dct.c +index 5207e39..4f5f9f0 100644 +--- a/vp8/encoder/dct.c ++++ b/vp8/encoder/dct.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/dct.h b/vp8/encoder/dct.h +index fb307cf..2aaf731 100644 +--- a/vp8/encoder/dct.h ++++ b/vp8/encoder/dct.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/encodeframe.c b/vp8/encoder/encodeframe.c +index a4e3772..46b697e 100644 +--- a/vp8/encoder/encodeframe.c ++++ b/vp8/encoder/encodeframe.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/encodeintra.c b/vp8/encoder/encodeintra.c +index 403d020..d632bd8 100644 +--- a/vp8/encoder/encodeintra.c ++++ b/vp8/encoder/encodeintra.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +@@ -67,7 +68,7 @@ void vp8_encode_intra4x4block_rd(const VP8_ENCODER_RTCD *rtcd, MACROBLOCK *x, BL + + x->short_fdct4x4rd(be->src_diff, be->coeff, 32); + +- x->quantize_brd(be, b); ++ x->quantize_b(be, b); + + x->e_mbd.mbmi.mb_skip_coeff &= (!b->eob); + +@@ -159,8 +160,7 @@ void vp8_encode_intra16x16mbyrd(const VP8_ENCODER_RTCD *rtcd, MACROBLOCK *x) + + x->e_mbd.mbmi.mb_skip_coeff = 1; + +- vp8_quantize_mbyrd(x); +- ++ vp8_quantize_mby(x); + + vp8_inverse_transform_mby(IF_RTCD(&rtcd->common->idct), &x->e_mbd); + +@@ -226,9 +226,7 @@ void vp8_encode_intra16x16mbuvrd(const VP8_ENCODER_RTCD *rtcd, MACROBLOCK *x) + + vp8_transform_mbuvrd(x); + +- vp8_quantize_mbuvrd(x); +- +- ++ vp8_quantize_mbuv(x); + + vp8_inverse_transform_mbuv(IF_RTCD(&rtcd->common->idct), &x->e_mbd); + +diff --git a/vp8/encoder/encodeintra.h b/vp8/encoder/encodeintra.h +index 4a43ab2..49b3257 100644 +--- a/vp8/encoder/encodeintra.h ++++ b/vp8/encoder/encodeintra.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/encodemb.c b/vp8/encoder/encodemb.c +index d825133..a66b90c 100644 +--- a/vp8/encoder/encodemb.c ++++ b/vp8/encoder/encodemb.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +@@ -493,140 +494,6 @@ void vp8_optimize_b(MACROBLOCK *x, int i, int type, ENTROPY_CONTEXT *a, ENTROPY_ + return; + } + +-void vp8_optimize_bplus(MACROBLOCK *x, int i, int type, ENTROPY_CONTEXT *a, ENTROPY_CONTEXT *l, const VP8_ENCODER_RTCD *rtcd) +-{ +- BLOCK *b = &x->block[i]; +- BLOCKD *bd = &x->e_mbd.block[i]; +- short *dequant_ptr = &bd->dequant[0][0]; +- int nzpos[16] = {0}; +- short saved_qcoefs[16]; +- short saved_dqcoefs[16]; +- int baserate, baseerror, baserd; +- int rate, error, thisrd; +- int k; +- int nzcoefcount = 0; +- int nc, bestnc = 0; +- int besteob; +- +- // count potential coefficient to be optimized +- for (k = !type; k < 16; k++) +- { +- int qcoef = abs(bd->qcoeff[k]); +- int coef = abs(b->coeff[k]); +- int dq = dequant_ptr[k]; +- +- if (qcoef && (qcoef * dq < coef) && (coef < (qcoef * dq + dq))) +- { +- nzpos[nzcoefcount] = k; +- nzcoefcount++; +- } +- } +- +- // if nothing here, do nothing for this block. +- if (!nzcoefcount) +- { +- //do not update context, we need do the other half. +- //*a = *l = (bd->eob != !type); +- return; +- } +- +- // save a copy of quantized coefficients +- vpx_memcpy(saved_qcoefs, bd->qcoeff, 32); +- vpx_memcpy(saved_dqcoefs, bd->dqcoeff, 32); +- +- besteob = bd->eob; +- baserate = cost_coeffs(x, bd, type, a, l); +- baseerror = ENCODEMB_INVOKE(&rtcd->encodemb, berr)(b->coeff, bd->dqcoeff) >> 2; +- baserd = RDFUNC(x->rdmult, x->rddiv, baserate, baseerror, 100); +- +- for (nc = 1; nc < (1 << nzcoefcount); nc++) +- { +- //reset coefficients +- vpx_memcpy(bd->qcoeff, saved_qcoefs, 32); +- vpx_memcpy(bd->dqcoeff, saved_dqcoefs, 32); +- +- for (k = 0; k < nzcoefcount; k++) +- { +- int pos = nzpos[k]; +- +- if ((nc & (1 << k))) +- { +- int cur_qcoef = bd->qcoeff[pos]; +- +- if (cur_qcoef < 0) +- { +- bd->qcoeff[pos]--; +- bd->dqcoeff[pos] = bd->qcoeff[pos] * dequant_ptr[pos]; +- } +- else +- { +- bd->qcoeff[pos]++; +- bd->dqcoeff[pos] = bd->qcoeff[pos] * dequant_ptr[pos]; +- } +- } +- } +- +- { +- int eob = -1; +- int rc; +- int m; +- +- for (m = 0; m < 16; m++) +- { +- rc = vp8_default_zig_zag1d[m]; +- +- if (bd->qcoeff[rc]) +- eob = m; +- } +- +- bd->eob = eob + 1; +- } +- +- rate = cost_coeffs(x, bd, type, a, l); +- error = ENCODEMB_INVOKE(&rtcd->encodemb, berr)(b->coeff, bd->dqcoeff) >> 2; +- thisrd = RDFUNC(x->rdmult, x->rddiv, rate, error, 100); +- +- if (thisrd < baserd) +- { +- baserd = thisrd; +- bestnc = nc; +- besteob = bd->eob; +- } +- } +- +- //reset coefficients +- vpx_memcpy(bd->qcoeff, saved_qcoefs, 32); +- vpx_memcpy(bd->dqcoeff, saved_dqcoefs, 32); +- +- if (bestnc) +- { +- for (k = 0; k < nzcoefcount; k++) +- { +- int pos = nzpos[k]; +- +- if (bestnc & (1 << k)) +- { +- int cur_qcoef = bd->qcoeff[pos]; +- +- if (cur_qcoef < 0) +- { +- bd->qcoeff[pos]++; +- bd->dqcoeff[pos] = bd->qcoeff[pos] * dequant_ptr[pos]; +- } +- else +- { +- bd->qcoeff[pos]--; +- bd->dqcoeff[pos] = bd->qcoeff[pos] * dequant_ptr[pos]; +- } +- } +- } +- } +- +- bd->eob = besteob; +- //do not update context, we need do the other half. +- //*a = *l = (bd->eob != !type); +- return; +-} + + void vp8_optimize_y2b(MACROBLOCK *x, int i, int type, ENTROPY_CONTEXT *a, ENTROPY_CONTEXT *l, const VP8_ENCODER_RTCD *rtcd) + { +@@ -718,7 +585,6 @@ void vp8_optimize_y2b(MACROBLOCK *x, int i, int type, ENTROPY_CONTEXT *a, ENTROP + + void vp8_optimize_mb(MACROBLOCK *x, const VP8_ENCODER_RTCD *rtcd) + { +- int cost = 0; + int b; + TEMP_CONTEXT t, t2; + int type = 0; +@@ -752,181 +618,6 @@ void vp8_optimize_mb(MACROBLOCK *x, const VP8_ENCODER_RTCD *rtcd) + + + +-void vp8_super_slow_yquant_optimization(MACROBLOCK *x, int type, const VP8_ENCODER_RTCD *rtcd) +-{ +- BLOCK *b = &x->block[0]; +- BLOCKD *bd = &x->e_mbd.block[0]; +- short *dequant_ptr = &bd->dequant[0][0]; +- struct +- { +- int block; +- int pos; +- } nzpos[256]; +- short saved_qcoefs[256]; +- short saved_dqcoefs[256]; +- short *coef_ptr = x->coeff; +- short *qcoef_ptr = x->e_mbd.qcoeff; +- short *dqcoef_ptr = x->e_mbd.dqcoeff; +- +- int baserate, baseerror, baserd; +- int rate, error, thisrd; +- int i, k; +- int nzcoefcount = 0; +- int nc, bestnc = 0; +- int besteob; +- +- //this code has assumption in macroblock coeff buffer layout +- for (i = 0; i < 16; i++) +- { +- // count potential coefficient to be optimized +- for (k = !type; k < 16; k++) +- { +- int qcoef = abs(qcoef_ptr[i*16 + k]); +- int coef = abs(coef_ptr[i*16 + k]); +- int dq = dequant_ptr[k]; +- +- if (qcoef && (qcoef * dq > coef) && (qcoef * dq < coef + dq)) +- { +- nzpos[nzcoefcount].block = i; +- nzpos[nzcoefcount].pos = k; +- nzcoefcount++; +- } +- } +- } +- +- // if nothing here, do nothing for this macro_block. +- if (!nzcoefcount || nzcoefcount > 15) +- { +- return; +- } +- +- /****************************************************************************** +- looking from each coeffient's perspective, each identifed coefficent above could +- have 2 values:roundeddown(x) and roundedup(x). Therefore the total number of +- different states is less than 2**nzcoefcount. +- ******************************************************************************/ +- // save the qunatized coefficents and dequantized coefficicents +- vpx_memcpy(saved_qcoefs, x->e_mbd.qcoeff, 256); +- vpx_memcpy(saved_dqcoefs, x->e_mbd.dqcoeff, 256); +- +- baserate = mbycost_coeffs(x); +- baseerror = ENCODEMB_INVOKE(&rtcd->encodemb, mberr)(x, !type); +- baserd = RDFUNC(x->rdmult, x->rddiv, baserate, baseerror, 100); +- +- for (nc = 1; nc < (1 << nzcoefcount); nc++) +- { +- //reset coefficients +- vpx_memcpy(x->e_mbd.qcoeff, saved_qcoefs, 256); +- vpx_memcpy(x->e_mbd.dqcoeff, saved_dqcoefs, 256); +- +- for (k = 0; k < nzcoefcount; k++) +- { +- int bk = nzpos[k].block; +- int pos = nzpos[k].pos; +- int mbkpos = bk * 16 + pos; +- +- if ((nc & (1 << k))) +- { +- int cur_qcoef = x->e_mbd.qcoeff[mbkpos]; +- +- if (cur_qcoef < 0) +- { +- x->e_mbd.qcoeff[mbkpos]++; +- x->e_mbd.dqcoeff[mbkpos] = x->e_mbd.qcoeff[mbkpos] * dequant_ptr[pos]; +- } +- else +- { +- x->e_mbd.qcoeff[mbkpos]--; +- x->e_mbd.dqcoeff[mbkpos] = x->e_mbd.qcoeff[mbkpos] * dequant_ptr[pos]; +- } +- } +- } +- +- for (i = 0; i < 16; i++) +- { +- BLOCKD *bd = &x->e_mbd.block[i]; +- { +- int eob = -1; +- int rc; +- int l; +- +- for (l = 0; l < 16; l++) +- { +- rc = vp8_default_zig_zag1d[l]; +- +- if (bd->qcoeff[rc]) +- eob = l; +- } +- +- bd->eob = eob + 1; +- } +- } +- +- rate = mbycost_coeffs(x); +- error = ENCODEMB_INVOKE(&rtcd->encodemb, mberr)(x, !type);; +- thisrd = RDFUNC(x->rdmult, x->rddiv, rate, error, 100); +- +- if (thisrd < baserd) +- { +- baserd = thisrd; +- bestnc = nc; +- besteob = bd->eob; +- } +- } +- +- //reset coefficients +- vpx_memcpy(x->e_mbd.qcoeff, saved_qcoefs, 256); +- vpx_memcpy(x->e_mbd.dqcoeff, saved_dqcoefs, 256); +- +- if (bestnc) +- { +- for (k = 0; k < nzcoefcount; k++) +- { +- int bk = nzpos[k].block; +- int pos = nzpos[k].pos; +- int mbkpos = bk * 16 + pos; +- +- if ((nc & (1 << k))) +- { +- int cur_qcoef = x->e_mbd.qcoeff[mbkpos]; +- +- if (cur_qcoef < 0) +- { +- x->e_mbd.qcoeff[mbkpos]++; +- x->e_mbd.dqcoeff[mbkpos] = x->e_mbd.qcoeff[mbkpos] * dequant_ptr[pos]; +- } +- else +- { +- x->e_mbd.qcoeff[mbkpos]--; +- x->e_mbd.dqcoeff[mbkpos] = x->e_mbd.qcoeff[mbkpos] * dequant_ptr[pos]; +- } +- } +- } +- } +- +- for (i = 0; i < 16; i++) +- { +- BLOCKD *bd = &x->e_mbd.block[i]; +- { +- int eob = -1; +- int rc; +- int l; +- +- for (l = 0; l < 16; l++) +- { +- rc = vp8_default_zig_zag1d[l]; +- +- if (bd->qcoeff[rc]) +- eob = l; +- } +- +- bd->eob = eob + 1; +- } +- } +- +- return; +-} +- + static void vp8_find_mb_skip_coef(MACROBLOCK *x) + { + int i; +@@ -955,46 +646,8 @@ static void vp8_find_mb_skip_coef(MACROBLOCK *x) + } + + +-void vp8_optimize_mb_slow(MACROBLOCK *x, const VP8_ENCODER_RTCD *rtcd) +-{ +- int cost = 0; +- int b; +- TEMP_CONTEXT t, t2; +- int type = 0; +- +- +- vp8_setup_temp_context(&t, x->e_mbd.above_context[Y1CONTEXT], x->e_mbd.left_context[Y1CONTEXT], 4); +- +- if (x->e_mbd.mbmi.mode == SPLITMV || x->e_mbd.mbmi.mode == B_PRED) +- type = 3; +- +- vp8_super_slow_yquant_optimization(x, type, rtcd); +- /* +- for(b=0;b<16;b++) +- { +- vp8_optimize_b(x, b, type, t.a + vp8_block2above[b], t.l + vp8_block2left[b]); +- } +- */ +- +- vp8_setup_temp_context(&t, x->e_mbd.above_context[UCONTEXT], x->e_mbd.left_context[UCONTEXT], 2); +- +- for (b = 16; b < 20; b++) +- { +- vp8_optimize_b(x, b, vp8_block2type[b], t.a + vp8_block2above[b], t.l + vp8_block2left[b], rtcd); +- } +- +- vp8_setup_temp_context(&t2, x->e_mbd.above_context[VCONTEXT], x->e_mbd.left_context[VCONTEXT], 2); +- +- for (b = 20; b < 24; b++) +- { +- vp8_optimize_b(x, b, vp8_block2type[b], t2.a + vp8_block2above[b], t2.l + vp8_block2left[b], rtcd); +- } +-} +- +- + void vp8_optimize_mby(MACROBLOCK *x, const VP8_ENCODER_RTCD *rtcd) + { +- int cost = 0; + int b; + TEMP_CONTEXT t; + int type = 0; +@@ -1019,10 +672,8 @@ void vp8_optimize_mby(MACROBLOCK *x, const VP8_ENCODER_RTCD *rtcd) + + void vp8_optimize_mbuv(MACROBLOCK *x, const VP8_ENCODER_RTCD *rtcd) + { +- int cost = 0; + int b; + TEMP_CONTEXT t, t2; +- int type = 0; + + if (!x->e_mbd.above_context[UCONTEXT]) + return; +@@ -1124,6 +775,6 @@ void vp8_encode_inter16x16uvrd(const VP8_ENCODER_RTCD *rtcd, MACROBLOCK *x) + + vp8_transform_mbuvrd(x); + +- vp8_quantize_mbuvrd(x); ++ vp8_quantize_mbuv(x); + + } +diff --git a/vp8/encoder/encodemb.h b/vp8/encoder/encodemb.h +index 91ca8f5..5285a38 100644 +--- a/vp8/encoder/encodemb.h ++++ b/vp8/encoder/encodemb.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/encodemv.c b/vp8/encoder/encodemv.c +index f287edc..3b58a80 100644 +--- a/vp8/encoder/encodemv.c ++++ b/vp8/encoder/encodemv.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +@@ -282,8 +283,6 @@ static void write_component_probs( + + //j=0 + { +- int j = 0; +- + const int c = events [mv_max]; + + is_short_ct [0] += c; // Short vector +diff --git a/vp8/encoder/encodemv.h b/vp8/encoder/encodemv.h +index 1c1f450..bf6d7af 100644 +--- a/vp8/encoder/encodemv.h ++++ b/vp8/encoder/encodemv.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/ethreading.c b/vp8/encoder/ethreading.c +index a0b50d2..11b1936 100644 +--- a/vp8/encoder/ethreading.c ++++ b/vp8/encoder/ethreading.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +@@ -259,10 +260,8 @@ static void setup_mbby_copy(MACROBLOCK *mbdst, MACROBLOCK *mbsrc) + z->short_fdct4x4rd = x->short_fdct4x4rd; + z->short_fdct8x4rd = x->short_fdct8x4rd; + z->short_fdct8x4rd = x->short_fdct8x4rd; +- z->vp8_short_fdct4x4_ptr = x->vp8_short_fdct4x4_ptr; + z->short_walsh4x4 = x->short_walsh4x4; + z->quantize_b = x->quantize_b; +- z->quantize_brd = x->quantize_brd; + + /* + z->mvc = x->mvc; +diff --git a/vp8/encoder/firstpass.c b/vp8/encoder/firstpass.c +index c519080..ced2d7c 100644 +--- a/vp8/encoder/firstpass.c ++++ b/vp8/encoder/firstpass.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +@@ -175,7 +176,6 @@ static double calculate_modified_err(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame) + double vp8_simple_weight(YV12_BUFFER_CONFIG *source) + { + int i, j; +- int Total = 0; + + unsigned char *src = source->y_buffer; + unsigned char value; +@@ -779,7 +779,6 @@ void vp8_first_pass(VP8_COMP *cpi) + vp8_clear_system_state(); //__asm emms; + { + double weight = 0.0; +- double weigth2 = 0.0; + + FIRSTPASS_STATS fps; + +@@ -1193,7 +1192,6 @@ static void define_gf_group(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame) + FIRSTPASS_STATS next_frame; + FIRSTPASS_STATS *start_pos; + int i; +- int count = 0; + int image_size = cpi->common.last_frame.y_width * cpi->common.last_frame.y_height; + double boost_score = 0.0; + double old_boost_score = 0.0; +@@ -1234,6 +1232,8 @@ static void define_gf_group(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame) + + start_pos = cpi->stats_in; + ++ vpx_memset(&next_frame, 0, sizeof(next_frame)); // assure clean ++ + // Preload the stats for the next frame. + mod_frame_err = calculate_modified_err(cpi, this_frame); + +@@ -1871,6 +1871,18 @@ void vp8_second_pass(VP8_COMP *cpi) + } + } + ++ // Keep a globally available copy of this and the next frame's iiratio. ++ cpi->this_iiratio = this_frame_intra_error / ++ DOUBLE_DIVIDE_CHECK(this_frame_coded_error); ++ { ++ FIRSTPASS_STATS next_frame; ++ if ( lookup_next_frame_stats(cpi, &next_frame) != EOF ) ++ { ++ cpi->next_iiratio = next_frame.intra_error / ++ DOUBLE_DIVIDE_CHECK(next_frame.coded_error); ++ } ++ } ++ + // Set nominal per second bandwidth for this frame + cpi->target_bandwidth = cpi->per_frame_bandwidth * cpi->output_frame_rate; + if (cpi->target_bandwidth < 0) +@@ -2028,6 +2040,8 @@ void vp8_find_next_key_frame(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame) + double kf_group_coded_err = 0.0; + double two_pass_min_rate = (double)(cpi->oxcf.target_bandwidth * cpi->oxcf.two_pass_vbrmin_section / 100); + ++ vpx_memset(&next_frame, 0, sizeof(next_frame)); // assure clean ++ + vp8_clear_system_state(); //__asm emms; + start_position = cpi->stats_in; + +diff --git a/vp8/encoder/firstpass.h b/vp8/encoder/firstpass.h +index d7b52f3..48257ce 100644 +--- a/vp8/encoder/firstpass.h ++++ b/vp8/encoder/firstpass.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/generic/csystemdependent.c b/vp8/encoder/generic/csystemdependent.c +index 52aab66..96028b3 100644 +--- a/vp8/encoder/generic/csystemdependent.c ++++ b/vp8/encoder/generic/csystemdependent.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/mcomp.c b/vp8/encoder/mcomp.c +index d80059d..3c1507f 100644 +--- a/vp8/encoder/mcomp.c ++++ b/vp8/encoder/mcomp.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +@@ -1137,7 +1138,6 @@ int vp8_diamond_search_sadx4 + } + + +-#if !(CONFIG_REALTIME_ONLY) + int vp8_full_search_sad(MACROBLOCK *x, BLOCK *b, BLOCKD *d, MV *ref_mv, int error_per_bit, int distance, vp8_variance_fn_ptr_t *fn_ptr, int *mvcost[2], int *mvsadcost[2]) + { + unsigned char *what = (*(b->base_src) + b->src); +@@ -1350,7 +1350,6 @@ int vp8_full_search_sadx3(MACROBLOCK *x, BLOCK *b, BLOCKD *d, MV *ref_mv, int er + else + return INT_MAX; + } +-#endif + + #ifdef ENTROPY_STATS + void print_mode_context(void) +diff --git a/vp8/encoder/mcomp.h b/vp8/encoder/mcomp.h +index 921206f..40cbb07 100644 +--- a/vp8/encoder/mcomp.h ++++ b/vp8/encoder/mcomp.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/modecosts.c b/vp8/encoder/modecosts.c +index 73170cf..6632a36 100644 +--- a/vp8/encoder/modecosts.c ++++ b/vp8/encoder/modecosts.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/modecosts.h b/vp8/encoder/modecosts.h +index 5ade265..0c46acd 100644 +--- a/vp8/encoder/modecosts.h ++++ b/vp8/encoder/modecosts.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/onyx_if.c b/vp8/encoder/onyx_if.c +index 7662720..98827f9 100644 +--- a/vp8/encoder/onyx_if.c ++++ b/vp8/encoder/onyx_if.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +@@ -281,7 +282,6 @@ static void segmentation_test_function(VP8_PTR ptr) + + unsigned char *seg_map; + signed char feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS]; +- int i, j; + + // Create a temporary map for segmentation data. + CHECK_MEM_ERROR(seg_map, vpx_calloc(cpi->common.mb_rows * cpi->common.mb_cols, 1)); +@@ -811,7 +811,7 @@ void vp8_set_speed_features(VP8_COMP *cpi) + sf->full_freq[1] = 31; + sf->search_method = NSTEP; + +- if (!cpi->ref_frame_flags & VP8_LAST_FLAG) ++ if (!(cpi->ref_frame_flags & VP8_LAST_FLAG)) + { + sf->thresh_mult[THR_NEWMV ] = INT_MAX; + sf->thresh_mult[THR_NEARESTMV] = INT_MAX; +@@ -820,7 +820,7 @@ void vp8_set_speed_features(VP8_COMP *cpi) + sf->thresh_mult[THR_SPLITMV ] = INT_MAX; + } + +- if (!cpi->ref_frame_flags & VP8_GOLD_FLAG) ++ if (!(cpi->ref_frame_flags & VP8_GOLD_FLAG)) + { + sf->thresh_mult[THR_NEARESTG ] = INT_MAX; + sf->thresh_mult[THR_ZEROG ] = INT_MAX; +@@ -829,7 +829,7 @@ void vp8_set_speed_features(VP8_COMP *cpi) + sf->thresh_mult[THR_SPLITG ] = INT_MAX; + } + +- if (!cpi->ref_frame_flags & VP8_ALT_FLAG) ++ if (!(cpi->ref_frame_flags & VP8_ALT_FLAG)) + { + sf->thresh_mult[THR_NEARESTA ] = INT_MAX; + sf->thresh_mult[THR_ZEROA ] = INT_MAX; +@@ -1144,18 +1144,15 @@ void vp8_set_speed_features(VP8_COMP *cpi) + cpi->mb.short_fdct4x4rd = FDCT_INVOKE(&cpi->rtcd.fdct, fast4x4); + } + +- cpi->mb.vp8_short_fdct4x4_ptr = FDCT_INVOKE(&cpi->rtcd.fdct, short4x4); + cpi->mb.short_walsh4x4 = FDCT_INVOKE(&cpi->rtcd.fdct, walsh_short4x4); + + if (cpi->sf.improved_quant) + { + cpi->mb.quantize_b = QUANTIZE_INVOKE(&cpi->rtcd.quantize, quantb); +- cpi->mb.quantize_brd = QUANTIZE_INVOKE(&cpi->rtcd.quantize, quantb); + } + else + { + cpi->mb.quantize_b = QUANTIZE_INVOKE(&cpi->rtcd.quantize, fastquantb); +- cpi->mb.quantize_brd = QUANTIZE_INVOKE(&cpi->rtcd.quantize, fastquantb); + } + + #if CONFIG_RUNTIME_CPU_DETECT +@@ -2252,7 +2249,7 @@ void vp8_remove_compressor(VP8_PTR *ptr) + double total_psnr2 = vp8_mse2psnr(samples, 255.0, cpi->total_sq_error2); + double total_ssim = 100 * pow(cpi->summed_quality / cpi->summed_weights, 8.0); + +- fprintf(f, "Bitrate\AVGPsnr\tGLBPsnr\tAVPsnrP\tGLPsnrP\tVPXSSIM\t Time(us)\n"); ++ fprintf(f, "Bitrate\tAVGPsnr\tGLBPsnr\tAVPsnrP\tGLPsnrP\tVPXSSIM\t Time(us)\n"); + fprintf(f, "%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f %8.0f\n", + dr, cpi->total / cpi->count, total_psnr, cpi->totalp / cpi->count, total_psnr2, total_ssim, + total_encode_time); +@@ -4739,7 +4736,6 @@ void vp8_check_gf_quality(VP8_COMP *cpi) + #if !(CONFIG_REALTIME_ONLY) + static void Pass2Encode(VP8_COMP *cpi, unsigned long *size, unsigned char *dest, unsigned int *frame_flags) + { +- double two_pass_min_rate = (double)(cpi->oxcf.target_bandwidth * cpi->oxcf.two_pass_vbrmin_section / 100); + + if (!cpi->common.refresh_alt_ref_frame) + vp8_second_pass(cpi); +@@ -4748,7 +4744,11 @@ static void Pass2Encode(VP8_COMP *cpi, unsigned long *size, unsigned char *dest, + cpi->bits_left -= 8 * *size; + + if (!cpi->common.refresh_alt_ref_frame) ++ { ++ double two_pass_min_rate = (double)(cpi->oxcf.target_bandwidth ++ *cpi->oxcf.two_pass_vbrmin_section / 100); + cpi->bits_left += (long long)(two_pass_min_rate / cpi->oxcf.frame_rate); ++ } + } + #endif + +@@ -5402,7 +5402,7 @@ int vp8_calc_low_ss_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest, co + { + for (j = 0; j < source->y_width; j += 16) + { +- unsigned int sse, sse2, sum2; ++ unsigned int sse; + VARIANCE_INVOKE(rtcd, mse16x16)(src + j, source->y_stride, dst + j, dest->y_stride, &sse); + + if (sse < 8096) +diff --git a/vp8/encoder/onyx_int.h b/vp8/encoder/onyx_int.h +index 29b120e..889bf73 100644 +--- a/vp8/encoder/onyx_int.h ++++ b/vp8/encoder/onyx_int.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +@@ -25,7 +26,7 @@ + #include "entropy.h" + #include "threading.h" + #include "vpx_ports/mem.h" +-#include "vpx_codec/internal/vpx_codec_internal.h" ++#include "vpx/internal/vpx_codec_internal.h" + #include "mcomp.h" + + #define INTRARDOPT +@@ -522,8 +523,8 @@ typedef struct + int motion_lvl; + int motion_speed; + int motion_var; +- int next_iiratio; +- int this_iiratio; ++ unsigned int next_iiratio; ++ unsigned int this_iiratio; + int this_frame_modified_error; + + double norm_intra_err_per_mb; +diff --git a/vp8/encoder/parms.cpp b/vp8/encoder/parms.cpp +index 66fdafb..d7d30a8 100644 +--- a/vp8/encoder/parms.cpp ++++ b/vp8/encoder/parms.cpp +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/pickinter.c b/vp8/encoder/pickinter.c +index d61e2ce..a50f99b 100644 +--- a/vp8/encoder/pickinter.c ++++ b/vp8/encoder/pickinter.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +@@ -453,6 +454,7 @@ int vp8_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int rec + vpx_memset(mode_mv, 0, sizeof(mode_mv)); + vpx_memset(nearest_mv, 0, sizeof(nearest_mv)); + vpx_memset(near_mv, 0, sizeof(near_mv)); ++ vpx_memset(&best_mbmode, 0, sizeof(best_mbmode)); + + + // set up all the refframe dependent pointers. +diff --git a/vp8/encoder/pickinter.h b/vp8/encoder/pickinter.h +index fb28837..76fdb99 100644 +--- a/vp8/encoder/pickinter.h ++++ b/vp8/encoder/pickinter.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/picklpf.c b/vp8/encoder/picklpf.c +index bbd7840..0527b80 100644 +--- a/vp8/encoder/picklpf.c ++++ b/vp8/encoder/picklpf.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/ppc/csystemdependent.c b/vp8/encoder/ppc/csystemdependent.c +index f99277f..66fca8f 100644 +--- a/vp8/encoder/ppc/csystemdependent.c ++++ b/vp8/encoder/ppc/csystemdependent.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/ppc/encodemb_altivec.asm b/vp8/encoder/ppc/encodemb_altivec.asm +index e0e976d..14a36a1 100644 +--- a/vp8/encoder/ppc/encodemb_altivec.asm ++++ b/vp8/encoder/ppc/encodemb_altivec.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/encoder/ppc/fdct_altivec.asm b/vp8/encoder/ppc/fdct_altivec.asm +index eaab14c..01f3364 100644 +--- a/vp8/encoder/ppc/fdct_altivec.asm ++++ b/vp8/encoder/ppc/fdct_altivec.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/encoder/ppc/rdopt_altivec.asm b/vp8/encoder/ppc/rdopt_altivec.asm +index 917bfe0..4f9b050 100644 +--- a/vp8/encoder/ppc/rdopt_altivec.asm ++++ b/vp8/encoder/ppc/rdopt_altivec.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/encoder/ppc/sad_altivec.asm b/vp8/encoder/ppc/sad_altivec.asm +index 1102ccf..6d92728 100644 +--- a/vp8/encoder/ppc/sad_altivec.asm ++++ b/vp8/encoder/ppc/sad_altivec.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/encoder/ppc/variance_altivec.asm b/vp8/encoder/ppc/variance_altivec.asm +index 952bf72..4e3fd59 100644 +--- a/vp8/encoder/ppc/variance_altivec.asm ++++ b/vp8/encoder/ppc/variance_altivec.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/encoder/ppc/variance_subpixel_altivec.asm b/vp8/encoder/ppc/variance_subpixel_altivec.asm +index 148a8d2..4dcf7e4 100644 +--- a/vp8/encoder/ppc/variance_subpixel_altivec.asm ++++ b/vp8/encoder/ppc/variance_subpixel_altivec.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/encoder/preproc.c b/vp8/encoder/preproc.c +index d2a13dc..e9cc075 100644 +--- a/vp8/encoder/preproc.c ++++ b/vp8/encoder/preproc.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/psnr.c b/vp8/encoder/psnr.c +index 0e34cec..c5e9dad 100644 +--- a/vp8/encoder/psnr.c ++++ b/vp8/encoder/psnr.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/psnr.h b/vp8/encoder/psnr.h +index 9f6ca0b..dd0b4e5 100644 +--- a/vp8/encoder/psnr.h ++++ b/vp8/encoder/psnr.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/quantize.c b/vp8/encoder/quantize.c +index 6028ebf..73e80e3 100644 +--- a/vp8/encoder/quantize.c ++++ b/vp8/encoder/quantize.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +@@ -55,9 +56,7 @@ void vp8_fast_quantize_b_c(BLOCK *b, BLOCKD *d) + } + } + } +- + d->eob = eob + 1; +- + } + + void vp8_regular_quantize_b(BLOCK *b, BLOCKD *d) +@@ -111,61 +110,40 @@ void vp8_regular_quantize_b(BLOCK *b, BLOCKD *d) + + d->eob = eob + 1; + } ++ + void vp8_quantize_mby(MACROBLOCK *x) + { + int i; ++ int has_2nd_order = (x->e_mbd.mbmi.mode != B_PRED ++ && x->e_mbd.mbmi.mode != SPLITMV); + +- if (x->e_mbd.mbmi.mode != B_PRED && x->e_mbd.mbmi.mode != SPLITMV) ++ for (i = 0; i < 16; i++) + { +- for (i = 0; i < 16; i++) +- { +- x->quantize_b(&x->block[i], &x->e_mbd.block[i]); +- x->e_mbd.mbmi.mb_skip_coeff &= (x->e_mbd.block[i].eob < 2); +- } ++ x->quantize_b(&x->block[i], &x->e_mbd.block[i]); ++ x->e_mbd.mbmi.mb_skip_coeff &= ++ (x->e_mbd.block[i].eob <= has_2nd_order); ++ } + ++ if(has_2nd_order) ++ { + x->quantize_b(&x->block[24], &x->e_mbd.block[24]); + x->e_mbd.mbmi.mb_skip_coeff &= (!x->e_mbd.block[24].eob); +- +- } +- else +- { +- for (i = 0; i < 16; i++) +- { +- x->quantize_b(&x->block[i], &x->e_mbd.block[i]); +- x->e_mbd.mbmi.mb_skip_coeff &= (!x->e_mbd.block[i].eob); +- } + } + } + + void vp8_quantize_mb(MACROBLOCK *x) + { + int i; ++ int has_2nd_order=(x->e_mbd.mbmi.mode != B_PRED ++ && x->e_mbd.mbmi.mode != SPLITMV); + + x->e_mbd.mbmi.mb_skip_coeff = 1; +- +- if (x->e_mbd.mbmi.mode != B_PRED && x->e_mbd.mbmi.mode != SPLITMV) ++ for (i = 0; i < 24+has_2nd_order; i++) + { +- for (i = 0; i < 16; i++) +- { +- x->quantize_b(&x->block[i], &x->e_mbd.block[i]); +- x->e_mbd.mbmi.mb_skip_coeff &= (x->e_mbd.block[i].eob < 2); +- } +- +- for (i = 16; i < 25; i++) +- { +- x->quantize_b(&x->block[i], &x->e_mbd.block[i]); +- x->e_mbd.mbmi.mb_skip_coeff &= (!x->e_mbd.block[i].eob); +- } +- } +- else +- { +- for (i = 0; i < 24; i++) +- { +- x->quantize_b(&x->block[i], &x->e_mbd.block[i]); +- x->e_mbd.mbmi.mb_skip_coeff &= (!x->e_mbd.block[i].eob); +- } ++ x->quantize_b(&x->block[i], &x->e_mbd.block[i]); ++ x->e_mbd.mbmi.mb_skip_coeff &= ++ (x->e_mbd.block[i].eob <= (has_2nd_order && i<16)); + } +- + } + + +@@ -179,71 +157,3 @@ void vp8_quantize_mbuv(MACROBLOCK *x) + x->e_mbd.mbmi.mb_skip_coeff &= (!x->e_mbd.block[i].eob); + } + } +- +-// This function is not currently called +-void vp8_quantize_mbrd(MACROBLOCK *x) +-{ +- int i; +- +- x->e_mbd.mbmi.mb_skip_coeff = 1; +- +- if (x->e_mbd.mbmi.mode != B_PRED && x->e_mbd.mbmi.mode != SPLITMV) +- { +- for (i = 0; i < 16; i++) +- { +- x->quantize_brd(&x->block[i], &x->e_mbd.block[i]); +- x->e_mbd.mbmi.mb_skip_coeff &= (x->e_mbd.block[i].eob < 2); +- } +- +- for (i = 16; i < 25; i++) +- { +- x->quantize_brd(&x->block[i], &x->e_mbd.block[i]); +- x->e_mbd.mbmi.mb_skip_coeff &= (!x->e_mbd.block[i].eob); +- } +- } +- else +- { +- for (i = 0; i < 24; i++) +- { +- x->quantize_brd(&x->block[i], &x->e_mbd.block[i]); +- x->e_mbd.mbmi.mb_skip_coeff &= (!x->e_mbd.block[i].eob); +- } +- } +-} +- +-void vp8_quantize_mbuvrd(MACROBLOCK *x) +-{ +- int i; +- +- for (i = 16; i < 24; i++) +- { +- x->quantize_brd(&x->block[i], &x->e_mbd.block[i]); +- x->e_mbd.mbmi.mb_skip_coeff &= (!x->e_mbd.block[i].eob); +- } +-} +- +-void vp8_quantize_mbyrd(MACROBLOCK *x) +-{ +- int i; +- +- if (x->e_mbd.mbmi.mode != B_PRED && x->e_mbd.mbmi.mode != SPLITMV) +- { +- for (i = 0; i < 16; i++) +- { +- x->quantize_brd(&x->block[i], &x->e_mbd.block[i]); +- x->e_mbd.mbmi.mb_skip_coeff &= (x->e_mbd.block[i].eob < 2); +- } +- +- x->quantize_brd(&x->block[24], &x->e_mbd.block[24]); +- x->e_mbd.mbmi.mb_skip_coeff &= (!x->e_mbd.block[24].eob); +- +- } +- else +- { +- for (i = 0; i < 16; i++) +- { +- x->quantize_brd(&x->block[i], &x->e_mbd.block[i]); +- x->e_mbd.mbmi.mb_skip_coeff &= (!x->e_mbd.block[i].eob); +- } +- } +-} +diff --git a/vp8/encoder/quantize.h b/vp8/encoder/quantize.h +index 868e8e3..ca073ef 100644 +--- a/vp8/encoder/quantize.h ++++ b/vp8/encoder/quantize.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +@@ -16,6 +17,10 @@ + #define prototype_quantize_block(sym) \ + void (sym)(BLOCK *b,BLOCKD *d) + ++#if ARCH_X86 || ARCH_X86_64 ++#include "x86/quantize_x86.h" ++#endif ++ + #if ARCH_ARM + #include "arm/quantize_arm.h" + #endif +@@ -45,8 +50,5 @@ typedef struct + extern void vp8_quantize_mb(MACROBLOCK *x); + extern void vp8_quantize_mbuv(MACROBLOCK *x); + extern void vp8_quantize_mby(MACROBLOCK *x); +-extern void vp8_quantize_mbyrd(MACROBLOCK *x); +-extern void vp8_quantize_mbuvrd(MACROBLOCK *x); +-extern void vp8_quantize_mbrd(MACROBLOCK *x); + + #endif +diff --git a/vp8/encoder/ratectrl.c b/vp8/encoder/ratectrl.c +index 05040d3..944a2e8 100644 +--- a/vp8/encoder/ratectrl.c ++++ b/vp8/encoder/ratectrl.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +@@ -1063,7 +1064,6 @@ void vp8_calc_pframe_target_size(VP8_COMP *cpi) + + if (cpi->common.refresh_golden_frame == TRUE) + { +- int isize_adjustment = 0; + #if 0 + + if (0) // p_gw +@@ -1119,8 +1119,9 @@ void vp8_calc_pframe_target_size(VP8_COMP *cpi) + cpi->this_frame_target = (baseline_bits_at_q(1, Q, cpi->common.MBs) * cpi->last_boost) / 100; + + } +- // If there is an active ARF at this location use the minimum bits on this frame +- else ++ // If there is an active ARF at this location use the minimum ++ // bits on this frame unless it was a contructed arf. ++ else if (cpi->oxcf.arnr_max_frames == 0) + { + cpi->this_frame_target = 0; // Minimial spend on gf that is replacing an arf + } +@@ -1171,7 +1172,8 @@ void vp8_update_rate_correction_factors(VP8_COMP *cpi, int damp_var) + while (Z > 0) + { + Z --; +- projected_size_based_on_q *= (int)Factor; ++ projected_size_based_on_q = ++ (int)(Factor * projected_size_based_on_q); + Factor += factor_adjustment; + + if (Factor >= 0.999) +@@ -1362,7 +1364,8 @@ int vp8_regulate_q(VP8_COMP *cpi, int target_bits_per_frame) + if (cpi->zbin_over_quant > zbin_oqmax) + cpi->zbin_over_quant = zbin_oqmax; + +- bits_per_mb_at_this_q *= (int)Factor; // Each over-ruin step is assumed to equate to approximately 3% reduction in bitrate ++ // Adjust bits_per_mb_at_this_q estimate ++ bits_per_mb_at_this_q = (int)(Factor * bits_per_mb_at_this_q); + Factor += factor_adjustment; + + if (Factor >= 0.999) +diff --git a/vp8/encoder/ratectrl.h b/vp8/encoder/ratectrl.h +index 588c7a8..ff5778f 100644 +--- a/vp8/encoder/ratectrl.h ++++ b/vp8/encoder/ratectrl.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/rdopt.c b/vp8/encoder/rdopt.c +index 0846996..9a772a7 100644 +--- a/vp8/encoder/rdopt.c ++++ b/vp8/encoder/rdopt.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +@@ -170,15 +171,13 @@ static void fill_token_costs( + + } + +-static int rd_iifactor [ 32 ] = { 16, 16, 16, 12, 8, 4, 2, 0, ++static int rd_iifactor [ 32 ] = { 4, 4, 3, 2, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }; + + +- +- + // The values in this table should be reviewed + static int sad_per_bit16lut[128] = + { +@@ -237,36 +236,32 @@ void vp8_initialize_rd_consts(VP8_COMP *cpi, int Qvalue) + + vp8_clear_system_state(); //__asm emms; + +- cpi->RDMULT = (int)((0.00007 * (capped_q * capped_q * capped_q * capped_q)) - (0.0125 * (capped_q * capped_q * capped_q)) + +- (2.25 * (capped_q * capped_q)) - (12.5 * capped_q) + 25.0); ++ cpi->RDMULT = (int)( (0.0001 * (capped_q * capped_q * capped_q * capped_q)) ++ -(0.015 * (capped_q * capped_q * capped_q)) ++ +(3.25 * (capped_q * capped_q)) ++ -(17.5 * capped_q) + 125.0); + +- if (cpi->RDMULT < 25) +- cpi->RDMULT = 25; ++ if (cpi->RDMULT < 125) ++ cpi->RDMULT = 125; + +- if (cpi->pass == 2) ++ if (cpi->pass == 2 && (cpi->common.frame_type != KEY_FRAME)) + { +- if (cpi->common.frame_type == KEY_FRAME) +- cpi->RDMULT += (cpi->RDMULT * rd_iifactor[0]) / 16; +- else if (cpi->next_iiratio > 31) +- cpi->RDMULT += (cpi->RDMULT * rd_iifactor[31]) / 16; ++ if (cpi->next_iiratio > 31) ++ cpi->RDMULT += (cpi->RDMULT * rd_iifactor[31]) >> 4; + else +- cpi->RDMULT += (cpi->RDMULT * rd_iifactor[cpi->next_iiratio]) / 16; ++ cpi->RDMULT += (cpi->RDMULT * rd_iifactor[cpi->next_iiratio]) >> 4; + } + + + // Extend rate multiplier along side quantizer zbin increases + if (cpi->zbin_over_quant > 0) + { +- // Extend rate multiplier along side quantizer zbin increases +- if (cpi->zbin_over_quant > 0) +- { +- double oq_factor = pow(1.006, cpi->zbin_over_quant); ++ double oq_factor = pow(1.006, cpi->zbin_over_quant); + +- if (oq_factor > (1.0 + ((double)cpi->zbin_over_quant / 64.0))) +- oq_factor = (1.0 + (double)cpi->zbin_over_quant / 64.0); ++ if (oq_factor > (1.0 + ((double)cpi->zbin_over_quant / 64.0))) ++ oq_factor = (1.0 + (double)cpi->zbin_over_quant / 64.0); + +- cpi->RDMULT *= (int)oq_factor; +- } ++ cpi->RDMULT = (int)(oq_factor * cpi->RDMULT); + } + + cpi->mb.errorperbit = (cpi->RDMULT / 100); +@@ -1037,7 +1032,7 @@ static unsigned int vp8_encode_inter_mb_segment(MACROBLOCK *x, int const *labels + + // set to 0 no way to account for 2nd order DC so discount + //be->coeff[0] = 0; +- x->quantize_brd(be, bd); ++ x->quantize_b(be, bd); + + distortion += ENCODEMB_INVOKE(rtcd, berr)(be->coeff, bd->dqcoeff); + } +@@ -1075,7 +1070,7 @@ static void macro_block_yrd(MACROBLOCK *mb, int *Rate, int *Distortion, const vp + // Quantization + for (b = 0; b < 16; b++) + { +- mb->quantize_brd(&mb->block[b], &mb->e_mbd.block[b]); ++ mb->quantize_b(&mb->block[b], &mb->e_mbd.block[b]); + } + + // DC predication and Quantization of 2nd Order block +@@ -1083,7 +1078,7 @@ static void macro_block_yrd(MACROBLOCK *mb, int *Rate, int *Distortion, const vp + { + + { +- mb->quantize_brd(mb_y2, x_y2); ++ mb->quantize_b(mb_y2, x_y2); + } + } + +@@ -1130,6 +1125,9 @@ static int vp8_rd_pick_best_mbsegmentation(VP8_COMP *cpi, MACROBLOCK *x, MV *bes + MV bmvs[16]; + int beobs[16]; + ++ vpx_memset(beobs, 0, sizeof(beobs)); ++ ++ + for (segmentation = 0; segmentation < VP8_NUMMBSPLITS; segmentation++) + { + int label_count; +@@ -1464,6 +1462,8 @@ int vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int + + *returnintra = INT_MAX; + ++ vpx_memset(&best_mbmode, 0, sizeof(best_mbmode)); // clean ++ + cpi->mbs_tested_so_far++; // Count of the number of MBs tested so far this frame + + x->skip = 0; +diff --git a/vp8/encoder/rdopt.h b/vp8/encoder/rdopt.h +index c6eae4b..617241d 100644 +--- a/vp8/encoder/rdopt.h ++++ b/vp8/encoder/rdopt.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/sad_c.c b/vp8/encoder/sad_c.c +index 74c6bd7..1914c60 100644 +--- a/vp8/encoder/sad_c.c ++++ b/vp8/encoder/sad_c.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/ssim.c b/vp8/encoder/ssim.c +index df214a8..35dd10c 100644 +--- a/vp8/encoder/ssim.c ++++ b/vp8/encoder/ssim.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/tokenize.c b/vp8/encoder/tokenize.c +index 33ddd64..819f6a5 100644 +--- a/vp8/encoder/tokenize.c ++++ b/vp8/encoder/tokenize.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/tokenize.h b/vp8/encoder/tokenize.h +index 02aacc2..51f912b 100644 +--- a/vp8/encoder/tokenize.h ++++ b/vp8/encoder/tokenize.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/treewriter.c b/vp8/encoder/treewriter.c +index e398044..942442b 100644 +--- a/vp8/encoder/treewriter.c ++++ b/vp8/encoder/treewriter.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/treewriter.h b/vp8/encoder/treewriter.h +index 05ac74c..075df50 100644 +--- a/vp8/encoder/treewriter.h ++++ b/vp8/encoder/treewriter.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/variance.h b/vp8/encoder/variance.h +index b3b55c3..6610e7d 100644 +--- a/vp8/encoder/variance.h ++++ b/vp8/encoder/variance.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/variance_c.c b/vp8/encoder/variance_c.c +index 85269b9..efcf2b7 100644 +--- a/vp8/encoder/variance_c.c ++++ b/vp8/encoder/variance_c.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/x86/csystemdependent.c b/vp8/encoder/x86/csystemdependent.c +index 186ee68..8bc6877 100644 +--- a/vp8/encoder/x86/csystemdependent.c ++++ b/vp8/encoder/x86/csystemdependent.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/x86/dct_mmx.asm b/vp8/encoder/x86/dct_mmx.asm +index e134237..3dfc47b 100644 +--- a/vp8/encoder/x86/dct_mmx.asm ++++ b/vp8/encoder/x86/dct_mmx.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/encoder/x86/dct_sse2.asm b/vp8/encoder/x86/dct_sse2.asm +index 3e5e9a7..8ddc5d7 100644 +--- a/vp8/encoder/x86/dct_sse2.asm ++++ b/vp8/encoder/x86/dct_sse2.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/encoder/x86/dct_x86.h b/vp8/encoder/x86/dct_x86.h +index bc80e64..fec1a2e 100644 +--- a/vp8/encoder/x86/dct_x86.h ++++ b/vp8/encoder/x86/dct_x86.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/x86/encodemb_x86.h b/vp8/encoder/x86/encodemb_x86.h +index 9397a6c..d1ba7d9 100644 +--- a/vp8/encoder/x86/encodemb_x86.h ++++ b/vp8/encoder/x86/encodemb_x86.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/x86/encodeopt.asm b/vp8/encoder/x86/encodeopt.asm +index 1940471..cdc17a5 100644 +--- a/vp8/encoder/x86/encodeopt.asm ++++ b/vp8/encoder/x86/encodeopt.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/encoder/x86/fwalsh_sse2.asm b/vp8/encoder/x86/fwalsh_sse2.asm +index 7d86201..1966697 100644 +--- a/vp8/encoder/x86/fwalsh_sse2.asm ++++ b/vp8/encoder/x86/fwalsh_sse2.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/encoder/x86/mcomp_x86.h b/vp8/encoder/x86/mcomp_x86.h +index 5661491..c2b4b36 100644 +--- a/vp8/encoder/x86/mcomp_x86.h ++++ b/vp8/encoder/x86/mcomp_x86.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/x86/preproc_mmx.c b/vp8/encoder/x86/preproc_mmx.c +index 69617ca..8b23bb5 100644 +--- a/vp8/encoder/x86/preproc_mmx.c ++++ b/vp8/encoder/x86/preproc_mmx.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/x86/quantize_mmx.asm b/vp8/encoder/x86/quantize_mmx.asm +index 847fc6e..25adca0 100644 +--- a/vp8/encoder/x86/quantize_mmx.asm ++++ b/vp8/encoder/x86/quantize_mmx.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/encoder/x86/quantize_sse2.asm b/vp8/encoder/x86/quantize_sse2.asm +new file mode 100644 +index 0000000..c64a8ba +--- /dev/null ++++ b/vp8/encoder/x86/quantize_sse2.asm +@@ -0,0 +1,254 @@ ++; ++; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. ++; ++; Use of this source code is governed by a BSD-style license and patent ++; grant that can be found in the LICENSE file in the root of the source ++; tree. All contributing project authors may be found in the AUTHORS ++; file in the root of the source tree. ++; ++ ++ ++%include "vpx_ports/x86_abi_support.asm" ++ ++ ++;int vp8_regular_quantize_b_impl_sse2(short *coeff_ptr, short *zbin_ptr, ++; short *qcoeff_ptr,short *dequant_ptr, ++; const int *default_zig_zag, short *round_ptr, ++; short *quant_ptr, short *dqcoeff_ptr, ++; unsigned short zbin_oq_value, ++; short *zbin_boost_ptr); ++; ++global sym(vp8_regular_quantize_b_impl_sse2) ++sym(vp8_regular_quantize_b_impl_sse2): ++ push rbp ++ mov rbp, rsp ++ SHADOW_ARGS_TO_STACK 10 ++ push rsi ++ push rdi ++ push rbx ++ ; end prolog ++ ++ ALIGN_STACK 16, rax ++ ++ %define abs_minus_zbin_lo 0 ++ %define abs_minus_zbin_hi 16 ++ %define temp_qcoeff_lo 32 ++ %define temp_qcoeff_hi 48 ++ %define save_xmm6 64 ++ %define save_xmm7 80 ++ %define eob 96 ++ ++ %define vp8_regularquantizeb_stack_size eob + 16 ++ ++ sub rsp, vp8_regularquantizeb_stack_size ++ ++ movdqa DQWORD PTR[rsp + save_xmm6], xmm6 ++ movdqa DQWORD PTR[rsp + save_xmm7], xmm7 ++ ++ mov rdx, arg(0) ;coeff_ptr ++ mov eax, arg(8) ;zbin_oq_value ++ ++ mov rcx, arg(1) ;zbin_ptr ++ movd xmm7, eax ++ ++ movdqa xmm0, DQWORD PTR[rdx] ++ movdqa xmm4, DQWORD PTR[rdx + 16] ++ ++ movdqa xmm1, xmm0 ++ movdqa xmm5, xmm4 ++ ++ psraw xmm0, 15 ;sign of z (aka sz) ++ psraw xmm4, 15 ;sign of z (aka sz) ++ ++ pxor xmm1, xmm0 ++ pxor xmm5, xmm4 ++ ++ movdqa xmm2, DQWORD PTR[rcx] ;load zbin_ptr ++ movdqa xmm3, DQWORD PTR[rcx + 16] ;load zbin_ptr ++ ++ pshuflw xmm7, xmm7, 0 ++ psubw xmm1, xmm0 ;x = abs(z) ++ ++ punpcklwd xmm7, xmm7 ;duplicated zbin_oq_value ++ psubw xmm5, xmm4 ;x = abs(z) ++ ++ paddw xmm2, xmm7 ++ paddw xmm3, xmm7 ++ ++ psubw xmm1, xmm2 ;sub (zbin_ptr + zbin_oq_value) ++ psubw xmm5, xmm3 ;sub (zbin_ptr + zbin_oq_value) ++ ++ mov rdi, arg(5) ;round_ptr ++ mov rsi, arg(6) ;quant_ptr ++ ++ movdqa DQWORD PTR[rsp + abs_minus_zbin_lo], xmm1 ++ movdqa DQWORD PTR[rsp + abs_minus_zbin_hi], xmm5 ++ ++ paddw xmm1, xmm2 ;add (zbin_ptr + zbin_oq_value) back ++ paddw xmm5, xmm3 ;add (zbin_ptr + zbin_oq_value) back ++ ++ movdqa xmm2, DQWORD PTR[rdi] ++ movdqa xmm3, DQWORD PTR[rsi] ++ ++ movdqa xmm6, DQWORD PTR[rdi + 16] ++ movdqa xmm7, DQWORD PTR[rsi + 16] ++ ++ paddw xmm1, xmm2 ++ paddw xmm5, xmm6 ++ ++ pmulhw xmm1, xmm3 ++ pmulhw xmm5, xmm7 ++ ++ mov rsi, arg(2) ;qcoeff_ptr ++ pxor xmm6, xmm6 ++ ++ pxor xmm1, xmm0 ++ pxor xmm5, xmm4 ++ ++ psubw xmm1, xmm0 ++ psubw xmm5, xmm4 ++ ++ movdqa DQWORD PTR[rsp + temp_qcoeff_lo], xmm1 ++ movdqa DQWORD PTR[rsp + temp_qcoeff_hi], xmm5 ++ ++ movdqa DQWORD PTR[rsi], xmm6 ;zero qcoeff ++ movdqa DQWORD PTR[rsi + 16], xmm6 ;zero qcoeff ++ ++ xor rax, rax ++ mov rcx, -1 ++ ++ mov [rsp + eob], rcx ++ mov rsi, arg(9) ;zbin_boost_ptr ++ ++ mov rbx, arg(4) ;default_zig_zag ++ ++rq_zigzag_loop: ++ movsxd rcx, DWORD PTR[rbx + rax*4] ;now we have rc ++ movsx edi, WORD PTR [rsi] ;*zbin_boost_ptr aka zbin ++ lea rsi, [rsi + 2] ;zbin_boost_ptr++ ++ ++ movsx edx, WORD PTR[rsp + abs_minus_zbin_lo + rcx *2] ++ ++ sub edx, edi ;x - zbin ++ jl rq_zigzag_1 ++ ++ mov rdi, arg(2) ;qcoeff_ptr ++ ++ movsx edx, WORD PTR[rsp + temp_qcoeff_lo + rcx *2] ++ ++ cmp edx, 0 ++ je rq_zigzag_1 ++ ++ mov WORD PTR[rdi + rcx * 2], dx ;qcoeff_ptr[rc] = temp_qcoeff[rc] ++ ++ mov rsi, arg(9) ;zbin_boost_ptr ++ mov [rsp + eob], rax ;eob = i ++ ++rq_zigzag_1: ++ movsxd rcx, DWORD PTR[rbx + rax*4 + 4] ++ movsx edi, WORD PTR [rsi] ;*zbin_boost_ptr aka zbin ++ lea rsi, [rsi + 2] ;zbin_boost_ptr++ ++ ++ movsx edx, WORD PTR[rsp + abs_minus_zbin_lo + rcx *2] ++ lea rax, [rax + 1] ++ ++ sub edx, edi ;x - zbin ++ jl rq_zigzag_1a ++ ++ mov rdi, arg(2) ;qcoeff_ptr ++ ++ movsx edx, WORD PTR[rsp + temp_qcoeff_lo + rcx *2] ++ ++ cmp edx, 0 ++ je rq_zigzag_1a ++ ++ mov WORD PTR[rdi + rcx * 2], dx ;qcoeff_ptr[rc] = temp_qcoeff[rc] ++ ++ mov rsi, arg(9) ;zbin_boost_ptr ++ mov [rsp + eob], rax ;eob = i ++ ++rq_zigzag_1a: ++ movsxd rcx, DWORD PTR[rbx + rax*4 + 4] ++ movsx edi, WORD PTR [rsi] ;*zbin_boost_ptr aka zbin ++ lea rsi, [rsi + 2] ;zbin_boost_ptr++ ++ ++ movsx edx, WORD PTR[rsp + abs_minus_zbin_lo + rcx *2] ++ lea rax, [rax + 1] ++ ++ sub edx, edi ;x - zbin ++ jl rq_zigzag_1b ++ ++ mov rdi, arg(2) ;qcoeff_ptr ++ ++ movsx edx, WORD PTR[rsp + temp_qcoeff_lo + rcx *2] ++ ++ cmp edx, 0 ++ je rq_zigzag_1b ++ ++ mov WORD PTR[rdi + rcx * 2], dx ;qcoeff_ptr[rc] = temp_qcoeff[rc] ++ ++ mov rsi, arg(9) ;zbin_boost_ptr ++ mov [rsp + eob], rax ;eob = i ++ ++rq_zigzag_1b: ++ movsxd rcx, DWORD PTR[rbx + rax*4 + 4] ++ movsx edi, WORD PTR [rsi] ;*zbin_boost_ptr aka zbin ++ lea rsi, [rsi + 2] ;zbin_boost_ptr++ ++ ++ movsx edx, WORD PTR[rsp + abs_minus_zbin_lo + rcx *2] ++ lea rax, [rax + 1] ++ ++ sub edx, edi ;x - zbin ++ jl rq_zigzag_1c ++ ++ mov rdi, arg(2) ;qcoeff_ptr ++ ++ movsx edx, WORD PTR[rsp + temp_qcoeff_lo + rcx *2] ++ ++ cmp edx, 0 ++ je rq_zigzag_1c ++ ++ mov WORD PTR[rdi + rcx * 2], dx ;qcoeff_ptr[rc] = temp_qcoeff[rc] ++ ++ mov rsi, arg(9) ;zbin_boost_ptr ++ mov [rsp + eob], rax ;eob = i ++ ++rq_zigzag_1c: ++ lea rax, [rax + 1] ++ ++ cmp rax, 16 ++ jl rq_zigzag_loop ++ ++ mov rdi, arg(2) ;qcoeff_ptr ++ mov rcx, arg(3) ;dequant_ptr ++ mov rsi, arg(7) ;dqcoeff_ptr ++ ++ movdqa xmm2, DQWORD PTR[rdi] ++ movdqa xmm3, DQWORD PTR[rdi + 16] ++ ++ movdqa xmm0, DQWORD PTR[rcx] ++ movdqa xmm1, DQWORD PTR[rcx + 16] ++ ++ pmullw xmm0, xmm2 ++ pmullw xmm1, xmm3 ++ ++ movdqa DQWORD PTR[rsi], xmm0 ;store dqcoeff ++ movdqa DQWORD PTR[rsi + 16], xmm1 ;store dqcoeff ++ ++ mov rax, [rsp + eob] ++ ++ movdqa xmm6, DQWORD PTR[rsp + save_xmm6] ++ movdqa xmm7, DQWORD PTR[rsp + save_xmm7] ++ ++ add rax, 1 ++ ++ add rsp, vp8_regularquantizeb_stack_size ++ pop rsp ++ ++ ; begin epilog ++ pop rbx ++ pop rdi ++ pop rsi ++ UNSHADOW_ARGS ++ pop rbp ++ ret +diff --git a/vp8/encoder/x86/quantize_x86.h b/vp8/encoder/x86/quantize_x86.h +new file mode 100644 +index 0000000..37d69a8 +--- /dev/null ++++ b/vp8/encoder/x86/quantize_x86.h +@@ -0,0 +1,38 @@ ++/* ++ * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. ++ * ++ * Use of this source code is governed by a BSD-style license and patent ++ * grant that can be found in the LICENSE file in the root of the source ++ * tree. All contributing project authors may be found in the AUTHORS ++ * file in the root of the source tree. ++ */ ++ ++#ifndef QUANTIZE_X86_H ++#define QUANTIZE_X86_H ++ ++ ++/* Note: ++ * ++ * This platform is commonly built for runtime CPU detection. If you modify ++ * any of the function mappings present in this file, be sure to also update ++ * them in the function pointer initialization code ++ */ ++#if HAVE_MMX ++ ++#endif ++ ++ ++#if HAVE_SSE2 ++extern prototype_quantize_block(vp8_regular_quantize_b_sse2); ++ ++#if !CONFIG_RUNTIME_CPU_DETECT ++ ++#undef vp8_quantize_quantb ++#define vp8_quantize_quantb vp8_regular_quantize_b_sse2 ++ ++#endif ++ ++#endif ++ ++ ++#endif +diff --git a/vp8/encoder/x86/sad_mmx.asm b/vp8/encoder/x86/sad_mmx.asm +index a825698..4b35749 100644 +--- a/vp8/encoder/x86/sad_mmx.asm ++++ b/vp8/encoder/x86/sad_mmx.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/encoder/x86/sad_sse2.asm b/vp8/encoder/x86/sad_sse2.asm +index 53240bb..f4ef551 100644 +--- a/vp8/encoder/x86/sad_sse2.asm ++++ b/vp8/encoder/x86/sad_sse2.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/encoder/x86/sad_sse3.asm b/vp8/encoder/x86/sad_sse3.asm +index 38cc029..edfe82f 100644 +--- a/vp8/encoder/x86/sad_sse3.asm ++++ b/vp8/encoder/x86/sad_sse3.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/encoder/x86/sad_ssse3.asm b/vp8/encoder/x86/sad_ssse3.asm +index 1bb9561..79c4b44 100644 +--- a/vp8/encoder/x86/sad_ssse3.asm ++++ b/vp8/encoder/x86/sad_ssse3.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/encoder/x86/subtract_mmx.asm b/vp8/encoder/x86/subtract_mmx.asm +index ce3e610..d9babd3 100644 +--- a/vp8/encoder/x86/subtract_mmx.asm ++++ b/vp8/encoder/x86/subtract_mmx.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/encoder/x86/variance_impl_mmx.asm b/vp8/encoder/x86/variance_impl_mmx.asm +index d0da82a..31f66ec 100644 +--- a/vp8/encoder/x86/variance_impl_mmx.asm ++++ b/vp8/encoder/x86/variance_impl_mmx.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/encoder/x86/variance_impl_sse2.asm b/vp8/encoder/x86/variance_impl_sse2.asm +index 7e5ee28..1ccc6c5 100644 +--- a/vp8/encoder/x86/variance_impl_sse2.asm ++++ b/vp8/encoder/x86/variance_impl_sse2.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vp8/encoder/x86/variance_mmx.c b/vp8/encoder/x86/variance_mmx.c +index 4a5b25b..788b833 100644 +--- a/vp8/encoder/x86/variance_mmx.c ++++ b/vp8/encoder/x86/variance_mmx.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/x86/variance_sse2.c b/vp8/encoder/x86/variance_sse2.c +index ea80753..78ecd7b 100644 +--- a/vp8/encoder/x86/variance_sse2.c ++++ b/vp8/encoder/x86/variance_sse2.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vp8/encoder/x86/variance_x86.h b/vp8/encoder/x86/variance_x86.h +index 35fc90c..9cdd662 100644 +--- a/vp8/encoder/x86/variance_x86.h ++++ b/vp8/encoder/x86/variance_x86.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +@@ -240,7 +241,7 @@ extern prototype_sad_multi_dif_address(vp8_sad4x4x4d_sse3); + #define vp8_variance_sad4x4x3 vp8_sad4x4x3_sse3 + + #undef vp8_variance_sad16x16x4d +-#define vp8_variance_sad16x16x4 vp8_sad16x16x4d_sse3 ++#define vp8_variance_sad16x16x4d vp8_sad16x16x4d_sse3 + + #undef vp8_variance_sad16x8x4d + #define vp8_variance_sad16x8x4d vp8_sad16x8x4d_sse3 +diff --git a/vp8/encoder/x86/x86_csystemdependent.c b/vp8/encoder/x86/x86_csystemdependent.c +index f1391ba..f6123a8 100644 +--- a/vp8/encoder/x86/x86_csystemdependent.c ++++ b/vp8/encoder/x86/x86_csystemdependent.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +@@ -120,6 +121,40 @@ void vp8_fast_quantize_b_sse(BLOCK *b, BLOCKD *d) + ); + } + ++int vp8_regular_quantize_b_impl_sse2(short *coeff_ptr, short *zbin_ptr, ++ short *qcoeff_ptr,short *dequant_ptr, ++ const int *default_zig_zag, short *round_ptr, ++ short *quant_ptr, short *dqcoeff_ptr, ++ unsigned short zbin_oq_value, ++ short *zbin_boost_ptr); ++ ++void vp8_regular_quantize_b_sse2(BLOCK *b,BLOCKD *d) ++{ ++ short *zbin_boost_ptr = &b->zrun_zbin_boost[0]; ++ short *coeff_ptr = &b->coeff[0]; ++ short *zbin_ptr = &b->zbin[0][0]; ++ short *round_ptr = &b->round[0][0]; ++ short *quant_ptr = &b->quant[0][0]; ++ short *qcoeff_ptr = d->qcoeff; ++ short *dqcoeff_ptr = d->dqcoeff; ++ short *dequant_ptr = &d->dequant[0][0]; ++ short zbin_oq_value = b->zbin_extra; ++ ++ d->eob = vp8_regular_quantize_b_impl_sse2( ++ coeff_ptr, ++ zbin_ptr, ++ qcoeff_ptr, ++ dequant_ptr, ++ vp8_default_zig_zag1d, ++ ++ round_ptr, ++ quant_ptr, ++ dqcoeff_ptr, ++ zbin_oq_value, ++ zbin_boost_ptr ++ ); ++} ++ + int vp8_mbblock_error_xmm_impl(short *coeff_ptr, short *dcoef_ptr, int dc); + int vp8_mbblock_error_xmm(MACROBLOCK *mb, int dc) + { +@@ -250,6 +285,7 @@ void vp8_arch_x86_encoder_init(VP8_COMP *cpi) + /* cpi->rtcd.encodemb.sub* not implemented for wmt */ + + cpi->rtcd.quantize.fastquantb = vp8_fast_quantize_b_sse; ++ cpi->rtcd.quantize.quantb = vp8_regular_quantize_b_sse2; + } + + #endif +diff --git a/vp8/exports_dec b/vp8/exports_dec +new file mode 100644 +index 0000000..f9b985c +--- /dev/null ++++ b/vp8/exports_dec +@@ -0,0 +1 @@ ++data vpx_codec_vp8_dx_algo +diff --git a/vp8/exports_enc b/vp8/exports_enc +new file mode 100644 +index 0000000..9967011 +--- /dev/null ++++ b/vp8/exports_enc +@@ -0,0 +1 @@ ++data vpx_codec_vp8_cx_algo +diff --git a/vp8/vp8.h b/vp8/vp8.h +deleted file mode 100644 +index 87ca217..0000000 +--- a/vp8/vp8.h ++++ /dev/null +@@ -1,116 +0,0 @@ +-/* +- * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. +- * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. +- */ +- +- +-/*!\defgroup vp8 VP8 +- * \ingroup codecs +- * VP8 is vpx's newest video compression algorithm that uses motion +- * compensated prediction, Discrete Cosine Transform (DCT) coding of the +- * prediction error signal and context dependent entropy coding techniques +- * based on arithmatic principles. It features: +- * - YUV 4:2:0 image format +- * - Macro-block based coding (16x16 luma plus two 8x8 chroma) +- * - 1/4 (1/8) pixel accuracy motion compensated prediction +- * - 4x4 DCT transform +- * - 128 level linear quantizer +- * - In loop deblocking filter +- * - Context-based entropy coding +- * +- * @{ +- */ +-/*!\file vp8.h +- * \brief Provides controls common to both the VP8 encoder and decoder. +- */ +-#ifndef VP8_H +-#define VP8_H +-#include "vpx_codec_impl_top.h" +- +-/*!\brief Control functions +- * +- * The set of macros define the control functions of VP8 interface +- */ +-enum vp8_dec_control_id +-{ +- VP8_SET_REFERENCE = 1, /**< pass in an external frame into decoder to be used as reference frame */ +- VP8_COPY_REFERENCE = 2, /**< get a copy of reference frame from the decoder */ +- VP8_SET_POSTPROC = 3, /**< set decoder's the post processing settings */ +- VP8_COMMON_CTRL_ID_MAX +-}; +- +-/*!\brief post process flags +- * +- * The set of macros define VP8 decoder post processing flags +- */ +-enum vp8_postproc_level +-{ +- VP8_NOFILTERING = 0, +- VP8_DEBLOCK = 1, +- VP8_DEMACROBLOCK = 2, +- VP8_ADDNOISE = 4, +-}; +- +-/*!\brief post process flags +- * +- * This define a structure that describe the post processing settings. For +- * the best objective measure (using thet PSNR metric) set post_proc_flag +- * to VP8_DEBLOCK and deblocking_level to 1. +- */ +- +-typedef struct vp8_postproc_cfg +-{ +- int post_proc_flag; /**< the types of post processing to be done, should be combination of "vp8_postproc_level" */ +- int deblocking_level; /**< the strength of deblocking, valid range [0, 16] */ +- int noise_level; /**< the strength of additive noise, valid range [0, 16] */ +-} vp8_postproc_cfg_t; +- +-/*!\brief reference frame type +- * +- * The set of macros define the type of VP8 reference frames +- */ +-typedef enum vpx_ref_frame_type +-{ +- VP8_LAST_FRAME = 1, +- VP8_GOLD_FRAME = 2, +- VP8_ALTR_FRAME = 4 +-} vpx_ref_frame_type_t; +- +-/*!\brief reference frame data struct +- * +- * define the data struct to access vp8 reference frames +- */ +- +-typedef struct vpx_ref_frame +-{ +- vpx_ref_frame_type_t frame_type; /**< which reference frame */ +- vpx_image_t img; /**< reference frame data in image format */ +-} vpx_ref_frame_t; +- +- +-/*!\brief vp8 decoder control funciton parameter type +- * +- * defines the data type for each of VP8 decoder control funciton requires +- */ +- +-VPX_CTRL_USE_TYPE(VP8_SET_REFERENCE, vpx_ref_frame_t *) +-VPX_CTRL_USE_TYPE(VP8_COPY_REFERENCE, vpx_ref_frame_t *) +-VPX_CTRL_USE_TYPE(VP8_SET_POSTPROC, vp8_postproc_cfg_t *) +- +- +-/*! @} - end defgroup vp8 */ +- +-#if !defined(VPX_CODEC_DISABLE_COMPAT) || !VPX_CODEC_DISABLE_COMPAT +-/* The following definitions are provided for backward compatibility with +- * the VP8 1.0.x SDK. USE IN PRODUCTION CODE IS NOT RECOMMENDED. +- */ +- +-DECLSPEC_DEPRECATED extern vpx_codec_iface_t vpx_codec_vp8_algo DEPRECATED; +-#endif +- +-#include "vpx_codec_impl_bottom.h" +-#endif +diff --git a/vp8/vp8_common.mk b/vp8/vp8_common.mk +index ec467c5..5ed53ba 100644 +--- a/vp8/vp8_common.mk ++++ b/vp8/vp8_common.mk +@@ -1,19 +1,17 @@ + ## + ## Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ## +-## Use of this source code is governed by a BSD-style license and patent +-## grant that can be found in the LICENSE file in the root of the source +-## tree. All contributing project authors may be found in the AUTHORS +-## file in the root of the source tree. ++## 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. + ## + + + #add this file to the installed sources list + VP8_COMMON_SRCS-yes += vp8_common.mk + +-#common interface +-VP8_COMMON_SRCS-yes += vp8.h +- + CFLAGS+=-I$(SRC_PATH_BARE)/$(VP8_PREFIX)common + VP8_COMMON_SRCS-yes += common/type_aliases.h + VP8_COMMON_SRCS-yes += common/pragmas.h +diff --git a/vp8/vp8_cx_iface.c b/vp8/vp8_cx_iface.c +index e129ec9..d63c039 100644 +--- a/vp8/vp8_cx_iface.c ++++ b/vp8/vp8_cx_iface.c +@@ -1,18 +1,19 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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_codec/vpx_codec.h" +-#include "vpx_codec/internal/vpx_codec_internal.h" ++#include "vpx/vpx_codec.h" ++#include "vpx/internal/vpx_codec_internal.h" + #include "vpx_version.h" + #include "onyx_int.h" +-#include "vp8e.h" ++#include "vpx/vp8e.h" + #include "onyx.h" + #include <stdlib.h> + #include <string.h> +@@ -52,15 +53,15 @@ static const struct extraconfig_map extracfg_map[] = + NULL, + #if !(CONFIG_REALTIME_ONLY) + VP8_BEST_QUALITY_ENCODING, /* Encoding Mode */ +- -4, /* cpu_used */ ++ 0, /* cpu_used */ + #else + VP8_REAL_TIME_ENCODING, /* Encoding Mode */ +- -8, /* cpu_used */ ++ 4, /* cpu_used */ + #endif + 0, /* enable_auto_alt_ref */ + 0, /* noise_sensitivity */ + 0, /* Sharpness */ +- 800, /* static_thresh */ ++ 0, /* static_thresh */ + VP8_ONE_TOKENPARTITION, /* token_partitions */ + 0, /* arnr_max_frames */ + 0, /* arnr_strength */ +@@ -81,7 +82,7 @@ struct vpx_codec_alg_priv + vpx_image_t preview_img; + unsigned int next_frame_flag; + vp8_postproc_cfg_t preview_ppcfg; +- vpx_codec_pkt_list_decl(26) pkt_list; // changed to accomendate the maximum number of lagged frames allowed ++ vpx_codec_pkt_list_decl(64) pkt_list; // changed to accomendate the maximum number of lagged frames allowed + int deprecated_mode; + unsigned int fixed_kf_cntr; + }; +@@ -108,7 +109,7 @@ update_error_state(vpx_codec_alg_priv_t *ctx, + } while(0) + + #define RANGE_CHECK(p,memb,lo,hi) do {\ +- if(!((p)->memb >= (lo) && (p)->memb <= hi)) \ ++ if(!(((p)->memb == lo || (p)->memb > (lo)) && (p)->memb <= hi)) \ + ERROR(#memb " out of range ["#lo".."#hi"]");\ + } while(0) + +@@ -211,10 +212,10 @@ static vpx_codec_err_t validate_img(vpx_codec_alg_priv_t *ctx, + { + switch (img->fmt) + { +- case IMG_FMT_YV12: +- case IMG_FMT_I420: +- case IMG_FMT_VPXI420: +- case IMG_FMT_VPXYV12: ++ case VPX_IMG_FMT_YV12: ++ case VPX_IMG_FMT_I420: ++ case VPX_IMG_FMT_VPXI420: ++ case VPX_IMG_FMT_VPXYV12: + break; + default: + ERROR("Invalid image format. Only YV12 and I420 images are supported"); +@@ -536,20 +537,20 @@ static vpx_codec_err_t image2yuvconfig(const vpx_image_t *img, + YV12_BUFFER_CONFIG *yv12) + { + vpx_codec_err_t res = VPX_CODEC_OK; +- yv12->y_buffer = img->planes[PLANE_Y]; +- yv12->u_buffer = img->planes[PLANE_U]; +- yv12->v_buffer = img->planes[PLANE_V]; ++ yv12->y_buffer = img->planes[VPX_PLANE_Y]; ++ yv12->u_buffer = img->planes[VPX_PLANE_U]; ++ yv12->v_buffer = img->planes[VPX_PLANE_V]; + + yv12->y_width = img->d_w; + yv12->y_height = img->d_h; + yv12->uv_width = (1 + yv12->y_width) / 2; + yv12->uv_height = (1 + yv12->y_height) / 2; + +- yv12->y_stride = img->stride[PLANE_Y]; +- yv12->uv_stride = img->stride[PLANE_U]; ++ yv12->y_stride = img->stride[VPX_PLANE_Y]; ++ yv12->uv_stride = img->stride[VPX_PLANE_U]; + +- yv12->border = (img->stride[PLANE_Y] - img->w) / 2; +- yv12->clrtype = (img->fmt == IMG_FMT_VPXI420 || img->fmt == IMG_FMT_VPXYV12); //REG_YUV = 0 ++ yv12->border = (img->stride[VPX_PLANE_Y] - img->w) / 2; ++ yv12->clrtype = (img->fmt == VPX_IMG_FMT_VPXI420 || img->fmt == VPX_IMG_FMT_VPXYV12); //REG_YUV = 0 + return res; + } + +@@ -846,7 +847,7 @@ static vpx_image_t *vp8e_get_preview(vpx_codec_alg_priv_t *ctx) + { + + /* +- vpx_img_wrap(&ctx->preview_img, IMG_FMT_YV12, ++ vpx_img_wrap(&ctx->preview_img, VPX_IMG_FMT_YV12, + sd.y_width + 2*VP8BORDERINPIXELS, + sd.y_height + 2*VP8BORDERINPIXELS, + 1, +@@ -857,23 +858,23 @@ static vpx_image_t *vp8e_get_preview(vpx_codec_alg_priv_t *ctx) + */ + + ctx->preview_img.bps = 12; +- ctx->preview_img.planes[PLANE_Y] = sd.y_buffer; +- ctx->preview_img.planes[PLANE_U] = sd.u_buffer; +- ctx->preview_img.planes[PLANE_V] = sd.v_buffer; ++ ctx->preview_img.planes[VPX_PLANE_Y] = sd.y_buffer; ++ ctx->preview_img.planes[VPX_PLANE_U] = sd.u_buffer; ++ ctx->preview_img.planes[VPX_PLANE_V] = sd.v_buffer; + + if (sd.clrtype == REG_YUV) +- ctx->preview_img.fmt = IMG_FMT_I420; ++ ctx->preview_img.fmt = VPX_IMG_FMT_I420; + else +- ctx->preview_img.fmt = IMG_FMT_VPXI420; ++ ctx->preview_img.fmt = VPX_IMG_FMT_VPXI420; + + ctx->preview_img.x_chroma_shift = 1; + ctx->preview_img.y_chroma_shift = 1; + + ctx->preview_img.d_w = ctx->cfg.g_w; + ctx->preview_img.d_h = ctx->cfg.g_h; +- ctx->preview_img.stride[PLANE_Y] = sd.y_stride; +- ctx->preview_img.stride[PLANE_U] = sd.uv_stride; +- ctx->preview_img.stride[PLANE_V] = sd.uv_stride; ++ ctx->preview_img.stride[VPX_PLANE_Y] = sd.y_stride; ++ ctx->preview_img.stride[VPX_PLANE_U] = sd.uv_stride; ++ ctx->preview_img.stride[VPX_PLANE_V] = sd.uv_stride; + ctx->preview_img.w = sd.y_width; + ctx->preview_img.h = sd.y_height; + +@@ -1067,7 +1068,7 @@ static vpx_codec_enc_cfg_map_t vp8e_usage_cfg_map[] = + #endif + vpx_codec_iface_t vpx_codec_vp8_cx_algo = + { +- "vpx Technologies VP8 Encoder" VERSION_STRING, ++ "WebM Project VP8 Encoder" VERSION_STRING, + VPX_CODEC_INTERNAL_ABI_VERSION, + VPX_CODEC_CAP_ENCODER | VPX_CODEC_CAP_PSNR, + /* vpx_codec_caps_t caps; */ +@@ -1156,7 +1157,7 @@ static vpx_codec_err_t api1_encode(vpx_codec_alg_priv_t *ctx, + + vpx_codec_iface_t vpx_enc_vp8_algo = + { +- "vpx Technologies VP8 Encoder (Deprecated API)" VERSION_STRING, ++ "WebM Project VP8 Encoder (Deprecated API)" VERSION_STRING, + VPX_CODEC_INTERNAL_ABI_VERSION, + VPX_CODEC_CAP_ENCODER, + /* vpx_codec_caps_t caps; */ +diff --git a/vp8/vp8_dx_iface.c b/vp8/vp8_dx_iface.c +index 3e6cdf4..a99364d 100644 +--- a/vp8/vp8_dx_iface.c ++++ b/vp8/vp8_dx_iface.c +@@ -1,18 +1,19 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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 <stdlib.h> + #include <string.h> +-#include "vpx_codec/vpx_decoder.h" +-#include "vp8dx.h" +-#include "vpx_codec/internal/vpx_codec_internal.h" ++#include "vpx/vpx_decoder.h" ++#include "vpx/vp8dx.h" ++#include "vpx/internal/vpx_codec_internal.h" + #include "vpx_version.h" + #include "onyxd.h" + #include "onyxd_int.h" +@@ -257,12 +258,12 @@ static vpx_codec_err_t vp8_peek_si(const uint8_t *data, + + vpx_codec_err_t res = VPX_CODEC_OK; + { +- /*Parse from VP8 compressed data, the implies knowledge of the +- *VP8 bitsteam. +- * First 3 byte header including version, frame type and an offset +- * Next 3 bytes are image sizewith 12 bit each for width and height ++ /* Parse uncompresssed part of key frame header. ++ * 3 bytes:- including version, frame type and an offset ++ * 3 bytes:- sync code (0x9d, 0x01, 0x2a) ++ * 4 bytes:- including image width and height in the lowest 14 bits ++ * of each 2-byte value. + */ +- + si->is_kf = 0; + + if (data_sz >= 10 && !(data[0] & 0x01)) /* I-Frame */ +@@ -434,7 +435,7 @@ static vpx_codec_err_t vp8_decode(vpx_codec_alg_priv_t *ctx, + unsigned int a_w = (sd.y_width + 15) & ~15; + unsigned int a_h = (sd.y_height + 15) & ~15; + +- vpx_img_wrap(&ctx->img, IMG_FMT_I420, ++ vpx_img_wrap(&ctx->img, VPX_IMG_FMT_I420, + a_w + 2 * VP8BORDERINPIXELS, + a_h + 2 * VP8BORDERINPIXELS, + 1, +@@ -557,20 +558,20 @@ static vpx_codec_err_t image2yuvconfig(const vpx_image_t *img, + YV12_BUFFER_CONFIG *yv12) + { + vpx_codec_err_t res = VPX_CODEC_OK; +- yv12->y_buffer = img->planes[PLANE_Y]; +- yv12->u_buffer = img->planes[PLANE_U]; +- yv12->v_buffer = img->planes[PLANE_V]; ++ yv12->y_buffer = img->planes[VPX_PLANE_Y]; ++ yv12->u_buffer = img->planes[VPX_PLANE_U]; ++ yv12->v_buffer = img->planes[VPX_PLANE_V]; + + yv12->y_width = img->d_w; + yv12->y_height = img->d_h; + yv12->uv_width = yv12->y_width / 2; + yv12->uv_height = yv12->y_height / 2; + +- yv12->y_stride = img->stride[PLANE_Y]; +- yv12->uv_stride = img->stride[PLANE_U]; ++ yv12->y_stride = img->stride[VPX_PLANE_Y]; ++ yv12->uv_stride = img->stride[VPX_PLANE_U]; + +- yv12->border = (img->stride[PLANE_Y] - img->d_w) / 2; +- yv12->clrtype = (img->fmt == IMG_FMT_VPXI420 || img->fmt == IMG_FMT_VPXYV12); ++ yv12->border = (img->stride[VPX_PLANE_Y] - img->d_w) / 2; ++ yv12->clrtype = (img->fmt == VPX_IMG_FMT_VPXI420 || img->fmt == VPX_IMG_FMT_VPXYV12); + + return res; + } +@@ -656,7 +657,7 @@ vpx_codec_ctrl_fn_map_t vp8_ctf_maps[] = + #endif + vpx_codec_iface_t vpx_codec_vp8_dx_algo = + { +- "vpx Technologies VP8 Decoder" VERSION_STRING, ++ "WebM Project VP8 Decoder" VERSION_STRING, + VPX_CODEC_INTERNAL_ABI_VERSION, + VPX_CODEC_CAP_DECODER | VP8_CAP_POSTPROC, + /* vpx_codec_caps_t caps; */ +@@ -679,7 +680,7 @@ vpx_codec_iface_t vpx_codec_vp8_dx_algo = + */ + vpx_codec_iface_t vpx_codec_vp8_algo = + { +- "vpx Technologies VP8 Decoder (Deprecated API)" VERSION_STRING, ++ "WebM Project VP8 Decoder (Deprecated API)" VERSION_STRING, + VPX_CODEC_INTERNAL_ABI_VERSION, + VPX_CODEC_CAP_DECODER | VP8_CAP_POSTPROC, + /* vpx_codec_caps_t caps; */ +diff --git a/vp8/vp8cx.h b/vp8/vp8cx.h +deleted file mode 100644 +index dd48c07..0000000 +--- a/vp8/vp8cx.h ++++ /dev/null +@@ -1,261 +0,0 @@ +-/* +- * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. +- * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. +- */ +- +- +-/*!\defgroup vp8_encoder WebM VP8 Encoder +- * \ingroup vp8 +- * +- * @{ +- */ +-#include "vp8.h" +- +-/*!\file vp8cx.h +- * \brief Provides definitions for using the VP8 encoder algorithm within the +- * vpx Codec Interface. +- */ +-#ifndef VP8CX_H +-#define VP8CX_H +-#include "vpx_codec_impl_top.h" +- +-/*!\brief Algorithm interface for VP8 +- * +- * This interface provides the capability to encode raw VP8 streams, as would +- * be found in AVI files. +- */ +-extern vpx_codec_iface_t vpx_codec_vp8_cx_algo; +- +- +-/* +- * Algorithm Flags +- */ +- +-/*!\brief Don't reference the last frame +- * +- * When this flag is set, the encoder will not use the last frame as a +- * predictor. When not set, the encoder will choose whether to use the +- * last frame or not automatically. +- */ +-#define VP8_EFLAG_NO_REF_LAST (1<<16) +- +- +-/*!\brief Don't reference the golden frame +- * +- * When this flag is set, the encoder will not use the golden frame as a +- * predictor. When not set, the encoder will choose whether to use the +- * golden frame or not automatically. +- */ +-#define VP8_EFLAG_NO_REF_GF (1<<17) +- +- +-/*!\brief Don't reference the alternate reference frame +- * +- * When this flag is set, the encoder will not use the alt ref frame as a +- * predictor. When not set, the encoder will choose whether to use the +- * alt ref frame or not automatically. +- */ +-#define VP8_EFLAG_NO_REF_ARF (1<<21) +- +- +-/*!\brief Don't update the last frame +- * +- * When this flag is set, the encoder will not update the last frame with +- * the contents of the current frame. +- */ +-#define VP8_EFLAG_NO_UPD_LAST (1<<18) +- +- +-/*!\brief Don't update the golden frame +- * +- * When this flag is set, the encoder will not update the golden frame with +- * the contents of the current frame. +- */ +-#define VP8_EFLAG_NO_UPD_GF (1<<22) +- +- +-/*!\brief Don't update the alternate reference frame +- * +- * When this flag is set, the encoder will not update the alt ref frame with +- * the contents of the current frame. +- */ +-#define VP8_EFLAG_NO_UPD_ARF (1<<23) +- +- +-/*!\brief Force golden frame update +- * +- * When this flag is set, the encoder copy the contents of the current frame +- * to the golden frame buffer. +- */ +-#define VP8_EFLAG_FORCE_GF (1<<19) +- +- +-/*!\brief Force alternate reference frame update +- * +- * When this flag is set, the encoder copy the contents of the current frame +- * to the alternate reference frame buffer. +- */ +-#define VP8_EFLAG_FORCE_ARF (1<<24) +- +- +-/*!\brief Disable entropy update +- * +- * When this flag is set, the encoder will not update its internal entropy +- * model based on the entropy of this frame. +- */ +-#define VP8_EFLAG_NO_UPD_ENTROPY (1<<20) +- +- +-/*!\brief VP8 encoder control functions +- * +- * The set of macros define the control functions of VP8 encoder interface +- */ +-enum vp8e_enc_control_id +-{ +- VP8E_UPD_ENTROPY = 5, /**< control function to set mode of entropy update in encoder */ +- VP8E_UPD_REFERENCE, /**< control function to set reference update mode in encoder */ +- VP8E_USE_REFERENCE, /**< control function to set which reference frame encoder can use */ +- VP8E_SET_ROI_MAP, /**< control function to pass an ROI map to encoder */ +- VP8E_SET_ACTIVEMAP, /**< control function to pass an Active map to encoder */ +- VP8E_SET_SCALEMODE = 11, /**< control function to set encoder scaling mode */ +- VP8E_SET_CPUUSED = 13, /**< control function to set vp8 encoder cpuused */ +- VP8E_SET_ENABLEAUTOALTREF, /**< control function to enable vp8 to automatic set and use altref frame */ +- VP8E_SET_NOISE_SENSITIVITY, /**< control function to set noise sensitivity */ +- VP8E_SET_SHARPNESS, /**< control function to set sharpness */ +- VP8E_SET_STATIC_THRESHOLD, /**< control function to set the threshold for macroblocks treated static */ +- VP8E_SET_TOKEN_PARTITIONS, /**< control function to set the number of token partitions */ +- VP8E_GET_LAST_QUANTIZER, /**< return the quantizer chosen by the +- encoder for the last frame using the internal +- scale */ +- VP8E_GET_LAST_QUANTIZER_64, /**< return the quantizer chosen by the +- encoder for the last frame, using the 0..63 +- scale as used by the rc_*_quantizer config +- parameters */ +- VP8E_SET_ARNR_MAXFRAMES, /**< control function to set the max number of frames blurred creating arf*/ +- VP8E_SET_ARNR_STRENGTH , /**< control function to set the filter strength for the arf */ +- VP8E_SET_ARNR_TYPE , /**< control function to set the type of filter to use for the arf*/ +-} ; +- +-/*!\brief vpx 1-D scaling mode +- * +- * This set of constants define 1-D vpx scaling modes +- */ +-typedef enum vpx_scaling_mode_1d +-{ +- VP8E_NORMAL = 0, +- VP8E_FOURFIVE = 1, +- VP8E_THREEFIVE = 2, +- VP8E_ONETWO = 3 +-} VPX_SCALING_MODE; +- +- +-/*!\brief vpx region of interest map +- * +- * These defines the data structures for the region of interest map +- * +- */ +- +-typedef struct vpx_roi_map +-{ +- unsigned char *roi_map; /**< specify an id between 0 and 3 for each 16x16 region within a frame */ +- unsigned int rows; /**< number of rows */ +- unsigned int cols; /**< number of cols */ +- int delta_q[4]; /**< quantizer delta [-64, 64] off baseline for regions with id between 0 and 3*/ +- int delta_lf[4]; /**< loop filter strength delta [-32, 32] for regions with id between 0 and 3 */ +- unsigned int static_threshold[4];/**< threshold for region to be treated as static */ +-} vpx_roi_map_t; +- +-/*!\brief vpx active region map +- * +- * These defines the data structures for active region map +- * +- */ +- +- +-typedef struct vpx_active_map +-{ +- unsigned char *active_map; /**< specify an on (1) or off (0) each 16x16 region within a frame */ +- unsigned int rows; /**< number of rows */ +- unsigned int cols; /**< number of cols */ +-} vpx_active_map_t; +- +-/*!\brief vpx image scaling mode +- * +- * This defines the data structure for image scaling mode +- * +- */ +-typedef struct vpx_scaling_mode +-{ +- VPX_SCALING_MODE h_scaling_mode; /**< horizontal scaling mode */ +- VPX_SCALING_MODE v_scaling_mode; /**< vertical scaling mode */ +-} vpx_scaling_mode_t; +- +-/*!\brief VP8 encoding mode +- * +- * This defines VP8 encoding mode +- * +- */ +-typedef enum +-{ +- VP8_BEST_QUALITY_ENCODING, +- VP8_GOOD_QUALITY_ENCODING, +- VP8_REAL_TIME_ENCODING +-} vp8e_encoding_mode; +- +-/*!\brief VP8 token partition mode +- * +- * This defines VP8 partitioning mode for compressed data, i.e., the number of +- * sub-streams in the bitstream. Used for parallelized decoding. +- * +- */ +- +-typedef enum +-{ +- VP8_ONE_TOKENPARTITION = 0, +- VP8_TWO_TOKENPARTITION = 1, +- VP8_FOUR_TOKENPARTITION = 2, +- VP8_EIGHT_TOKENPARTITION = 3, +-} vp8e_token_partitions; +- +- +-/*!\brief VP8 encoder control function parameter type +- * +- * Defines the data types that VP8E control functions take. Note that +- * additional common controls are defined in vp8.h +- * +- */ +- +- +-/* These controls have been deprecated in favor of the flags parameter to +- * vpx_codec_encode(). See the definition of VP8_EFLAG_* above. +- */ +-VPX_CTRL_USE_TYPE_DEPRECATED(VP8E_UPD_ENTROPY, int) +-VPX_CTRL_USE_TYPE_DEPRECATED(VP8E_UPD_REFERENCE, int) +-VPX_CTRL_USE_TYPE_DEPRECATED(VP8E_USE_REFERENCE, int) +- +-VPX_CTRL_USE_TYPE(VP8E_SET_ROI_MAP, vpx_roi_map_t *) +-VPX_CTRL_USE_TYPE(VP8E_SET_ACTIVEMAP, vpx_active_map_t *) +-VPX_CTRL_USE_TYPE(VP8E_SET_SCALEMODE, vpx_scaling_mode_t *) +- +-VPX_CTRL_USE_TYPE(VP8E_SET_CPUUSED, int) +-VPX_CTRL_USE_TYPE(VP8E_SET_ENABLEAUTOALTREF, unsigned int) +-VPX_CTRL_USE_TYPE(VP8E_SET_NOISE_SENSITIVITY, unsigned int) +-VPX_CTRL_USE_TYPE(VP8E_SET_SHARPNESS, unsigned int) +-VPX_CTRL_USE_TYPE(VP8E_SET_STATIC_THRESHOLD, unsigned int) +-VPX_CTRL_USE_TYPE(VP8E_SET_TOKEN_PARTITIONS, vp8e_token_partitions) +- +-VPX_CTRL_USE_TYPE(VP8E_SET_ARNR_MAXFRAMES, unsigned int) +-VPX_CTRL_USE_TYPE(VP8E_SET_ARNR_STRENGTH , unsigned int) +-VPX_CTRL_USE_TYPE(VP8E_SET_ARNR_TYPE , unsigned int) +- +- +-VPX_CTRL_USE_TYPE(VP8E_GET_LAST_QUANTIZER, int *) +-VPX_CTRL_USE_TYPE(VP8E_GET_LAST_QUANTIZER_64, int *) +- +-/*! @} - end defgroup vp8_encoder */ +-#include "vpx_codec_impl_bottom.h" +-#endif +diff --git a/vp8/vp8cx.mk b/vp8/vp8cx.mk +index e7e7663..971a175 100644 +--- a/vp8/vp8cx.mk ++++ b/vp8/vp8cx.mk +@@ -1,14 +1,18 @@ + ## + ## Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ## +-## Use of this source code is governed by a BSD-style license and patent +-## grant that can be found in the LICENSE file in the root of the source +-## tree. All contributing project authors may be found in the AUTHORS +-## file in the root of the source tree. ++## 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 $(SRC_PATH_BARE)/$(VP8_PREFIX)vp8_common.mk ++ ++VP8_CX_EXPORTS += exports_enc ++ + VP8_CX_SRCS-yes += $(VP8_COMMON_SRCS-yes) + VP8_CX_SRCS-no += $(VP8_COMMON_SRCS-no) + VP8_CX_SRCS_REMOVE-yes += $(VP8_COMMON_SRCS_REMOVE-yes) +@@ -18,7 +22,7 @@ ifeq ($(ARCH_ARM),yes) + include $(SRC_PATH_BARE)/$(VP8_PREFIX)vp8cx_arm.mk + endif + +-VP8_CX_SRCS-yes += vp8cx.h vp8e.h vp8_cx_iface.c ++VP8_CX_SRCS-yes += vp8_cx_iface.c + + # encoder + #INCLUDES += algo/vpx_common/vpx_mem/include +@@ -70,7 +74,7 @@ VP8_CX_SRCS-yes += encoder/quantize.c + VP8_CX_SRCS-yes += encoder/ratectrl.c + VP8_CX_SRCS-yes += encoder/rdopt.c + VP8_CX_SRCS-yes += encoder/sad_c.c +-VP8_CX_SRCS-yes += encoder/ssim.c ++VP8_CX_SRCS-$(CONFIG_PSNR) += encoder/ssim.c + VP8_CX_SRCS-yes += encoder/tokenize.c + VP8_CX_SRCS-yes += encoder/treewriter.c + VP8_CX_SRCS-yes += encoder/variance_c.c +@@ -94,11 +98,10 @@ VP8_CX_SRCS-$(HAVE_SSE2) += encoder/x86/variance_impl_sse2.asm + VP8_CX_SRCS-$(HAVE_SSE2) += encoder/x86/sad_sse2.asm + VP8_CX_SRCS-$(HAVE_SSE2) += encoder/x86/dct_sse2.asm + VP8_CX_SRCS-$(HAVE_SSE2) += encoder/x86/fwalsh_sse2.asm ++VP8_CX_SRCS-$(HAVE_SSE2) += encoder/x86/quantize_sse2.asm + VP8_CX_SRCS-$(HAVE_SSE3) += encoder/x86/sad_sse3.asm + VP8_CX_SRCS-$(HAVE_SSSE3) += encoder/x86/sad_ssse3.asm + VP8_CX_SRCS-$(ARCH_X86)$(ARCH_X86_64) += encoder/x86/quantize_mmx.asm + VP8_CX_SRCS-$(ARCH_X86)$(ARCH_X86_64) += encoder/x86/encodeopt.asm + + VP8_CX_SRCS-yes := $(filter-out $(VP8_CX_SRCS_REMOVE-yes),$(VP8_CX_SRCS-yes)) +- +-INSTALL-LIBS-yes += include/vp8.h include/vp8e.h include/vp8cx.h +diff --git a/vp8/vp8cx_arm.mk b/vp8/vp8cx_arm.mk +index f0753d9..16009f9 100644 +--- a/vp8/vp8cx_arm.mk ++++ b/vp8/vp8cx_arm.mk +@@ -1,10 +1,11 @@ + ## + ## Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ## +-## Use of this source code is governed by a BSD-style license and patent +-## grant that can be found in the LICENSE file in the root of the source +-## tree. All contributing project authors may be found in the AUTHORS +-## file in the root of the source tree. ++## 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. + ## + + +diff --git a/vp8/vp8dx.h b/vp8/vp8dx.h +deleted file mode 100644 +index 7310b3b..0000000 +--- a/vp8/vp8dx.h ++++ /dev/null +@@ -1,41 +0,0 @@ +-/* +- * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. +- * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. +- */ +- +- +-#include "vp8.h" +- +-/*!\defgroup vp8_decoder WebM VP8 Decoder +- * \ingroup vp8 +- * +- * @{ +- */ +-/*!\file vp8dx.h +- * \brief Provides definitions for using the VP8 algorithm within the vpx Decoder +- * interface. +- */ +-#ifndef VP8DX_H +-#define VP8DX_H +-#include "vpx_codec_impl_top.h" +- +-/*!\brief Algorithm interface for VP8 +- * +- * This interface provides the capability to decode raw VP8 streams, as would +- * be found in AVI files and other non-Flash uses. +- */ +-extern vpx_codec_iface_t vpx_codec_vp8_dx_algo; +- +-/* Include controls common to both the encoder and decoder */ +-#include "vp8.h" +- +- +-/*! @} - end defgroup vp8_decoder */ +- +- +-#include "vpx_codec_impl_bottom.h" +-#endif +diff --git a/vp8/vp8dx.mk b/vp8/vp8dx.mk +index e6af543..24f18b7 100644 +--- a/vp8/vp8dx.mk ++++ b/vp8/vp8dx.mk +@@ -1,14 +1,18 @@ + ## + ## Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ## +-## Use of this source code is governed by a BSD-style license and patent +-## grant that can be found in the LICENSE file in the root of the source +-## tree. All contributing project authors may be found in the AUTHORS +-## file in the root of the source tree. ++## 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 $(SRC_PATH_BARE)/$(VP8_PREFIX)vp8_common.mk ++ ++VP8_DX_EXPORTS += exports_dec ++ + VP8_DX_SRCS-yes += $(VP8_COMMON_SRCS-yes) + VP8_DX_SRCS-no += $(VP8_COMMON_SRCS-no) + VP8_DX_SRCS_REMOVE-yes += $(VP8_COMMON_SRCS_REMOVE-yes) +@@ -18,7 +22,7 @@ ifeq ($(ARCH_ARM),yes) + include $(SRC_PATH_BARE)/$(VP8_PREFIX)vp8dx_arm.mk + endif + +-VP8_DX_SRCS-yes += vp8dx.h vp8_dx_iface.c ++VP8_DX_SRCS-yes += vp8_dx_iface.c + + CFLAGS+=-I$(SRC_PATH_BARE)/$(VP8_PREFIX)decoder + +@@ -69,8 +73,6 @@ VP8_DX_SRCS-yes += decoder/threading.c + + VP8_DX_SRCS-yes := $(filter-out $(VP8_DX_SRCS_REMOVE-yes),$(VP8_DX_SRCS-yes)) + +-INSTALL-LIBS-yes += include/vp8.h include/vp8dx.h +- + VP8_DX_SRCS-$(ARCH_X86)$(ARCH_X86_64) += decoder/x86/dequantize_x86.h + VP8_DX_SRCS-$(ARCH_X86)$(ARCH_X86_64) += decoder/x86/x86_dsystemdependent.c + VP8_DX_SRCS-$(HAVE_MMX) += decoder/x86/dequantize_mmx.asm +diff --git a/vp8/vp8dx_arm.mk b/vp8/vp8dx_arm.mk +index 1b4a7ec..58ccac5 100644 +--- a/vp8/vp8dx_arm.mk ++++ b/vp8/vp8dx_arm.mk +@@ -1,10 +1,11 @@ + ## + ## Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ## +-## Use of this source code is governed by a BSD-style license and patent +-## grant that can be found in the LICENSE file in the root of the source +-## tree. All contributing project authors may be found in the AUTHORS +-## file in the root of the source tree. ++## 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. + ## + + +diff --git a/vp8/vp8e.h b/vp8/vp8e.h +deleted file mode 100644 +index a90aa2a..0000000 +--- a/vp8/vp8e.h ++++ /dev/null +@@ -1,62 +0,0 @@ +-/* +- * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. +- * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. +- */ +- +- +-/* This file contains backwards compatibility stubs for applications using +- * the VP8 version 1.0 API. +- */ +-#ifndef VP8E_H +-#define VP8E_H +-#include "vpx_codec_impl_top.h" +- +-#if defined(VPX_CODEC_DISABLE_COMPAT) && VPX_CODEC_DISABLE_COMPAT +-#error "Backwards compatibility disabled: don't include vp8e.h" +-#endif +- +-#include "vp8cx.h" +-DECLSPEC_DEPRECATED extern vpx_codec_iface_t vpx_enc_vp8_algo DEPRECATED; +- +- +-enum +-{ +- VP8E_SET_REFERENCE = VP8_SET_REFERENCE, +- VP8E_COPY_REFERENCE = VP8_COPY_REFERENCE, +- VP8E_SET_PREVIEWPP = VP8_SET_POSTPROC, +- VP8E_SET_FLUSHFLAG = 4, +- VP8E_SET_FRAMETYPE = 10, +- VP8E_SET_ENCODING_MODE = 12 +-}; +- +-#define NORMAL_FRAME (0) +-#define KEY_FRAME (1) +- +-/* Change VP8E to VP8 to get the undeprecated version of these (defined in +- * vp8.h) +- */ +-VPX_CTRL_USE_TYPE_DEPRECATED(VP8E_SET_REFERENCE, vpx_ref_frame_t *) +-VPX_CTRL_USE_TYPE_DEPRECATED(VP8E_COPY_REFERENCE, vpx_ref_frame_t *) +-VPX_CTRL_USE_TYPE_DEPRECATED(VP8E_SET_PREVIEWPP, vp8_postproc_cfg_t *) +- +- +-/* Flush is done by calling vpx_codec_encode with a NULL input image. */ +-VPX_CTRL_USE_TYPE_DEPRECATED(VP8E_SET_FLUSHFLAG, int) +- +- +-/* Frame type is set with a flag to vpx_codec_control. See VPX_EFLAG_FORCE_KF +- */ +-VPX_CTRL_USE_TYPE_DEPRECATED(VP8E_SET_FRAMETYPE, int) +- +- +-/* This control has been deprecated in favor of the duration parameter to +- * vpx_codec_encode(). Use the #VPX_DL_REALTIME, #VPX_DL_GOOD_QUALITY, +- * #VPX_DL_BEST_QUALITY constants to that parameter instead. +- */ +-VPX_CTRL_USE_TYPE_DEPRECATED(VP8E_SET_ENCODING_MODE, vp8e_encoding_mode) +-#include "vpx_codec_impl_bottom.h" +-#endif +diff --git a/vpx/exports_com b/vpx/exports_com +new file mode 100644 +index 0000000..2ab0509 +--- /dev/null ++++ b/vpx/exports_com +@@ -0,0 +1,16 @@ ++text vpx_codec_build_config ++text vpx_codec_control_ ++text vpx_codec_destroy ++text vpx_codec_err_to_string ++text vpx_codec_error ++text vpx_codec_error_detail ++text vpx_codec_get_caps ++text vpx_codec_iface_name ++text vpx_codec_version ++text vpx_codec_version_extra_str ++text vpx_codec_version_str ++text vpx_img_alloc ++text vpx_img_flip ++text vpx_img_free ++text vpx_img_set_rect ++text vpx_img_wrap +diff --git a/vpx/exports_dec b/vpx/exports_dec +new file mode 100644 +index 0000000..ed121f7 +--- /dev/null ++++ b/vpx/exports_dec +@@ -0,0 +1,9 @@ ++text vpx_codec_dec_init_ver ++text vpx_codec_decode ++text vpx_codec_get_frame ++text vpx_codec_get_mem_map ++text vpx_codec_get_stream_info ++text vpx_codec_peek_stream_info ++text vpx_codec_register_put_frame_cb ++text vpx_codec_register_put_slice_cb ++text vpx_codec_set_mem_map +diff --git a/vpx/exports_enc b/vpx/exports_enc +new file mode 100644 +index 0000000..3d56749 +--- /dev/null ++++ b/vpx/exports_enc +@@ -0,0 +1,8 @@ ++text vpx_codec_enc_config_default ++text vpx_codec_enc_config_set ++text vpx_codec_enc_init_ver ++text vpx_codec_encode ++text vpx_codec_get_cx_data ++text vpx_codec_get_global_headers ++text vpx_codec_get_preview_frame ++text vpx_codec_set_cx_data_buf +diff --git a/vpx/internal/vpx_codec_internal.h b/vpx/internal/vpx_codec_internal.h +new file mode 100644 +index 0000000..c653cc5 +--- /dev/null ++++ b/vpx/internal/vpx_codec_internal.h +@@ -0,0 +1,457 @@ ++/* ++ * Copyright (c) 2010 The VP8 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. ++ */ ++ ++ ++/*!\file decoder_impl.h ++ * \brief Describes the decoder algorithm interface for algorithm ++ * implementations. ++ * ++ * This file defines the private structures and data types that are only ++ * relevant to implementing an algorithm, as opposed to using it. ++ * ++ * To create a decoder algorithm class, an interface structure is put ++ * into the global namespace: ++ * <pre> ++ * my_codec.c: ++ * vpx_codec_iface_t my_codec = { ++ * "My Codec v1.0", ++ * VPX_CODEC_ALG_ABI_VERSION, ++ * ... ++ * }; ++ * </pre> ++ * ++ * An application instantiates a specific decoder instance by using ++ * vpx_codec_init() and a pointer to the algorithm's interface structure: ++ * <pre> ++ * my_app.c: ++ * extern vpx_codec_iface_t my_codec; ++ * { ++ * vpx_codec_ctx_t algo; ++ * res = vpx_codec_init(&algo, &my_codec); ++ * } ++ * </pre> ++ * ++ * Once initialized, the instance is manged using other functions from ++ * the vpx_codec_* family. ++ */ ++#ifndef VPX_CODEC_INTERNAL_H ++#define VPX_CODEC_INTERNAL_H ++#include "../vpx_decoder.h" ++#include "../vpx_encoder.h" ++#include <stdarg.h> ++ ++ ++/*!\brief Current ABI version number ++ * ++ * \internal ++ * If this file is altered in any way that changes the ABI, this value ++ * must be bumped. Examples include, but are not limited to, changing ++ * types, removing or reassigning enums, adding/removing/rearranging ++ * fields to structures ++ */ ++#define VPX_CODEC_INTERNAL_ABI_VERSION (3) /**<\hideinitializer*/ ++ ++typedef struct vpx_codec_alg_priv vpx_codec_alg_priv_t; ++ ++/*!\brief init function pointer prototype ++ * ++ * Performs algorithm-specific initialization of the decoder context. This ++ * function is called by the generic vpx_codec_init() wrapper function, so ++ * plugins implementing this interface may trust the input parameters to be ++ * properly initialized. ++ * ++ * \param[in] ctx Pointer to this instance's context ++ * \retval #VPX_CODEC_OK ++ * The input stream was recognized and decoder initialized. ++ * \retval #VPX_CODEC_MEM_ERROR ++ * Memory operation failed. ++ */ ++typedef vpx_codec_err_t (*vpx_codec_init_fn_t)(vpx_codec_ctx_t *ctx); ++ ++/*!\brief destroy function pointer prototype ++ * ++ * Performs algorithm-specific destruction of the decoder context. This ++ * function is called by the generic vpx_codec_destroy() wrapper function, ++ * so plugins implementing this interface may trust the input parameters ++ * to be properly initialized. ++ * ++ * \param[in] ctx Pointer to this instance's context ++ * \retval #VPX_CODEC_OK ++ * The input stream was recognized and decoder initialized. ++ * \retval #VPX_CODEC_MEM_ERROR ++ * Memory operation failed. ++ */ ++typedef vpx_codec_err_t (*vpx_codec_destroy_fn_t)(vpx_codec_alg_priv_t *ctx); ++ ++/*!\brief parse stream info function pointer prototype ++ * ++ * Performs high level parsing of the bitstream. This function is called by ++ * the generic vpx_codec_parse_stream() wrapper function, so plugins implementing ++ * this interface may trust the input parameters to be properly initialized. ++ * ++ * \param[in] data Pointer to a block of data to parse ++ * \param[in] data_sz Size of the data buffer ++ * \param[in,out] si Pointer to stream info to update. The size member ++ * \ref MUST be properly initialized, but \ref MAY be ++ * clobbered by the algorithm. This parameter \ref MAY ++ * be NULL. ++ * ++ * \retval #VPX_CODEC_OK ++ * Bitstream is parsable and stream information updated ++ */ ++typedef vpx_codec_err_t (*vpx_codec_peek_si_fn_t)(const uint8_t *data, ++ unsigned int data_sz, ++ vpx_codec_stream_info_t *si); ++ ++/*!\brief Return information about the current stream. ++ * ++ * Returns information about the stream that has been parsed during decoding. ++ * ++ * \param[in] ctx Pointer to this instance's context ++ * \param[in,out] si Pointer to stream info to update. The size member ++ * \ref MUST be properly initialized, but \ref MAY be ++ * clobbered by the algorithm. This parameter \ref MAY ++ * be NULL. ++ * ++ * \retval #VPX_CODEC_OK ++ * Bitstream is parsable and stream information updated ++ */ ++typedef vpx_codec_err_t (*vpx_codec_get_si_fn_t)(vpx_codec_alg_priv_t *ctx, ++ vpx_codec_stream_info_t *si); ++ ++/*!\brief control function pointer prototype ++ * ++ * This function is used to exchange algorithm specific data with the decoder ++ * instance. This can be used to implement features specific to a particular ++ * algorithm. ++ * ++ * This function is called by the generic vpx_codec_control() wrapper ++ * function, so plugins implementing this interface may trust the input ++ * parameters to be properly initialized. However, this interface does not ++ * provide type safety for the exchanged data or assign meanings to the ++ * control codes. Those details should be specified in the algorithm's ++ * header file. In particular, the ctrl_id parameter is guaranteed to exist ++ * in the algorithm's control mapping table, and the data paramter may be NULL. ++ * ++ * ++ * \param[in] ctx Pointer to this instance's context ++ * \param[in] ctrl_id Algorithm specific control identifier ++ * \param[in,out] data Data to exchange with algorithm instance. ++ * ++ * \retval #VPX_CODEC_OK ++ * The internal state data was deserialized. ++ */ ++typedef vpx_codec_err_t (*vpx_codec_control_fn_t)(vpx_codec_alg_priv_t *ctx, ++ int ctrl_id, ++ va_list ap); ++ ++/*!\brief control function pointer mapping ++ * ++ * This structure stores the mapping between control identifiers and ++ * implementing functions. Each algorithm provides a list of these ++ * mappings. This list is searched by the vpx_codec_control() wrapper ++ * function to determine which function to invoke. The special ++ * value {0, NULL} is used to indicate end-of-list, and must be ++ * present. The special value {0, <non-null>} can be used as a catch-all ++ * mapping. This implies that ctrl_id values chosen by the algorithm ++ * \ref MUST be non-zero. ++ */ ++typedef const struct ++{ ++ int ctrl_id; ++ vpx_codec_control_fn_t fn; ++} vpx_codec_ctrl_fn_map_t; ++ ++/*!\brief decode data function pointer prototype ++ * ++ * Processes a buffer of coded data. If the processing results in a new ++ * decoded frame becoming available, #VPX_CODEC_CB_PUT_SLICE and ++ * #VPX_CODEC_CB_PUT_FRAME events are generated as appropriate. This ++ * function is called by the generic vpx_codec_decode() wrapper function, ++ * so plugins implementing this interface may trust the input parameters ++ * to be properly initialized. ++ * ++ * \param[in] ctx Pointer to this instance's context ++ * \param[in] data Pointer to this block of new coded data. If ++ * NULL, a #VPX_CODEC_CB_PUT_FRAME event is posted ++ * for the previously decoded frame. ++ * \param[in] data_sz Size of the coded data, in bytes. ++ * ++ * \return Returns #VPX_CODEC_OK if the coded data was processed completely ++ * and future pictures can be decoded without error. Otherwise, ++ * see the descriptions of the other error codes in ::vpx_codec_err_t ++ * for recoverability capabilities. ++ */ ++typedef vpx_codec_err_t (*vpx_codec_decode_fn_t)(vpx_codec_alg_priv_t *ctx, ++ const uint8_t *data, ++ unsigned int data_sz, ++ void *user_priv, ++ long deadline); ++ ++/*!\brief Decoded frames iterator ++ * ++ * Iterates over a list of the frames available for display. The iterator ++ * storage should be initialized to NULL to start the iteration. Iteration is ++ * complete when this function returns NULL. ++ * ++ * The list of available frames becomes valid upon completion of the ++ * vpx_codec_decode call, and remains valid until the next call to vpx_codec_decode. ++ * ++ * \param[in] ctx Pointer to this instance's context ++ * \param[in out] iter Iterator storage, initialized to NULL ++ * ++ * \return Returns a pointer to an image, if one is ready for display. Frames ++ * produced will always be in PTS (presentation time stamp) order. ++ */ ++typedef vpx_image_t*(*vpx_codec_get_frame_fn_t)(vpx_codec_alg_priv_t *ctx, ++ vpx_codec_iter_t *iter); ++ ++ ++/*\brief e_xternal Memory Allocation memory map get iterator ++ * ++ * Iterates over a list of the memory maps requested by the decoder. The ++ * iterator storage should be initialized to NULL to start the iteration. ++ * Iteration is complete when this function returns NULL. ++ * ++ * \param[in out] iter Iterator storage, initialized to NULL ++ * ++ * \return Returns a pointer to an memory segment descriptor, or NULL to ++ * indicate end-of-list. ++ */ ++typedef vpx_codec_err_t (*vpx_codec_get_mmap_fn_t)(const vpx_codec_ctx_t *ctx, ++ vpx_codec_mmap_t *mmap, ++ vpx_codec_iter_t *iter); ++ ++ ++/*\brief e_xternal Memory Allocation memory map set iterator ++ * ++ * Sets a memory descriptor inside the decoder instance. ++ * ++ * \param[in] ctx Pointer to this instance's context ++ * \param[in] mmap Memory map to store. ++ * ++ * \retval #VPX_CODEC_OK ++ * The memory map was accepted and stored. ++ * \retval #VPX_CODEC_MEM_ERROR ++ * The memory map was rejected. ++ */ ++typedef vpx_codec_err_t (*vpx_codec_set_mmap_fn_t)(vpx_codec_ctx_t *ctx, ++ const vpx_codec_mmap_t *mmap); ++ ++ ++typedef vpx_codec_err_t (*vpx_codec_encode_fn_t)(vpx_codec_alg_priv_t *ctx, ++ const vpx_image_t *img, ++ vpx_codec_pts_t pts, ++ unsigned long duration, ++ vpx_enc_frame_flags_t flags, ++ unsigned long deadline); ++typedef const vpx_codec_cx_pkt_t*(*vpx_codec_get_cx_data_fn_t)(vpx_codec_alg_priv_t *ctx, ++ vpx_codec_iter_t *iter); ++ ++typedef vpx_codec_err_t ++(*vpx_codec_enc_config_set_fn_t)(vpx_codec_alg_priv_t *ctx, ++ const vpx_codec_enc_cfg_t *cfg); ++typedef vpx_fixed_buf_t * ++(*vpx_codec_get_global_headers_fn_t)(vpx_codec_alg_priv_t *ctx); ++ ++typedef vpx_image_t * ++(*vpx_codec_get_preview_frame_fn_t)(vpx_codec_alg_priv_t *ctx); ++ ++/*!\brief usage configuration mapping ++ * ++ * This structure stores the mapping between usage identifiers and ++ * configuration structures. Each algorithm provides a list of these ++ * mappings. This list is searched by the vpx_codec_enc_config_default() ++ * wrapper function to determine which config to return. The special value ++ * {-1, {0}} is used to indicate end-of-list, and must be present. At least ++ * one mapping must be present, in addition to the end-of-list. ++ * ++ */ ++typedef const struct ++{ ++ int usage; ++ vpx_codec_enc_cfg_t cfg; ++} vpx_codec_enc_cfg_map_t; ++ ++#define NOT_IMPLEMENTED 0 ++ ++/*!\brief Decoder algorithm interface interface ++ * ++ * All decoders \ref MUST expose a variable of this type. ++ */ ++struct vpx_codec_iface ++{ ++ const char *name; /**< Identification String */ ++ int abi_version; /**< Implemented ABI version */ ++ vpx_codec_caps_t caps; /**< Decoder capabilities */ ++ vpx_codec_init_fn_t init; /**< \copydoc ::vpx_codec_init_fn_t */ ++ vpx_codec_destroy_fn_t destroy; /**< \copydoc ::vpx_codec_destroy_fn_t */ ++ vpx_codec_ctrl_fn_map_t *ctrl_maps; /**< \copydoc ::vpx_codec_ctrl_fn_map_t */ ++ vpx_codec_get_mmap_fn_t get_mmap; /**< \copydoc ::vpx_codec_get_mmap_fn_t */ ++ vpx_codec_set_mmap_fn_t set_mmap; /**< \copydoc ::vpx_codec_set_mmap_fn_t */ ++ struct ++ { ++ vpx_codec_peek_si_fn_t peek_si; /**< \copydoc ::vpx_codec_peek_si_fn_t */ ++ vpx_codec_get_si_fn_t get_si; /**< \copydoc ::vpx_codec_peek_si_fn_t */ ++ vpx_codec_decode_fn_t decode; /**< \copydoc ::vpx_codec_decode_fn_t */ ++ vpx_codec_get_frame_fn_t get_frame; /**< \copydoc ::vpx_codec_get_frame_fn_t */ ++ } dec; ++ struct ++ { ++ vpx_codec_enc_cfg_map_t *cfg_maps; /**< \copydoc ::vpx_codec_enc_cfg_map_t */ ++ vpx_codec_encode_fn_t encode; /**< \copydoc ::vpx_codec_encode_fn_t */ ++ vpx_codec_get_cx_data_fn_t get_cx_data; /**< \copydoc ::vpx_codec_get_cx_data_fn_t */ ++ vpx_codec_enc_config_set_fn_t cfg_set; /**< \copydoc ::vpx_codec_enc_config_set_fn_t */ ++ vpx_codec_get_global_headers_fn_t get_glob_hdrs; /**< \copydoc ::vpx_codec_enc_config_set_fn_t */ ++ vpx_codec_get_preview_frame_fn_t get_preview; /**< \copydoc ::vpx_codec_get_preview_frame_fn_t */ ++ } enc; ++}; ++ ++/*!\brief Callback function pointer / user data pair storage */ ++typedef struct vpx_codec_priv_cb_pair ++{ ++ union ++ { ++ vpx_codec_put_frame_cb_fn_t put_frame; ++ vpx_codec_put_slice_cb_fn_t put_slice; ++ }; ++ void *user_priv; ++} vpx_codec_priv_cb_pair_t; ++ ++ ++/*!\brief Instance private storage ++ * ++ * This structure is allocated by the algorithm's init function. It can be ++ * extended in one of two ways. First, a second, algorithm specific structure ++ * can be allocated and the priv member pointed to it. Alternatively, this ++ * structure can be made the first member of the algorithm specific structure, ++ * and the pointer casted to the proper type. ++ */ ++struct vpx_codec_priv ++{ ++ unsigned int sz; ++ vpx_codec_iface_t *iface; ++ struct vpx_codec_alg_priv *alg_priv; ++ const char *err_detail; ++ vpx_codec_flags_t init_flags; ++ struct ++ { ++ vpx_codec_priv_cb_pair_t put_frame_cb; ++ vpx_codec_priv_cb_pair_t put_slice_cb; ++ } dec; ++ struct ++ { ++ int tbd; ++ struct vpx_fixed_buf cx_data_dst_buf; ++ unsigned int cx_data_pad_before; ++ unsigned int cx_data_pad_after; ++ vpx_codec_cx_pkt_t cx_data_pkt; ++ } enc; ++}; ++ ++#undef VPX_CTRL_USE_TYPE ++#define VPX_CTRL_USE_TYPE(id, typ) \ ++ static typ id##__value(va_list args) {return va_arg(args, typ);} \ ++ static typ id##__convert(void *x)\ ++ {\ ++ union\ ++ {\ ++ void *x;\ ++ typ d;\ ++ } u;\ ++ u.x = x;\ ++ return u.d;\ ++ } ++ ++ ++#undef VPX_CTRL_USE_TYPE_DEPRECATED ++#define VPX_CTRL_USE_TYPE_DEPRECATED(id, typ) \ ++ static typ id##__value(va_list args) {return va_arg(args, typ);} \ ++ static typ id##__convert(void *x)\ ++ {\ ++ union\ ++ {\ ++ void *x;\ ++ typ d;\ ++ } u;\ ++ u.x = x;\ ++ return u.d;\ ++ } ++ ++#define CAST(id, arg) id##__value(arg) ++#define RECAST(id, x) id##__convert(x) ++ ++ ++/* Internal Utility Functions ++ * ++ * The following functions are indended to be used inside algorithms as ++ * utilities for manipulating vpx_codec_* data structures. ++ */ ++struct vpx_codec_pkt_list ++{ ++ unsigned int cnt; ++ unsigned int max; ++ struct vpx_codec_cx_pkt pkts[1]; ++}; ++ ++#define vpx_codec_pkt_list_decl(n)\ ++ union {struct vpx_codec_pkt_list head;\ ++ struct {struct vpx_codec_pkt_list head;\ ++ struct vpx_codec_cx_pkt pkts[n];} alloc;} ++ ++#define vpx_codec_pkt_list_init(m)\ ++ (m)->alloc.head.cnt = 0,\ ++ (m)->alloc.head.max = sizeof((m)->alloc.pkts) / sizeof((m)->alloc.pkts[0]) ++ ++int ++vpx_codec_pkt_list_add(struct vpx_codec_pkt_list *, ++ const struct vpx_codec_cx_pkt *); ++ ++const vpx_codec_cx_pkt_t* ++vpx_codec_pkt_list_get(struct vpx_codec_pkt_list *list, ++ vpx_codec_iter_t *iter); ++ ++ ++#include <stdio.h> ++#include <setjmp.h> ++struct vpx_internal_error_info ++{ ++ vpx_codec_err_t error_code; ++ int has_detail; ++ char detail[80]; ++ int setjmp; ++ jmp_buf jmp; ++}; ++ ++static void vpx_internal_error(struct vpx_internal_error_info *info, ++ vpx_codec_err_t error, ++ const char *fmt, ++ ...) ++{ ++ va_list ap; ++ ++ info->error_code = error; ++ info->has_detail = 0; ++ ++ if (fmt) ++ { ++ size_t sz = sizeof(info->detail); ++ ++ info->has_detail = 1; ++ va_start(ap, fmt); ++ vsnprintf(info->detail, sz - 1, fmt, ap); ++ va_end(ap); ++ info->detail[sz-1] = '\0'; ++ } ++ ++ if (info->setjmp) ++ longjmp(info->jmp, info->error_code); ++} ++#endif +diff --git a/vpx/src/vpx_codec.c b/vpx/src/vpx_codec.c +new file mode 100644 +index 0000000..0ef3a7b +--- /dev/null ++++ b/vpx/src/vpx_codec.c +@@ -0,0 +1,150 @@ ++/* ++ * Copyright (c) 2010 The VP8 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. ++ */ ++ ++ ++/*!\file vpx_decoder.c ++ * \brief Provides the high level interface to wrap decoder algorithms. ++ * ++ */ ++#include <stdarg.h> ++#include "vpx/vpx_integer.h" ++#include "vpx/internal/vpx_codec_internal.h" ++#include "vpx_version.h" ++ ++#define SAVE_STATUS(ctx,var) (ctx?(ctx->err = var):var) ++ ++int vpx_codec_version(void) ++{ ++ return VERSION_PACKED; ++} ++ ++ ++const char *vpx_codec_version_str(void) ++{ ++ return VERSION_STRING_NOSP; ++} ++ ++ ++const char *vpx_codec_version_extra_str(void) ++{ ++ return VERSION_EXTRA; ++} ++ ++ ++const char *vpx_codec_iface_name(vpx_codec_iface_t *iface) ++{ ++ return iface ? iface->name : "<invalid interface>"; ++} ++ ++const char *vpx_codec_err_to_string(vpx_codec_err_t err) ++{ ++ switch (err) ++ { ++ case VPX_CODEC_OK: ++ return "Success"; ++ case VPX_CODEC_ERROR: ++ return "Unspecified internal error"; ++ case VPX_CODEC_MEM_ERROR: ++ return "Memory allocation error"; ++ case VPX_CODEC_ABI_MISMATCH: ++ return "ABI version mismatch"; ++ case VPX_CODEC_INCAPABLE: ++ return "Codec does not implement requested capability"; ++ case VPX_CODEC_UNSUP_BITSTREAM: ++ return "Bitstream not supported by this decoder"; ++ case VPX_CODEC_UNSUP_FEATURE: ++ return "Bitstream required feature not supported by this decoder"; ++ case VPX_CODEC_CORRUPT_FRAME: ++ return "Corrupt frame detected"; ++ case VPX_CODEC_INVALID_PARAM: ++ return "Invalid parameter"; ++ case VPX_CODEC_LIST_END: ++ return "End of iterated list"; ++ } ++ ++ return "Unrecognized error code"; ++} ++ ++const char *vpx_codec_error(vpx_codec_ctx_t *ctx) ++{ ++ return (ctx) ? vpx_codec_err_to_string(ctx->err) ++ : vpx_codec_err_to_string(VPX_CODEC_INVALID_PARAM); ++} ++ ++const char *vpx_codec_error_detail(vpx_codec_ctx_t *ctx) ++{ ++ if (ctx && ctx->err) ++ return ctx->priv ? ctx->priv->err_detail : ctx->err_detail; ++ ++ return NULL; ++} ++ ++ ++vpx_codec_err_t vpx_codec_destroy(vpx_codec_ctx_t *ctx) ++{ ++ vpx_codec_err_t res; ++ ++ if (!ctx) ++ res = VPX_CODEC_INVALID_PARAM; ++ else if (!ctx->iface || !ctx->priv) ++ res = VPX_CODEC_ERROR; ++ else ++ { ++ if (ctx->priv->alg_priv) ++ ctx->iface->destroy(ctx->priv->alg_priv); ++ ++ ctx->iface = NULL; ++ ctx->name = NULL; ++ ctx->priv = NULL; ++ res = VPX_CODEC_OK; ++ } ++ ++ return SAVE_STATUS(ctx, res); ++} ++ ++ ++vpx_codec_caps_t vpx_codec_get_caps(vpx_codec_iface_t *iface) ++{ ++ return (iface) ? iface->caps : 0; ++} ++ ++ ++vpx_codec_err_t vpx_codec_control_(vpx_codec_ctx_t *ctx, ++ int ctrl_id, ++ ...) ++{ ++ vpx_codec_err_t res; ++ ++ if (!ctx || !ctrl_id) ++ res = VPX_CODEC_INVALID_PARAM; ++ else if (!ctx->iface || !ctx->priv || !ctx->iface->ctrl_maps) ++ res = VPX_CODEC_ERROR; ++ else ++ { ++ vpx_codec_ctrl_fn_map_t *entry; ++ ++ res = VPX_CODEC_ERROR; ++ ++ for (entry = ctx->iface->ctrl_maps; entry && entry->fn; entry++) ++ { ++ if (!entry->ctrl_id || entry->ctrl_id == ctrl_id) ++ { ++ va_list ap; ++ ++ va_start(ap, ctrl_id); ++ res = entry->fn(ctx->priv->alg_priv, ctrl_id, ap); ++ va_end(ap); ++ break; ++ } ++ } ++ } ++ ++ return SAVE_STATUS(ctx, res); ++} +diff --git a/vpx/src/vpx_decoder.c b/vpx/src/vpx_decoder.c +new file mode 100644 +index 0000000..cbf5259 +--- /dev/null ++++ b/vpx/src/vpx_decoder.c +@@ -0,0 +1,237 @@ ++/* ++ * Copyright (c) 2010 The VP8 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. ++ */ ++ ++ ++/*!\file vpx_decoder.c ++ * \brief Provides the high level interface to wrap decoder algorithms. ++ * ++ */ ++#include <string.h> ++#include "vpx/internal/vpx_codec_internal.h" ++ ++#define SAVE_STATUS(ctx,var) (ctx?(ctx->err = var):var) ++ ++vpx_codec_err_t vpx_codec_dec_init_ver(vpx_codec_ctx_t *ctx, ++ vpx_codec_iface_t *iface, ++ vpx_codec_dec_cfg_t *cfg, ++ vpx_codec_flags_t flags, ++ int ver) ++{ ++ vpx_codec_err_t res; ++ ++ if (ver != VPX_DECODER_ABI_VERSION) ++ res = VPX_CODEC_ABI_MISMATCH; ++ else if (!ctx || !iface) ++ res = VPX_CODEC_INVALID_PARAM; ++ else if (iface->abi_version != VPX_CODEC_INTERNAL_ABI_VERSION) ++ res = VPX_CODEC_ABI_MISMATCH; ++ else if ((flags & VPX_CODEC_USE_XMA) && !(iface->caps & VPX_CODEC_CAP_XMA)) ++ res = VPX_CODEC_INCAPABLE; ++ else if ((flags & VPX_CODEC_USE_POSTPROC) && !(iface->caps & VPX_CODEC_CAP_POSTPROC)) ++ res = VPX_CODEC_INCAPABLE; ++ else ++ { ++ memset(ctx, 0, sizeof(*ctx)); ++ ctx->iface = iface; ++ ctx->name = iface->name; ++ ctx->priv = NULL; ++ ctx->init_flags = flags; ++ ctx->config.dec = cfg; ++ res = VPX_CODEC_OK; ++ ++ if (!(flags & VPX_CODEC_USE_XMA)) ++ { ++ res = ctx->iface->init(ctx); ++ ++ if (res) ++ { ++ ctx->err_detail = ctx->priv ? ctx->priv->err_detail : NULL; ++ vpx_codec_destroy(ctx); ++ } ++ ++ if (ctx->priv) ++ ctx->priv->iface = ctx->iface; ++ } ++ } ++ ++ return SAVE_STATUS(ctx, res); ++} ++ ++ ++vpx_codec_err_t vpx_codec_peek_stream_info(vpx_codec_iface_t *iface, ++ const uint8_t *data, ++ unsigned int data_sz, ++ vpx_codec_stream_info_t *si) ++{ ++ vpx_codec_err_t res; ++ ++ if (!iface || !data || !data_sz || !si ++ || si->sz < sizeof(vpx_codec_stream_info_t)) ++ res = VPX_CODEC_INVALID_PARAM; ++ else ++ { ++ /* Set default/unknown values */ ++ si->w = 0; ++ si->h = 0; ++ ++ res = iface->dec.peek_si(data, data_sz, si); ++ } ++ ++ return res; ++} ++ ++ ++vpx_codec_err_t vpx_codec_get_stream_info(vpx_codec_ctx_t *ctx, ++ vpx_codec_stream_info_t *si) ++{ ++ vpx_codec_err_t res; ++ ++ if (!ctx || !si || si->sz < sizeof(vpx_codec_stream_info_t)) ++ res = VPX_CODEC_INVALID_PARAM; ++ else if (!ctx->iface || !ctx->priv) ++ res = VPX_CODEC_ERROR; ++ else ++ { ++ /* Set default/unknown values */ ++ si->w = 0; ++ si->h = 0; ++ ++ res = ctx->iface->dec.get_si(ctx->priv->alg_priv, si); ++ } ++ ++ return SAVE_STATUS(ctx, res); ++} ++ ++ ++vpx_codec_err_t vpx_codec_decode(vpx_codec_ctx_t *ctx, ++ const uint8_t *data, ++ unsigned int data_sz, ++ void *user_priv, ++ long deadline) ++{ ++ vpx_codec_err_t res; ++ ++ if (!ctx || !data || !data_sz) ++ res = VPX_CODEC_INVALID_PARAM; ++ else if (!ctx->iface || !ctx->priv) ++ res = VPX_CODEC_ERROR; ++ else ++ { ++ res = ctx->iface->dec.decode(ctx->priv->alg_priv, data, data_sz, ++ user_priv, deadline); ++ } ++ ++ return SAVE_STATUS(ctx, res); ++} ++ ++vpx_image_t *vpx_codec_get_frame(vpx_codec_ctx_t *ctx, ++ vpx_codec_iter_t *iter) ++{ ++ vpx_image_t *img; ++ ++ if (!ctx || !iter || !ctx->iface || !ctx->priv) ++ img = NULL; ++ else ++ img = ctx->iface->dec.get_frame(ctx->priv->alg_priv, iter); ++ ++ return img; ++} ++ ++ ++vpx_codec_err_t vpx_codec_register_put_frame_cb(vpx_codec_ctx_t *ctx, ++ vpx_codec_put_frame_cb_fn_t cb, ++ void *user_priv) ++{ ++ vpx_codec_err_t res; ++ ++ if (!ctx || !cb) ++ res = VPX_CODEC_INVALID_PARAM; ++ else if (!ctx->iface || !ctx->priv ++ || !(ctx->iface->caps & VPX_CODEC_CAP_PUT_FRAME)) ++ res = VPX_CODEC_ERROR; ++ else ++ { ++ ctx->priv->dec.put_frame_cb.put_frame = cb; ++ ctx->priv->dec.put_frame_cb.user_priv = user_priv; ++ res = VPX_CODEC_OK; ++ } ++ ++ return SAVE_STATUS(ctx, res); ++} ++ ++ ++vpx_codec_err_t vpx_codec_register_put_slice_cb(vpx_codec_ctx_t *ctx, ++ vpx_codec_put_slice_cb_fn_t cb, ++ void *user_priv) ++{ ++ vpx_codec_err_t res; ++ ++ if (!ctx || !cb) ++ res = VPX_CODEC_INVALID_PARAM; ++ else if (!ctx->iface || !ctx->priv ++ || !(ctx->iface->caps & VPX_CODEC_CAP_PUT_FRAME)) ++ res = VPX_CODEC_ERROR; ++ else ++ { ++ ctx->priv->dec.put_slice_cb.put_slice = cb; ++ ctx->priv->dec.put_slice_cb.user_priv = user_priv; ++ res = VPX_CODEC_OK; ++ } ++ ++ return SAVE_STATUS(ctx, res); ++} ++ ++ ++vpx_codec_err_t vpx_codec_get_mem_map(vpx_codec_ctx_t *ctx, ++ vpx_codec_mmap_t *mmap, ++ vpx_codec_iter_t *iter) ++{ ++ vpx_codec_err_t res = VPX_CODEC_OK; ++ ++ if (!ctx || !mmap || !iter || !ctx->iface) ++ res = VPX_CODEC_INVALID_PARAM; ++ else if (!(ctx->iface->caps & VPX_CODEC_CAP_XMA)) ++ res = VPX_CODEC_ERROR; ++ else ++ res = ctx->iface->get_mmap(ctx, mmap, iter); ++ ++ return SAVE_STATUS(ctx, res); ++} ++ ++ ++vpx_codec_err_t vpx_codec_set_mem_map(vpx_codec_ctx_t *ctx, ++ vpx_codec_mmap_t *mmap, ++ unsigned int num_maps) ++{ ++ vpx_codec_err_t res = VPX_CODEC_MEM_ERROR; ++ ++ if (!ctx || !mmap || !ctx->iface) ++ res = VPX_CODEC_INVALID_PARAM; ++ else if (!(ctx->iface->caps & VPX_CODEC_CAP_XMA)) ++ res = VPX_CODEC_ERROR; ++ else ++ { ++ unsigned int i; ++ ++ for (i = 0; i < num_maps; i++, mmap++) ++ { ++ if (!mmap->base) ++ break; ++ ++ /* Everything look ok, set the mmap in the decoder */ ++ res = ctx->iface->set_mmap(ctx, mmap); ++ ++ if (res) ++ break; ++ } ++ } ++ ++ return SAVE_STATUS(ctx, res); ++} +diff --git a/vpx/src/vpx_decoder_compat.c b/vpx/src/vpx_decoder_compat.c +new file mode 100644 +index 0000000..d5cc16e +--- /dev/null ++++ b/vpx/src/vpx_decoder_compat.c +@@ -0,0 +1,201 @@ ++/* ++ * Copyright (c) 2010 The VP8 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. ++ */ ++ ++ ++/*!\file vpx_decoder.c ++ * \brief Provides the high level interface to wrap decoder algorithms. ++ * ++ */ ++#include <stdlib.h> ++#include <string.h> ++#include "vpx/vpx_decoder.h" ++#include "vpx/internal/vpx_codec_internal.h" ++ ++#define SAVE_STATUS(ctx,var) (ctx?(ctx->err = var):var) ++ ++const char *vpx_dec_iface_name(vpx_dec_iface_t *iface) ++{ ++ return vpx_codec_iface_name((vpx_codec_iface_t *)iface); ++} ++ ++const char *vpx_dec_err_to_string(vpx_dec_err_t err) ++{ ++ return vpx_codec_err_to_string(err); ++} ++ ++const char *vpx_dec_error(vpx_dec_ctx_t *ctx) ++{ ++ return vpx_codec_error((vpx_codec_ctx_t *)ctx); ++} ++ ++const char *vpx_dec_error_detail(vpx_dec_ctx_t *ctx) ++{ ++ return vpx_codec_error_detail((vpx_codec_ctx_t *)ctx); ++} ++ ++ ++vpx_dec_err_t vpx_dec_init_ver(vpx_dec_ctx_t *ctx, ++ vpx_dec_iface_t *iface, ++ int ver) ++{ ++ return vpx_codec_dec_init_ver((vpx_codec_ctx_t *)ctx, ++ (vpx_codec_iface_t *)iface, ++ NULL, ++ 0, ++ ver); ++} ++ ++ ++vpx_dec_err_t vpx_dec_destroy(vpx_dec_ctx_t *ctx) ++{ ++ return vpx_codec_destroy((vpx_codec_ctx_t *)ctx); ++} ++ ++ ++vpx_dec_caps_t vpx_dec_get_caps(vpx_dec_iface_t *iface) ++{ ++ return vpx_codec_get_caps((vpx_codec_iface_t *)iface); ++} ++ ++ ++vpx_dec_err_t vpx_dec_peek_stream_info(vpx_dec_iface_t *iface, ++ const uint8_t *data, ++ unsigned int data_sz, ++ vpx_dec_stream_info_t *si) ++{ ++ return vpx_codec_peek_stream_info((vpx_codec_iface_t *)iface, data, data_sz, ++ (vpx_codec_stream_info_t *)si); ++} ++ ++ ++vpx_dec_err_t vpx_dec_get_stream_info(vpx_dec_ctx_t *ctx, ++ vpx_dec_stream_info_t *si) ++{ ++ return vpx_codec_get_stream_info((vpx_codec_ctx_t *)ctx, ++ (vpx_codec_stream_info_t *)si); ++} ++ ++ ++vpx_dec_err_t vpx_dec_control(vpx_dec_ctx_t *ctx, ++ int ctrl_id, ++ void *data) ++{ ++ return vpx_codec_control_((vpx_codec_ctx_t *)ctx, ctrl_id, data); ++} ++ ++ ++vpx_dec_err_t vpx_dec_decode(vpx_dec_ctx_t *ctx, ++ uint8_t *data, ++ unsigned int data_sz, ++ void *user_priv, ++ int rel_pts) ++{ ++ (void)rel_pts; ++ return vpx_codec_decode((vpx_codec_ctx_t *)ctx, data, data_sz, user_priv, ++ 0); ++} ++ ++vpx_image_t *vpx_dec_get_frame(vpx_dec_ctx_t *ctx, ++ vpx_dec_iter_t *iter) ++{ ++ return vpx_codec_get_frame((vpx_codec_ctx_t *)ctx, iter); ++} ++ ++ ++vpx_dec_err_t vpx_dec_register_put_frame_cb(vpx_dec_ctx_t *ctx, ++ vpx_dec_put_frame_cb_fn_t cb, ++ void *user_priv) ++{ ++ return vpx_codec_register_put_frame_cb((vpx_codec_ctx_t *)ctx, cb, ++ user_priv); ++} ++ ++ ++vpx_dec_err_t vpx_dec_register_put_slice_cb(vpx_dec_ctx_t *ctx, ++ vpx_dec_put_slice_cb_fn_t cb, ++ void *user_priv) ++{ ++ return vpx_codec_register_put_slice_cb((vpx_codec_ctx_t *)ctx, cb, ++ user_priv); ++} ++ ++ ++vpx_dec_err_t vpx_dec_xma_init_ver(vpx_dec_ctx_t *ctx, ++ vpx_dec_iface_t *iface, ++ int ver) ++{ ++ return vpx_codec_dec_init_ver((vpx_codec_ctx_t *)ctx, ++ (vpx_codec_iface_t *)iface, ++ NULL, ++ VPX_CODEC_USE_XMA, ++ ver); ++} ++ ++vpx_dec_err_t vpx_dec_get_mem_map(vpx_dec_ctx_t *ctx_, ++ vpx_dec_mmap_t *mmap, ++ const vpx_dec_stream_info_t *si, ++ vpx_dec_iter_t *iter) ++{ ++ vpx_codec_ctx_t *ctx = (vpx_codec_ctx_t *)ctx_; ++ vpx_dec_err_t res = VPX_DEC_OK; ++ ++ if (!ctx || !mmap || !si || !iter || !ctx->iface) ++ res = VPX_DEC_INVALID_PARAM; ++ else if (!(ctx->iface->caps & VPX_DEC_CAP_XMA)) ++ res = VPX_DEC_ERROR; ++ else ++ { ++ if (!ctx->config.dec) ++ { ++ ctx->config.dec = malloc(sizeof(vpx_codec_dec_cfg_t)); ++ ctx->config.dec->w = si->w; ++ ctx->config.dec->h = si->h; ++ } ++ ++ res = ctx->iface->get_mmap(ctx, mmap, iter); ++ } ++ ++ return SAVE_STATUS(ctx, res); ++} ++ ++ ++vpx_dec_err_t vpx_dec_set_mem_map(vpx_dec_ctx_t *ctx_, ++ vpx_dec_mmap_t *mmap, ++ unsigned int num_maps) ++{ ++ vpx_codec_ctx_t *ctx = (vpx_codec_ctx_t *)ctx_; ++ vpx_dec_err_t res = VPX_DEC_MEM_ERROR; ++ ++ if (!ctx || !mmap || !ctx->iface) ++ res = VPX_DEC_INVALID_PARAM; ++ else if (!(ctx->iface->caps & VPX_DEC_CAP_XMA)) ++ res = VPX_DEC_ERROR; ++ else ++ { ++ void *save = (ctx->priv) ? NULL : ctx->config.dec; ++ unsigned int i; ++ ++ for (i = 0; i < num_maps; i++, mmap++) ++ { ++ if (!mmap->base) ++ break; ++ ++ /* Everything look ok, set the mmap in the decoder */ ++ res = ctx->iface->set_mmap(ctx, mmap); ++ ++ if (res) ++ break; ++ } ++ ++ if (save) free(save); ++ } ++ ++ return SAVE_STATUS(ctx, res); ++} +diff --git a/vpx/src/vpx_encoder.c b/vpx/src/vpx_encoder.c +new file mode 100644 +index 0000000..f43328f +--- /dev/null ++++ b/vpx/src/vpx_encoder.c +@@ -0,0 +1,312 @@ ++/* ++ * Copyright (c) 2010 The VP8 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. ++ */ ++ ++ ++/*!\file vpx_encoder.c ++ * \brief Provides the high level interface to wrap encoder algorithms. ++ * ++ */ ++#include <limits.h> ++#include <string.h> ++#include "vpx/internal/vpx_codec_internal.h" ++ ++#define SAVE_STATUS(ctx,var) (ctx?(ctx->err = var):var) ++ ++vpx_codec_err_t vpx_codec_enc_init_ver(vpx_codec_ctx_t *ctx, ++ vpx_codec_iface_t *iface, ++ vpx_codec_enc_cfg_t *cfg, ++ vpx_codec_flags_t flags, ++ int ver) ++{ ++ vpx_codec_err_t res; ++ ++ if (ver != VPX_ENCODER_ABI_VERSION) ++ res = VPX_CODEC_ABI_MISMATCH; ++ else if (!ctx || !iface || !cfg) ++ res = VPX_CODEC_INVALID_PARAM; ++ else if (iface->abi_version != VPX_CODEC_INTERNAL_ABI_VERSION) ++ res = VPX_CODEC_ABI_MISMATCH; ++ else if (!(iface->caps & VPX_CODEC_CAP_ENCODER)) ++ res = VPX_CODEC_INCAPABLE; ++ else if ((flags & VPX_CODEC_USE_XMA) && !(iface->caps & VPX_CODEC_CAP_XMA)) ++ res = VPX_CODEC_INCAPABLE; ++ else if ((flags & VPX_CODEC_USE_PSNR) ++ && !(iface->caps & VPX_CODEC_CAP_PSNR)) ++ res = VPX_CODEC_INCAPABLE; ++ else ++ { ++ ctx->iface = iface; ++ ctx->name = iface->name; ++ ctx->priv = NULL; ++ ctx->init_flags = flags; ++ ctx->config.enc = cfg; ++ res = ctx->iface->init(ctx); ++ ++ if (res) ++ { ++ ctx->err_detail = ctx->priv ? ctx->priv->err_detail : NULL; ++ vpx_codec_destroy(ctx); ++ } ++ ++ if (ctx->priv) ++ ctx->priv->iface = ctx->iface; ++ } ++ ++ return SAVE_STATUS(ctx, res); ++} ++ ++ ++ ++vpx_codec_err_t vpx_codec_enc_config_default(vpx_codec_iface_t *iface, ++ vpx_codec_enc_cfg_t *cfg, ++ unsigned int usage) ++{ ++ vpx_codec_err_t res; ++ vpx_codec_enc_cfg_map_t *map; ++ ++ if (!iface || !cfg || usage > INT_MAX) ++ res = VPX_CODEC_INVALID_PARAM; ++ else if (!(iface->caps & VPX_CODEC_CAP_ENCODER)) ++ res = VPX_CODEC_INCAPABLE; ++ else ++ { ++ res = VPX_CODEC_INVALID_PARAM; ++ ++ for (map = iface->enc.cfg_maps; map->usage >= 0; map++) ++ { ++ if (map->usage == (int)usage) ++ { ++ *cfg = map->cfg; ++ cfg->g_usage = usage; ++ res = VPX_CODEC_OK; ++ break; ++ } ++ } ++ } ++ ++ return res; ++} ++ ++ ++#if ARCH_X86 || ARCH_X86_64 ++/* On X86, disable the x87 unit's internal 80 bit precision for better ++ * consistency with the SSE unit's 64 bit precision. ++ */ ++#include "vpx_ports/x86.h" ++#define FLOATING_POINT_INIT() do {\ ++ unsigned short x87_orig_mode = x87_set_double_precision(); ++#define FLOATING_POINT_RESTORE() \ ++ x87_set_control_word(x87_orig_mode); }while(0) ++ ++ ++#else ++static void FLOATING_POINT_INIT() {} ++static void FLOATING_POINT_RESTORE() {} ++#endif ++ ++ ++vpx_codec_err_t vpx_codec_encode(vpx_codec_ctx_t *ctx, ++ const vpx_image_t *img, ++ vpx_codec_pts_t pts, ++ unsigned long duration, ++ vpx_enc_frame_flags_t flags, ++ unsigned long deadline) ++{ ++ vpx_codec_err_t res; ++ ++ if (!ctx || (img && !duration)) ++ res = VPX_CODEC_INVALID_PARAM; ++ else if (!ctx->iface || !ctx->priv) ++ res = VPX_CODEC_ERROR; ++ else if (!(ctx->iface->caps & VPX_CODEC_CAP_ENCODER)) ++ res = VPX_CODEC_INCAPABLE; ++ else ++ { ++ /* Execute in a normalized floating point environment, if the platform ++ * requires it. ++ */ ++ FLOATING_POINT_INIT(); ++ res = ctx->iface->enc.encode(ctx->priv->alg_priv, img, pts, ++ duration, flags, deadline); ++ FLOATING_POINT_RESTORE(); ++ } ++ ++ return SAVE_STATUS(ctx, res); ++} ++ ++ ++const vpx_codec_cx_pkt_t *vpx_codec_get_cx_data(vpx_codec_ctx_t *ctx, ++ vpx_codec_iter_t *iter) ++{ ++ const vpx_codec_cx_pkt_t *pkt = NULL; ++ ++ if (ctx) ++ { ++ if (!iter) ++ ctx->err = VPX_CODEC_INVALID_PARAM; ++ else if (!ctx->iface || !ctx->priv) ++ ctx->err = VPX_CODEC_ERROR; ++ else if (!(ctx->iface->caps & VPX_CODEC_CAP_ENCODER)) ++ ctx->err = VPX_CODEC_INCAPABLE; ++ else ++ pkt = ctx->iface->enc.get_cx_data(ctx->priv->alg_priv, iter); ++ } ++ ++ if (pkt && pkt->kind == VPX_CODEC_CX_FRAME_PKT) ++ { ++ /* If the application has specified a destination area for the ++ * compressed data, and the codec has not placed the data there, ++ * and it fits, copy it. ++ */ ++ char *dst_buf = ctx->priv->enc.cx_data_dst_buf.buf; ++ ++ if (dst_buf ++ && pkt->data.raw.buf != dst_buf ++ && pkt->data.raw.sz ++ + ctx->priv->enc.cx_data_pad_before ++ + ctx->priv->enc.cx_data_pad_after ++ <= ctx->priv->enc.cx_data_dst_buf.sz) ++ { ++ vpx_codec_cx_pkt_t *modified_pkt = &ctx->priv->enc.cx_data_pkt; ++ ++ memcpy(dst_buf + ctx->priv->enc.cx_data_pad_before, ++ pkt->data.raw.buf, pkt->data.raw.sz); ++ *modified_pkt = *pkt; ++ modified_pkt->data.raw.buf = dst_buf; ++ modified_pkt->data.raw.sz += ctx->priv->enc.cx_data_pad_before ++ + ctx->priv->enc.cx_data_pad_after; ++ pkt = modified_pkt; ++ } ++ ++ if (dst_buf == pkt->data.raw.buf) ++ { ++ ctx->priv->enc.cx_data_dst_buf.buf = dst_buf + pkt->data.raw.sz; ++ ctx->priv->enc.cx_data_dst_buf.sz -= pkt->data.raw.sz; ++ } ++ } ++ ++ return pkt; ++} ++ ++ ++vpx_codec_err_t vpx_codec_set_cx_data_buf(vpx_codec_ctx_t *ctx, ++ const vpx_fixed_buf_t *buf, ++ unsigned int pad_before, ++ unsigned int pad_after) ++{ ++ if (!ctx || !ctx->priv) ++ return VPX_CODEC_INVALID_PARAM; ++ ++ if (buf) ++ { ++ ctx->priv->enc.cx_data_dst_buf = *buf; ++ ctx->priv->enc.cx_data_pad_before = pad_before; ++ ctx->priv->enc.cx_data_pad_after = pad_after; ++ } ++ else ++ { ++ ctx->priv->enc.cx_data_dst_buf.buf = NULL; ++ ctx->priv->enc.cx_data_dst_buf.sz = 0; ++ ctx->priv->enc.cx_data_pad_before = 0; ++ ctx->priv->enc.cx_data_pad_after = 0; ++ } ++ ++ return VPX_CODEC_OK; ++} ++ ++ ++const vpx_image_t *vpx_codec_get_preview_frame(vpx_codec_ctx_t *ctx) ++{ ++ vpx_image_t *img = NULL; ++ ++ if (ctx) ++ { ++ if (!ctx->iface || !ctx->priv) ++ ctx->err = VPX_CODEC_ERROR; ++ else if (!(ctx->iface->caps & VPX_CODEC_CAP_ENCODER)) ++ ctx->err = VPX_CODEC_INCAPABLE; ++ else if (!ctx->iface->enc.get_preview) ++ ctx->err = VPX_CODEC_INCAPABLE; ++ else ++ img = ctx->iface->enc.get_preview(ctx->priv->alg_priv); ++ } ++ ++ return img; ++} ++ ++ ++vpx_fixed_buf_t *vpx_codec_get_global_headers(vpx_codec_ctx_t *ctx) ++{ ++ vpx_fixed_buf_t *buf = NULL; ++ ++ if (ctx) ++ { ++ if (!ctx->iface || !ctx->priv) ++ ctx->err = VPX_CODEC_ERROR; ++ else if (!(ctx->iface->caps & VPX_CODEC_CAP_ENCODER)) ++ ctx->err = VPX_CODEC_INCAPABLE; ++ else if (!ctx->iface->enc.get_glob_hdrs) ++ ctx->err = VPX_CODEC_INCAPABLE; ++ else ++ buf = ctx->iface->enc.get_glob_hdrs(ctx->priv->alg_priv); ++ } ++ ++ return buf; ++} ++ ++ ++vpx_codec_err_t vpx_codec_enc_config_set(vpx_codec_ctx_t *ctx, ++ const vpx_codec_enc_cfg_t *cfg) ++{ ++ vpx_codec_err_t res; ++ ++ if (!ctx || !ctx->iface || !ctx->priv || !cfg) ++ res = VPX_CODEC_INVALID_PARAM; ++ else if (!(ctx->iface->caps & VPX_CODEC_CAP_ENCODER)) ++ res = VPX_CODEC_INCAPABLE; ++ else ++ res = ctx->iface->enc.cfg_set(ctx->priv->alg_priv, cfg); ++ ++ return SAVE_STATUS(ctx, res); ++} ++ ++ ++int vpx_codec_pkt_list_add(struct vpx_codec_pkt_list *list, ++ const struct vpx_codec_cx_pkt *pkt) ++{ ++ if (list->cnt < list->max) ++ { ++ list->pkts[list->cnt++] = *pkt; ++ return 0; ++ } ++ ++ return 1; ++} ++ ++ ++const vpx_codec_cx_pkt_t *vpx_codec_pkt_list_get(struct vpx_codec_pkt_list *list, ++ vpx_codec_iter_t *iter) ++{ ++ const vpx_codec_cx_pkt_t *pkt; ++ ++ if (!(*iter)) ++ { ++ *iter = list->pkts; ++ } ++ ++ pkt = (const void *) * iter; ++ ++ if (pkt - list->pkts < list->cnt) ++ *iter = pkt + 1; ++ else ++ pkt = NULL; ++ ++ return pkt; ++} +diff --git a/vpx/src/vpx_image.c b/vpx/src/vpx_image.c +new file mode 100644 +index 0000000..e8a2959 +--- /dev/null ++++ b/vpx/src/vpx_image.c +@@ -0,0 +1,262 @@ ++/* ++ * Copyright (c) 2010 The VP8 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 <stdlib.h> ++#include <string.h> ++#include "vpx/vpx_image.h" ++ ++static vpx_image_t *img_alloc_helper(vpx_image_t *img, ++ vpx_img_fmt_t fmt, ++ unsigned int d_w, ++ unsigned int d_h, ++ unsigned int stride_align, ++ unsigned char *img_data) ++{ ++ ++ unsigned int h, w, s, xcs, ycs, bps; ++ int align; ++ ++ /* Treat align==0 like align==1 */ ++ if (!stride_align) ++ stride_align = 1; ++ ++ /* Validate alignment (must be power of 2) */ ++ if (stride_align & (stride_align - 1)) ++ goto fail; ++ ++ /* Get sample size for this format */ ++ switch (fmt) ++ { ++ case VPX_IMG_FMT_RGB32: ++ case VPX_IMG_FMT_RGB32_LE: ++ case VPX_IMG_FMT_ARGB: ++ case VPX_IMG_FMT_ARGB_LE: ++ bps = 32; ++ break; ++ case VPX_IMG_FMT_RGB24: ++ case VPX_IMG_FMT_BGR24: ++ bps = 24; ++ break; ++ case VPX_IMG_FMT_RGB565: ++ case VPX_IMG_FMT_RGB565_LE: ++ case VPX_IMG_FMT_RGB555: ++ case VPX_IMG_FMT_RGB555_LE: ++ case VPX_IMG_FMT_UYVY: ++ case VPX_IMG_FMT_YUY2: ++ case VPX_IMG_FMT_YVYU: ++ bps = 16; ++ break; ++ case VPX_IMG_FMT_I420: ++ case VPX_IMG_FMT_YV12: ++ case VPX_IMG_FMT_VPXI420: ++ case VPX_IMG_FMT_VPXYV12: ++ bps = 12; ++ break; ++ default: ++ bps = 16; ++ break; ++ } ++ ++ /* Get chroma shift values for this format */ ++ switch (fmt) ++ { ++ case VPX_IMG_FMT_I420: ++ case VPX_IMG_FMT_YV12: ++ case VPX_IMG_FMT_VPXI420: ++ case VPX_IMG_FMT_VPXYV12: ++ xcs = 1; ++ break; ++ default: ++ xcs = 0; ++ break; ++ } ++ ++ switch (fmt) ++ { ++ case VPX_IMG_FMT_I420: ++ case VPX_IMG_FMT_YV12: ++ case VPX_IMG_FMT_VPXI420: ++ case VPX_IMG_FMT_VPXYV12: ++ ycs = 1; ++ break; ++ default: ++ ycs = 0; ++ break; ++ } ++ ++ /* Calculate storage sizes given the chroma subsampling */ ++ align = (1 << xcs) - 1; ++ w = (d_w + align) & ~align; ++ align = (1 << ycs) - 1; ++ h = (d_h + align) & ~align; ++ s = (fmt & VPX_IMG_FMT_PLANAR) ? w : bps * w / 8; ++ s = (s + stride_align - 1) & ~(stride_align - 1); ++ ++ /* Allocate the new image */ ++ if (!img) ++ { ++ img = (vpx_image_t *)calloc(1, sizeof(vpx_image_t)); ++ ++ if (!img) ++ goto fail; ++ ++ img->self_allocd = 1; ++ } ++ else ++ { ++ memset(img, 0, sizeof(vpx_image_t)); ++ } ++ ++ img->img_data = img_data; ++ ++ if (!img_data) ++ { ++ img->img_data = malloc((fmt & VPX_IMG_FMT_PLANAR) ? h * w * bps / 8 : h * s); ++ img->img_data_owner = 1; ++ } ++ ++ if (!img->img_data) ++ goto fail; ++ ++ img->fmt = fmt; ++ img->w = w; ++ img->h = h; ++ img->x_chroma_shift = xcs; ++ img->y_chroma_shift = ycs; ++ img->bps = bps; ++ ++ /* Calculate strides */ ++ img->stride[VPX_PLANE_Y] = img->stride[VPX_PLANE_ALPHA] = s; ++ img->stride[VPX_PLANE_U] = img->stride[VPX_PLANE_V] = s >> xcs; ++ ++ /* Default viewport to entire image */ ++ if (!vpx_img_set_rect(img, 0, 0, d_w, d_h)) ++ return img; ++ ++fail: ++ vpx_img_free(img); ++ return NULL; ++} ++ ++vpx_image_t *vpx_img_alloc(vpx_image_t *img, ++ vpx_img_fmt_t fmt, ++ unsigned int d_w, ++ unsigned int d_h, ++ unsigned int stride_align) ++{ ++ return img_alloc_helper(img, fmt, d_w, d_h, stride_align, NULL); ++} ++ ++vpx_image_t *vpx_img_wrap(vpx_image_t *img, ++ vpx_img_fmt_t fmt, ++ unsigned int d_w, ++ unsigned int d_h, ++ unsigned int stride_align, ++ unsigned char *img_data) ++{ ++ return img_alloc_helper(img, fmt, d_w, d_h, stride_align, img_data); ++} ++ ++int vpx_img_set_rect(vpx_image_t *img, ++ unsigned int x, ++ unsigned int y, ++ unsigned int w, ++ unsigned int h) ++{ ++ unsigned char *data; ++ ++ if (x + w <= img->w && y + h <= img->h) ++ { ++ img->d_w = w; ++ img->d_h = h; ++ ++ /* Calculate plane pointers */ ++ if (!(img->fmt & VPX_IMG_FMT_PLANAR)) ++ { ++ img->planes[VPX_PLANE_PACKED] = ++ img->img_data + x * img->bps / 8 + y * img->stride[VPX_PLANE_PACKED]; ++ } ++ else ++ { ++ data = img->img_data; ++ ++ if (img->fmt & VPX_IMG_FMT_HAS_ALPHA) ++ { ++ img->planes[VPX_PLANE_ALPHA] = ++ data + x + y * img->stride[VPX_PLANE_ALPHA]; ++ data += img->h * img->stride[VPX_PLANE_ALPHA]; ++ } ++ ++ img->planes[VPX_PLANE_Y] = data + x + y * img->stride[VPX_PLANE_Y]; ++ data += img->h * img->stride[VPX_PLANE_Y]; ++ ++ if (!(img->fmt & VPX_IMG_FMT_UV_FLIP)) ++ { ++ img->planes[VPX_PLANE_U] = data ++ + (x >> img->x_chroma_shift) ++ + (y >> img->y_chroma_shift) * img->stride[VPX_PLANE_U]; ++ data += (img->h >> img->y_chroma_shift) * img->stride[VPX_PLANE_U]; ++ img->planes[VPX_PLANE_V] = data ++ + (x >> img->x_chroma_shift) ++ + (y >> img->y_chroma_shift) * img->stride[VPX_PLANE_V]; ++ } ++ else ++ { ++ img->planes[VPX_PLANE_V] = data ++ + (x >> img->x_chroma_shift) ++ + (y >> img->y_chroma_shift) * img->stride[VPX_PLANE_V]; ++ data += (img->h >> img->y_chroma_shift) * img->stride[VPX_PLANE_V]; ++ img->planes[VPX_PLANE_U] = data ++ + (x >> img->x_chroma_shift) ++ + (y >> img->y_chroma_shift) * img->stride[VPX_PLANE_U]; ++ } ++ } ++ ++ return 0; ++ } ++ ++ return -1; ++} ++ ++void vpx_img_flip(vpx_image_t *img) ++{ ++ /* Note: In the calculation pointer adjustment calculation, we want the ++ * rhs to be promoted to a signed type. Section 6.3.1.8 of the ISO C99 ++ * standard indicates that if the adjustment parameter is unsigned, the ++ * stride parameter will be promoted to unsigned, causing errors when ++ * the lhs is a larger type than the rhs. ++ */ ++ img->planes[VPX_PLANE_Y] += (signed)(img->d_h - 1) * img->stride[VPX_PLANE_Y]; ++ img->stride[VPX_PLANE_Y] = -img->stride[VPX_PLANE_Y]; ++ ++ img->planes[VPX_PLANE_U] += (signed)((img->d_h >> img->y_chroma_shift) - 1) ++ * img->stride[VPX_PLANE_U]; ++ img->stride[VPX_PLANE_U] = -img->stride[VPX_PLANE_U]; ++ ++ img->planes[VPX_PLANE_V] += (signed)((img->d_h >> img->y_chroma_shift) - 1) ++ * img->stride[VPX_PLANE_V]; ++ img->stride[VPX_PLANE_V] = -img->stride[VPX_PLANE_V]; ++ ++ img->planes[VPX_PLANE_ALPHA] += (signed)(img->d_h - 1) * img->stride[VPX_PLANE_ALPHA]; ++ img->stride[VPX_PLANE_ALPHA] = -img->stride[VPX_PLANE_ALPHA]; ++} ++ ++void vpx_img_free(vpx_image_t *img) ++{ ++ if (img) ++ { ++ if (img->img_data && img->img_data_owner) ++ free(img->img_data); ++ ++ if (img->self_allocd) ++ free(img); ++ } ++} +diff --git a/vpx/vp8.h b/vpx/vp8.h +new file mode 100644 +index 0000000..a493ef6 +--- /dev/null ++++ b/vpx/vp8.h +@@ -0,0 +1,117 @@ ++/* ++ * Copyright (c) 2010 The VP8 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. ++ */ ++ ++ ++/*!\defgroup vp8 VP8 ++ * \ingroup codecs ++ * VP8 is vpx's newest video compression algorithm that uses motion ++ * compensated prediction, Discrete Cosine Transform (DCT) coding of the ++ * prediction error signal and context dependent entropy coding techniques ++ * based on arithmatic principles. It features: ++ * - YUV 4:2:0 image format ++ * - Macro-block based coding (16x16 luma plus two 8x8 chroma) ++ * - 1/4 (1/8) pixel accuracy motion compensated prediction ++ * - 4x4 DCT transform ++ * - 128 level linear quantizer ++ * - In loop deblocking filter ++ * - Context-based entropy coding ++ * ++ * @{ ++ */ ++/*!\file vp8.h ++ * \brief Provides controls common to both the VP8 encoder and decoder. ++ */ ++#ifndef VP8_H ++#define VP8_H ++#include "vpx/vpx_codec_impl_top.h" ++ ++/*!\brief Control functions ++ * ++ * The set of macros define the control functions of VP8 interface ++ */ ++enum vp8_dec_control_id ++{ ++ VP8_SET_REFERENCE = 1, /**< pass in an external frame into decoder to be used as reference frame */ ++ VP8_COPY_REFERENCE = 2, /**< get a copy of reference frame from the decoder */ ++ VP8_SET_POSTPROC = 3, /**< set decoder's the post processing settings */ ++ VP8_COMMON_CTRL_ID_MAX ++}; ++ ++/*!\brief post process flags ++ * ++ * The set of macros define VP8 decoder post processing flags ++ */ ++enum vp8_postproc_level ++{ ++ VP8_NOFILTERING = 0, ++ VP8_DEBLOCK = 1, ++ VP8_DEMACROBLOCK = 2, ++ VP8_ADDNOISE = 4, ++}; ++ ++/*!\brief post process flags ++ * ++ * This define a structure that describe the post processing settings. For ++ * the best objective measure (using thet PSNR metric) set post_proc_flag ++ * to VP8_DEBLOCK and deblocking_level to 1. ++ */ ++ ++typedef struct vp8_postproc_cfg ++{ ++ int post_proc_flag; /**< the types of post processing to be done, should be combination of "vp8_postproc_level" */ ++ int deblocking_level; /**< the strength of deblocking, valid range [0, 16] */ ++ int noise_level; /**< the strength of additive noise, valid range [0, 16] */ ++} vp8_postproc_cfg_t; ++ ++/*!\brief reference frame type ++ * ++ * The set of macros define the type of VP8 reference frames ++ */ ++typedef enum vpx_ref_frame_type ++{ ++ VP8_LAST_FRAME = 1, ++ VP8_GOLD_FRAME = 2, ++ VP8_ALTR_FRAME = 4 ++} vpx_ref_frame_type_t; ++ ++/*!\brief reference frame data struct ++ * ++ * define the data struct to access vp8 reference frames ++ */ ++ ++typedef struct vpx_ref_frame ++{ ++ vpx_ref_frame_type_t frame_type; /**< which reference frame */ ++ vpx_image_t img; /**< reference frame data in image format */ ++} vpx_ref_frame_t; ++ ++ ++/*!\brief vp8 decoder control funciton parameter type ++ * ++ * defines the data type for each of VP8 decoder control funciton requires ++ */ ++ ++VPX_CTRL_USE_TYPE(VP8_SET_REFERENCE, vpx_ref_frame_t *) ++VPX_CTRL_USE_TYPE(VP8_COPY_REFERENCE, vpx_ref_frame_t *) ++VPX_CTRL_USE_TYPE(VP8_SET_POSTPROC, vp8_postproc_cfg_t *) ++ ++ ++/*! @} - end defgroup vp8 */ ++ ++#if !defined(VPX_CODEC_DISABLE_COMPAT) || !VPX_CODEC_DISABLE_COMPAT ++/* The following definitions are provided for backward compatibility with ++ * the VP8 1.0.x SDK. USE IN PRODUCTION CODE IS NOT RECOMMENDED. ++ */ ++ ++DECLSPEC_DEPRECATED extern vpx_codec_iface_t vpx_codec_vp8_algo DEPRECATED; ++#endif ++ ++#include "vpx/vpx_codec_impl_bottom.h" ++#endif +diff --git a/vpx/vp8cx.h b/vpx/vp8cx.h +new file mode 100644 +index 0000000..1104064 +--- /dev/null ++++ b/vpx/vp8cx.h +@@ -0,0 +1,262 @@ ++/* ++ * Copyright (c) 2010 The VP8 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. ++ */ ++ ++ ++/*!\defgroup vp8_encoder WebM VP8 Encoder ++ * \ingroup vp8 ++ * ++ * @{ ++ */ ++#include "vp8.h" ++ ++/*!\file vp8cx.h ++ * \brief Provides definitions for using the VP8 encoder algorithm within the ++ * vpx Codec Interface. ++ */ ++#ifndef VP8CX_H ++#define VP8CX_H ++#include "vpx/vpx_codec_impl_top.h" ++ ++/*!\brief Algorithm interface for VP8 ++ * ++ * This interface provides the capability to encode raw VP8 streams, as would ++ * be found in AVI files. ++ */ ++extern vpx_codec_iface_t vpx_codec_vp8_cx_algo; ++ ++ ++/* ++ * Algorithm Flags ++ */ ++ ++/*!\brief Don't reference the last frame ++ * ++ * When this flag is set, the encoder will not use the last frame as a ++ * predictor. When not set, the encoder will choose whether to use the ++ * last frame or not automatically. ++ */ ++#define VP8_EFLAG_NO_REF_LAST (1<<16) ++ ++ ++/*!\brief Don't reference the golden frame ++ * ++ * When this flag is set, the encoder will not use the golden frame as a ++ * predictor. When not set, the encoder will choose whether to use the ++ * golden frame or not automatically. ++ */ ++#define VP8_EFLAG_NO_REF_GF (1<<17) ++ ++ ++/*!\brief Don't reference the alternate reference frame ++ * ++ * When this flag is set, the encoder will not use the alt ref frame as a ++ * predictor. When not set, the encoder will choose whether to use the ++ * alt ref frame or not automatically. ++ */ ++#define VP8_EFLAG_NO_REF_ARF (1<<21) ++ ++ ++/*!\brief Don't update the last frame ++ * ++ * When this flag is set, the encoder will not update the last frame with ++ * the contents of the current frame. ++ */ ++#define VP8_EFLAG_NO_UPD_LAST (1<<18) ++ ++ ++/*!\brief Don't update the golden frame ++ * ++ * When this flag is set, the encoder will not update the golden frame with ++ * the contents of the current frame. ++ */ ++#define VP8_EFLAG_NO_UPD_GF (1<<22) ++ ++ ++/*!\brief Don't update the alternate reference frame ++ * ++ * When this flag is set, the encoder will not update the alt ref frame with ++ * the contents of the current frame. ++ */ ++#define VP8_EFLAG_NO_UPD_ARF (1<<23) ++ ++ ++/*!\brief Force golden frame update ++ * ++ * When this flag is set, the encoder copy the contents of the current frame ++ * to the golden frame buffer. ++ */ ++#define VP8_EFLAG_FORCE_GF (1<<19) ++ ++ ++/*!\brief Force alternate reference frame update ++ * ++ * When this flag is set, the encoder copy the contents of the current frame ++ * to the alternate reference frame buffer. ++ */ ++#define VP8_EFLAG_FORCE_ARF (1<<24) ++ ++ ++/*!\brief Disable entropy update ++ * ++ * When this flag is set, the encoder will not update its internal entropy ++ * model based on the entropy of this frame. ++ */ ++#define VP8_EFLAG_NO_UPD_ENTROPY (1<<20) ++ ++ ++/*!\brief VP8 encoder control functions ++ * ++ * The set of macros define the control functions of VP8 encoder interface ++ */ ++enum vp8e_enc_control_id ++{ ++ VP8E_UPD_ENTROPY = 5, /**< control function to set mode of entropy update in encoder */ ++ VP8E_UPD_REFERENCE, /**< control function to set reference update mode in encoder */ ++ VP8E_USE_REFERENCE, /**< control function to set which reference frame encoder can use */ ++ VP8E_SET_ROI_MAP, /**< control function to pass an ROI map to encoder */ ++ VP8E_SET_ACTIVEMAP, /**< control function to pass an Active map to encoder */ ++ VP8E_SET_SCALEMODE = 11, /**< control function to set encoder scaling mode */ ++ VP8E_SET_CPUUSED = 13, /**< control function to set vp8 encoder cpuused */ ++ VP8E_SET_ENABLEAUTOALTREF, /**< control function to enable vp8 to automatic set and use altref frame */ ++ VP8E_SET_NOISE_SENSITIVITY, /**< control function to set noise sensitivity */ ++ VP8E_SET_SHARPNESS, /**< control function to set sharpness */ ++ VP8E_SET_STATIC_THRESHOLD, /**< control function to set the threshold for macroblocks treated static */ ++ VP8E_SET_TOKEN_PARTITIONS, /**< control function to set the number of token partitions */ ++ VP8E_GET_LAST_QUANTIZER, /**< return the quantizer chosen by the ++ encoder for the last frame using the internal ++ scale */ ++ VP8E_GET_LAST_QUANTIZER_64, /**< return the quantizer chosen by the ++ encoder for the last frame, using the 0..63 ++ scale as used by the rc_*_quantizer config ++ parameters */ ++ VP8E_SET_ARNR_MAXFRAMES, /**< control function to set the max number of frames blurred creating arf*/ ++ VP8E_SET_ARNR_STRENGTH , /**< control function to set the filter strength for the arf */ ++ VP8E_SET_ARNR_TYPE , /**< control function to set the type of filter to use for the arf*/ ++} ; ++ ++/*!\brief vpx 1-D scaling mode ++ * ++ * This set of constants define 1-D vpx scaling modes ++ */ ++typedef enum vpx_scaling_mode_1d ++{ ++ VP8E_NORMAL = 0, ++ VP8E_FOURFIVE = 1, ++ VP8E_THREEFIVE = 2, ++ VP8E_ONETWO = 3 ++} VPX_SCALING_MODE; ++ ++ ++/*!\brief vpx region of interest map ++ * ++ * These defines the data structures for the region of interest map ++ * ++ */ ++ ++typedef struct vpx_roi_map ++{ ++ unsigned char *roi_map; /**< specify an id between 0 and 3 for each 16x16 region within a frame */ ++ unsigned int rows; /**< number of rows */ ++ unsigned int cols; /**< number of cols */ ++ int delta_q[4]; /**< quantizer delta [-64, 64] off baseline for regions with id between 0 and 3*/ ++ int delta_lf[4]; /**< loop filter strength delta [-32, 32] for regions with id between 0 and 3 */ ++ unsigned int static_threshold[4];/**< threshold for region to be treated as static */ ++} vpx_roi_map_t; ++ ++/*!\brief vpx active region map ++ * ++ * These defines the data structures for active region map ++ * ++ */ ++ ++ ++typedef struct vpx_active_map ++{ ++ unsigned char *active_map; /**< specify an on (1) or off (0) each 16x16 region within a frame */ ++ unsigned int rows; /**< number of rows */ ++ unsigned int cols; /**< number of cols */ ++} vpx_active_map_t; ++ ++/*!\brief vpx image scaling mode ++ * ++ * This defines the data structure for image scaling mode ++ * ++ */ ++typedef struct vpx_scaling_mode ++{ ++ VPX_SCALING_MODE h_scaling_mode; /**< horizontal scaling mode */ ++ VPX_SCALING_MODE v_scaling_mode; /**< vertical scaling mode */ ++} vpx_scaling_mode_t; ++ ++/*!\brief VP8 encoding mode ++ * ++ * This defines VP8 encoding mode ++ * ++ */ ++typedef enum ++{ ++ VP8_BEST_QUALITY_ENCODING, ++ VP8_GOOD_QUALITY_ENCODING, ++ VP8_REAL_TIME_ENCODING ++} vp8e_encoding_mode; ++ ++/*!\brief VP8 token partition mode ++ * ++ * This defines VP8 partitioning mode for compressed data, i.e., the number of ++ * sub-streams in the bitstream. Used for parallelized decoding. ++ * ++ */ ++ ++typedef enum ++{ ++ VP8_ONE_TOKENPARTITION = 0, ++ VP8_TWO_TOKENPARTITION = 1, ++ VP8_FOUR_TOKENPARTITION = 2, ++ VP8_EIGHT_TOKENPARTITION = 3, ++} vp8e_token_partitions; ++ ++ ++/*!\brief VP8 encoder control function parameter type ++ * ++ * Defines the data types that VP8E control functions take. Note that ++ * additional common controls are defined in vp8.h ++ * ++ */ ++ ++ ++/* These controls have been deprecated in favor of the flags parameter to ++ * vpx_codec_encode(). See the definition of VP8_EFLAG_* above. ++ */ ++VPX_CTRL_USE_TYPE_DEPRECATED(VP8E_UPD_ENTROPY, int) ++VPX_CTRL_USE_TYPE_DEPRECATED(VP8E_UPD_REFERENCE, int) ++VPX_CTRL_USE_TYPE_DEPRECATED(VP8E_USE_REFERENCE, int) ++ ++VPX_CTRL_USE_TYPE(VP8E_SET_ROI_MAP, vpx_roi_map_t *) ++VPX_CTRL_USE_TYPE(VP8E_SET_ACTIVEMAP, vpx_active_map_t *) ++VPX_CTRL_USE_TYPE(VP8E_SET_SCALEMODE, vpx_scaling_mode_t *) ++ ++VPX_CTRL_USE_TYPE(VP8E_SET_CPUUSED, int) ++VPX_CTRL_USE_TYPE(VP8E_SET_ENABLEAUTOALTREF, unsigned int) ++VPX_CTRL_USE_TYPE(VP8E_SET_NOISE_SENSITIVITY, unsigned int) ++VPX_CTRL_USE_TYPE(VP8E_SET_SHARPNESS, unsigned int) ++VPX_CTRL_USE_TYPE(VP8E_SET_STATIC_THRESHOLD, unsigned int) ++VPX_CTRL_USE_TYPE(VP8E_SET_TOKEN_PARTITIONS, vp8e_token_partitions) ++ ++VPX_CTRL_USE_TYPE(VP8E_SET_ARNR_MAXFRAMES, unsigned int) ++VPX_CTRL_USE_TYPE(VP8E_SET_ARNR_STRENGTH , unsigned int) ++VPX_CTRL_USE_TYPE(VP8E_SET_ARNR_TYPE , unsigned int) ++ ++ ++VPX_CTRL_USE_TYPE(VP8E_GET_LAST_QUANTIZER, int *) ++VPX_CTRL_USE_TYPE(VP8E_GET_LAST_QUANTIZER_64, int *) ++ ++/*! @} - end defgroup vp8_encoder */ ++#include "vpx/vpx_codec_impl_bottom.h" ++#endif +diff --git a/vpx/vp8dx.h b/vpx/vp8dx.h +new file mode 100644 +index 0000000..d602e80 +--- /dev/null ++++ b/vpx/vp8dx.h +@@ -0,0 +1,42 @@ ++/* ++ * Copyright (c) 2010 The VP8 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 "vp8.h" ++ ++/*!\defgroup vp8_decoder WebM VP8 Decoder ++ * \ingroup vp8 ++ * ++ * @{ ++ */ ++/*!\file vp8dx.h ++ * \brief Provides definitions for using the VP8 algorithm within the vpx Decoder ++ * interface. ++ */ ++#ifndef VP8DX_H ++#define VP8DX_H ++#include "vpx/vpx_codec_impl_top.h" ++ ++/*!\brief Algorithm interface for VP8 ++ * ++ * This interface provides the capability to decode raw VP8 streams, as would ++ * be found in AVI files and other non-Flash uses. ++ */ ++extern vpx_codec_iface_t vpx_codec_vp8_dx_algo; ++ ++/* Include controls common to both the encoder and decoder */ ++#include "vp8.h" ++ ++ ++/*! @} - end defgroup vp8_decoder */ ++ ++ ++#include "vpx/vpx_codec_impl_bottom.h" ++#endif +diff --git a/vpx/vp8e.h b/vpx/vp8e.h +new file mode 100644 +index 0000000..f72fd24 +--- /dev/null ++++ b/vpx/vp8e.h +@@ -0,0 +1,63 @@ ++/* ++ * Copyright (c) 2010 The VP8 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 contains backwards compatibility stubs for applications using ++ * the VP8 version 1.0 API. ++ */ ++#ifndef VP8E_H ++#define VP8E_H ++#include "vpx/vpx_codec_impl_top.h" ++ ++#if defined(VPX_CODEC_DISABLE_COMPAT) && VPX_CODEC_DISABLE_COMPAT ++#error "Backwards compatibility disabled: don't include vp8e.h" ++#endif ++ ++#include "vp8cx.h" ++DECLSPEC_DEPRECATED extern vpx_codec_iface_t vpx_enc_vp8_algo DEPRECATED; ++ ++ ++enum ++{ ++ VP8E_SET_REFERENCE = VP8_SET_REFERENCE, ++ VP8E_COPY_REFERENCE = VP8_COPY_REFERENCE, ++ VP8E_SET_PREVIEWPP = VP8_SET_POSTPROC, ++ VP8E_SET_FLUSHFLAG = 4, ++ VP8E_SET_FRAMETYPE = 10, ++ VP8E_SET_ENCODING_MODE = 12 ++}; ++ ++#define NORMAL_FRAME (0) ++#define KEY_FRAME (1) ++ ++/* Change VP8E to VP8 to get the undeprecated version of these (defined in ++ * vp8.h) ++ */ ++VPX_CTRL_USE_TYPE_DEPRECATED(VP8E_SET_REFERENCE, vpx_ref_frame_t *) ++VPX_CTRL_USE_TYPE_DEPRECATED(VP8E_COPY_REFERENCE, vpx_ref_frame_t *) ++VPX_CTRL_USE_TYPE_DEPRECATED(VP8E_SET_PREVIEWPP, vp8_postproc_cfg_t *) ++ ++ ++/* Flush is done by calling vpx_codec_encode with a NULL input image. */ ++VPX_CTRL_USE_TYPE_DEPRECATED(VP8E_SET_FLUSHFLAG, int) ++ ++ ++/* Frame type is set with a flag to vpx_codec_control. See VPX_EFLAG_FORCE_KF ++ */ ++VPX_CTRL_USE_TYPE_DEPRECATED(VP8E_SET_FRAMETYPE, int) ++ ++ ++/* This control has been deprecated in favor of the duration parameter to ++ * vpx_codec_encode(). Use the #VPX_DL_REALTIME, #VPX_DL_GOOD_QUALITY, ++ * #VPX_DL_BEST_QUALITY constants to that parameter instead. ++ */ ++VPX_CTRL_USE_TYPE_DEPRECATED(VP8E_SET_ENCODING_MODE, vp8e_encoding_mode) ++#include "vpx/vpx_codec_impl_bottom.h" ++#endif +diff --git a/vpx/vpx_codec.h b/vpx/vpx_codec.h +new file mode 100644 +index 0000000..f821559 +--- /dev/null ++++ b/vpx/vpx_codec.h +@@ -0,0 +1,554 @@ ++/* ++ * Copyright (c) 2010 The VP8 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. ++ */ ++ ++ ++/*!\defgroup codec Common Algorithm Interface ++ * This abstraction allows applications to easily support multiple video ++ * formats with minimal code duplication. This section describes the interface ++ * common to all codecs (both encoders and decoders). ++ * @{ ++ */ ++ ++/*!\file vpx_codec.h ++ * \brief Describes the codec algorithm interface to applications. ++ * ++ * This file describes the interface between an application and a ++ * video codec algorithm. ++ * ++ * An application instantiates a specific codec instance by using ++ * vpx_codec_init() and a pointer to the algorithm's interface structure: ++ * <pre> ++ * my_app.c: ++ * extern vpx_codec_iface_t my_codec; ++ * { ++ * vpx_codec_ctx_t algo; ++ * res = vpx_codec_init(&algo, &my_codec); ++ * } ++ * </pre> ++ * ++ * Once initialized, the instance is manged using other functions from ++ * the vpx_codec_* family. ++ */ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#ifndef VPX_CODEC_H ++#define VPX_CODEC_H ++#include "vpx_integer.h" ++#include "vpx_image.h" ++ ++ /*!\brief Decorator indicating a function is deprecated */ ++#ifndef DEPRECATED ++#if defined(__GNUC__) && __GNUC__ ++#define DEPRECATED __attribute__ ((deprecated)) ++#define DECLSPEC_DEPRECATED /**< \copydoc #DEPRECATED */ ++#elif defined(_MSC_VER) ++#define DEPRECATED ++#define DECLSPEC_DEPRECATED __declspec(deprecated) /**< \copydoc #DEPRECATED */ ++#else ++#define DEPRECATED ++#define DECLSPEC_DEPRECATED /**< \copydoc #DEPRECATED */ ++#endif ++#endif ++ ++ /*!\brief Decorator indicating a function is potentially unused */ ++#ifdef UNUSED ++#elif __GNUC__ ++#define UNUSED __attribute__ ((unused)); ++#else ++#define UNUSED ++#endif ++ ++ /*!\brief Current ABI version number ++ * ++ * \internal ++ * If this file is altered in any way that changes the ABI, this value ++ * must be bumped. Examples include, but are not limited to, changing ++ * types, removing or reassigning enums, adding/removing/rearranging ++ * fields to structures ++ */ ++#define VPX_CODEC_ABI_VERSION (2 + VPX_IMAGE_ABI_VERSION) /**<\hideinitializer*/ ++ ++ /*!\brief Algorithm return codes */ ++ typedef enum { ++ /*!\brief Operation completed without error */ ++ VPX_CODEC_OK, ++ ++ /*!\brief Unspecified error */ ++ VPX_CODEC_ERROR, ++ ++ /*!\brief Memory operation failed */ ++ VPX_CODEC_MEM_ERROR, ++ ++ /*!\brief ABI version mismatch */ ++ VPX_CODEC_ABI_MISMATCH, ++ ++ /*!\brief Algorithm does not have required capability */ ++ VPX_CODEC_INCAPABLE, ++ ++ /*!\brief The given bitstream is not supported. ++ * ++ * The bitstream was unable to be parsed at the highest level. The decoder ++ * is unable to proceed. This error \ref SHOULD be treated as fatal to the ++ * stream. */ ++ VPX_CODEC_UNSUP_BITSTREAM, ++ ++ /*!\brief Encoded bitstream uses an unsupported feature ++ * ++ * The decoder does not implement a feature required by the encoder. This ++ * return code should only be used for features that prevent future ++ * pictures from being properly decoded. This error \ref MAY be treated as ++ * fatal to the stream or \ref MAY be treated as fatal to the current GOP. ++ */ ++ VPX_CODEC_UNSUP_FEATURE, ++ ++ /*!\brief The coded data for this stream is corrupt or incomplete ++ * ++ * There was a problem decoding the current frame. This return code ++ * should only be used for failures that prevent future pictures from ++ * being properly decoded. This error \ref MAY be treated as fatal to the ++ * stream or \ref MAY be treated as fatal to the current GOP. If decoding ++ * is continued for the current GOP, artifacts may be present. ++ */ ++ VPX_CODEC_CORRUPT_FRAME, ++ ++ /*!\brief An application-supplied parameter is not valid. ++ * ++ */ ++ VPX_CODEC_INVALID_PARAM, ++ ++ /*!\brief An iterator reached the end of list. ++ * ++ */ ++ VPX_CODEC_LIST_END, ++ ++ } ++ vpx_codec_err_t; ++ ++ ++ /*! \brief Codec capabilities bitfield ++ * ++ * Each codec advertises the capabilities it supports as part of its ++ * ::vpx_codec_iface_t interface structure. Capabilities are extra interfaces ++ * or functionality, and are not required to be supported. ++ * ++ * The available flags are specified by VPX_CODEC_CAP_* defines. ++ */ ++ typedef long vpx_codec_caps_t; ++#define VPX_CODEC_CAP_DECODER 0x1 /**< Is a decoder */ ++#define VPX_CODEC_CAP_ENCODER 0x2 /**< Is an encoder */ ++#define VPX_CODEC_CAP_XMA 0x4 /**< Supports e_xternal Memory Allocation */ ++ ++ ++ /*! \brief Initialization-time Feature Enabling ++ * ++ * Certain codec features must be known at initialization time, to allow for ++ * proper memory allocation. ++ * ++ * The available flags are specified by VPX_CODEC_USE_* defines. ++ */ ++ typedef long vpx_codec_flags_t; ++#define VPX_CODEC_USE_XMA 0x00000001 /**< Use e_xternal Memory Allocation mode */ ++ ++ ++ /*!\brief Codec interface structure. ++ * ++ * Contains function pointers and other data private to the codec ++ * implementation. This structure is opaque to the application. ++ */ ++ typedef const struct vpx_codec_iface vpx_codec_iface_t; ++ ++ ++ /*!\brief Codec private data structure. ++ * ++ * Contains data private to the codec implementation. This structure is opaque ++ * to the application. ++ */ ++ typedef struct vpx_codec_priv vpx_codec_priv_t; ++ ++ ++ /*!\brief Iterator ++ * ++ * Opaque storage used for iterating over lists. ++ */ ++ typedef const void *vpx_codec_iter_t; ++ ++ ++ /*!\brief Codec context structure ++ * ++ * All codecs \ref MUST support this context structure fully. In general, ++ * this data should be considered private to the codec algorithm, and ++ * not be manipulated or examined by the calling application. Applications ++ * may reference the 'name' member to get a printable description of the ++ * algorithm. ++ */ ++ typedef struct vpx_codec_ctx ++ { ++ const char *name; /**< Printable interface name */ ++ vpx_codec_iface_t *iface; /**< Interface pointers */ ++ vpx_codec_err_t err; /**< Last returned error */ ++ const char *err_detail; /**< Detailed info, if available */ ++ vpx_codec_flags_t init_flags; /**< Flags passed at init time */ ++ union ++ { ++ struct vpx_codec_dec_cfg *dec; /**< Decoder Configuration Pointer */ ++ struct vpx_codec_enc_cfg *enc; /**< Encoder Configuration Pointer */ ++ void *raw; ++ } config; /**< Configuration pointer aliasing union */ ++ vpx_codec_priv_t *priv; /**< Algorithm private storage */ ++ } vpx_codec_ctx_t; ++ ++ ++ /* ++ * Library Version Number Interface ++ * ++ * For example, see the following sample return values: ++ * vpx_codec_version() (1<<16 | 2<<8 | 3) ++ * vpx_codec_version_str() "v1.2.3-rc1-16-gec6a1ba" ++ * vpx_codec_version_extra_str() "rc1-16-gec6a1ba" ++ */ ++ ++ /*!\brief Return the version information (as an integer) ++ * ++ * Returns a packed encoding of the library version number. This will only include ++ * the major.minor.patch component of the version number. Note that this encoded ++ * value should be accessed through the macros provided, as the encoding may change ++ * in the future. ++ * ++ */ ++ int vpx_codec_version(void); ++#define VPX_VERSION_MAJOR(v) ((v>>16)&0xff) /**< extract major from packed version */ ++#define VPX_VERSION_MINOR(v) ((v>>8)&0xff) /**< extract minor from packed version */ ++#define VPX_VERSION_PATCH(v) ((v>>0)&0xff) /**< extract patch from packed version */ ++ ++ /*!\brief Return the version major number */ ++#define vpx_codec_version_major() ((vpx_codec_version()>>16)&0xff) ++ ++ /*!\brief Return the version minr number */ ++#define vpx_codec_version_minor() ((vpx_codec_version()>>8)&0xff) ++ ++ /*!\brief Return the version patch number */ ++#define vpx_codec_version_patch() ((vpx_codec_version()>>0)&0xff) ++ ++ ++ /*!\brief Return the version information (as a string) ++ * ++ * Returns a printable string containing the full library version number. This may ++ * contain additional text following the three digit version number, as to indicate ++ * release candidates, prerelease versions, etc. ++ * ++ */ ++ const char *vpx_codec_version_str(void); ++ ++ ++ /*!\brief Return the version information (as a string) ++ * ++ * Returns a printable "extra string". This is the component of the string returned ++ * by vpx_codec_version_str() following the three digit version number. ++ * ++ */ ++ const char *vpx_codec_version_extra_str(void); ++ ++ ++ /*!\brief Return the build configuration ++ * ++ * Returns a printable string containing an encoded version of the build ++ * configuration. This may be useful to vpx support. ++ * ++ */ ++ const char *vpx_codec_build_config(void); ++ ++ ++ /*!\brief Return the name for a given interface ++ * ++ * Returns a human readable string for name of the given codec interface. ++ * ++ * \param[in] iface Interface pointer ++ * ++ */ ++ const char *vpx_codec_iface_name(vpx_codec_iface_t *iface); ++ ++ ++ /*!\brief Convert error number to printable string ++ * ++ * Returns a human readable string for the last error returned by the ++ * algorithm. The returned error will be one line and will not contain ++ * any newline characters. ++ * ++ * ++ * \param[in] err Error number. ++ * ++ */ ++ const char *vpx_codec_err_to_string(vpx_codec_err_t err); ++ ++ ++ /*!\brief Retrieve error synopsis for codec context ++ * ++ * Returns a human readable string for the last error returned by the ++ * algorithm. The returned error will be one line and will not contain ++ * any newline characters. ++ * ++ * ++ * \param[in] ctx Pointer to this instance's context. ++ * ++ */ ++ const char *vpx_codec_error(vpx_codec_ctx_t *ctx); ++ ++ ++ /*!\brief Retrieve detailed error information for codec context ++ * ++ * Returns a human readable string providing detailed information about ++ * the last error. ++ * ++ * \param[in] ctx Pointer to this instance's context. ++ * ++ * \retval NULL ++ * No detailed information is available. ++ */ ++ const char *vpx_codec_error_detail(vpx_codec_ctx_t *ctx); ++ ++ ++ /* REQUIRED FUNCTIONS ++ * ++ * The following functions are required to be implemented for all codecs. ++ * They represent the base case functionality expected of all codecs. ++ */ ++ ++ /*!\brief Destroy a codec instance ++ * ++ * Destroys a codec context, freeing any associated memory buffers. ++ * ++ * \param[in] ctx Pointer to this instance's context ++ * ++ * \retval #VPX_CODEC_OK ++ * The codec algorithm initialized. ++ * \retval #VPX_CODEC_MEM_ERROR ++ * Memory allocation failed. ++ */ ++ vpx_codec_err_t vpx_codec_destroy(vpx_codec_ctx_t *ctx); ++ ++ ++ /*!\brief Get the capabilities of an algorithm. ++ * ++ * Retrieves the capabliities bitfield from the algorithm's interface. ++ * ++ * \param[in] iface Pointer to the alogrithm interface ++ * ++ */ ++ vpx_codec_caps_t vpx_codec_get_caps(vpx_codec_iface_t *iface); ++ ++ ++ /*!\brief Control algorithm ++ * ++ * This function is used to exchange algorithm specific data with the codec ++ * instance. This can be used to implement features specific to a particular ++ * algorithm. ++ * ++ * This wrapper function dispatches the request to the helper function ++ * associated with the given ctrl_id. It tries to call this function ++ * transparantly, but will return #VPX_CODEC_ERROR if the request could not ++ * be dispatched. ++ * ++ * Note that this function should not be used directly. Call the ++ * #vpx_codec_control wrapper macro instead. ++ * ++ * \param[in] ctx Pointer to this instance's context ++ * \param[in] ctrl_id Algorithm specific control identifier ++ * ++ * \retval #VPX_CODEC_OK ++ * The control request was processed. ++ * \retval #VPX_CODEC_ERROR ++ * The control request was not processed. ++ * \retval #VPX_CODEC_INVALID_PARAM ++ * The data was not valid. ++ */ ++ vpx_codec_err_t vpx_codec_control_(vpx_codec_ctx_t *ctx, ++ int ctrl_id, ++ ...); ++#if defined(VPX_DISABLE_CTRL_TYPECHECKS) && VPX_DISABLE_CTRL_TYPECHECKS ++# define vpx_codec_control(ctx,id,data) vpx_codec_control_(ctx,id,data) ++# define VPX_CTRL_USE_TYPE(id, typ) ++# define VPX_CTRL_USE_TYPE_DEPRECATED(id, typ) ++# define VPX_CTRL_VOID(id, typ) ++ ++#else ++ /*!\brief vpx_codec_control wrapper macro ++ * ++ * This macro allows for type safe conversions across the variadic parameter ++ * to vpx_codec_control_(). ++ * ++ * \internal ++ * It works by dispatching the call to the control function through a wrapper ++ * function named with the id parameter. ++ */ ++# define vpx_codec_control(ctx,id,data) vpx_codec_control_##id(ctx,id,data)\ ++ /**<\hideinitializer*/ ++ ++ ++ /*!\brief vpx_codec_control type definition macro ++ * ++ * This macro allows for type safe conversions across the variadic parameter ++ * to vpx_codec_control_(). It defines the type of the argument for a given ++ * control identifier. ++ * ++ * \internal ++ * It defines a static function with ++ * the correctly typed arguments as a wrapper to the type-unsafe internal ++ * function. ++ */ ++# define VPX_CTRL_USE_TYPE(id, typ) \ ++ static vpx_codec_err_t \ ++ vpx_codec_control_##id(vpx_codec_ctx_t*, int, typ) UNUSED;\ ++ \ ++ static vpx_codec_err_t \ ++ vpx_codec_control_##id(vpx_codec_ctx_t *ctx, int ctrl_id, typ data) {\ ++ return vpx_codec_control_(ctx, ctrl_id, data);\ ++ } /**<\hideinitializer*/ ++ ++ ++ /*!\brief vpx_codec_control deprecated type definition macro ++ * ++ * Like #VPX_CTRL_USE_TYPE, but indicates that the specified control is ++ * deprecated and should not be used. Consult the documentation for your ++ * codec for more information. ++ * ++ * \internal ++ * It defines a static function with the correctly typed arguments as a ++ * wrapper to the type-unsafe internal function. ++ */ ++# define VPX_CTRL_USE_TYPE_DEPRECATED(id, typ) \ ++ DECLSPEC_DEPRECATED static vpx_codec_err_t \ ++ vpx_codec_control_##id(vpx_codec_ctx_t*, int, typ) DEPRECATED UNUSED;\ ++ \ ++ DECLSPEC_DEPRECATED static vpx_codec_err_t \ ++ vpx_codec_control_##id(vpx_codec_ctx_t *ctx, int ctrl_id, typ data) {\ ++ return vpx_codec_control_(ctx, ctrl_id, data);\ ++ } /**<\hideinitializer*/ ++ ++ ++ /*!\brief vpx_codec_control void type definition macro ++ * ++ * This macro allows for type safe conversions across the variadic parameter ++ * to vpx_codec_control_(). It indicates that a given control identifier takes ++ * no argument. ++ * ++ * \internal ++ * It defines a static function without a data argument as a wrapper to the ++ * type-unsafe internal function. ++ */ ++# define VPX_CTRL_VOID(id) \ ++ static vpx_codec_err_t \ ++ vpx_codec_control_##id(vpx_codec_ctx_t*, int) UNUSED;\ ++ \ ++ static vpx_codec_err_t \ ++ vpx_codec_control_##id(vpx_codec_ctx_t *ctx, int ctrl_id) {\ ++ return vpx_codec_control_(ctx, ctrl_id);\ ++ } /**<\hideinitializer*/ ++ ++ ++#endif ++ ++ ++ /*!\defgroup cap_xma External Memory Allocation Functions ++ * ++ * The following functions are required to be implemented for all codecs ++ * that advertise the VPX_CODEC_CAP_XMA capability. Calling these functions ++ * for codecs that don't advertise this capability will result in an error ++ * code being returned, usually VPX_CODEC_INCAPABLE ++ * @{ ++ */ ++ ++ ++ /*!\brief Memory Map Entry ++ * ++ * This structure is used to contain the properties of a memory segment. It ++ * is populated by the codec in the request phase, and by the calling ++ * application once the requested allocation has been performed. ++ */ ++ typedef struct vpx_codec_mmap ++ { ++ /* ++ * The following members are set by the codec when requesting a segment ++ */ ++ unsigned int id; /**< identifier for the segment's contents */ ++ unsigned long sz; /**< size of the segment, in bytes */ ++ unsigned int align; /**< required alignment of the segment, in bytes */ ++ unsigned int flags; /**< bitfield containing segment properties */ ++#define VPX_CODEC_MEM_ZERO 0x1 /**< Segment must be zeroed by allocation */ ++#define VPX_CODEC_MEM_WRONLY 0x2 /**< Segment need not be readable */ ++#define VPX_CODEC_MEM_FAST 0x4 /**< Place in fast memory, if available */ ++ ++ /* The following members are to be filled in by the allocation function */ ++ void *base; /**< pointer to the allocated segment */ ++ void (*dtor)(struct vpx_codec_mmap *map); /**< destructor to call */ ++ void *priv; /**< allocator private storage */ ++ } vpx_codec_mmap_t; /**< alias for struct vpx_codec_mmap */ ++ ++ ++ /*!\brief Iterate over the list of segments to allocate. ++ * ++ * Iterates over a list of the segments to allocate. The iterator storage ++ * should be initialized to NULL to start the iteration. Iteration is complete ++ * when this function returns VPX_CODEC_LIST_END. The amount of memory needed to ++ * allocate is dependant upon the size of the encoded stream. In cases where the ++ * stream is not available at allocation time, a fixed size must be requested. ++ * The codec will not be able to operate on streams larger than the size used at ++ * allocation time. ++ * ++ * \param[in] ctx Pointer to this instance's context. ++ * \param[out] mmap Pointer to the memory map entry to populate. ++ * \param[in,out] iter Iterator storage, initialized to NULL ++ * ++ * \retval #VPX_CODEC_OK ++ * The memory map entry was populated. ++ * \retval #VPX_CODEC_ERROR ++ * Codec does not support XMA mode. ++ * \retval #VPX_CODEC_MEM_ERROR ++ * Unable to determine segment size from stream info. ++ */ ++ vpx_codec_err_t vpx_codec_get_mem_map(vpx_codec_ctx_t *ctx, ++ vpx_codec_mmap_t *mmap, ++ vpx_codec_iter_t *iter); ++ ++ ++ /*!\brief Identify allocated segments to codec instance ++ * ++ * Stores a list of allocated segments in the codec. Segments \ref MUST be ++ * passed in the order they are read from vpx_codec_get_mem_map(), but may be ++ * passed in groups of any size. Segments \ref MUST be set only once. The ++ * allocation function \ref MUST ensure that the vpx_codec_mmap_t::base member ++ * is non-NULL. If the segment requires cleanup handling (eg, calling free() ++ * or close()) then the vpx_codec_mmap_t::dtor member \ref MUST be populated. ++ * ++ * \param[in] ctx Pointer to this instance's context. ++ * \param[in] mmaps Pointer to the first memory map entry in the list. ++ * \param[in] num_maps Number of entries being set at this time ++ * ++ * \retval #VPX_CODEC_OK ++ * The segment was stored in the codec context. ++ * \retval #VPX_CODEC_INCAPABLE ++ * Codec does not support XMA mode. ++ * \retval #VPX_CODEC_MEM_ERROR ++ * Segment base address was not set, or segment was already stored. ++ ++ */ ++ vpx_codec_err_t vpx_codec_set_mem_map(vpx_codec_ctx_t *ctx, ++ vpx_codec_mmap_t *mmaps, ++ unsigned int num_maps); ++ ++ /*!@} - end defgroup cap_xma*/ ++ /*!@} - end defgroup codec*/ ++ ++ ++#endif ++#ifdef __cplusplus ++} ++#endif +diff --git a/vpx/vpx_codec.mk b/vpx/vpx_codec.mk +new file mode 100644 +index 0000000..4e09b5f +--- /dev/null ++++ b/vpx/vpx_codec.mk +@@ -0,0 +1,27 @@ ++## ++## Copyright (c) 2010 The VP8 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. ++## ++ ++ ++API_EXPORTS += exports ++ ++API_SRCS-$(CONFIG_DECODERS) += src/vpx_decoder.c ++API_SRCS-$(CONFIG_DECODERS) += src/vpx_decoder_compat.c ++API_SRCS-$(CONFIG_DECODERS) += vpx_decoder.h ++API_SRCS-$(CONFIG_DECODERS) += vpx_decoder_compat.h ++API_SRCS-$(CONFIG_ENCODERS) += src/vpx_encoder.c ++API_SRCS-$(CONFIG_ENCODERS) += vpx_encoder.h ++API_SRCS-yes += internal/vpx_codec_internal.h ++API_SRCS-yes += src/vpx_codec.c ++API_SRCS-yes += src/vpx_image.c ++API_SRCS-yes += vpx_codec.h ++API_SRCS-yes += vpx_codec.mk ++API_SRCS-yes += vpx_codec_impl_bottom.h ++API_SRCS-yes += vpx_codec_impl_top.h ++API_SRCS-yes += vpx_image.h +diff --git a/vpx/vpx_codec_impl_bottom.h b/vpx/vpx_codec_impl_bottom.h +new file mode 100644 +index 0000000..02bf8b3 +--- /dev/null ++++ b/vpx/vpx_codec_impl_bottom.h +@@ -0,0 +1,19 @@ ++/* ++ * Copyright (c) 2010 The VP8 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 included at the bottom of the header files defining the ++ * interface to individual codecs and contains matching blocks to those defined ++ * in vpx_codec_impl_top.h ++ */ ++#ifdef __cplusplus ++} ++#endif +diff --git a/vpx/vpx_codec_impl_top.h b/vpx/vpx_codec_impl_top.h +new file mode 100644 +index 0000000..fce14c1 +--- /dev/null ++++ b/vpx/vpx_codec_impl_top.h +@@ -0,0 +1,19 @@ ++/* ++ * Copyright (c) 2010 The VP8 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 included at the top of the header files defining the ++ * interface to individual codecs and contains various workarounds common ++ * to all codec implementations. ++ */ ++#ifdef __cplusplus ++extern "C" { ++#endif +diff --git a/vpx/vpx_decoder.h b/vpx/vpx_decoder.h +new file mode 100644 +index 0000000..865f5df +--- /dev/null ++++ b/vpx/vpx_decoder.h +@@ -0,0 +1,317 @@ ++/* ++ * Copyright (c) 2010 The VP8 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. ++ */ ++ ++ ++/*!\defgroup decoder Decoder Algorithm Interface ++ * \ingroup codec ++ * This abstraction allows applications using this decoder to easily support ++ * multiple video formats with minimal code duplication. This section describes ++ * the interface common to all decoders. ++ * @{ ++ */ ++ ++/*!\file vpx_decoder.h ++ * \brief Describes the decoder algorithm interface to applications. ++ * ++ * This file describes the interface between an application and a ++ * video decoder algorithm. ++ * ++ */ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#ifndef VPX_DECODER_H ++#define VPX_DECODER_H ++#include "vpx_codec.h" ++ ++ /*!\brief Current ABI version number ++ * ++ * \internal ++ * If this file is altered in any way that changes the ABI, this value ++ * must be bumped. Examples include, but are not limited to, changing ++ * types, removing or reassigning enums, adding/removing/rearranging ++ * fields to structures ++ */ ++#define VPX_DECODER_ABI_VERSION (2 + VPX_CODEC_ABI_VERSION) /**<\hideinitializer*/ ++ ++ /*! \brief Decoder capabilities bitfield ++ * ++ * Each decoder advertises the capabilities it supports as part of its ++ * ::vpx_codec_iface_t interface structure. Capabilities are extra interfaces ++ * or functionality, and are not required to be supported by a decoder. ++ * ++ * The available flags are specifiedby VPX_CODEC_CAP_* defines. ++ */ ++#define VPX_CODEC_CAP_PUT_SLICE 0x10000 /**< Will issue put_slice callbacks */ ++#define VPX_CODEC_CAP_PUT_FRAME 0x20000 /**< Will issue put_frame callbacks */ ++#define VPX_CODEC_CAP_POSTPROC 0x40000 /**< Can postprocess decoded frame */ ++ ++ /*! \brief Initialization-time Feature Enabling ++ * ++ * Certain codec features must be known at initialization time, to allow for ++ * proper memory allocation. ++ * ++ * The available flags are specified by VPX_CODEC_USE_* defines. ++ */ ++#define VPX_CODEC_USE_POSTPROC 0x10000 /**< Postprocess decoded frame */ ++ ++ /*!\brief Stream properties ++ * ++ * This structure is used to query or set properties of the decoded ++ * stream. Algorithms may extend this structure with data specific ++ * to their bitstream by setting the sz member appropriately. ++ */ ++ typedef struct vpx_codec_stream_info ++ { ++ unsigned int sz; /**< Size of this structure */ ++ unsigned int w; /**< Width (or 0 for unknown/default) */ ++ unsigned int h; /**< Height (or 0 for unknown/default) */ ++ unsigned int is_kf; /**< Current frame is a keyframe */ ++ } vpx_codec_stream_info_t; ++ ++ /* REQUIRED FUNCTIONS ++ * ++ * The following functions are required to be implemented for all decoders. ++ * They represent the base case functionality expected of all decoders. ++ */ ++ ++ ++ /*!\brief Initialization Configurations ++ * ++ * This structure is used to pass init time configuration options to the ++ * decoder. ++ */ ++ typedef struct vpx_codec_dec_cfg ++ { ++ unsigned int threads; /**< Maximum number of threads to use, default 1 */ ++ unsigned int w; /**< Width */ ++ unsigned int h; /**< Height */ ++ } vpx_codec_dec_cfg_t; /**< alias for struct vpx_codec_dec_cfg */ ++ ++ ++ /*!\brief Initialize a decoder instance ++ * ++ * Initializes a decoder context using the given interface. Applications ++ * should call the vpx_codec_dec_init convenience macro instead of this ++ * function directly, to ensure that the ABI version number parameter ++ * is properly initialized. ++ * ++ * In XMA mode (activated by setting VPX_CODEC_USE_XMA in the flags ++ * parameter), the storage pointed to by the cfg parameter must be ++ * kept readable and stable until all memory maps have been set. ++ * ++ * \param[in] ctx Pointer to this instance's context. ++ * \param[in] iface Pointer to the alogrithm interface to use. ++ * \param[in] cfg Configuration to use, if known. May be NULL. ++ * \param[in] flags Bitfield of VPX_CODEC_USE_* flags ++ * \param[in] ver ABI version number. Must be set to ++ * VPX_DECODER_ABI_VERSION ++ * \retval #VPX_CODEC_OK ++ * The decoder algorithm initialized. ++ * \retval #VPX_CODEC_MEM_ERROR ++ * Memory allocation failed. ++ */ ++ vpx_codec_err_t vpx_codec_dec_init_ver(vpx_codec_ctx_t *ctx, ++ vpx_codec_iface_t *iface, ++ vpx_codec_dec_cfg_t *cfg, ++ vpx_codec_flags_t flags, ++ int ver); ++ ++ /*!\brief Convenience macro for vpx_codec_dec_init_ver() ++ * ++ * Ensures the ABI version parameter is properly set. ++ */ ++#define vpx_codec_dec_init(ctx, iface, cfg, flags) \ ++ vpx_codec_dec_init_ver(ctx, iface, cfg, flags, VPX_DECODER_ABI_VERSION) ++ ++ ++ /*!\brief Parse stream info from a buffer ++ * ++ * Performs high level parsing of the bitstream. Construction of a decoder ++ * context is not necessary. Can be used to determine if the bitstream is ++ * of the proper format, and to extract information from the stream. ++ * ++ * \param[in] iface Pointer to the alogrithm interface ++ * \param[in] data Pointer to a block of data to parse ++ * \param[in] data_sz Size of the data buffer ++ * \param[in,out] si Pointer to stream info to update. The size member ++ * \ref MUST be properly initialized, but \ref MAY be ++ * clobbered by the algorithm. This parameter \ref MAY ++ * be NULL. ++ * ++ * \retval #VPX_CODEC_OK ++ * Bitstream is parsable and stream information updated ++ */ ++ vpx_codec_err_t vpx_codec_peek_stream_info(vpx_codec_iface_t *iface, ++ const uint8_t *data, ++ unsigned int data_sz, ++ vpx_codec_stream_info_t *si); ++ ++ ++ /*!\brief Return information about the current stream. ++ * ++ * Returns information about the stream that has been parsed during decoding. ++ * ++ * \param[in] ctx Pointer to this instance's context ++ * \param[in,out] si Pointer to stream info to update. The size member ++ * \ref MUST be properly initialized, but \ref MAY be ++ * clobbered by the algorithm. This parameter \ref MAY ++ * be NULL. ++ * ++ * \retval #VPX_CODEC_OK ++ * Bitstream is parsable and stream information updated ++ */ ++ vpx_codec_err_t vpx_codec_get_stream_info(vpx_codec_ctx_t *ctx, ++ vpx_codec_stream_info_t *si); ++ ++ ++ /*!\brief Decode data ++ * ++ * Processes a buffer of coded data. If the processing results in a new ++ * decoded frame becoming available, PUT_SLICE and PUT_FRAME events may be ++ * generated, as appropriate. Encoded data \ref MUST be passed in DTS (decode ++ * time stamp) order. Frames produced will always be in PTS (presentation ++ * time stamp) order. ++ * ++ * \param[in] ctx Pointer to this instance's context ++ * \param[in] data Pointer to this block of new coded data. If ++ * NULL, a VPX_CODEC_CB_PUT_FRAME event is posted ++ * for the previously decoded frame. ++ * \param[in] data_sz Size of the coded data, in bytes. ++ * \param[in] user_priv Application specific data to associate with ++ * this frame. ++ * \param[in] deadline Soft deadline the decoder should attempt to meet, ++ * in us. Set to zero for unlimited. ++ * ++ * \return Returns #VPX_CODEC_OK if the coded data was processed completely ++ * and future pictures can be decoded without error. Otherwise, ++ * see the descriptions of the other error codes in ::vpx_codec_err_t ++ * for recoverability capabilities. ++ */ ++ vpx_codec_err_t vpx_codec_decode(vpx_codec_ctx_t *ctx, ++ const uint8_t *data, ++ unsigned int data_sz, ++ void *user_priv, ++ long deadline); ++ ++ ++ /*!\brief Decoded frames iterator ++ * ++ * Iterates over a list of the frames available for display. The iterator ++ * storage should be initialized to NULL to start the iteration. Iteration is ++ * complete when this function returns NULL. ++ * ++ * The list of available frames becomes valid upon completion of the ++ * vpx_codec_decode call, and remains valid until the next call to vpx_codec_decode. ++ * ++ * \param[in] ctx Pointer to this instance's context ++ * \param[in,out] iter Iterator storage, initialized to NULL ++ * ++ * \return Returns a pointer to an image, if one is ready for display. Frames ++ * produced will always be in PTS (presentation time stamp) order. ++ */ ++ vpx_image_t *vpx_codec_get_frame(vpx_codec_ctx_t *ctx, ++ vpx_codec_iter_t *iter); ++ ++ ++ /*!\defgroup cap_put_frame Frame-Based Decoding Functions ++ * ++ * The following functions are required to be implemented for all decoders ++ * that advertise the VPX_CODEC_CAP_PUT_FRAME capability. Calling these functions ++ * for codecs that don't advertise this capability will result in an error ++ * code being returned, usually VPX_CODEC_ERROR ++ * @{ ++ */ ++ ++ /*!\brief put frame callback prototype ++ * ++ * This callback is invoked by the decoder to notify the application of ++ * the availability of decoded image data. ++ */ ++ typedef void (*vpx_codec_put_frame_cb_fn_t)(void *user_priv, ++ const vpx_image_t *img); ++ ++ ++ /*!\brief Register for notification of frame completion. ++ * ++ * Registers a given function to be called when a decoded frame is ++ * available. ++ * ++ * \param[in] ctx Pointer to this instance's context ++ * \param[in] cb Pointer to the callback function ++ * \param[in] user_priv User's private data ++ * ++ * \retval #VPX_CODEC_OK ++ * Callback successfully registered. ++ * \retval #VPX_CODEC_ERROR ++ * Decoder context not initialized, or algorithm not capable of ++ * posting slice completion. ++ */ ++ vpx_codec_err_t vpx_codec_register_put_frame_cb(vpx_codec_ctx_t *ctx, ++ vpx_codec_put_frame_cb_fn_t cb, ++ void *user_priv); ++ ++ ++ /*!@} - end defgroup cap_put_frame */ ++ ++ /*!\defgroup cap_put_slice Slice-Based Decoding Functions ++ * ++ * The following functions are required to be implemented for all decoders ++ * that advertise the VPX_CODEC_CAP_PUT_SLICE capability. Calling these functions ++ * for codecs that don't advertise this capability will result in an error ++ * code being returned, usually VPX_CODEC_ERROR ++ * @{ ++ */ ++ ++ /*!\brief put slice callback prototype ++ * ++ * This callback is invoked by the decoder to notify the application of ++ * the availability of partially decoded image data. The ++ */ ++ typedef void (*vpx_codec_put_slice_cb_fn_t)(void *user_priv, ++ const vpx_image_t *img, ++ const vpx_image_rect_t *valid, ++ const vpx_image_rect_t *update); ++ ++ ++ /*!\brief Register for notification of slice completion. ++ * ++ * Registers a given function to be called when a decoded slice is ++ * available. ++ * ++ * \param[in] ctx Pointer to this instance's context ++ * \param[in] cb Pointer to the callback function ++ * \param[in] user_priv User's private data ++ * ++ * \retval #VPX_CODEC_OK ++ * Callback successfully registered. ++ * \retval #VPX_CODEC_ERROR ++ * Decoder context not initialized, or algorithm not capable of ++ * posting slice completion. ++ */ ++ vpx_codec_err_t vpx_codec_register_put_slice_cb(vpx_codec_ctx_t *ctx, ++ vpx_codec_put_slice_cb_fn_t cb, ++ void *user_priv); ++ ++ ++ /*!@} - end defgroup cap_put_slice*/ ++ ++ /*!@} - end defgroup decoder*/ ++ ++#endif ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#if !defined(VPX_CODEC_DISABLE_COMPAT) || !VPX_CODEC_DISABLE_COMPAT ++#include "vpx_decoder_compat.h" ++#endif +diff --git a/vpx/vpx_decoder_compat.h b/vpx/vpx_decoder_compat.h +new file mode 100644 +index 0000000..e66a096 +--- /dev/null ++++ b/vpx/vpx_decoder_compat.h +@@ -0,0 +1,587 @@ ++/* ++ * Copyright (c) 2010 The VP8 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. ++ */ ++ ++ ++/*!\defgroup decoder Common Decoder Algorithm Interface ++ * This abstraction allows applications using this decoder to easily support ++ * multiple video formats with minimal code duplication. This section describes ++ * the interface common to all codecs. ++ * @{ ++ */ ++ ++/*!\file vpx_decoder_compat.h ++ * \brief Provides a compatibility layer between version 1 and 2 of this API. ++ * ++ * This interface has been deprecated. Only existing code should make use ++ * of this interface, and therefore, it is only thinly documented. Existing ++ * code should be ported to the vpx_codec_* API. ++ */ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#ifndef VPX_DECODER_COMPAT_H ++#define VPX_DECODER_COMPAT_H ++ ++ /*!\brief Decoder algorithm return codes */ ++ typedef enum { ++ /*!\brief Operation completed without error */ ++ VPX_DEC_OK = VPX_CODEC_OK, ++ ++ /*!\brief Unspecified error */ ++ VPX_DEC_ERROR = VPX_CODEC_ERROR, ++ ++ /*!\brief Memory operation failed */ ++ VPX_DEC_MEM_ERROR = VPX_CODEC_MEM_ERROR, ++ ++ /*!\brief ABI version mismatch */ ++ VPX_DEC_ABI_MISMATCH = VPX_CODEC_ABI_MISMATCH, ++ ++ /*!\brief The given bitstream is not supported. ++ * ++ * The bitstream was unable to be parsed at the highest level. The decoder ++ * is unable to proceed. This error \ref SHOULD be treated as fatal to the ++ * stream. */ ++ VPX_DEC_UNSUP_BITSTREAM = VPX_CODEC_UNSUP_BITSTREAM, ++ ++ /*!\brief Encoded bitstream uses an unsupported feature ++ * ++ * The decoder does not implement a feature required by the encoder. This ++ * return code should only be used for features that prevent future ++ * pictures from being properly decoded. This error \ref MAY be treated as ++ * fatal to the stream or \ref MAY be treated as fatal to the current GOP. ++ */ ++ VPX_DEC_UNSUP_FEATURE = VPX_CODEC_UNSUP_FEATURE, ++ ++ /*!\brief The coded data for this stream is corrupt or incomplete ++ * ++ * There was a problem decoding the current frame. This return code ++ * should only be used for failures that prevent future pictures from ++ * being properly decoded. This error \ref MAY be treated as fatal to the ++ * stream or \ref MAY be treated as fatal to the current GOP. If decoding ++ * is continued for the current GOP, artifacts may be present. ++ */ ++ VPX_DEC_CORRUPT_FRAME = VPX_CODEC_CORRUPT_FRAME, ++ ++ /*!\brief An application-supplied parameter is not valid. ++ * ++ */ ++ VPX_DEC_INVALID_PARAM = VPX_CODEC_INVALID_PARAM, ++ ++ /*!\brief An iterator reached the end of list. ++ * ++ */ ++ VPX_DEC_LIST_END = VPX_CODEC_LIST_END, ++ ++ } ++ vpx_dec_err_t; ++ ++ /*! \brief Decoder capabilities bitfield ++ * ++ * Each decoder advertises the capabilities it supports as part of its ++ * ::vpx_dec_iface_t interface structure. Capabilities are extra interfaces ++ * or functionality, and are not required to be supported by a decoder. ++ * ++ * The available flags are specifiedby VPX_DEC_CAP_* defines. ++ */ ++ typedef int vpx_dec_caps_t; ++#define VPX_DEC_CAP_PUT_SLICE 0x0001 /**< Will issue put_slice callbacks */ ++#define VPX_DEC_CAP_PUT_FRAME 0x0002 /**< Will issue put_frame callbacks */ ++#define VPX_DEC_CAP_XMA 0x0004 /**< Supports e_xternal Memory Allocation */ ++ ++ /*!\brief Stream properties ++ * ++ * This structure is used to query or set properties of the decoded ++ * stream. Algorithms may extend this structure with data specific ++ * to their bitstream by setting the sz member appropriately. ++ */ ++#if 1 ++ typedef vpx_codec_stream_info_t vpx_dec_stream_info_t; ++#else ++ typedef struct ++ { ++ unsigned int sz; /**< Size of this structure */ ++ unsigned int w; /**< Width (or 0 for unknown/default) */ ++ unsigned int h; /**< Height (or 0 for unknown/default) */ ++ unsigned int is_kf; /**< Current frame is a keyframe */ ++ } vpx_dec_stream_info_t; ++#endif ++ ++ ++ /*!\brief Decoder interface structure. ++ * ++ * Contains function pointers and other data private to the decoder ++ * implementation. This structure is opaque to the application. ++ */ ++ typedef const struct vpx_codec_iface vpx_dec_iface_t; ++ typedef struct vpx_codec_priv vpx_dec_priv_t; ++ ++ /*!\brief Iterator ++ * ++ * Opaque storage used for iterating over lists. ++ */ ++ typedef vpx_codec_iter_t vpx_dec_iter_t; ++ ++ /*!\brief Decoder context structure ++ * ++ * All decoders \ref MUST support this context structure fully. In general, ++ * this data should be considered private to the decoder algorithm, and ++ * not be manipulated or examined by the calling application. Applications ++ * may reference the 'name' member to get a printable description of the ++ * algorithm. ++ */ ++#if 1 ++ typedef vpx_codec_ctx_t vpx_dec_ctx_t; ++#else ++ typedef struct ++ { ++ const char *name; /**< Printable interface name */ ++ vpx_dec_iface_t *iface; /**< Interface pointers */ ++ vpx_dec_err_t err; /**< Last returned error */ ++ vpx_dec_priv_t *priv; /**< Algorithm private storage */ ++ } vpx_dec_ctx_t; ++#endif ++ ++ ++ /*!\brief Return the build configuration ++ * ++ * Returns a printable string containing an encoded version of the build ++ * configuration. This may be useful to vpx support. ++ * ++ */ ++ const char *vpx_dec_build_config(void) DEPRECATED; ++ ++ /*!\brief Return the name for a given interface ++ * ++ * Returns a human readable string for name of the given decoder interface. ++ * ++ * \param[in] iface Interface pointer ++ * ++ */ ++ const char *vpx_dec_iface_name(vpx_dec_iface_t *iface) DEPRECATED; ++ ++ ++ /*!\brief Convert error number to printable string ++ * ++ * Returns a human readable string for the last error returned by the ++ * algorithm. The returned error will be one line and will not contain ++ * any newline characters. ++ * ++ * ++ * \param[in] err Error number. ++ * ++ */ ++ const char *vpx_dec_err_to_string(vpx_dec_err_t err) DEPRECATED; ++ ++ ++ /*!\brief Retrieve error synopsis for decoder context ++ * ++ * Returns a human readable string for the last error returned by the ++ * algorithm. The returned error will be one line and will not contain ++ * any newline characters. ++ * ++ * ++ * \param[in] ctx Pointer to this instance's context. ++ * ++ */ ++ const char *vpx_dec_error(vpx_dec_ctx_t *ctx) DEPRECATED; ++ ++ ++ /*!\brief Retrieve detailed error information for decoder context ++ * ++ * Returns a human readable string providing detailed information about ++ * the last error. ++ * ++ * \param[in] ctx Pointer to this instance's context. ++ * ++ * \retval NULL ++ * No detailed information is available. ++ */ ++ const char *vpx_dec_error_detail(vpx_dec_ctx_t *ctx) DEPRECATED; ++ ++ ++ /* REQUIRED FUNCTIONS ++ * ++ * The following functions are required to be implemented for all decoders. ++ * They represent the base case functionality expected of all decoders. ++ */ ++ ++ ++ /*!\brief Initialize a decoder instance ++ * ++ * Initializes a decoder context using the given interface. Applications ++ * should call the vpx_dec_init convenience macro instead of this ++ * function directly, to ensure that the ABI version number parameter ++ * is properly initialized. ++ * ++ * \param[in] ctx Pointer to this instance's context. ++ * \param[in] iface Pointer to the alogrithm interface to use. ++ * \param[in] ver ABI version number. Must be set to ++ * VPX_DECODER_ABI_VERSION ++ * \retval #VPX_DEC_OK ++ * The decoder algorithm initialized. ++ * \retval #VPX_DEC_MEM_ERROR ++ * Memory allocation failed. ++ */ ++ vpx_dec_err_t vpx_dec_init_ver(vpx_dec_ctx_t *ctx, ++ vpx_dec_iface_t *iface, ++ int ver) DEPRECATED; ++#define vpx_dec_init(ctx, iface) \ ++ vpx_dec_init_ver(ctx, iface, VPX_DECODER_ABI_VERSION) ++ ++ ++ /*!\brief Destroy a decoder instance ++ * ++ * Destroys a decoder context, freeing any associated memory buffers. ++ * ++ * \param[in] ctx Pointer to this instance's context ++ * ++ * \retval #VPX_DEC_OK ++ * The decoder algorithm initialized. ++ * \retval #VPX_DEC_MEM_ERROR ++ * Memory allocation failed. ++ */ ++ vpx_dec_err_t vpx_dec_destroy(vpx_dec_ctx_t *ctx) DEPRECATED; ++ ++ ++ /*!\brief Get the capabilities of an algorithm. ++ * ++ * Retrieves the capabliities bitfield from the algorithm's interface. ++ * ++ * \param[in] iface Pointer to the alogrithm interface ++ * ++ */ ++ vpx_dec_caps_t vpx_dec_get_caps(vpx_dec_iface_t *iface) DEPRECATED; ++ ++ ++ /*!\brief Parse stream info from a buffer ++ * ++ * Performs high level parsing of the bitstream. Construction of a decoder ++ * context is not necessary. Can be used to determine if the bitstream is ++ * of the proper format, and to extract information from the stream. ++ * ++ * \param[in] iface Pointer to the alogrithm interface ++ * \param[in] data Pointer to a block of data to parse ++ * \param[in] data_sz Size of the data buffer ++ * \param[in,out] si Pointer to stream info to update. The size member ++ * \ref MUST be properly initialized, but \ref MAY be ++ * clobbered by the algorithm. This parameter \ref MAY ++ * be NULL. ++ * ++ * \retval #VPX_DEC_OK ++ * Bitstream is parsable and stream information updated ++ */ ++ vpx_dec_err_t vpx_dec_peek_stream_info(vpx_dec_iface_t *iface, ++ const uint8_t *data, ++ unsigned int data_sz, ++ vpx_dec_stream_info_t *si) DEPRECATED; ++ ++ ++ /*!\brief Return information about the current stream. ++ * ++ * Returns information about the stream that has been parsed during decoding. ++ * ++ * \param[in] ctx Pointer to this instance's context ++ * \param[in,out] si Pointer to stream info to update. The size member ++ * \ref MUST be properly initialized, but \ref MAY be ++ * clobbered by the algorithm. This parameter \ref MAY ++ * be NULL. ++ * ++ * \retval #VPX_DEC_OK ++ * Bitstream is parsable and stream information updated ++ */ ++ vpx_dec_err_t vpx_dec_get_stream_info(vpx_dec_ctx_t *ctx, ++ vpx_dec_stream_info_t *si) DEPRECATED; ++ ++ ++ /*!\brief Control algorithm ++ * ++ * This function is used to exchange algorithm specific data with the decoder ++ * instance. This can be used to implement features specific to a particular ++ * algorithm. ++ * ++ * This wrapper function dispatches the request to the helper function ++ * associated with the given ctrl_id. It tries to call this function ++ * transparantly, but will return #VPX_DEC_ERROR if the request could not ++ * be dispatched. ++ * ++ * \param[in] ctx Pointer to this instance's context ++ * \param[in] ctrl_id Algorithm specific control identifier ++ * \param[in,out] data Data to exchange with algorithm instance. ++ * ++ * \retval #VPX_DEC_OK ++ * The control request was processed. ++ * \retval #VPX_DEC_ERROR ++ * The control request was not processed. ++ * \retval #VPX_DEC_INVALID_PARAM ++ * The data was not valid. ++ */ ++ vpx_dec_err_t vpx_dec_control(vpx_dec_ctx_t *ctx, ++ int ctrl_id, ++ void *data) DEPRECATED; ++ ++ /*!\brief Decode data ++ * ++ * Processes a buffer of coded data. If the processing results in a new ++ * decoded frame becoming available, #VPX_DEC_CB_PUT_SLICE and ++ * #VPX_DEC_CB_PUT_FRAME events may be generated, as appropriate. Encoded data ++ * \ref MUST be passed in DTS (decode time stamp) order. Frames produced will ++ * always be in PTS (presentation time stamp) order. ++ * ++ * \param[in] ctx Pointer to this instance's context ++ * \param[in] data Pointer to this block of new coded data. If ++ * NULL, a VPX_DEC_CB_PUT_FRAME event is posted ++ * for the previously decoded frame. ++ * \param[in] data_sz Size of the coded data, in bytes. ++ * \param[in] user_priv Application specific data to associate with ++ * this frame. ++ * \param[in] rel_pts PTS relative to the previous frame, in us. If ++ * unknown or unavailable, set to zero. ++ * ++ * \return Returns #VPX_DEC_OK if the coded data was processed completely ++ * and future pictures can be decoded without error. Otherwise, ++ * see the descriptions of the other error codes in ::vpx_dec_err_t ++ * for recoverability capabilities. ++ */ ++ vpx_dec_err_t vpx_dec_decode(vpx_dec_ctx_t *ctx, ++ uint8_t *data, ++ unsigned int data_sz, ++ void *user_priv, ++ int rel_pts) DEPRECATED; ++ ++ ++ /*!\brief Decoded frames iterator ++ * ++ * Iterates over a list of the frames available for display. The iterator ++ * storage should be initialized to NULL to start the iteration. Iteration is ++ * complete when this function returns NULL. ++ * ++ * The list of available frames becomes valid upon completion of the ++ * vpx_dec_decode call, and remains valid until the next call to vpx_dec_decode. ++ * ++ * \param[in] ctx Pointer to this instance's context ++ * \param[in out] iter Iterator storage, initialized to NULL ++ * ++ * \return Returns a pointer to an image, if one is ready for display. Frames ++ * produced will always be in PTS (presentation time stamp) order. ++ */ ++ vpx_image_t *vpx_dec_get_frame(vpx_dec_ctx_t *ctx, ++ vpx_dec_iter_t *iter) DEPRECATED; ++ ++ ++ /*!\defgroup cap_put_frame Frame-Based Decoding Functions ++ * ++ * The following functions are required to be implemented for all decoders ++ * that advertise the VPX_DEC_CAP_PUT_FRAME capability. Calling these functions ++ * for codecs that don't advertise this capability will result in an error ++ * code being returned, usually VPX_DEC_ERROR ++ * @{ ++ */ ++ ++ /*!\brief put frame callback prototype ++ * ++ * This callback is invoked by the decoder to notify the application of ++ * the availability of decoded image data. ++ */ ++ typedef void (*vpx_dec_put_frame_cb_fn_t)(void *user_priv, ++ const vpx_image_t *img); ++ ++ ++ /*!\brief Register for notification of frame completion. ++ * ++ * Registers a given function to be called when a decoded frame is ++ * available. ++ * ++ * \param[in] ctx Pointer to this instance's context ++ * \param[in] cb Pointer to the callback function ++ * \param[in] user_priv User's private data ++ * ++ * \retval #VPX_DEC_OK ++ * Callback successfully registered. ++ * \retval #VPX_DEC_ERROR ++ * Decoder context not initialized, or algorithm not capable of ++ * posting slice completion. ++ */ ++ vpx_dec_err_t vpx_dec_register_put_frame_cb(vpx_dec_ctx_t *ctx, ++ vpx_dec_put_frame_cb_fn_t cb, ++ void *user_priv) DEPRECATED; ++ ++ ++ /*!@} - end defgroup cap_put_frame */ ++ ++ /*!\defgroup cap_put_slice Slice-Based Decoding Functions ++ * ++ * The following functions are required to be implemented for all decoders ++ * that advertise the VPX_DEC_CAP_PUT_SLICE capability. Calling these functions ++ * for codecs that don't advertise this capability will result in an error ++ * code being returned, usually VPX_DEC_ERROR ++ * @{ ++ */ ++ ++ /*!\brief put slice callback prototype ++ * ++ * This callback is invoked by the decoder to notify the application of ++ * the availability of partially decoded image data. The ++ */ ++ typedef void (*vpx_dec_put_slice_cb_fn_t)(void *user_priv, ++ const vpx_image_t *img, ++ const vpx_image_rect_t *valid, ++ const vpx_image_rect_t *update); ++ ++ ++ /*!\brief Register for notification of slice completion. ++ * ++ * Registers a given function to be called when a decoded slice is ++ * available. ++ * ++ * \param[in] ctx Pointer to this instance's context ++ * \param[in] cb Pointer to the callback function ++ * \param[in] user_priv User's private data ++ * ++ * \retval #VPX_DEC_OK ++ * Callback successfully registered. ++ * \retval #VPX_DEC_ERROR ++ * Decoder context not initialized, or algorithm not capable of ++ * posting slice completion. ++ */ ++ vpx_dec_err_t vpx_dec_register_put_slice_cb(vpx_dec_ctx_t *ctx, ++ vpx_dec_put_slice_cb_fn_t cb, ++ void *user_priv) DEPRECATED; ++ ++ ++ /*!@} - end defgroup cap_put_slice*/ ++ ++ /*!\defgroup cap_xma External Memory Allocation Functions ++ * ++ * The following functions are required to be implemented for all decoders ++ * that advertise the VPX_DEC_CAP_XMA capability. Calling these functions ++ * for codecs that don't advertise this capability will result in an error ++ * code being returned, usually VPX_DEC_ERROR ++ * @{ ++ */ ++ ++ /*!\brief Memory Map Entry ++ * ++ * This structure is used to contain the properties of a memory segment. It ++ * is populated by the decoder in the request phase, and by the calling ++ * application once the requested allocation has been performed. ++ */ ++#if 1 ++#define VPX_DEC_MEM_ZERO 0x1 /**< Segment must be zeroed by allocation */ ++#define VPX_DEC_MEM_WRONLY 0x2 /**< Segment need not be readable */ ++#define VPX_DEC_MEM_FAST 0x4 /**< Place in fast memory, if available */ ++ typedef struct vpx_codec_mmap vpx_dec_mmap_t; ++#else ++ typedef struct vpx_dec_mmap ++ { ++ /* ++ * The following members are set by the codec when requesting a segment ++ */ ++ unsigned int id; /**< identifier for the segment's contents */ ++ unsigned long sz; /**< size of the segment, in bytes */ ++ unsigned int align; /**< required alignment of the segment, in bytes */ ++ unsigned int flags; /**< bitfield containing segment properties */ ++#define VPX_DEC_MEM_ZERO 0x1 /**< Segment must be zeroed by allocation */ ++#define VPX_DEC_MEM_WRONLY 0x2 /**< Segment need not be readable */ ++#define VPX_DEC_MEM_FAST 0x4 /**< Place in fast memory, if available */ ++ ++ /* The following members are to be filled in by the allocation function */ ++ void *base; /**< pointer to the allocated segment */ ++ void (*dtor)(struct vpx_dec_mmap *map); /**< destructor to call */ ++ void *priv; /**< allocator private storage */ ++ } vpx_dec_mmap_t; ++#endif ++ ++ /*!\brief Initialize a decoder instance in external allocation mode ++ * ++ * Initializes a decoder context using the given interface. Applications ++ * should call the vpx_dec_xma_init convenience macro instead of this ++ * function directly, to ensure that the ABI version number parameter ++ * is properly initialized. ++ * ++ * \param[in] ctx Pointer to this instance's context. ++ * \param[in] iface Pointer to the alogrithm interface to use. ++ * \param[in] ver ABI version number. Must be set to ++ * VPX_DECODER_ABI_VERSION ++ * \retval #VPX_DEC_OK ++ * The decoder algorithm initialized. ++ * \retval #VPX_DEC_ERROR ++ * Decoder does not support XMA mode. ++ */ ++ vpx_dec_err_t vpx_dec_xma_init_ver(vpx_dec_ctx_t *ctx, ++ vpx_dec_iface_t *iface, ++ int ver) DEPRECATED; ++#define vpx_dec_xma_init(ctx, iface) \ ++ vpx_dec_xma_init_ver(ctx, iface, VPX_DECODER_ABI_VERSION) ++ ++ ++ /*!\brief Iterate over the list of segments to allocate. ++ * ++ * Iterates over a list of the segments to allocate. The iterator storage ++ * should be initialized to NULL to start the iteration. Iteration is complete ++ * when this function returns VPX_DEC_LIST_END. The amount of memory needed to ++ * allocate is dependant upon the size of the encoded stream. This means that ++ * the stream info structure must be known at allocation time. It can be ++ * populated with the vpx_dec_peek_stream_info() function. In cases where the ++ * stream to be decoded is not available at allocation time, a fixed size must ++ * be requested. The decoder will not be able to decode streams larger than ++ * the size used at allocation time. ++ * ++ * \param[in] ctx Pointer to this instance's context. ++ * \param[out] mmap Pointer to the memory map entry to populate. ++ * \param[in] si Pointer to the stream info. ++ * \param[in out] iter Iterator storage, initialized to NULL ++ * ++ * \retval #VPX_DEC_OK ++ * The memory map entry was populated. ++ * \retval #VPX_DEC_ERROR ++ * Decoder does not support XMA mode. ++ * \retval #VPX_DEC_MEM_ERROR ++ * Unable to determine segment size from stream info. ++ */ ++ vpx_dec_err_t vpx_dec_get_mem_map(vpx_dec_ctx_t *ctx, ++ vpx_dec_mmap_t *mmap, ++ const vpx_dec_stream_info_t *si, ++ vpx_dec_iter_t *iter) DEPRECATED; ++ ++ ++ /*!\brief Identify allocated segments to decoder instance ++ * ++ * Stores a list of allocated segments in the decoder. Segments \ref MUST be ++ * passed in the order they are read from vpx_dec_get_mem_map(), but may be ++ * passed in groups of any size. Segments \ref MUST be set only once. The ++ * allocation function \ref MUST ensure that the vpx_dec_mmap_t::base member ++ * is non-NULL. If the segment requires cleanup handling (eg, calling free() ++ * or close()) then the vpx_dec_mmap_t::dtor member \ref MUST be populated. ++ * ++ * \param[in] ctx Pointer to this instance's context. ++ * \param[in] mmaps Pointer to the first memory map entry in the list. ++ * \param[in] num_maps Number of entries being set at this time ++ * ++ * \retval #VPX_DEC_OK ++ * The segment was stored in the decoder context. ++ * \retval #VPX_DEC_ERROR ++ * Decoder does not support XMA mode. ++ * \retval #VPX_DEC_MEM_ERROR ++ * Segment base address was not set, or segment was already stored. ++ ++ */ ++ vpx_dec_err_t vpx_dec_set_mem_map(vpx_dec_ctx_t *ctx, ++ vpx_dec_mmap_t *mmaps, ++ unsigned int num_maps) DEPRECATED; ++ ++ /*!@} - end defgroup cap_xma*/ ++ /*!@} - end defgroup decoder*/ ++ ++ ++#endif ++#ifdef __cplusplus ++} ++#endif +diff --git a/vpx/vpx_encoder.h b/vpx/vpx_encoder.h +new file mode 100644 +index 0000000..8ad7055 +--- /dev/null ++++ b/vpx/vpx_encoder.h +@@ -0,0 +1,793 @@ ++/* ++ * Copyright (c) 2010 The VP8 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. ++ */ ++ ++ ++/*!\defgroup encoder Encoder Algorithm Interface ++ * \ingroup codec ++ * This abstraction allows applications using this encoder to easily support ++ * multiple video formats with minimal code duplication. This section describes ++ * the interface common to all encoders. ++ * @{ ++ */ ++ ++/*!\file vpx_encoder.h ++ * \brief Describes the encoder algorithm interface to applications. ++ * ++ * This file describes the interface between an application and a ++ * video encoder algorithm. ++ * ++ */ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#ifndef VPX_ENCODER_H ++#define VPX_ENCODER_H ++#include "vpx_codec.h" ++ ++ ++ /*!\brief Current ABI version number ++ * ++ * \internal ++ * If this file is altered in any way that changes the ABI, this value ++ * must be bumped. Examples include, but are not limited to, changing ++ * types, removing or reassigning enums, adding/removing/rearranging ++ * fields to structures ++ */ ++#define VPX_ENCODER_ABI_VERSION (2 + VPX_CODEC_ABI_VERSION) /**<\hideinitializer*/ ++ ++ ++ /*! \brief Encoder capabilities bitfield ++ * ++ * Each encoder advertises the capabilities it supports as part of its ++ * ::vpx_codec_iface_t interface structure. Capabilities are extra ++ * interfaces or functionality, and are not required to be supported ++ * by an encoder. ++ * ++ * The available flags are specifiedby VPX_CODEC_CAP_* defines. ++ */ ++#define VPX_CODEC_CAP_PSNR 0x10000 /**< Can issue PSNR packets */ ++ ++ ++ /*! \brief Initialization-time Feature Enabling ++ * ++ * Certain codec features must be known at initialization time, to allow ++ * for proper memory allocation. ++ * ++ * The available flags are specified by VPX_CODEC_USE_* defines. ++ */ ++#define VPX_CODEC_USE_PSNR 0x10000 /**< Calculate PSNR on each frame */ ++ ++ ++ /*!\brief Generic fixed size buffer structure ++ * ++ * This structure is able to hold a reference to any fixed size buffer. ++ */ ++ typedef struct vpx_fixed_buf ++ { ++ void *buf; /**< Pointer to the data */ ++ size_t sz; /**< Length of the buffer, in chars */ ++ } vpx_fixed_buf_t; /**< alias for struct vpx_fixed_buf */ ++ ++ ++ /*!\brief Time Stamp Type ++ * ++ * An integer, which when multiplied by the stream's time base, provides ++ * the absolute time of a sample. ++ */ ++ typedef int64_t vpx_codec_pts_t; ++ ++ ++ /*!\brief Compressed Frame Flags ++ * ++ * This type represents a bitfield containing information about a compressed ++ * frame that may be useful to an application. The most significant 16 bits ++ * can be used by an algorithm to provide additional detail, for example to ++ * support frame types that are codec specific (MPEG-1 D-frames for example) ++ */ ++ typedef uint32_t vpx_codec_frame_flags_t; ++#define VPX_FRAME_IS_KEY 0x1 /**< frame is the start of a GOP */ ++#define VPX_FRAME_IS_DROPPABLE 0x2 /**< frame can be dropped without affecting ++ the stream (no future frame depends on ++ this one) */ ++#define VPX_FRAME_IS_INVISIBLE 0x4 /**< frame should be decoded but will not ++ be shown */ ++ ++ ++ /*!\brief Encoder output packet variants ++ * ++ * This enumeration lists the different kinds of data packets that can be ++ * returned by calls to vpx_codec_get_cx_data(). Algorithms \ref MAY ++ * extend this list to provide additional functionality. ++ */ ++ enum vpx_codec_cx_pkt_kind ++ { ++ VPX_CODEC_CX_FRAME_PKT, /**< Compressed video frame */ ++ VPX_CODEC_STATS_PKT, /**< Two-pass statistics for this frame */ ++ VPX_CODEC_PSNR_PKT, /**< PSNR statistics for this frame */ ++ VPX_CODEC_CUSTOM_PKT = 256 /**< Algorithm extensions */ ++ }; ++ ++ ++ /*!\brief Encoder output packet ++ * ++ * This structure contains the different kinds of output data the encoder ++ * may produce while compressing a frame. ++ */ ++ typedef struct vpx_codec_cx_pkt ++ { ++ enum vpx_codec_cx_pkt_kind kind; /**< packet variant */ ++ union ++ { ++ struct ++ { ++ void *buf; /**< compressed data buffer */ ++ size_t sz; /**< length of compressed data */ ++ vpx_codec_pts_t pts; /**< time stamp to show frame ++ (in timebase units) */ ++ unsigned long duration; /**< duration to show frame ++ (in timebase units) */ ++ vpx_codec_frame_flags_t flags; /**< flags for this frame */ ++ } frame; /**< data for compressed frame packet */ ++ struct vpx_fixed_buf twopass_stats; /**< data for two-pass packet */ ++ struct vpx_psnr_pkt ++ { ++ unsigned int samples[4]; /**< Number of samples, total/y/u/v */ ++ uint64_t sse[4]; /**< sum squared error, total/y/u/v */ ++ double psnr[4]; /**< PSNR, total/y/u/v */ ++ } psnr; /**< data for PSNR packet */ ++ struct vpx_fixed_buf raw; /**< data for arbitrary packets */ ++ ++ /* This packet size is fixed to allow codecs to extend this ++ * interface without having to manage storage for raw packets, ++ * ie if it's smaller than 128 bytes, you can store in the ++ * packet list directly. ++ */ ++ char pad[128 - sizeof(enum vpx_codec_cx_pkt_kind)]; /**< fixed sz */ ++ } data; /**< packet data */ ++ } vpx_codec_cx_pkt_t; /**< alias for struct vpx_codec_cx_pkt */ ++ ++ ++ /*!\brief Rational Number ++ * ++ * This structure holds a fractional value. ++ */ ++ typedef struct vpx_rational ++ { ++ int num; /**< fraction numerator */ ++ int den; /**< fraction denominator */ ++ } vpx_rational_t; /**< alias for struct vpx_rational */ ++ ++ ++ /*!\brief Multi-pass Encoding Pass */ ++ enum vpx_enc_pass ++ { ++ VPX_RC_ONE_PASS, /**< Single pass mode */ ++ VPX_RC_FIRST_PASS, /**< First pass of multi-pass mode */ ++ VPX_RC_LAST_PASS, /**< Final pass of multi-pass mode */ ++ }; ++ ++ ++ /*!\brief Rate control mode */ ++ enum vpx_rc_mode ++ { ++ VPX_VBR, /**< Variable Bit Rate (VBR) mode */ ++ VPX_CBR /**< Constant Bit Rate (CBR) mode */ ++ }; ++ ++ ++ /*!\brief Keyframe placement mode. ++ * ++ * This enumeration determines whether keyframes are placed automatically by ++ * the encoder or whether this behavior is disabled. Older releases of this ++ * SDK were implemented such that VPX_KF_FIXED meant keyframes were disabled. ++ * This name is confusing for this behavior, so the new symbols to be used ++ * are VPX_KF_AUTO and VPX_KF_DISABLED. ++ */ ++ enum vpx_kf_mode ++ { ++ VPX_KF_FIXED, /**< deprecated, implies VPX_KF_DISABLED */ ++ VPX_KF_AUTO, /**< Encoder determines optimal placement automatically */ ++ VPX_KF_DISABLED = 0 /**< Encoder does not place keyframes. */ ++ }; ++ ++ ++ /*!\brief Encoded Frame Flags ++ * ++ * This type indicates a bitfield to be passed to vpx_codec_encode(), defining ++ * per-frame boolean values. By convention, bits common to all codecs will be ++ * named VPX_EFLAG_*, and bits specific to an algorithm will be named ++ * /algo/_eflag_*. The lower order 16 bits are reserved for common use. ++ */ ++ typedef long vpx_enc_frame_flags_t; ++#define VPX_EFLAG_FORCE_KF (1<<0) /**< Force this frame to be a keyframe */ ++ ++ ++ /*!\brief Encoder configuration structure ++ * ++ * This structure contains the encoder settings that have common representations ++ * across all codecs. This doesn't imply that all codecs support all features, ++ * however. ++ */ ++ typedef struct vpx_codec_enc_cfg ++ { ++ /* ++ * generic settings (g) ++ */ ++ ++ /*!\brief Algorithm specific "usage" value ++ * ++ * Algorithms may define multiple values for usage, which may convey the ++ * intent of how the application intends to use the stream. If this value ++ * is non-zero, consult the documentation for the codec to determine its ++ * meaning. ++ */ ++ unsigned int g_usage; ++ ++ ++ /*!\brief Maximum number of threads to use ++ * ++ * For multi-threaded implementations, use no more than this number of ++ * threads. The codec may use fewer threads than allowed. The value ++ * 0 is equivalent to the value 1. ++ */ ++ unsigned int g_threads; ++ ++ ++ /*!\brief Bitstream profile to use ++ * ++ * Some codecs support a notion of multiple bitstream profiles. Typically ++ * this maps to a set of features that are turned on or off. Often the ++ * profile to use is determined by the features of the intended decoder. ++ * Consult the documentation for the codec to determine the valid values ++ * for this parameter, or set to zero for a sane default. ++ */ ++ unsigned int g_profile; /**< profile of bitstream to use */ ++ ++ ++ ++ /*!\brief Width of the frame ++ * ++ * This value identifies the presentation resolution of the frame, ++ * in pixels. Note that the frames passed as input to the encoder must ++ * have this resolution. Frames will be presented by the decoder in this ++ * resolution, independent of any spatial resampling the encoder may do. ++ */ ++ unsigned int g_w; ++ ++ ++ /*!\brief Height of the frame ++ * ++ * This value identifies the presentation resolution of the frame, ++ * in pixels. Note that the frames passed as input to the encoder must ++ * have this resolution. Frames will be presented by the decoder in this ++ * resolution, independent of any spatial resampling the encoder may do. ++ */ ++ unsigned int g_h; ++ ++ ++ /*!\brief Stream timebase units ++ * ++ * Indicates the smallest interval of time, in seconds, used by the stream. ++ * For fixed frame rate material, or variable frame rate material where ++ * frames are timed at a multiple of a given clock (ex: video capture), ++ * the \ref RECOMMENDED method is to set the timebase to the reciprocal ++ * of the frame rate (ex: 1001/30000 for 29.970 Hz NTSC). This allows the ++ * pts to correspond to the frame number, which can be handy. For ++ * re-encoding video from containers with absolute time timestamps, the ++ * \ref RECOMMENDED method is to set the timebase to that of the parent ++ * container or multimedia framework (ex: 1/1000 for ms, as in FLV). ++ */ ++ struct vpx_rational g_timebase; ++ ++ ++ /*!\brief Enable error resilient mode. ++ * ++ * Error resilient mode indicates to the encoder that it should take ++ * measures appropriate for streaming over lossy or noisy links, if ++ * possible. Set to 1 to enable this feature, 0 to disable it. ++ */ ++ unsigned int g_error_resilient; ++ ++ ++ /*!\brief Multi-pass Encoding Mode ++ * ++ * This value should be set to the current phase for multi-pass encoding. ++ * For single pass, set to #VPX_RC_ONE_PASS. ++ */ ++ enum vpx_enc_pass g_pass; ++ ++ ++ /*!\brief Allow lagged encoding ++ * ++ * If set, this value allows the encoder to consume a number of input ++ * frames before producing output frames. This allows the encoder to ++ * base decisions for the current frame on future frames. This does ++ * increase the latency of the encoding pipeline, so it is not appropriate ++ * in all situations (ex: realtime encoding). ++ * ++ * Note that this is a maximum value -- the encoder may produce frames ++ * sooner than the given limit. Set this value to 0 to disable this ++ * feature. ++ */ ++ unsigned int g_lag_in_frames; ++ ++ ++ /* ++ * rate control settings (rc) ++ */ ++ ++ /*!\brief Temporal resampling configuration, if supported by the codec. ++ * ++ * Temporal resampling allows the codec to "drop" frames as a strategy to ++ * meet its target data rate. This can cause temporal discontinuities in ++ * the encoded video, which may appear as stuttering during playback. This ++ * trade-off is often acceptable, but for many applications is not. It can ++ * be disabled in these cases. ++ * ++ * Note that not all codecs support this feature. All vpx VPx codecs do. ++ * For other codecs, consult the documentation for that algorithm. ++ * ++ * This threshold is described as a percentage of the target data buffer. ++ * When the data buffer falls below this percentage of fullness, a ++ * dropped frame is indicated. Set the threshold to zero (0) to disable ++ * this feature. ++ */ ++ unsigned int rc_dropframe_thresh; ++ ++ ++ /*!\brief Enable/disable spatial resampling, if supported by the codec. ++ * ++ * Spatial resampling allows the codec to compress a lower resolution ++ * version of the frame, which is then upscaled by the encoder to the ++ * correct presentation resolution. This increases visual quality at ++ * low data rates, at the expense of CPU time on the encoder/decoder. ++ */ ++ unsigned int rc_resize_allowed; ++ ++ ++ /*!\brief Spatial resampling up watermark. ++ * ++ * This threshold is described as a percentage of the target data buffer. ++ * When the data buffer rises above this percentage of fullness, the ++ * encoder will step up to a higher resolution version of the frame. ++ */ ++ unsigned int rc_resize_up_thresh; ++ ++ ++ /*!\brief Spatial resampling down watermark. ++ * ++ * This threshold is described as a percentage of the target data buffer. ++ * When the data buffer falls below this percentage of fullness, the ++ * encoder will step down to a lower resolution version of the frame. ++ */ ++ unsigned int rc_resize_down_thresh; ++ ++ ++ /*!\brief Rate control algorithm to use. ++ * ++ * Indicates whether the end usage of this stream is to be streamed over ++ * a bandwidth constrained link, indicating that Constant Bit Rate (CBR) ++ * mode should be used, or whether it will be played back on a high ++ * bandwidth link, as from a local disk, where higher variations in ++ * bitrate are acceptable. ++ */ ++ enum vpx_rc_mode rc_end_usage; ++ ++ ++ /*!\brief Two-pass stats buffer. ++ * ++ * A buffer containing all of the stats packets produced in the first ++ * pass, concatenated. ++ */ ++ struct vpx_fixed_buf rc_twopass_stats_in; ++ ++ ++ /*!\brief Target data rate ++ * ++ * Target bandwidth to use for this stream, in kilobits per second. ++ */ ++ unsigned int rc_target_bitrate; ++ ++ ++ /* ++ * quantizer settings ++ */ ++ ++ ++ /*!\brief Minimum (Best Quality) Quantizer ++ * ++ * The quantizer is the most direct control over the quality of the ++ * encoded image. The range of valid values for the quantizer is codec ++ * specific. Consult the documentation for the codec to determine the ++ * values to use. To determine the range programmatically, call ++ * vpx_codec_enc_config_default() with a usage value of 0. ++ */ ++ unsigned int rc_min_quantizer; ++ ++ ++ /*!\brief Maximum (Worst Quality) Quantizer ++ * ++ * The quantizer is the most direct control over the quality of the ++ * encoded image. The range of valid values for the quantizer is codec ++ * specific. Consult the documentation for the codec to determine the ++ * values to use. To determine the range programmatically, call ++ * vpx_codec_enc_config_default() with a usage value of 0. ++ */ ++ unsigned int rc_max_quantizer; ++ ++ ++ /* ++ * bitrate tolerance ++ */ ++ ++ ++ /*!\brief Rate control undershoot tolerance ++ * ++ * This value, expressed as a percentage of the target bitrate, describes ++ * the target bitrate for easier frames, allowing bits to be saved for ++ * harder frames. Set to zero to use the codec default. ++ */ ++ unsigned int rc_undershoot_pct; ++ ++ ++ /*!\brief Rate control overshoot tolerance ++ * ++ * This value, expressed as a percentage of the target bitrate, describes ++ * the maximum allowed bitrate for a given frame. Set to zero to use the ++ * codec default. ++ */ ++ unsigned int rc_overshoot_pct; ++ ++ ++ /* ++ * decoder buffer model parameters ++ */ ++ ++ ++ /*!\brief Decoder Buffer Size ++ * ++ * This value indicates the amount of data that may be buffered by the ++ * decoding application. Note that this value is expressed in units of ++ * time (milliseconds). For example, a value of 5000 indicates that the ++ * client will buffer (at least) 5000ms worth of encoded data. Use the ++ * target bitrate (#rc_target_bitrate) to convert to bits/bytes, if ++ * necessary. ++ */ ++ unsigned int rc_buf_sz; ++ ++ ++ /*!\brief Decoder Buffer Initial Size ++ * ++ * This value indicates the amount of data that will be buffered by the ++ * decoding application prior to beginning playback. This value is ++ * expressed in units of time (milliseconds). Use the target bitrate ++ * (#rc_target_bitrate) to convert to bits/bytes, if necessary. ++ */ ++ unsigned int rc_buf_initial_sz; ++ ++ ++ /*!\brief Decoder Buffer Optimal Size ++ * ++ * This value indicates the amount of data that the encoder should try ++ * to maintain in the decoder's buffer. This value is expressed in units ++ * of time (milliseconds). Use the target bitrate (#rc_target_bitrate) ++ * to convert to bits/bytes, if necessary. ++ */ ++ unsigned int rc_buf_optimal_sz; ++ ++ ++ /* ++ * 2 pass rate control parameters ++ */ ++ ++ ++ /*!\brief Two-pass mode CBR/VBR bias ++ * ++ * Bias, expressed on a scale of 0 to 100, for determining target size ++ * for the current frame. The value 0 indicates the optimal CBR mode ++ * value should be used. The value 100 indicates the optimal VBR mode ++ * value should be used. Values in between indicate which way the ++ * encoder should "lean." ++ */ ++ unsigned int rc_2pass_vbr_bias_pct; /**< RC mode bias between CBR and VBR(0-100: 0->CBR, 100->VBR) */ ++ ++ ++ /*!\brief Two-pass mode per-GOP minimum bitrate ++ * ++ * This value, expressed as a percentage of the target bitrate, indicates ++ * the minimum bitrate to be used for a single GOP (aka "section") ++ */ ++ unsigned int rc_2pass_vbr_minsection_pct; ++ ++ ++ /*!\brief Two-pass mode per-GOP maximum bitrate ++ * ++ * This value, expressed as a percentage of the target bitrate, indicates ++ * the maximum bitrate to be used for a single GOP (aka "section") ++ */ ++ unsigned int rc_2pass_vbr_maxsection_pct; ++ ++ ++ /* ++ * keyframing settings (kf) ++ */ ++ ++ /*!\brief Keyframe placement mode ++ * ++ * This value indicates whether the encoder should place keyframes at a ++ * fixed interval, or determine the optimal placement automatically ++ * (as governed by the #kf_min_dist and #kf_max_dist parameters) ++ */ ++ enum vpx_kf_mode kf_mode; ++ ++ ++ /*!\brief Keyframe minimum interval ++ * ++ * This value, expressed as a number of frames, prevents the encoder from ++ * placing a keyframe nearer than kf_min_dist to the previous keyframe. At ++ * least kf_min_dist frames non-keyframes will be coded before the next ++ * keyframe. Set kf_min_dist equal to kf_max_dist for a fixed interval. ++ */ ++ unsigned int kf_min_dist; ++ ++ ++ /*!\brief Keyframe maximum interval ++ * ++ * This value, expressed as a number of frames, forces the encoder to code ++ * a keyframe if one has not been coded in the last kf_max_dist frames. ++ * A value of 0 implies all frames will be keyframes. Set kf_min_dist ++ * equal to kf_max_dist for a fixed interval. ++ */ ++ unsigned int kf_max_dist; ++ ++ } vpx_codec_enc_cfg_t; /**< alias for struct vpx_codec_enc_cfg */ ++ ++ ++ /*!\brief Initialize an encoder instance ++ * ++ * Initializes a encoder context using the given interface. Applications ++ * should call the vpx_codec_enc_init convenience macro instead of this ++ * function directly, to ensure that the ABI version number parameter ++ * is properly initialized. ++ * ++ * In XMA mode (activated by setting VPX_CODEC_USE_XMA in the flags ++ * parameter), the storage pointed to by the cfg parameter must be ++ * kept readable and stable until all memory maps have been set. ++ * ++ * \param[in] ctx Pointer to this instance's context. ++ * \param[in] iface Pointer to the algorithm interface to use. ++ * \param[in] cfg Configuration to use, if known. May be NULL. ++ * \param[in] flags Bitfield of VPX_CODEC_USE_* flags ++ * \param[in] ver ABI version number. Must be set to ++ * VPX_ENCODER_ABI_VERSION ++ * \retval #VPX_CODEC_OK ++ * The decoder algorithm initialized. ++ * \retval #VPX_CODEC_MEM_ERROR ++ * Memory allocation failed. ++ */ ++ vpx_codec_err_t vpx_codec_enc_init_ver(vpx_codec_ctx_t *ctx, ++ vpx_codec_iface_t *iface, ++ vpx_codec_enc_cfg_t *cfg, ++ vpx_codec_flags_t flags, ++ int ver); ++ ++ ++ /*!\brief Convenience macro for vpx_codec_enc_init_ver() ++ * ++ * Ensures the ABI version parameter is properly set. ++ */ ++#define vpx_codec_enc_init(ctx, iface, cfg, flags) \ ++ vpx_codec_enc_init_ver(ctx, iface, cfg, flags, VPX_ENCODER_ABI_VERSION) ++ ++ ++ /*!\brief Get a default configuration ++ * ++ * Initializes a encoder configuration structure with default values. Supports ++ * the notion of "usages" so that an algorithm may offer different default ++ * settings depending on the user's intended goal. This function \ref SHOULD ++ * be called by all applications to initialize the configuration structure ++ * before specializing the configuration with application specific values. ++ * ++ * \param[in] iface Pointer to the algorithm interface to use. ++ * \param[out] cfg Configuration buffer to populate ++ * \param[in] usage End usage. Set to 0 or use codec specific values. ++ * ++ * \retval #VPX_CODEC_OK ++ * The configuration was populated. ++ * \retval #VPX_CODEC_INCAPABLE ++ * Interface is not an encoder interface. ++ * \retval #VPX_CODEC_INVALID_PARAM ++ * A parameter was NULL, or the usage value was not recognized. ++ */ ++ vpx_codec_err_t vpx_codec_enc_config_default(vpx_codec_iface_t *iface, ++ vpx_codec_enc_cfg_t *cfg, ++ unsigned int usage); ++ ++ ++ /*!\brief Set or change configuration ++ * ++ * Reconfigures an encoder instance according to the given configuration. ++ * ++ * \param[in] ctx Pointer to this instance's context ++ * \param[in] cfg Configuration buffer to use ++ * ++ * \retval #VPX_CODEC_OK ++ * The configuration was populated. ++ * \retval #VPX_CODEC_INCAPABLE ++ * Interface is not an encoder interface. ++ * \retval #VPX_CODEC_INVALID_PARAM ++ * A parameter was NULL, or the usage value was not recognized. ++ */ ++ vpx_codec_err_t vpx_codec_enc_config_set(vpx_codec_ctx_t *ctx, ++ const vpx_codec_enc_cfg_t *cfg); ++ ++ ++ /*!\brief Get global stream headers ++ * ++ * Retrieves a stream level global header packet, if supported by the codec. ++ * ++ * \param[in] ctx Pointer to this instance's context ++ * ++ * \retval NULL ++ * Encoder does not support global header ++ * \retval Non-NULL ++ * Pointer to buffer containing global header packet ++ */ ++ vpx_fixed_buf_t *vpx_codec_get_global_headers(vpx_codec_ctx_t *ctx); ++ ++ ++#define VPX_DL_REALTIME (1) /**< deadline parameter analogous to ++ * VPx REALTIME mode. */ ++#define VPX_DL_GOOD_QUALITY (1000000) /**< deadline parameter analogous to ++ * VPx GOOD QUALITY mode. */ ++#define VPX_DL_BEST_QUALITY (0) /**< deadline parameter analogous to ++ * VPx BEST QUALITY mode. */ ++ /*!\brief Encode a frame ++ * ++ * Encodes a video frame at the given "presentation time." The presentation ++ * time stamp (PTS) \ref MUST be strictly increasing. ++ * ++ * The encoder supports the notion of a soft real-time deadline. Given a ++ * non-zero value to the deadline parameter, the encoder will make a "best ++ * effort" guarantee to return before the given time slice expires. It is ++ * implicit that limiting the available time to encode will degrade the ++ * output quality. The encoder can be given an unlimited time to produce the ++ * best possible frame by specifying a deadline of '0'. This deadline ++ * supercedes the VPx notion of "best quality, good quality, realtime". ++ * Applications that wish to map these former settings to the new deadline ++ * based system can use the symbols #VPX_DL_REALTIME, #VPX_DL_GOOD_QUALITY, ++ * and #VPX_DL_BEST_QUALITY. ++ * ++ * When the last frame has been passed to the encoder, this function should ++ * continue to be called, with the img parameter set to NULL. This will ++ * signal the end-of-stream condition to the encoder and allow it to encode ++ * any held buffers. Encoding is complete when vpx_codec_encode() is called ++ * and vpx_codec_get_cx_data() returns no data. ++ * ++ * \param[in] ctx Pointer to this instance's context ++ * \param[in] img Image data to encode, NULL to flush. ++ * \param[in] pts Presentation time stamp, in timebase units. ++ * \param[in] duration Duration to show frame, in timebase units. ++ * \param[in] flags Flags to use for encoding this frame. ++ * \param[in] deadline Time to spend encoding, in microseconds. (0=infinite) ++ * ++ * \retval #VPX_CODEC_OK ++ * The configuration was populated. ++ * \retval #VPX_CODEC_INCAPABLE ++ * Interface is not an encoder interface. ++ * \retval #VPX_CODEC_INVALID_PARAM ++ * A parameter was NULL, the image format is unsupported, etc. ++ */ ++ vpx_codec_err_t vpx_codec_encode(vpx_codec_ctx_t *ctx, ++ const vpx_image_t *img, ++ vpx_codec_pts_t pts, ++ unsigned long duration, ++ vpx_enc_frame_flags_t flags, ++ unsigned long deadline); ++ ++ ++ /*!\brief Set compressed data output buffer ++ * ++ * Sets the buffer that the codec should output the compressed data ++ * into. This call effectively sets the buffer pointer returned in the ++ * next VPX_CODEC_CX_FRAME_PKT packet. Subsequent packets will be ++ * appended into this buffer. The buffer is preserved across frames, ++ * so applications must periodically call this function after flushing ++ * the accumulated compressed data to disk or to the network to reset ++ * the pointer to the buffer's head. ++ * ++ * `pad_before` bytes will be skipped before writing the compressed ++ * data, and `pad_after` bytes will be appended to the packet. The size ++ * of the packet will be the sum of the size of the actual compressed ++ * data, pad_before, and pad_after. The padding bytes will be preserved ++ * (not overwritten). ++ * ++ * Note that calling this function does not guarantee that the returned ++ * compressed data will be placed into the specified buffer. In the ++ * event that the encoded data will not fit into the buffer provided, ++ * the returned packet \ref MAY point to an internal buffer, as it would ++ * if this call were never used. In this event, the output packet will ++ * NOT have any padding, and the application must free space and copy it ++ * to the proper place. This is of particular note in configurations ++ * that may output multiple packets for a single encoded frame (e.g., lagged ++ * encoding) or if the application does not reset the buffer periodically. ++ * ++ * Applications may restore the default behavior of the codec providing ++ * the compressed data buffer by calling this function with a NULL ++ * buffer. ++ * ++ * Applications \ref MUSTNOT call this function during iteration of ++ * vpx_codec_get_cx_data(). ++ * ++ * \param[in] ctx Pointer to this instance's context ++ * \param[in] buf Buffer to store compressed data into ++ * \param[in] pad_before Bytes to skip before writing compressed data ++ * \param[in] pad_after Bytes to skip after writing compressed data ++ * ++ * \retval #VPX_CODEC_OK ++ * The buffer was set successfully. ++ * \retval #VPX_CODEC_INVALID_PARAM ++ * A parameter was NULL, the image format is unsupported, etc. ++ */ ++ vpx_codec_err_t vpx_codec_set_cx_data_buf(vpx_codec_ctx_t *ctx, ++ const vpx_fixed_buf_t *buf, ++ unsigned int pad_before, ++ unsigned int pad_after); ++ ++ ++ /*!\brief Encoded data iterator ++ * ++ * Iterates over a list of data packets to be passed from the encoder to the ++ * application. The different kinds of packets available are enumerated in ++ * #vpx_codec_cx_pkt_kind. ++ * ++ * #VPX_CODEC_CX_FRAME_PKT packets should be passed to the application's ++ * muxer. Multiple compressed frames may be in the list. ++ * #VPX_CODEC_STATS_PKT packets should be appended to a global buffer. ++ * ++ * The application \ref MUST silently ignore any packet kinds that it does ++ * not recognize or support. ++ * ++ * The data buffers returned from this function are only guaranteed to be ++ * valid until the application makes another call to any vpx_codec_* function. ++ * ++ * \param[in] ctx Pointer to this instance's context ++ * \param[in,out] iter Iterator storage, initialized to NULL ++ * ++ * \return Returns a pointer to an output data packet (compressed frame data, ++ * two-pass statistics, etc.) or NULL to signal end-of-list. ++ * ++ */ ++ const vpx_codec_cx_pkt_t *vpx_codec_get_cx_data(vpx_codec_ctx_t *ctx, ++ vpx_codec_iter_t *iter); ++ ++ ++ /*!\brief Get Preview Frame ++ * ++ * Returns an image that can be used as a preview. Shows the image as it would ++ * exist at the decompressor. The application \ref MUST NOT write into this ++ * image buffer. ++ * ++ * \param[in] ctx Pointer to this instance's context ++ * ++ * \return Returns a pointer to a preview image, or NULL if no image is ++ * available. ++ * ++ */ ++ const vpx_image_t *vpx_codec_get_preview_frame(vpx_codec_ctx_t *ctx); ++ ++ ++ /*!@} - end defgroup encoder*/ ++ ++#endif ++#ifdef __cplusplus ++} ++#endif +diff --git a/vpx/vpx_image.h b/vpx/vpx_image.h +new file mode 100644 +index 0000000..7e4a03a +--- /dev/null ++++ b/vpx/vpx_image.h +@@ -0,0 +1,242 @@ ++/* ++ * Copyright (c) 2010 The VP8 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. ++ */ ++ ++ ++/*!\file vpx_image.h ++ * \brief Describes the vpx image descriptor and associated operations ++ * ++ */ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#ifndef VPX_IMAGE_H ++#define VPX_IMAGE_H ++ ++ /*!\brief Current ABI version number ++ * ++ * \internal ++ * If this file is altered in any way that changes the ABI, this value ++ * must be bumped. Examples include, but are not limited to, changing ++ * types, removing or reassigning enums, adding/removing/rearranging ++ * fields to structures ++ */ ++#define VPX_IMAGE_ABI_VERSION (1) /**<\hideinitializer*/ ++ ++ ++#define VPX_IMG_FMT_PLANAR 0x100 /**< Image is a planar format */ ++#define VPX_IMG_FMT_UV_FLIP 0x200 /**< V plane precedes U plane in memory */ ++#define VPX_IMG_FMT_HAS_ALPHA 0x400 /**< Image has an alpha channel componnent */ ++ ++ ++ /*!\brief List of supported image formats */ ++ typedef enum vpx_img_fmt { ++ VPX_IMG_FMT_NONE, ++ VPX_IMG_FMT_RGB24, /**< 24 bit per pixel packed RGB */ ++ VPX_IMG_FMT_RGB32, /**< 32 bit per pixel packed 0RGB */ ++ VPX_IMG_FMT_RGB565, /**< 16 bit per pixel, 565 */ ++ VPX_IMG_FMT_RGB555, /**< 16 bit per pixel, 555 */ ++ VPX_IMG_FMT_UYVY, /**< UYVY packed YUV */ ++ VPX_IMG_FMT_YUY2, /**< YUYV packed YUV */ ++ VPX_IMG_FMT_YVYU, /**< YVYU packed YUV */ ++ VPX_IMG_FMT_BGR24, /**< 24 bit per pixel packed BGR */ ++ VPX_IMG_FMT_RGB32_LE, /**< 32 bit packed BGR0 */ ++ VPX_IMG_FMT_ARGB, /**< 32 bit packed ARGB, alpha=255 */ ++ VPX_IMG_FMT_ARGB_LE, /**< 32 bit packed BGRA, alpha=255 */ ++ VPX_IMG_FMT_RGB565_LE, /**< 16 bit per pixel, gggbbbbb rrrrrggg */ ++ VPX_IMG_FMT_RGB555_LE, /**< 16 bit per pixel, gggbbbbb 0rrrrrgg */ ++ VPX_IMG_FMT_YV12 = VPX_IMG_FMT_PLANAR | VPX_IMG_FMT_UV_FLIP | 1, /**< planar YVU */ ++ VPX_IMG_FMT_I420 = VPX_IMG_FMT_PLANAR | 2, ++ VPX_IMG_FMT_VPXYV12 = VPX_IMG_FMT_PLANAR | VPX_IMG_FMT_UV_FLIP | 3, /** < planar 4:2:0 format with vpx color space */ ++ VPX_IMG_FMT_VPXI420 = VPX_IMG_FMT_PLANAR | 4, /** < planar 4:2:0 format with vpx color space */ ++ } ++ vpx_img_fmt_t; /**< alias for enum vpx_img_fmt */ ++ ++#if !defined(VPX_CODEC_DISABLE_COMPAT) || !VPX_CODEC_DISABLE_COMPAT ++#define IMG_FMT_PLANAR VPX_IMG_FMT_PLANAR /**< \deprecated Use #VPX_IMG_FMT_PLANAR */ ++#define IMG_FMT_UV_FLIP VPX_IMG_FMT_UV_FLIP /**< \deprecated Use #VPX_IMG_FMT_UV_FLIP */ ++#define IMG_FMT_HAS_ALPHA VPX_IMG_FMT_HAS_ALPHA /**< \deprecated Use #VPX_IMG_FMT_HAS_ALPHA */ ++ ++ /*!\brief Deprecated list of supported image formats ++ * \deprecated New code should use #vpx_img_fmt ++ */ ++#define img_fmt vpx_img_fmt ++ /*!\brief alias for enum img_fmt. ++ * \deprecated New code should use #vpx_img_fmt_t ++ */ ++#define img_fmt_t vpx_img_fmt_t ++ ++#define IMG_FMT_NONE VPX_IMG_FMT_NONE /**< \deprecated Use #VPX_IMG_FMT_NONE */ ++#define IMG_FMT_RGB24 VPX_IMG_FMT_RGB24 /**< \deprecated Use #VPX_IMG_FMT_RGB24 */ ++#define IMG_FMT_RGB32 VPX_IMG_FMT_RGB32 /**< \deprecated Use #VPX_IMG_FMT_RGB32 */ ++#define IMG_FMT_RGB565 VPX_IMG_FMT_RGB565 /**< \deprecated Use #VPX_IMG_FMT_RGB565 */ ++#define IMG_FMT_RGB555 VPX_IMG_FMT_RGB555 /**< \deprecated Use #VPX_IMG_FMT_RGB555 */ ++#define IMG_FMT_UYVY VPX_IMG_FMT_UYVY /**< \deprecated Use #VPX_IMG_FMT_UYVY */ ++#define IMG_FMT_YUY2 VPX_IMG_FMT_YUY2 /**< \deprecated Use #VPX_IMG_FMT_YUY2 */ ++#define IMG_FMT_YVYU VPX_IMG_FMT_YVYU /**< \deprecated Use #VPX_IMG_FMT_YVYU */ ++#define IMG_FMT_BGR24 VPX_IMG_FMT_BGR24 /**< \deprecated Use #VPX_IMG_FMT_BGR24 */ ++#define IMG_FMT_RGB32_LE VPX_IMG_FMT_RGB32_LE /**< \deprecated Use #VPX_IMG_FMT_RGB32_LE */ ++#define IMG_FMT_ARGB VPX_IMG_FMT_ARGB /**< \deprecated Use #VPX_IMG_FMT_ARGB */ ++#define IMG_FMT_ARGB_LE VPX_IMG_FMT_ARGB_LE /**< \deprecated Use #VPX_IMG_FMT_ARGB_LE */ ++#define IMG_FMT_RGB565_LE VPX_IMG_FMT_RGB565_LE /**< \deprecated Use #VPX_IMG_FMT_RGB565_LE */ ++#define IMG_FMT_RGB555_LE VPX_IMG_FMT_RGB555_LE /**< \deprecated Use #VPX_IMG_FMT_RGB555_LE */ ++#define IMG_FMT_YV12 VPX_IMG_FMT_YV12 /**< \deprecated Use #VPX_IMG_FMT_YV12 */ ++#define IMG_FMT_I420 VPX_IMG_FMT_I420 /**< \deprecated Use #VPX_IMG_FMT_I420 */ ++#define IMG_FMT_VPXYV12 VPX_IMG_FMT_VPXYV12 /**< \deprecated Use #VPX_IMG_FMT_VPXYV12 */ ++#define IMG_FMT_VPXI420 VPX_IMG_FMT_VPXI420 /**< \deprecated Use #VPX_IMG_FMT_VPXI420 */ ++#endif /* VPX_CODEC_DISABLE_COMPAT */ ++ ++ /**\brief Image Descriptor */ ++ typedef struct vpx_image ++ { ++ vpx_img_fmt_t fmt; /**< Image Format */ ++ ++ /* Image storage dimensions */ ++ unsigned int w; /**< Stored image width */ ++ unsigned int h; /**< Stored image height */ ++ ++ /* Image display dimensions */ ++ unsigned int d_w; /**< Displayed image width */ ++ unsigned int d_h; /**< Displayed image height */ ++ ++ /* Chroma subsampling info */ ++ unsigned int x_chroma_shift; /**< subsampling order, X */ ++ unsigned int y_chroma_shift; /**< subsampling order, Y */ ++ ++ /* Image data pointers. */ ++#define VPX_PLANE_PACKED 0 /**< To be used for all packed formats */ ++#define VPX_PLANE_Y 0 /**< Y (Luminance) plane */ ++#define VPX_PLANE_U 1 /**< U (Chroma) plane */ ++#define VPX_PLANE_V 2 /**< V (Chroma) plane */ ++#define VPX_PLANE_ALPHA 3 /**< A (Transparancy) plane */ ++#if !defined(VPX_CODEC_DISABLE_COMPAT) || !VPX_CODEC_DISABLE_COMPAT ++#define PLANE_PACKED VPX_PLANE_PACKED ++#define PLANE_Y VPX_PLANE_Y ++#define PLANE_U VPX_PLANE_U ++#define PLANE_V VPX_PLANE_V ++#define PLANE_ALPHA VPX_PLANE_ALPHA ++#endif ++ unsigned char *planes[4]; /**< pointer to the top left pixel for each plane */ ++ int stride[4]; /**< stride between rows for each plane */ ++ ++ int bps; /**< bits per sample (for packed formats) */ ++ ++ /* The following member may be set by the application to associate data ++ * with this image. ++ */ ++ void *user_priv; /**< may be set by the application to associate data ++ * with this image. */ ++ ++ /* The following members should be treated as private. */ ++ unsigned char *img_data; /**< private */ ++ int img_data_owner; /**< private */ ++ int self_allocd; /**< private */ ++ } vpx_image_t; /**< alias for struct vpx_image */ ++ ++ /**\brief Representation of a rectangle on a surface */ ++ typedef struct vpx_image_rect ++ { ++ unsigned int x; /**< leftmost column */ ++ unsigned int y; /**< topmost row */ ++ unsigned int w; /**< width */ ++ unsigned int h; /**< height */ ++ } vpx_image_rect_t; /**< alias for struct vpx_image_rect */ ++ ++ /*!\brief Open a descriptor, allocating storage for the underlying image ++ * ++ * Returns a descriptor for storing an image of the given format. The ++ * storage for the descriptor is allocated on the heap. ++ * ++ * \param[in] img Pointer to storage for descriptor. If this parameter ++ * is NULL, the storage for the descriptor will be ++ * allocated on the heap. ++ * \param[in] fmt Format for the image ++ * \param[in] d_w Width of the image ++ * \param[in] d_h Height of the image ++ * \param[in] align Alignment, in bytes, of each row in the image. ++ * ++ * \return Returns a pointer to the initialized image descriptor. If the img ++ * parameter is non-null, the value of the img parameter will be ++ * returned. ++ */ ++ vpx_image_t *vpx_img_alloc(vpx_image_t *img, ++ vpx_img_fmt_t fmt, ++ unsigned int d_w, ++ unsigned int d_h, ++ unsigned int align); ++ ++ /*!\brief Open a descriptor, using existing storage for the underlying image ++ * ++ * Returns a descriptor for storing an image of the given format. The ++ * storage for descriptor has been allocated elsewhere, and a descriptor is ++ * desired to "wrap" that storage. ++ * ++ * \param[in] img Pointer to storage for descriptor. If this parameter ++ * is NULL, the storage for the descriptor will be ++ * allocated on the heap. ++ * \param[in] fmt Format for the image ++ * \param[in] d_w Width of the image ++ * \param[in] d_h Height of the image ++ * \param[in] align Alignment, in bytes, of each row in the image. ++ * \param[in] img_data Storage to use for the image ++ * ++ * \return Returns a pointer to the initialized image descriptor. If the img ++ * parameter is non-null, the value of the img parameter will be ++ * returned. ++ */ ++ vpx_image_t *vpx_img_wrap(vpx_image_t *img, ++ vpx_img_fmt_t fmt, ++ unsigned int d_w, ++ unsigned int d_h, ++ unsigned int align, ++ unsigned char *img_data); ++ ++ ++ /*!\brief Set the rectangle identifying the displayed portion of the image ++ * ++ * Updates the displayed rectangle (aka viewport) on the image surface to ++ * match the specified coordinates and size. ++ * ++ * \param[in] img Image descriptor ++ * \param[in] x leftmost column ++ * \param[in] y topmost row ++ * \param[in] w width ++ * \param[in] h height ++ * ++ * \return 0 if the requested rectangle is valid, nonzero otherwise. ++ */ ++ int vpx_img_set_rect(vpx_image_t *img, ++ unsigned int x, ++ unsigned int y, ++ unsigned int w, ++ unsigned int h); ++ ++ ++ /*!\brief Flip the image vertically (top for bottom) ++ * ++ * Adjusts the image descriptor's pointers and strides to make the image ++ * be referenced upside-down. ++ * ++ * \param[in] img Image descriptor ++ */ ++ void vpx_img_flip(vpx_image_t *img); ++ ++ /*!\brief Close an image descriptor ++ * ++ * Frees all allocated storage associated with an image descriptor. ++ * ++ * \param[in] img Image descriptor ++ */ ++ void vpx_img_free(vpx_image_t *img); ++ ++#endif ++#ifdef __cplusplus ++} ++#endif +diff --git a/vpx/vpx_integer.h b/vpx/vpx_integer.h +new file mode 100644 +index 0000000..f06c641 +--- /dev/null ++++ b/vpx/vpx_integer.h +@@ -0,0 +1,57 @@ ++/* ++ * Copyright (c) 2010 The VP8 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 VPX_INTEGER_H ++#define VPX_INTEGER_H ++ ++/* get ptrdiff_t, size_t, wchar_t, NULL */ ++#include <stddef.h> ++ ++#if defined(_MSC_VER) || defined(VPX_EMULATE_INTTYPES) ++typedef signed char int8_t; ++typedef signed short int16_t; ++typedef signed int int32_t; ++ ++typedef unsigned char uint8_t; ++typedef unsigned short uint16_t; ++typedef unsigned int uint32_t; ++ ++#if defined(_MSC_VER) ++typedef signed __int64 int64_t; ++typedef unsigned __int64 uint64_t; ++#define PRId64 "I64d" ++#endif ++ ++#ifdef HAVE_ARMV6 ++typedef unsigned int int_fast16_t; ++#else ++typedef signed short int_fast16_t; ++#endif ++typedef signed char int_fast8_t; ++typedef unsigned char uint_fast8_t; ++ ++#ifndef _UINTPTR_T_DEFINED ++typedef unsigned int uintptr_t; ++#endif ++ ++#else ++ ++/* Most platforms have the C99 standard integer types. */ ++ ++#if defined(__cplusplus) && !defined(__STDC_FORMAT_MACROS) ++#define __STDC_FORMAT_MACROS ++#endif ++#include <stdint.h> ++#include <inttypes.h> ++ ++#endif ++ ++#endif +diff --git a/vpx_codec/exports b/vpx_codec/exports +deleted file mode 100644 +index f5e7473..0000000 +--- a/vpx_codec/exports ++++ /dev/null +@@ -1,17 +0,0 @@ +-text vpx_dec_control +-text vpx_dec_decode +-text vpx_dec_destroy +-text vpx_dec_err_to_string +-text vpx_dec_error +-text vpx_dec_error_detail +-text vpx_dec_get_caps +-text vpx_dec_get_frame +-text vpx_dec_get_mem_map +-text vpx_dec_get_stream_info +-text vpx_dec_iface_name +-text vpx_dec_init_ver +-text vpx_dec_peek_stream_info +-text vpx_dec_register_put_frame_cb +-text vpx_dec_register_put_slice_cb +-text vpx_dec_set_mem_map +-text vpx_dec_xma_init_ver +diff --git a/vpx_codec/internal/vpx_codec_internal.h b/vpx_codec/internal/vpx_codec_internal.h +deleted file mode 100644 +index 0867552..0000000 +--- a/vpx_codec/internal/vpx_codec_internal.h ++++ /dev/null +@@ -1,457 +0,0 @@ +-/* +- * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. +- * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. +- */ +- +- +-/*!\file decoder_impl.h +- * \brief Describes the decoder algorithm interface for algorithm +- * implementations. +- * +- * This file defines the private structures and data types that are only +- * relevant to implementing an algorithm, as opposed to using it. +- * +- * To create a decoder algorithm class, an interface structure is put +- * into the global namespace: +- * <pre> +- * my_codec.c: +- * vpx_codec_iface_t my_codec = { +- * "My Codec v1.0", +- * VPX_CODEC_ALG_ABI_VERSION, +- * ... +- * }; +- * </pre> +- * +- * An application instantiates a specific decoder instance by using +- * vpx_codec_init() and a pointer to the algorithm's interface structure: +- * <pre> +- * my_app.c: +- * extern vpx_codec_iface_t my_codec; +- * { +- * vpx_codec_ctx_t algo; +- * res = vpx_codec_init(&algo, &my_codec); +- * } +- * </pre> +- * +- * Once initialized, the instance is manged using other functions from +- * the vpx_codec_* family. +- */ +-#ifndef VPX_CODEC_INTERNAL_H +-#define VPX_CODEC_INTERNAL_H +-#include "../vpx_decoder.h" +-#include "../vpx_encoder.h" +-#include <stdarg.h> +- +- +-/*!\brief Current ABI version number +- * +- * \internal +- * If this file is altered in any way that changes the ABI, this value +- * must be bumped. Examples include, but are not limited to, changing +- * types, removing or reassigning enums, adding/removing/rearranging +- * fields to structures +- */ +-#define VPX_CODEC_INTERNAL_ABI_VERSION (2) /**<\hideinitializer*/ +- +-typedef struct vpx_codec_alg_priv vpx_codec_alg_priv_t; +- +-/*!\brief init function pointer prototype +- * +- * Performs algorithm-specific initialization of the decoder context. This +- * function is called by the generic vpx_codec_init() wrapper function, so +- * plugins implementing this interface may trust the input parameters to be +- * properly initialized. +- * +- * \param[in] ctx Pointer to this instance's context +- * \retval #VPX_CODEC_OK +- * The input stream was recognized and decoder initialized. +- * \retval #VPX_CODEC_MEM_ERROR +- * Memory operation failed. +- */ +-typedef vpx_codec_err_t (*vpx_codec_init_fn_t)(vpx_codec_ctx_t *ctx); +- +-/*!\brief destroy function pointer prototype +- * +- * Performs algorithm-specific destruction of the decoder context. This +- * function is called by the generic vpx_codec_destroy() wrapper function, +- * so plugins implementing this interface may trust the input parameters +- * to be properly initialized. +- * +- * \param[in] ctx Pointer to this instance's context +- * \retval #VPX_CODEC_OK +- * The input stream was recognized and decoder initialized. +- * \retval #VPX_CODEC_MEM_ERROR +- * Memory operation failed. +- */ +-typedef vpx_codec_err_t (*vpx_codec_destroy_fn_t)(vpx_codec_alg_priv_t *ctx); +- +-/*!\brief parse stream info function pointer prototype +- * +- * Performs high level parsing of the bitstream. This function is called by +- * the generic vpx_codec_parse_stream() wrapper function, so plugins implementing +- * this interface may trust the input parameters to be properly initialized. +- * +- * \param[in] data Pointer to a block of data to parse +- * \param[in] data_sz Size of the data buffer +- * \param[in,out] si Pointer to stream info to update. The size member +- * \ref MUST be properly initialized, but \ref MAY be +- * clobbered by the algorithm. This parameter \ref MAY +- * be NULL. +- * +- * \retval #VPX_CODEC_OK +- * Bitstream is parsable and stream information updated +- */ +-typedef vpx_codec_err_t (*vpx_codec_peek_si_fn_t)(const uint8_t *data, +- unsigned int data_sz, +- vpx_codec_stream_info_t *si); +- +-/*!\brief Return information about the current stream. +- * +- * Returns information about the stream that has been parsed during decoding. +- * +- * \param[in] ctx Pointer to this instance's context +- * \param[in,out] si Pointer to stream info to update. The size member +- * \ref MUST be properly initialized, but \ref MAY be +- * clobbered by the algorithm. This parameter \ref MAY +- * be NULL. +- * +- * \retval #VPX_CODEC_OK +- * Bitstream is parsable and stream information updated +- */ +-typedef vpx_codec_err_t (*vpx_codec_get_si_fn_t)(vpx_codec_alg_priv_t *ctx, +- vpx_codec_stream_info_t *si); +- +-/*!\brief control function pointer prototype +- * +- * This function is used to exchange algorithm specific data with the decoder +- * instance. This can be used to implement features specific to a particular +- * algorithm. +- * +- * This function is called by the generic vpx_codec_control() wrapper +- * function, so plugins implementing this interface may trust the input +- * parameters to be properly initialized. However, this interface does not +- * provide type safety for the exchanged data or assign meanings to the +- * control codes. Those details should be specified in the algorithm's +- * header file. In particular, the ctrl_id parameter is guaranteed to exist +- * in the algorithm's control mapping table, and the data paramter may be NULL. +- * +- * +- * \param[in] ctx Pointer to this instance's context +- * \param[in] ctrl_id Algorithm specific control identifier +- * \param[in,out] data Data to exchange with algorithm instance. +- * +- * \retval #VPX_CODEC_OK +- * The internal state data was deserialized. +- */ +-typedef vpx_codec_err_t (*vpx_codec_control_fn_t)(vpx_codec_alg_priv_t *ctx, +- int ctrl_id, +- va_list ap); +- +-/*!\brief control function pointer mapping +- * +- * This structure stores the mapping between control identifiers and +- * implementing functions. Each algorithm provides a list of these +- * mappings. This list is searched by the vpx_codec_control() wrapper +- * function to determine which function to invoke. The special +- * value {0, NULL} is used to indicate end-of-list, and must be +- * present. The special value {0, <non-null>} can be used as a catch-all +- * mapping. This implies that ctrl_id values chosen by the algorithm +- * \ref MUST be non-zero. +- */ +-typedef const struct +-{ +- int ctrl_id; +- vpx_codec_control_fn_t fn; +-} vpx_codec_ctrl_fn_map_t; +- +-/*!\brief decode data function pointer prototype +- * +- * Processes a buffer of coded data. If the processing results in a new +- * decoded frame becoming available, #VPX_CODEC_CB_PUT_SLICE and +- * #VPX_CODEC_CB_PUT_FRAME events are generated as appropriate. This +- * function is called by the generic vpx_codec_decode() wrapper function, +- * so plugins implementing this interface may trust the input parameters +- * to be properly initialized. +- * +- * \param[in] ctx Pointer to this instance's context +- * \param[in] data Pointer to this block of new coded data. If +- * NULL, a #VPX_CODEC_CB_PUT_FRAME event is posted +- * for the previously decoded frame. +- * \param[in] data_sz Size of the coded data, in bytes. +- * +- * \return Returns #VPX_CODEC_OK if the coded data was processed completely +- * and future pictures can be decoded without error. Otherwise, +- * see the descriptions of the other error codes in ::vpx_codec_err_t +- * for recoverability capabilities. +- */ +-typedef vpx_codec_err_t (*vpx_codec_decode_fn_t)(vpx_codec_alg_priv_t *ctx, +- const uint8_t *data, +- unsigned int data_sz, +- void *user_priv, +- long deadline); +- +-/*!\brief Decoded frames iterator +- * +- * Iterates over a list of the frames available for display. The iterator +- * storage should be initialized to NULL to start the iteration. Iteration is +- * complete when this function returns NULL. +- * +- * The list of available frames becomes valid upon completion of the +- * vpx_codec_decode call, and remains valid until the next call to vpx_codec_decode. +- * +- * \param[in] ctx Pointer to this instance's context +- * \param[in out] iter Iterator storage, initialized to NULL +- * +- * \return Returns a pointer to an image, if one is ready for display. Frames +- * produced will always be in PTS (presentation time stamp) order. +- */ +-typedef vpx_image_t*(*vpx_codec_get_frame_fn_t)(vpx_codec_alg_priv_t *ctx, +- vpx_codec_iter_t *iter); +- +- +-/*\brief e_xternal Memory Allocation memory map get iterator +- * +- * Iterates over a list of the memory maps requested by the decoder. The +- * iterator storage should be initialized to NULL to start the iteration. +- * Iteration is complete when this function returns NULL. +- * +- * \param[in out] iter Iterator storage, initialized to NULL +- * +- * \return Returns a pointer to an memory segment descriptor, or NULL to +- * indicate end-of-list. +- */ +-typedef vpx_codec_err_t (*vpx_codec_get_mmap_fn_t)(const vpx_codec_ctx_t *ctx, +- vpx_codec_mmap_t *mmap, +- vpx_codec_iter_t *iter); +- +- +-/*\brief e_xternal Memory Allocation memory map set iterator +- * +- * Sets a memory descriptor inside the decoder instance. +- * +- * \param[in] ctx Pointer to this instance's context +- * \param[in] mmap Memory map to store. +- * +- * \retval #VPX_CODEC_OK +- * The memory map was accepted and stored. +- * \retval #VPX_CODEC_MEM_ERROR +- * The memory map was rejected. +- */ +-typedef vpx_codec_err_t (*vpx_codec_set_mmap_fn_t)(vpx_codec_ctx_t *ctx, +- const vpx_codec_mmap_t *mmap); +- +- +-typedef vpx_codec_err_t (*vpx_codec_encode_fn_t)(vpx_codec_alg_priv_t *ctx, +- const vpx_image_t *img, +- vpx_codec_pts_t pts, +- unsigned long duration, +- vpx_enc_frame_flags_t flags, +- unsigned long deadline); +-typedef const vpx_codec_cx_pkt_t*(*vpx_codec_get_cx_data_fn_t)(vpx_codec_alg_priv_t *ctx, +- vpx_codec_iter_t *iter); +- +-typedef vpx_codec_err_t +-(*vpx_codec_enc_config_set_fn_t)(vpx_codec_alg_priv_t *ctx, +- const vpx_codec_enc_cfg_t *cfg); +-typedef vpx_fixed_buf_t * +-(*vpx_codec_get_global_headers_fn_t)(vpx_codec_alg_priv_t *ctx); +- +-typedef vpx_image_t * +-(*vpx_codec_get_preview_frame_fn_t)(vpx_codec_alg_priv_t *ctx); +- +-/*!\brief usage configuration mapping +- * +- * This structure stores the mapping between usage identifiers and +- * configuration structures. Each algorithm provides a list of these +- * mappings. This list is searched by the vpx_codec_enc_config_default() +- * wrapper function to determine which config to return. The special value +- * {-1, {0}} is used to indicate end-of-list, and must be present. At least +- * one mapping must be present, in addition to the end-of-list. +- * +- */ +-typedef const struct +-{ +- int usage; +- vpx_codec_enc_cfg_t cfg; +-} vpx_codec_enc_cfg_map_t; +- +-#define NOT_IMPLEMENTED 0 +- +-/*!\brief Decoder algorithm interface interface +- * +- * All decoders \ref MUST expose a variable of this type. +- */ +-struct vpx_codec_iface +-{ +- const char *name; /**< Identification String */ +- int abi_version; /**< Implemented ABI version */ +- vpx_codec_caps_t caps; /**< Decoder capabilities */ +- vpx_codec_init_fn_t init; /**< \copydoc ::vpx_codec_init_fn_t */ +- vpx_codec_destroy_fn_t destroy; /**< \copydoc ::vpx_codec_destroy_fn_t */ +- vpx_codec_ctrl_fn_map_t *ctrl_maps; /**< \copydoc ::vpx_codec_ctrl_fn_map_t */ +- vpx_codec_get_mmap_fn_t get_mmap; /**< \copydoc ::vpx_codec_get_mmap_fn_t */ +- vpx_codec_set_mmap_fn_t set_mmap; /**< \copydoc ::vpx_codec_set_mmap_fn_t */ +- struct +- { +- vpx_codec_peek_si_fn_t peek_si; /**< \copydoc ::vpx_codec_peek_si_fn_t */ +- vpx_codec_get_si_fn_t get_si; /**< \copydoc ::vpx_codec_peek_si_fn_t */ +- vpx_codec_decode_fn_t decode; /**< \copydoc ::vpx_codec_decode_fn_t */ +- vpx_codec_get_frame_fn_t get_frame; /**< \copydoc ::vpx_codec_get_frame_fn_t */ +- } dec; +- struct +- { +- vpx_codec_enc_cfg_map_t *cfg_maps; /**< \copydoc ::vpx_codec_enc_cfg_map_t */ +- vpx_codec_encode_fn_t encode; /**< \copydoc ::vpx_codec_encode_fn_t */ +- vpx_codec_get_cx_data_fn_t get_cx_data; /**< \copydoc ::vpx_codec_get_cx_data_fn_t */ +- vpx_codec_enc_config_set_fn_t cfg_set; /**< \copydoc ::vpx_codec_enc_config_set_fn_t */ +- vpx_codec_get_global_headers_fn_t get_glob_hdrs; /**< \copydoc ::vpx_codec_enc_config_set_fn_t */ +- vpx_codec_get_preview_frame_fn_t get_preview; /**< \copydoc ::vpx_codec_get_preview_frame_fn_t */ +- } enc; +-}; +- +-/*!\brief Callback function pointer / user data pair storage */ +-typedef struct +-{ +- union +- { +- vpx_codec_put_frame_cb_fn_t put_frame; +- vpx_codec_put_slice_cb_fn_t put_slice; +- }; +- void *user_priv; +-} vpx_codec_priv_cb_pair_t; +- +- +-/*!\brief Instance private storage +- * +- * This structure is allocated by the algorithm's init function. It can be +- * extended in one of two ways. First, a second, algorithm specific structure +- * can be allocated and the priv member pointed to it. Alternatively, this +- * structure can be made the first member of the algorithm specific structure, +- * and the pointer casted to the proper type. +- */ +-struct vpx_codec_priv +-{ +- unsigned int sz; +- vpx_codec_iface_t *iface; +- struct vpx_codec_alg_priv *alg_priv; +- const char *err_detail; +- unsigned int eval_counter; +- vpx_codec_flags_t init_flags; +- struct +- { +- vpx_codec_priv_cb_pair_t put_frame_cb; +- vpx_codec_priv_cb_pair_t put_slice_cb; +- } dec; +- struct +- { +- int tbd; +- struct vpx_fixed_buf cx_data_dst_buf; +- unsigned int cx_data_pad_before; +- unsigned int cx_data_pad_after; +- vpx_codec_cx_pkt_t cx_data_pkt; +- } enc; +-}; +- +-#undef VPX_CTRL_USE_TYPE +-#define VPX_CTRL_USE_TYPE(id, typ) \ +- static typ id##__value(va_list args) {return va_arg(args, typ);} \ +- static typ id##__convert(void *x)\ +- {\ +- union\ +- {\ +- void *x;\ +- typ d;\ +- } u;\ +- u.x = x;\ +- return u.d;\ +- } +- +- +-#undef VPX_CTRL_USE_TYPE_DEPRECATED +-#define VPX_CTRL_USE_TYPE_DEPRECATED(id, typ) \ +- static typ id##__value(va_list args) {return va_arg(args, typ);} \ +- static typ id##__convert(void *x)\ +- {\ +- union\ +- {\ +- void *x;\ +- typ d;\ +- } u;\ +- u.x = x;\ +- return u.d;\ +- } +- +-#define CAST(id, arg) id##__value(arg) +-#define RECAST(id, x) id##__convert(x) +- +- +-/* Internal Utility Functions +- * +- * The following functions are indended to be used inside algorithms as +- * utilities for manipulating vpx_codec_* data structures. +- */ +-struct vpx_codec_pkt_list +-{ +- unsigned int cnt; +- unsigned int max; +- struct vpx_codec_cx_pkt pkts[1]; +-}; +- +-#define vpx_codec_pkt_list_decl(n)\ +- union {struct vpx_codec_pkt_list head;\ +- struct {struct vpx_codec_pkt_list head;\ +- struct vpx_codec_cx_pkt pkts[n];} alloc;} +- +-#define vpx_codec_pkt_list_init(m)\ +- (m)->alloc.head.cnt = 0,\ +- (m)->alloc.head.max = sizeof((m)->alloc.pkts) / sizeof((m)->alloc.pkts[0]) +- +-int +-vpx_codec_pkt_list_add(struct vpx_codec_pkt_list *, +- const struct vpx_codec_cx_pkt *); +- +-const vpx_codec_cx_pkt_t* +-vpx_codec_pkt_list_get(struct vpx_codec_pkt_list *list, +- vpx_codec_iter_t *iter); +- +- +-#include <stdio.h> +-#include <setjmp.h> +-struct vpx_internal_error_info +-{ +- vpx_codec_err_t error_code; +- int has_detail; +- char detail[80]; +- int setjmp; +- jmp_buf jmp; +-}; +- +-static void vpx_internal_error(struct vpx_internal_error_info *info, +- vpx_codec_err_t error, +- const char *fmt, +- ...) +-{ +- va_list ap; +- +- info->error_code = error; +- info->has_detail = 0; +- +- if (fmt) +- { +- size_t sz = sizeof(info->detail); +- +- info->has_detail = 1; +- va_start(ap, fmt); +- vsnprintf(info->detail, sz - 1, fmt, ap); +- va_end(ap); +- info->detail[sz-1] = '\0'; +- } +- +- if (info->setjmp) +- longjmp(info->jmp, info->error_code); +-} +-#endif +diff --git a/vpx_codec/src/vpx_codec.c b/vpx_codec/src/vpx_codec.c +deleted file mode 100644 +index 6366416..0000000 +--- a/vpx_codec/src/vpx_codec.c ++++ /dev/null +@@ -1,196 +0,0 @@ +-/* +- * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. +- * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. +- */ +- +- +-/*!\file vpx_decoder.c +- * \brief Provides the high level interface to wrap decoder algorithms. +- * +- */ +-#include <stdlib.h> +-#include <string.h> +-#include "vpx_codec/internal/vpx_codec_internal.h" +-#include "vpx_version.h" +- +-#define SAVE_STATUS(ctx,var) (ctx?(ctx->err = var):var) +- +-int vpx_codec_version(void) +-{ +- return VERSION_PACKED; +-} +- +- +-const char *vpx_codec_version_str(void) +-{ +- return VERSION_STRING_NOSP; +-} +- +- +-const char *vpx_codec_version_extra_str(void) +-{ +- return VERSION_EXTRA; +-} +- +- +-const char *vpx_codec_iface_name(vpx_codec_iface_t *iface) +-{ +- return iface ? iface->name : "<invalid interface>"; +-} +- +-const char *vpx_codec_err_to_string(vpx_codec_err_t err) +-{ +- switch (err) +- { +- case VPX_CODEC_OK: +- return "Success"; +- case VPX_CODEC_ERROR: +- return "Unspecified internal error"; +- case VPX_CODEC_MEM_ERROR: +- return "Memory allocation error"; +- case VPX_CODEC_ABI_MISMATCH: +- return "ABI version mismatch"; +- case VPX_CODEC_INCAPABLE: +- return "Codec does not implement requested capability"; +- case VPX_CODEC_UNSUP_BITSTREAM: +- return "Bitstream not supported by this decoder"; +- case VPX_CODEC_UNSUP_FEATURE: +- return "Bitstream required feature not supported by this decoder"; +- case VPX_CODEC_CORRUPT_FRAME: +- return "Corrupt frame detected"; +- case VPX_CODEC_INVALID_PARAM: +- return "Invalid parameter"; +- case VPX_CODEC_LIST_END: +- return "End of iterated list"; +- } +- +- return "Unrecognized error code"; +-} +- +-const char *vpx_codec_error(vpx_codec_ctx_t *ctx) +-{ +- return (ctx) ? vpx_codec_err_to_string(ctx->err) +- : vpx_codec_err_to_string(VPX_CODEC_INVALID_PARAM); +-} +- +-const char *vpx_codec_error_detail(vpx_codec_ctx_t *ctx) +-{ +- if (ctx && ctx->err) +- return ctx->priv ? ctx->priv->err_detail : ctx->err_detail; +- +- return NULL; +-} +- +- +-vpx_codec_err_t vpx_codec_dec_init_ver(vpx_codec_ctx_t *ctx, +- vpx_codec_iface_t *iface, +- vpx_codec_dec_cfg_t *cfg, +- vpx_codec_flags_t flags, +- int ver) +-{ +- vpx_codec_err_t res; +- +- if (ver != VPX_DECODER_ABI_VERSION) +- res = VPX_CODEC_ABI_MISMATCH; +- else if (!ctx || !iface) +- res = VPX_CODEC_INVALID_PARAM; +- else if (iface->abi_version != VPX_CODEC_INTERNAL_ABI_VERSION) +- res = VPX_CODEC_ABI_MISMATCH; +- else if ((flags & VPX_CODEC_USE_XMA) && !(iface->caps & VPX_CODEC_CAP_XMA)) +- res = VPX_CODEC_INCAPABLE; +- else if ((flags & VPX_CODEC_USE_POSTPROC) && !(iface->caps & VPX_CODEC_CAP_POSTPROC)) +- res = VPX_CODEC_INCAPABLE; +- else +- { +- memset(ctx, 0, sizeof(*ctx)); +- ctx->iface = iface; +- ctx->name = iface->name; +- ctx->priv = NULL; +- ctx->init_flags = flags; +- ctx->config.dec = cfg; +- res = VPX_CODEC_OK; +- +- if (!(flags & VPX_CODEC_USE_XMA)) +- { +- res = ctx->iface->init(ctx); +- +- if (res) +- { +- ctx->err_detail = ctx->priv ? ctx->priv->err_detail : NULL; +- vpx_codec_destroy(ctx); +- } +- +- if (ctx->priv) +- ctx->priv->iface = ctx->iface; +- } +- } +- +- return SAVE_STATUS(ctx, res); +-} +- +- +-vpx_codec_err_t vpx_codec_destroy(vpx_codec_ctx_t *ctx) +-{ +- vpx_codec_err_t res; +- +- if (!ctx) +- res = VPX_CODEC_INVALID_PARAM; +- else if (!ctx->iface || !ctx->priv) +- res = VPX_CODEC_ERROR; +- else +- { +- if (ctx->priv->alg_priv) +- ctx->iface->destroy(ctx->priv->alg_priv); +- +- ctx->iface = NULL; +- ctx->name = NULL; +- ctx->priv = NULL; +- res = VPX_CODEC_OK; +- } +- +- return SAVE_STATUS(ctx, res); +-} +- +- +-vpx_codec_caps_t vpx_codec_get_caps(vpx_codec_iface_t *iface) +-{ +- return (iface) ? iface->caps : 0; +-} +- +- +-vpx_codec_err_t vpx_codec_control_(vpx_codec_ctx_t *ctx, +- int ctrl_id, +- ...) +-{ +- vpx_codec_err_t res; +- +- if (!ctx || !ctrl_id) +- res = VPX_CODEC_INVALID_PARAM; +- else if (!ctx->iface || !ctx->priv || !ctx->iface->ctrl_maps) +- res = VPX_CODEC_ERROR; +- else +- { +- vpx_codec_ctrl_fn_map_t *entry; +- +- res = VPX_CODEC_ERROR; +- +- for (entry = ctx->iface->ctrl_maps; entry && entry->fn; entry++) +- { +- if (!entry->ctrl_id || entry->ctrl_id == ctrl_id) +- { +- va_list ap; +- +- va_start(ap, ctrl_id); +- res = entry->fn(ctx->priv->alg_priv, ctrl_id, ap); +- va_end(ap); +- break; +- } +- } +- } +- +- return SAVE_STATUS(ctx, res); +-} +diff --git a/vpx_codec/src/vpx_decoder.c b/vpx_codec/src/vpx_decoder.c +deleted file mode 100644 +index 7e8575f..0000000 +--- a/vpx_codec/src/vpx_decoder.c ++++ /dev/null +@@ -1,201 +0,0 @@ +-/* +- * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. +- * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. +- */ +- +- +-/*!\file vpx_decoder.c +- * \brief Provides the high level interface to wrap decoder algorithms. +- * +- */ +-#include <stdlib.h> +-#include "vpx_codec/internal/vpx_codec_internal.h" +- +-#define SAVE_STATUS(ctx,var) (ctx?(ctx->err = var):var) +- +-vpx_codec_err_t vpx_codec_peek_stream_info(vpx_codec_iface_t *iface, +- const uint8_t *data, +- unsigned int data_sz, +- vpx_codec_stream_info_t *si) +-{ +- vpx_codec_err_t res; +- +- if (!iface || !data || !data_sz || !si +- || si->sz < sizeof(vpx_codec_stream_info_t)) +- res = VPX_CODEC_INVALID_PARAM; +- else +- { +- /* Set default/unknown values */ +- si->w = 0; +- si->h = 0; +- +- res = iface->dec.peek_si(data, data_sz, si); +- } +- +- return res; +-} +- +- +-vpx_codec_err_t vpx_codec_get_stream_info(vpx_codec_ctx_t *ctx, +- vpx_codec_stream_info_t *si) +-{ +- vpx_codec_err_t res; +- +- if (!ctx || !si || si->sz < sizeof(vpx_codec_stream_info_t)) +- res = VPX_CODEC_INVALID_PARAM; +- else if (!ctx->iface || !ctx->priv) +- res = VPX_CODEC_ERROR; +- else +- { +- /* Set default/unknown values */ +- si->w = 0; +- si->h = 0; +- +- res = ctx->iface->dec.get_si(ctx->priv->alg_priv, si); +- } +- +- return SAVE_STATUS(ctx, res); +-} +- +- +-vpx_codec_err_t vpx_codec_decode(vpx_codec_ctx_t *ctx, +- const uint8_t *data, +- unsigned int data_sz, +- void *user_priv, +- long deadline) +-{ +- vpx_codec_err_t res; +- +- if (!ctx || !data || !data_sz) +- res = VPX_CODEC_INVALID_PARAM; +- else if (!ctx->iface || !ctx->priv) +- res = VPX_CODEC_ERROR; +- +-#if CONFIG_EVAL_LIMIT +- else if (ctx->priv->eval_counter >= 500) +- { +- ctx->priv->err_detail = "Evaluation limit exceeded."; +- res = VPX_CODEC_ERROR; +- } +- +-#endif +- else +- { +- res = ctx->iface->dec.decode(ctx->priv->alg_priv, data, data_sz, +- user_priv, deadline); +-#if CONFIG_EVAL_LIMIT +- ctx->priv->eval_counter++; +-#endif +- } +- +- return SAVE_STATUS(ctx, res); +-} +- +-vpx_image_t *vpx_codec_get_frame(vpx_codec_ctx_t *ctx, +- vpx_codec_iter_t *iter) +-{ +- vpx_image_t *img; +- +- if (!ctx || !iter || !ctx->iface || !ctx->priv) +- img = NULL; +- else +- img = ctx->iface->dec.get_frame(ctx->priv->alg_priv, iter); +- +- return img; +-} +- +- +-vpx_codec_err_t vpx_codec_register_put_frame_cb(vpx_codec_ctx_t *ctx, +- vpx_codec_put_frame_cb_fn_t cb, +- void *user_priv) +-{ +- vpx_codec_err_t res; +- +- if (!ctx || !cb) +- res = VPX_CODEC_INVALID_PARAM; +- else if (!ctx->iface || !ctx->priv +- || !(ctx->iface->caps & VPX_CODEC_CAP_PUT_FRAME)) +- res = VPX_CODEC_ERROR; +- else +- { +- ctx->priv->dec.put_frame_cb.put_frame = cb; +- ctx->priv->dec.put_frame_cb.user_priv = user_priv; +- res = VPX_CODEC_OK; +- } +- +- return SAVE_STATUS(ctx, res); +-} +- +- +-vpx_codec_err_t vpx_codec_register_put_slice_cb(vpx_codec_ctx_t *ctx, +- vpx_codec_put_slice_cb_fn_t cb, +- void *user_priv) +-{ +- vpx_codec_err_t res; +- +- if (!ctx || !cb) +- res = VPX_CODEC_INVALID_PARAM; +- else if (!ctx->iface || !ctx->priv +- || !(ctx->iface->caps & VPX_CODEC_CAP_PUT_FRAME)) +- res = VPX_CODEC_ERROR; +- else +- { +- ctx->priv->dec.put_slice_cb.put_slice = cb; +- ctx->priv->dec.put_slice_cb.user_priv = user_priv; +- res = VPX_CODEC_OK; +- } +- +- return SAVE_STATUS(ctx, res); +-} +- +- +-vpx_codec_err_t vpx_codec_get_mem_map(vpx_codec_ctx_t *ctx, +- vpx_codec_mmap_t *mmap, +- vpx_codec_iter_t *iter) +-{ +- vpx_codec_err_t res = VPX_CODEC_OK; +- +- if (!ctx || !mmap || !iter || !ctx->iface) +- res = VPX_CODEC_INVALID_PARAM; +- else if (!(ctx->iface->caps & VPX_CODEC_CAP_XMA)) +- res = VPX_CODEC_ERROR; +- else +- res = ctx->iface->get_mmap(ctx, mmap, iter); +- +- return SAVE_STATUS(ctx, res); +-} +- +- +-vpx_codec_err_t vpx_codec_set_mem_map(vpx_codec_ctx_t *ctx, +- vpx_codec_mmap_t *mmap, +- unsigned int num_maps) +-{ +- vpx_codec_err_t res = VPX_CODEC_MEM_ERROR; +- +- if (!ctx || !mmap || !ctx->iface) +- res = VPX_CODEC_INVALID_PARAM; +- else if (!(ctx->iface->caps & VPX_CODEC_CAP_XMA)) +- res = VPX_CODEC_ERROR; +- else +- { +- unsigned int i; +- +- for (i = 0; i < num_maps; i++, mmap++) +- { +- if (!mmap->base) +- break; +- +- /* Everything look ok, set the mmap in the decoder */ +- res = ctx->iface->set_mmap(ctx, mmap); +- +- if (res) +- break; +- } +- } +- +- return SAVE_STATUS(ctx, res); +-} +diff --git a/vpx_codec/src/vpx_decoder_compat.c b/vpx_codec/src/vpx_decoder_compat.c +deleted file mode 100644 +index d5b04ae..0000000 +--- a/vpx_codec/src/vpx_decoder_compat.c ++++ /dev/null +@@ -1,200 +0,0 @@ +-/* +- * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. +- * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. +- */ +- +- +-/*!\file vpx_decoder.c +- * \brief Provides the high level interface to wrap decoder algorithms. +- * +- */ +-#include <stdlib.h> +-#include <string.h> +-#include "vpx_codec/vpx_decoder.h" +-#include "vpx_codec/internal/vpx_codec_internal.h" +- +-#define SAVE_STATUS(ctx,var) (ctx?(ctx->err = var):var) +- +-const char *vpx_dec_iface_name(vpx_dec_iface_t *iface) +-{ +- return vpx_codec_iface_name((vpx_codec_iface_t *)iface); +-} +- +-const char *vpx_dec_err_to_string(vpx_dec_err_t err) +-{ +- return vpx_codec_err_to_string(err); +-} +- +-const char *vpx_dec_error(vpx_dec_ctx_t *ctx) +-{ +- return vpx_codec_error((vpx_codec_ctx_t *)ctx); +-} +- +-const char *vpx_dec_error_detail(vpx_dec_ctx_t *ctx) +-{ +- return vpx_codec_error_detail((vpx_codec_ctx_t *)ctx); +-} +- +- +-vpx_dec_err_t vpx_dec_init_ver(vpx_dec_ctx_t *ctx, +- vpx_dec_iface_t *iface, +- int ver) +-{ +- return vpx_codec_dec_init_ver((vpx_codec_ctx_t *)ctx, +- (vpx_codec_iface_t *)iface, +- NULL, +- 0, +- ver); +-} +- +- +-vpx_dec_err_t vpx_dec_destroy(vpx_dec_ctx_t *ctx) +-{ +- return vpx_codec_destroy((vpx_codec_ctx_t *)ctx); +-} +- +- +-vpx_dec_caps_t vpx_dec_get_caps(vpx_dec_iface_t *iface) +-{ +- return vpx_codec_get_caps((vpx_codec_iface_t *)iface); +-} +- +- +-vpx_dec_err_t vpx_dec_peek_stream_info(vpx_dec_iface_t *iface, +- const uint8_t *data, +- unsigned int data_sz, +- vpx_dec_stream_info_t *si) +-{ +- return vpx_codec_peek_stream_info((vpx_codec_iface_t *)iface, data, data_sz, +- (vpx_codec_stream_info_t *)si); +-} +- +- +-vpx_dec_err_t vpx_dec_get_stream_info(vpx_dec_ctx_t *ctx, +- vpx_dec_stream_info_t *si) +-{ +- return vpx_codec_get_stream_info((vpx_codec_ctx_t *)ctx, +- (vpx_codec_stream_info_t *)si); +-} +- +- +-vpx_dec_err_t vpx_dec_control(vpx_dec_ctx_t *ctx, +- int ctrl_id, +- void *data) +-{ +- return vpx_codec_control_((vpx_codec_ctx_t *)ctx, ctrl_id, data); +-} +- +- +-vpx_dec_err_t vpx_dec_decode(vpx_dec_ctx_t *ctx, +- uint8_t *data, +- unsigned int data_sz, +- void *user_priv, +- int rel_pts) +-{ +- (void)rel_pts; +- return vpx_codec_decode((vpx_codec_ctx_t *)ctx, data, data_sz, user_priv, +- 0); +-} +- +-vpx_image_t *vpx_dec_get_frame(vpx_dec_ctx_t *ctx, +- vpx_dec_iter_t *iter) +-{ +- return vpx_codec_get_frame((vpx_codec_ctx_t *)ctx, iter); +-} +- +- +-vpx_dec_err_t vpx_dec_register_put_frame_cb(vpx_dec_ctx_t *ctx, +- vpx_dec_put_frame_cb_fn_t cb, +- void *user_priv) +-{ +- return vpx_codec_register_put_frame_cb((vpx_codec_ctx_t *)ctx, cb, +- user_priv); +-} +- +- +-vpx_dec_err_t vpx_dec_register_put_slice_cb(vpx_dec_ctx_t *ctx, +- vpx_dec_put_slice_cb_fn_t cb, +- void *user_priv) +-{ +- return vpx_codec_register_put_slice_cb((vpx_codec_ctx_t *)ctx, cb, +- user_priv); +-} +- +- +-vpx_dec_err_t vpx_dec_xma_init_ver(vpx_dec_ctx_t *ctx, +- vpx_dec_iface_t *iface, +- int ver) +-{ +- return vpx_codec_dec_init_ver((vpx_codec_ctx_t *)ctx, +- (vpx_codec_iface_t *)iface, +- NULL, +- VPX_CODEC_USE_XMA, +- ver); +-} +- +-vpx_dec_err_t vpx_dec_get_mem_map(vpx_dec_ctx_t *ctx_, +- vpx_dec_mmap_t *mmap, +- const vpx_dec_stream_info_t *si, +- vpx_dec_iter_t *iter) +-{ +- vpx_codec_ctx_t *ctx = (vpx_codec_ctx_t *)ctx_; +- vpx_dec_err_t res = VPX_DEC_OK; +- +- if (!ctx || !mmap || !si || !iter || !ctx->iface) +- res = VPX_DEC_INVALID_PARAM; +- else if (!(ctx->iface->caps & VPX_DEC_CAP_XMA)) +- res = VPX_DEC_ERROR; +- else +- { +- if (!ctx->config.dec) +- { +- ctx->config.dec = malloc(sizeof(vpx_codec_dec_cfg_t)); +- ctx->config.dec->w = si->w; +- ctx->config.dec->h = si->h; +- } +- +- res = ctx->iface->get_mmap(ctx, mmap, iter); +- } +- +- return SAVE_STATUS(ctx, res); +-} +- +- +-vpx_dec_err_t vpx_dec_set_mem_map(vpx_dec_ctx_t *ctx_, +- vpx_dec_mmap_t *mmap, +- unsigned int num_maps) +-{ +- vpx_codec_ctx_t *ctx = (vpx_codec_ctx_t *)ctx_; +- vpx_dec_err_t res = VPX_DEC_MEM_ERROR; +- +- if (!ctx || !mmap || !ctx->iface) +- res = VPX_DEC_INVALID_PARAM; +- else if (!(ctx->iface->caps & VPX_DEC_CAP_XMA)) +- res = VPX_DEC_ERROR; +- else +- { +- void *save = (ctx->priv) ? NULL : ctx->config.dec; +- unsigned int i; +- +- for (i = 0; i < num_maps; i++, mmap++) +- { +- if (!mmap->base) +- break; +- +- /* Everything look ok, set the mmap in the decoder */ +- res = ctx->iface->set_mmap(ctx, mmap); +- +- if (res) +- break; +- } +- +- if (save) free(save); +- } +- +- return SAVE_STATUS(ctx, res); +-} +diff --git a/vpx_codec/src/vpx_encoder.c b/vpx_codec/src/vpx_encoder.c +deleted file mode 100644 +index 98ad8ba..0000000 +--- a/vpx_codec/src/vpx_encoder.c ++++ /dev/null +@@ -1,324 +0,0 @@ +-/* +- * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. +- * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. +- */ +- +- +-/*!\file vpx_encoder.c +- * \brief Provides the high level interface to wrap encoder algorithms. +- * +- */ +-#include <limits.h> +-#include <string.h> +-#include "vpx_codec/internal/vpx_codec_internal.h" +- +-#define SAVE_STATUS(ctx,var) (ctx?(ctx->err = var):var) +- +-vpx_codec_err_t vpx_codec_enc_init_ver(vpx_codec_ctx_t *ctx, +- vpx_codec_iface_t *iface, +- vpx_codec_enc_cfg_t *cfg, +- vpx_codec_flags_t flags, +- int ver) +-{ +- vpx_codec_err_t res; +- +- if (ver != VPX_ENCODER_ABI_VERSION) +- res = VPX_CODEC_ABI_MISMATCH; +- else if (!ctx || !iface || !cfg) +- res = VPX_CODEC_INVALID_PARAM; +- else if (iface->abi_version != VPX_CODEC_INTERNAL_ABI_VERSION) +- res = VPX_CODEC_ABI_MISMATCH; +- else if (!(iface->caps & VPX_CODEC_CAP_ENCODER)) +- res = VPX_CODEC_INCAPABLE; +- else if ((flags & VPX_CODEC_USE_XMA) && !(iface->caps & VPX_CODEC_CAP_XMA)) +- res = VPX_CODEC_INCAPABLE; +- else if ((flags & VPX_CODEC_USE_PSNR) +- && !(iface->caps & VPX_CODEC_CAP_PSNR)) +- res = VPX_CODEC_INCAPABLE; +- else +- { +- ctx->iface = iface; +- ctx->name = iface->name; +- ctx->priv = NULL; +- ctx->init_flags = flags; +- ctx->config.enc = cfg; +- res = ctx->iface->init(ctx); +- +- if (res) +- { +- ctx->err_detail = ctx->priv ? ctx->priv->err_detail : NULL; +- vpx_codec_destroy(ctx); +- } +- +- if (ctx->priv) +- ctx->priv->iface = ctx->iface; +- } +- +- return SAVE_STATUS(ctx, res); +-} +- +- +- +-vpx_codec_err_t vpx_codec_enc_config_default(vpx_codec_iface_t *iface, +- vpx_codec_enc_cfg_t *cfg, +- unsigned int usage) +-{ +- vpx_codec_err_t res; +- vpx_codec_enc_cfg_map_t *map; +- +- if (!iface || !cfg || usage > INT_MAX) +- res = VPX_CODEC_INVALID_PARAM; +- else if (!(iface->caps & VPX_CODEC_CAP_ENCODER)) +- res = VPX_CODEC_INCAPABLE; +- else +- { +- res = VPX_CODEC_INVALID_PARAM; +- +- for (map = iface->enc.cfg_maps; map->usage >= 0; map++) +- { +- if (map->usage == (int)usage) +- { +- *cfg = map->cfg; +- cfg->g_usage = usage; +- res = VPX_CODEC_OK; +- break; +- } +- } +- } +- +- return res; +-} +- +- +-#if ARCH_X86 || ARCH_X86_64 +-/* On X86, disable the x87 unit's internal 80 bit precision for better +- * consistency with the SSE unit's 64 bit precision. +- */ +-#include "vpx_ports/x86.h" +-#define FLOATING_POINT_INIT() do {\ +- unsigned short x87_orig_mode = x87_set_double_precision(); +-#define FLOATING_POINT_RESTORE() \ +- x87_set_control_word(x87_orig_mode); }while(0) +- +- +-#else +-static void FLOATING_POINT_INIT() {} +-static void FLOATING_POINT_RESTORE() {} +-#endif +- +- +-vpx_codec_err_t vpx_codec_encode(vpx_codec_ctx_t *ctx, +- const vpx_image_t *img, +- vpx_codec_pts_t pts, +- unsigned long duration, +- vpx_enc_frame_flags_t flags, +- unsigned long deadline) +-{ +- vpx_codec_err_t res; +- +- if (!ctx || (img && !duration)) +- res = VPX_CODEC_INVALID_PARAM; +- else if (!ctx->iface || !ctx->priv) +- res = VPX_CODEC_ERROR; +- else if (!(ctx->iface->caps & VPX_CODEC_CAP_ENCODER)) +- res = VPX_CODEC_INCAPABLE; +- +-#if CONFIG_EVAL_LIMIT +- else if (ctx->priv->eval_counter >= 500) +- { +- ctx->priv->err_detail = "Evaluation limit exceeded."; +- res = VPX_CODEC_ERROR; +- } +- +-#endif +- else +- { +- /* Execute in a normalized floating point environment, if the platform +- * requires it. +- */ +- FLOATING_POINT_INIT(); +- res = ctx->iface->enc.encode(ctx->priv->alg_priv, img, pts, +- duration, flags, deadline); +- FLOATING_POINT_RESTORE(); +- +-#if CONFIG_EVAL_LIMIT +- ctx->priv->eval_counter++; +-#endif +- } +- +- return SAVE_STATUS(ctx, res); +-} +- +- +-const vpx_codec_cx_pkt_t *vpx_codec_get_cx_data(vpx_codec_ctx_t *ctx, +- vpx_codec_iter_t *iter) +-{ +- const vpx_codec_cx_pkt_t *pkt = NULL; +- +- if (ctx) +- { +- if (!iter) +- ctx->err = VPX_CODEC_INVALID_PARAM; +- else if (!ctx->iface || !ctx->priv) +- ctx->err = VPX_CODEC_ERROR; +- else if (!(ctx->iface->caps & VPX_CODEC_CAP_ENCODER)) +- ctx->err = VPX_CODEC_INCAPABLE; +- else +- pkt = ctx->iface->enc.get_cx_data(ctx->priv->alg_priv, iter); +- } +- +- if (pkt && pkt->kind == VPX_CODEC_CX_FRAME_PKT) +- { +- /* If the application has specified a destination area for the +- * compressed data, and the codec has not placed the data there, +- * and it fits, copy it. +- */ +- char *dst_buf = ctx->priv->enc.cx_data_dst_buf.buf; +- +- if (dst_buf +- && pkt->data.raw.buf != dst_buf +- && pkt->data.raw.sz +- + ctx->priv->enc.cx_data_pad_before +- + ctx->priv->enc.cx_data_pad_after +- <= ctx->priv->enc.cx_data_dst_buf.sz) +- { +- vpx_codec_cx_pkt_t *modified_pkt = &ctx->priv->enc.cx_data_pkt; +- +- memcpy(dst_buf + ctx->priv->enc.cx_data_pad_before, +- pkt->data.raw.buf, pkt->data.raw.sz); +- *modified_pkt = *pkt; +- modified_pkt->data.raw.buf = dst_buf; +- modified_pkt->data.raw.sz += ctx->priv->enc.cx_data_pad_before +- + ctx->priv->enc.cx_data_pad_after; +- pkt = modified_pkt; +- } +- +- if (dst_buf == pkt->data.raw.buf) +- { +- ctx->priv->enc.cx_data_dst_buf.buf = dst_buf + pkt->data.raw.sz; +- ctx->priv->enc.cx_data_dst_buf.sz -= pkt->data.raw.sz; +- } +- } +- +- return pkt; +-} +- +- +-vpx_codec_err_t vpx_codec_set_cx_data_buf(vpx_codec_ctx_t *ctx, +- const vpx_fixed_buf_t *buf, +- unsigned int pad_before, +- unsigned int pad_after) +-{ +- if (!ctx || !ctx->priv) +- return VPX_CODEC_INVALID_PARAM; +- +- if (buf) +- { +- ctx->priv->enc.cx_data_dst_buf = *buf; +- ctx->priv->enc.cx_data_pad_before = pad_before; +- ctx->priv->enc.cx_data_pad_after = pad_after; +- } +- else +- { +- ctx->priv->enc.cx_data_dst_buf.buf = NULL; +- ctx->priv->enc.cx_data_dst_buf.sz = 0; +- ctx->priv->enc.cx_data_pad_before = 0; +- ctx->priv->enc.cx_data_pad_after = 0; +- } +- +- return VPX_CODEC_OK; +-} +- +- +-const vpx_image_t *vpx_codec_get_preview_frame(vpx_codec_ctx_t *ctx) +-{ +- vpx_image_t *img = NULL; +- +- if (ctx) +- { +- if (!ctx->iface || !ctx->priv) +- ctx->err = VPX_CODEC_ERROR; +- else if (!(ctx->iface->caps & VPX_CODEC_CAP_ENCODER)) +- ctx->err = VPX_CODEC_INCAPABLE; +- else if (!ctx->iface->enc.get_preview) +- ctx->err = VPX_CODEC_INCAPABLE; +- else +- img = ctx->iface->enc.get_preview(ctx->priv->alg_priv); +- } +- +- return img; +-} +- +- +-vpx_fixed_buf_t *vpx_codec_get_global_headers(vpx_codec_ctx_t *ctx) +-{ +- vpx_fixed_buf_t *buf = NULL; +- +- if (ctx) +- { +- if (!ctx->iface || !ctx->priv) +- ctx->err = VPX_CODEC_ERROR; +- else if (!(ctx->iface->caps & VPX_CODEC_CAP_ENCODER)) +- ctx->err = VPX_CODEC_INCAPABLE; +- else if (!ctx->iface->enc.get_glob_hdrs) +- ctx->err = VPX_CODEC_INCAPABLE; +- else +- buf = ctx->iface->enc.get_glob_hdrs(ctx->priv->alg_priv); +- } +- +- return buf; +-} +- +- +-vpx_codec_err_t vpx_codec_enc_config_set(vpx_codec_ctx_t *ctx, +- const vpx_codec_enc_cfg_t *cfg) +-{ +- vpx_codec_err_t res; +- +- if (!ctx || !ctx->iface || !ctx->priv || !cfg) +- res = VPX_CODEC_INVALID_PARAM; +- else if (!(ctx->iface->caps & VPX_CODEC_CAP_ENCODER)) +- res = VPX_CODEC_INCAPABLE; +- else +- res = ctx->iface->enc.cfg_set(ctx->priv->alg_priv, cfg); +- +- return SAVE_STATUS(ctx, res); +-} +- +- +-int vpx_codec_pkt_list_add(struct vpx_codec_pkt_list *list, +- const struct vpx_codec_cx_pkt *pkt) +-{ +- if (list->cnt < list->max) +- { +- list->pkts[list->cnt++] = *pkt; +- return 0; +- } +- +- return 1; +-} +- +- +-const vpx_codec_cx_pkt_t *vpx_codec_pkt_list_get(struct vpx_codec_pkt_list *list, +- vpx_codec_iter_t *iter) +-{ +- const vpx_codec_cx_pkt_t *pkt; +- +- if (!(*iter)) +- { +- *iter = list->pkts; +- } +- +- pkt = (const void *) * iter; +- +- if (pkt - list->pkts < list->cnt) +- *iter = pkt + 1; +- else +- pkt = NULL; +- +- return pkt; +-} +diff --git a/vpx_codec/src/vpx_image.c b/vpx_codec/src/vpx_image.c +deleted file mode 100644 +index 8a16e58..0000000 +--- a/vpx_codec/src/vpx_image.c ++++ /dev/null +@@ -1,261 +0,0 @@ +-/* +- * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. +- * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. +- */ +- +- +-#include <stdlib.h> +-#include <string.h> +-#include "vpx_codec/vpx_image.h" +- +-static vpx_image_t *img_alloc_helper(vpx_image_t *img, +- img_fmt_t fmt, +- unsigned int d_w, +- unsigned int d_h, +- unsigned int stride_align, +- unsigned char *img_data) +-{ +- +- unsigned int h, w, s, xcs, ycs, bps; +- int align; +- +- /* Treat align==0 like align==1 */ +- if (!stride_align) +- stride_align = 1; +- +- /* Validate alignment (must be power of 2) */ +- if (stride_align & (stride_align - 1)) +- goto fail; +- +- /* Get sample size for this format */ +- switch (fmt) +- { +- case IMG_FMT_RGB32: +- case IMG_FMT_RGB32_LE: +- case IMG_FMT_ARGB: +- case IMG_FMT_ARGB_LE: +- bps = 32; +- break; +- case IMG_FMT_RGB24: +- case IMG_FMT_BGR24: +- bps = 24; +- break; +- case IMG_FMT_RGB565: +- case IMG_FMT_RGB565_LE: +- case IMG_FMT_RGB555: +- case IMG_FMT_RGB555_LE: +- case IMG_FMT_UYVY: +- case IMG_FMT_YUY2: +- case IMG_FMT_YVYU: +- bps = 16; +- break; +- case IMG_FMT_I420: +- case IMG_FMT_YV12: +- case IMG_FMT_VPXI420: +- case IMG_FMT_VPXYV12: +- bps = 12; +- break; +- default: +- bps = 16; +- break; +- } +- +- /* Get chroma shift values for this format */ +- switch (fmt) +- { +- case IMG_FMT_I420: +- case IMG_FMT_YV12: +- case IMG_FMT_VPXI420: +- case IMG_FMT_VPXYV12: +- xcs = 1; +- break; +- default: +- xcs = 0; +- break; +- } +- +- switch (fmt) +- { +- case IMG_FMT_I420: +- case IMG_FMT_YV12: +- case IMG_FMT_VPXI420: +- case IMG_FMT_VPXYV12: +- ycs = 1; +- break; +- default: +- ycs = 0; +- break; +- } +- +- /* Calculate storage sizes given the chroma subsampling */ +- align = (1 << xcs) - 1; +- w = (d_w + align) & ~align; +- align = (1 << ycs) - 1; +- h = (d_h + align) & ~align; +- s = (fmt & IMG_FMT_PLANAR) ? w : bps * w / 8; +- s = (s + stride_align - 1) & ~(stride_align - 1); +- +- /* Allocate the new image */ +- if (!img) +- { +- img = (vpx_image_t *)calloc(1, sizeof(vpx_image_t)); +- +- if (!img) +- goto fail; +- +- img->self_allocd = 1; +- } +- else +- { +- memset(img, 0, sizeof(vpx_image_t)); +- } +- +- img->img_data = img_data; +- +- if (!img_data) +- { +- img->img_data = malloc((fmt & IMG_FMT_PLANAR) ? h * w * bps / 8 : h * s); +- img->img_data_owner = 1; +- } +- +- if (!img->img_data) +- goto fail; +- +- img->fmt = fmt; +- img->w = w; +- img->h = h; +- img->x_chroma_shift = xcs; +- img->y_chroma_shift = ycs; +- img->bps = bps; +- +- /* Calculate strides */ +- img->stride[PLANE_Y] = img->stride[PLANE_ALPHA] = s; +- img->stride[PLANE_U] = img->stride[PLANE_V] = s >> xcs; +- +- /* Default viewport to entire image */ +- if (!vpx_img_set_rect(img, 0, 0, d_w, d_h)) +- return img; +- +-fail: +- vpx_img_free(img); +- return NULL; +-} +- +-vpx_image_t *vpx_img_alloc(vpx_image_t *img, +- img_fmt_t fmt, +- unsigned int d_w, +- unsigned int d_h, +- unsigned int stride_align) +-{ +- return img_alloc_helper(img, fmt, d_w, d_h, stride_align, NULL); +-} +- +-vpx_image_t *vpx_img_wrap(vpx_image_t *img, +- img_fmt_t fmt, +- unsigned int d_w, +- unsigned int d_h, +- unsigned int stride_align, +- unsigned char *img_data) +-{ +- return img_alloc_helper(img, fmt, d_w, d_h, stride_align, img_data); +-} +- +-int vpx_img_set_rect(vpx_image_t *img, +- unsigned int x, +- unsigned int y, +- unsigned int w, +- unsigned int h) +-{ +- unsigned char *data; +- +- if (x + w <= img->w && y + h <= img->h) +- { +- img->d_w = w; +- img->d_h = h; +- +- /* Calculate plane pointers */ +- if (!(img->fmt & IMG_FMT_PLANAR)) +- { +- img->planes[PLANE_PACKED] = +- img->img_data + x * img->bps / 8 + y * img->stride[PLANE_PACKED]; +- } +- else +- { +- data = img->img_data; +- +- if (img->fmt & IMG_FMT_HAS_ALPHA) +- { +- img->planes[PLANE_ALPHA] = +- data + x + y * img->stride[PLANE_ALPHA]; +- data += img->h * img->stride[PLANE_ALPHA]; +- } +- +- img->planes[PLANE_Y] = data + x + y * img->stride[PLANE_Y]; +- data += img->h * img->stride[PLANE_Y]; +- +- if (!(img->fmt & IMG_FMT_UV_FLIP)) +- { +- img->planes[PLANE_U] = data +- + (x >> img->x_chroma_shift) +- + (y >> img->y_chroma_shift) * img->stride[PLANE_U]; +- data += (img->h >> img->y_chroma_shift) * img->stride[PLANE_U]; +- img->planes[PLANE_V] = data +- + (x >> img->x_chroma_shift) +- + (y >> img->y_chroma_shift) * img->stride[PLANE_V]; +- } +- else +- { +- img->planes[PLANE_V] = data +- + (x >> img->x_chroma_shift) +- + (y >> img->y_chroma_shift) * img->stride[PLANE_V]; +- data += (img->h >> img->y_chroma_shift) * img->stride[PLANE_V]; +- img->planes[PLANE_U] = data +- + (x >> img->x_chroma_shift) +- + (y >> img->y_chroma_shift) * img->stride[PLANE_U]; +- } +- } +- +- return 0; +- } +- +- return -1; +-} +- +-void vpx_img_flip(vpx_image_t *img) +-{ +- /* Note: In the calculation pointer adjustment calculation, we want the +- * rhs to be promoted to a signed type. Section 6.3.1.8 of the ISO C99 +- * standard indicates that if the adjustment parameter is unsigned, the +- * stride parameter will be promoted to unsigned, causing errors when +- * the lhs is a larger type than the rhs. +- */ +- img->planes[PLANE_Y] += (signed)(img->d_h - 1) * img->stride[PLANE_Y]; +- img->stride[PLANE_Y] = -img->stride[PLANE_Y]; +- +- img->planes[PLANE_U] += (signed)((img->d_h >> img->y_chroma_shift) - 1) +- * img->stride[PLANE_U]; +- img->stride[PLANE_U] = -img->stride[PLANE_U]; +- +- img->planes[PLANE_V] += (signed)((img->d_h >> img->y_chroma_shift) - 1) +- * img->stride[PLANE_V]; +- img->stride[PLANE_V] = -img->stride[PLANE_V]; +- +- img->planes[PLANE_ALPHA] += (signed)(img->d_h - 1) * img->stride[PLANE_ALPHA]; +- img->stride[PLANE_ALPHA] = -img->stride[PLANE_ALPHA]; +-} +- +-void vpx_img_free(vpx_image_t *img) +-{ +- if (img) +- { +- if (img->img_data && img->img_data_owner) +- free(img->img_data); +- +- if (img->self_allocd) +- free(img); +- } +-} +diff --git a/vpx_codec/vpx_codec.h b/vpx_codec/vpx_codec.h +deleted file mode 100644 +index e2a79f9..0000000 +--- a/vpx_codec/vpx_codec.h ++++ /dev/null +@@ -1,560 +0,0 @@ +-/* +- * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. +- * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. +- */ +- +- +-/*!\defgroup codec Common Algorithm Interface +- * This abstraction allows applications to easily support multiple video +- * formats with minimal code duplication. This section describes the interface +- * common to all codecs (both encoders and decoders). +- * @{ +- */ +- +-/*!\file vpx_codec.h +- * \brief Describes the codec algorithm interface to applications. +- * +- * This file describes the interface between an application and a +- * video codec algorithm. +- * +- * An application instantiates a specific codec instance by using +- * vpx_codec_init() and a pointer to the algorithm's interface structure: +- * <pre> +- * my_app.c: +- * extern vpx_codec_iface_t my_codec; +- * { +- * vpx_codec_ctx_t algo; +- * res = vpx_codec_init(&algo, &my_codec); +- * } +- * </pre> +- * +- * Once initialized, the instance is manged using other functions from +- * the vpx_codec_* family. +- */ +-#ifdef __cplusplus +-extern "C" { +-#endif +- +-#ifndef VPX_CODEC_H +-#define VPX_CODEC_H +-#ifdef HAVE_CONFIG_H +-# include "vpx_config.h" +-#endif +-#if defined(HAVE_VPX_PORTS) && HAVE_VPX_PORTS +-# include "vpx_ports/vpx_integer.h" +-#else +-# include "vpx_integer.h" +-#endif +-#include "vpx_image.h" +- +- /*!\brief Decorator indicating a function is deprecated */ +-#ifndef DEPRECATED +-#if defined(__GNUC__) && __GNUC__ +-#define DEPRECATED __attribute__ ((deprecated)) +-#define DECLSPEC_DEPRECATED /**< \copydoc #DEPRECATED */ +-#elif defined(_MSC_VER) +-#define DEPRECATED +-#define DECLSPEC_DEPRECATED __declspec(deprecated) /**< \copydoc #DEPRECATED */ +-#else +-#define DEPRECATED +-#define DECLSPEC_DEPRECATED /**< \copydoc #DEPRECATED */ +-#endif +-#endif +- +- /*!\brief Decorator indicating a function is potentially unused */ +-#ifdef UNUSED +-#elif __GNUC__ +-#define UNUSED __attribute__ ((unused)); +-#else +-#define UNUSED +-#endif +- +- /*!\brief Current ABI version number +- * +- * \internal +- * If this file is altered in any way that changes the ABI, this value +- * must be bumped. Examples include, but are not limited to, changing +- * types, removing or reassigning enums, adding/removing/rearranging +- * fields to structures +- */ +-#define VPX_CODEC_ABI_VERSION (2 + VPX_IMAGE_ABI_VERSION) /**<\hideinitializer*/ +- +- /*!\brief Algorithm return codes */ +- typedef enum { +- /*!\brief Operation completed without error */ +- VPX_CODEC_OK, +- +- /*!\brief Unspecified error */ +- VPX_CODEC_ERROR, +- +- /*!\brief Memory operation failed */ +- VPX_CODEC_MEM_ERROR, +- +- /*!\brief ABI version mismatch */ +- VPX_CODEC_ABI_MISMATCH, +- +- /*!\brief Algorithm does not have required capability */ +- VPX_CODEC_INCAPABLE, +- +- /*!\brief The given bitstream is not supported. +- * +- * The bitstream was unable to be parsed at the highest level. The decoder +- * is unable to proceed. This error \ref SHOULD be treated as fatal to the +- * stream. */ +- VPX_CODEC_UNSUP_BITSTREAM, +- +- /*!\brief Encoded bitstream uses an unsupported feature +- * +- * The decoder does not implement a feature required by the encoder. This +- * return code should only be used for features that prevent future +- * pictures from being properly decoded. This error \ref MAY be treated as +- * fatal to the stream or \ref MAY be treated as fatal to the current GOP. +- */ +- VPX_CODEC_UNSUP_FEATURE, +- +- /*!\brief The coded data for this stream is corrupt or incomplete +- * +- * There was a problem decoding the current frame. This return code +- * should only be used for failures that prevent future pictures from +- * being properly decoded. This error \ref MAY be treated as fatal to the +- * stream or \ref MAY be treated as fatal to the current GOP. If decoding +- * is continued for the current GOP, artifacts may be present. +- */ +- VPX_CODEC_CORRUPT_FRAME, +- +- /*!\brief An application-supplied parameter is not valid. +- * +- */ +- VPX_CODEC_INVALID_PARAM, +- +- /*!\brief An iterator reached the end of list. +- * +- */ +- VPX_CODEC_LIST_END, +- +- } +- vpx_codec_err_t; +- +- +- /*! \brief Codec capabilities bitfield +- * +- * Each codec advertises the capabilities it supports as part of its +- * ::vpx_codec_iface_t interface structure. Capabilities are extra interfaces +- * or functionality, and are not required to be supported. +- * +- * The available flags are specified by VPX_CODEC_CAP_* defines. +- */ +- typedef long vpx_codec_caps_t; +-#define VPX_CODEC_CAP_DECODER 0x1 /**< Is a decoder */ +-#define VPX_CODEC_CAP_ENCODER 0x2 /**< Is an encoder */ +-#define VPX_CODEC_CAP_XMA 0x4 /**< Supports e_xternal Memory Allocation */ +- +- +- /*! \brief Initialization-time Feature Enabling +- * +- * Certain codec features must be known at initialization time, to allow for +- * proper memory allocation. +- * +- * The available flags are specified by VPX_CODEC_USE_* defines. +- */ +- typedef long vpx_codec_flags_t; +-#define VPX_CODEC_USE_XMA 0x00000001 /**< Use e_xternal Memory Allocation mode */ +- +- +- /*!\brief Codec interface structure. +- * +- * Contains function pointers and other data private to the codec +- * implementation. This structure is opaque to the application. +- */ +- typedef const struct vpx_codec_iface vpx_codec_iface_t; +- +- +- /*!\brief Codec private data structure. +- * +- * Contains data private to the codec implementation. This structure is opaque +- * to the application. +- */ +- typedef struct vpx_codec_priv vpx_codec_priv_t; +- +- +- /*!\brief Iterator +- * +- * Opaque storage used for iterating over lists. +- */ +- typedef const void *vpx_codec_iter_t; +- +- +- /*!\brief Codec context structure +- * +- * All codecs \ref MUST support this context structure fully. In general, +- * this data should be considered private to the codec algorithm, and +- * not be manipulated or examined by the calling application. Applications +- * may reference the 'name' member to get a printable description of the +- * algorithm. +- */ +- typedef struct +- { +- const char *name; /**< Printable interface name */ +- vpx_codec_iface_t *iface; /**< Interface pointers */ +- vpx_codec_err_t err; /**< Last returned error */ +- const char *err_detail; /**< Detailed info, if available */ +- vpx_codec_flags_t init_flags; /**< Flags passed at init time */ +- union +- { +- struct vpx_codec_dec_cfg *dec; /**< Decoder Configuration Pointer */ +- struct vpx_codec_enc_cfg *enc; /**< Encoder Configuration Pointer */ +- void *raw; +- } config; /**< Configuration pointer aliasing union */ +- vpx_codec_priv_t *priv; /**< Algorithm private storage */ +- } vpx_codec_ctx_t; +- +- +- /* +- * Library Version Number Interface +- * +- * For example, see the following sample return values: +- * vpx_codec_version() (1<<16 | 2<<8 | 3) +- * vpx_codec_version_str() "v1.2.3-rc1-16-gec6a1ba" +- * vpx_codec_version_extra_str() "rc1-16-gec6a1ba" +- */ +- +- /*!\brief Return the version information (as an integer) +- * +- * Returns a packed encoding of the library version number. This will only include +- * the major.minor.patch component of the version number. Note that this encoded +- * value should be accessed through the macros provided, as the encoding may change +- * in the future. +- * +- */ +- int vpx_codec_version(void); +-#define VPX_VERSION_MAJOR(v) ((v>>16)&0xff) /**< extract major from packed version */ +-#define VPX_VERSION_MINOR(v) ((v>>8)&0xff) /**< extract minor from packed version */ +-#define VPX_VERSION_PATCH(v) ((v>>0)&0xff) /**< extract patch from packed version */ +- +- /*!\brief Return the version major number */ +-#define vpx_codec_version_major() ((vpx_codec_version()>>16)&0xff) +- +- /*!\brief Return the version minr number */ +-#define vpx_codec_version_minor() ((vpx_codec_version()>>8)&0xff) +- +- /*!\brief Return the version patch number */ +-#define vpx_codec_version_patch() ((vpx_codec_version()>>0)&0xff) +- +- +- /*!\brief Return the version information (as a string) +- * +- * Returns a printable string containing the full library version number. This may +- * contain additional text following the three digit version number, as to indicate +- * release candidates, prerelease versions, etc. +- * +- */ +- const char *vpx_codec_version_str(void); +- +- +- /*!\brief Return the version information (as a string) +- * +- * Returns a printable "extra string". This is the component of the string returned +- * by vpx_codec_version_str() following the three digit version number. +- * +- */ +- const char *vpx_codec_version_extra_str(void); +- +- +- /*!\brief Return the build configuration +- * +- * Returns a printable string containing an encoded version of the build +- * configuration. This may be useful to vpx support. +- * +- */ +- const char *vpx_codec_build_config(void); +- +- +- /*!\brief Return the name for a given interface +- * +- * Returns a human readable string for name of the given codec interface. +- * +- * \param[in] iface Interface pointer +- * +- */ +- const char *vpx_codec_iface_name(vpx_codec_iface_t *iface); +- +- +- /*!\brief Convert error number to printable string +- * +- * Returns a human readable string for the last error returned by the +- * algorithm. The returned error will be one line and will not contain +- * any newline characters. +- * +- * +- * \param[in] err Error number. +- * +- */ +- const char *vpx_codec_err_to_string(vpx_codec_err_t err); +- +- +- /*!\brief Retrieve error synopsis for codec context +- * +- * Returns a human readable string for the last error returned by the +- * algorithm. The returned error will be one line and will not contain +- * any newline characters. +- * +- * +- * \param[in] ctx Pointer to this instance's context. +- * +- */ +- const char *vpx_codec_error(vpx_codec_ctx_t *ctx); +- +- +- /*!\brief Retrieve detailed error information for codec context +- * +- * Returns a human readable string providing detailed information about +- * the last error. +- * +- * \param[in] ctx Pointer to this instance's context. +- * +- * \retval NULL +- * No detailed information is available. +- */ +- const char *vpx_codec_error_detail(vpx_codec_ctx_t *ctx); +- +- +- /* REQUIRED FUNCTIONS +- * +- * The following functions are required to be implemented for all codecs. +- * They represent the base case functionality expected of all codecs. +- */ +- +- /*!\brief Destroy a codec instance +- * +- * Destroys a codec context, freeing any associated memory buffers. +- * +- * \param[in] ctx Pointer to this instance's context +- * +- * \retval #VPX_CODEC_OK +- * The codec algorithm initialized. +- * \retval #VPX_CODEC_MEM_ERROR +- * Memory allocation failed. +- */ +- vpx_codec_err_t vpx_codec_destroy(vpx_codec_ctx_t *ctx); +- +- +- /*!\brief Get the capabilities of an algorithm. +- * +- * Retrieves the capabliities bitfield from the algorithm's interface. +- * +- * \param[in] iface Pointer to the alogrithm interface +- * +- */ +- vpx_codec_caps_t vpx_codec_get_caps(vpx_codec_iface_t *iface); +- +- +- /*!\brief Control algorithm +- * +- * This function is used to exchange algorithm specific data with the codec +- * instance. This can be used to implement features specific to a particular +- * algorithm. +- * +- * This wrapper function dispatches the request to the helper function +- * associated with the given ctrl_id. It tries to call this function +- * transparantly, but will return #VPX_CODEC_ERROR if the request could not +- * be dispatched. +- * +- * Note that this function should not be used directly. Call the +- * #vpx_codec_control wrapper macro instead. +- * +- * \param[in] ctx Pointer to this instance's context +- * \param[in] ctrl_id Algorithm specific control identifier +- * +- * \retval #VPX_CODEC_OK +- * The control request was processed. +- * \retval #VPX_CODEC_ERROR +- * The control request was not processed. +- * \retval #VPX_CODEC_INVALID_PARAM +- * The data was not valid. +- */ +- vpx_codec_err_t vpx_codec_control_(vpx_codec_ctx_t *ctx, +- int ctrl_id, +- ...); +-#if defined(VPX_DISABLE_CTRL_TYPECHECKS) && VPX_DISABLE_CTRL_TYPECHECKS +-# define vpx_codec_control(ctx,id,data) vpx_codec_control_(ctx,id,data) +-# define VPX_CTRL_USE_TYPE(id, typ) +-# define VPX_CTRL_USE_TYPE_DEPRECATED(id, typ) +-# define VPX_CTRL_VOID(id, typ) +- +-#else +- /*!\brief vpx_codec_control wrapper macro +- * +- * This macro allows for type safe conversions across the variadic parameter +- * to vpx_codec_control_(). +- * +- * \internal +- * It works by dispatching the call to the control function through a wrapper +- * function named with the id parameter. +- */ +-# define vpx_codec_control(ctx,id,data) vpx_codec_control_##id(ctx,id,data)\ +- /**<\hideinitializer*/ +- +- +- /*!\brief vpx_codec_control type definition macro +- * +- * This macro allows for type safe conversions across the variadic parameter +- * to vpx_codec_control_(). It defines the type of the argument for a given +- * control identifier. +- * +- * \internal +- * It defines a static function with +- * the correctly typed arguments as a wrapper to the type-unsafe internal +- * function. +- */ +-# define VPX_CTRL_USE_TYPE(id, typ) \ +- static vpx_codec_err_t \ +- vpx_codec_control_##id(vpx_codec_ctx_t*, int, typ) UNUSED;\ +- \ +- static vpx_codec_err_t \ +- vpx_codec_control_##id(vpx_codec_ctx_t *ctx, int ctrl_id, typ data) {\ +- return vpx_codec_control_(ctx, ctrl_id, data);\ +- } /**<\hideinitializer*/ +- +- +- /*!\brief vpx_codec_control deprecated type definition macro +- * +- * Like #VPX_CTRL_USE_TYPE, but indicates that the specified control is +- * deprecated and should not be used. Consult the documentation for your +- * codec for more information. +- * +- * \internal +- * It defines a static function with the correctly typed arguments as a +- * wrapper to the type-unsafe internal function. +- */ +-# define VPX_CTRL_USE_TYPE_DEPRECATED(id, typ) \ +- DECLSPEC_DEPRECATED static vpx_codec_err_t \ +- vpx_codec_control_##id(vpx_codec_ctx_t*, int, typ) DEPRECATED UNUSED;\ +- \ +- DECLSPEC_DEPRECATED static vpx_codec_err_t \ +- vpx_codec_control_##id(vpx_codec_ctx_t *ctx, int ctrl_id, typ data) {\ +- return vpx_codec_control_(ctx, ctrl_id, data);\ +- } /**<\hideinitializer*/ +- +- +- /*!\brief vpx_codec_control void type definition macro +- * +- * This macro allows for type safe conversions across the variadic parameter +- * to vpx_codec_control_(). It indicates that a given control identifier takes +- * no argument. +- * +- * \internal +- * It defines a static function without a data argument as a wrapper to the +- * type-unsafe internal function. +- */ +-# define VPX_CTRL_VOID(id) \ +- static vpx_codec_err_t \ +- vpx_codec_control_##id(vpx_codec_ctx_t*, int) UNUSED;\ +- \ +- static vpx_codec_err_t \ +- vpx_codec_control_##id(vpx_codec_ctx_t *ctx, int ctrl_id) {\ +- return vpx_codec_control_(ctx, ctrl_id);\ +- } /**<\hideinitializer*/ +- +- +-#endif +- +- +- /*!\defgroup cap_xma External Memory Allocation Functions +- * +- * The following functions are required to be implemented for all codecs +- * that advertise the VPX_CODEC_CAP_XMA capability. Calling these functions +- * for codecs that don't advertise this capability will result in an error +- * code being returned, usually VPX_CODEC_INCAPABLE +- * @{ +- */ +- +- +- /*!\brief Memory Map Entry +- * +- * This structure is used to contain the properties of a memory segment. It +- * is populated by the codec in the request phase, and by the calling +- * application once the requested allocation has been performed. +- */ +- typedef struct vpx_codec_mmap +- { +- /* +- * The following members are set by the codec when requesting a segment +- */ +- unsigned int id; /**< identifier for the segment's contents */ +- unsigned long sz; /**< size of the segment, in bytes */ +- unsigned int align; /**< required alignment of the segment, in bytes */ +- unsigned int flags; /**< bitfield containing segment properties */ +-#define VPX_CODEC_MEM_ZERO 0x1 /**< Segment must be zeroed by allocation */ +-#define VPX_CODEC_MEM_WRONLY 0x2 /**< Segment need not be readable */ +-#define VPX_CODEC_MEM_FAST 0x4 /**< Place in fast memory, if available */ +- +- /* The following members are to be filled in by the allocation function */ +- void *base; /**< pointer to the allocated segment */ +- void (*dtor)(struct vpx_codec_mmap *map); /**< destructor to call */ +- void *priv; /**< allocator private storage */ +- } vpx_codec_mmap_t; /**< alias for struct vpx_codec_mmap */ +- +- +- /*!\brief Iterate over the list of segments to allocate. +- * +- * Iterates over a list of the segments to allocate. The iterator storage +- * should be initialized to NULL to start the iteration. Iteration is complete +- * when this function returns VPX_CODEC_LIST_END. The amount of memory needed to +- * allocate is dependant upon the size of the encoded stream. In cases where the +- * stream is not available at allocation time, a fixed size must be requested. +- * The codec will not be able to operate on streams larger than the size used at +- * allocation time. +- * +- * \param[in] ctx Pointer to this instance's context. +- * \param[out] mmap Pointer to the memory map entry to populate. +- * \param[in,out] iter Iterator storage, initialized to NULL +- * +- * \retval #VPX_CODEC_OK +- * The memory map entry was populated. +- * \retval #VPX_CODEC_ERROR +- * Codec does not support XMA mode. +- * \retval #VPX_CODEC_MEM_ERROR +- * Unable to determine segment size from stream info. +- */ +- vpx_codec_err_t vpx_codec_get_mem_map(vpx_codec_ctx_t *ctx, +- vpx_codec_mmap_t *mmap, +- vpx_codec_iter_t *iter); +- +- +- /*!\brief Identify allocated segments to codec instance +- * +- * Stores a list of allocated segments in the codec. Segments \ref MUST be +- * passed in the order they are read from vpx_codec_get_mem_map(), but may be +- * passed in groups of any size. Segments \ref MUST be set only once. The +- * allocation function \ref MUST ensure that the vpx_codec_mmap_t::base member +- * is non-NULL. If the segment requires cleanup handling (eg, calling free() +- * or close()) then the vpx_codec_mmap_t::dtor member \ref MUST be populated. +- * +- * \param[in] ctx Pointer to this instance's context. +- * \param[in] mmaps Pointer to the first memory map entry in the list. +- * \param[in] num_maps Number of entries being set at this time +- * +- * \retval #VPX_CODEC_OK +- * The segment was stored in the codec context. +- * \retval #VPX_CODEC_INCAPABLE +- * Codec does not support XMA mode. +- * \retval #VPX_CODEC_MEM_ERROR +- * Segment base address was not set, or segment was already stored. +- +- */ +- vpx_codec_err_t vpx_codec_set_mem_map(vpx_codec_ctx_t *ctx, +- vpx_codec_mmap_t *mmaps, +- unsigned int num_maps); +- +- /*!@} - end defgroup cap_xma*/ +- /*!@} - end defgroup codec*/ +- +- +-#endif +-#ifdef __cplusplus +-} +-#endif +diff --git a/vpx_codec/vpx_codec.mk b/vpx_codec/vpx_codec.mk +deleted file mode 100644 +index 75fbeea..0000000 +--- a/vpx_codec/vpx_codec.mk ++++ /dev/null +@@ -1,26 +0,0 @@ +-## +-## Copyright (c) 2010 The VP8 project authors. All Rights Reserved. +-## +-## Use of this source code is governed by a BSD-style license and patent +-## grant that can be found in the LICENSE file in the root of the source +-## tree. All contributing project authors may be found in the AUTHORS +-## file in the root of the source tree. +-## +- +- +-API_EXPORTS += exports +- +-API_SRCS-yes += internal/vpx_codec_internal.h +-API_SRCS-yes += vpx_codec.h +-API_SRCS-yes += vpx_codec.mk +-API_SRCS-yes += vpx_codec_impl_top.h +-API_SRCS-yes += vpx_codec_impl_bottom.h +-API_SRCS-yes += vpx_decoder.h +-API_SRCS-yes += vpx_decoder_compat.h +-API_SRCS-yes += vpx_encoder.h +-API_SRCS-yes += vpx_image.h +-API_SRCS-yes += src/vpx_codec.c +-API_SRCS-yes += src/vpx_decoder.c +-API_SRCS-yes += src/vpx_decoder_compat.c +-API_SRCS-yes += src/vpx_image.c +-API_SRCS-yes += src/vpx_encoder.c +diff --git a/vpx_codec/vpx_codec_impl_bottom.h b/vpx_codec/vpx_codec_impl_bottom.h +deleted file mode 100644 +index c52654c..0000000 +--- a/vpx_codec/vpx_codec_impl_bottom.h ++++ /dev/null +@@ -1,18 +0,0 @@ +-/* +- * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. +- * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. +- */ +- +- +-/* +- * This file is to be included at the bottom of the header files defining the +- * interface to individual codecs and contains matching blocks to those defined +- * in vpx_codec_impl_top.h +- */ +-#ifdef __cplusplus +-} +-#endif +diff --git a/vpx_codec/vpx_codec_impl_top.h b/vpx_codec/vpx_codec_impl_top.h +deleted file mode 100644 +index f73809a..0000000 +--- a/vpx_codec/vpx_codec_impl_top.h ++++ /dev/null +@@ -1,18 +0,0 @@ +-/* +- * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. +- * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. +- */ +- +- +-/* +- * This file is to be included at the top of the header files defining the +- * interface to individual codecs and contains various workarounds common +- * to all codec implementations. +- */ +-#ifdef __cplusplus +-extern "C" { +-#endif +diff --git a/vpx_codec/vpx_decoder.h b/vpx_codec/vpx_decoder.h +deleted file mode 100644 +index 5e4968d..0000000 +--- a/vpx_codec/vpx_decoder.h ++++ /dev/null +@@ -1,316 +0,0 @@ +-/* +- * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. +- * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. +- */ +- +- +-/*!\defgroup decoder Decoder Algorithm Interface +- * \ingroup codec +- * This abstraction allows applications using this decoder to easily support +- * multiple video formats with minimal code duplication. This section describes +- * the interface common to all decoders. +- * @{ +- */ +- +-/*!\file vpx_decoder.h +- * \brief Describes the decoder algorithm interface to applications. +- * +- * This file describes the interface between an application and a +- * video decoder algorithm. +- * +- */ +-#ifdef __cplusplus +-extern "C" { +-#endif +- +-#ifndef VPX_DECODER_H +-#define VPX_DECODER_H +-#include "vpx_codec.h" +- +- /*!\brief Current ABI version number +- * +- * \internal +- * If this file is altered in any way that changes the ABI, this value +- * must be bumped. Examples include, but are not limited to, changing +- * types, removing or reassigning enums, adding/removing/rearranging +- * fields to structures +- */ +-#define VPX_DECODER_ABI_VERSION (2 + VPX_CODEC_ABI_VERSION) /**<\hideinitializer*/ +- +- /*! \brief Decoder capabilities bitfield +- * +- * Each decoder advertises the capabilities it supports as part of its +- * ::vpx_codec_iface_t interface structure. Capabilities are extra interfaces +- * or functionality, and are not required to be supported by a decoder. +- * +- * The available flags are specifiedby VPX_CODEC_CAP_* defines. +- */ +-#define VPX_CODEC_CAP_PUT_SLICE 0x10000 /**< Will issue put_slice callbacks */ +-#define VPX_CODEC_CAP_PUT_FRAME 0x20000 /**< Will issue put_frame callbacks */ +-#define VPX_CODEC_CAP_POSTPROC 0x40000 /**< Can postprocess decoded frame */ +- +- /*! \brief Initialization-time Feature Enabling +- * +- * Certain codec features must be known at initialization time, to allow for +- * proper memory allocation. +- * +- * The available flags are specified by VPX_CODEC_USE_* defines. +- */ +-#define VPX_CODEC_USE_POSTPROC 0x10000 /**< Postprocess decoded frame */ +- +- /*!\brief Stream properties +- * +- * This structure is used to query or set properties of the decoded +- * stream. Algorithms may extend this structure with data specific +- * to their bitstream by setting the sz member appropriately. +- */ +- typedef struct +- { +- unsigned int sz; /**< Size of this structure */ +- unsigned int w; /**< Width (or 0 for unknown/default) */ +- unsigned int h; /**< Height (or 0 for unknown/default) */ +- unsigned int is_kf; /**< Current frame is a keyframe */ +- } vpx_codec_stream_info_t; +- +- /* REQUIRED FUNCTIONS +- * +- * The following functions are required to be implemented for all decoders. +- * They represent the base case functionality expected of all decoders. +- */ +- +- +- /*!\brief Initialization Configurations +- * +- * This structure is used to pass init time configuration options to the +- * decoder. +- */ +- typedef struct vpx_codec_dec_cfg +- { +- unsigned int threads; /**< Maximum number of threads to use, default 1 */ +- unsigned int w; /**< Width */ +- unsigned int h; /**< Height */ +- } vpx_codec_dec_cfg_t; /**< alias for struct vpx_codec_dec_cfg */ +- +- +- /*!\brief Initialize a decoder instance +- * +- * Initializes a decoder context using the given interface. Applications +- * should call the vpx_codec_dec_init convenience macro instead of this +- * function directly, to ensure that the ABI version number parameter +- * is properly initialized. +- * +- * In XMA mode (activated by setting VPX_CODEC_USE_XMA in the flags +- * parameter), the storage pointed to by the cfg parameter must be +- * kept readable and stable until all memory maps have been set. +- * +- * \param[in] ctx Pointer to this instance's context. +- * \param[in] iface Pointer to the alogrithm interface to use. +- * \param[in] cfg Configuration to use, if known. May be NULL. +- * \param[in] flags Bitfield of VPX_CODEC_USE_* flags +- * \param[in] ver ABI version number. Must be set to +- * VPX_DECODER_ABI_VERSION +- * \retval #VPX_CODEC_OK +- * The decoder algorithm initialized. +- * \retval #VPX_CODEC_MEM_ERROR +- * Memory allocation failed. +- */ +- vpx_codec_err_t vpx_codec_dec_init_ver(vpx_codec_ctx_t *ctx, +- vpx_codec_iface_t *iface, +- vpx_codec_dec_cfg_t *cfg, +- vpx_codec_flags_t flags, +- int ver); +- +- /*!\brief Convenience macro for vpx_codec_dec_init_ver() +- * +- * Ensures the ABI version parameter is properly set. +- */ +-#define vpx_codec_dec_init(ctx, iface, cfg, flags) \ +- vpx_codec_dec_init_ver(ctx, iface, cfg, flags, VPX_DECODER_ABI_VERSION) +- +- +- /*!\brief Parse stream info from a buffer +- * +- * Performs high level parsing of the bitstream. Construction of a decoder +- * context is not necessary. Can be used to determine if the bitstream is +- * of the proper format, and to extract information from the stream. +- * +- * \param[in] iface Pointer to the alogrithm interface +- * \param[in] data Pointer to a block of data to parse +- * \param[in] data_sz Size of the data buffer +- * \param[in,out] si Pointer to stream info to update. The size member +- * \ref MUST be properly initialized, but \ref MAY be +- * clobbered by the algorithm. This parameter \ref MAY +- * be NULL. +- * +- * \retval #VPX_CODEC_OK +- * Bitstream is parsable and stream information updated +- */ +- vpx_codec_err_t vpx_codec_peek_stream_info(vpx_codec_iface_t *iface, +- const uint8_t *data, +- unsigned int data_sz, +- vpx_codec_stream_info_t *si); +- +- +- /*!\brief Return information about the current stream. +- * +- * Returns information about the stream that has been parsed during decoding. +- * +- * \param[in] ctx Pointer to this instance's context +- * \param[in,out] si Pointer to stream info to update. The size member +- * \ref MUST be properly initialized, but \ref MAY be +- * clobbered by the algorithm. This parameter \ref MAY +- * be NULL. +- * +- * \retval #VPX_CODEC_OK +- * Bitstream is parsable and stream information updated +- */ +- vpx_codec_err_t vpx_codec_get_stream_info(vpx_codec_ctx_t *ctx, +- vpx_codec_stream_info_t *si); +- +- +- /*!\brief Decode data +- * +- * Processes a buffer of coded data. If the processing results in a new +- * decoded frame becoming available, PUT_SLICE and PUT_FRAME events may be +- * generated, as appropriate. Encoded data \ref MUST be passed in DTS (decode +- * time stamp) order. Frames produced will always be in PTS (presentation +- * time stamp) order. +- * +- * \param[in] ctx Pointer to this instance's context +- * \param[in] data Pointer to this block of new coded data. If +- * NULL, a VPX_CODEC_CB_PUT_FRAME event is posted +- * for the previously decoded frame. +- * \param[in] data_sz Size of the coded data, in bytes. +- * \param[in] user_priv Application specific data to associate with +- * this frame. +- * \param[in] deadline Soft deadline the decoder should attempt to meet, +- * in us. Set to zero for unlimited. +- * +- * \return Returns #VPX_CODEC_OK if the coded data was processed completely +- * and future pictures can be decoded without error. Otherwise, +- * see the descriptions of the other error codes in ::vpx_codec_err_t +- * for recoverability capabilities. +- */ +- vpx_codec_err_t vpx_codec_decode(vpx_codec_ctx_t *ctx, +- const uint8_t *data, +- unsigned int data_sz, +- void *user_priv, +- long deadline); +- +- +- /*!\brief Decoded frames iterator +- * +- * Iterates over a list of the frames available for display. The iterator +- * storage should be initialized to NULL to start the iteration. Iteration is +- * complete when this function returns NULL. +- * +- * The list of available frames becomes valid upon completion of the +- * vpx_codec_decode call, and remains valid until the next call to vpx_codec_decode. +- * +- * \param[in] ctx Pointer to this instance's context +- * \param[in,out] iter Iterator storage, initialized to NULL +- * +- * \return Returns a pointer to an image, if one is ready for display. Frames +- * produced will always be in PTS (presentation time stamp) order. +- */ +- vpx_image_t *vpx_codec_get_frame(vpx_codec_ctx_t *ctx, +- vpx_codec_iter_t *iter); +- +- +- /*!\defgroup cap_put_frame Frame-Based Decoding Functions +- * +- * The following functions are required to be implemented for all decoders +- * that advertise the VPX_CODEC_CAP_PUT_FRAME capability. Calling these functions +- * for codecs that don't advertise this capability will result in an error +- * code being returned, usually VPX_CODEC_ERROR +- * @{ +- */ +- +- /*!\brief put frame callback prototype +- * +- * This callback is invoked by the decoder to notify the application of +- * the availability of decoded image data. +- */ +- typedef void (*vpx_codec_put_frame_cb_fn_t)(void *user_priv, +- const vpx_image_t *img); +- +- +- /*!\brief Register for notification of frame completion. +- * +- * Registers a given function to be called when a decoded frame is +- * available. +- * +- * \param[in] ctx Pointer to this instance's context +- * \param[in] cb Pointer to the callback function +- * \param[in] user_priv User's private data +- * +- * \retval #VPX_CODEC_OK +- * Callback successfully registered. +- * \retval #VPX_CODEC_ERROR +- * Decoder context not initialized, or algorithm not capable of +- * posting slice completion. +- */ +- vpx_codec_err_t vpx_codec_register_put_frame_cb(vpx_codec_ctx_t *ctx, +- vpx_codec_put_frame_cb_fn_t cb, +- void *user_priv); +- +- +- /*!@} - end defgroup cap_put_frame */ +- +- /*!\defgroup cap_put_slice Slice-Based Decoding Functions +- * +- * The following functions are required to be implemented for all decoders +- * that advertise the VPX_CODEC_CAP_PUT_SLICE capability. Calling these functions +- * for codecs that don't advertise this capability will result in an error +- * code being returned, usually VPX_CODEC_ERROR +- * @{ +- */ +- +- /*!\brief put slice callback prototype +- * +- * This callback is invoked by the decoder to notify the application of +- * the availability of partially decoded image data. The +- */ +- typedef void (*vpx_codec_put_slice_cb_fn_t)(void *user_priv, +- const vpx_image_t *img, +- const vpx_image_rect_t *valid, +- const vpx_image_rect_t *update); +- +- +- /*!\brief Register for notification of slice completion. +- * +- * Registers a given function to be called when a decoded slice is +- * available. +- * +- * \param[in] ctx Pointer to this instance's context +- * \param[in] cb Pointer to the callback function +- * \param[in] user_priv User's private data +- * +- * \retval #VPX_CODEC_OK +- * Callback successfully registered. +- * \retval #VPX_CODEC_ERROR +- * Decoder context not initialized, or algorithm not capable of +- * posting slice completion. +- */ +- vpx_codec_err_t vpx_codec_register_put_slice_cb(vpx_codec_ctx_t *ctx, +- vpx_codec_put_slice_cb_fn_t cb, +- void *user_priv); +- +- +- /*!@} - end defgroup cap_put_slice*/ +- +- /*!@} - end defgroup decoder*/ +- +-#endif +- +-#ifdef __cplusplus +-} +-#endif +- +-#if !defined(VPX_CODEC_DISABLE_COMPAT) || !VPX_CODEC_DISABLE_COMPAT +-#include "vpx_decoder_compat.h" +-#endif +diff --git a/vpx_codec/vpx_decoder_compat.h b/vpx_codec/vpx_decoder_compat.h +deleted file mode 100644 +index 25bb5eb..0000000 +--- a/vpx_codec/vpx_decoder_compat.h ++++ /dev/null +@@ -1,586 +0,0 @@ +-/* +- * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. +- * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. +- */ +- +- +-/*!\defgroup decoder Common Decoder Algorithm Interface +- * This abstraction allows applications using this decoder to easily support +- * multiple video formats with minimal code duplication. This section describes +- * the interface common to all codecs. +- * @{ +- */ +- +-/*!\file vpx_decoder_compat.h +- * \brief Provides a compatibility layer between version 1 and 2 of this API. +- * +- * This interface has been deprecated. Only existing code should make use +- * of this interface, and therefore, it is only thinly documented. Existing +- * code should be ported to the vpx_codec_* API. +- */ +-#ifdef __cplusplus +-extern "C" { +-#endif +- +-#ifndef VPX_DECODER_COMPAT_H +-#define VPX_DECODER_COMPAT_H +- +- /*!\brief Decoder algorithm return codes */ +- typedef enum { +- /*!\brief Operation completed without error */ +- VPX_DEC_OK = VPX_CODEC_OK, +- +- /*!\brief Unspecified error */ +- VPX_DEC_ERROR = VPX_CODEC_ERROR, +- +- /*!\brief Memory operation failed */ +- VPX_DEC_MEM_ERROR = VPX_CODEC_MEM_ERROR, +- +- /*!\brief ABI version mismatch */ +- VPX_DEC_ABI_MISMATCH = VPX_CODEC_ABI_MISMATCH, +- +- /*!\brief The given bitstream is not supported. +- * +- * The bitstream was unable to be parsed at the highest level. The decoder +- * is unable to proceed. This error \ref SHOULD be treated as fatal to the +- * stream. */ +- VPX_DEC_UNSUP_BITSTREAM = VPX_CODEC_UNSUP_BITSTREAM, +- +- /*!\brief Encoded bitstream uses an unsupported feature +- * +- * The decoder does not implement a feature required by the encoder. This +- * return code should only be used for features that prevent future +- * pictures from being properly decoded. This error \ref MAY be treated as +- * fatal to the stream or \ref MAY be treated as fatal to the current GOP. +- */ +- VPX_DEC_UNSUP_FEATURE = VPX_CODEC_UNSUP_FEATURE, +- +- /*!\brief The coded data for this stream is corrupt or incomplete +- * +- * There was a problem decoding the current frame. This return code +- * should only be used for failures that prevent future pictures from +- * being properly decoded. This error \ref MAY be treated as fatal to the +- * stream or \ref MAY be treated as fatal to the current GOP. If decoding +- * is continued for the current GOP, artifacts may be present. +- */ +- VPX_DEC_CORRUPT_FRAME = VPX_CODEC_CORRUPT_FRAME, +- +- /*!\brief An application-supplied parameter is not valid. +- * +- */ +- VPX_DEC_INVALID_PARAM = VPX_CODEC_INVALID_PARAM, +- +- /*!\brief An iterator reached the end of list. +- * +- */ +- VPX_DEC_LIST_END = VPX_CODEC_LIST_END, +- +- } +- vpx_dec_err_t; +- +- /*! \brief Decoder capabilities bitfield +- * +- * Each decoder advertises the capabilities it supports as part of its +- * ::vpx_dec_iface_t interface structure. Capabilities are extra interfaces +- * or functionality, and are not required to be supported by a decoder. +- * +- * The available flags are specifiedby VPX_DEC_CAP_* defines. +- */ +- typedef int vpx_dec_caps_t; +-#define VPX_DEC_CAP_PUT_SLICE 0x0001 /**< Will issue put_slice callbacks */ +-#define VPX_DEC_CAP_PUT_FRAME 0x0002 /**< Will issue put_frame callbacks */ +-#define VPX_DEC_CAP_XMA 0x0004 /**< Supports e_xternal Memory Allocation */ +- +- /*!\brief Stream properties +- * +- * This structure is used to query or set properties of the decoded +- * stream. Algorithms may extend this structure with data specific +- * to their bitstream by setting the sz member appropriately. +- */ +-#if 1 +- typedef vpx_codec_stream_info_t vpx_dec_stream_info_t; +-#else +- typedef struct +- { +- unsigned int sz; /**< Size of this structure */ +- unsigned int w; /**< Width (or 0 for unknown/default) */ +- unsigned int h; /**< Height (or 0 for unknown/default) */ +- unsigned int is_kf; /**< Current frame is a keyframe */ +- } vpx_dec_stream_info_t; +-#endif +- +- +- /*!\brief Decoder interface structure. +- * +- * Contains function pointers and other data private to the decoder +- * implementation. This structure is opaque to the application. +- */ +- typedef const struct vpx_codec_iface vpx_dec_iface_t; +- typedef struct vpx_codec_priv vpx_dec_priv_t; +- +- /*!\brief Iterator +- * +- * Opaque storage used for iterating over lists. +- */ +- typedef vpx_codec_iter_t vpx_dec_iter_t; +- +- /*!\brief Decoder context structure +- * +- * All decoders \ref MUST support this context structure fully. In general, +- * this data should be considered private to the decoder algorithm, and +- * not be manipulated or examined by the calling application. Applications +- * may reference the 'name' member to get a printable description of the +- * algorithm. +- */ +-#if 1 +- typedef vpx_codec_ctx_t vpx_dec_ctx_t; +-#else +- typedef struct +- { +- const char *name; /**< Printable interface name */ +- vpx_dec_iface_t *iface; /**< Interface pointers */ +- vpx_dec_err_t err; /**< Last returned error */ +- vpx_dec_priv_t *priv; /**< Algorithm private storage */ +- } vpx_dec_ctx_t; +-#endif +- +- +- /*!\brief Return the build configuration +- * +- * Returns a printable string containing an encoded version of the build +- * configuration. This may be useful to vpx support. +- * +- */ +- const char *vpx_dec_build_config(void) DEPRECATED; +- +- /*!\brief Return the name for a given interface +- * +- * Returns a human readable string for name of the given decoder interface. +- * +- * \param[in] iface Interface pointer +- * +- */ +- const char *vpx_dec_iface_name(vpx_dec_iface_t *iface) DEPRECATED; +- +- +- /*!\brief Convert error number to printable string +- * +- * Returns a human readable string for the last error returned by the +- * algorithm. The returned error will be one line and will not contain +- * any newline characters. +- * +- * +- * \param[in] err Error number. +- * +- */ +- const char *vpx_dec_err_to_string(vpx_dec_err_t err) DEPRECATED; +- +- +- /*!\brief Retrieve error synopsis for decoder context +- * +- * Returns a human readable string for the last error returned by the +- * algorithm. The returned error will be one line and will not contain +- * any newline characters. +- * +- * +- * \param[in] ctx Pointer to this instance's context. +- * +- */ +- const char *vpx_dec_error(vpx_dec_ctx_t *ctx) DEPRECATED; +- +- +- /*!\brief Retrieve detailed error information for decoder context +- * +- * Returns a human readable string providing detailed information about +- * the last error. +- * +- * \param[in] ctx Pointer to this instance's context. +- * +- * \retval NULL +- * No detailed information is available. +- */ +- const char *vpx_dec_error_detail(vpx_dec_ctx_t *ctx) DEPRECATED; +- +- +- /* REQUIRED FUNCTIONS +- * +- * The following functions are required to be implemented for all decoders. +- * They represent the base case functionality expected of all decoders. +- */ +- +- +- /*!\brief Initialize a decoder instance +- * +- * Initializes a decoder context using the given interface. Applications +- * should call the vpx_dec_init convenience macro instead of this +- * function directly, to ensure that the ABI version number parameter +- * is properly initialized. +- * +- * \param[in] ctx Pointer to this instance's context. +- * \param[in] iface Pointer to the alogrithm interface to use. +- * \param[in] ver ABI version number. Must be set to +- * VPX_DECODER_ABI_VERSION +- * \retval #VPX_DEC_OK +- * The decoder algorithm initialized. +- * \retval #VPX_DEC_MEM_ERROR +- * Memory allocation failed. +- */ +- vpx_dec_err_t vpx_dec_init_ver(vpx_dec_ctx_t *ctx, +- vpx_dec_iface_t *iface, +- int ver) DEPRECATED; +-#define vpx_dec_init(ctx, iface) \ +- vpx_dec_init_ver(ctx, iface, VPX_DECODER_ABI_VERSION) +- +- +- /*!\brief Destroy a decoder instance +- * +- * Destroys a decoder context, freeing any associated memory buffers. +- * +- * \param[in] ctx Pointer to this instance's context +- * +- * \retval #VPX_DEC_OK +- * The decoder algorithm initialized. +- * \retval #VPX_DEC_MEM_ERROR +- * Memory allocation failed. +- */ +- vpx_dec_err_t vpx_dec_destroy(vpx_dec_ctx_t *ctx) DEPRECATED; +- +- +- /*!\brief Get the capabilities of an algorithm. +- * +- * Retrieves the capabliities bitfield from the algorithm's interface. +- * +- * \param[in] iface Pointer to the alogrithm interface +- * +- */ +- vpx_dec_caps_t vpx_dec_get_caps(vpx_dec_iface_t *iface) DEPRECATED; +- +- +- /*!\brief Parse stream info from a buffer +- * +- * Performs high level parsing of the bitstream. Construction of a decoder +- * context is not necessary. Can be used to determine if the bitstream is +- * of the proper format, and to extract information from the stream. +- * +- * \param[in] iface Pointer to the alogrithm interface +- * \param[in] data Pointer to a block of data to parse +- * \param[in] data_sz Size of the data buffer +- * \param[in,out] si Pointer to stream info to update. The size member +- * \ref MUST be properly initialized, but \ref MAY be +- * clobbered by the algorithm. This parameter \ref MAY +- * be NULL. +- * +- * \retval #VPX_DEC_OK +- * Bitstream is parsable and stream information updated +- */ +- vpx_dec_err_t vpx_dec_peek_stream_info(vpx_dec_iface_t *iface, +- const uint8_t *data, +- unsigned int data_sz, +- vpx_dec_stream_info_t *si) DEPRECATED; +- +- +- /*!\brief Return information about the current stream. +- * +- * Returns information about the stream that has been parsed during decoding. +- * +- * \param[in] ctx Pointer to this instance's context +- * \param[in,out] si Pointer to stream info to update. The size member +- * \ref MUST be properly initialized, but \ref MAY be +- * clobbered by the algorithm. This parameter \ref MAY +- * be NULL. +- * +- * \retval #VPX_DEC_OK +- * Bitstream is parsable and stream information updated +- */ +- vpx_dec_err_t vpx_dec_get_stream_info(vpx_dec_ctx_t *ctx, +- vpx_dec_stream_info_t *si) DEPRECATED; +- +- +- /*!\brief Control algorithm +- * +- * This function is used to exchange algorithm specific data with the decoder +- * instance. This can be used to implement features specific to a particular +- * algorithm. +- * +- * This wrapper function dispatches the request to the helper function +- * associated with the given ctrl_id. It tries to call this function +- * transparantly, but will return #VPX_DEC_ERROR if the request could not +- * be dispatched. +- * +- * \param[in] ctx Pointer to this instance's context +- * \param[in] ctrl_id Algorithm specific control identifier +- * \param[in,out] data Data to exchange with algorithm instance. +- * +- * \retval #VPX_DEC_OK +- * The control request was processed. +- * \retval #VPX_DEC_ERROR +- * The control request was not processed. +- * \retval #VPX_DEC_INVALID_PARAM +- * The data was not valid. +- */ +- vpx_dec_err_t vpx_dec_control(vpx_dec_ctx_t *ctx, +- int ctrl_id, +- void *data) DEPRECATED; +- +- /*!\brief Decode data +- * +- * Processes a buffer of coded data. If the processing results in a new +- * decoded frame becoming available, #VPX_DEC_CB_PUT_SLICE and +- * #VPX_DEC_CB_PUT_FRAME events may be generated, as appropriate. Encoded data +- * \ref MUST be passed in DTS (decode time stamp) order. Frames produced will +- * always be in PTS (presentation time stamp) order. +- * +- * \param[in] ctx Pointer to this instance's context +- * \param[in] data Pointer to this block of new coded data. If +- * NULL, a VPX_DEC_CB_PUT_FRAME event is posted +- * for the previously decoded frame. +- * \param[in] data_sz Size of the coded data, in bytes. +- * \param[in] user_priv Application specific data to associate with +- * this frame. +- * \param[in] rel_pts PTS relative to the previous frame, in us. If +- * unknown or unavailable, set to zero. +- * +- * \return Returns #VPX_DEC_OK if the coded data was processed completely +- * and future pictures can be decoded without error. Otherwise, +- * see the descriptions of the other error codes in ::vpx_dec_err_t +- * for recoverability capabilities. +- */ +- vpx_dec_err_t vpx_dec_decode(vpx_dec_ctx_t *ctx, +- uint8_t *data, +- unsigned int data_sz, +- void *user_priv, +- int rel_pts) DEPRECATED; +- +- +- /*!\brief Decoded frames iterator +- * +- * Iterates over a list of the frames available for display. The iterator +- * storage should be initialized to NULL to start the iteration. Iteration is +- * complete when this function returns NULL. +- * +- * The list of available frames becomes valid upon completion of the +- * vpx_dec_decode call, and remains valid until the next call to vpx_dec_decode. +- * +- * \param[in] ctx Pointer to this instance's context +- * \param[in out] iter Iterator storage, initialized to NULL +- * +- * \return Returns a pointer to an image, if one is ready for display. Frames +- * produced will always be in PTS (presentation time stamp) order. +- */ +- vpx_image_t *vpx_dec_get_frame(vpx_dec_ctx_t *ctx, +- vpx_dec_iter_t *iter) DEPRECATED; +- +- +- /*!\defgroup cap_put_frame Frame-Based Decoding Functions +- * +- * The following functions are required to be implemented for all decoders +- * that advertise the VPX_DEC_CAP_PUT_FRAME capability. Calling these functions +- * for codecs that don't advertise this capability will result in an error +- * code being returned, usually VPX_DEC_ERROR +- * @{ +- */ +- +- /*!\brief put frame callback prototype +- * +- * This callback is invoked by the decoder to notify the application of +- * the availability of decoded image data. +- */ +- typedef void (*vpx_dec_put_frame_cb_fn_t)(void *user_priv, +- const vpx_image_t *img); +- +- +- /*!\brief Register for notification of frame completion. +- * +- * Registers a given function to be called when a decoded frame is +- * available. +- * +- * \param[in] ctx Pointer to this instance's context +- * \param[in] cb Pointer to the callback function +- * \param[in] user_priv User's private data +- * +- * \retval #VPX_DEC_OK +- * Callback successfully registered. +- * \retval #VPX_DEC_ERROR +- * Decoder context not initialized, or algorithm not capable of +- * posting slice completion. +- */ +- vpx_dec_err_t vpx_dec_register_put_frame_cb(vpx_dec_ctx_t *ctx, +- vpx_dec_put_frame_cb_fn_t cb, +- void *user_priv) DEPRECATED; +- +- +- /*!@} - end defgroup cap_put_frame */ +- +- /*!\defgroup cap_put_slice Slice-Based Decoding Functions +- * +- * The following functions are required to be implemented for all decoders +- * that advertise the VPX_DEC_CAP_PUT_SLICE capability. Calling these functions +- * for codecs that don't advertise this capability will result in an error +- * code being returned, usually VPX_DEC_ERROR +- * @{ +- */ +- +- /*!\brief put slice callback prototype +- * +- * This callback is invoked by the decoder to notify the application of +- * the availability of partially decoded image data. The +- */ +- typedef void (*vpx_dec_put_slice_cb_fn_t)(void *user_priv, +- const vpx_image_t *img, +- const vpx_image_rect_t *valid, +- const vpx_image_rect_t *update); +- +- +- /*!\brief Register for notification of slice completion. +- * +- * Registers a given function to be called when a decoded slice is +- * available. +- * +- * \param[in] ctx Pointer to this instance's context +- * \param[in] cb Pointer to the callback function +- * \param[in] user_priv User's private data +- * +- * \retval #VPX_DEC_OK +- * Callback successfully registered. +- * \retval #VPX_DEC_ERROR +- * Decoder context not initialized, or algorithm not capable of +- * posting slice completion. +- */ +- vpx_dec_err_t vpx_dec_register_put_slice_cb(vpx_dec_ctx_t *ctx, +- vpx_dec_put_slice_cb_fn_t cb, +- void *user_priv) DEPRECATED; +- +- +- /*!@} - end defgroup cap_put_slice*/ +- +- /*!\defgroup cap_xma External Memory Allocation Functions +- * +- * The following functions are required to be implemented for all decoders +- * that advertise the VPX_DEC_CAP_XMA capability. Calling these functions +- * for codecs that don't advertise this capability will result in an error +- * code being returned, usually VPX_DEC_ERROR +- * @{ +- */ +- +- /*!\brief Memory Map Entry +- * +- * This structure is used to contain the properties of a memory segment. It +- * is populated by the decoder in the request phase, and by the calling +- * application once the requested allocation has been performed. +- */ +-#if 1 +-#define VPX_DEC_MEM_ZERO 0x1 /**< Segment must be zeroed by allocation */ +-#define VPX_DEC_MEM_WRONLY 0x2 /**< Segment need not be readable */ +-#define VPX_DEC_MEM_FAST 0x4 /**< Place in fast memory, if available */ +- typedef struct vpx_codec_mmap vpx_dec_mmap_t; +-#else +- typedef struct vpx_dec_mmap +- { +- /* +- * The following members are set by the codec when requesting a segment +- */ +- unsigned int id; /**< identifier for the segment's contents */ +- unsigned long sz; /**< size of the segment, in bytes */ +- unsigned int align; /**< required alignment of the segment, in bytes */ +- unsigned int flags; /**< bitfield containing segment properties */ +-#define VPX_DEC_MEM_ZERO 0x1 /**< Segment must be zeroed by allocation */ +-#define VPX_DEC_MEM_WRONLY 0x2 /**< Segment need not be readable */ +-#define VPX_DEC_MEM_FAST 0x4 /**< Place in fast memory, if available */ +- +- /* The following members are to be filled in by the allocation function */ +- void *base; /**< pointer to the allocated segment */ +- void (*dtor)(struct vpx_dec_mmap *map); /**< destructor to call */ +- void *priv; /**< allocator private storage */ +- } vpx_dec_mmap_t; +-#endif +- +- /*!\brief Initialize a decoder instance in external allocation mode +- * +- * Initializes a decoder context using the given interface. Applications +- * should call the vpx_dec_xma_init convenience macro instead of this +- * function directly, to ensure that the ABI version number parameter +- * is properly initialized. +- * +- * \param[in] ctx Pointer to this instance's context. +- * \param[in] iface Pointer to the alogrithm interface to use. +- * \param[in] ver ABI version number. Must be set to +- * VPX_DECODER_ABI_VERSION +- * \retval #VPX_DEC_OK +- * The decoder algorithm initialized. +- * \retval #VPX_DEC_ERROR +- * Decoder does not support XMA mode. +- */ +- vpx_dec_err_t vpx_dec_xma_init_ver(vpx_dec_ctx_t *ctx, +- vpx_dec_iface_t *iface, +- int ver) DEPRECATED; +-#define vpx_dec_xma_init(ctx, iface) \ +- vpx_dec_xma_init_ver(ctx, iface, VPX_DECODER_ABI_VERSION) +- +- +- /*!\brief Iterate over the list of segments to allocate. +- * +- * Iterates over a list of the segments to allocate. The iterator storage +- * should be initialized to NULL to start the iteration. Iteration is complete +- * when this function returns VPX_DEC_LIST_END. The amount of memory needed to +- * allocate is dependant upon the size of the encoded stream. This means that +- * the stream info structure must be known at allocation time. It can be +- * populated with the vpx_dec_peek_stream_info() function. In cases where the +- * stream to be decoded is not available at allocation time, a fixed size must +- * be requested. The decoder will not be able to decode streams larger than +- * the size used at allocation time. +- * +- * \param[in] ctx Pointer to this instance's context. +- * \param[out] mmap Pointer to the memory map entry to populate. +- * \param[in] si Pointer to the stream info. +- * \param[in out] iter Iterator storage, initialized to NULL +- * +- * \retval #VPX_DEC_OK +- * The memory map entry was populated. +- * \retval #VPX_DEC_ERROR +- * Decoder does not support XMA mode. +- * \retval #VPX_DEC_MEM_ERROR +- * Unable to determine segment size from stream info. +- */ +- vpx_dec_err_t vpx_dec_get_mem_map(vpx_dec_ctx_t *ctx, +- vpx_dec_mmap_t *mmap, +- const vpx_dec_stream_info_t *si, +- vpx_dec_iter_t *iter) DEPRECATED; +- +- +- /*!\brief Identify allocated segments to decoder instance +- * +- * Stores a list of allocated segments in the decoder. Segments \ref MUST be +- * passed in the order they are read from vpx_dec_get_mem_map(), but may be +- * passed in groups of any size. Segments \ref MUST be set only once. The +- * allocation function \ref MUST ensure that the vpx_dec_mmap_t::base member +- * is non-NULL. If the segment requires cleanup handling (eg, calling free() +- * or close()) then the vpx_dec_mmap_t::dtor member \ref MUST be populated. +- * +- * \param[in] ctx Pointer to this instance's context. +- * \param[in] mmaps Pointer to the first memory map entry in the list. +- * \param[in] num_maps Number of entries being set at this time +- * +- * \retval #VPX_DEC_OK +- * The segment was stored in the decoder context. +- * \retval #VPX_DEC_ERROR +- * Decoder does not support XMA mode. +- * \retval #VPX_DEC_MEM_ERROR +- * Segment base address was not set, or segment was already stored. +- +- */ +- vpx_dec_err_t vpx_dec_set_mem_map(vpx_dec_ctx_t *ctx, +- vpx_dec_mmap_t *mmaps, +- unsigned int num_maps) DEPRECATED; +- +- /*!@} - end defgroup cap_xma*/ +- /*!@} - end defgroup decoder*/ +- +- +-#endif +-#ifdef __cplusplus +-} +-#endif +diff --git a/vpx_codec/vpx_encoder.h b/vpx_codec/vpx_encoder.h +deleted file mode 100644 +index 67393be..0000000 +--- a/vpx_codec/vpx_encoder.h ++++ /dev/null +@@ -1,792 +0,0 @@ +-/* +- * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. +- * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. +- */ +- +- +-/*!\defgroup encoder Encoder Algorithm Interface +- * \ingroup codec +- * This abstraction allows applications using this encoder to easily support +- * multiple video formats with minimal code duplication. This section describes +- * the interface common to all encoders. +- * @{ +- */ +- +-/*!\file vpx_encoder.h +- * \brief Describes the encoder algorithm interface to applications. +- * +- * This file describes the interface between an application and a +- * video encoder algorithm. +- * +- */ +-#ifdef __cplusplus +-extern "C" { +-#endif +- +-#ifndef VPX_ENCODER_H +-#define VPX_ENCODER_H +-#include "vpx_codec.h" +- +- +- /*!\brief Current ABI version number +- * +- * \internal +- * If this file is altered in any way that changes the ABI, this value +- * must be bumped. Examples include, but are not limited to, changing +- * types, removing or reassigning enums, adding/removing/rearranging +- * fields to structures +- */ +-#define VPX_ENCODER_ABI_VERSION (2 + VPX_CODEC_ABI_VERSION) /**<\hideinitializer*/ +- +- +- /*! \brief Encoder capabilities bitfield +- * +- * Each encoder advertises the capabilities it supports as part of its +- * ::vpx_codec_iface_t interface structure. Capabilities are extra +- * interfaces or functionality, and are not required to be supported +- * by an encoder. +- * +- * The available flags are specifiedby VPX_CODEC_CAP_* defines. +- */ +-#define VPX_CODEC_CAP_PSNR 0x10000 /**< Can issue PSNR packets */ +- +- +- /*! \brief Initialization-time Feature Enabling +- * +- * Certain codec features must be known at initialization time, to allow +- * for proper memory allocation. +- * +- * The available flags are specified by VPX_CODEC_USE_* defines. +- */ +-#define VPX_CODEC_USE_PSNR 0x10000 /**< Calculate PSNR on each frame */ +- +- +- /*!\brief Generic fixed size buffer structure +- * +- * This structure is able to hold a reference to any fixed size buffer. +- */ +- typedef struct vpx_fixed_buf +- { +- void *buf; /**< Pointer to the data */ +- size_t sz; /**< Length of the buffer, in chars */ +- } vpx_fixed_buf_t; /**< alias for struct vpx_fixed_buf */ +- +- +- /*!\brief Time Stamp Type +- * +- * An integer, which when multiplied by the stream's time base, provides +- * the absolute time of a sample. +- */ +- typedef int64_t vpx_codec_pts_t; +- +- +- /*!\brief Compressed Frame Flags +- * +- * This type represents a bitfield containing information about a compressed +- * frame that may be useful to an application. The most significant 16 bits +- * can be used by an algorithm to provide additional detail, for example to +- * support frame types that are codec specific (MPEG-1 D-frames for example) +- */ +- typedef uint32_t vpx_codec_frame_flags_t; +-#define VPX_FRAME_IS_KEY 0x1 /**< frame is the start of a GOP */ +-#define VPX_FRAME_IS_DROPPABLE 0x2 /**< frame can be dropped without affecting +- the stream (no future frame depends on +- this one) */ +-#define VPX_FRAME_IS_INVISIBLE 0x4 /**< frame should be decoded but will not +- be shown */ +- +- +- /*!\brief Encoder output packet variants +- * +- * This enumeration lists the different kinds of data packets that can be +- * returned by calls to vpx_codec_get_cx_data(). Algorithms \ref MAY +- * extend this list to provide additional functionality. +- */ +- enum vpx_codec_cx_pkt_kind +- { +- VPX_CODEC_CX_FRAME_PKT, /**< Compressed video frame */ +- VPX_CODEC_STATS_PKT, /**< Two-pass statistics for this frame */ +- VPX_CODEC_PSNR_PKT, /**< PSNR statistics for this frame */ +- VPX_CODEC_CUSTOM_PKT = 256 /**< Algorithm extensions */ +- }; +- +- +- /*!\brief Encoder output packet +- * +- * This structure contains the different kinds of output data the encoder +- * may produce while compressing a frame. +- */ +- typedef struct vpx_codec_cx_pkt +- { +- enum vpx_codec_cx_pkt_kind kind; /**< packet variant */ +- union +- { +- struct +- { +- void *buf; /**< compressed data buffer */ +- size_t sz; /**< length of compressed data */ +- vpx_codec_pts_t pts; /**< time stamp to show frame +- (in timebase units) */ +- unsigned long duration; /**< duration to show frame +- (in timebase units) */ +- vpx_codec_frame_flags_t flags; /**< flags for this frame */ +- } frame; /**< data for compressed frame packet */ +- struct vpx_fixed_buf twopass_stats; /**< data for two-pass packet */ +- struct vpx_psnr_pkt +- { +- unsigned int samples[4]; /**< Number of samples, total/y/u/v */ +- uint64_t sse[4]; /**< sum squared error, total/y/u/v */ +- double psnr[4]; /**< PSNR, total/y/u/v */ +- } psnr; /**< data for PSNR packet */ +- struct vpx_fixed_buf raw; /**< data for arbitrary packets */ +- +- /* This packet size is fixed to allow codecs to extend this +- * interface without having to manage storage for raw packets, +- * ie if it's smaller than 128 bytes, you can store in the +- * packet list directly. +- */ +- char pad[128 - sizeof(enum vpx_codec_cx_pkt_kind)]; /**< fixed sz */ +- } data; /**< packet data */ +- } vpx_codec_cx_pkt_t; /**< alias for struct vpx_codec_cx_pkt */ +- +- +- /*!\brief Rational Number +- * +- * This structure holds a fractional value. +- */ +- typedef struct vpx_rational +- { +- int num; /**< fraction numerator */ +- int den; /**< fraction denominator */ +- } vpx_rational_t; /**< alias for struct vpx_rational */ +- +- +- /*!\brief Multi-pass Encoding Pass */ +- enum vpx_enc_pass +- { +- VPX_RC_ONE_PASS, /**< Single pass mode */ +- VPX_RC_FIRST_PASS, /**< First pass of multi-pass mode */ +- VPX_RC_LAST_PASS, /**< Final pass of multi-pass mode */ +- }; +- +- +- /*!\brief Rate control mode */ +- enum vpx_rc_mode +- { +- VPX_VBR, /**< Variable Bit Rate (VBR) mode */ +- VPX_CBR /**< Constant Bit Rate (CBR) mode */ +- }; +- +- +- /*!\brief Keyframe placement mode. +- * +- * This enumeration determines whether keyframes are placed automatically by +- * the encoder or whether this behavior is disabled. Older releases of this +- * SDK were implemented such that VPX_KF_FIXED meant keyframes were disabled. +- * This name is confusing for this behavior, so the new symbols to be used +- * are VPX_KF_AUTO and VPX_KF_DISABLED. +- */ +- enum vpx_kf_mode +- { +- VPX_KF_FIXED, /**< deprecated, implies VPX_KF_DISABLED */ +- VPX_KF_AUTO, /**< Encoder determines optimal placement automatically */ +- VPX_KF_DISABLED = 0 /**< Encoder does not place keyframes. */ +- }; +- +- +- /*!\brief Encoded Frame Flags +- * +- * This type indicates a bitfield to be passed to vpx_codec_encode(), defining +- * per-frame boolean values. By convention, bits common to all codecs will be +- * named VPX_EFLAG_*, and bits specific to an algorithm will be named +- * /algo/_eflag_*. The lower order 16 bits are reserved for common use. +- */ +- typedef long vpx_enc_frame_flags_t; +-#define VPX_EFLAG_FORCE_KF (1<<0) /**< Force this frame to be a keyframe */ +- +- +- /*!\brief Encoder configuration structure +- * +- * This structure contains the encoder settings that have common representations +- * across all codecs. This doesn't imply that all codecs support all features, +- * however. +- */ +- typedef struct vpx_codec_enc_cfg +- { +- /* +- * generic settings (g) +- */ +- +- /*!\brief Algorithm specific "usage" value +- * +- * Algorithms may define multiple values for usage, which may convey the +- * intent of how the application intends to use the stream. If this value +- * is non-zero, consult the documentation for the codec to determine its +- * meaning. +- */ +- unsigned int g_usage; +- +- +- /*!\brief Maximum number of threads to use +- * +- * For multi-threaded implementations, use no more than this number of +- * threads. The codec may use fewer threads than allowed. The value +- * 0 is equivalent to the value 1. +- */ +- unsigned int g_threads; +- +- +- /*!\brief Bitstream profile to use +- * +- * Some codecs support a notion of multiple bitstream profiles. Typically +- * this maps to a set of features that are turned on or off. Often the +- * profile to use is determined by the features of the intended decoder. +- * Consult the documentation for the codec to determine the valid values +- * for this parameter, or set to zero for a sane default. +- */ +- unsigned int g_profile; /**< profile of bitstream to use */ +- +- +- +- /*!\brief Width of the frame +- * +- * This value identifies the presentation resolution of the frame, +- * in pixels. Note that the frames passed as input to the encoder must +- * have this resolution. Frames will be presented by the decoder in this +- * resolution, independent of any spatial resampling the encoder may do. +- */ +- unsigned int g_w; +- +- +- /*!\brief Height of the frame +- * +- * This value identifies the presentation resolution of the frame, +- * in pixels. Note that the frames passed as input to the encoder must +- * have this resolution. Frames will be presented by the decoder in this +- * resolution, independent of any spatial resampling the encoder may do. +- */ +- unsigned int g_h; +- +- +- /*!\brief Stream timebase units +- * +- * Indicates the smallest interval of time, in seconds, used by the stream. +- * For fixed frame rate material, or variable frame rate material where +- * frames are timed at a multiple of a given clock (ex: video capture), +- * the \ref RECOMMENDED method is to set the timebase to the reciprocal +- * of the frame rate (ex: 1001/30000 for 29.970 Hz NTSC). This allows the +- * pts to correspond to the frame number, which can be handy. For +- * re-encoding video from containers with absolute time timestamps, the +- * \ref RECOMMENDED method is to set the timebase to that of the parent +- * container or multimedia framework (ex: 1/1000 for ms, as in FLV). +- */ +- struct vpx_rational g_timebase; +- +- +- /*!\brief Enable error resilient mode. +- * +- * Error resilient mode indicates to the encoder that it should take +- * measures appropriate for streaming over lossy or noisy links, if +- * possible. Set to 1 to enable this feature, 0 to disable it. +- */ +- unsigned int g_error_resilient; +- +- +- /*!\brief Multi-pass Encoding Mode +- * +- * This value should be set to the current phase for multi-pass encoding. +- * For single pass, set to #VPX_RC_ONE_PASS. +- */ +- enum vpx_enc_pass g_pass; +- +- +- /*!\brief Allow lagged encoding +- * +- * If set, this value allows the encoder to consume a number of input +- * frames before producing output frames. This allows the encoder to +- * base decisions for the current frame on future frames. This does +- * increase the latency of the encoding pipeline, so it is not appropriate +- * in all situations (ex: realtime encoding). +- * +- * Note that this is a maximum value -- the encoder may produce frames +- * sooner than the given limit. Set this value to 0 to disable this +- * feature. +- */ +- unsigned int g_lag_in_frames; +- +- +- /* +- * rate control settings (rc) +- */ +- +- /*!\brief Temporal resampling configuration, if supported by the codec. +- * +- * Temporal resampling allows the codec to "drop" frames as a strategy to +- * meet its target data rate. This can cause temporal discontinuities in +- * the encoded video, which may appear as stuttering during playback. This +- * trade-off is often acceptable, but for many applications is not. It can +- * be disabled in these cases. +- * +- * Note that not all codecs support this feature. All vpx VPx codecs do. +- * For other codecs, consult the documentation for that algorithm. +- * +- * This threshold is described as a percentage of the target data buffer. +- * When the data buffer falls below this percentage of fullness, a +- * dropped frame is indicated. Set the threshold to zero (0) to disable +- * this feature. +- */ +- unsigned int rc_dropframe_thresh; +- +- +- /*!\brief Enable/disable spatial resampling, if supported by the codec. +- * +- * Spatial resampling allows the codec to compress a lower resolution +- * version of the frame, which is then upscaled by the encoder to the +- * correct presentation resolution. This increases visual quality at +- * low data rates, at the expense of CPU time on the encoder/decoder. +- */ +- unsigned int rc_resize_allowed; +- +- +- /*!\brief Spatial resampling up watermark. +- * +- * This threshold is described as a percentage of the target data buffer. +- * When the data buffer rises above this percentage of fullness, the +- * encoder will step up to a higher resolution version of the frame. +- */ +- unsigned int rc_resize_up_thresh; +- +- +- /*!\brief Spatial resampling down watermark. +- * +- * This threshold is described as a percentage of the target data buffer. +- * When the data buffer falls below this percentage of fullness, the +- * encoder will step down to a lower resolution version of the frame. +- */ +- unsigned int rc_resize_down_thresh; +- +- +- /*!\brief Rate control algorithm to use. +- * +- * Indicates whether the end usage of this stream is to be streamed over +- * a bandwidth constrained link, indicating that Constant Bit Rate (CBR) +- * mode should be used, or whether it will be played back on a high +- * bandwidth link, as from a local disk, where higher variations in +- * bitrate are acceptable. +- */ +- enum vpx_rc_mode rc_end_usage; +- +- +- /*!\brief Two-pass stats buffer. +- * +- * A buffer containing all of the stats packets produced in the first +- * pass, concatenated. +- */ +- struct vpx_fixed_buf rc_twopass_stats_in; +- +- +- /*!\brief Target data rate +- * +- * Target bandwidth to use for this stream, in kilobits per second. +- */ +- unsigned int rc_target_bitrate; +- +- +- /* +- * quantizer settings +- */ +- +- +- /*!\brief Minimum (Best Quality) Quantizer +- * +- * The quantizer is the most direct control over the quality of the +- * encoded image. The range of valid values for the quantizer is codec +- * specific. Consult the documentation for the codec to determine the +- * values to use. To determine the range programmatically, call +- * vpx_codec_enc_config_default() with a usage value of 0. +- */ +- unsigned int rc_min_quantizer; +- +- +- /*!\brief Maximum (Worst Quality) Quantizer +- * +- * The quantizer is the most direct control over the quality of the +- * encoded image. The range of valid values for the quantizer is codec +- * specific. Consult the documentation for the codec to determine the +- * values to use. To determine the range programmatically, call +- * vpx_codec_enc_config_default() with a usage value of 0. +- */ +- unsigned int rc_max_quantizer; +- +- +- /* +- * bitrate tolerance +- */ +- +- +- /*!\brief Rate control undershoot tolerance +- * +- * This value, expressed as a percentage of the target bitrate, describes +- * the target bitrate for easier frames, allowing bits to be saved for +- * harder frames. Set to zero to use the codec default. +- */ +- unsigned int rc_undershoot_pct; +- +- +- /*!\brief Rate control overshoot tolerance +- * +- * This value, expressed as a percentage of the target bitrate, describes +- * the maximum allowed bitrate for a given frame. Set to zero to use the +- * codec default. +- */ +- unsigned int rc_overshoot_pct; +- +- +- /* +- * decoder buffer model parameters +- */ +- +- +- /*!\brief Decoder Buffer Size +- * +- * This value indicates the amount of data that may be buffered by the +- * decoding application. Note that this value is expressed in units of +- * time (milliseconds). For example, a value of 5000 indicates that the +- * client will buffer (at least) 5000ms worth of encoded data. Use the +- * target bitrate (#rc_target_bitrate) to convert to bits/bytes, if +- * necessary. +- */ +- unsigned int rc_buf_sz; +- +- +- /*!\brief Decoder Buffer Initial Size +- * +- * This value indicates the amount of data that will be buffered by the +- * decoding application prior to beginning playback. This value is +- * expressed in units of time (milliseconds). Use the target bitrate +- * (#rc_target_bitrate) to convert to bits/bytes, if necessary. +- */ +- unsigned int rc_buf_initial_sz; +- +- +- /*!\brief Decoder Buffer Optimal Size +- * +- * This value indicates the amount of data that the encoder should try +- * to maintain in the decoder's buffer. This value is expressed in units +- * of time (milliseconds). Use the target bitrate (#rc_target_bitrate) +- * to convert to bits/bytes, if necessary. +- */ +- unsigned int rc_buf_optimal_sz; +- +- +- /* +- * 2 pass rate control parameters +- */ +- +- +- /*!\brief Two-pass mode CBR/VBR bias +- * +- * Bias, expressed on a scale of 0 to 100, for determining target size +- * for the current frame. The value 0 indicates the optimal CBR mode +- * value should be used. The value 100 indicates the optimal VBR mode +- * value should be used. Values in between indicate which way the +- * encoder should "lean." +- */ +- unsigned int rc_2pass_vbr_bias_pct; /**< RC mode bias between CBR and VBR(0-100: 0->CBR, 100->VBR) */ +- +- +- /*!\brief Two-pass mode per-GOP minimum bitrate +- * +- * This value, expressed as a percentage of the target bitrate, indicates +- * the minimum bitrate to be used for a single GOP (aka "section") +- */ +- unsigned int rc_2pass_vbr_minsection_pct; +- +- +- /*!\brief Two-pass mode per-GOP maximum bitrate +- * +- * This value, expressed as a percentage of the target bitrate, indicates +- * the maximum bitrate to be used for a single GOP (aka "section") +- */ +- unsigned int rc_2pass_vbr_maxsection_pct; +- +- +- /* +- * keyframing settings (kf) +- */ +- +- /*!\brief Keyframe placement mode +- * +- * This value indicates whether the encoder should place keyframes at a +- * fixed interval, or determine the optimal placement automatically +- * (as governed by the #kf_min_dist and #kf_max_dist parameters) +- */ +- enum vpx_kf_mode kf_mode; +- +- +- /*!\brief Keyframe minimum interval +- * +- * This value, expressed as a number of frames, prevents the encoder from +- * placing a keyframe nearer than kf_min_dist to the previous keyframe. At +- * least kf_min_dist frames non-keyframes will be coded before the next +- * keyframe. Set kf_min_dist equal to kf_max_dist for a fixed interval. +- */ +- unsigned int kf_min_dist; +- +- +- /*!\brief Keyframe maximum interval +- * +- * This value, expressed as a number of frames, forces the encoder to code +- * a keyframe if one has not been coded in the last kf_max_dist frames. +- * A value of 0 implies all frames will be keyframes. Set kf_min_dist +- * equal to kf_max_dist for a fixed interval. +- */ +- unsigned int kf_max_dist; +- +- } vpx_codec_enc_cfg_t; /**< alias for struct vpx_codec_enc_cfg */ +- +- +- /*!\brief Initialize an encoder instance +- * +- * Initializes a encoder context using the given interface. Applications +- * should call the vpx_codec_enc_init convenience macro instead of this +- * function directly, to ensure that the ABI version number parameter +- * is properly initialized. +- * +- * In XMA mode (activated by setting VPX_CODEC_USE_XMA in the flags +- * parameter), the storage pointed to by the cfg parameter must be +- * kept readable and stable until all memory maps have been set. +- * +- * \param[in] ctx Pointer to this instance's context. +- * \param[in] iface Pointer to the algorithm interface to use. +- * \param[in] cfg Configuration to use, if known. May be NULL. +- * \param[in] flags Bitfield of VPX_CODEC_USE_* flags +- * \param[in] ver ABI version number. Must be set to +- * VPX_ENCODER_ABI_VERSION +- * \retval #VPX_CODEC_OK +- * The decoder algorithm initialized. +- * \retval #VPX_CODEC_MEM_ERROR +- * Memory allocation failed. +- */ +- vpx_codec_err_t vpx_codec_enc_init_ver(vpx_codec_ctx_t *ctx, +- vpx_codec_iface_t *iface, +- vpx_codec_enc_cfg_t *cfg, +- vpx_codec_flags_t flags, +- int ver); +- +- +- /*!\brief Convenience macro for vpx_codec_enc_init_ver() +- * +- * Ensures the ABI version parameter is properly set. +- */ +-#define vpx_codec_enc_init(ctx, iface, cfg, flags) \ +- vpx_codec_enc_init_ver(ctx, iface, cfg, flags, VPX_ENCODER_ABI_VERSION) +- +- +- /*!\brief Get a default configuration +- * +- * Initializes a encoder configuration structure with default values. Supports +- * the notion of "usages" so that an algorithm may offer different default +- * settings depending on the user's intended goal. This function \ref SHOULD +- * be called by all applications to initialize the configuration structure +- * before specializing the configuration with application specific values. +- * +- * \param[in] iface Pointer to the algorithm interface to use. +- * \param[out] cfg Configuration buffer to populate +- * \param[in] usage End usage. Set to 0 or use codec specific values. +- * +- * \retval #VPX_CODEC_OK +- * The configuration was populated. +- * \retval #VPX_CODEC_INCAPABLE +- * Interface is not an encoder interface. +- * \retval #VPX_CODEC_INVALID_PARAM +- * A parameter was NULL, or the usage value was not recognized. +- */ +- vpx_codec_err_t vpx_codec_enc_config_default(vpx_codec_iface_t *iface, +- vpx_codec_enc_cfg_t *cfg, +- unsigned int usage); +- +- +- /*!\brief Set or change configuration +- * +- * Reconfigures an encoder instance according to the given configuration. +- * +- * \param[in] ctx Pointer to this instance's context +- * \param[in] cfg Configuration buffer to use +- * +- * \retval #VPX_CODEC_OK +- * The configuration was populated. +- * \retval #VPX_CODEC_INCAPABLE +- * Interface is not an encoder interface. +- * \retval #VPX_CODEC_INVALID_PARAM +- * A parameter was NULL, or the usage value was not recognized. +- */ +- vpx_codec_err_t vpx_codec_enc_config_set(vpx_codec_ctx_t *ctx, +- const vpx_codec_enc_cfg_t *cfg); +- +- +- /*!\brief Get global stream headers +- * +- * Retrieves a stream level global header packet, if supported by the codec. +- * +- * \param[in] ctx Pointer to this instance's context +- * +- * \retval NULL +- * Encoder does not support global header +- * \retval Non-NULL +- * Pointer to buffer containing global header packet +- */ +- vpx_fixed_buf_t *vpx_codec_get_global_headers(vpx_codec_ctx_t *ctx); +- +- +-#define VPX_DL_REALTIME (1) /**< deadline parameter analogous to +- * VPx REALTIME mode. */ +-#define VPX_DL_GOOD_QUALITY (1000000) /**< deadline parameter analogous to +- * VPx GOOD QUALITY mode. */ +-#define VPX_DL_BEST_QUALITY (0) /**< deadline parameter analogous to +- * VPx BEST QUALITY mode. */ +- /*!\brief Encode a frame +- * +- * Encodes a video frame at the given "presentation time." The presentation +- * time stamp (PTS) \ref MUST be strictly increasing. +- * +- * The encoder supports the notion of a soft real-time deadline. Given a +- * non-zero value to the deadline parameter, the encoder will make a "best +- * effort" guarantee to return before the given time slice expires. It is +- * implicit that limiting the available time to encode will degrade the +- * output quality. The encoder can be given an unlimited time to produce the +- * best possible frame by specifying a deadline of '0'. This deadline +- * supercedes the VPx notion of "best quality, good quality, realtime". +- * Applications that wish to map these former settings to the new deadline +- * based system can use the symbols #VPX_DL_REALTIME, #VPX_DL_GOOD_QUALITY, +- * and #VPX_DL_BEST_QUALITY. +- * +- * When the last frame has been passed to the encoder, this function should +- * continue to be called, with the img parameter set to NULL. This will +- * signal the end-of-stream condition to the encoder and allow it to encode +- * any held buffers. Encoding is complete when vpx_codec_encode() is called +- * and vpx_codec_get_cx_data() returns no data. +- * +- * \param[in] ctx Pointer to this instance's context +- * \param[in] img Image data to encode, NULL to flush. +- * \param[in] pts Presentation time stamp, in timebase units. +- * \param[in] duration Duration to show frame, in timebase units. +- * \param[in] flags Flags to use for encoding this frame. +- * \param[in] deadline Time to spend encoding, in microseconds. (0=infinite) +- * +- * \retval #VPX_CODEC_OK +- * The configuration was populated. +- * \retval #VPX_CODEC_INCAPABLE +- * Interface is not an encoder interface. +- * \retval #VPX_CODEC_INVALID_PARAM +- * A parameter was NULL, the image format is unsupported, etc. +- */ +- vpx_codec_err_t vpx_codec_encode(vpx_codec_ctx_t *ctx, +- const vpx_image_t *img, +- vpx_codec_pts_t pts, +- unsigned long duration, +- vpx_enc_frame_flags_t flags, +- unsigned long deadline); +- +- +- /*!\brief Set compressed data output buffer +- * +- * Sets the buffer that the codec should output the compressed data +- * into. This call effectively sets the buffer pointer returned in the +- * next VPX_CODEC_CX_FRAME_PKT packet. Subsequent packets will be +- * appended into this buffer. The buffer is preserved across frames, +- * so applications must periodically call this function after flushing +- * the accumulated compressed data to disk or to the network to reset +- * the pointer to the buffer's head. +- * +- * `pad_before` bytes will be skipped before writing the compressed +- * data, and `pad_after` bytes will be appended to the packet. The size +- * of the packet will be the sum of the size of the actual compressed +- * data, pad_before, and pad_after. The padding bytes will be preserved +- * (not overwritten). +- * +- * Note that calling this function does not guarantee that the returned +- * compressed data will be placed into the specified buffer. In the +- * event that the encoded data will not fit into the buffer provided, +- * the returned packet \ref MAY point to an internal buffer, as it would +- * if this call were never used. In this event, the output packet will +- * NOT have any padding, and the application must free space and copy it +- * to the proper place. This is of particular note in configurations +- * that may output multiple packets for a single encoded frame (e.g., lagged +- * encoding) or if the application does not reset the buffer periodically. +- * +- * Applications may restore the default behavior of the codec providing +- * the compressed data buffer by calling this function with a NULL +- * buffer. +- * +- * Applications \ref MUSTNOT call this function during iteration of +- * vpx_codec_get_cx_data(). +- * +- * \param[in] ctx Pointer to this instance's context +- * \param[in] buf Buffer to store compressed data into +- * \param[in] pad_before Bytes to skip before writing compressed data +- * \param[in] pad_after Bytes to skip after writing compressed data +- * +- * \retval #VPX_CODEC_OK +- * The buffer was set successfully. +- * \retval #VPX_CODEC_INVALID_PARAM +- * A parameter was NULL, the image format is unsupported, etc. +- */ +- vpx_codec_err_t vpx_codec_set_cx_data_buf(vpx_codec_ctx_t *ctx, +- const vpx_fixed_buf_t *buf, +- unsigned int pad_before, +- unsigned int pad_after); +- +- +- /*!\brief Encoded data iterator +- * +- * Iterates over a list of data packets to be passed from the encoder to the +- * application. The different kinds of packets available are enumerated in +- * #vpx_codec_cx_pkt_kind. +- * +- * #VPX_CODEC_CX_FRAME_PKT packets should be passed to the application's +- * muxer. Multiple compressed frames may be in the list. +- * #VPX_CODEC_STATS_PKT packets should be appended to a global buffer. +- * +- * The application \ref MUST silently ignore any packet kinds that it does +- * not recognize or support. +- * +- * The data buffers returned from this function are only guaranteed to be +- * valid until the application makes another call to any vpx_codec_* function. +- * +- * \param[in] ctx Pointer to this instance's context +- * \param[in,out] iter Iterator storage, initialized to NULL +- * +- * \return Returns a pointer to an output data packet (compressed frame data, +- * two-pass statistics, etc.) or NULL to signal end-of-list. +- * +- */ +- const vpx_codec_cx_pkt_t *vpx_codec_get_cx_data(vpx_codec_ctx_t *ctx, +- vpx_codec_iter_t *iter); +- +- +- /*!\brief Get Preview Frame +- * +- * Returns an image that can be used as a preview. Shows the image as it would +- * exist at the decompressor. The application \ref MUST NOT write into this +- * image buffer. +- * +- * \param[in] ctx Pointer to this instance's context +- * +- * \return Returns a pointer to a preview image, or NULL if no image is +- * available. +- * +- */ +- const vpx_image_t *vpx_codec_get_preview_frame(vpx_codec_ctx_t *ctx); +- +- +- /*!@} - end defgroup encoder*/ +- +-#endif +-#ifdef __cplusplus +-} +-#endif +diff --git a/vpx_codec/vpx_image.h b/vpx_codec/vpx_image.h +deleted file mode 100644 +index a8a9416..0000000 +--- a/vpx_codec/vpx_image.h ++++ /dev/null +@@ -1,201 +0,0 @@ +-/* +- * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. +- * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. +- */ +- +- +-/*!\file vpx_image.h +- * \brief Describes the vpx image descriptor and associated operations +- * +- */ +-#ifdef __cplusplus +-extern "C" { +-#endif +- +-#ifndef VPX_IMAGE_H +-#define VPX_IMAGE_H +- +- /*!\brief Current ABI version number +- * +- * \internal +- * If this file is altered in any way that changes the ABI, this value +- * must be bumped. Examples include, but are not limited to, changing +- * types, removing or reassigning enums, adding/removing/rearranging +- * fields to structures +- */ +-#define VPX_IMAGE_ABI_VERSION (1) /**<\hideinitializer*/ +- +- +-#define IMG_FMT_PLANAR 0x100 /**< Image is a planar format */ +-#define IMG_FMT_UV_FLIP 0x200 /**< V plane precedes U plane in memory */ +-#define IMG_FMT_HAS_ALPHA 0x400 /**< Image has an alpha channel componnent */ +- +- +- /*!\brief List of supported image formats */ +- typedef enum img_fmt { +- IMG_FMT_NONE, +- IMG_FMT_RGB24, /**< 24 bit per pixel packed RGB */ +- IMG_FMT_RGB32, /**< 32 bit per pixel packed 0RGB */ +- IMG_FMT_RGB565, /**< 16 bit per pixel, 565 */ +- IMG_FMT_RGB555, /**< 16 bit per pixel, 555 */ +- IMG_FMT_UYVY, /**< UYVY packed YUV */ +- IMG_FMT_YUY2, /**< YUYV packed YUV */ +- IMG_FMT_YVYU, /**< YVYU packed YUV */ +- IMG_FMT_BGR24, /**< 24 bit per pixel packed BGR */ +- IMG_FMT_RGB32_LE, /**< 32 bit packed BGR0 */ +- IMG_FMT_ARGB, /**< 32 bit packed ARGB, alpha=255 */ +- IMG_FMT_ARGB_LE, /**< 32 bit packed BGRA, alpha=255 */ +- IMG_FMT_RGB565_LE, /**< 16 bit per pixel, gggbbbbb rrrrrggg */ +- IMG_FMT_RGB555_LE, /**< 16 bit per pixel, gggbbbbb 0rrrrrgg */ +- IMG_FMT_YV12 = IMG_FMT_PLANAR | IMG_FMT_UV_FLIP | 1, /**< planar YVU */ +- IMG_FMT_I420 = IMG_FMT_PLANAR | 2, +- IMG_FMT_VPXYV12 = IMG_FMT_PLANAR | IMG_FMT_UV_FLIP | 3, /** < planar 4:2:0 format with vpx color space */ +- IMG_FMT_VPXI420 = IMG_FMT_PLANAR | 4, /** < planar 4:2:0 format with vpx color space */ +- } +- img_fmt_t; /**< alias for enum img_fmt */ +- +- +- /**\brief Image Descriptor */ +- typedef struct +- { +- img_fmt_t fmt; /**< Image Format */ +- +- /* Image storage dimensions */ +- unsigned int w; /**< Stored image width */ +- unsigned int h; /**< Stored image height */ +- +- /* Image display dimensions */ +- unsigned int d_w; /**< Displayed image width */ +- unsigned int d_h; /**< Displayed image height */ +- +- /* Chroma subsampling info */ +- unsigned int x_chroma_shift; /**< subsampling order, X */ +- unsigned int y_chroma_shift; /**< subsampling order, Y */ +- +- /* Image data pointers. */ +-#define PLANE_PACKED 0 /**< To be used for all packed formats */ +-#define PLANE_Y 0 /**< Y (Luminance) plane */ +-#define PLANE_U 1 /**< U (Chroma) plane */ +-#define PLANE_V 2 /**< V (Chroma) plane */ +-#define PLANE_ALPHA 3 /**< A (Transparancy) plane */ +- unsigned char *planes[4]; /**< pointer to the top left pixel for each plane */ +- int stride[4]; /**< stride between rows for each plane */ +- +- int bps; /**< bits per sample (for packed formats) */ +- +- /* The following member may be set by the application to associate data +- * with this image. +- */ +- void *user_priv; /**< may be set by the application to associate data +- * with this image. */ +- +- /* The following members should be treated as private. */ +- unsigned char *img_data; /**< private */ +- int img_data_owner; /**< private */ +- int self_allocd; /**< private */ +- } vpx_image_t; /**< alias for struct vpx_image */ +- +- /**\brief Representation of a rectangle on a surface */ +- typedef struct vpx_image_rect +- { +- unsigned int x; /**< leftmost column */ +- unsigned int y; /**< topmost row */ +- unsigned int w; /**< width */ +- unsigned int h; /**< height */ +- } vpx_image_rect_t; /**< alias for struct vpx_image_rect */ +- +- /*!\brief Open a descriptor, allocating storage for the underlying image +- * +- * Returns a descriptor for storing an image of the given format. The +- * storage for the descriptor is allocated on the heap. +- * +- * \param[in] img Pointer to storage for descriptor. If this parameter +- * is NULL, the storage for the descriptor will be +- * allocated on the heap. +- * \param[in] fmt Format for the image +- * \param[in] d_w Width of the image +- * \param[in] d_h Height of the image +- * \param[in] align Alignment, in bytes, of each row in the image. +- * +- * \return Returns a pointer to the initialized image descriptor. If the img +- * parameter is non-null, the value of the img parameter will be +- * returned. +- */ +- vpx_image_t *vpx_img_alloc(vpx_image_t *img, +- img_fmt_t fmt, +- unsigned int d_w, +- unsigned int d_h, +- unsigned int align); +- +- /*!\brief Open a descriptor, using existing storage for the underlying image +- * +- * Returns a descriptor for storing an image of the given format. The +- * storage for descriptor has been allocated elsewhere, and a descriptor is +- * desired to "wrap" that storage. +- * +- * \param[in] img Pointer to storage for descriptor. If this parameter +- * is NULL, the storage for the descriptor will be +- * allocated on the heap. +- * \param[in] fmt Format for the image +- * \param[in] d_w Width of the image +- * \param[in] d_h Height of the image +- * \param[in] align Alignment, in bytes, of each row in the image. +- * \param[in] img_data Storage to use for the image +- * +- * \return Returns a pointer to the initialized image descriptor. If the img +- * parameter is non-null, the value of the img parameter will be +- * returned. +- */ +- vpx_image_t *vpx_img_wrap(vpx_image_t *img, +- img_fmt_t fmt, +- unsigned int d_w, +- unsigned int d_h, +- unsigned int align, +- unsigned char *img_data); +- +- +- /*!\brief Set the rectangle identifying the displayed portion of the image +- * +- * Updates the displayed rectangle (aka viewport) on the image surface to +- * match the specified coordinates and size. +- * +- * \param[in] img Image descriptor +- * \param[in] x leftmost column +- * \param[in] y topmost row +- * \param[in] w width +- * \param[in] h height +- * +- * \return 0 if the requested rectangle is valid, nonzero otherwise. +- */ +- int vpx_img_set_rect(vpx_image_t *img, +- unsigned int x, +- unsigned int y, +- unsigned int w, +- unsigned int h); +- +- +- /*!\brief Flip the image vertically (top for bottom) +- * +- * Adjusts the image descriptor's pointers and strides to make the image +- * be referenced upside-down. +- * +- * \param[in] img Image descriptor +- */ +- void vpx_img_flip(vpx_image_t *img); +- +- /*!\brief Close an image descriptor +- * +- * Frees all allocated storage associated with an image descriptor. +- * +- * \param[in] img Image descriptor +- */ +- void vpx_img_free(vpx_image_t *img); +- +-#endif +-#ifdef __cplusplus +-} +-#endif +diff --git a/vpx_mem/include/nds/vpx_mem_nds.h b/vpx_mem/include/nds/vpx_mem_nds.h +index c332403..361c29b 100644 +--- a/vpx_mem/include/nds/vpx_mem_nds.h ++++ b/vpx_mem/include/nds/vpx_mem_nds.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_mem/include/vpx_mem_intrnl.h b/vpx_mem/include/vpx_mem_intrnl.h +index 3b68d86..4605b34 100644 +--- a/vpx_mem/include/vpx_mem_intrnl.h ++++ b/vpx_mem/include/vpx_mem_intrnl.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_mem/include/vpx_mem_tracker.h b/vpx_mem/include/vpx_mem_tracker.h +index ab85d19..49f783e 100644 +--- a/vpx_mem/include/vpx_mem_tracker.h ++++ b/vpx_mem/include/vpx_mem_tracker.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_mem/intel_linux/vpx_mem.c b/vpx_mem/intel_linux/vpx_mem.c +index 002e407..7bce794 100644 +--- a/vpx_mem/intel_linux/vpx_mem.c ++++ b/vpx_mem/intel_linux/vpx_mem.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_mem/intel_linux/vpx_mem_tracker.c b/vpx_mem/intel_linux/vpx_mem_tracker.c +index fa023e3..fcbebc9 100644 +--- a/vpx_mem/intel_linux/vpx_mem_tracker.c ++++ b/vpx_mem/intel_linux/vpx_mem_tracker.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_mem/memory_manager/hmm_alloc.c b/vpx_mem/memory_manager/hmm_alloc.c +index 9abd81e..3f10097 100644 +--- a/vpx_mem/memory_manager/hmm_alloc.c ++++ b/vpx_mem/memory_manager/hmm_alloc.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_mem/memory_manager/hmm_base.c b/vpx_mem/memory_manager/hmm_base.c +index 0cacc3f..fbc36de 100644 +--- a/vpx_mem/memory_manager/hmm_base.c ++++ b/vpx_mem/memory_manager/hmm_base.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_mem/memory_manager/hmm_dflt_abort.c b/vpx_mem/memory_manager/hmm_dflt_abort.c +index dc59f55..71b41d9 100644 +--- a/vpx_mem/memory_manager/hmm_dflt_abort.c ++++ b/vpx_mem/memory_manager/hmm_dflt_abort.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_mem/memory_manager/hmm_grow.c b/vpx_mem/memory_manager/hmm_grow.c +index 79d75a7..a979c7a 100644 +--- a/vpx_mem/memory_manager/hmm_grow.c ++++ b/vpx_mem/memory_manager/hmm_grow.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_mem/memory_manager/hmm_largest.c b/vpx_mem/memory_manager/hmm_largest.c +index 5ebe398..82a6a36 100644 +--- a/vpx_mem/memory_manager/hmm_largest.c ++++ b/vpx_mem/memory_manager/hmm_largest.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_mem/memory_manager/hmm_resize.c b/vpx_mem/memory_manager/hmm_resize.c +index 6e3f2f0..cb93bb1 100644 +--- a/vpx_mem/memory_manager/hmm_resize.c ++++ b/vpx_mem/memory_manager/hmm_resize.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_mem/memory_manager/hmm_shrink.c b/vpx_mem/memory_manager/hmm_shrink.c +index 5ef9b23..d845136 100644 +--- a/vpx_mem/memory_manager/hmm_shrink.c ++++ b/vpx_mem/memory_manager/hmm_shrink.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_mem/memory_manager/hmm_true.c b/vpx_mem/memory_manager/hmm_true.c +index 41103c8..586fc22 100644 +--- a/vpx_mem/memory_manager/hmm_true.c ++++ b/vpx_mem/memory_manager/hmm_true.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_mem/memory_manager/include/cavl_if.h b/vpx_mem/memory_manager/include/cavl_if.h +index e2733ef..da1b148 100644 +--- a/vpx_mem/memory_manager/include/cavl_if.h ++++ b/vpx_mem/memory_manager/include/cavl_if.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_mem/memory_manager/include/cavl_impl.h b/vpx_mem/memory_manager/include/cavl_impl.h +index 267bc73..e67cc8a 100644 +--- a/vpx_mem/memory_manager/include/cavl_impl.h ++++ b/vpx_mem/memory_manager/include/cavl_impl.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_mem/memory_manager/include/heapmm.h b/vpx_mem/memory_manager/include/heapmm.h +index 933e30d..4e46c41 100644 +--- a/vpx_mem/memory_manager/include/heapmm.h ++++ b/vpx_mem/memory_manager/include/heapmm.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_mem/memory_manager/include/hmm_cnfg.h b/vpx_mem/memory_manager/include/hmm_cnfg.h +index 86e4e9f..715163c 100644 +--- a/vpx_mem/memory_manager/include/hmm_cnfg.h ++++ b/vpx_mem/memory_manager/include/hmm_cnfg.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_mem/memory_manager/include/hmm_intrnl.h b/vpx_mem/memory_manager/include/hmm_intrnl.h +index 6e2be08..1dddb8a 100644 +--- a/vpx_mem/memory_manager/include/hmm_intrnl.h ++++ b/vpx_mem/memory_manager/include/hmm_intrnl.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_mem/nds/vpx_mem_nds.c b/vpx_mem/nds/vpx_mem_nds.c +index f2a3043..88d474a 100644 +--- a/vpx_mem/nds/vpx_mem_nds.c ++++ b/vpx_mem/nds/vpx_mem_nds.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_mem/ti_c6x/vpx_mem_ti_6cx.c b/vpx_mem/ti_c6x/vpx_mem_ti_6cx.c +index 6501855..c2a1c28 100644 +--- a/vpx_mem/ti_c6x/vpx_mem_ti_6cx.c ++++ b/vpx_mem/ti_c6x/vpx_mem_ti_6cx.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_mem/vpx_mem.c b/vpx_mem/vpx_mem.c +index f6b1a35..ba92024 100644 +--- a/vpx_mem/vpx_mem.c ++++ b/vpx_mem/vpx_mem.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_mem/vpx_mem.h b/vpx_mem/vpx_mem.h +index 6ccb9be..a1239c1 100644 +--- a/vpx_mem/vpx_mem.h ++++ b/vpx_mem/vpx_mem.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_mem/vpx_mem_tracker.c b/vpx_mem/vpx_mem_tracker.c +index 4427e27..92152a6 100644 +--- a/vpx_mem/vpx_mem_tracker.c ++++ b/vpx_mem/vpx_mem_tracker.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_ports/config.h b/vpx_ports/config.h +index da38137..9d32393 100644 +--- a/vpx_ports/config.h ++++ b/vpx_ports/config.h +@@ -1,19 +1,10 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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 uses some preprocessor magic to expand the value of HAVE_CONFIG_H, +- * as defined by the build system, so that different projects can use the file +- * name for config.h that suits them. +- */ +-#define QUOTE_(x) #x +-#define QUOTE(x) QUOTE_(x) +-#include QUOTE(HAVE_CONFIG_H) +-#undef QUOTE +-#undef QUOTE_ ++#include "vpx_config.h" +diff --git a/vpx_ports/emms.asm b/vpx_ports/emms.asm +index 03e3499..096176d 100644 +--- a/vpx_ports/emms.asm ++++ b/vpx_ports/emms.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vpx_ports/mem.h b/vpx_ports/mem.h +index 10942f1..ade2e30 100644 +--- a/vpx_ports/mem.h ++++ b/vpx_ports/mem.h +@@ -1,17 +1,18 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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 VPX_PORTS_MEM_H + #define VPX_PORTS_MEM_H + #include "vpx_config.h" +-#include "vpx_integer.h" ++#include "vpx/vpx_integer.h" + + #if defined(__GNUC__) && __GNUC__ + #define DECLARE_ALIGNED(n,typ,val) typ val __attribute__ ((aligned (n))) +diff --git a/vpx_ports/mem_ops.h b/vpx_ports/mem_ops.h +index 869d583..109c270 100644 +--- a/vpx_ports/mem_ops.h ++++ b/vpx_ports/mem_ops.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_ports/mem_ops_aligned.h b/vpx_ports/mem_ops_aligned.h +index 1d0db2c..7c4d95e 100644 +--- a/vpx_ports/mem_ops_aligned.h ++++ b/vpx_ports/mem_ops_aligned.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_ports/vpx_integer.h b/vpx_ports/vpx_integer.h +deleted file mode 100644 +index d3f7ddd..0000000 +--- a/vpx_ports/vpx_integer.h ++++ /dev/null +@@ -1,52 +0,0 @@ +-/* +- * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. +- * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. +- */ +- +- +-#ifndef VPX_INTEGER_H +-#define VPX_INTEGER_H +- +-/* get ptrdiff_t, size_t, wchar_t, NULL */ +-#include <stddef.h> +- +-#if defined(HAVE_STDINT_H) && HAVE_STDINT_H +-#if defined(__cplusplus) && !defined(__STDC_FORMAT_MACROS) +-#define __STDC_FORMAT_MACROS +-#endif +-#include <stdint.h> +-#include <inttypes.h> +-#else +-typedef signed char int8_t; +-typedef signed short int16_t; +-typedef signed int int32_t; +- +-typedef unsigned char uint8_t; +-typedef unsigned short uint16_t; +-typedef unsigned int uint32_t; +- +-#if defined(_MSC_VER) +-typedef signed __int64 int64_t; +-typedef unsigned __int64 uint64_t; +-#define PRId64 "I64d" +-#endif +- +-#ifdef HAVE_ARMV6 +-typedef unsigned int int_fast16_t; +-#else +-typedef signed short int_fast16_t; +-#endif +-typedef signed char int_fast8_t; +-typedef unsigned char uint_fast8_t; +- +-#ifndef _UINTPTR_T_DEFINED +-typedef unsigned int uintptr_t; +-#endif +- +-#endif +- +-#endif +diff --git a/vpx_ports/vpx_timer.h b/vpx_ports/vpx_timer.h +index 5c04538..11fee84 100644 +--- a/vpx_ports/vpx_timer.h ++++ b/vpx_ports/vpx_timer.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_ports/vpxtypes.h b/vpx_ports/vpxtypes.h +index 86525b7..b9c8b8c 100644 +--- a/vpx_ports/vpxtypes.h ++++ b/vpx_ports/vpxtypes.h +@@ -1,19 +1,18 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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 __VPXTYPES_H__ + #define __VPXTYPES_H__ + +-#ifdef HAVE_CONFIG_H +-#include HAVE_CONFIG_H +-#endif ++#include "vpx_ports/config.h" + + //#include <sys/types.h> + #ifdef _MSC_VER +diff --git a/vpx_ports/x86.h b/vpx_ports/x86.h +index 935d037..8c23abd 100644 +--- a/vpx_ports/x86.h ++++ b/vpx_ports/x86.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_ports/x86_abi_support.asm b/vpx_ports/x86_abi_support.asm +index db8208f..a1622e6 100644 +--- a/vpx_ports/x86_abi_support.asm ++++ b/vpx_ports/x86_abi_support.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +@@ -198,22 +199,38 @@ + push r9 + %endif + %if %1 > 6 +- mov rax,[rbp+16] +- push rax +- %endif +- %if %1 > 7 +- mov rax,[rbp+24] +- push rax +- %endif +- %if %1 > 8 +- mov rax,[rbp+32] ++ %assign i %1-6 ++ %assign off 16 ++ %rep i ++ mov rax,[rbp+off] + push rax ++ %assign off off+8 ++ %endrep + %endif + %endm + %endif + %define UNSHADOW_ARGS mov rsp, rbp + %endif + ++; must keep XMM6:XMM15 (libvpx uses XMM6 and XMM7) on Win64 ABI ++; rsp register has to be aligned ++%ifidn __OUTPUT_FORMAT__,x64 ++%macro SAVE_XMM 0 ++ sub rsp, 32 ++ movdqa XMMWORD PTR [rsp], xmm6 ++ movdqa XMMWORD PTR [rsp+16], xmm7 ++%endmacro ++%macro RESTORE_XMM 0 ++ movdqa xmm6, XMMWORD PTR [rsp] ++ movdqa xmm7, XMMWORD PTR [rsp+16] ++ add rsp, 32 ++%endmacro ++%else ++%macro SAVE_XMM 0 ++%endmacro ++%macro RESTORE_XMM 0 ++%endmacro ++%endif + + ; Name of the rodata section + ; +@@ -229,3 +246,14 @@ fake_got: + %else + %define SECTION_RODATA section .rodata + %endif ++ ++ ++; Tell GNU ld that we don't require an executable stack. ++%ifidn __OUTPUT_FORMAT__,elf32 ++section .note.GNU-stack noalloc noexec nowrite progbits ++section .text ++%elifidn __OUTPUT_FORMAT__,elf64 ++section .note.GNU-stack noalloc noexec nowrite progbits ++section .text ++%endif ++ +diff --git a/vpx_scale/arm/armv4/gen_scalers_armv4.asm b/vpx_scale/arm/armv4/gen_scalers_armv4.asm +index 1c904ed..e317fe9 100644 +--- a/vpx_scale/arm/armv4/gen_scalers_armv4.asm ++++ b/vpx_scale/arm/armv4/gen_scalers_armv4.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vpx_scale/arm/nds/yv12extend.c b/vpx_scale/arm/nds/yv12extend.c +index 56959cb..9ec3466 100644 +--- a/vpx_scale/arm/nds/yv12extend.c ++++ b/vpx_scale/arm/nds/yv12extend.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_scale/arm/neon/vp8_vpxyv12_copyframe_func_neon.asm b/vpx_scale/arm/neon/vp8_vpxyv12_copyframe_func_neon.asm +index 26384c4..64e7bfe 100644 +--- a/vpx_scale/arm/neon/vp8_vpxyv12_copyframe_func_neon.asm ++++ b/vpx_scale/arm/neon/vp8_vpxyv12_copyframe_func_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vpx_scale/arm/neon/vp8_vpxyv12_copyframeyonly_neon.asm b/vpx_scale/arm/neon/vp8_vpxyv12_copyframeyonly_neon.asm +index a50ae60..f79de3c 100644 +--- a/vpx_scale/arm/neon/vp8_vpxyv12_copyframeyonly_neon.asm ++++ b/vpx_scale/arm/neon/vp8_vpxyv12_copyframeyonly_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vpx_scale/arm/neon/vp8_vpxyv12_copysrcframe_func_neon.asm b/vpx_scale/arm/neon/vp8_vpxyv12_copysrcframe_func_neon.asm +index c8923d5..2e24e24 100644 +--- a/vpx_scale/arm/neon/vp8_vpxyv12_copysrcframe_func_neon.asm ++++ b/vpx_scale/arm/neon/vp8_vpxyv12_copysrcframe_func_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vpx_scale/arm/neon/vp8_vpxyv12_extendframeborders_neon.asm b/vpx_scale/arm/neon/vp8_vpxyv12_extendframeborders_neon.asm +index 8c9ce19..418578f 100644 +--- a/vpx_scale/arm/neon/vp8_vpxyv12_extendframeborders_neon.asm ++++ b/vpx_scale/arm/neon/vp8_vpxyv12_extendframeborders_neon.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vpx_scale/arm/scalesystemdependant.c b/vpx_scale/arm/scalesystemdependant.c +index 3c355be..67954b2 100644 +--- a/vpx_scale/arm/scalesystemdependant.c ++++ b/vpx_scale/arm/scalesystemdependant.c +@@ -1,18 +1,17 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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_ports/config.h" + #include "vpx_scale/vpxscale.h" + +-#ifdef HAVE_CONFIG_H +-#include "vpx_config.h" +-#endif + + void (*vp8_yv12_extend_frame_borders_ptr)(YV12_BUFFER_CONFIG *ybf); + extern void vp8_yv12_extend_frame_borders(YV12_BUFFER_CONFIG *ybf); +diff --git a/vpx_scale/arm/yv12extend_arm.c b/vpx_scale/arm/yv12extend_arm.c +index 7c3f7cd..5069030 100644 +--- a/vpx_scale/arm/yv12extend_arm.c ++++ b/vpx_scale/arm/yv12extend_arm.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_scale/blackfin/yv12config.c b/vpx_scale/blackfin/yv12config.c +index 7cb083f..950a5d2 100644 +--- a/vpx_scale/blackfin/yv12config.c ++++ b/vpx_scale/blackfin/yv12config.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_scale/blackfin/yv12extend.c b/vpx_scale/blackfin/yv12extend.c +index d5be495..80504ef 100644 +--- a/vpx_scale/blackfin/yv12extend.c ++++ b/vpx_scale/blackfin/yv12extend.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_scale/dm642/bicubic_scaler_c64.c b/vpx_scale/dm642/bicubic_scaler_c64.c +index 9bd3797..e026be5 100644 +--- a/vpx_scale/dm642/bicubic_scaler_c64.c ++++ b/vpx_scale/dm642/bicubic_scaler_c64.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_scale/dm642/gen_scalers_c64.c b/vpx_scale/dm642/gen_scalers_c64.c +index 2126a75..34f95f7 100644 +--- a/vpx_scale/dm642/gen_scalers_c64.c ++++ b/vpx_scale/dm642/gen_scalers_c64.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_scale/dm642/yv12extend.c b/vpx_scale/dm642/yv12extend.c +index ca25a5f..2557a3a 100644 +--- a/vpx_scale/dm642/yv12extend.c ++++ b/vpx_scale/dm642/yv12extend.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_scale/generic/bicubic_scaler.c b/vpx_scale/generic/bicubic_scaler.c +index e3c2b4a..48f9096 100644 +--- a/vpx_scale/generic/bicubic_scaler.c ++++ b/vpx_scale/generic/bicubic_scaler.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_scale/generic/gen_scalers.c b/vpx_scale/generic/gen_scalers.c +index a5e545f..ff841f3 100644 +--- a/vpx_scale/generic/gen_scalers.c ++++ b/vpx_scale/generic/gen_scalers.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +@@ -936,12 +937,13 @@ void vp8cx_vertical_band_2_1_scale_c(unsigned char *source, unsigned int src_pit + + void vp8cx_vertical_band_2_1_scale_i_c(unsigned char *source, unsigned int src_pitch, unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width) + { +- unsigned int i; ++ int i; + int temp; ++ int width = dest_width; + + (void) dest_pitch; + +- for (i = 0; i < dest_width; i++) ++ for (i = 0; i < width; i++) + { + temp = 8; + temp += source[i-(int)src_pitch] * 3; +diff --git a/vpx_scale/generic/scalesystemdependant.c b/vpx_scale/generic/scalesystemdependant.c +index 28f5c72..7a24a26 100644 +--- a/vpx_scale/generic/scalesystemdependant.c ++++ b/vpx_scale/generic/scalesystemdependant.c +@@ -1,18 +1,17 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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_ports/config.h" + #include "vpx_scale/vpxscale.h" + +-#ifdef HAVE_CONFIG_H +-#include "vpx_config.h" +-#endif + + void (*vp8_yv12_extend_frame_borders_ptr)(YV12_BUFFER_CONFIG *ybf); + extern void vp8_yv12_extend_frame_borders(YV12_BUFFER_CONFIG *ybf); +diff --git a/vpx_scale/generic/vpxscale.c b/vpx_scale/generic/vpxscale.c +index 206cd55..8f8cfb5 100644 +--- a/vpx_scale/generic/vpxscale.c ++++ b/vpx_scale/generic/vpxscale.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_scale/generic/yv12config.c b/vpx_scale/generic/yv12config.c +index 04617be..008130b 100644 +--- a/vpx_scale/generic/yv12config.c ++++ b/vpx_scale/generic/yv12config.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_scale/generic/yv12extend.c b/vpx_scale/generic/yv12extend.c +index 4906625..907fa68 100644 +--- a/vpx_scale/generic/yv12extend.c ++++ b/vpx_scale/generic/yv12extend.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_scale/include/arm/vpxscale_nofp.h b/vpx_scale/include/arm/vpxscale_nofp.h +index d6181d2..39e3742 100644 +--- a/vpx_scale/include/arm/vpxscale_nofp.h ++++ b/vpx_scale/include/arm/vpxscale_nofp.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_scale/include/generic/vpxscale_arbitrary.h b/vpx_scale/include/generic/vpxscale_arbitrary.h +index 2b50f24..68b8fc0 100644 +--- a/vpx_scale/include/generic/vpxscale_arbitrary.h ++++ b/vpx_scale/include/generic/vpxscale_arbitrary.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_scale/include/generic/vpxscale_depricated.h b/vpx_scale/include/generic/vpxscale_depricated.h +index 015eed0..dbe7786 100644 +--- a/vpx_scale/include/generic/vpxscale_depricated.h ++++ b/vpx_scale/include/generic/vpxscale_depricated.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_scale/include/generic/vpxscale_nofp.h b/vpx_scale/include/generic/vpxscale_nofp.h +index c4d5f4c..97ea60e 100644 +--- a/vpx_scale/include/generic/vpxscale_nofp.h ++++ b/vpx_scale/include/generic/vpxscale_nofp.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_scale/include/leapster/vpxscale.h b/vpx_scale/include/leapster/vpxscale.h +index f70029c..a40f2eb 100644 +--- a/vpx_scale/include/leapster/vpxscale.h ++++ b/vpx_scale/include/leapster/vpxscale.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_scale/include/symbian/vpxscale_nofp.h b/vpx_scale/include/symbian/vpxscale_nofp.h +index d6181d2..39e3742 100644 +--- a/vpx_scale/include/symbian/vpxscale_nofp.h ++++ b/vpx_scale/include/symbian/vpxscale_nofp.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_scale/include/vpxscale_nofp.h b/vpx_scale/include/vpxscale_nofp.h +index f6482f9..f39a1c6 100644 +--- a/vpx_scale/include/vpxscale_nofp.h ++++ b/vpx_scale/include/vpxscale_nofp.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_scale/intel_linux/scaleopt.c b/vpx_scale/intel_linux/scaleopt.c +index 6555600..1bdb488 100644 +--- a/vpx_scale/intel_linux/scaleopt.c ++++ b/vpx_scale/intel_linux/scaleopt.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_scale/intel_linux/scalesystemdependant.c b/vpx_scale/intel_linux/scalesystemdependant.c +index 9ed48bf..82b90c9 100644 +--- a/vpx_scale/intel_linux/scalesystemdependant.c ++++ b/vpx_scale/intel_linux/scalesystemdependant.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_scale/leapster/doptsystemdependant_lf.c b/vpx_scale/leapster/doptsystemdependant_lf.c +index ca13167..f4ccb16 100644 +--- a/vpx_scale/leapster/doptsystemdependant_lf.c ++++ b/vpx_scale/leapster/doptsystemdependant_lf.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_scale/leapster/gen_scalers_lf.c b/vpx_scale/leapster/gen_scalers_lf.c +index 1b9c7c7..f9a11fe 100644 +--- a/vpx_scale/leapster/gen_scalers_lf.c ++++ b/vpx_scale/leapster/gen_scalers_lf.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_scale/leapster/vpxscale_lf.c b/vpx_scale/leapster/vpxscale_lf.c +index 5f05e5d..deabd98 100644 +--- a/vpx_scale/leapster/vpxscale_lf.c ++++ b/vpx_scale/leapster/vpxscale_lf.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_scale/leapster/yv12extend.c b/vpx_scale/leapster/yv12extend.c +index 480d971..5a89c31 100644 +--- a/vpx_scale/leapster/yv12extend.c ++++ b/vpx_scale/leapster/yv12extend.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_scale/scale_mode.h b/vpx_scale/scale_mode.h +index 2a9ab76..41aefa2 100644 +--- a/vpx_scale/scale_mode.h ++++ b/vpx_scale/scale_mode.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_scale/symbian/gen_scalers_armv4.asm b/vpx_scale/symbian/gen_scalers_armv4.asm +index 1c904ed..e317fe9 100644 +--- a/vpx_scale/symbian/gen_scalers_armv4.asm ++++ b/vpx_scale/symbian/gen_scalers_armv4.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vpx_scale/symbian/scalesystemdependant.c b/vpx_scale/symbian/scalesystemdependant.c +index a2acc3e..75ef26d 100644 +--- a/vpx_scale/symbian/scalesystemdependant.c ++++ b/vpx_scale/symbian/scalesystemdependant.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_scale/vpxscale.h b/vpx_scale/vpxscale.h +index 9a86b75..f3057fe 100644 +--- a/vpx_scale/vpxscale.h ++++ b/vpx_scale/vpxscale.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_scale/wce/gen_scalers_armv4.asm b/vpx_scale/wce/gen_scalers_armv4.asm +index 1c904ed..e317fe9 100644 +--- a/vpx_scale/wce/gen_scalers_armv4.asm ++++ b/vpx_scale/wce/gen_scalers_armv4.asm +@@ -1,10 +1,11 @@ + ; + ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + ; +-; Use of this source code is governed by a BSD-style license and patent +-; grant that can be found in the LICENSE file in the root of the source +-; tree. All contributing project authors may be found in the AUTHORS +-; file in the root of the source tree. ++; 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. + ; + + +diff --git a/vpx_scale/wce/scalesystemdependant.c b/vpx_scale/wce/scalesystemdependant.c +index a5a6a52..1d62eb5 100644 +--- a/vpx_scale/wce/scalesystemdependant.c ++++ b/vpx_scale/wce/scalesystemdependant.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_scale/win32/scaleopt.c b/vpx_scale/win32/scaleopt.c +index da0533e..59d49e6 100644 +--- a/vpx_scale/win32/scaleopt.c ++++ b/vpx_scale/win32/scaleopt.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_scale/win32/scalesystemdependant.c b/vpx_scale/win32/scalesystemdependant.c +index 9ed48bf..82b90c9 100644 +--- a/vpx_scale/win32/scalesystemdependant.c ++++ b/vpx_scale/win32/scalesystemdependant.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_scale/x86_64/scaleopt.c b/vpx_scale/x86_64/scaleopt.c +index 3d2d5f2..de4c478 100644 +--- a/vpx_scale/x86_64/scaleopt.c ++++ b/vpx_scale/x86_64/scaleopt.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_scale/x86_64/scalesystemdependant.c b/vpx_scale/x86_64/scalesystemdependant.c +index 43f05a6..0324449 100644 +--- a/vpx_scale/x86_64/scalesystemdependant.c ++++ b/vpx_scale/x86_64/scalesystemdependant.c +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_scale/yv12config.h b/vpx_scale/yv12config.h +index a8d0ce4..f01bd78 100644 +--- a/vpx_scale/yv12config.h ++++ b/vpx_scale/yv12config.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/vpx_scale/yv12extend.h b/vpx_scale/yv12extend.h +index 9968fea..b310ef5 100644 +--- a/vpx_scale/yv12extend.h ++++ b/vpx_scale/yv12extend.h +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/wince_wmain_adapter.cpp b/wince_wmain_adapter.cpp +index db2119c..48d3ab3 100644 +--- a/wince_wmain_adapter.cpp ++++ b/wince_wmain_adapter.cpp +@@ -1,10 +1,11 @@ + /* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * +- * Use of this source code is governed by a BSD-style license and patent +- * grant that can be found in the LICENSE file in the root of the source +- * tree. All contributing project authors may be found in the AUTHORS +- * file in the root of the source tree. ++ * 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. + */ + + +diff --git a/y4minput.c b/y4minput.c +new file mode 100644 +index 0000000..895226d +--- /dev/null ++++ b/y4minput.c +@@ -0,0 +1,881 @@ ++/* ++ * Copyright (c) 2010 The VP8 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. ++ * ++ * Based on code from the OggTheora software codec source code, ++ * Copyright (C) 2002-2010 The Xiph.Org Foundation and contributors. ++ */ ++#include <stdlib.h> ++#include <string.h> ++#include "y4minput.h" ++ ++static int y4m_parse_tags(y4m_input *_y4m,char *_tags){ ++ int got_w; ++ int got_h; ++ int got_fps; ++ int got_interlace; ++ int got_par; ++ int got_chroma; ++ char *p; ++ char *q; ++ got_w=got_h=got_fps=got_interlace=got_par=got_chroma=0; ++ for(p=_tags;;p=q){ ++ /*Skip any leading spaces.*/ ++ while(*p==' ')p++; ++ /*If that's all we have, stop.*/ ++ if(p[0]=='\0')break; ++ /*Find the end of this tag.*/ ++ for(q=p+1;*q!='\0'&&*q!=' ';q++); ++ /*Process the tag.*/ ++ switch(p[0]){ ++ case 'W':{ ++ if(sscanf(p+1,"%d",&_y4m->pic_w)!=1)return -1; ++ got_w=1; ++ }break; ++ case 'H':{ ++ if(sscanf(p+1,"%d",&_y4m->pic_h)!=1)return -1; ++ got_h=1; ++ }break; ++ case 'F':{ ++ if(sscanf(p+1,"%d:%d",&_y4m->fps_n,&_y4m->fps_d)!=2){ ++ return -1; ++ } ++ got_fps=1; ++ }break; ++ case 'I':{ ++ _y4m->interlace=p[1]; ++ got_interlace=1; ++ }break; ++ case 'A':{ ++ if(sscanf(p+1,"%d:%d",&_y4m->par_n,&_y4m->par_d)!=2){ ++ return -1; ++ } ++ got_par=1; ++ }break; ++ case 'C':{ ++ if(q-p>16)return -1; ++ memcpy(_y4m->chroma_type,p+1,q-p-1); ++ _y4m->chroma_type[q-p-1]='\0'; ++ got_chroma=1; ++ }break; ++ /*Ignore unknown tags.*/ ++ } ++ } ++ if(!got_w||!got_h||!got_fps)return -1; ++ if(!got_interlace)_y4m->interlace='?'; ++ if(!got_par)_y4m->par_n=_y4m->par_d=0; ++ /*Chroma-type is not specified in older files, e.g., those generated by ++ mplayer.*/ ++ if(!got_chroma)strcpy(_y4m->chroma_type,"420"); ++ return 0; ++} ++ ++ ++ ++/*All anti-aliasing filters in the following conversion functions are based on ++ one of two window functions: ++ The 6-tap Lanczos window (for down-sampling and shifts): ++ sinc(\pi*t)*sinc(\pi*t/3), |t|<3 (sinc(t)==sin(t)/t) ++ 0, |t|>=3 ++ The 4-tap Mitchell window (for up-sampling): ++ 7|t|^3-12|t|^2+16/3, |t|<1 ++ -(7/3)|x|^3+12|x|^2-20|x|+32/3, |t|<2 ++ 0, |t|>=2 ++ The number of taps is intentionally kept small to reduce computational ++ overhead and limit ringing. ++ ++ The taps from these filters are scaled so that their sum is 1, and the result ++ is scaled by 128 and rounded to integers to create a filter whose ++ intermediate values fit inside 16 bits. ++ Coefficients are rounded in such a way as to ensure their sum is still 128, ++ which is usually equivalent to normal rounding. ++ ++ Conversions which require both horizontal and vertical filtering could ++ have these steps pipelined, for less memory consumption and better cache ++ performance, but we do them separately for simplicity.*/ ++ ++#define OC_MINI(_a,_b) ((_a)>(_b)?(_b):(_a)) ++#define OC_MAXI(_a,_b) ((_a)<(_b)?(_b):(_a)) ++#define OC_CLAMPI(_a,_b,_c) (OC_MAXI(_a,OC_MINI(_b,_c))) ++ ++/*420jpeg chroma samples are sited like: ++ Y-------Y-------Y-------Y------- ++ | | | | ++ | BR | | BR | ++ | | | | ++ Y-------Y-------Y-------Y------- ++ | | | | ++ | | | | ++ | | | | ++ Y-------Y-------Y-------Y------- ++ | | | | ++ | BR | | BR | ++ | | | | ++ Y-------Y-------Y-------Y------- ++ | | | | ++ | | | | ++ | | | | ++ ++ 420mpeg2 chroma samples are sited like: ++ Y-------Y-------Y-------Y------- ++ | | | | ++ BR | BR | ++ | | | | ++ Y-------Y-------Y-------Y------- ++ | | | | ++ | | | | ++ | | | | ++ Y-------Y-------Y-------Y------- ++ | | | | ++ BR | BR | ++ | | | | ++ Y-------Y-------Y-------Y------- ++ | | | | ++ | | | | ++ | | | | ++ ++ We use a resampling filter to shift the site locations one quarter pixel (at ++ the chroma plane's resolution) to the right. ++ The 4:2:2 modes look exactly the same, except there are twice as many chroma ++ lines, and they are vertically co-sited with the luma samples in both the ++ mpeg2 and jpeg cases (thus requiring no vertical resampling).*/ ++static void y4m_42xmpeg2_42xjpeg_helper(unsigned char *_dst, ++ const unsigned char *_src,int _c_w,int _c_h){ ++ int pli; ++ int y; ++ int x; ++ for(y=0;y<_c_h;y++){ ++ /*Filter: [4 -17 114 35 -9 1]/128, derived from a 6-tap Lanczos ++ window.*/ ++ for(x=0;x<OC_MINI(_c_w,2);x++){ ++ _dst[x]=(unsigned char)OC_CLAMPI(0,(4*_src[0]-17*_src[OC_MAXI(x-1,0)]+ ++ 114*_src[x]+35*_src[OC_MINI(x+1,_c_w-1)]-9*_src[OC_MINI(x+2,_c_w-1)]+ ++ _src[OC_MINI(x+3,_c_w-1)]+64)>>7,255); ++ } ++ for(;x<_c_w-3;x++){ ++ _dst[x]=(unsigned char)OC_CLAMPI(0,(4*_src[x-2]-17*_src[x-1]+ ++ 114*_src[x]+35*_src[x+1]-9*_src[x+2]+_src[x+3]+64)>>7,255); ++ } ++ for(;x<_c_w;x++){ ++ _dst[x]=(unsigned char)OC_CLAMPI(0,(4*_src[x-2]-17*_src[x-1]+ ++ 114*_src[x]+35*_src[OC_MINI(x+1,_c_w-1)]-9*_src[OC_MINI(x+2,_c_w-1)]+ ++ _src[_c_w-1]+64)>>7,255); ++ } ++ _dst+=_c_w; ++ _src+=_c_w; ++ } ++} ++ ++/*Handles both 422 and 420mpeg2 to 422jpeg and 420jpeg, respectively.*/ ++static void y4m_convert_42xmpeg2_42xjpeg(y4m_input *_y4m,unsigned char *_dst, ++ unsigned char *_aux){ ++ int c_w; ++ int c_h; ++ int c_sz; ++ int pli; ++ int y; ++ int x; ++ /*Skip past the luma data.*/ ++ _dst+=_y4m->pic_w*_y4m->pic_h; ++ /*Compute the size of each chroma plane.*/ ++ c_w=(_y4m->pic_w+_y4m->dst_c_dec_h-1)/_y4m->dst_c_dec_h; ++ c_h=(_y4m->pic_h+_y4m->dst_c_dec_v-1)/_y4m->dst_c_dec_v; ++ c_sz=c_w*c_h; ++ for(pli=1;pli<3;pli++){ ++ y4m_42xmpeg2_42xjpeg_helper(_dst,_aux,c_w,c_h); ++ _dst+=c_sz; ++ _aux+=c_sz; ++ } ++} ++ ++/*This format is only used for interlaced content, but is included for ++ completeness. ++ ++ 420jpeg chroma samples are sited like: ++ Y-------Y-------Y-------Y------- ++ | | | | ++ | BR | | BR | ++ | | | | ++ Y-------Y-------Y-------Y------- ++ | | | | ++ | | | | ++ | | | | ++ Y-------Y-------Y-------Y------- ++ | | | | ++ | BR | | BR | ++ | | | | ++ Y-------Y-------Y-------Y------- ++ | | | | ++ | | | | ++ | | | | ++ ++ 420paldv chroma samples are sited like: ++ YR------Y-------YR------Y------- ++ | | | | ++ | | | | ++ | | | | ++ YB------Y-------YB------Y------- ++ | | | | ++ | | | | ++ | | | | ++ YR------Y-------YR------Y------- ++ | | | | ++ | | | | ++ | | | | ++ YB------Y-------YB------Y------- ++ | | | | ++ | | | | ++ | | | | ++ ++ We use a resampling filter to shift the site locations one quarter pixel (at ++ the chroma plane's resolution) to the right. ++ Then we use another filter to move the C_r location down one quarter pixel, ++ and the C_b location up one quarter pixel.*/ ++static void y4m_convert_42xpaldv_42xjpeg(y4m_input *_y4m,unsigned char *_dst, ++ unsigned char *_aux){ ++ unsigned char *tmp; ++ int c_w; ++ int c_h; ++ int c_sz; ++ int pli; ++ int y; ++ int x; ++ /*Skip past the luma data.*/ ++ _dst+=_y4m->pic_w*_y4m->pic_h; ++ /*Compute the size of each chroma plane.*/ ++ c_w=(_y4m->pic_w+1)/2; ++ c_h=(_y4m->pic_h+_y4m->dst_c_dec_h-1)/_y4m->dst_c_dec_h; ++ c_sz=c_w*c_h; ++ tmp=_aux+2*c_sz; ++ for(pli=1;pli<3;pli++){ ++ /*First do the horizontal re-sampling. ++ This is the same as the mpeg2 case, except that after the horizontal ++ case, we need to apply a second vertical filter.*/ ++ y4m_42xmpeg2_42xjpeg_helper(tmp,_aux,c_w,c_h); ++ _aux+=c_sz; ++ switch(pli){ ++ case 1:{ ++ /*Slide C_b up a quarter-pel. ++ This is the same filter used above, but in the other order.*/ ++ for(x=0;x<c_w;x++){ ++ for(y=0;y<OC_MINI(c_h,3);y++){ ++ _dst[y*c_w]=(unsigned char)OC_CLAMPI(0,(tmp[0] ++ -9*tmp[OC_MAXI(y-2,0)*c_w]+35*tmp[OC_MAXI(y-1,0)*c_w] ++ +114*tmp[y*c_w]-17*tmp[OC_MINI(y+1,c_h-1)*c_w] ++ +4*tmp[OC_MINI(y+2,c_h-1)*c_w]+64)>>7,255); ++ } ++ for(;y<c_h-2;y++){ ++ _dst[y*c_w]=(unsigned char)OC_CLAMPI(0,(tmp[(y-3)*c_w] ++ -9*tmp[(y-2)*c_w]+35*tmp[(y-1)*c_w]+114*tmp[y*c_w] ++ -17*tmp[(y+1)*c_w]+4*tmp[(y+2)*c_w]+64)>>7,255); ++ } ++ for(;y<c_h;y++){ ++ _dst[y*c_w]=(unsigned char)OC_CLAMPI(0,(tmp[(y-3)*c_w] ++ -9*tmp[(y-2)*c_w]+35*tmp[(y-1)*c_w]+114*tmp[y*c_w] ++ -17*tmp[OC_MINI(y+1,c_h-1)*c_w]+4*tmp[(c_h-1)*c_w]+64)>>7,255); ++ } ++ _dst++; ++ tmp++; ++ } ++ _dst+=c_sz-c_w; ++ tmp-=c_w; ++ }break; ++ case 2:{ ++ /*Slide C_r down a quarter-pel. ++ This is the same as the horizontal filter.*/ ++ for(x=0;x<c_w;x++){ ++ for(y=0;y<OC_MINI(c_h,2);y++){ ++ _dst[y*c_w]=(unsigned char)OC_CLAMPI(0,(4*tmp[0] ++ -17*tmp[OC_MAXI(y-1,0)*c_w]+114*tmp[y*c_w] ++ +35*tmp[OC_MINI(y+1,c_h-1)*c_w]-9*tmp[OC_MINI(y+2,c_h-1)*c_w] ++ +tmp[OC_MINI(y+3,c_h-1)*c_w]+64)>>7,255); ++ } ++ for(;y<c_h-3;y++){ ++ _dst[y*c_w]=(unsigned char)OC_CLAMPI(0,(4*tmp[(y-2)*c_w] ++ -17*tmp[(y-1)*c_w]+114*tmp[y*c_w]+35*tmp[(y+1)*c_w] ++ -9*tmp[(y+2)*c_w]+tmp[(y+3)*c_w]+64)>>7,255); ++ } ++ for(;y<c_h;y++){ ++ _dst[y*c_w]=(unsigned char)OC_CLAMPI(0,(4*tmp[(y-2)*c_w] ++ -17*tmp[(y-1)*c_w]+114*tmp[y*c_w]+35*tmp[OC_MINI(y+1,c_h-1)*c_w] ++ -9*tmp[OC_MINI(y+2,c_h-1)*c_w]+tmp[(c_h-1)*c_w]+64)>>7,255); ++ } ++ _dst++; ++ tmp++; ++ } ++ }break; ++ } ++ /*For actual interlaced material, this would have to be done separately on ++ each field, and the shift amounts would be different. ++ C_r moves down 1/8, C_b up 3/8 in the top field, and C_r moves down 3/8, ++ C_b up 1/8 in the bottom field. ++ The corresponding filters would be: ++ Down 1/8 (reverse order for up): [3 -11 125 15 -4 0]/128 ++ Down 3/8 (reverse order for up): [4 -19 98 56 -13 2]/128*/ ++ } ++} ++ ++/*Perform vertical filtering to reduce a single plane from 4:2:2 to 4:2:0. ++ This is used as a helper by several converation routines.*/ ++static void y4m_422jpeg_420jpeg_helper(unsigned char *_dst, ++ const unsigned char *_src,int _c_w,int _c_h){ ++ int y; ++ int x; ++ /*Filter: [3 -17 78 78 -17 3]/128, derived from a 6-tap Lanczos window.*/ ++ for(x=0;x<_c_w;x++){ ++ for(y=0;y<OC_MINI(_c_h,2);y+=2){ ++ _dst[(y>>1)*_c_w]=OC_CLAMPI(0,(64*_src[0] ++ +78*_src[OC_MINI(1,_c_h-1)*_c_w] ++ -17*_src[OC_MINI(2,_c_h-1)*_c_w] ++ +3*_src[OC_MINI(3,_c_h-1)*_c_w]+64)>>7,255); ++ } ++ for(;y<_c_h-3;y+=2){ ++ _dst[(y>>1)*_c_w]=OC_CLAMPI(0,(3*(_src[(y-2)*_c_w]+_src[(y+3)*_c_w]) ++ -17*(_src[(y-1)*_c_w]+_src[(y+2)*_c_w]) ++ +78*(_src[y*_c_w]+_src[(y+1)*_c_w])+64)>>7,255); ++ } ++ for(;y<_c_h;y+=2){ ++ _dst[(y>>1)*_c_w]=OC_CLAMPI(0,(3*(_src[(y-2)*_c_w] ++ +_src[(_c_h-1)*_c_w])-17*(_src[(y-1)*_c_w] ++ +_src[OC_MINI(y+2,_c_h-1)*_c_w]) ++ +78*(_src[y*_c_w]+_src[OC_MINI(y+1,_c_h-1)*_c_w])+64)>>7,255); ++ } ++ _src++; ++ _dst++; ++ } ++} ++ ++/*420jpeg chroma samples are sited like: ++ Y-------Y-------Y-------Y------- ++ | | | | ++ | BR | | BR | ++ | | | | ++ Y-------Y-------Y-------Y------- ++ | | | | ++ | | | | ++ | | | | ++ Y-------Y-------Y-------Y------- ++ | | | | ++ | BR | | BR | ++ | | | | ++ Y-------Y-------Y-------Y------- ++ | | | | ++ | | | | ++ | | | | ++ ++ 422jpeg chroma samples are sited like: ++ Y---BR--Y-------Y---BR--Y------- ++ | | | | ++ | | | | ++ | | | | ++ Y---BR--Y-------Y---BR--Y------- ++ | | | | ++ | | | | ++ | | | | ++ Y---BR--Y-------Y---BR--Y------- ++ | | | | ++ | | | | ++ | | | | ++ Y---BR--Y-------Y---BR--Y------- ++ | | | | ++ | | | | ++ | | | | ++ ++ We use a resampling filter to decimate the chroma planes by two in the ++ vertical direction.*/ ++static void y4m_convert_422jpeg_420jpeg(y4m_input *_y4m,unsigned char *_dst, ++ unsigned char *_aux){ ++ int c_w; ++ int c_h; ++ int c_sz; ++ int dst_c_w; ++ int dst_c_h; ++ int dst_c_sz; ++ int tmp_sz; ++ int pic_sz; ++ int pli; ++ /*Skip past the luma data.*/ ++ _dst+=_y4m->pic_w*_y4m->pic_h; ++ /*Compute the size of each chroma plane.*/ ++ c_w=(_y4m->pic_w+_y4m->src_c_dec_h-1)/_y4m->src_c_dec_h; ++ c_h=_y4m->pic_h; ++ dst_c_w=(_y4m->pic_w+_y4m->dst_c_dec_h-1)/_y4m->dst_c_dec_h; ++ dst_c_h=(_y4m->pic_h+_y4m->dst_c_dec_v-1)/_y4m->dst_c_dec_v; ++ c_sz=c_w*c_h; ++ dst_c_sz=dst_c_w*dst_c_h; ++ for(pli=1;pli<3;pli++){ ++ y4m_422jpeg_420jpeg_helper(_dst,_aux,c_w,c_h); ++ _aux+=c_sz; ++ _dst+=dst_c_sz; ++ } ++} ++ ++/*420jpeg chroma samples are sited like: ++ Y-------Y-------Y-------Y------- ++ | | | | ++ | BR | | BR | ++ | | | | ++ Y-------Y-------Y-------Y------- ++ | | | | ++ | | | | ++ | | | | ++ Y-------Y-------Y-------Y------- ++ | | | | ++ | BR | | BR | ++ | | | | ++ Y-------Y-------Y-------Y------- ++ | | | | ++ | | | | ++ | | | | ++ ++ 422 chroma samples are sited like: ++ YBR-----Y-------YBR-----Y------- ++ | | | | ++ | | | | ++ | | | | ++ YBR-----Y-------YBR-----Y------- ++ | | | | ++ | | | | ++ | | | | ++ YBR-----Y-------YBR-----Y------- ++ | | | | ++ | | | | ++ | | | | ++ YBR-----Y-------YBR-----Y------- ++ | | | | ++ | | | | ++ | | | | ++ ++ We use a resampling filter to shift the original site locations one quarter ++ pixel (at the original chroma resolution) to the right. ++ Then we use a second resampling filter to decimate the chroma planes by two ++ in the vertical direction.*/ ++static void y4m_convert_422_420jpeg(y4m_input *_y4m,unsigned char *_dst, ++ unsigned char *_aux){ ++ unsigned char *tmp; ++ int c_w; ++ int c_h; ++ int c_sz; ++ int dst_c_w; ++ int dst_c_h; ++ int dst_c_sz; ++ int pli; ++ int y; ++ int x; ++ /*Skip past the luma data.*/ ++ _dst+=_y4m->pic_w*_y4m->pic_h; ++ /*Compute the size of each chroma plane.*/ ++ c_w=(_y4m->pic_w+_y4m->src_c_dec_h-1)/_y4m->src_c_dec_h; ++ c_h=_y4m->pic_h; ++ dst_c_h=(_y4m->pic_h+_y4m->dst_c_dec_v-1)/_y4m->dst_c_dec_v; ++ c_sz=c_w*c_h; ++ dst_c_sz=c_w*dst_c_h; ++ tmp=_aux+2*c_sz; ++ for(pli=1;pli<3;pli++){ ++ /*In reality, the horizontal and vertical steps could be pipelined, for ++ less memory consumption and better cache performance, but we do them ++ separately for simplicity.*/ ++ /*First do horizontal filtering (convert to 422jpeg)*/ ++ y4m_42xmpeg2_42xjpeg_helper(tmp,_aux,c_w,c_h); ++ /*Now do the vertical filtering.*/ ++ y4m_422jpeg_420jpeg_helper(_dst,tmp,c_w,c_h); ++ _aux+=c_sz; ++ _dst+=dst_c_sz; ++ } ++} ++ ++/*420jpeg chroma samples are sited like: ++ Y-------Y-------Y-------Y------- ++ | | | | ++ | BR | | BR | ++ | | | | ++ Y-------Y-------Y-------Y------- ++ | | | | ++ | | | | ++ | | | | ++ Y-------Y-------Y-------Y------- ++ | | | | ++ | BR | | BR | ++ | | | | ++ Y-------Y-------Y-------Y------- ++ | | | | ++ | | | | ++ | | | | ++ ++ 411 chroma samples are sited like: ++ YBR-----Y-------Y-------Y------- ++ | | | | ++ | | | | ++ | | | | ++ YBR-----Y-------Y-------Y------- ++ | | | | ++ | | | | ++ | | | | ++ YBR-----Y-------Y-------Y------- ++ | | | | ++ | | | | ++ | | | | ++ YBR-----Y-------Y-------Y------- ++ | | | | ++ | | | | ++ | | | | ++ ++ We use a filter to resample at site locations one eighth pixel (at the source ++ chroma plane's horizontal resolution) and five eighths of a pixel to the ++ right. ++ Then we use another filter to decimate the planes by 2 in the vertical ++ direction.*/ ++static void y4m_convert_411_420jpeg(y4m_input *_y4m,unsigned char *_dst, ++ unsigned char *_aux){ ++ unsigned char *tmp; ++ int c_w; ++ int c_h; ++ int c_sz; ++ int dst_c_w; ++ int dst_c_h; ++ int dst_c_sz; ++ int tmp_sz; ++ int pli; ++ int y; ++ int x; ++ /*Skip past the luma data.*/ ++ _dst+=_y4m->pic_w*_y4m->pic_h; ++ /*Compute the size of each chroma plane.*/ ++ c_w=(_y4m->pic_w+_y4m->src_c_dec_h-1)/_y4m->src_c_dec_h; ++ c_h=_y4m->pic_h; ++ dst_c_w=(_y4m->pic_w+_y4m->dst_c_dec_h-1)/_y4m->dst_c_dec_h; ++ dst_c_h=(_y4m->pic_h+_y4m->dst_c_dec_v-1)/_y4m->dst_c_dec_v; ++ c_sz=c_w*c_h; ++ dst_c_sz=dst_c_w*dst_c_h; ++ tmp_sz=dst_c_w*c_h; ++ tmp=_aux+2*c_sz; ++ for(pli=1;pli<3;pli++){ ++ /*In reality, the horizontal and vertical steps could be pipelined, for ++ less memory consumption and better cache performance, but we do them ++ separately for simplicity.*/ ++ /*First do horizontal filtering (convert to 422jpeg)*/ ++ for(y=0;y<c_h;y++){ ++ /*Filters: [1 110 18 -1]/128 and [-3 50 86 -5]/128, both derived from a ++ 4-tap Mitchell window.*/ ++ for(x=0;x<OC_MINI(c_w,1);x++){ ++ tmp[x<<1]=(unsigned char)OC_CLAMPI(0,(111*_aux[0] ++ +18*_aux[OC_MINI(1,c_w-1)]-_aux[OC_MINI(2,c_w-1)]+64)>>7,255); ++ tmp[x<<1|1]=(unsigned char)OC_CLAMPI(0,(47*_aux[0] ++ +86*_aux[OC_MINI(1,c_w-1)]-5*_aux[OC_MINI(2,c_w-1)]+64)>>7,255); ++ } ++ for(;x<c_w-2;x++){ ++ tmp[x<<1]=(unsigned char)OC_CLAMPI(0,(_aux[x-1]+110*_aux[x] ++ +18*_aux[x+1]-_aux[x+2]+64)>>7,255); ++ tmp[x<<1|1]=(unsigned char)OC_CLAMPI(0,(-3*_aux[x-1]+50*_aux[x] ++ +86*_aux[x+1]-5*_aux[x+2]+64)>>7,255); ++ } ++ for(;x<c_w;x++){ ++ tmp[x<<1]=(unsigned char)OC_CLAMPI(0,(_aux[x-1]+110*_aux[x] ++ +18*_aux[OC_MINI(x+1,c_w-1)]-_aux[c_w-1]+64)>>7,255); ++ if((x<<1|1)<dst_c_w){ ++ tmp[x<<1|1]=(unsigned char)OC_CLAMPI(0,(-3*_aux[x-1]+50*_aux[x] ++ +86*_aux[OC_MINI(x+1,c_w-1)]-5*_aux[c_w-1]+64)>>7,255); ++ } ++ } ++ tmp+=dst_c_w; ++ _aux+=c_w; ++ } ++ tmp-=tmp_sz; ++ /*Now do the vertical filtering.*/ ++ y4m_422jpeg_420jpeg_helper(_dst,tmp,dst_c_w,c_h); ++ _dst+=dst_c_sz; ++ } ++} ++ ++/*Convert 444 to 420jpeg.*/ ++static void y4m_convert_444_420jpeg(y4m_input *_y4m,unsigned char *_dst, ++ unsigned char *_aux){ ++ unsigned char *tmp; ++ int c_w; ++ int c_h; ++ int c_sz; ++ int dst_c_w; ++ int dst_c_h; ++ int dst_c_sz; ++ int tmp_sz; ++ int pli; ++ int y; ++ int x; ++ /*Skip past the luma data.*/ ++ _dst+=_y4m->pic_w*_y4m->pic_h; ++ /*Compute the size of each chroma plane.*/ ++ c_w=(_y4m->pic_w+_y4m->src_c_dec_h-1)/_y4m->src_c_dec_h; ++ c_h=_y4m->pic_h; ++ dst_c_w=(_y4m->pic_w+_y4m->dst_c_dec_h-1)/_y4m->dst_c_dec_h; ++ dst_c_h=(_y4m->pic_h+_y4m->dst_c_dec_v-1)/_y4m->dst_c_dec_v; ++ c_sz=c_w*c_h; ++ dst_c_sz=dst_c_w*dst_c_h; ++ tmp_sz=dst_c_w*c_h; ++ tmp=_aux+2*c_sz; ++ for(pli=1;pli<3;pli++){ ++ /*Filter: [3 -17 78 78 -17 3]/128, derived from a 6-tap Lanczos window.*/ ++ for(y=0;y<c_h;y++){ ++ for(x=0;x<OC_MINI(c_w,2);x+=2){ ++ tmp[x>>1]=OC_CLAMPI(0,(64*_aux[0]+78*_aux[OC_MINI(1,c_w-1)] ++ -17*_aux[OC_MINI(2,c_w-1)] ++ +3*_aux[OC_MINI(3,c_w-1)]+64)>>7,255); ++ } ++ for(;x<c_w-3;x+=2){ ++ tmp[x>>1]=OC_CLAMPI(0,(3*(_aux[x-2]+_aux[x+3]) ++ -17*(_aux[x-1]+_aux[x+2])+78*(_aux[x]+_aux[x+1])+64)>>7,255); ++ } ++ for(;x<c_w;x+=2){ ++ tmp[x>>1]=OC_CLAMPI(0,(3*(_aux[x-2]+_aux[c_w-1])- ++ 17*(_aux[x-1]+_aux[OC_MINI(x+2,c_w-1)])+ ++ 78*(_aux[x]+_aux[OC_MINI(x+1,c_w-1)])+64)>>7,255); ++ } ++ tmp+=dst_c_w; ++ _aux+=c_w; ++ } ++ tmp-=tmp_sz; ++ /*Now do the vertical filtering.*/ ++ y4m_422jpeg_420jpeg_helper(_dst,tmp,dst_c_w,c_h); ++ _dst+=dst_c_sz; ++ } ++} ++ ++/*The image is padded with empty chroma components at 4:2:0.*/ ++static void y4m_convert_mono_420jpeg(y4m_input *_y4m,unsigned char *_dst, ++ unsigned char *_aux){ ++ int c_sz; ++ _dst+=_y4m->pic_w*_y4m->pic_h; ++ c_sz=((_y4m->pic_w+_y4m->dst_c_dec_h-1)/_y4m->dst_c_dec_h)* ++ ((_y4m->pic_h+_y4m->dst_c_dec_v-1)/_y4m->dst_c_dec_v); ++ memset(_dst,128,c_sz*2); ++} ++ ++/*No conversion function needed.*/ ++static void y4m_convert_null(y4m_input *_y4m,unsigned char *_dst, ++ unsigned char *_aux){ ++} ++ ++int y4m_input_open(y4m_input *_y4m,FILE *_fin,char *_skip,int _nskip){ ++ char buffer[80]; ++ int ret; ++ int i; ++ /*Read until newline, or 80 cols, whichever happens first.*/ ++ for(i=0;i<79;i++){ ++ if(_nskip>0){ ++ buffer[i]=*_skip++; ++ _nskip--; ++ } ++ else{ ++ ret=fread(buffer+i,1,1,_fin); ++ if(ret<1)return -1; ++ } ++ if(buffer[i]=='\n')break; ++ } ++ /*We skipped too much header data.*/ ++ if(_nskip>0)return -1; ++ if(i==79){ ++ fprintf(stderr,"Error parsing header; not a YUV2MPEG2 file?\n"); ++ return -1; ++ } ++ buffer[i]='\0'; ++ if(memcmp(buffer,"YUV4MPEG",8)){ ++ fprintf(stderr,"Incomplete magic for YUV4MPEG file.\n"); ++ return -1; ++ } ++ if(buffer[8]!='2'){ ++ fprintf(stderr,"Incorrect YUV input file version; YUV4MPEG2 required.\n"); ++ } ++ ret=y4m_parse_tags(_y4m,buffer+5); ++ if(ret<0){ ++ fprintf(stderr,"Error parsing YUV4MPEG2 header.\n"); ++ return ret; ++ } ++ if(_y4m->interlace=='?'){ ++ fprintf(stderr,"Warning: Input video interlacing format unknown; " ++ "assuming progressive scan.\n"); ++ } ++ else if(_y4m->interlace!='p'){ ++ fprintf(stderr,"Input video is interlaced; " ++ "Only progressive scan handled.\n"); ++ return -1; ++ } ++ if(strcmp(_y4m->chroma_type,"420")==0|| ++ strcmp(_y4m->chroma_type,"420jpeg")==0){ ++ _y4m->src_c_dec_h=_y4m->dst_c_dec_h=_y4m->src_c_dec_v=_y4m->dst_c_dec_v=2; ++ _y4m->dst_buf_read_sz=_y4m->pic_w*_y4m->pic_h ++ +2*((_y4m->pic_w+1)/2)*((_y4m->pic_h+1)/2); ++ /*Natively supported: no conversion required.*/ ++ _y4m->aux_buf_sz=_y4m->aux_buf_read_sz=0; ++ _y4m->convert=y4m_convert_null; ++ } ++ else if(strcmp(_y4m->chroma_type,"420mpeg2")==0){ ++ _y4m->src_c_dec_h=_y4m->dst_c_dec_h=_y4m->src_c_dec_v=_y4m->dst_c_dec_v=2; ++ _y4m->dst_buf_read_sz=_y4m->pic_w*_y4m->pic_h; ++ /*Chroma filter required: read into the aux buf first.*/ ++ _y4m->aux_buf_sz=_y4m->aux_buf_read_sz= ++ 2*((_y4m->pic_w+1)/2)*((_y4m->pic_h+1)/2); ++ _y4m->convert=y4m_convert_42xmpeg2_42xjpeg; ++ } ++ else if(strcmp(_y4m->chroma_type,"420paldv")==0){ ++ _y4m->src_c_dec_h=_y4m->dst_c_dec_h=_y4m->src_c_dec_v=_y4m->dst_c_dec_v=2; ++ _y4m->dst_buf_read_sz=_y4m->pic_w*_y4m->pic_h; ++ /*Chroma filter required: read into the aux buf first. ++ We need to make two filter passes, so we need some extra space in the ++ aux buffer.*/ ++ _y4m->aux_buf_sz=3*((_y4m->pic_w+1)/2)*((_y4m->pic_h+1)/2); ++ _y4m->aux_buf_read_sz=2*((_y4m->pic_w+1)/2)*((_y4m->pic_h+1)/2); ++ _y4m->convert=y4m_convert_42xpaldv_42xjpeg; ++ } ++ else if(strcmp(_y4m->chroma_type,"422jpeg")==0){ ++ _y4m->src_c_dec_h=_y4m->dst_c_dec_h=2; ++ _y4m->src_c_dec_v=1; ++ _y4m->dst_c_dec_v=2; ++ _y4m->dst_buf_read_sz=_y4m->pic_w*_y4m->pic_h; ++ /*Chroma filter required: read into the aux buf first.*/ ++ _y4m->aux_buf_sz=_y4m->aux_buf_read_sz=2*((_y4m->pic_w+1)/2)*_y4m->pic_h; ++ _y4m->convert=y4m_convert_422jpeg_420jpeg; ++ } ++ else if(strcmp(_y4m->chroma_type,"422")==0){ ++ _y4m->src_c_dec_h=_y4m->dst_c_dec_h=2; ++ _y4m->src_c_dec_v=1; ++ _y4m->dst_c_dec_v=2; ++ _y4m->dst_buf_read_sz=_y4m->pic_w*_y4m->pic_h; ++ /*Chroma filter required: read into the aux buf first. ++ We need to make two filter passes, so we need some extra space in the ++ aux buffer.*/ ++ _y4m->aux_buf_read_sz=2*((_y4m->pic_w+1)/2)*_y4m->pic_h; ++ _y4m->aux_buf_sz=_y4m->aux_buf_read_sz+((_y4m->pic_w+1)/2)*_y4m->pic_h; ++ _y4m->convert=y4m_convert_422_420jpeg; ++ } ++ else if(strcmp(_y4m->chroma_type,"411")==0){ ++ _y4m->src_c_dec_h=4; ++ _y4m->dst_c_dec_h=2; ++ _y4m->src_c_dec_v=1; ++ _y4m->dst_c_dec_v=2; ++ _y4m->dst_buf_read_sz=_y4m->pic_w*_y4m->pic_h; ++ /*Chroma filter required: read into the aux buf first. ++ We need to make two filter passes, so we need some extra space in the ++ aux buffer.*/ ++ _y4m->aux_buf_read_sz=2*((_y4m->pic_w+3)/4)*_y4m->pic_h; ++ _y4m->aux_buf_sz=_y4m->aux_buf_read_sz+((_y4m->pic_w+1)/2)*_y4m->pic_h; ++ _y4m->convert=y4m_convert_411_420jpeg; ++ } ++ else if(strcmp(_y4m->chroma_type,"444")==0){ ++ _y4m->src_c_dec_h=1; ++ _y4m->dst_c_dec_h=2; ++ _y4m->src_c_dec_v=1; ++ _y4m->dst_c_dec_v=2; ++ _y4m->dst_buf_read_sz=_y4m->pic_w*_y4m->pic_h; ++ /*Chroma filter required: read into the aux buf first. ++ We need to make two filter passes, so we need some extra space in the ++ aux buffer.*/ ++ _y4m->aux_buf_read_sz=2*_y4m->pic_w*_y4m->pic_h; ++ _y4m->aux_buf_sz=_y4m->aux_buf_read_sz+((_y4m->pic_w+1)/2)*_y4m->pic_h; ++ _y4m->convert=y4m_convert_444_420jpeg; ++ } ++ else if(strcmp(_y4m->chroma_type,"444alpha")==0){ ++ _y4m->src_c_dec_h=1; ++ _y4m->dst_c_dec_h=2; ++ _y4m->src_c_dec_v=1; ++ _y4m->dst_c_dec_v=2; ++ _y4m->dst_buf_read_sz=_y4m->pic_w*_y4m->pic_h; ++ /*Chroma filter required: read into the aux buf first. ++ We need to make two filter passes, so we need some extra space in the ++ aux buffer. ++ The extra plane also gets read into the aux buf. ++ It will be discarded.*/ ++ _y4m->aux_buf_sz=_y4m->aux_buf_read_sz=3*_y4m->pic_w*_y4m->pic_h; ++ _y4m->convert=y4m_convert_444_420jpeg; ++ } ++ else if(strcmp(_y4m->chroma_type,"mono")==0){ ++ _y4m->src_c_dec_h=_y4m->src_c_dec_v=0; ++ _y4m->dst_c_dec_h=_y4m->dst_c_dec_v=2; ++ _y4m->dst_buf_read_sz=_y4m->pic_w*_y4m->pic_h; ++ /*No extra space required, but we need to clear the chroma planes.*/ ++ _y4m->aux_buf_sz=_y4m->aux_buf_read_sz=0; ++ _y4m->convert=y4m_convert_mono_420jpeg; ++ } ++ else{ ++ fprintf(stderr,"Unknown chroma sampling type: %s\n",_y4m->chroma_type); ++ return -1; ++ } ++ /*The size of the final frame buffers is always computed from the ++ destination chroma decimation type.*/ ++ _y4m->dst_buf_sz=_y4m->pic_w*_y4m->pic_h ++ +2*((_y4m->pic_w+_y4m->dst_c_dec_h-1)/_y4m->dst_c_dec_h)* ++ ((_y4m->pic_h+_y4m->dst_c_dec_v-1)/_y4m->dst_c_dec_v); ++ _y4m->dst_buf=(unsigned char *)malloc(_y4m->dst_buf_sz); ++ _y4m->aux_buf=(unsigned char *)malloc(_y4m->aux_buf_sz); ++ return 0; ++} ++ ++void y4m_input_close(y4m_input *_y4m){ ++ free(_y4m->dst_buf); ++ free(_y4m->aux_buf); ++} ++ ++int y4m_input_fetch_frame(y4m_input *_y4m,FILE *_fin,vpx_image_t *_img){ ++ char frame[6]; ++ int pic_sz; ++ int frame_c_w; ++ int frame_c_h; ++ int c_w; ++ int c_h; ++ int c_sz; ++ int ret; ++ /*Read and skip the frame header.*/ ++ ret=fread(frame,1,6,_fin); ++ if(ret<6)return 0; ++ if(memcmp(frame,"FRAME",5)){ ++ fprintf(stderr,"Loss of framing in Y4M input data\n"); ++ return -1; ++ } ++ if(frame[5]!='\n'){ ++ char c; ++ int j; ++ for(j=0;j<79&&fread(&c,1,1,_fin)&&c!='\n';j++); ++ if(j==79){ ++ fprintf(stderr,"Error parsing Y4M frame header\n"); ++ return -1; ++ } ++ } ++ /*Read the frame data that needs no conversion.*/ ++ if(fread(_y4m->dst_buf,1,_y4m->dst_buf_read_sz,_fin)!=_y4m->dst_buf_read_sz){ ++ fprintf(stderr,"Error reading Y4M frame data.\n"); ++ return -1; ++ } ++ /*Read the frame data that does need conversion.*/ ++ if(fread(_y4m->aux_buf,1,_y4m->aux_buf_read_sz,_fin)!=_y4m->aux_buf_read_sz){ ++ fprintf(stderr,"Error reading Y4M frame data.\n"); ++ return -1; ++ } ++ /*Now convert the just read frame.*/ ++ (*_y4m->convert)(_y4m,_y4m->dst_buf,_y4m->aux_buf); ++ /*Fill in the frame buffer pointers. ++ We don't use vpx_img_wrap() because it forces padding for odd picture ++ sizes, which would require a separate fread call for every row.*/ ++ memset(_img,0,sizeof(*_img)); ++ /*Y4M has the planes in Y'CbCr order, which libvpx calls Y, U, and V.*/ ++ _img->fmt=IMG_FMT_I420; ++ _img->w=_img->d_w=_y4m->pic_w; ++ _img->h=_img->d_h=_y4m->pic_h; ++ /*This is hard-coded to 4:2:0 for now, as that's all VP8 supports.*/ ++ _img->x_chroma_shift=1; ++ _img->y_chroma_shift=1; ++ _img->bps=12; ++ /*Set up the buffer pointers.*/ ++ pic_sz=_y4m->pic_w*_y4m->pic_h; ++ c_w=(_y4m->pic_w+_y4m->dst_c_dec_h-1)/_y4m->dst_c_dec_h; ++ c_h=(_y4m->pic_h+_y4m->dst_c_dec_v-1)/_y4m->dst_c_dec_v; ++ c_sz=c_w*c_h; ++ _img->stride[PLANE_Y]=_y4m->pic_w; ++ _img->stride[PLANE_U]=_img->stride[PLANE_V]=c_w; ++ _img->planes[PLANE_Y]=_y4m->dst_buf; ++ _img->planes[PLANE_U]=_y4m->dst_buf+pic_sz; ++ _img->planes[PLANE_V]=_y4m->dst_buf+pic_sz+c_sz; ++ return 0; ++} +diff --git a/y4minput.h b/y4minput.h +new file mode 100644 +index 0000000..e3f9304 +--- /dev/null ++++ b/y4minput.h +@@ -0,0 +1,60 @@ ++/* ++ * Copyright (c) 2010 The VP8 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. ++ * ++ * Based on code from the OggTheora software codec source code, ++ * Copyright (C) 2002-2010 The Xiph.Org Foundation and contributors. ++ */ ++#if !defined(_y4minput_H) ++# define _y4minput_H (1) ++# include <stdio.h> ++# include "vpx/vpx_image.h" ++ ++ ++ ++typedef struct y4m_input y4m_input; ++ ++ ++ ++/*The function used to perform chroma conversion.*/ ++typedef void (*y4m_convert_func)(y4m_input *_y4m, ++ unsigned char *_dst,unsigned char *_src); ++ ++ ++ ++struct y4m_input{ ++ int pic_w; ++ int pic_h; ++ int fps_n; ++ int fps_d; ++ int par_n; ++ int par_d; ++ char interlace; ++ int src_c_dec_h; ++ int src_c_dec_v; ++ int dst_c_dec_h; ++ int dst_c_dec_v; ++ char chroma_type[16]; ++ /*The size of each converted frame buffer.*/ ++ size_t dst_buf_sz; ++ /*The amount to read directly into the converted frame buffer.*/ ++ size_t dst_buf_read_sz; ++ /*The size of the auxilliary buffer.*/ ++ size_t aux_buf_sz; ++ /*The amount to read into the auxilliary buffer.*/ ++ size_t aux_buf_read_sz; ++ y4m_convert_func convert; ++ unsigned char *dst_buf; ++ unsigned char *aux_buf; ++}; ++ ++int y4m_input_open(y4m_input *_y4m,FILE *_fin,char *_skip,int _nskip); ++void y4m_input_close(y4m_input *_y4m); ++int y4m_input_fetch_frame(y4m_input *_y4m,FILE *_fin,vpx_image_t *img); ++ ++#endif |