summaryrefslogtreecommitdiffstats
path: root/main/libvpx
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2010-06-17 12:16:09 +0000
committerNatanael Copa <ncopa@alpinelinux.org>2010-06-17 12:17:10 +0000
commit5e9ec9194376d0f0d2b440d23a8b86cd9d17652e (patch)
treecbbbbdde16dd9186dd1da228aa98ac24f754e865 /main/libvpx
parent6797087d494f8707be1236bb1e420e60af35b903 (diff)
downloadaports-fcolista-5e9ec9194376d0f0d2b440d23a8b86cd9d17652e.tar.bz2
aports-fcolista-5e9ec9194376d0f0d2b440d23a8b86cd9d17652e.tar.xz
main/libvpx: new aport
Library for the vp8 codec http://www.webmproject.org/
Diffstat (limited to 'main/libvpx')
-rw-r--r--main/libvpx/APKBUILD42
-rw-r--r--main/libvpx/git100617.patch27956
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} &quot;\$(InputPath)&quot;"
++ asm_Release_cmdline="yasm -Xvc -f \$(PlatformName) ${yasmincs} &quot;\$(InputPath)&quot;"
+ ;;
+ 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 (&apos;symbol&apos; or &apos;symbol = value&apos;) "
++ 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 (&apos;nasm&apos; or &apos;raw&apos;)"
++ >
++ <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 (&apos;nasm&apos;) or AT&amp;T ( &apos;gas&apos;) 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('"', '&quot;', $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('&', '&amp;', $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+);)/',
+- '&amp;', $text);;
+- }
+- # Encode remaining <'s
+- $text = str_replace('<', '&lt;', $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="&#109;&#x61;&#105;&#x6c;&#116;&#x6f;&#58;&#x66;o&#111;
+- # &#x40;&#101;&#x78;&#97;&#x6d;&#112;&#x6c;&#101;&#46;&#x63;&#111;
+- # &#x6d;">&#x66;o&#111;&#x40;&#101;&#x78;&#97;&#x6d;&#112;&#x6c;
+- # &#101;&#46;&#x63;&#111;&#x6d;</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>&#8617;</a>";
+- if (preg_match('{</p>$}', $footnote)) {
+- $footnote = substr($footnote, 0, -4) . "&#160;$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