[ffmpeg] upstream merge and related gn files update
Test: built locally and ran mediaplayer_tests
Fixed: 51657
Change-Id: I8f34cefc94e4376bff75997b097afc68be7c0999
diff --git a/BUILD.gn b/BUILD.gn
new file mode 100644
index 0000000..a7d14048
--- /dev/null
+++ b/BUILD.gn
@@ -0,0 +1,235 @@
+# Copyright 2017 The Fuchsia Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("ffmpeg_options.gni")
+import("ffmpeg_generated.gni")
+
+# Path to configuration files.
+ffmpeg_config_root = "fuchsia/config/$ffmpeg_profile/$current_cpu"
+
+has_yasm_deps = ffmpeg_yasm_sources != [] && current_cpu == "x64"
+if (has_yasm_deps) {
+ import("//third_party/yasm/yasm_assemble.gni")
+ yasm_assemble("ffmpeg_yasm") {
+ sources = ffmpeg_yasm_sources
+
+ # Ensure the architecture defines go in the command line before the -P
+ # file below, so don't use defines.
+ yasm_flags = []
+ if (current_cpu == "x86") {
+ yasm_flags += [ "-DARCH_X86_32" ]
+ } else if (current_cpu == "x64") {
+ yasm_flags += [ "-DARCH_X86_64" ]
+ }
+
+ inputs = [
+ # Sets visibility hidden for cglobal functions. Explicitly included
+ # to avoid overlooking changes to this file in incremental builds.
+ "libavutil/x86/x86inc.asm",
+ ]
+
+ defines = [ "PIC" ]
+ include_dirs = [
+ ffmpeg_config_root,
+ "libavcodec/x86",
+ "libavutil/x86",
+ ".",
+ ]
+
+ # Disable warnings, prevents log spam for things we won't fix.
+ yasm_flags += [
+ "-w",
+ "-P",
+ rebase_path("$ffmpeg_config_root/config.asm", root_build_dir),
+ ]
+
+ if (is_mac) {
+ # Necessary to ensure symbols end up with a _ prefix; added by
+ # yasm_assemble.gni for Windows, but not Mac.
+ defines += [ "PREFIX" ]
+ }
+ }
+}
+
+config("ffmpeg_dependent_config") {
+ include_dirs = [
+ ffmpeg_config_root,
+ ".",
+ ]
+}
+
+# gn orders flags on a target before flags from configs. The default config
+# adds -Wall, and these flags have to be after -Wall -- so they need to come
+# from a config and can't be on the target directly.
+config("ffmpegsumo_warnings") {
+ cflags = [
+ "-Wno-absolute-value",
+
+ # ffmpeg uses its own deprecated functions.
+ "-Wno-deprecated-declarations",
+
+ # ffmpeg doesn't care about pointer constness.
+ "-Wno-incompatible-pointer-types",
+
+ # ffmpeg doesn't follow usual parentheses conventions.
+ "-Wno-logical-op-parentheses",
+
+ # ffmpeg doesn't care about pointer signedness.
+ "-Wno-parentheses",
+
+ # ffmpeg doesn't care about pointer signedness.
+ "-Wno-pointer-sign",
+
+ # ffmpeg doesn't believe in exhaustive switch statements.
+ "-Wno-switch",
+
+ # matroskadec.c has a "failed:" label that's only used if some
+ # CONFIG_ flags we don't set are set.
+ "-Wno-unused-label",
+
+ # ffmpeg has a lot of unused variables.
+ "-Wno-unused-variable",
+
+ # This fires on `av_assert0(!"valid element size")` in utils.c
+ "-Wno-string-conversion",
+
+ # This fires on `pos_min` and `pos_max` in
+ # autorename_libavformat_utils.c
+ "-Wno-sometimes-uninitialized",
+
+ # ffmpeg contains static functions in header files, which lead
+ # to unused function warnings. There are a few legit unused
+ # functions too.
+ "-Wno-unused-function",
+
+ # vp3data.h's vp31_inter_dequant stores '128' in an int8_t array.
+ "-Wno-constant-conversion",
+
+ "-Wno-string-plus-int",
+
+ # ffmpeg compares ints and floats.
+ "-Wno-implicit-int-float-conversion",
+
+ # fmmpeg may have questionable indentation. We should come back later
+ # to confirm if this indentation is expected.
+ "-Wno-misleading-indentation",
+ ]
+}
+
+config("ffmpeg_warnings") {
+ cflags = [
+ "-Wno-sign-compare",
+ "-Wno-missing-field-initializers",
+ "-Wno-pointer-bool-conversion",
+ "-Wno-implicit-int-float-conversion",
+ "-Wno-string-plus-int",
+ "-Wno-misleading-indentation",
+ ]
+}
+
+shared_library("ffmpeg") {
+ sources = ffmpeg_c_sources + ffmpeg_gas_sources + [
+ "$ffmpeg_config_root/config.h",
+ "$ffmpeg_config_root/libavutil/avconfig.h",
+ ]
+ public_configs = [ ":ffmpeg_dependent_config" ]
+ defines = [
+ "HAVE_AV_CONFIG_H",
+ "_POSIX_C_SOURCE=200112",
+ "_XOPEN_SOURCE=600",
+ "PIC",
+
+ # Disable deprecated features that generate spammy warnings.
+ "FF_API_CONVERGENCE_DURATION=0",
+
+ # Upstream libavcodec/utils.c still uses the deprecated
+ # av_dup_packet(), avcodec_encode_{audio,video}2(), and
+ # libavformat/utils.c still accesses the deprecated AVStream.codec,
+ # causing deprecation warnings.
+ # The normal fix for such things is to disable the features like setting
+ # "FF_API_AVPACKET_OLD_API=0", but the upstream code does not yet compile
+ # with it disabled (in the case of av_dup_packet()), and has no FF_API*
+ # gate for avcodec_encode_{audio,video}2() or AVStream.codec. In the
+ # meantime, we directly disable those warnings locally in the C files.
+ ]
+
+ # So we can append below and assume they're defined.
+ cflags = []
+ ldflags = []
+ libs = []
+ deps = [
+ "//third_party/opus",
+ ]
+
+ configs += [
+ ":ffmpeg_warnings",
+ ":ffmpegsumo_warnings",
+ ]
+
+ # Since we are not often debugging FFmpeg, and performance is
+ # unacceptable without optimization, freeze the optimizations to -O2.
+ # If someone really wants -O1 , they can change these in their checkout.
+ # If you want -O0, see the Gotchas in README.fuchsia for why that
+ # won't work.
+ #
+ # In addition to the above reasons, /Od optimization won't remove symbols
+ # that are under "if (0)" style sections. Which lead to link time errors
+ # when for example it tries to link an ARM symbol on X86.
+ if (is_debug) {
+ configs -= [ "//build/config:debug" ]
+ configs += [ "//build/config:release" ]
+ }
+
+ # Make all symbols visible.
+ configs -= [ "//build/config:symbol_visibility_hidden" ]
+
+ cflags += [
+ # ffmpeg uses its own deprecated functions.
+ "-Wno-deprecated-declarations",
+ ]
+
+ if (current_cpu == "arm64") {
+ asmflags = []
+ if (arm_float_abi == "hard") {
+ asmflags += [ "-DHAVE_VFP_ARGS=1" ]
+ } else {
+ asmflags += [ "-DHAVE_VFP_ARGS=0" ]
+ }
+ }
+
+ defines += [
+ "_ISOC99_SOURCE",
+ "_LARGEFILE_SOURCE",
+ ]
+
+ cflags += [
+ "-std=c99",
+ "-pthread",
+ "-fno-math-errno",
+ "-fno-signed-zeros",
+ "-fno-tree-vectorize",
+ "-fomit-frame-pointer",
+ ]
+ ldflags = [
+ # Avoid PIC relocation errors from assembly code.
+ "-Wl,-Bsymbolic",
+ "-L",
+ rebase_path(target_gen_dir, root_build_dir),
+ ]
+
+ if (has_yasm_deps) {
+ deps += [ ":ffmpeg_yasm" ]
+ }
+
+ # TODO(46940): UBSan has found an instance of undefined behavior in this target.
+ # Disable UBSan for this target temporarily until it is migrated into CI/CQ.
+ configs += [ "//build/config:temporarily_disable_ubsan_do_not_use" ]
+}
+
+group("ffmpeg_variants") {
+ deps = []
+ foreach(variant, select_variant) {
+ deps += [ ":ffmpeg(${toolchain_variant.base}-${variant}-shared)" ]
+ }
+}
diff --git a/CREDITS.fuchsia b/CREDITS.fuchsia
new file mode 100644
index 0000000..31e50f7
--- /dev/null
+++ b/CREDITS.fuchsia
@@ -0,0 +1,952 @@
+# License
+
+Most files in FFmpeg are under the GNU Lesser General Public License version 2.1
+or later (LGPL v2.1+). Read the file `COPYING.LGPLv2.1` for details. Some other
+files have MIT/X11/BSD-style licenses. In combination the LGPL v2.1+ applies to
+FFmpeg.
+
+Some optional parts of FFmpeg are licensed under the GNU General Public License
+version 2 or later (GPL v2+). See the file `COPYING.GPLv2` for details. None of
+these parts are used by default, you have to explicitly pass `--enable-gpl` to
+configure to activate them. In this case, FFmpeg's license changes to GPL v2+.
+
+Specifically, the GPL parts of FFmpeg are:
+
+- libpostproc
+- optional x86 optimization in the files
+ - `libavcodec/x86/flac_dsp_gpl.asm`
+ - `libavcodec/x86/idct_mmx.c`
+ - `libavfilter/x86/vf_removegrain.asm`
+- the following building and testing tools
+ - `compat/solaris/make_sunver.pl`
+ - `doc/t2h.pm`
+ - `doc/texi2pod.pl`
+ - `libswresample/tests/swresample.c`
+ - `tests/checkasm/*`
+ - `tests/tiny_ssim.c`
+- the following filters in libavfilter:
+ - `signature_lookup.c`
+ - `vf_blackframe.c`
+ - `vf_boxblur.c`
+ - `vf_colormatrix.c`
+ - `vf_cover_rect.c`
+ - `vf_cropdetect.c`
+ - `vf_delogo.c`
+ - `vf_eq.c`
+ - `vf_find_rect.c`
+ - `vf_fspp.c`
+ - `vf_histeq.c`
+ - `vf_hqdn3d.c`
+ - `vf_kerndeint.c`
+ - `vf_lensfun.c` (GPL version 3 or later)
+ - `vf_mcdeint.c`
+ - `vf_mpdecimate.c`
+ - `vf_nnedi.c`
+ - `vf_owdenoise.c`
+ - `vf_perspective.c`
+ - `vf_phase.c`
+ - `vf_pp.c`
+ - `vf_pp7.c`
+ - `vf_pullup.c`
+ - `vf_repeatfields.c`
+ - `vf_sab.c`
+ - `vf_signature.c`
+ - `vf_smartblur.c`
+ - `vf_spp.c`
+ - `vf_stereo3d.c`
+ - `vf_super2xsai.c`
+ - `vf_tinterlace.c`
+ - `vf_uspp.c`
+ - `vf_vaguedenoiser.c`
+ - `vsrc_mptestsrc.c`
+
+Should you, for whatever reason, prefer to use version 3 of the (L)GPL, then
+the configure parameter `--enable-version3` will activate this licensing option
+for you. Read the file `COPYING.LGPLv3` or, if you have enabled GPL parts,
+`COPYING.GPLv3` to learn the exact legal terms that apply in this case.
+
+There are a handful of files under other licensing terms, namely:
+
+* The files `libavcodec/jfdctfst.c`, `libavcodec/jfdctint_template.c` and
+ `libavcodec/jrevdct.c` are taken from libjpeg, see the top of the files for
+ licensing details. Specifically note that you must credit the IJG in the
+ documentation accompanying your program if you only distribute executables.
+ You must also indicate any changes including additions and deletions to
+ those three files in the documentation.
+* `tests/reference.pnm` is under the expat license.
+
+
+## External libraries
+
+FFmpeg can be combined with a number of external libraries, which sometimes
+affect the licensing of binaries resulting from the combination.
+
+### Compatible libraries
+
+The following libraries are under GPL version 2:
+- avisynth
+- frei0r
+- libcdio
+- libdavs2
+- librubberband
+- libvidstab
+- libx264
+- libx265
+- libxavs
+- libxavs2
+- libxvid
+
+When combining them with FFmpeg, FFmpeg needs to be licensed as GPL as well by
+passing `--enable-gpl` to configure.
+
+The following libraries are under LGPL version 3:
+- gmp
+- libaribb24
+- liblensfun
+
+When combining them with FFmpeg, use the configure option `--enable-version3` to
+upgrade FFmpeg to the LGPL v3.
+
+The VMAF, mbedTLS, RK MPI, OpenCORE and VisualOn libraries are under the Apache License
+2.0. That license is incompatible with the LGPL v2.1 and the GPL v2, but not with
+version 3 of those licenses. So to combine these libraries with FFmpeg, the
+license version needs to be upgraded by passing `--enable-version3` to configure.
+
+The smbclient library is under the GPL v3, to combine it with FFmpeg,
+the options `--enable-gpl` and `--enable-version3` have to be passed to
+configure to upgrade FFmpeg to the GPL v3.
+
+### Incompatible libraries
+
+There are certain libraries you can combine with FFmpeg whose licenses are not
+compatible with the GPL and/or the LGPL. If you wish to enable these
+libraries, even in circumstances that their license may be incompatible, pass
+`--enable-nonfree` to configure. This will cause the resulting binary to be
+unredistributable.
+
+The Fraunhofer FDK AAC and OpenSSL libraries are under licenses which are
+incompatible with the GPLv2 and v3. To the best of our knowledge, they are
+compatible with the LGPL.
+
+
+********************************************************************************
+
+libavformat/oggparsespeex.c
+
+Copyright (C) 2008 Reimar Döffinger
+
+ Permission is hereby granted, free of charge, to any person
+ obtaining a copy of this software and associated documentation
+ files (the "Software"), to deal in the Software without
+ restriction, including without limitation the rights to use, copy,
+ modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ DEALINGS IN THE SOFTWARE.
+
+********************************************************************************
+
+libavutil/avsscanf.c
+
+Copyright (c) 2005-2014 Rich Felker, et al.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+********************************************************************************
+
+libavcodec/x86/xvididct.asm
+
+XVID MPEG-4 VIDEO CODEC
+
+ Conversion from gcc syntax to x264asm syntax with modifications
+ by Christophe Gisquet <christophe.gisquet@gmail.com>
+
+ =========== SSE2 inverse discrete cosine transform ===========
+
+ Copyright(C) 2003 Pascal Massimino <skal@planet-d.net>
+
+ Conversion to gcc syntax with modifications
+ by Alexander Strange <astrange@ithinksw.com>
+
+ Originally from dct/x86_asm/fdct_sse2_skal.asm in Xvid.
+
+ Vertical pass is an implementation of the scheme:
+ Loeffler C., Ligtenberg A., and Moschytz C.S.:
+ Practical Fast 1D DCT Algorithm with Eleven Multiplications,
+ Proc. ICASSP 1989, 988-991.
+
+ Horizontal pass is a double 4x4 vector/matrix multiplication,
+ (see also Intel's Application Note 922:
+ http://developer.intel.com/vtune/cbts/strmsimd/922down.htm
+ Copyright (C) 1999 Intel Corporation)
+
+ More details at http://skal.planet-d.net/coding/dct.html
+
+ ======= MMX and XMM forward discrete cosine transform =======
+
+ Copyright(C) 2001 Peter Ross <pross@xvid.org>
+
+ Originally provided by Intel at AP-922
+ http://developer.intel.com/vtune/cbts/strmsimd/922down.htm
+ (See more app notes at http://developer.intel.com/vtune/cbts/strmsimd/appnotes.htm)
+ but in a limited edition.
+ New macro implements a column part for precise iDCT
+ The routine precision now satisfies IEEE standard 1180-1990.
+
+ Copyright(C) 2000-2001 Peter Gubanov <peter@elecard.net.ru>
+ Rounding trick Copyright(C) 2000 Michel Lespinasse <walken@zoy.org>
+
+ http://www.elecard.com/peter/idct.html
+ http://www.linuxvideo.org/mpeg2dec/
+
+ These examples contain code fragments for first stage iDCT 8x8
+ (for rows) and first stage DCT 8x8 (for columns)
+
+ conversion to gcc syntax by Michael Niedermayer
+
+ ======================================================================
+
+ This file is part of FFmpeg.
+
+ FFmpeg is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ FFmpeg is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with FFmpeg; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+********************************************************************************
+
+libswresample/version.h
+
+Version macros.
+
+This file is part of libswresample
+
+libswresample is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+libswresample is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with libswresample; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+********************************************************************************
+
+libavformat/oggparsetheora.c
+
+Copyright (C) 2005 Matthieu CASTET, Alex Beregszaszi
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use, copy,
+modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+********************************************************************************
+
+libswresample/swresample.h
+
+Copyright (C) 2011-2013 Michael Niedermayer (michaelni@gmx.at)
+
+This file is part of libswresample
+
+libswresample is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+libswresample is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with libswresample; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+********************************************************************************
+
+libavcodec/jfdctfst.c
+libavcodec/jfdctint_template.c
+libavcodec/jrevdct.c
+
+This file is part of the Independent JPEG Group's software.
+
+The authors make NO WARRANTY or representation, either express or implied,
+with respect to this software, its quality, accuracy, merchantability, or
+fitness for a particular purpose. This software is provided "AS IS", and
+you, its user, assume the entire risk as to its quality and accuracy.
+
+This software is copyright (C) 1994-1996, Thomas G. Lane.
+All Rights Reserved except as specified below.
+
+Permission is hereby granted to use, copy, modify, and distribute this
+software (or portions thereof) for any purpose, without fee, subject to
+these conditions:
+(1) If any part of the source code for this software is distributed, then
+this README file must be included, with this copyright and no-warranty
+notice unaltered; and any additions, deletions, or changes to the original
+files must be clearly indicated in accompanying documentation.
+(2) If only executable code is distributed, then the accompanying
+documentation must state that "this software is based in part on the work
+of the Independent JPEG Group".
+(3) Permission for use of this software is granted only if the user accepts
+full responsibility for any undesirable consequences; the authors accept
+NO LIABILITY for damages of any kind.
+
+These conditions apply to any software derived from or based on the IJG
+code, not just to the unmodified library. If you use our work, you ought
+to acknowledge us.
+
+Permission is NOT granted for the use of any IJG author's name or company
+name in advertising or publicity relating to this software or products
+derived from it. This software may be referred to only as "the Independent
+JPEG Group's software".
+
+We specifically permit and encourage the use of this software as the basis
+of commercial products, provided that all warranty or liability claims are
+assumed by the product vendor.
+
+********************************************************************************
+
+libavcodec/fft_fixed_32.c
+libavcodec/fft_init_table.c
+libavcodec/fft_table.h
+libavcodec/mdct_fixed_32.c
+libavcodec/mips/aacdec_mips.h
+libavcodec/mips/aacsbr_mips.h
+libavcodec/mips/amrwbdec_mips.h
+libavcodec/mips/compute_antialias_fixed.h
+libavcodec/mips/compute_antialias_float.h
+libavcodec/mips/lsp_mips.h
+libavutil/fixed_dsp.c
+libavutil/fixed_dsp.h
+libavutil/mips/libm_mips.h
+libavutil/softfloat_tables.h
+
+Copyright (c) 2012
+MIPS Technologies, Inc., California.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+2. 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.
+3. Neither the name of the MIPS Technologies, Inc., 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 MIPS TECHNOLOGIES, INC. ``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 MIPS TECHNOLOGIES, INC. 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.
+
+Authors:
+Branimir Vasic (bvasic@mips.com)
+Darko Laus (darko@mips.com)
+Djordje Pesut (djordje@mips.com)
+Goran Cordasic (goran@mips.com)
+Nedeljko Babic (nedeljko.babic imgtec com)
+Mirjana Vulin (mvulin@mips.com)
+Stanislav Ocovaj (socovaj@mips.com)
+Zoran Lukic (zoranl@mips.com)
+
+********************************************************************************
+
+libavformat/oggdec.c
+libavformat/oggdec.h
+libavformat/oggparseogm.c
+libavformat/oggparsevorbis.c
+
+Copyright (C) 2005 Michael Ahlberg, Måns Rullgård
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use, copy,
+modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+********************************************************************************
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
\ No newline at end of file
diff --git a/README.fuchsia b/README.fuchsia
new file mode 100644
index 0000000..9ef4359
--- /dev/null
+++ b/README.fuchsia
@@ -0,0 +1,102 @@
+Name: ffmpeg
+URL: http://ffmpeg.org/
+License: LGPL 2.1
+License File: CREDITS.fuchsia
+Upstream Git: git://source.ffmpeg.org/ffmpeg.git
+Last Upstream Merge: 6a97ba521558ce131fe839eed2d51ff745280e1d, Feb 11 2018
+Description:
+
+This file documents the layout of the Fuchsia copy of FFmpeg, some common
+tasks, and how to create the build files and related configurations.
+
+FFmpeg Layout:
+==============
+
+Fuchsia's copy of FFmpeg is a fork of the upstream git repository, see the
+tags above for the latest merged upstream revision. All of the
+Fuchsia-specific bits, minus the gn files, are located under the fuchsia/
+folder off the root.
+
+ BUILD.gn: Has the targets for building FFmpeg for Fuchsia.
+
+ ffmpeg_generated.gni: Pregenerated listing of files necessary to build
+ every variation. See fuchsia/scripts/generate_gn.py for more details.
+
+ fuchsia/scripts: Utilities for building the gn and config files.
+
+ fuchsia/config/...: Pregenerated FFmpeg config options for each profile
+ and architecture.
+
+ fuchsia/patches/README: Details of Fuchsia-specific changes that haven't
+ yet made it upstream.
+
+
+Help w/ Common Tasks:
+=====================
+
+-- Submitting changes to Fuchsia's FFmpeg Git repository.
+
+The goal of Fuchsia's FFmpeg repository is to just be a mirror of the upstream
+Git repository. This means every change made must be upstreamed. If you make
+a change, please add an entry to fuchsia/patches/README with a link to the
+tracking issue and code review for your change.
+
+-- Upstreaming a patch.
+
+ <checkout copy of upstream repo>
+ git checkout <hash of last Fuchsia FFmpeg, see tag above> -b my_patch
+ git apply <patch. pulled from code review or cherry-picked from this repo>
+ git rebase origin/master
+ < Follow FFmpeg guide: http://ffmpeg.org/developer.html#Submitting-patches-1 >
+
+Once your change has been upstreamed, please update the fuchsia/patches/README
+file with the status. The next time an upstream merge is done, the committer
+will clear out all the patches which have been upstreamed.
+
+-- Cherry-picking a patch from upstream.
+
+ # Tell our repo about the upstream one.
+ git remote add upstream git://source.ffmpeg.org/ffmpeg.git
+ git fetch upstream
+
+ # Create a new branch based off of master for committing our patch.
+ git checkout origin/master -b my_new_branch
+
+ # Pull the patch out of upstream.
+ git cherry-pick -x <hash of commit in upstream>
+
+ <Follow rest of "Submitting changes to Fuchsia's FFmpeg Git repository.">
+
+
+Performing An Upstream Merge
+============================
+
+ # Note: upstream/master automatically tracks upstream.
+
+ # Make sure your path is set up to use the right yasm and clang. yasm needs
+ # to be installed, and clang is in prebuilt/third_party/clang/linux-x64/bin.
+
+ # Make sure that sysroot is available, namely
+ # ../../prebuilt/third_party/sysroot/linux
+
+ # Create a new branch based off of master.
+ git checkout origin/master -b my_new_branch
+
+ # Merge with master, taking theirs in case of conflicts.
+ git merge -X theirs upstream/master
+
+ # Remove removed files.
+ git diff --name-only --diff-filter=U | xargs git rm
+
+ # Build the ffmpeg for all profiles and architectures
+ ./fuchsia/scripts/build_ffmpeg.py x64
+ ./fuchsia/scripts/build_ffmpeg.py arm64
+
+ # Update Fuchsia stuff based on the results of the builds
+ ./fuchsia/scripts/copy_config.sh
+ ./fuchsia/scripts/generate_gn.py
+
+ # Use 'git add' to add new files as necessary (not the build.* dirs)
+ # Commit changes
+ # Test for regressions
+ # Submit
diff --git a/RELEASE_NOTES b/RELEASE_NOTES
new file mode 100644
index 0000000..d649c77
--- /dev/null
+++ b/RELEASE_NOTES
@@ -0,0 +1,15 @@
+
+ ┌───────────────────────────────────────┐
+ │ RELEASE NOTES for FFmpeg 3.4 "Cantor" │
+ └───────────────────────────────────────┘
+
+ The FFmpeg Project proudly presents FFmpeg 3.4 "Cantor", about 6
+ months after the release of FFmpeg 3.3.
+
+ A complete Changelog is available at the root of the project, and the
+ complete Git history on http://source.ffmpeg.org.
+
+ We hope you will like this release as much as we enjoyed working on it, and
+ as usual, if you have any questions about it, or any FFmpeg related topic,
+ feel free to join us on the #ffmpeg IRC channel (on irc.freenode.net) or ask
+ on the mailing-lists.
diff --git a/compat/solaris/make_sunver.pl b/compat/solaris/make_sunver.pl
deleted file mode 100755
index 0e9ed1d..0000000
--- a/compat/solaris/make_sunver.pl
+++ /dev/null
@@ -1,352 +0,0 @@
-#!/usr/bin/env perl
-
-# make_sunver.pl
-#
-# Copyright (C) 2010, 2011, 2012, 2013
-# Free Software Foundation, Inc.
-#
-# This file is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; see the file COPYING.GPLv3. If not see
-# <http://www.gnu.org/licenses/>.
-
-# This script takes at least two arguments, a GNU style version script and
-# a list of object and archive files, and generates a corresponding Sun
-# style version script as follows:
-#
-# Each glob pattern, C++ mangled pattern or literal in the input script is
-# matched against all global symbols in the input objects, emitting those
-# that matched (or nothing if no match was found).
-# A comment with the original pattern and its type is left in the output
-# file to make it easy to understand the matches.
-#
-# It uses elfdump when present (native), GNU readelf otherwise.
-# It depends on the GNU version of c++filt, since it must understand the
-# GNU mangling style.
-
-use FileHandle;
-use IPC::Open2;
-
-# Enforce C locale.
-$ENV{'LC_ALL'} = "C";
-$ENV{'LANG'} = "C";
-
-# Input version script, GNU style.
-my $symvers = shift;
-
-##########
-# Get all the symbols from the library, match them, and add them to a hash.
-
-my %sym_hash = ();
-
-# List of objects and archives to process.
-my @OBJECTS = ();
-
-# List of shared objects to omit from processing.
-my @SHAREDOBJS = ();
-
-# Filter out those input archives that have corresponding shared objects to
-# avoid adding all symbols matched in the archive to the output map.
-foreach $file (@ARGV) {
- if (($so = $file) =~ s/\.a$/.so/ && -e $so) {
- printf STDERR "omitted $file -> $so\n";
- push (@SHAREDOBJS, $so);
- } else {
- push (@OBJECTS, $file);
- }
-}
-
-# We need to detect and ignore hidden symbols. Solaris nm can only detect
-# this in the harder to parse default output format, and GNU nm not at all,
-# so use elfdump -s in the native case and GNU readelf -s otherwise.
-# GNU objdump -t cannot be used since it produces a variable number of
-# columns.
-
-# The path to elfdump.
-my $elfdump = "/usr/ccs/bin/elfdump";
-
-if (-f $elfdump) {
- open ELFDUMP,$elfdump.' -s '.(join ' ',@OBJECTS).'|' or die $!;
- my $skip_arsym = 0;
-
- while (<ELFDUMP>) {
- chomp;
-
- # Ignore empty lines.
- if (/^$/) {
- # End of archive symbol table, stop skipping.
- $skip_arsym = 0 if $skip_arsym;
- next;
- }
-
- # Keep skipping until end of archive symbol table.
- next if ($skip_arsym);
-
- # Ignore object name header for individual objects and archives.
- next if (/:$/);
-
- # Ignore table header lines.
- next if (/^Symbol Table Section:/);
- next if (/index.*value.*size/);
-
- # Start of archive symbol table: start skipping.
- if (/^Symbol Table: \(archive/) {
- $skip_arsym = 1;
- next;
- }
-
- # Split table.
- (undef, undef, undef, undef, $bind, $oth, undef, $shndx, $name) = split;
-
- # Error out for unknown input.
- die "unknown input line:\n$_" unless defined($bind);
-
- # Ignore local symbols.
- next if ($bind eq "LOCL");
- # Ignore hidden symbols.
- next if ($oth eq "H");
- # Ignore undefined symbols.
- next if ($shndx eq "UNDEF");
- # Error out for unhandled cases.
- if ($bind !~ /^(GLOB|WEAK)/ or $oth ne "D") {
- die "unhandled symbol:\n$_";
- }
-
- # Remember symbol.
- $sym_hash{$name}++;
- }
- close ELFDUMP or die "$elfdump error";
-} else {
- open READELF, 'readelf -s -W '.(join ' ',@OBJECTS).'|' or die $!;
- # Process each symbol.
- while (<READELF>) {
- chomp;
-
- # Ignore empty lines.
- next if (/^$/);
-
- # Ignore object name header.
- next if (/^File: .*$/);
-
- # Ignore table header lines.
- next if (/^Symbol table.*contains.*:/);
- next if (/Num:.*Value.*Size/);
-
- # Split table.
- (undef, undef, undef, undef, $bind, $vis, $ndx, $name) = split;
-
- # Error out for unknown input.
- die "unknown input line:\n$_" unless defined($bind);
-
- # Ignore local symbols.
- next if ($bind eq "LOCAL");
- # Ignore hidden symbols.
- next if ($vis eq "HIDDEN");
- # Ignore undefined symbols.
- next if ($ndx eq "UND");
- # Error out for unhandled cases.
- if ($bind !~ /^(GLOBAL|WEAK)/ or $vis ne "DEFAULT") {
- die "unhandled symbol:\n$_";
- }
-
- # Remember symbol.
- $sym_hash{$name}++;
- }
- close READELF or die "readelf error";
-}
-
-##########
-# The various types of glob patterns.
-#
-# A glob pattern that is to be applied to the demangled name: 'cxx'.
-# A glob patterns that applies directly to the name in the .o files: 'glob'.
-# This pattern is ignored; used for local variables (usually just '*'): 'ign'.
-
-# The type of the current pattern.
-my $glob = 'glob';
-
-# We're currently inside `extern "C++"', which Sun ld doesn't understand.
-my $in_extern = 0;
-
-# The c++filt command to use. This *must* be GNU c++filt; the Sun Studio
-# c++filt doesn't handle the GNU mangling style.
-my $cxxfilt = $ENV{'CXXFILT'} || "c++filt";
-
-# The current version name.
-my $current_version = "";
-
-# Was there any attempt to match a symbol to this version?
-my $matches_attempted;
-
-# The number of versions which matched this symbol.
-my $matched_symbols;
-
-open F,$symvers or die $!;
-
-# Print information about generating this file
-print "# This file was generated by make_sunver.pl. DO NOT EDIT!\n";
-print "# It was generated by:\n";
-printf "# %s %s %s\n", $0, $symvers, (join ' ',@ARGV);
-printf "# Omitted archives with corresponding shared libraries: %s\n",
- (join ' ', @SHAREDOBJS) if $#SHAREDOBJS >= 0;
-print "#\n\n";
-
-print "\$mapfile_version 2\n";
-
-while (<F>) {
- # Lines of the form '};'
- if (/^([ \t]*)(\}[ \t]*;[ \t]*)$/) {
- $glob = 'glob';
- if ($in_extern) {
- $in_extern--;
- print "$1##$2\n";
- } else {
- print;
- }
- next;
- }
-
- # Lines of the form '} SOME_VERSION_NAME_1.0;'
- if (/^[ \t]*\}[ \tA-Z0-9_.a-z]+;[ \t]*$/) {
- $glob = 'glob';
- # We tried to match symbols agains this version, but none matched.
- # Emit dummy hidden symbol to avoid marking this version WEAK.
- if ($matches_attempted && $matched_symbols == 0) {
- print " hidden:\n";
- print " .force_WEAK_off_$current_version = DATA S0x0 V0x0;\n";
- }
- print; next;
- }
-
- # Comment and blank lines
- if (/^[ \t]*\#/) { print; next; }
- if (/^[ \t]*$/) { print; next; }
-
- # Lines of the form '{'
- if (/^([ \t]*){$/) {
- if ($in_extern) {
- print "$1##{\n";
- } else {
- print;
- }
- next;
- }
-
- # Lines of the form 'SOME_VERSION_NAME_1.1 {'
- if (/^([A-Z0-9_.]+)[ \t]+{$/) {
- # Record version name.
- $current_version = $1;
- # Reset match attempts, #matched symbols for this version.
- $matches_attempted = 0;
- $matched_symbols = 0;
- print "SYMBOL_VERSION $1 {\n";
- next;
- }
-
- # Ignore 'global:'
- if (/^[ \t]*global:$/) { print; next; }
-
- # After 'local:', globs should be ignored, they won't be exported.
- if (/^[ \t]*local:$/) {
- $glob = 'ign';
- print;
- next;
- }
-
- # After 'extern "C++"', globs are C++ patterns
- if (/^([ \t]*)(extern \"C\+\+\"[ \t]*)$/) {
- $in_extern++;
- $glob = 'cxx';
- # Need to comment, Sun ld cannot handle this.
- print "$1##$2\n"; next;
- }
-
- # Chomp newline now we're done with passing through the input file.
- chomp;
-
- # Catch globs. Note that '{}' is not allowed in globs by this script,
- # so only '*' and '[]' are available.
- if (/^([ \t]*)([^ \t;{}#]+);?[ \t]*$/) {
- my $ws = $1;
- my $ptn = $2;
- # Turn the glob into a regex by replacing '*' with '.*', '?' with '.'.
- # Keep $ptn so we can still print the original form.
- ($pattern = $ptn) =~ s/\*/\.\*/g;
- $pattern =~ s/\?/\./g;
-
- if ($glob eq 'ign') {
- # We're in a local: * section; just continue.
- print "$_\n";
- next;
- }
-
- # Print the glob commented for human readers.
- print "$ws##$ptn ($glob)\n";
- # We tried to match a symbol to this version.
- $matches_attempted++;
-
- if ($glob eq 'glob') {
- my %ptn_syms = ();
-
- # Match ptn against symbols in %sym_hash.
- foreach my $sym (keys %sym_hash) {
- # Maybe it matches one of the patterns based on the symbol in
- # the .o file.
- $ptn_syms{$sym}++ if ($sym =~ /^$pattern$/);
- }
-
- foreach my $sym (sort keys(%ptn_syms)) {
- $matched_symbols++;
- print "$ws$sym;\n";
- }
- } elsif ($glob eq 'cxx') {
- my %dem_syms = ();
-
- # Verify that we're actually using GNU c++filt. Other versions
- # most likely cannot handle GNU style symbol mangling.
- my $cxxout = `$cxxfilt --version 2>&1`;
- $cxxout =~ m/GNU/ or die "$0 requires GNU c++filt to function";
-
- # Talk to c++filt through a pair of file descriptors.
- # Need to start a fresh instance per pattern, otherwise the
- # process grows to 500+ MB.
- my $pid = open2(*FILTIN, *FILTOUT, $cxxfilt) or die $!;
-
- # Match ptn against symbols in %sym_hash.
- foreach my $sym (keys %sym_hash) {
- # No? Well, maybe its demangled form matches one of those
- # patterns.
- printf FILTOUT "%s\n",$sym;
- my $dem = <FILTIN>;
- chomp $dem;
- $dem_syms{$sym}++ if ($dem =~ /^$pattern$/);
- }
-
- close FILTOUT or die "c++filt error";
- close FILTIN or die "c++filt error";
- # Need to wait for the c++filt process to avoid lots of zombies.
- waitpid $pid, 0;
-
- foreach my $sym (sort keys(%dem_syms)) {
- $matched_symbols++;
- print "$ws$sym;\n";
- }
- } else {
- # No? Well, then ignore it.
- }
- next;
- }
- # Important sanity check. This script can't handle lots of formats
- # that GNU ld can, so be sure to error out if one is seen!
- die "strange line `$_'";
-}
-close F;
diff --git a/configure b/configure
index 080d93a..2595ee7 100755
--- a/configure
+++ b/configure
@@ -6331,14 +6331,15 @@
enabled libopenjpeg && { check_pkg_config libopenjpeg "libopenjp2 >= 2.1.0" openjpeg.h opj_version ||
{ require_pkg_config libopenjpeg "libopenjp2 >= 2.1.0" openjpeg.h opj_version -DOPJ_STATIC && add_cppflags -DOPJ_STATIC; } }
enabled libopenmpt && require_pkg_config libopenmpt "libopenmpt >= 0.2.6557" libopenmpt/libopenmpt.h openmpt_module_create -lstdc++ && append libopenmpt_extralibs "-lstdc++"
-enabled libopus && {
- enabled libopus_decoder && {
- require_pkg_config libopus opus opus_multistream.h opus_multistream_decoder_create
- }
- enabled libopus_encoder && {
- require_pkg_config libopus opus opus_multistream.h opus_multistream_surround_encoder_create
- }
-}
+# Fuchsia uses a built in copy of libopus that is not visible to pkg-config.
+# enabled libopus && {
+# enabled libopus_decoder && {
+# require_pkg_config libopus opus opus_multistream.h opus_multistream_decoder_create
+# }
+# enabled libopus_encoder && {
+# require_pkg_config libopus opus opus_multistream.h opus_multistream_surround_encoder_create
+# }
+# }
enabled libpulse && require_pkg_config libpulse libpulse pulse/pulseaudio.h pa_context_new
enabled librabbitmq && require_pkg_config librabbitmq "librabbitmq >= 0.7.1" amqp.h amqp_new_connection
enabled librav1e && require_pkg_config librav1e "rav1e >= 0.1.0" rav1e.h rav1e_context_new
diff --git a/doc/Doxyfile b/doc/Doxyfile
index 0891899..4f0c5ab 100644
--- a/doc/Doxyfile
+++ b/doc/Doxyfile
@@ -38,7 +38,7 @@
# could be handy for archiving the generated documentation or if some version
# control system is used.
-PROJECT_NUMBER =
+PROJECT_NUMBER = 3.4.2
# Using the PROJECT_BRIEF tag one can provide an optional one line description
# for a project that appears at the top of each page and should give viewer a
diff --git a/doc/t2h.pm b/doc/t2h.pm
deleted file mode 100644
index e83d564..0000000
--- a/doc/t2h.pm
+++ /dev/null
@@ -1,339 +0,0 @@
-# makeinfo HTML output init file
-#
-# Copyright (c) 2011, 2012 Free Software Foundation, Inc.
-# Copyright (c) 2014 Andreas Cadhalpun
-# Copyright (c) 2014 Tiancheng "Timothy" Gu
-#
-# This file is part of FFmpeg.
-#
-# FFmpeg is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
-# (at your option) any later version.
-#
-# FFmpeg is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public
-# License along with FFmpeg; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-# no navigation elements
-set_from_init_file('HEADERS', 0);
-
-sub ffmpeg_heading_command($$$$$)
-{
- my $self = shift;
- my $cmdname = shift;
- my $command = shift;
- my $args = shift;
- my $content = shift;
-
- my $result = '';
-
- # not clear that it may really happen
- if ($self->in_string) {
- $result .= $self->command_string($command) ."\n" if ($cmdname ne 'node');
- $result .= $content if (defined($content));
- return $result;
- }
-
- my $element_id = $self->command_id($command);
- $result .= "<a name=\"$element_id\"></a>\n"
- if (defined($element_id) and $element_id ne '');
-
- print STDERR "Process $command "
- .Texinfo::Structuring::_print_root_command_texi($command)."\n"
- if ($self->get_conf('DEBUG'));
- my $element;
- if ($Texinfo::Common::root_commands{$command->{'cmdname'}}
- and $command->{'parent'}
- and $command->{'parent'}->{'type'}
- and $command->{'parent'}->{'type'} eq 'element') {
- $element = $command->{'parent'};
- }
- if ($element) {
- $result .= &{$self->{'format_element_header'}}($self, $cmdname,
- $command, $element);
- }
-
- my $heading_level;
- # node is used as heading if there is nothing else.
- if ($cmdname eq 'node') {
- if (!$element or (!$element->{'extra'}->{'section'}
- and $element->{'extra'}->{'node'}
- and $element->{'extra'}->{'node'} eq $command
- # bogus node may not have been normalized
- and defined($command->{'extra'}->{'normalized'}))) {
- if ($command->{'extra'}->{'normalized'} eq 'Top') {
- $heading_level = 0;
- } else {
- $heading_level = 3;
- }
- }
- } else {
- $heading_level = $command->{'level'};
- }
-
- my $heading = $self->command_text($command);
- # $heading not defined may happen if the command is a @node, for example
- # if there is an error in the node.
- if (defined($heading) and $heading ne '' and defined($heading_level)) {
-
- if ($Texinfo::Common::root_commands{$cmdname}
- and $Texinfo::Common::sectioning_commands{$cmdname}) {
- my $content_href = $self->command_contents_href($command, 'contents',
- $self->{'current_filename'});
- if ($content_href) {
- my $this_href = $content_href =~ s/^\#toc-/\#/r;
- $heading .= '<span class="pull-right">'.
- '<a class="anchor hidden-xs" '.
- "href=\"$this_href\" aria-hidden=\"true\">".
- ($ENV{"FA_ICONS"} ? '<i class="fa fa-link"></i>'
- : '#').
- '</a> '.
- '<a class="anchor hidden-xs"'.
- "href=\"$content_href\" aria-hidden=\"true\">".
- ($ENV{"FA_ICONS"} ? '<i class="fa fa-navicon"></i>'
- : 'TOC').
- '</a>'.
- '</span>';
- }
- }
-
- if ($self->in_preformatted()) {
- $result .= $heading."\n";
- } else {
- # if the level was changed, set the command name right
- if ($cmdname ne 'node'
- and $heading_level ne $Texinfo::Common::command_structuring_level{$cmdname}) {
- $cmdname
- = $Texinfo::Common::level_to_structuring_command{$cmdname}->[$heading_level];
- }
- $result .= &{$self->{'format_heading_text'}}(
- $self, $cmdname, $heading,
- $heading_level +
- $self->get_conf('CHAPTER_HEADER_LEVEL') - 1, $command);
- }
- }
- $result .= $content if (defined($content));
- return $result;
-}
-
-foreach my $command (keys(%Texinfo::Common::sectioning_commands), 'node') {
- texinfo_register_command_formatting($command, \&ffmpeg_heading_command);
-}
-
-# print the TOC where @contents is used
-set_from_init_file('INLINE_CONTENTS', 1);
-
-# make chapters <h2>
-set_from_init_file('CHAPTER_HEADER_LEVEL', 2);
-
-# Do not add <hr>
-set_from_init_file('DEFAULT_RULE', '');
-set_from_init_file('BIG_RULE', '');
-
-# Customized file beginning
-sub ffmpeg_begin_file($$$)
-{
- my $self = shift;
- my $filename = shift;
- my $element = shift;
-
- my $command;
- if ($element and $self->get_conf('SPLIT')) {
- $command = $self->element_command($element);
- }
-
- my ($title, $description, $encoding, $date, $css_lines,
- $doctype, $bodytext, $copying_comment, $after_body_open,
- $extra_head, $program_and_version, $program_homepage,
- $program, $generator) = $self->_file_header_informations($command);
-
- my $links = $self->_get_links ($filename, $element);
-
- my $head1 = $ENV{"FFMPEG_HEADER1"} || <<EOT;
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<!-- Created by $program_and_version, $program_homepage -->
- <head>
- <meta charset="utf-8">
- <title>
-EOT
- my $head_title = <<EOT;
- $title
-EOT
-
- my $head2 = $ENV{"FFMPEG_HEADER2"} || <<EOT;
- </title>
- <meta name="viewport" content="width=device-width,initial-scale=1.0">
- <link rel="stylesheet" type="text/css" href="bootstrap.min.css">
- <link rel="stylesheet" type="text/css" href="style.min.css">
- </head>
- <body>
- <div class="container">
- <h1>
-EOT
-
- my $head3 = $ENV{"FFMPEG_HEADER3"} || <<EOT;
- </h1>
-EOT
-
- return $head1 . $head_title . $head2 . $head_title . $head3;
-}
-texinfo_register_formatting_function('begin_file', \&ffmpeg_begin_file);
-
-sub ffmpeg_program_string($)
-{
- my $self = shift;
- if (defined($self->get_conf('PROGRAM'))
- and $self->get_conf('PROGRAM') ne ''
- and defined($self->get_conf('PACKAGE_URL'))) {
- return $self->convert_tree(
- $self->gdt('This document was generated using @uref{{program_homepage}, @emph{{program}}}.',
- { 'program_homepage' => $self->get_conf('PACKAGE_URL'),
- 'program' => $self->get_conf('PROGRAM') }));
- } else {
- return $self->convert_tree(
- $self->gdt('This document was generated automatically.'));
- }
-}
-texinfo_register_formatting_function('program_string', \&ffmpeg_program_string);
-
-# Customized file ending
-sub ffmpeg_end_file($)
-{
- my $self = shift;
- my $program_string = &{$self->{'format_program_string'}}($self);
- my $program_text = <<EOT;
- <p style="font-size: small;">
- $program_string
- </p>
-EOT
- my $footer = $ENV{FFMPEG_FOOTER} || <<EOT;
- </div>
- </body>
-</html>
-EOT
- return $program_text . $footer;
-}
-texinfo_register_formatting_function('end_file', \&ffmpeg_end_file);
-
-# Dummy title command
-# Ignore title. Title is handled through ffmpeg_begin_file().
-set_from_init_file('USE_TITLEPAGE_FOR_TITLE', 1);
-sub ffmpeg_title($$$$)
-{
- return '';
-}
-
-texinfo_register_command_formatting('titlefont',
- \&ffmpeg_title);
-
-# Customized float command. Part of code borrowed from GNU Texinfo.
-sub ffmpeg_float($$$$$)
-{
- my $self = shift;
- my $cmdname = shift;
- my $command = shift;
- my $args = shift;
- my $content = shift;
-
- my ($caption, $prepended) = Texinfo::Common::float_name_caption($self,
- $command);
- my $caption_text = '';
- my $prepended_text;
- my $prepended_save = '';
-
- if ($self->in_string()) {
- if ($prepended) {
- $prepended_text = $self->convert_tree_new_formatting_context(
- $prepended, 'float prepended');
- } else {
- $prepended_text = '';
- }
- if ($caption) {
- $caption_text = $self->convert_tree_new_formatting_context(
- {'contents' => $caption->{'args'}->[0]->{'contents'}},
- 'float caption');
- }
- return $prepended.$content.$caption_text;
- }
-
- my $id = $self->command_id($command);
- my $label;
- if (defined($id) and $id ne '') {
- $label = "<a name=\"$id\"></a>";
- } else {
- $label = '';
- }
-
- if ($prepended) {
- if ($caption) {
- # prepend the prepended tree to the first paragraph
- my @caption_original_contents = @{$caption->{'args'}->[0]->{'contents'}};
- my @caption_contents;
- my $new_paragraph;
- while (@caption_original_contents) {
- my $content = shift @caption_original_contents;
- if ($content->{'type'} and $content->{'type'} eq 'paragraph') {
- %{$new_paragraph} = %{$content};
- $new_paragraph->{'contents'} = [@{$content->{'contents'}}];
- unshift (@{$new_paragraph->{'contents'}}, {'cmdname' => 'strong',
- 'args' => [{'type' => 'brace_command_arg',
- 'contents' => [$prepended]}]});
- push @caption_contents, $new_paragraph;
- last;
- } else {
- push @caption_contents, $content;
- }
- }
- push @caption_contents, @caption_original_contents;
- if ($new_paragraph) {
- $caption_text = $self->convert_tree_new_formatting_context(
- {'contents' => \@caption_contents}, 'float caption');
- $prepended_text = '';
- }
- }
- if ($caption_text eq '') {
- $prepended_text = $self->convert_tree_new_formatting_context(
- $prepended, 'float prepended');
- if ($prepended_text ne '') {
- $prepended_save = $prepended_text;
- $prepended_text = '<p><strong>'.$prepended_text.'</strong></p>';
- }
- }
- } else {
- $prepended_text = '';
- }
-
- if ($caption and $caption_text eq '') {
- $caption_text = $self->convert_tree_new_formatting_context(
- $caption->{'args'}->[0], 'float caption');
- }
- if ($prepended_text.$caption_text ne '') {
- $prepended_text = $self->_attribute_class('div','float-caption'). '>'
- . $prepended_text;
- $caption_text .= '</div>';
- }
- my $html_class = '';
- if ($prepended_save =~ /NOTE/) {
- $html_class = 'info';
- $prepended_text = '';
- $caption_text = '';
- } elsif ($prepended_save =~ /IMPORTANT/) {
- $html_class = 'warning';
- $prepended_text = '';
- $caption_text = '';
- }
- return $self->_attribute_class('div', $html_class). '>' . "\n" .
- $prepended_text . $caption_text . $content . '</div>';
-}
-
-texinfo_register_command_formatting('float',
- \&ffmpeg_float);
-
-1;
diff --git a/doc/texi2pod.pl b/doc/texi2pod.pl
deleted file mode 100644
index 9a9b34f..0000000
--- a/doc/texi2pod.pl
+++ /dev/null
@@ -1,464 +0,0 @@
-#!/usr/bin/env perl
-
-# Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
-
-# This file is part of GNU CC.
-
-# GNU CC is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# GNU CC is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with GNU CC; see the file COPYING. If not, write to
-# the Free Software Foundation, 51 Franklin Street, Fifth Floor,
-# Boston, MA 02110-1301 USA
-
-# This does trivial (and I mean _trivial_) conversion of Texinfo
-# markup to Perl POD format. It's intended to be used to extract
-# something suitable for a manpage from a Texinfo document.
-
-use warnings;
-
-$output = 0;
-$skipping = 0;
-%chapters = ();
-@chapters_sequence = ();
-$chapter = "";
-@icstack = ();
-@endwstack = ();
-@skstack = ();
-@instack = ();
-$shift = "";
-%defs = ();
-$fnno = 1;
-$inf = "";
-@ibase = ();
-
-while ($_ = shift) {
- if (/^-D(.*)$/) {
- if ($1 ne "") {
- $flag = $1;
- } else {
- $flag = shift;
- }
- $value = "";
- ($flag, $value) = ($flag =~ /^([^=]+)(?:=(.+))?/);
- die "no flag specified for -D\n"
- unless $flag ne "";
- die "flags may only contain letters, digits, hyphens, dashes and underscores\n"
- unless $flag =~ /^[a-zA-Z0-9_-]+$/;
- $defs{$flag} = $value;
- } elsif (/^-I(.*)$/) {
- push @ibase, $1 ne "" ? $1 : shift;
- } elsif (/^-/) {
- usage();
- } else {
- $in = $_, next unless defined $in;
- $out = $_, next unless defined $out;
- usage();
- }
-}
-
-push @ibase, ".";
-
-if (defined $in) {
- $inf = gensym();
- open($inf, "<$in") or die "opening \"$in\": $!\n";
- push @ibase, $1 if $in =~ m|^(.+)/[^/]+$|;
-} else {
- $inf = \*STDIN;
-}
-
-if (defined $out) {
- open(STDOUT, ">$out") or die "opening \"$out\": $!\n";
-}
-
-while(defined $inf) {
-INF: while(<$inf>) {
- # Certain commands are discarded without further processing.
- /^\@(?:
- [a-z]+index # @*index: useful only in complete manual
- |need # @need: useful only in printed manual
- |(?:end\s+)?group # @group .. @end group: ditto
- |page # @page: ditto
- |node # @node: useful only in .info file
- |(?:end\s+)?ifnottex # @ifnottex .. @end ifnottex: use contents
- )\b/x and next;
-
- chomp;
-
- # Look for filename and title markers.
- /^\@setfilename\s+([^.]+)/ and $fn = $1, next;
- /^\@settitle\s+([^.]+)/ and $tl = postprocess($1), next;
-
- # Identify a man title but keep only the one we are interested in.
- /^\@c\s+man\s+title\s+([A-Za-z0-9-]+)\s+(.+)/ and do {
- if (exists $defs{$1}) {
- $fn = $1;
- $tl = postprocess($2);
- }
- next;
- };
-
- /^\@include\s+(.+)$/ and do {
- push @instack, $inf;
- $inf = gensym();
-
- for (@ibase) {
- open($inf, "<" . $_ . "/" . $1) and next INF;
- }
- die "cannot open $1: $!\n";
- };
-
- /^\@chapter\s+([A-Za-z ]+)/ and do {
- # close old chapter
- $chapters{$chapter_name} .= postprocess($chapter) if ($chapter_name);
-
- # start new chapter
- $chapter_name = $1, push (@chapters_sequence, $chapter_name) unless $skipping;
- $chapters{$chapter_name} = "" unless exists $chapters{$chapter_name};
- $chapter = "";
- $output = 1;
- next;
- };
-
- /^\@bye/ and do {
- # close old chapter
- $chapters{$chapter_name} .= postprocess($chapter) if ($chapter_name);
- last INF;
- };
-
- # handle variables
- /^\@set\s+([a-zA-Z0-9_-]+)\s*(.*)$/ and do {
- $defs{$1} = $2;
- next;
- };
- /^\@clear\s+([a-zA-Z0-9_-]+)/ and do {
- delete $defs{$1};
- next;
- };
-
- next unless $output;
-
- # Discard comments. (Can't do it above, because then we'd never see
- # @c man lines.)
- /^\@c\b/ and next;
-
- # End-block handler goes up here because it needs to operate even
- # if we are skipping.
- /^\@end\s+([a-z]+)/ and do {
- # Ignore @end foo, where foo is not an operation which may
- # cause us to skip, if we are presently skipping.
- my $ended = $1;
- next if $skipping && $ended !~ /^(?:ifset|ifclear|ignore|menu|iftex|ifhtml|ifnothtml)$/;
-
- die "\@end $ended without \@$ended at line $.\n" unless defined $endw;
- die "\@$endw ended by \@end $ended at line $.\n" unless $ended eq $endw;
-
- $endw = pop @endwstack;
-
- if ($ended =~ /^(?:ifset|ifclear|ignore|menu|iftex|ifhtml|ifnothtml)$/) {
- $skipping = pop @skstack;
- next;
- } elsif ($ended =~ /^(?:example|smallexample|verbatim|display)$/) {
- $shift = "";
- $_ = ""; # need a paragraph break
- } elsif ($ended =~ /^(?:itemize|enumerate|(?:multi|[fv])?table)$/) {
- $_ = "\n=back\n";
- $ic = pop @icstack;
- } else {
- die "unknown command \@end $ended at line $.\n";
- }
- };
-
- # We must handle commands which can cause skipping even while we
- # are skipping, otherwise we will not process nested conditionals
- # correctly.
- /^\@ifset\s+([a-zA-Z0-9_-]+)/ and do {
- push @endwstack, $endw;
- push @skstack, $skipping;
- $endw = "ifset";
- $skipping = 1 unless exists $defs{$1};
- next;
- };
-
- /^\@ifclear\s+([a-zA-Z0-9_-]+)/ and do {
- push @endwstack, $endw;
- push @skstack, $skipping;
- $endw = "ifclear";
- $skipping = 1 if exists $defs{$1};
- next;
- };
-
- /^\@(ignore|menu|iftex|ifhtml|ifnothtml)\b/ and do {
- push @endwstack, $endw;
- push @skstack, $skipping;
- $endw = $1;
- $skipping = $endw !~ /ifnothtml/;
- next;
- };
-
- next if $skipping;
-
- # Character entities. First the ones that can be replaced by raw text
- # or discarded outright:
- s/\@copyright\{\}/(c)/g;
- s/\@dots\{\}/.../g;
- s/\@enddots\{\}/..../g;
- s/\@([.!? ])/$1/g;
- s/\@[:-]//g;
- s/\@bullet(?:\{\})?/*/g;
- s/\@TeX\{\}/TeX/g;
- s/\@pounds\{\}/\#/g;
- s/\@minus(?:\{\})?/-/g;
-
- # Now the ones that have to be replaced by special escapes
- # (which will be turned back into text by unmunge())
- s/&/&/g;
- s/\@\{/{/g;
- s/\@\}/}/g;
- s/\@\@/&at;/g;
-
- # Inside a verbatim block, handle @var specially.
- if ($shift ne "") {
- s/\@var\{([^\}]*)\}/<$1>/g;
- }
-
- # POD doesn't interpret E<> inside a verbatim block.
- if ($shift eq "") {
- s/</</g;
- s/>/>/g;
- } else {
- s/</</g;
- s/>/>/g;
- }
-
- # Single line command handlers.
-
- /^\@(?:section|unnumbered|unnumberedsec|center|heading)\s+(.+)$/
- and $_ = "\n=head2 $1\n";
- /^\@(?:subsection|subheading)\s+(.+)$/
- and $_ = "\n=head3 $1\n";
- /^\@(?:subsubsection|subsubheading)\s+(.+)$/
- and $_ = "\n=head4 $1\n";
-
- # Block command handlers:
- /^\@itemize\s*(\@[a-z]+|\*|-)?/ and do {
- push @endwstack, $endw;
- push @icstack, $ic;
- $ic = $1 ? $1 : "*";
- $_ = "\n=over 4\n";
- $endw = "itemize";
- };
-
- /^\@enumerate(?:\s+([a-zA-Z0-9]+))?/ and do {
- push @endwstack, $endw;
- push @icstack, $ic;
- if (defined $1) {
- $ic = $1 . ".";
- } else {
- $ic = "1.";
- }
- $_ = "\n=over 4\n";
- $endw = "enumerate";
- };
-
- /^\@((?:multi|[fv])?table)\s+(\@[a-z]+)/ and do {
- push @endwstack, $endw;
- push @icstack, $ic;
- $endw = $1;
- $ic = $2;
- $ic =~ s/\@(?:samp|strong|key|gcctabopt|option|env|command)/B/;
- $ic =~ s/\@(?:code|kbd)/C/;
- $ic =~ s/\@(?:dfn|var|emph|cite|i)/I/;
- $ic =~ s/\@(?:file)/F/;
- $ic =~ s/\@(?:columnfractions)//;
- $_ = "\n=over 4\n";
- };
-
- /^\@(multitable)\s+{.*/ and do {
- push @endwstack, $endw;
- push @icstack, $ic;
- $endw = $1;
- $ic = "";
- $_ = "\n=over 4\n";
- };
-
- /^\@((?:small)?example|verbatim|display)/ and do {
- push @endwstack, $endw;
- $endw = $1;
- $shift = "\t";
- $_ = ""; # need a paragraph break
- };
-
- /^\@item\s+(.*\S)\s*$/ and $endw eq "multitable" and do {
- my $columns = $1;
- $columns =~ s/\@tab/ : /;
-
- $_ = "\n=item B<". $columns .">\n";
- };
-
- /^\@tab\s+(.*\S)\s*$/ and $endw eq "multitable" and do {
- my $columns = $1;
- $columns =~ s/\@tab//;
-
- $_ = $columns;
- $chapter =~ s/$//;
- };
-
- /^\@itemx?\s*(.+)?$/ and do {
- if (defined $1) {
- # Entity escapes prevent munging by the <> processing below.
- $_ = "\n=item $ic\<$1\>\n";
- } else {
- $_ = "\n=item $ic\n";
- $ic =~ y/A-Ya-y/B-Zb-z/;
- $ic =~ s/(\d+)/$1 + 1/eg;
- }
- };
-
- $chapter .= $shift.$_."\n";
-}
-# End of current file.
-close($inf);
-$inf = pop @instack;
-}
-
-die "No filename or title\n" unless defined $fn && defined $tl;
-
-# always use utf8
-print "=encoding utf8\n\n";
-
-$chapters{NAME} = "$fn \- $tl\n";
-$chapters{FOOTNOTES} .= "=back\n" if exists $chapters{FOOTNOTES};
-
-unshift @chapters_sequence, "NAME";
-for $chapter (@chapters_sequence) {
- if (exists $chapters{$chapter}) {
- $head = uc($chapter);
- print "=head1 $head\n\n";
- print scalar unmunge ($chapters{$chapter});
- print "\n";
- }
-}
-
-sub usage
-{
- die "usage: $0 [-D toggle...] [infile [outfile]]\n";
-}
-
-sub postprocess
-{
- local $_ = $_[0];
-
- # @value{foo} is replaced by whatever 'foo' is defined as.
- while (m/(\@value\{([a-zA-Z0-9_-]+)\})/g) {
- if (! exists $defs{$2}) {
- print STDERR "Option $2 not defined\n";
- s/\Q$1\E//;
- } else {
- $value = $defs{$2};
- s/\Q$1\E/$value/;
- }
- }
-
- # Formatting commands.
- # Temporary escape for @r.
- s/\@r\{([^\}]*)\}/R<$1>/g;
- s/\@(?:dfn|var|emph|cite|i)\{([^\}]*)\}/I<$1>/g;
- s/\@(?:code|kbd)\{([^\}]*)\}/C<$1>/g;
- s/\@(?:gccoptlist|samp|strong|key|option|env|command|b)\{([^\}]*)\}/B<$1>/g;
- s/\@sc\{([^\}]*)\}/\U$1/g;
- s/\@file\{([^\}]*)\}/F<$1>/g;
- s/\@w\{([^\}]*)\}/S<$1>/g;
- s/\@(?:dmn|math)\{([^\}]*)\}/$1/g;
-
- # Cross references are thrown away, as are @noindent and @refill.
- # (@noindent is impossible in .pod, and @refill is unnecessary.)
- # @* is also impossible in .pod; we discard it and any newline that
- # follows it. Similarly, our macro @gol must be discarded.
-
- s/\@anchor\{(?:[^\}]*)\}//g;
- s/\(?\@xref\{(?:[^\}]*)\}(?:[^.<]|(?:<[^<>]*>))*\.\)?//g;
- s/\s+\(\@pxref\{(?:[^\}]*)\}\)//g;
- s/;\s+\@pxref\{(?:[^\}]*)\}//g;
- s/\@ref\{(?:[^,\}]*,)(?:[^,\}]*,)([^,\}]*).*\}/B<$1>/g;
- s/\@ref\{([^\}]*)\}/B<$1>/g;
- s/\@noindent\s*//g;
- s/\@refill//g;
- s/\@gol//g;
- s/\@\*\s*\n?//g;
-
- # @uref can take one, two, or three arguments, with different
- # semantics each time. @url and @email are just like @uref with
- # one argument, for our purposes.
- s/\@(?:uref|url|email)\{([^\},]*),?[^\}]*\}/<B<$1>>/g;
- s/\@uref\{([^\},]*),([^\},]*)\}/$2 (C<$1>)/g;
- s/\@uref\{([^\},]*),([^\},]*),([^\},]*)\}/$3/g;
-
- # Turn B<blah I<blah> blah> into B<blah> I<blah> B<blah> to
- # match Texinfo semantics of @emph inside @samp. Also handle @r
- # inside bold.
- s/</</g;
- s/>/>/g;
- 1 while s/B<((?:[^<>]|I<[^<>]*>)*)R<([^>]*)>/B<$1>${2}B</g;
- 1 while (s/B<([^<>]*)I<([^>]+)>/B<$1>I<$2>B</g);
- 1 while (s/I<([^<>]*)B<([^>]+)>/I<$1>B<$2>I</g);
- s/[BI]<>//g;
- s/([BI])<(\s+)([^>]+)>/$2$1<$3>/g;
- s/([BI])<([^>]+?)(\s+)>/$1<$2>$3/g;
-
- # Extract footnotes. This has to be done after all other
- # processing because otherwise the regexp will choke on formatting
- # inside @footnote.
- while (/\@footnote/g) {
- s/\@footnote\{([^\}]+)\}/[$fnno]/;
- add_footnote($1, $fnno);
- $fnno++;
- }
-
- return $_;
-}
-
-sub unmunge
-{
- # Replace escaped symbols with their equivalents.
- local $_ = $_[0];
-
- s/</E<lt>/g;
- s/>/E<gt>/g;
- s/{/\{/g;
- s/}/\}/g;
- s/&at;/\@/g;
- s/&/&/g;
- return $_;
-}
-
-sub add_footnote
-{
- unless (exists $chapters{FOOTNOTES}) {
- $chapters{FOOTNOTES} = "\n=over 4\n\n";
- }
-
- $chapters{FOOTNOTES} .= "=item $fnno.\n\n"; $fnno++;
- $chapters{FOOTNOTES} .= $_[0];
- $chapters{FOOTNOTES} .= "\n\n";
-}
-
-# stolen from Symbol.pm
-{
- my $genseq = 0;
- sub gensym
- {
- my $name = "GEN" . $genseq++;
- my $ref = \*{$name};
- delete $::{$name};
- return $ref;
- }
-}
diff --git a/ffmpeg_generated.gni b/ffmpeg_generated.gni
new file mode 100644
index 0000000..6ba41ef
--- /dev/null
+++ b/ffmpeg_generated.gni
@@ -0,0 +1,464 @@
+# Copyright 2020 The Fuchsia Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# NOTE: this file is autogenerated by ffmpeg/fuchsia/scripts/generate_gn.py
+
+import("//build/config/arm.gni")
+import("ffmpeg_options.gni")
+
+# Declare empty versions of each variable for easier +=ing later.
+ffmpeg_c_sources = []
+ffmpeg_gas_sources = []
+ffmpeg_yasm_sources = []
+
+ffmpeg_c_sources += [
+ "libavcodec/ac3_parser.c",
+ "libavcodec/ac3tab.c",
+ "libavcodec/adts_parser.c",
+ "libavcodec/allcodecs.c",
+ "libavcodec/aptx.c",
+ "libavcodec/aptxdec.c",
+ "libavcodec/audio_frame_queue.c",
+ "libavcodec/avdct.c",
+ "libavcodec/avfft.c",
+ "libavcodec/avpacket.c",
+ "libavcodec/avpicture.c",
+ "libavcodec/bitstream.c",
+ "libavcodec/bitstream_filter.c",
+ "libavcodec/bitstream_filters.c",
+ "libavcodec/bsf.c",
+ "libavcodec/codec_desc.c",
+ "libavcodec/d3d11va.c",
+ "libavcodec/dct.c",
+ "libavcodec/dct32_fixed.c",
+ "libavcodec/dct32_float.c",
+ "libavcodec/decode.c",
+ "libavcodec/dirac.c",
+ "libavcodec/dv_profile.c",
+ "libavcodec/encode.c",
+ "libavcodec/fft_fixed.c",
+ "libavcodec/fft_fixed_32.c",
+ "libavcodec/fft_float.c",
+ "libavcodec/fft_init_table.c",
+ "libavcodec/flac.c",
+ "libavcodec/flac_parser.c",
+ "libavcodec/flacdata.c",
+ "libavcodec/flacdec.c",
+ "libavcodec/flacdsp.c",
+ "libavcodec/golomb.c",
+ "libavcodec/h264pred.c",
+ "libavcodec/hpeldsp.c",
+ "libavcodec/imgconvert.c",
+ "libavcodec/jni.c",
+ "libavcodec/libopus.c",
+ "libavcodec/libopusdec.c",
+ "libavcodec/mathtables.c",
+ "libavcodec/mdct_fixed.c",
+ "libavcodec/mdct_fixed_32.c",
+ "libavcodec/mdct_float.c",
+ "libavcodec/mediacodec.c",
+ "libavcodec/mjpegenc_huffman.c",
+ "libavcodec/mpeg12framerate.c",
+ "libavcodec/mpeg4audio.c",
+ "libavcodec/mpegaudio.c",
+ "libavcodec/mpegaudio_parser.c",
+ "libavcodec/mpegaudiodata.c",
+ "libavcodec/mpegaudiodec_fixed.c",
+ "libavcodec/mpegaudiodecheader.c",
+ "libavcodec/mpegaudiodsp.c",
+ "libavcodec/mpegaudiodsp_data.c",
+ "libavcodec/mpegaudiodsp_fixed.c",
+ "libavcodec/mpegaudiodsp_float.c",
+ "libavcodec/null_bsf.c",
+ "libavcodec/options.c",
+ "libavcodec/opus.c",
+ "libavcodec/opus_parser.c",
+ "libavcodec/opus_rc.c",
+ "libavcodec/opustab.c",
+ "libavcodec/parser.c",
+ "libavcodec/parsers.c",
+ "libavcodec/pcm.c",
+ "libavcodec/profiles.c",
+ "libavcodec/pthread.c",
+ "libavcodec/pthread_frame.c",
+ "libavcodec/pthread_slice.c",
+ "libavcodec/qsv_api.c",
+ "libavcodec/raw.c",
+ "libavcodec/rdft.c",
+ "libavcodec/sbc.c",
+ "libavcodec/sbcdec.c",
+ "libavcodec/sbcdec_data.c",
+ "libavcodec/utils.c",
+ "libavcodec/videodsp.c",
+ "libavcodec/vorbis.c",
+ "libavcodec/vorbis_data.c",
+ "libavcodec/vorbis_parser.c",
+ "libavcodec/vorbisdec.c",
+ "libavcodec/vorbisdsp.c",
+ "libavcodec/vp3.c",
+ "libavcodec/vp3_parser.c",
+ "libavcodec/vp3dsp.c",
+ "libavcodec/vp56rac.c",
+ "libavcodec/vp8.c",
+ "libavcodec/vp8_parser.c",
+ "libavcodec/vp8dsp.c",
+ "libavcodec/xiph.c",
+ "libavformat/allformats.c",
+ "libavformat/avio.c",
+ "libavformat/aviobuf.c",
+ "libavformat/cutils.c",
+ "libavformat/dump.c",
+ "libavformat/flac_picture.c",
+ "libavformat/flacdec.c",
+ "libavformat/format.c",
+ "libavformat/id3v1.c",
+ "libavformat/id3v2.c",
+ "libavformat/isom.c",
+ "libavformat/matroska.c",
+ "libavformat/matroskadec.c",
+ "libavformat/metadata.c",
+ "libavformat/mov.c",
+ "libavformat/mov_chan.c",
+ "libavformat/mov_esds.c",
+ "libavformat/mp3dec.c",
+ "libavformat/mux.c",
+ "libavformat/oggdec.c",
+ "libavformat/oggparsecelt.c",
+ "libavformat/oggparsedaala.c",
+ "libavformat/oggparsedirac.c",
+ "libavformat/oggparseflac.c",
+ "libavformat/oggparseogm.c",
+ "libavformat/oggparseopus.c",
+ "libavformat/oggparseskeleton.c",
+ "libavformat/oggparsespeex.c",
+ "libavformat/oggparsetheora.c",
+ "libavformat/oggparsevorbis.c",
+ "libavformat/oggparsevp8.c",
+ "libavformat/options.c",
+ "libavformat/os_support.c",
+ "libavformat/pcm.c",
+ "libavformat/protocols.c",
+ "libavformat/qtpalette.c",
+ "libavformat/rawdec.c",
+ "libavformat/replaygain.c",
+ "libavformat/riff.c",
+ "libavformat/riffdec.c",
+ "libavformat/rmsipr.c",
+ "libavformat/url.c",
+ "libavformat/utils.c",
+ "libavformat/vorbiscomment.c",
+ "libavformat/wavdec.c",
+ "libavutil/aes.c",
+ "libavutil/aes_ctr.c",
+ "libavutil/avsscanf.c",
+ "libavutil/avstring.c",
+ "libavutil/base64.c",
+ "libavutil/bprint.c",
+ "libavutil/buffer.c",
+ "libavutil/camellia.c",
+ "libavutil/channel_layout.c",
+ "libavutil/color_utils.c",
+ "libavutil/cpu.c",
+ "libavutil/crc.c",
+ "libavutil/dict.c",
+ "libavutil/display.c",
+ "libavutil/dovi_meta.c",
+ "libavutil/downmix_info.c",
+ "libavutil/encryption_info.c",
+ "libavutil/error.c",
+ "libavutil/eval.c",
+ "libavutil/fifo.c",
+ "libavutil/file_open.c",
+ "libavutil/fixed_dsp.c",
+ "libavutil/float_dsp.c",
+ "libavutil/frame.c",
+ "libavutil/hdr_dynamic_metadata.c",
+ "libavutil/hwcontext.c",
+ "libavutil/imgutils.c",
+ "libavutil/integer.c",
+ "libavutil/intmath.c",
+ "libavutil/lfg.c",
+ "libavutil/log.c",
+ "libavutil/log2_tab.c",
+ "libavutil/mastering_display_metadata.c",
+ "libavutil/mathematics.c",
+ "libavutil/md5.c",
+ "libavutil/mem.c",
+ "libavutil/opt.c",
+ "libavutil/parseutils.c",
+ "libavutil/pixdesc.c",
+ "libavutil/pixelutils.c",
+ "libavutil/random_seed.c",
+ "libavutil/rational.c",
+ "libavutil/reverse.c",
+ "libavutil/samplefmt.c",
+ "libavutil/sha.c",
+ "libavutil/slicethread.c",
+ "libavutil/spherical.c",
+ "libavutil/stereo3d.c",
+ "libavutil/tea.c",
+ "libavutil/threadmessage.c",
+ "libavutil/time.c",
+ "libavutil/timecode.c",
+ "libavutil/twofish.c",
+ "libavutil/tx.c",
+ "libavutil/tx_double.c",
+ "libavutil/tx_float.c",
+ "libavutil/tx_int32.c",
+ "libavutil/utils.c",
+]
+
+if (current_cpu == "arm64") {
+ ffmpeg_c_sources += [
+ "libavcodec/aarch64/fft_init_aarch64.c",
+ "libavcodec/aarch64/h264pred_init.c",
+ "libavcodec/aarch64/hpeldsp_init_aarch64.c",
+ "libavcodec/aarch64/mpegaudiodsp_init.c",
+ "libavcodec/aarch64/videodsp_init.c",
+ "libavcodec/aarch64/vorbisdsp_init.c",
+ "libavcodec/aarch64/vp8dsp_init_aarch64.c",
+ "libavutil/aarch64/cpu.c",
+ "libavutil/aarch64/float_dsp_init.c",
+ ]
+ ffmpeg_gas_sources += [
+ "libavcodec/aarch64/fft_neon.S",
+ "libavcodec/aarch64/h264pred_neon.S",
+ "libavcodec/aarch64/hpeldsp_neon.S",
+ "libavcodec/aarch64/mdct_neon.S",
+ "libavcodec/aarch64/mpegaudiodsp_neon.S",
+ "libavcodec/aarch64/videodsp.S",
+ "libavcodec/aarch64/vorbisdsp_neon.S",
+ "libavcodec/aarch64/vp8dsp_neon.S",
+ "libavutil/aarch64/float_dsp_neon.S",
+ ]
+}
+
+if (ffmpeg_profile == "max") {
+ ffmpeg_c_sources += [
+ "libavcodec/aac_ac3_parser.c",
+ "libavcodec/aac_parser.c",
+ "libavcodec/aacdec.c",
+ "libavcodec/aacps_float.c",
+ "libavcodec/aacpsdsp_float.c",
+ "libavcodec/aacsbr.c",
+ "libavcodec/aactab.c",
+ "libavcodec/acelp_filters.c",
+ "libavcodec/acelp_pitch_delay.c",
+ "libavcodec/acelp_vectors.c",
+ "libavcodec/adts_header.c",
+ "libavcodec/amrnbdec.c",
+ "libavcodec/amrwbdec.c",
+ "libavcodec/blockdsp.c",
+ "libavcodec/cabac.c",
+ "libavcodec/cbrt_data.c",
+ "libavcodec/celp_filters.c",
+ "libavcodec/celp_math.c",
+ "libavcodec/error_resilience.c",
+ "libavcodec/exif.c",
+ "libavcodec/fdctdsp.c",
+ "libavcodec/flvdec.c",
+ "libavcodec/gsm_parser.c",
+ "libavcodec/gsmdec.c",
+ "libavcodec/gsmdec_data.c",
+ "libavcodec/h263.c",
+ "libavcodec/h263_parser.c",
+ "libavcodec/h263data.c",
+ "libavcodec/h263dec.c",
+ "libavcodec/h263dsp.c",
+ "libavcodec/h2645_parse.c",
+ "libavcodec/h264_cabac.c",
+ "libavcodec/h264_cavlc.c",
+ "libavcodec/h264_direct.c",
+ "libavcodec/h264_loopfilter.c",
+ "libavcodec/h264_mb.c",
+ "libavcodec/h264_parse.c",
+ "libavcodec/h264_parser.c",
+ "libavcodec/h264_picture.c",
+ "libavcodec/h264_ps.c",
+ "libavcodec/h264_refs.c",
+ "libavcodec/h264_sei.c",
+ "libavcodec/h264_slice.c",
+ "libavcodec/h264chroma.c",
+ "libavcodec/h264data.c",
+ "libavcodec/h264dec.c",
+ "libavcodec/h264dsp.c",
+ "libavcodec/h264idct.c",
+ "libavcodec/h264qpel.c",
+ "libavcodec/idctdsp.c",
+ "libavcodec/intelh263dec.c",
+ "libavcodec/ituh263dec.c",
+ "libavcodec/jfdctfst.c",
+ "libavcodec/jfdctint.c",
+ "libavcodec/jrevdct.c",
+ "libavcodec/kbdwin.c",
+ "libavcodec/latm_parser.c",
+ "libavcodec/lsp.c",
+ "libavcodec/mdct15.c",
+ "libavcodec/me_cmp.c",
+ "libavcodec/mpeg4video.c",
+ "libavcodec/mpeg4video_parser.c",
+ "libavcodec/mpeg4videodec.c",
+ "libavcodec/mpeg_er.c",
+ "libavcodec/mpegpicture.c",
+ "libavcodec/mpegutils.c",
+ "libavcodec/mpegvideo.c",
+ "libavcodec/mpegvideo_motion.c",
+ "libavcodec/mpegvideodata.c",
+ "libavcodec/mpegvideodsp.c",
+ "libavcodec/msgsmdec.c",
+ "libavcodec/pixblockdsp.c",
+ "libavcodec/qpeldsp.c",
+ "libavcodec/rl.c",
+ "libavcodec/sbrdsp.c",
+ "libavcodec/simple_idct.c",
+ "libavcodec/sinewin.c",
+ "libavcodec/sinewin_fixed.c",
+ "libavcodec/startcode.c",
+ "libavcodec/tiff_common.c",
+ "libavcodec/xvididct.c",
+ "libavformat/aacdec.c",
+ "libavformat/amr.c",
+ "libavformat/apetag.c",
+ "libavformat/avidec.c",
+ "libavformat/gsmdec.c",
+ "libavformat/img2.c",
+ ]
+}
+
+if (current_cpu == "x64") {
+ ffmpeg_c_sources += [
+ "libavcodec/vp9.c",
+ "libavcodec/vp9_parser.c",
+ "libavcodec/vp9_superframe_split_bsf.c",
+ "libavcodec/vp9block.c",
+ "libavcodec/vp9data.c",
+ "libavcodec/vp9dsp.c",
+ "libavcodec/vp9dsp_10bpp.c",
+ "libavcodec/vp9dsp_12bpp.c",
+ "libavcodec/vp9dsp_8bpp.c",
+ "libavcodec/vp9lpf.c",
+ "libavcodec/vp9mvs.c",
+ "libavcodec/vp9prob.c",
+ "libavcodec/vp9recon.c",
+ "libavcodec/x86/constants.c",
+ "libavcodec/x86/dct_init.c",
+ "libavcodec/x86/fft_init.c",
+ "libavcodec/x86/flacdsp_init.c",
+ "libavcodec/x86/h264_intrapred_init.c",
+ "libavcodec/x86/hpeldsp_init.c",
+ "libavcodec/x86/hpeldsp_vp3_init.c",
+ "libavcodec/x86/mpegaudiodsp.c",
+ "libavcodec/x86/videodsp_init.c",
+ "libavcodec/x86/vorbisdsp_init.c",
+ "libavcodec/x86/vp3dsp_init.c",
+ "libavcodec/x86/vp8dsp_init.c",
+ "libavcodec/x86/vp9dsp_init.c",
+ "libavcodec/x86/vp9dsp_init_10bpp.c",
+ "libavcodec/x86/vp9dsp_init_12bpp.c",
+ "libavcodec/x86/vp9dsp_init_16bpp.c",
+ "libavutil/x86/cpu.c",
+ "libavutil/x86/fixed_dsp_init.c",
+ "libavutil/x86/float_dsp_init.c",
+ "libavutil/x86/imgutils_init.c",
+ "libavutil/x86/lls_init.c",
+ ]
+ ffmpeg_yasm_sources += [
+ "libavcodec/x86/dct32.asm",
+ "libavcodec/x86/fft.asm",
+ "libavcodec/x86/flacdsp.asm",
+ "libavcodec/x86/fpel.asm",
+ "libavcodec/x86/h264_intrapred.asm",
+ "libavcodec/x86/h264_intrapred_10bit.asm",
+ "libavcodec/x86/hpeldsp.asm",
+ "libavcodec/x86/hpeldsp_vp3.asm",
+ "libavcodec/x86/imdct36.asm",
+ "libavcodec/x86/videodsp.asm",
+ "libavcodec/x86/vorbisdsp.asm",
+ "libavcodec/x86/vp3dsp.asm",
+ "libavcodec/x86/vp8dsp.asm",
+ "libavcodec/x86/vp8dsp_loopfilter.asm",
+ "libavcodec/x86/vp9intrapred.asm",
+ "libavcodec/x86/vp9intrapred_16bpp.asm",
+ "libavcodec/x86/vp9itxfm.asm",
+ "libavcodec/x86/vp9itxfm_16bpp.asm",
+ "libavcodec/x86/vp9lpf.asm",
+ "libavcodec/x86/vp9lpf_16bpp.asm",
+ "libavcodec/x86/vp9mc.asm",
+ "libavcodec/x86/vp9mc_16bpp.asm",
+ "libavutil/x86/cpuid.asm",
+ "libavutil/x86/fixed_dsp.asm",
+ "libavutil/x86/float_dsp.asm",
+ "libavutil/x86/imgutils.asm",
+ "libavutil/x86/lls.asm",
+ ]
+}
+
+if (current_cpu == "arm64" && ffmpeg_profile == "max") {
+ ffmpeg_c_sources += [
+ "libavcodec/aarch64/aacpsdsp_init_aarch64.c",
+ "libavcodec/aarch64/h264chroma_init_aarch64.c",
+ "libavcodec/aarch64/h264dsp_init_aarch64.c",
+ "libavcodec/aarch64/h264qpel_init_aarch64.c",
+ "libavcodec/aarch64/idctdsp_init_aarch64.c",
+ "libavcodec/aarch64/sbrdsp_init_aarch64.c",
+ "libavcodec/neon/mpegvideo.c",
+ ]
+ ffmpeg_gas_sources += [
+ "libavcodec/aarch64/aacpsdsp_neon.S",
+ "libavcodec/aarch64/h264cmc_neon.S",
+ "libavcodec/aarch64/h264dsp_neon.S",
+ "libavcodec/aarch64/h264idct_neon.S",
+ "libavcodec/aarch64/h264qpel_neon.S",
+ "libavcodec/aarch64/sbrdsp_neon.S",
+ "libavcodec/aarch64/simple_idct_neon.S",
+ ]
+}
+
+if (current_cpu == "x64" && ffmpeg_profile == "max") {
+ ffmpeg_c_sources += [
+ "libavcodec/x86/aacpsdsp_init.c",
+ "libavcodec/x86/blockdsp_init.c",
+ "libavcodec/x86/fdct.c",
+ "libavcodec/x86/fdctdsp_init.c",
+ "libavcodec/x86/h263dsp_init.c",
+ "libavcodec/x86/h264_qpel.c",
+ "libavcodec/x86/h264chroma_init.c",
+ "libavcodec/x86/h264dsp_init.c",
+ "libavcodec/x86/idctdsp_init.c",
+ "libavcodec/x86/mdct15_init.c",
+ "libavcodec/x86/me_cmp_init.c",
+ "libavcodec/x86/mpegvideo.c",
+ "libavcodec/x86/mpegvideodsp.c",
+ "libavcodec/x86/pixblockdsp_init.c",
+ "libavcodec/x86/qpeldsp_init.c",
+ "libavcodec/x86/sbrdsp_init.c",
+ "libavcodec/x86/xvididct_init.c",
+ ]
+ ffmpeg_yasm_sources += [
+ "libavcodec/x86/aacpsdsp.asm",
+ "libavcodec/x86/blockdsp.asm",
+ "libavcodec/x86/h263_loopfilter.asm",
+ "libavcodec/x86/h264_chromamc.asm",
+ "libavcodec/x86/h264_chromamc_10bit.asm",
+ "libavcodec/x86/h264_deblock.asm",
+ "libavcodec/x86/h264_deblock_10bit.asm",
+ "libavcodec/x86/h264_idct.asm",
+ "libavcodec/x86/h264_idct_10bit.asm",
+ "libavcodec/x86/h264_qpel_10bit.asm",
+ "libavcodec/x86/h264_qpel_8bit.asm",
+ "libavcodec/x86/h264_weight.asm",
+ "libavcodec/x86/h264_weight_10bit.asm",
+ "libavcodec/x86/idctdsp.asm",
+ "libavcodec/x86/mdct15.asm",
+ "libavcodec/x86/me_cmp.asm",
+ "libavcodec/x86/pixblockdsp.asm",
+ "libavcodec/x86/qpel.asm",
+ "libavcodec/x86/qpeldsp.asm",
+ "libavcodec/x86/sbrdsp.asm",
+ "libavcodec/x86/simple_idct.asm",
+ "libavcodec/x86/simple_idct10.asm",
+ "libavcodec/x86/xvididct.asm",
+ ]
+}
+
diff --git a/ffmpeg_options.gni b/ffmpeg_options.gni
new file mode 100644
index 0000000..5112be9
--- /dev/null
+++ b/ffmpeg_options.gni
@@ -0,0 +1,11 @@
+# Copyright 2017 The Fuchsia Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+declare_args() {
+ # Controls what formats are supported. Legal values are [default|max].
+ ffmpeg_profile = "max"
+}
+
+assert(ffmpeg_profile == "default" || ffmpeg_profile == "max")
+assert(current_cpu == "x64" || current_cpu == "arm64")
diff --git a/fftools/cmdutils.c b/fftools/cmdutils.c
deleted file mode 100644
index 7f5a5ca..0000000
--- a/fftools/cmdutils.c
+++ /dev/null
@@ -1,2383 +0,0 @@
-/*
- * Various utilities for command line tools
- * Copyright (c) 2000-2003 Fabrice Bellard
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with FFmpeg; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#include <string.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <math.h>
-
-/* Include only the enabled headers since some compilers (namely, Sun
- Studio) will not omit unused inline functions and create undefined
- references to libraries that are not being built. */
-
-#include "config.h"
-#include "compat/va_copy.h"
-#include "libavformat/avformat.h"
-#include "libavfilter/avfilter.h"
-#include "libavdevice/avdevice.h"
-#include "libavresample/avresample.h"
-#include "libswscale/swscale.h"
-#include "libswresample/swresample.h"
-#include "libpostproc/postprocess.h"
-#include "libavutil/attributes.h"
-#include "libavutil/avassert.h"
-#include "libavutil/avstring.h"
-#include "libavutil/bprint.h"
-#include "libavutil/display.h"
-#include "libavutil/mathematics.h"
-#include "libavutil/imgutils.h"
-#include "libavutil/libm.h"
-#include "libavutil/parseutils.h"
-#include "libavutil/pixdesc.h"
-#include "libavutil/eval.h"
-#include "libavutil/dict.h"
-#include "libavutil/opt.h"
-#include "libavutil/cpu.h"
-#include "libavutil/ffversion.h"
-#include "libavutil/version.h"
-#include "cmdutils.h"
-#if CONFIG_NETWORK
-#include "libavformat/network.h"
-#endif
-#if HAVE_SYS_RESOURCE_H
-#include <sys/time.h>
-#include <sys/resource.h>
-#endif
-#ifdef _WIN32
-#include <windows.h>
-#endif
-
-static int init_report(const char *env);
-
-AVDictionary *sws_dict;
-AVDictionary *swr_opts;
-AVDictionary *format_opts, *codec_opts, *resample_opts;
-
-static FILE *report_file;
-static int report_file_level = AV_LOG_DEBUG;
-int hide_banner = 0;
-
-enum show_muxdemuxers {
- SHOW_DEFAULT,
- SHOW_DEMUXERS,
- SHOW_MUXERS,
-};
-
-void init_opts(void)
-{
- av_dict_set(&sws_dict, "flags", "bicubic", 0);
-}
-
-void uninit_opts(void)
-{
- av_dict_free(&swr_opts);
- av_dict_free(&sws_dict);
- av_dict_free(&format_opts);
- av_dict_free(&codec_opts);
- av_dict_free(&resample_opts);
-}
-
-void log_callback_help(void *ptr, int level, const char *fmt, va_list vl)
-{
- vfprintf(stdout, fmt, vl);
-}
-
-static void log_callback_report(void *ptr, int level, const char *fmt, va_list vl)
-{
- va_list vl2;
- char line[1024];
- static int print_prefix = 1;
-
- va_copy(vl2, vl);
- av_log_default_callback(ptr, level, fmt, vl);
- av_log_format_line(ptr, level, fmt, vl2, line, sizeof(line), &print_prefix);
- va_end(vl2);
- if (report_file_level >= level) {
- fputs(line, report_file);
- fflush(report_file);
- }
-}
-
-void init_dynload(void)
-{
-#if HAVE_SETDLLDIRECTORY && defined(_WIN32)
- /* Calling SetDllDirectory with the empty string (but not NULL) removes the
- * current working directory from the DLL search path as a security pre-caution. */
- SetDllDirectory("");
-#endif
-}
-
-static void (*program_exit)(int ret);
-
-void register_exit(void (*cb)(int ret))
-{
- program_exit = cb;
-}
-
-void exit_program(int ret)
-{
- if (program_exit)
- program_exit(ret);
-
- exit(ret);
-}
-
-double parse_number_or_die(const char *context, const char *numstr, int type,
- double min, double max)
-{
- char *tail;
- const char *error;
- double d = av_strtod(numstr, &tail);
- if (*tail)
- error = "Expected number for %s but found: %s\n";
- else if (d < min || d > max)
- error = "The value for %s was %s which is not within %f - %f\n";
- else if (type == OPT_INT64 && (int64_t)d != d)
- error = "Expected int64 for %s but found %s\n";
- else if (type == OPT_INT && (int)d != d)
- error = "Expected int for %s but found %s\n";
- else
- return d;
- av_log(NULL, AV_LOG_FATAL, error, context, numstr, min, max);
- exit_program(1);
- return 0;
-}
-
-int64_t parse_time_or_die(const char *context, const char *timestr,
- int is_duration)
-{
- int64_t us;
- if (av_parse_time(&us, timestr, is_duration) < 0) {
- av_log(NULL, AV_LOG_FATAL, "Invalid %s specification for %s: %s\n",
- is_duration ? "duration" : "date", context, timestr);
- exit_program(1);
- }
- return us;
-}
-
-void show_help_options(const OptionDef *options, const char *msg, int req_flags,
- int rej_flags, int alt_flags)
-{
- const OptionDef *po;
- int first;
-
- first = 1;
- for (po = options; po->name; po++) {
- char buf[128];
-
- if (((po->flags & req_flags) != req_flags) ||
- (alt_flags && !(po->flags & alt_flags)) ||
- (po->flags & rej_flags))
- continue;
-
- if (first) {
- printf("%s\n", msg);
- first = 0;
- }
- av_strlcpy(buf, po->name, sizeof(buf));
- if (po->argname) {
- av_strlcat(buf, " ", sizeof(buf));
- av_strlcat(buf, po->argname, sizeof(buf));
- }
- printf("-%-17s %s\n", buf, po->help);
- }
- printf("\n");
-}
-
-void show_help_children(const AVClass *class, int flags)
-{
- const AVClass *child = NULL;
- if (class->option) {
- av_opt_show2(&class, NULL, flags, 0);
- printf("\n");
- }
-
- while (child = av_opt_child_class_next(class, child))
- show_help_children(child, flags);
-}
-
-static const OptionDef *find_option(const OptionDef *po, const char *name)
-{
- const char *p = strchr(name, ':');
- int len = p ? p - name : strlen(name);
-
- while (po->name) {
- if (!strncmp(name, po->name, len) && strlen(po->name) == len)
- break;
- po++;
- }
- return po;
-}
-
-/* _WIN32 means using the windows libc - cygwin doesn't define that
- * by default. HAVE_COMMANDLINETOARGVW is true on cygwin, while
- * it doesn't provide the actual command line via GetCommandLineW(). */
-#if HAVE_COMMANDLINETOARGVW && defined(_WIN32)
-#include <shellapi.h>
-/* Will be leaked on exit */
-static char** win32_argv_utf8 = NULL;
-static int win32_argc = 0;
-
-/**
- * Prepare command line arguments for executable.
- * For Windows - perform wide-char to UTF-8 conversion.
- * Input arguments should be main() function arguments.
- * @param argc_ptr Arguments number (including executable)
- * @param argv_ptr Arguments list.
- */
-static void prepare_app_arguments(int *argc_ptr, char ***argv_ptr)
-{
- char *argstr_flat;
- wchar_t **argv_w;
- int i, buffsize = 0, offset = 0;
-
- if (win32_argv_utf8) {
- *argc_ptr = win32_argc;
- *argv_ptr = win32_argv_utf8;
- return;
- }
-
- win32_argc = 0;
- argv_w = CommandLineToArgvW(GetCommandLineW(), &win32_argc);
- if (win32_argc <= 0 || !argv_w)
- return;
-
- /* determine the UTF-8 buffer size (including NULL-termination symbols) */
- for (i = 0; i < win32_argc; i++)
- buffsize += WideCharToMultiByte(CP_UTF8, 0, argv_w[i], -1,
- NULL, 0, NULL, NULL);
-
- win32_argv_utf8 = av_mallocz(sizeof(char *) * (win32_argc + 1) + buffsize);
- argstr_flat = (char *)win32_argv_utf8 + sizeof(char *) * (win32_argc + 1);
- if (!win32_argv_utf8) {
- LocalFree(argv_w);
- return;
- }
-
- for (i = 0; i < win32_argc; i++) {
- win32_argv_utf8[i] = &argstr_flat[offset];
- offset += WideCharToMultiByte(CP_UTF8, 0, argv_w[i], -1,
- &argstr_flat[offset],
- buffsize - offset, NULL, NULL);
- }
- win32_argv_utf8[i] = NULL;
- LocalFree(argv_w);
-
- *argc_ptr = win32_argc;
- *argv_ptr = win32_argv_utf8;
-}
-#else
-static inline void prepare_app_arguments(int *argc_ptr, char ***argv_ptr)
-{
- /* nothing to do */
-}
-#endif /* HAVE_COMMANDLINETOARGVW */
-
-static int write_option(void *optctx, const OptionDef *po, const char *opt,
- const char *arg)
-{
- /* new-style options contain an offset into optctx, old-style address of
- * a global var*/
- void *dst = po->flags & (OPT_OFFSET | OPT_SPEC) ?
- (uint8_t *)optctx + po->u.off : po->u.dst_ptr;
- int *dstcount;
-
- if (po->flags & OPT_SPEC) {
- SpecifierOpt **so = dst;
- char *p = strchr(opt, ':');
- char *str;
-
- dstcount = (int *)(so + 1);
- *so = grow_array(*so, sizeof(**so), dstcount, *dstcount + 1);
- str = av_strdup(p ? p + 1 : "");
- if (!str)
- return AVERROR(ENOMEM);
- (*so)[*dstcount - 1].specifier = str;
- dst = &(*so)[*dstcount - 1].u;
- }
-
- if (po->flags & OPT_STRING) {
- char *str;
- str = av_strdup(arg);
- av_freep(dst);
- if (!str)
- return AVERROR(ENOMEM);
- *(char **)dst = str;
- } else if (po->flags & OPT_BOOL || po->flags & OPT_INT) {
- *(int *)dst = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
- } else if (po->flags & OPT_INT64) {
- *(int64_t *)dst = parse_number_or_die(opt, arg, OPT_INT64, INT64_MIN, INT64_MAX);
- } else if (po->flags & OPT_TIME) {
- *(int64_t *)dst = parse_time_or_die(opt, arg, 1);
- } else if (po->flags & OPT_FLOAT) {
- *(float *)dst = parse_number_or_die(opt, arg, OPT_FLOAT, -INFINITY, INFINITY);
- } else if (po->flags & OPT_DOUBLE) {
- *(double *)dst = parse_number_or_die(opt, arg, OPT_DOUBLE, -INFINITY, INFINITY);
- } else if (po->u.func_arg) {
- int ret = po->u.func_arg(optctx, opt, arg);
- if (ret < 0) {
- av_log(NULL, AV_LOG_ERROR,
- "Failed to set value '%s' for option '%s': %s\n",
- arg, opt, av_err2str(ret));
- return ret;
- }
- }
- if (po->flags & OPT_EXIT)
- exit_program(0);
-
- return 0;
-}
-
-int parse_option(void *optctx, const char *opt, const char *arg,
- const OptionDef *options)
-{
- const OptionDef *po;
- int ret;
-
- po = find_option(options, opt);
- if (!po->name && opt[0] == 'n' && opt[1] == 'o') {
- /* handle 'no' bool option */
- po = find_option(options, opt + 2);
- if ((po->name && (po->flags & OPT_BOOL)))
- arg = "0";
- } else if (po->flags & OPT_BOOL)
- arg = "1";
-
- if (!po->name)
- po = find_option(options, "default");
- if (!po->name) {
- av_log(NULL, AV_LOG_ERROR, "Unrecognized option '%s'\n", opt);
- return AVERROR(EINVAL);
- }
- if (po->flags & HAS_ARG && !arg) {
- av_log(NULL, AV_LOG_ERROR, "Missing argument for option '%s'\n", opt);
- return AVERROR(EINVAL);
- }
-
- ret = write_option(optctx, po, opt, arg);
- if (ret < 0)
- return ret;
-
- return !!(po->flags & HAS_ARG);
-}
-
-void parse_options(void *optctx, int argc, char **argv, const OptionDef *options,
- void (*parse_arg_function)(void *, const char*))
-{
- const char *opt;
- int optindex, handleoptions = 1, ret;
-
- /* perform system-dependent conversions for arguments list */
- prepare_app_arguments(&argc, &argv);
-
- /* parse options */
- optindex = 1;
- while (optindex < argc) {
- opt = argv[optindex++];
-
- if (handleoptions && opt[0] == '-' && opt[1] != '\0') {
- if (opt[1] == '-' && opt[2] == '\0') {
- handleoptions = 0;
- continue;
- }
- opt++;
-
- if ((ret = parse_option(optctx, opt, argv[optindex], options)) < 0)
- exit_program(1);
- optindex += ret;
- } else {
- if (parse_arg_function)
- parse_arg_function(optctx, opt);
- }
- }
-}
-
-int parse_optgroup(void *optctx, OptionGroup *g)
-{
- int i, ret;
-
- av_log(NULL, AV_LOG_DEBUG, "Parsing a group of options: %s %s.\n",
- g->group_def->name, g->arg);
-
- for (i = 0; i < g->nb_opts; i++) {
- Option *o = &g->opts[i];
-
- if (g->group_def->flags &&
- !(g->group_def->flags & o->opt->flags)) {
- av_log(NULL, AV_LOG_ERROR, "Option %s (%s) cannot be applied to "
- "%s %s -- you are trying to apply an input option to an "
- "output file or vice versa. Move this option before the "
- "file it belongs to.\n", o->key, o->opt->help,
- g->group_def->name, g->arg);
- return AVERROR(EINVAL);
- }
-
- av_log(NULL, AV_LOG_DEBUG, "Applying option %s (%s) with argument %s.\n",
- o->key, o->opt->help, o->val);
-
- ret = write_option(optctx, o->opt, o->key, o->val);
- if (ret < 0)
- return ret;
- }
-
- av_log(NULL, AV_LOG_DEBUG, "Successfully parsed a group of options.\n");
-
- return 0;
-}
-
-int locate_option(int argc, char **argv, const OptionDef *options,
- const char *optname)
-{
- const OptionDef *po;
- int i;
-
- for (i = 1; i < argc; i++) {
- const char *cur_opt = argv[i];
-
- if (*cur_opt++ != '-')
- continue;
-
- po = find_option(options, cur_opt);
- if (!po->name && cur_opt[0] == 'n' && cur_opt[1] == 'o')
- po = find_option(options, cur_opt + 2);
-
- if ((!po->name && !strcmp(cur_opt, optname)) ||
- (po->name && !strcmp(optname, po->name)))
- return i;
-
- if (!po->name || po->flags & HAS_ARG)
- i++;
- }
- return 0;
-}
-
-static void dump_argument(const char *a)
-{
- const unsigned char *p;
-
- for (p = a; *p; p++)
- if (!((*p >= '+' && *p <= ':') || (*p >= '@' && *p <= 'Z') ||
- *p == '_' || (*p >= 'a' && *p <= 'z')))
- break;
- if (!*p) {
- fputs(a, report_file);
- return;
- }
- fputc('"', report_file);
- for (p = a; *p; p++) {
- if (*p == '\\' || *p == '"' || *p == '$' || *p == '`')
- fprintf(report_file, "\\%c", *p);
- else if (*p < ' ' || *p > '~')
- fprintf(report_file, "\\x%02x", *p);
- else
- fputc(*p, report_file);
- }
- fputc('"', report_file);
-}
-
-static void check_options(const OptionDef *po)
-{
- while (po->name) {
- if (po->flags & OPT_PERFILE)
- av_assert0(po->flags & (OPT_INPUT | OPT_OUTPUT));
- po++;
- }
-}
-
-void parse_loglevel(int argc, char **argv, const OptionDef *options)
-{
- int idx = locate_option(argc, argv, options, "loglevel");
- const char *env;
-
- check_options(options);
-
- if (!idx)
- idx = locate_option(argc, argv, options, "v");
- if (idx && argv[idx + 1])
- opt_loglevel(NULL, "loglevel", argv[idx + 1]);
- idx = locate_option(argc, argv, options, "report");
- if ((env = getenv("FFREPORT")) || idx) {
- init_report(env);
- if (report_file) {
- int i;
- fprintf(report_file, "Command line:\n");
- for (i = 0; i < argc; i++) {
- dump_argument(argv[i]);
- fputc(i < argc - 1 ? ' ' : '\n', report_file);
- }
- fflush(report_file);
- }
- }
- idx = locate_option(argc, argv, options, "hide_banner");
- if (idx)
- hide_banner = 1;
-}
-
-static const AVOption *opt_find(void *obj, const char *name, const char *unit,
- int opt_flags, int search_flags)
-{
- const AVOption *o = av_opt_find(obj, name, unit, opt_flags, search_flags);
- if(o && !o->flags)
- return NULL;
- return o;
-}
-
-#define FLAGS (o->type == AV_OPT_TYPE_FLAGS && (arg[0]=='-' || arg[0]=='+')) ? AV_DICT_APPEND : 0
-int opt_default(void *optctx, const char *opt, const char *arg)
-{
- const AVOption *o;
- int consumed = 0;
- char opt_stripped[128];
- const char *p;
- const AVClass *cc = avcodec_get_class(), *fc = avformat_get_class();
-#if CONFIG_AVRESAMPLE
- const AVClass *rc = avresample_get_class();
-#endif
-#if CONFIG_SWSCALE
- const AVClass *sc = sws_get_class();
-#endif
-#if CONFIG_SWRESAMPLE
- const AVClass *swr_class = swr_get_class();
-#endif
-
- if (!strcmp(opt, "debug") || !strcmp(opt, "fdebug"))
- av_log_set_level(AV_LOG_DEBUG);
-
- if (!(p = strchr(opt, ':')))
- p = opt + strlen(opt);
- av_strlcpy(opt_stripped, opt, FFMIN(sizeof(opt_stripped), p - opt + 1));
-
- if ((o = opt_find(&cc, opt_stripped, NULL, 0,
- AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ)) ||
- ((opt[0] == 'v' || opt[0] == 'a' || opt[0] == 's') &&
- (o = opt_find(&cc, opt + 1, NULL, 0, AV_OPT_SEARCH_FAKE_OBJ)))) {
- av_dict_set(&codec_opts, opt, arg, FLAGS);
- consumed = 1;
- }
- if ((o = opt_find(&fc, opt, NULL, 0,
- AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ))) {
- av_dict_set(&format_opts, opt, arg, FLAGS);
- if (consumed)
- av_log(NULL, AV_LOG_VERBOSE, "Routing option %s to both codec and muxer layer\n", opt);
- consumed = 1;
- }
-#if CONFIG_SWSCALE
- if (!consumed && (o = opt_find(&sc, opt, NULL, 0,
- AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ))) {
- struct SwsContext *sws = sws_alloc_context();
- int ret = av_opt_set(sws, opt, arg, 0);
- sws_freeContext(sws);
- if (!strcmp(opt, "srcw") || !strcmp(opt, "srch") ||
- !strcmp(opt, "dstw") || !strcmp(opt, "dsth") ||
- !strcmp(opt, "src_format") || !strcmp(opt, "dst_format")) {
- av_log(NULL, AV_LOG_ERROR, "Directly using swscale dimensions/format options is not supported, please use the -s or -pix_fmt options\n");
- return AVERROR(EINVAL);
- }
- if (ret < 0) {
- av_log(NULL, AV_LOG_ERROR, "Error setting option %s.\n", opt);
- return ret;
- }
-
- av_dict_set(&sws_dict, opt, arg, FLAGS);
-
- consumed = 1;
- }
-#else
- if (!consumed && !strcmp(opt, "sws_flags")) {
- av_log(NULL, AV_LOG_WARNING, "Ignoring %s %s, due to disabled swscale\n", opt, arg);
- consumed = 1;
- }
-#endif
-#if CONFIG_SWRESAMPLE
- if (!consumed && (o=opt_find(&swr_class, opt, NULL, 0,
- AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ))) {
- struct SwrContext *swr = swr_alloc();
- int ret = av_opt_set(swr, opt, arg, 0);
- swr_free(&swr);
- if (ret < 0) {
- av_log(NULL, AV_LOG_ERROR, "Error setting option %s.\n", opt);
- return ret;
- }
- av_dict_set(&swr_opts, opt, arg, FLAGS);
- consumed = 1;
- }
-#endif
-#if CONFIG_AVRESAMPLE
- if ((o=opt_find(&rc, opt, NULL, 0,
- AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ))) {
- av_dict_set(&resample_opts, opt, arg, FLAGS);
- consumed = 1;
- }
-#endif
-
- if (consumed)
- return 0;
- return AVERROR_OPTION_NOT_FOUND;
-}
-
-/*
- * Check whether given option is a group separator.
- *
- * @return index of the group definition that matched or -1 if none
- */
-static int match_group_separator(const OptionGroupDef *groups, int nb_groups,
- const char *opt)
-{
- int i;
-
- for (i = 0; i < nb_groups; i++) {
- const OptionGroupDef *p = &groups[i];
- if (p->sep && !strcmp(p->sep, opt))
- return i;
- }
-
- return -1;
-}
-
-/*
- * Finish parsing an option group.
- *
- * @param group_idx which group definition should this group belong to
- * @param arg argument of the group delimiting option
- */
-static void finish_group(OptionParseContext *octx, int group_idx,
- const char *arg)
-{
- OptionGroupList *l = &octx->groups[group_idx];
- OptionGroup *g;
-
- GROW_ARRAY(l->groups, l->nb_groups);
- g = &l->groups[l->nb_groups - 1];
-
- *g = octx->cur_group;
- g->arg = arg;
- g->group_def = l->group_def;
- g->sws_dict = sws_dict;
- g->swr_opts = swr_opts;
- g->codec_opts = codec_opts;
- g->format_opts = format_opts;
- g->resample_opts = resample_opts;
-
- codec_opts = NULL;
- format_opts = NULL;
- resample_opts = NULL;
- sws_dict = NULL;
- swr_opts = NULL;
- init_opts();
-
- memset(&octx->cur_group, 0, sizeof(octx->cur_group));
-}
-
-/*
- * Add an option instance to currently parsed group.
- */
-static void add_opt(OptionParseContext *octx, const OptionDef *opt,
- const char *key, const char *val)
-{
- int global = !(opt->flags & (OPT_PERFILE | OPT_SPEC | OPT_OFFSET));
- OptionGroup *g = global ? &octx->global_opts : &octx->cur_group;
-
- GROW_ARRAY(g->opts, g->nb_opts);
- g->opts[g->nb_opts - 1].opt = opt;
- g->opts[g->nb_opts - 1].key = key;
- g->opts[g->nb_opts - 1].val = val;
-}
-
-static void init_parse_context(OptionParseContext *octx,
- const OptionGroupDef *groups, int nb_groups)
-{
- static const OptionGroupDef global_group = { "global" };
- int i;
-
- memset(octx, 0, sizeof(*octx));
-
- octx->nb_groups = nb_groups;
- octx->groups = av_mallocz_array(octx->nb_groups, sizeof(*octx->groups));
- if (!octx->groups)
- exit_program(1);
-
- for (i = 0; i < octx->nb_groups; i++)
- octx->groups[i].group_def = &groups[i];
-
- octx->global_opts.group_def = &global_group;
- octx->global_opts.arg = "";
-
- init_opts();
-}
-
-void uninit_parse_context(OptionParseContext *octx)
-{
- int i, j;
-
- for (i = 0; i < octx->nb_groups; i++) {
- OptionGroupList *l = &octx->groups[i];
-
- for (j = 0; j < l->nb_groups; j++) {
- av_freep(&l->groups[j].opts);
- av_dict_free(&l->groups[j].codec_opts);
- av_dict_free(&l->groups[j].format_opts);
- av_dict_free(&l->groups[j].resample_opts);
-
- av_dict_free(&l->groups[j].sws_dict);
- av_dict_free(&l->groups[j].swr_opts);
- }
- av_freep(&l->groups);
- }
- av_freep(&octx->groups);
-
- av_freep(&octx->cur_group.opts);
- av_freep(&octx->global_opts.opts);
-
- uninit_opts();
-}
-
-int split_commandline(OptionParseContext *octx, int argc, char *argv[],
- const OptionDef *options,
- const OptionGroupDef *groups, int nb_groups)
-{
- int optindex = 1;
- int dashdash = -2;
-
- /* perform system-dependent conversions for arguments list */
- prepare_app_arguments(&argc, &argv);
-
- init_parse_context(octx, groups, nb_groups);
- av_log(NULL, AV_LOG_DEBUG, "Splitting the commandline.\n");
-
- while (optindex < argc) {
- const char *opt = argv[optindex++], *arg;
- const OptionDef *po;
- int ret;
-
- av_log(NULL, AV_LOG_DEBUG, "Reading option '%s' ...", opt);
-
- if (opt[0] == '-' && opt[1] == '-' && !opt[2]) {
- dashdash = optindex;
- continue;
- }
- /* unnamed group separators, e.g. output filename */
- if (opt[0] != '-' || !opt[1] || dashdash+1 == optindex) {
- finish_group(octx, 0, opt);
- av_log(NULL, AV_LOG_DEBUG, " matched as %s.\n", groups[0].name);
- continue;
- }
- opt++;
-
-#define GET_ARG(arg) \
-do { \
- arg = argv[optindex++]; \
- if (!arg) { \
- av_log(NULL, AV_LOG_ERROR, "Missing argument for option '%s'.\n", opt);\
- return AVERROR(EINVAL); \
- } \
-} while (0)
-
- /* named group separators, e.g. -i */
- if ((ret = match_group_separator(groups, nb_groups, opt)) >= 0) {
- GET_ARG(arg);
- finish_group(octx, ret, arg);
- av_log(NULL, AV_LOG_DEBUG, " matched as %s with argument '%s'.\n",
- groups[ret].name, arg);
- continue;
- }
-
- /* normal options */
- po = find_option(options, opt);
- if (po->name) {
- if (po->flags & OPT_EXIT) {
- /* optional argument, e.g. -h */
- arg = argv[optindex++];
- } else if (po->flags & HAS_ARG) {
- GET_ARG(arg);
- } else {
- arg = "1";
- }
-
- add_opt(octx, po, opt, arg);
- av_log(NULL, AV_LOG_DEBUG, " matched as option '%s' (%s) with "
- "argument '%s'.\n", po->name, po->help, arg);
- continue;
- }
-
- /* AVOptions */
- if (argv[optindex]) {
- ret = opt_default(NULL, opt, argv[optindex]);
- if (ret >= 0) {
- av_log(NULL, AV_LOG_DEBUG, " matched as AVOption '%s' with "
- "argument '%s'.\n", opt, argv[optindex]);
- optindex++;
- continue;
- } else if (ret != AVERROR_OPTION_NOT_FOUND) {
- av_log(NULL, AV_LOG_ERROR, "Error parsing option '%s' "
- "with argument '%s'.\n", opt, argv[optindex]);
- return ret;
- }
- }
-
- /* boolean -nofoo options */
- if (opt[0] == 'n' && opt[1] == 'o' &&
- (po = find_option(options, opt + 2)) &&
- po->name && po->flags & OPT_BOOL) {
- add_opt(octx, po, opt, "0");
- av_log(NULL, AV_LOG_DEBUG, " matched as option '%s' (%s) with "
- "argument 0.\n", po->name, po->help);
- continue;
- }
-
- av_log(NULL, AV_LOG_ERROR, "Unrecognized option '%s'.\n", opt);
- return AVERROR_OPTION_NOT_FOUND;
- }
-
- if (octx->cur_group.nb_opts || codec_opts || format_opts || resample_opts)
- av_log(NULL, AV_LOG_WARNING, "Trailing option(s) found in the "
- "command: may be ignored.\n");
-
- av_log(NULL, AV_LOG_DEBUG, "Finished splitting the commandline.\n");
-
- return 0;
-}
-
-int opt_cpuflags(void *optctx, const char *opt, const char *arg)
-{
- int ret;
- unsigned flags = av_get_cpu_flags();
-
- if ((ret = av_parse_cpu_caps(&flags, arg)) < 0)
- return ret;
-
- av_force_cpu_flags(flags);
- return 0;
-}
-
-int opt_loglevel(void *optctx, const char *opt, const char *arg)
-{
- const struct { const char *name; int level; } log_levels[] = {
- { "quiet" , AV_LOG_QUIET },
- { "panic" , AV_LOG_PANIC },
- { "fatal" , AV_LOG_FATAL },
- { "error" , AV_LOG_ERROR },
- { "warning", AV_LOG_WARNING },
- { "info" , AV_LOG_INFO },
- { "verbose", AV_LOG_VERBOSE },
- { "debug" , AV_LOG_DEBUG },
- { "trace" , AV_LOG_TRACE },
- };
- const char *token;
- char *tail;
- int flags = av_log_get_flags();
- int level = av_log_get_level();
- int cmd, i = 0;
-
- av_assert0(arg);
- while (*arg) {
- token = arg;
- if (*token == '+' || *token == '-') {
- cmd = *token++;
- } else {
- cmd = 0;
- }
- if (!i && !cmd) {
- flags = 0; /* missing relative prefix, build absolute value */
- }
- if (!strncmp(token, "repeat", 6)) {
- if (cmd == '-') {
- flags |= AV_LOG_SKIP_REPEATED;
- } else {
- flags &= ~AV_LOG_SKIP_REPEATED;
- }
- arg = token + 6;
- } else if (!strncmp(token, "level", 5)) {
- if (cmd == '-') {
- flags &= ~AV_LOG_PRINT_LEVEL;
- } else {
- flags |= AV_LOG_PRINT_LEVEL;
- }
- arg = token + 5;
- } else {
- break;
- }
- i++;
- }
- if (!*arg) {
- goto end;
- } else if (*arg == '+') {
- arg++;
- } else if (!i) {
- flags = av_log_get_flags(); /* level value without prefix, reset flags */
- }
-
- for (i = 0; i < FF_ARRAY_ELEMS(log_levels); i++) {
- if (!strcmp(log_levels[i].name, arg)) {
- level = log_levels[i].level;
- goto end;
- }
- }
-
- level = strtol(arg, &tail, 10);
- if (*tail) {
- av_log(NULL, AV_LOG_FATAL, "Invalid loglevel \"%s\". "
- "Possible levels are numbers or:\n", arg);
- for (i = 0; i < FF_ARRAY_ELEMS(log_levels); i++)
- av_log(NULL, AV_LOG_FATAL, "\"%s\"\n", log_levels[i].name);
- exit_program(1);
- }
-
-end:
- av_log_set_flags(flags);
- av_log_set_level(level);
- return 0;
-}
-
-static void expand_filename_template(AVBPrint *bp, const char *template,
- struct tm *tm)
-{
- int c;
-
- while ((c = *(template++))) {
- if (c == '%') {
- if (!(c = *(template++)))
- break;
- switch (c) {
- case 'p':
- av_bprintf(bp, "%s", program_name);
- break;
- case 't':
- av_bprintf(bp, "%04d%02d%02d-%02d%02d%02d",
- tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
- tm->tm_hour, tm->tm_min, tm->tm_sec);
- break;
- case '%':
- av_bprint_chars(bp, c, 1);
- break;
- }
- } else {
- av_bprint_chars(bp, c, 1);
- }
- }
-}
-
-static int init_report(const char *env)
-{
- char *filename_template = NULL;
- char *key, *val;
- int ret, count = 0;
- int prog_loglevel, envlevel = 0;
- time_t now;
- struct tm *tm;
- AVBPrint filename;
-
- if (report_file) /* already opened */
- return 0;
- time(&now);
- tm = localtime(&now);
-
- while (env && *env) {
- if ((ret = av_opt_get_key_value(&env, "=", ":", 0, &key, &val)) < 0) {
- if (count)
- av_log(NULL, AV_LOG_ERROR,
- "Failed to parse FFREPORT environment variable: %s\n",
- av_err2str(ret));
- break;
- }
- if (*env)
- env++;
- count++;
- if (!strcmp(key, "file")) {
- av_free(filename_template);
- filename_template = val;
- val = NULL;
- } else if (!strcmp(key, "level")) {
- char *tail;
- report_file_level = strtol(val, &tail, 10);
- if (*tail) {
- av_log(NULL, AV_LOG_FATAL, "Invalid report file level\n");
- exit_program(1);
- }
- envlevel = 1;
- } else {
- av_log(NULL, AV_LOG_ERROR, "Unknown key '%s' in FFREPORT\n", key);
- }
- av_free(val);
- av_free(key);
- }
-
- av_bprint_init(&filename, 0, AV_BPRINT_SIZE_AUTOMATIC);
- expand_filename_template(&filename,
- av_x_if_null(filename_template, "%p-%t.log"), tm);
- av_free(filename_template);
- if (!av_bprint_is_complete(&filename)) {
- av_log(NULL, AV_LOG_ERROR, "Out of memory building report file name\n");
- return AVERROR(ENOMEM);
- }
-
- prog_loglevel = av_log_get_level();
- if (!envlevel)
- report_file_level = FFMAX(report_file_level, prog_loglevel);
-
- report_file = fopen(filename.str, "w");
- if (!report_file) {
- int ret = AVERROR(errno);
- av_log(NULL, AV_LOG_ERROR, "Failed to open report \"%s\": %s\n",
- filename.str, strerror(errno));
- return ret;
- }
- av_log_set_callback(log_callback_report);
- av_log(NULL, AV_LOG_INFO,
- "%s started on %04d-%02d-%02d at %02d:%02d:%02d\n"
- "Report written to \"%s\"\n"
- "Log level: %d\n",
- program_name,
- tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
- tm->tm_hour, tm->tm_min, tm->tm_sec,
- filename.str, report_file_level);
- av_bprint_finalize(&filename, NULL);
- return 0;
-}
-
-int opt_report(void *optctx, const char *opt, const char *arg)
-{
- return init_report(NULL);
-}
-
-int opt_max_alloc(void *optctx, const char *opt, const char *arg)
-{
- char *tail;
- size_t max;
-
- max = strtol(arg, &tail, 10);
- if (*tail) {
- av_log(NULL, AV_LOG_FATAL, "Invalid max_alloc \"%s\".\n", arg);
- exit_program(1);
- }
- av_max_alloc(max);
- return 0;
-}
-
-int opt_timelimit(void *optctx, const char *opt, const char *arg)
-{
-#if HAVE_SETRLIMIT
- int lim = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
- struct rlimit rl = { lim, lim + 1 };
- if (setrlimit(RLIMIT_CPU, &rl))
- perror("setrlimit");
-#else
- av_log(NULL, AV_LOG_WARNING, "-%s not implemented on this OS\n", opt);
-#endif
- return 0;
-}
-
-void print_error(const char *filename, int err)
-{
- char errbuf[128];
- const char *errbuf_ptr = errbuf;
-
- if (av_strerror(err, errbuf, sizeof(errbuf)) < 0)
- errbuf_ptr = strerror(AVUNERROR(err));
- av_log(NULL, AV_LOG_ERROR, "%s: %s\n", filename, errbuf_ptr);
-}
-
-static int warned_cfg = 0;
-
-#define INDENT 1
-#define SHOW_VERSION 2
-#define SHOW_CONFIG 4
-#define SHOW_COPYRIGHT 8
-
-#define PRINT_LIB_INFO(libname, LIBNAME, flags, level) \
- if (CONFIG_##LIBNAME) { \
- const char *indent = flags & INDENT? " " : ""; \
- if (flags & SHOW_VERSION) { \
- unsigned int version = libname##_version(); \
- av_log(NULL, level, \
- "%slib%-11s %2d.%3d.%3d / %2d.%3d.%3d\n", \
- indent, #libname, \
- LIB##LIBNAME##_VERSION_MAJOR, \
- LIB##LIBNAME##_VERSION_MINOR, \
- LIB##LIBNAME##_VERSION_MICRO, \
- AV_VERSION_MAJOR(version), AV_VERSION_MINOR(version),\
- AV_VERSION_MICRO(version)); \
- } \
- if (flags & SHOW_CONFIG) { \
- const char *cfg = libname##_configuration(); \
- if (strcmp(FFMPEG_CONFIGURATION, cfg)) { \
- if (!warned_cfg) { \
- av_log(NULL, level, \
- "%sWARNING: library configuration mismatch\n", \
- indent); \
- warned_cfg = 1; \
- } \
- av_log(NULL, level, "%s%-11s configuration: %s\n", \
- indent, #libname, cfg); \
- } \
- } \
- } \
-
-static void print_all_libs_info(int flags, int level)
-{
- PRINT_LIB_INFO(avutil, AVUTIL, flags, level);
- PRINT_LIB_INFO(avcodec, AVCODEC, flags, level);
- PRINT_LIB_INFO(avformat, AVFORMAT, flags, level);
- PRINT_LIB_INFO(avdevice, AVDEVICE, flags, level);
- PRINT_LIB_INFO(avfilter, AVFILTER, flags, level);
- PRINT_LIB_INFO(avresample, AVRESAMPLE, flags, level);
- PRINT_LIB_INFO(swscale, SWSCALE, flags, level);
- PRINT_LIB_INFO(swresample, SWRESAMPLE, flags, level);
- PRINT_LIB_INFO(postproc, POSTPROC, flags, level);
-}
-
-static void print_program_info(int flags, int level)
-{
- const char *indent = flags & INDENT? " " : "";
-
- av_log(NULL, level, "%s version " FFMPEG_VERSION, program_name);
- if (flags & SHOW_COPYRIGHT)
- av_log(NULL, level, " Copyright (c) %d-%d the FFmpeg developers",
- program_birth_year, CONFIG_THIS_YEAR);
- av_log(NULL, level, "\n");
- av_log(NULL, level, "%sbuilt with %s\n", indent, CC_IDENT);
-
- av_log(NULL, level, "%sconfiguration: " FFMPEG_CONFIGURATION "\n", indent);
-}
-
-static void print_buildconf(int flags, int level)
-{
- const char *indent = flags & INDENT ? " " : "";
- char str[] = { FFMPEG_CONFIGURATION };
- char *conflist, *remove_tilde, *splitconf;
-
- // Change all the ' --' strings to '~--' so that
- // they can be identified as tokens.
- while ((conflist = strstr(str, " --")) != NULL) {
- strncpy(conflist, "~--", 3);
- }
-
- // Compensate for the weirdness this would cause
- // when passing 'pkg-config --static'.
- while ((remove_tilde = strstr(str, "pkg-config~")) != NULL) {
- strncpy(remove_tilde, "pkg-config ", 11);
- }
-
- splitconf = strtok(str, "~");
- av_log(NULL, level, "\n%sconfiguration:\n", indent);
- while (splitconf != NULL) {
- av_log(NULL, level, "%s%s%s\n", indent, indent, splitconf);
- splitconf = strtok(NULL, "~");
- }
-}
-
-void show_banner(int argc, char **argv, const OptionDef *options)
-{
- int idx = locate_option(argc, argv, options, "version");
- if (hide_banner || idx)
- return;
-
- print_program_info (INDENT|SHOW_COPYRIGHT, AV_LOG_INFO);
- print_all_libs_info(INDENT|SHOW_CONFIG, AV_LOG_INFO);
- print_all_libs_info(INDENT|SHOW_VERSION, AV_LOG_INFO);
-}
-
-int show_version(void *optctx, const char *opt, const char *arg)
-{
- av_log_set_callback(log_callback_help);
- print_program_info (SHOW_COPYRIGHT, AV_LOG_INFO);
- print_all_libs_info(SHOW_VERSION, AV_LOG_INFO);
-
- return 0;
-}
-
-int show_buildconf(void *optctx, const char *opt, const char *arg)
-{
- av_log_set_callback(log_callback_help);
- print_buildconf (INDENT|0, AV_LOG_INFO);
-
- return 0;
-}
-
-int show_license(void *optctx, const char *opt, const char *arg)
-{
-#if CONFIG_NONFREE
- printf(
- "This version of %s has nonfree parts compiled in.\n"
- "Therefore it is not legally redistributable.\n",
- program_name );
-#elif CONFIG_GPLV3
- printf(
- "%s is free software; you can redistribute it and/or modify\n"
- "it under the terms of the GNU General Public License as published by\n"
- "the Free Software Foundation; either version 3 of the License, or\n"
- "(at your option) any later version.\n"
- "\n"
- "%s is distributed in the hope that it will be useful,\n"
- "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
- "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
- "GNU General Public License for more details.\n"
- "\n"
- "You should have received a copy of the GNU General Public License\n"
- "along with %s. If not, see <http://www.gnu.org/licenses/>.\n",
- program_name, program_name, program_name );
-#elif CONFIG_GPL
- printf(
- "%s is free software; you can redistribute it and/or modify\n"
- "it under the terms of the GNU General Public License as published by\n"
- "the Free Software Foundation; either version 2 of the License, or\n"
- "(at your option) any later version.\n"
- "\n"
- "%s is distributed in the hope that it will be useful,\n"
- "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
- "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
- "GNU General Public License for more details.\n"
- "\n"
- "You should have received a copy of the GNU General Public License\n"
- "along with %s; if not, write to the Free Software\n"
- "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n",
- program_name, program_name, program_name );
-#elif CONFIG_LGPLV3
- printf(
- "%s is free software; you can redistribute it and/or modify\n"
- "it under the terms of the GNU Lesser General Public License as published by\n"
- "the Free Software Foundation; either version 3 of the License, or\n"
- "(at your option) any later version.\n"
- "\n"
- "%s is distributed in the hope that it will be useful,\n"
- "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
- "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
- "GNU Lesser General Public License for more details.\n"
- "\n"
- "You should have received a copy of the GNU Lesser General Public License\n"
- "along with %s. If not, see <http://www.gnu.org/licenses/>.\n",
- program_name, program_name, program_name );
-#else
- printf(
- "%s is free software; you can redistribute it and/or\n"
- "modify it under the terms of the GNU Lesser General Public\n"
- "License as published by the Free Software Foundation; either\n"
- "version 2.1 of the License, or (at your option) any later version.\n"
- "\n"
- "%s is distributed in the hope that it will be useful,\n"
- "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
- "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
- "Lesser General Public License for more details.\n"
- "\n"
- "You should have received a copy of the GNU Lesser General Public\n"
- "License along with %s; if not, write to the Free Software\n"
- "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n",
- program_name, program_name, program_name );
-#endif
-
- return 0;
-}
-
-static int is_device(const AVClass *avclass)
-{
- if (!avclass)
- return 0;
- return AV_IS_INPUT_DEVICE(avclass->category) || AV_IS_OUTPUT_DEVICE(avclass->category);
-}
-
-static int show_formats_devices(void *optctx, const char *opt, const char *arg, int device_only, int muxdemuxers)
-{
- void *ifmt_opaque = NULL;
- const AVInputFormat *ifmt = NULL;
- void *ofmt_opaque = NULL;
- const AVOutputFormat *ofmt = NULL;
- const char *last_name;
- int is_dev;
-
- printf("%s\n"
- " D. = Demuxing supported\n"
- " .E = Muxing supported\n"
- " --\n", device_only ? "Devices:" : "File formats:");
- last_name = "000";
- for (;;) {
- int decode = 0;
- int encode = 0;
- const char *name = NULL;
- const char *long_name = NULL;
-
- if (muxdemuxers !=SHOW_DEMUXERS) {
- ofmt_opaque = NULL;
- while ((ofmt = av_muxer_iterate(&ofmt_opaque))) {
- is_dev = is_device(ofmt->priv_class);
- if (!is_dev && device_only)
- continue;
- if ((!name || strcmp(ofmt->name, name) < 0) &&
- strcmp(ofmt->name, last_name) > 0) {
- name = ofmt->name;
- long_name = ofmt->long_name;
- encode = 1;
- }
- }
- }
- if (muxdemuxers != SHOW_MUXERS) {
- ifmt_opaque = NULL;
- while ((ifmt = av_demuxer_iterate(&ifmt_opaque))) {
- is_dev = is_device(ifmt->priv_class);
- if (!is_dev && device_only)
- continue;
- if ((!name || strcmp(ifmt->name, name) < 0) &&
- strcmp(ifmt->name, last_name) > 0) {
- name = ifmt->name;
- long_name = ifmt->long_name;
- encode = 0;
- }
- if (name && strcmp(ifmt->name, name) == 0)
- decode = 1;
- }
- }
- if (!name)
- break;
- last_name = name;
-
- printf(" %s%s %-15s %s\n",
- decode ? "D" : " ",
- encode ? "E" : " ",
- name,
- long_name ? long_name:" ");
- }
- return 0;
-}
-
-int show_formats(void *optctx, const char *opt, const char *arg)
-{
- return show_formats_devices(optctx, opt, arg, 0, SHOW_DEFAULT);
-}
-
-int show_muxers(void *optctx, const char *opt, const char *arg)
-{
- return show_formats_devices(optctx, opt, arg, 0, SHOW_MUXERS);
-}
-
-int show_demuxers(void *optctx, const char *opt, const char *arg)
-{
- return show_formats_devices(optctx, opt, arg, 0, SHOW_DEMUXERS);
-}
-
-int show_devices(void *optctx, const char *opt, const char *arg)
-{
- return show_formats_devices(optctx, opt, arg, 1, SHOW_DEFAULT);
-}
-
-#define PRINT_CODEC_SUPPORTED(codec, field, type, list_name, term, get_name) \
- if (codec->field) { \
- const type *p = codec->field; \
- \
- printf(" Supported " list_name ":"); \
- while (*p != term) { \
- get_name(*p); \
- printf(" %s", name); \
- p++; \
- } \
- printf("\n"); \
- } \
-
-static void print_codec(const AVCodec *c)
-{
- int encoder = av_codec_is_encoder(c);
-
- printf("%s %s [%s]:\n", encoder ? "Encoder" : "Decoder", c->name,
- c->long_name ? c->long_name : "");
-
- printf(" General capabilities: ");
- if (c->capabilities & AV_CODEC_CAP_DRAW_HORIZ_BAND)
- printf("horizband ");
- if (c->capabilities & AV_CODEC_CAP_DR1)
- printf("dr1 ");
- if (c->capabilities & AV_CODEC_CAP_TRUNCATED)
- printf("trunc ");
- if (c->capabilities & AV_CODEC_CAP_DELAY)
- printf("delay ");
- if (c->capabilities & AV_CODEC_CAP_SMALL_LAST_FRAME)
- printf("small ");
- if (c->capabilities & AV_CODEC_CAP_SUBFRAMES)
- printf("subframes ");
- if (c->capabilities & AV_CODEC_CAP_EXPERIMENTAL)
- printf("exp ");
- if (c->capabilities & AV_CODEC_CAP_CHANNEL_CONF)
- printf("chconf ");
- if (c->capabilities & AV_CODEC_CAP_PARAM_CHANGE)
- printf("paramchange ");
- if (c->capabilities & AV_CODEC_CAP_VARIABLE_FRAME_SIZE)
- printf("variable ");
- if (c->capabilities & (AV_CODEC_CAP_FRAME_THREADS |
- AV_CODEC_CAP_SLICE_THREADS |
- AV_CODEC_CAP_AUTO_THREADS))
- printf("threads ");
- if (c->capabilities & AV_CODEC_CAP_AVOID_PROBING)
- printf("avoidprobe ");
- if (c->capabilities & AV_CODEC_CAP_INTRA_ONLY)
- printf("intraonly ");
- if (c->capabilities & AV_CODEC_CAP_LOSSLESS)
- printf("lossless ");
- if (c->capabilities & AV_CODEC_CAP_HARDWARE)
- printf("hardware ");
- if (c->capabilities & AV_CODEC_CAP_HYBRID)
- printf("hybrid ");
- if (!c->capabilities)
- printf("none");
- printf("\n");
-
- if (c->type == AVMEDIA_TYPE_VIDEO ||
- c->type == AVMEDIA_TYPE_AUDIO) {
- printf(" Threading capabilities: ");
- switch (c->capabilities & (AV_CODEC_CAP_FRAME_THREADS |
- AV_CODEC_CAP_SLICE_THREADS |
- AV_CODEC_CAP_AUTO_THREADS)) {
- case AV_CODEC_CAP_FRAME_THREADS |
- AV_CODEC_CAP_SLICE_THREADS: printf("frame and slice"); break;
- case AV_CODEC_CAP_FRAME_THREADS: printf("frame"); break;
- case AV_CODEC_CAP_SLICE_THREADS: printf("slice"); break;
- case AV_CODEC_CAP_AUTO_THREADS : printf("auto"); break;
- default: printf("none"); break;
- }
- printf("\n");
- }
-
- if (avcodec_get_hw_config(c, 0)) {
- printf(" Supported hardware devices: ");
- for (int i = 0;; i++) {
- const AVCodecHWConfig *config = avcodec_get_hw_config(c, i);
- if (!config)
- break;
- printf("%s ", av_hwdevice_get_type_name(config->device_type));
- }
- printf("\n");
- }
-
- if (c->supported_framerates) {
- const AVRational *fps = c->supported_framerates;
-
- printf(" Supported framerates:");
- while (fps->num) {
- printf(" %d/%d", fps->num, fps->den);
- fps++;
- }
- printf("\n");
- }
- PRINT_CODEC_SUPPORTED(c, pix_fmts, enum AVPixelFormat, "pixel formats",
- AV_PIX_FMT_NONE, GET_PIX_FMT_NAME);
- PRINT_CODEC_SUPPORTED(c, supported_samplerates, int, "sample rates", 0,
- GET_SAMPLE_RATE_NAME);
- PRINT_CODEC_SUPPORTED(c, sample_fmts, enum AVSampleFormat, "sample formats",
- AV_SAMPLE_FMT_NONE, GET_SAMPLE_FMT_NAME);
- PRINT_CODEC_SUPPORTED(c, channel_layouts, uint64_t, "channel layouts",
- 0, GET_CH_LAYOUT_DESC);
-
- if (c->priv_class) {
- show_help_children(c->priv_class,
- AV_OPT_FLAG_ENCODING_PARAM |
- AV_OPT_FLAG_DECODING_PARAM);
- }
-}
-
-static char get_media_type_char(enum AVMediaType type)
-{
- switch (type) {
- case AVMEDIA_TYPE_VIDEO: return 'V';
- case AVMEDIA_TYPE_AUDIO: return 'A';
- case AVMEDIA_TYPE_DATA: return 'D';
- case AVMEDIA_TYPE_SUBTITLE: return 'S';
- case AVMEDIA_TYPE_ATTACHMENT:return 'T';
- default: return '?';
- }
-}
-
-static const AVCodec *next_codec_for_id(enum AVCodecID id, void **iter,
- int encoder)
-{
- const AVCodec *c;
- while ((c = av_codec_iterate(iter))) {
- if (c->id == id &&
- (encoder ? av_codec_is_encoder(c) : av_codec_is_decoder(c)))
- return c;
- }
- return NULL;
-}
-
-static int compare_codec_desc(const void *a, const void *b)
-{
- const AVCodecDescriptor * const *da = a;
- const AVCodecDescriptor * const *db = b;
-
- return (*da)->type != (*db)->type ? FFDIFFSIGN((*da)->type, (*db)->type) :
- strcmp((*da)->name, (*db)->name);
-}
-
-static unsigned get_codecs_sorted(const AVCodecDescriptor ***rcodecs)
-{
- const AVCodecDescriptor *desc = NULL;
- const AVCodecDescriptor **codecs;
- unsigned nb_codecs = 0, i = 0;
-
- while ((desc = avcodec_descriptor_next(desc)))
- nb_codecs++;
- if (!(codecs = av_calloc(nb_codecs, sizeof(*codecs)))) {
- av_log(NULL, AV_LOG_ERROR, "Out of memory\n");
- exit_program(1);
- }
- desc = NULL;
- while ((desc = avcodec_descriptor_next(desc)))
- codecs[i++] = desc;
- av_assert0(i == nb_codecs);
- qsort(codecs, nb_codecs, sizeof(*codecs), compare_codec_desc);
- *rcodecs = codecs;
- return nb_codecs;
-}
-
-static void print_codecs_for_id(enum AVCodecID id, int encoder)
-{
- void *iter = NULL;
- const AVCodec *codec;
-
- printf(" (%s: ", encoder ? "encoders" : "decoders");
-
- while ((codec = next_codec_for_id(id, &iter, encoder)))
- printf("%s ", codec->name);
-
- printf(")");
-}
-
-int show_codecs(void *optctx, const char *opt, const char *arg)
-{
- const AVCodecDescriptor **codecs;
- unsigned i, nb_codecs = get_codecs_sorted(&codecs);
-
- printf("Codecs:\n"
- " D..... = Decoding supported\n"
- " .E.... = Encoding supported\n"
- " ..V... = Video codec\n"
- " ..A... = Audio codec\n"
- " ..S... = Subtitle codec\n"
- " ...I.. = Intra frame-only codec\n"
- " ....L. = Lossy compression\n"
- " .....S = Lossless compression\n"
- " -------\n");
- for (i = 0; i < nb_codecs; i++) {
- const AVCodecDescriptor *desc = codecs[i];
- const AVCodec *codec;
- void *iter = NULL;
-
- if (strstr(desc->name, "_deprecated"))
- continue;
-
- printf(" ");
- printf(avcodec_find_decoder(desc->id) ? "D" : ".");
- printf(avcodec_find_encoder(desc->id) ? "E" : ".");
-
- printf("%c", get_media_type_char(desc->type));
- printf((desc->props & AV_CODEC_PROP_INTRA_ONLY) ? "I" : ".");
- printf((desc->props & AV_CODEC_PROP_LOSSY) ? "L" : ".");
- printf((desc->props & AV_CODEC_PROP_LOSSLESS) ? "S" : ".");
-
- printf(" %-20s %s", desc->name, desc->long_name ? desc->long_name : "");
-
- /* print decoders/encoders when there's more than one or their
- * names are different from codec name */
- while ((codec = next_codec_for_id(desc->id, &iter, 0))) {
- if (strcmp(codec->name, desc->name)) {
- print_codecs_for_id(desc->id, 0);
- break;
- }
- }
- iter = NULL;
- while ((codec = next_codec_for_id(desc->id, &iter, 1))) {
- if (strcmp(codec->name, desc->name)) {
- print_codecs_for_id(desc->id, 1);
- break;
- }
- }
-
- printf("\n");
- }
- av_free(codecs);
- return 0;
-}
-
-static void print_codecs(int encoder)
-{
- const AVCodecDescriptor **codecs;
- unsigned i, nb_codecs = get_codecs_sorted(&codecs);
-
- printf("%s:\n"
- " V..... = Video\n"
- " A..... = Audio\n"
- " S..... = Subtitle\n"
- " .F.... = Frame-level multithreading\n"
- " ..S... = Slice-level multithreading\n"
- " ...X.. = Codec is experimental\n"
- " ....B. = Supports draw_horiz_band\n"
- " .....D = Supports direct rendering method 1\n"
- " ------\n",
- encoder ? "Encoders" : "Decoders");
- for (i = 0; i < nb_codecs; i++) {
- const AVCodecDescriptor *desc = codecs[i];
- const AVCodec *codec;
- void *iter = NULL;
-
- while ((codec = next_codec_for_id(desc->id, &iter, encoder))) {
- printf(" %c", get_media_type_char(desc->type));
- printf((codec->capabilities & AV_CODEC_CAP_FRAME_THREADS) ? "F" : ".");
- printf((codec->capabilities & AV_CODEC_CAP_SLICE_THREADS) ? "S" : ".");
- printf((codec->capabilities & AV_CODEC_CAP_EXPERIMENTAL) ? "X" : ".");
- printf((codec->capabilities & AV_CODEC_CAP_DRAW_HORIZ_BAND)?"B" : ".");
- printf((codec->capabilities & AV_CODEC_CAP_DR1) ? "D" : ".");
-
- printf(" %-20s %s", codec->name, codec->long_name ? codec->long_name : "");
- if (strcmp(codec->name, desc->name))
- printf(" (codec %s)", desc->name);
-
- printf("\n");
- }
- }
- av_free(codecs);
-}
-
-int show_decoders(void *optctx, const char *opt, const char *arg)
-{
- print_codecs(0);
- return 0;
-}
-
-int show_encoders(void *optctx, const char *opt, const char *arg)
-{
- print_codecs(1);
- return 0;
-}
-
-int show_bsfs(void *optctx, const char *opt, const char *arg)
-{
- const AVBitStreamFilter *bsf = NULL;
- void *opaque = NULL;
-
- printf("Bitstream filters:\n");
- while ((bsf = av_bsf_iterate(&opaque)))
- printf("%s\n", bsf->name);
- printf("\n");
- return 0;
-}
-
-int show_protocols(void *optctx, const char *opt, const char *arg)
-{
- void *opaque = NULL;
- const char *name;
-
- printf("Supported file protocols:\n"
- "Input:\n");
- while ((name = avio_enum_protocols(&opaque, 0)))
- printf(" %s\n", name);
- printf("Output:\n");
- while ((name = avio_enum_protocols(&opaque, 1)))
- printf(" %s\n", name);
- return 0;
-}
-
-int show_filters(void *optctx, const char *opt, const char *arg)
-{
-#if CONFIG_AVFILTER
- const AVFilter *filter = NULL;
- char descr[64], *descr_cur;
- void *opaque = NULL;
- int i, j;
- const AVFilterPad *pad;
-
- printf("Filters:\n"
- " T.. = Timeline support\n"
- " .S. = Slice threading\n"
- " ..C = Command support\n"
- " A = Audio input/output\n"
- " V = Video input/output\n"
- " N = Dynamic number and/or type of input/output\n"
- " | = Source or sink filter\n");
- while ((filter = av_filter_iterate(&opaque))) {
- descr_cur = descr;
- for (i = 0; i < 2; i++) {
- if (i) {
- *(descr_cur++) = '-';
- *(descr_cur++) = '>';
- }
- pad = i ? filter->outputs : filter->inputs;
- for (j = 0; pad && avfilter_pad_get_name(pad, j); j++) {
- if (descr_cur >= descr + sizeof(descr) - 4)
- break;
- *(descr_cur++) = get_media_type_char(avfilter_pad_get_type(pad, j));
- }
- if (!j)
- *(descr_cur++) = ((!i && (filter->flags & AVFILTER_FLAG_DYNAMIC_INPUTS)) ||
- ( i && (filter->flags & AVFILTER_FLAG_DYNAMIC_OUTPUTS))) ? 'N' : '|';
- }
- *descr_cur = 0;
- printf(" %c%c%c %-17s %-10s %s\n",
- filter->flags & AVFILTER_FLAG_SUPPORT_TIMELINE ? 'T' : '.',
- filter->flags & AVFILTER_FLAG_SLICE_THREADS ? 'S' : '.',
- filter->process_command ? 'C' : '.',
- filter->name, descr, filter->description);
- }
-#else
- printf("No filters available: libavfilter disabled\n");
-#endif
- return 0;
-}
-
-int show_colors(void *optctx, const char *opt, const char *arg)
-{
- const char *name;
- const uint8_t *rgb;
- int i;
-
- printf("%-32s #RRGGBB\n", "name");
-
- for (i = 0; name = av_get_known_color_name(i, &rgb); i++)
- printf("%-32s #%02x%02x%02x\n", name, rgb[0], rgb[1], rgb[2]);
-
- return 0;
-}
-
-int show_pix_fmts(void *optctx, const char *opt, const char *arg)
-{
- const AVPixFmtDescriptor *pix_desc = NULL;
-
- printf("Pixel formats:\n"
- "I.... = Supported Input format for conversion\n"
- ".O... = Supported Output format for conversion\n"
- "..H.. = Hardware accelerated format\n"
- "...P. = Paletted format\n"
- "....B = Bitstream format\n"
- "FLAGS NAME NB_COMPONENTS BITS_PER_PIXEL\n"
- "-----\n");
-
-#if !CONFIG_SWSCALE
-# define sws_isSupportedInput(x) 0
-# define sws_isSupportedOutput(x) 0
-#endif
-
- while ((pix_desc = av_pix_fmt_desc_next(pix_desc))) {
- enum AVPixelFormat av_unused pix_fmt = av_pix_fmt_desc_get_id(pix_desc);
- printf("%c%c%c%c%c %-16s %d %2d\n",
- sws_isSupportedInput (pix_fmt) ? 'I' : '.',
- sws_isSupportedOutput(pix_fmt) ? 'O' : '.',
- pix_desc->flags & AV_PIX_FMT_FLAG_HWACCEL ? 'H' : '.',
- pix_desc->flags & AV_PIX_FMT_FLAG_PAL ? 'P' : '.',
- pix_desc->flags & AV_PIX_FMT_FLAG_BITSTREAM ? 'B' : '.',
- pix_desc->name,
- pix_desc->nb_components,
- av_get_bits_per_pixel(pix_desc));
- }
- return 0;
-}
-
-int show_layouts(void *optctx, const char *opt, const char *arg)
-{
- int i = 0;
- uint64_t layout, j;
- const char *name, *descr;
-
- printf("Individual channels:\n"
- "NAME DESCRIPTION\n");
- for (i = 0; i < 63; i++) {
- name = av_get_channel_name((uint64_t)1 << i);
- if (!name)
- continue;
- descr = av_get_channel_description((uint64_t)1 << i);
- printf("%-14s %s\n", name, descr);
- }
- printf("\nStandard channel layouts:\n"
- "NAME DECOMPOSITION\n");
- for (i = 0; !av_get_standard_channel_layout(i, &layout, &name); i++) {
- if (name) {
- printf("%-14s ", name);
- for (j = 1; j; j <<= 1)
- if ((layout & j))
- printf("%s%s", (layout & (j - 1)) ? "+" : "", av_get_channel_name(j));
- printf("\n");
- }
- }
- return 0;
-}
-
-int show_sample_fmts(void *optctx, const char *opt, const char *arg)
-{
- int i;
- char fmt_str[128];
- for (i = -1; i < AV_SAMPLE_FMT_NB; i++)
- printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i));
- return 0;
-}
-
-static void show_help_codec(const char *name, int encoder)
-{
- const AVCodecDescriptor *desc;
- const AVCodec *codec;
-
- if (!name) {
- av_log(NULL, AV_LOG_ERROR, "No codec name specified.\n");
- return;
- }
-
- codec = encoder ? avcodec_find_encoder_by_name(name) :
- avcodec_find_decoder_by_name(name);
-
- if (codec)
- print_codec(codec);
- else if ((desc = avcodec_descriptor_get_by_name(name))) {
- void *iter = NULL;
- int printed = 0;
-
- while ((codec = next_codec_for_id(desc->id, &iter, encoder))) {
- printed = 1;
- print_codec(codec);
- }
-
- if (!printed) {
- av_log(NULL, AV_LOG_ERROR, "Codec '%s' is known to FFmpeg, "
- "but no %s for it are available. FFmpeg might need to be "
- "recompiled with additional external libraries.\n",
- name, encoder ? "encoders" : "decoders");
- }
- } else {
- av_log(NULL, AV_LOG_ERROR, "Codec '%s' is not recognized by FFmpeg.\n",
- name);
- }
-}
-
-static void show_help_demuxer(const char *name)
-{
- const AVInputFormat *fmt = av_find_input_format(name);
-
- if (!fmt) {
- av_log(NULL, AV_LOG_ERROR, "Unknown format '%s'.\n", name);
- return;
- }
-
- printf("Demuxer %s [%s]:\n", fmt->name, fmt->long_name);
-
- if (fmt->extensions)
- printf(" Common extensions: %s.\n", fmt->extensions);
-
- if (fmt->priv_class)
- show_help_children(fmt->priv_class, AV_OPT_FLAG_DECODING_PARAM);
-}
-
-static void show_help_protocol(const char *name)
-{
- const AVClass *proto_class;
-
- if (!name) {
- av_log(NULL, AV_LOG_ERROR, "No protocol name specified.\n");
- return;
- }
-
- proto_class = avio_protocol_get_class(name);
- if (!proto_class) {
- av_log(NULL, AV_LOG_ERROR, "Unknown protocol '%s'.\n", name);
- return;
- }
-
- show_help_children(proto_class, AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
-}
-
-static void show_help_muxer(const char *name)
-{
- const AVCodecDescriptor *desc;
- const AVOutputFormat *fmt = av_guess_format(name, NULL, NULL);
-
- if (!fmt) {
- av_log(NULL, AV_LOG_ERROR, "Unknown format '%s'.\n", name);
- return;
- }
-
- printf("Muxer %s [%s]:\n", fmt->name, fmt->long_name);
-
- if (fmt->extensions)
- printf(" Common extensions: %s.\n", fmt->extensions);
- if (fmt->mime_type)
- printf(" Mime type: %s.\n", fmt->mime_type);
- if (fmt->video_codec != AV_CODEC_ID_NONE &&
- (desc = avcodec_descriptor_get(fmt->video_codec))) {
- printf(" Default video codec: %s.\n", desc->name);
- }
- if (fmt->audio_codec != AV_CODEC_ID_NONE &&
- (desc = avcodec_descriptor_get(fmt->audio_codec))) {
- printf(" Default audio codec: %s.\n", desc->name);
- }
- if (fmt->subtitle_codec != AV_CODEC_ID_NONE &&
- (desc = avcodec_descriptor_get(fmt->subtitle_codec))) {
- printf(" Default subtitle codec: %s.\n", desc->name);
- }
-
- if (fmt->priv_class)
- show_help_children(fmt->priv_class, AV_OPT_FLAG_ENCODING_PARAM);
-}
-
-#if CONFIG_AVFILTER
-static void show_help_filter(const char *name)
-{
-#if CONFIG_AVFILTER
- const AVFilter *f = avfilter_get_by_name(name);
- int i, count;
-
- if (!name) {
- av_log(NULL, AV_LOG_ERROR, "No filter name specified.\n");
- return;
- } else if (!f) {
- av_log(NULL, AV_LOG_ERROR, "Unknown filter '%s'.\n", name);
- return;
- }
-
- printf("Filter %s\n", f->name);
- if (f->description)
- printf(" %s\n", f->description);
-
- if (f->flags & AVFILTER_FLAG_SLICE_THREADS)
- printf(" slice threading supported\n");
-
- printf(" Inputs:\n");
- count = avfilter_pad_count(f->inputs);
- for (i = 0; i < count; i++) {
- printf(" #%d: %s (%s)\n", i, avfilter_pad_get_name(f->inputs, i),
- media_type_string(avfilter_pad_get_type(f->inputs, i)));
- }
- if (f->flags & AVFILTER_FLAG_DYNAMIC_INPUTS)
- printf(" dynamic (depending on the options)\n");
- else if (!count)
- printf(" none (source filter)\n");
-
- printf(" Outputs:\n");
- count = avfilter_pad_count(f->outputs);
- for (i = 0; i < count; i++) {
- printf(" #%d: %s (%s)\n", i, avfilter_pad_get_name(f->outputs, i),
- media_type_string(avfilter_pad_get_type(f->outputs, i)));
- }
- if (f->flags & AVFILTER_FLAG_DYNAMIC_OUTPUTS)
- printf(" dynamic (depending on the options)\n");
- else if (!count)
- printf(" none (sink filter)\n");
-
- if (f->priv_class)
- show_help_children(f->priv_class, AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_FILTERING_PARAM |
- AV_OPT_FLAG_AUDIO_PARAM);
- if (f->flags & AVFILTER_FLAG_SUPPORT_TIMELINE)
- printf("This filter has support for timeline through the 'enable' option.\n");
-#else
- av_log(NULL, AV_LOG_ERROR, "Build without libavfilter; "
- "can not to satisfy request\n");
-#endif
-}
-#endif
-
-static void show_help_bsf(const char *name)
-{
- const AVBitStreamFilter *bsf = av_bsf_get_by_name(name);
-
- if (!name) {
- av_log(NULL, AV_LOG_ERROR, "No bitstream filter name specified.\n");
- return;
- } else if (!bsf) {
- av_log(NULL, AV_LOG_ERROR, "Unknown bit stream filter '%s'.\n", name);
- return;
- }
-
- printf("Bit stream filter %s\n", bsf->name);
- PRINT_CODEC_SUPPORTED(bsf, codec_ids, enum AVCodecID, "codecs",
- AV_CODEC_ID_NONE, GET_CODEC_NAME);
- if (bsf->priv_class)
- show_help_children(bsf->priv_class, AV_OPT_FLAG_BSF_PARAM);
-}
-
-int show_help(void *optctx, const char *opt, const char *arg)
-{
- char *topic, *par;
- av_log_set_callback(log_callback_help);
-
- topic = av_strdup(arg ? arg : "");
- if (!topic)
- return AVERROR(ENOMEM);
- par = strchr(topic, '=');
- if (par)
- *par++ = 0;
-
- if (!*topic) {
- show_help_default(topic, par);
- } else if (!strcmp(topic, "decoder")) {
- show_help_codec(par, 0);
- } else if (!strcmp(topic, "encoder")) {
- show_help_codec(par, 1);
- } else if (!strcmp(topic, "demuxer")) {
- show_help_demuxer(par);
- } else if (!strcmp(topic, "muxer")) {
- show_help_muxer(par);
- } else if (!strcmp(topic, "protocol")) {
- show_help_protocol(par);
-#if CONFIG_AVFILTER
- } else if (!strcmp(topic, "filter")) {
- show_help_filter(par);
-#endif
- } else if (!strcmp(topic, "bsf")) {
- show_help_bsf(par);
- } else {
- show_help_default(topic, par);
- }
-
- av_freep(&topic);
- return 0;
-}
-
-int read_yesno(void)
-{
- int c = getchar();
- int yesno = (av_toupper(c) == 'Y');
-
- while (c != '\n' && c != EOF)
- c = getchar();
-
- return yesno;
-}
-
-FILE *get_preset_file(char *filename, size_t filename_size,
- const char *preset_name, int is_path,
- const char *codec_name)
-{
- FILE *f = NULL;
- int i;
- const char *base[3] = { getenv("FFMPEG_DATADIR"),
- getenv("HOME"),
- FFMPEG_DATADIR, };
-
- if (is_path) {
- av_strlcpy(filename, preset_name, filename_size);
- f = fopen(filename, "r");
- } else {
-#if HAVE_GETMODULEHANDLE && defined(_WIN32)
- char datadir[MAX_PATH], *ls;
- base[2] = NULL;
-
- if (GetModuleFileNameA(GetModuleHandleA(NULL), datadir, sizeof(datadir) - 1))
- {
- for (ls = datadir; ls < datadir + strlen(datadir); ls++)
- if (*ls == '\\') *ls = '/';
-
- if (ls = strrchr(datadir, '/'))
- {
- *ls = 0;
- strncat(datadir, "/ffpresets", sizeof(datadir) - 1 - strlen(datadir));
- base[2] = datadir;
- }
- }
-#endif
- for (i = 0; i < 3 && !f; i++) {
- if (!base[i])
- continue;
- snprintf(filename, filename_size, "%s%s/%s.ffpreset", base[i],
- i != 1 ? "" : "/.ffmpeg", preset_name);
- f = fopen(filename, "r");
- if (!f && codec_name) {
- snprintf(filename, filename_size,
- "%s%s/%s-%s.ffpreset",
- base[i], i != 1 ? "" : "/.ffmpeg", codec_name,
- preset_name);
- f = fopen(filename, "r");
- }
- }
- }
-
- return f;
-}
-
-int check_stream_specifier(AVFormatContext *s, AVStream *st, const char *spec)
-{
- int ret = avformat_match_stream_specifier(s, st, spec);
- if (ret < 0)
- av_log(s, AV_LOG_ERROR, "Invalid stream specifier: %s.\n", spec);
- return ret;
-}
-
-AVDictionary *filter_codec_opts(AVDictionary *opts, enum AVCodecID codec_id,
- AVFormatContext *s, AVStream *st, AVCodec *codec)
-{
- AVDictionary *ret = NULL;
- AVDictionaryEntry *t = NULL;
- int flags = s->oformat ? AV_OPT_FLAG_ENCODING_PARAM
- : AV_OPT_FLAG_DECODING_PARAM;
- char prefix = 0;
- const AVClass *cc = avcodec_get_class();
-
- if (!codec)
- codec = s->oformat ? avcodec_find_encoder(codec_id)
- : avcodec_find_decoder(codec_id);
-
- switch (st->codecpar->codec_type) {
- case AVMEDIA_TYPE_VIDEO:
- prefix = 'v';
- flags |= AV_OPT_FLAG_VIDEO_PARAM;
- break;
- case AVMEDIA_TYPE_AUDIO:
- prefix = 'a';
- flags |= AV_OPT_FLAG_AUDIO_PARAM;
- break;
- case AVMEDIA_TYPE_SUBTITLE:
- prefix = 's';
- flags |= AV_OPT_FLAG_SUBTITLE_PARAM;
- break;
- }
-
- while (t = av_dict_get(opts, "", t, AV_DICT_IGNORE_SUFFIX)) {
- char *p = strchr(t->key, ':');
-
- /* check stream specification in opt name */
- if (p)
- switch (check_stream_specifier(s, st, p + 1)) {
- case 1: *p = 0; break;
- case 0: continue;
- default: exit_program(1);
- }
-
- if (av_opt_find(&cc, t->key, NULL, flags, AV_OPT_SEARCH_FAKE_OBJ) ||
- !codec ||
- (codec->priv_class &&
- av_opt_find(&codec->priv_class, t->key, NULL, flags,
- AV_OPT_SEARCH_FAKE_OBJ)))
- av_dict_set(&ret, t->key, t->value, 0);
- else if (t->key[0] == prefix &&
- av_opt_find(&cc, t->key + 1, NULL, flags,
- AV_OPT_SEARCH_FAKE_OBJ))
- av_dict_set(&ret, t->key + 1, t->value, 0);
-
- if (p)
- *p = ':';
- }
- return ret;
-}
-
-AVDictionary **setup_find_stream_info_opts(AVFormatContext *s,
- AVDictionary *codec_opts)
-{
- int i;
- AVDictionary **opts;
-
- if (!s->nb_streams)
- return NULL;
- opts = av_mallocz_array(s->nb_streams, sizeof(*opts));
- if (!opts) {
- av_log(NULL, AV_LOG_ERROR,
- "Could not alloc memory for stream options.\n");
- return NULL;
- }
- for (i = 0; i < s->nb_streams; i++)
- opts[i] = filter_codec_opts(codec_opts, s->streams[i]->codecpar->codec_id,
- s, s->streams[i], NULL);
- return opts;
-}
-
-void *grow_array(void *array, int elem_size, int *size, int new_size)
-{
- if (new_size >= INT_MAX / elem_size) {
- av_log(NULL, AV_LOG_ERROR, "Array too big.\n");
- exit_program(1);
- }
- if (*size < new_size) {
- uint8_t *tmp = av_realloc_array(array, new_size, elem_size);
- if (!tmp) {
- av_log(NULL, AV_LOG_ERROR, "Could not alloc buffer.\n");
- exit_program(1);
- }
- memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
- *size = new_size;
- return tmp;
- }
- return array;
-}
-
-double get_rotation(AVStream *st)
-{
- uint8_t* displaymatrix = av_stream_get_side_data(st,
- AV_PKT_DATA_DISPLAYMATRIX, NULL);
- double theta = 0;
- if (displaymatrix)
- theta = -av_display_rotation_get((int32_t*) displaymatrix);
-
- theta -= 360*floor(theta/360 + 0.9/360);
-
- if (fabs(theta - 90*round(theta/90)) > 2)
- av_log(NULL, AV_LOG_WARNING, "Odd rotation angle.\n"
- "If you want to help, upload a sample "
- "of this file to ftp://upload.ffmpeg.org/incoming/ "
- "and contact the ffmpeg-devel mailing list. (ffmpeg-devel@ffmpeg.org)");
-
- return theta;
-}
-
-#if CONFIG_AVDEVICE
-static int print_device_sources(AVInputFormat *fmt, AVDictionary *opts)
-{
- int ret, i;
- AVDeviceInfoList *device_list = NULL;
-
- if (!fmt || !fmt->priv_class || !AV_IS_INPUT_DEVICE(fmt->priv_class->category))
- return AVERROR(EINVAL);
-
- printf("Auto-detected sources for %s:\n", fmt->name);
- if (!fmt->get_device_list) {
- ret = AVERROR(ENOSYS);
- printf("Cannot list sources. Not implemented.\n");
- goto fail;
- }
-
- if ((ret = avdevice_list_input_sources(fmt, NULL, opts, &device_list)) < 0) {
- printf("Cannot list sources.\n");
- goto fail;
- }
-
- for (i = 0; i < device_list->nb_devices; i++) {
- printf("%s %s [%s]\n", device_list->default_device == i ? "*" : " ",
- device_list->devices[i]->device_name, device_list->devices[i]->device_description);
- }
-
- fail:
- avdevice_free_list_devices(&device_list);
- return ret;
-}
-
-static int print_device_sinks(AVOutputFormat *fmt, AVDictionary *opts)
-{
- int ret, i;
- AVDeviceInfoList *device_list = NULL;
-
- if (!fmt || !fmt->priv_class || !AV_IS_OUTPUT_DEVICE(fmt->priv_class->category))
- return AVERROR(EINVAL);
-
- printf("Auto-detected sinks for %s:\n", fmt->name);
- if (!fmt->get_device_list) {
- ret = AVERROR(ENOSYS);
- printf("Cannot list sinks. Not implemented.\n");
- goto fail;
- }
-
- if ((ret = avdevice_list_output_sinks(fmt, NULL, opts, &device_list)) < 0) {
- printf("Cannot list sinks.\n");
- goto fail;
- }
-
- for (i = 0; i < device_list->nb_devices; i++) {
- printf("%s %s [%s]\n", device_list->default_device == i ? "*" : " ",
- device_list->devices[i]->device_name, device_list->devices[i]->device_description);
- }
-
- fail:
- avdevice_free_list_devices(&device_list);
- return ret;
-}
-
-static int show_sinks_sources_parse_arg(const char *arg, char **dev, AVDictionary **opts)
-{
- int ret;
- if (arg) {
- char *opts_str = NULL;
- av_assert0(dev && opts);
- *dev = av_strdup(arg);
- if (!*dev)
- return AVERROR(ENOMEM);
- if ((opts_str = strchr(*dev, ','))) {
- *(opts_str++) = '\0';
- if (opts_str[0] && ((ret = av_dict_parse_string(opts, opts_str, "=", ":", 0)) < 0)) {
- av_freep(dev);
- return ret;
- }
- }
- } else
- printf("\nDevice name is not provided.\n"
- "You can pass devicename[,opt1=val1[,opt2=val2...]] as an argument.\n\n");
- return 0;
-}
-
-int show_sources(void *optctx, const char *opt, const char *arg)
-{
- AVInputFormat *fmt = NULL;
- char *dev = NULL;
- AVDictionary *opts = NULL;
- int ret = 0;
- int error_level = av_log_get_level();
-
- av_log_set_level(AV_LOG_ERROR);
-
- if ((ret = show_sinks_sources_parse_arg(arg, &dev, &opts)) < 0)
- goto fail;
-
- do {
- fmt = av_input_audio_device_next(fmt);
- if (fmt) {
- if (!strcmp(fmt->name, "lavfi"))
- continue; //it's pointless to probe lavfi
- if (dev && !av_match_name(dev, fmt->name))
- continue;
- print_device_sources(fmt, opts);
- }
- } while (fmt);
- do {
- fmt = av_input_video_device_next(fmt);
- if (fmt) {
- if (dev && !av_match_name(dev, fmt->name))
- continue;
- print_device_sources(fmt, opts);
- }
- } while (fmt);
- fail:
- av_dict_free(&opts);
- av_free(dev);
- av_log_set_level(error_level);
- return ret;
-}
-
-int show_sinks(void *optctx, const char *opt, const char *arg)
-{
- AVOutputFormat *fmt = NULL;
- char *dev = NULL;
- AVDictionary *opts = NULL;
- int ret = 0;
- int error_level = av_log_get_level();
-
- av_log_set_level(AV_LOG_ERROR);
-
- if ((ret = show_sinks_sources_parse_arg(arg, &dev, &opts)) < 0)
- goto fail;
-
- do {
- fmt = av_output_audio_device_next(fmt);
- if (fmt) {
- if (dev && !av_match_name(dev, fmt->name))
- continue;
- print_device_sinks(fmt, opts);
- }
- } while (fmt);
- do {
- fmt = av_output_video_device_next(fmt);
- if (fmt) {
- if (dev && !av_match_name(dev, fmt->name))
- continue;
- print_device_sinks(fmt, opts);
- }
- } while (fmt);
- fail:
- av_dict_free(&opts);
- av_free(dev);
- av_log_set_level(error_level);
- return ret;
-}
-
-#endif
diff --git a/fuchsia/config/default/arm64/config.h b/fuchsia/config/default/arm64/config.h
new file mode 100644
index 0000000..0556857
--- /dev/null
+++ b/fuchsia/config/default/arm64/config.h
@@ -0,0 +1,2588 @@
+/* Automatically generated by configure - do not modify! */
+#ifndef FFMPEG_CONFIG_H
+#define FFMPEG_CONFIG_H
+#define FFMPEG_CONFIGURATION "--disable-everything --disable-all --disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages --disable-static --enable-avcodec --enable-avformat --enable-avutil --enable-fft --enable-rdft --enable-static --enable-libopus --disable-debug --disable-bzlib --disable-iconv --disable-lzo --disable-network --disable-schannel --disable-sdl2 --disable-symver --disable-xlib --disable-zlib --disable-securetransport --disable-faan --disable-alsa --disable-autodetect --enable-decoder='vorbis,libopus,flac' --enable-decoder='pcm_u8,pcm_s16le,pcm_s24le,pcm_s32le,pcm_f32le,mp3' --enable-decoder='pcm_s16be,pcm_s24be,pcm_mulaw,pcm_alaw' --enable-decoder='theora,vp8,sbc,aptx' --enable-demuxer='ogg,matroska,wav,flac,mp3,mov' --enable-parser='opus,vorbis,flac,mpegaudio' --extra-cflags=-I/usr/local/google/home/dalesat/fuchsia/third_party/opus/include --enable-parser='vp3,vp8' --optflags='\"-O2\"' --enable-pic --x86asmexe=yasm --enable-pic --enable-lto --cc=clang --cxx=clang++ --ld=clang --enable-cross-compile --cross-prefix=/usr/bin/x86_64-linux-gnu- --target-os=linux --arch=aarch64 --enable-armv8 --extra-cflags='-march=armv8-a' --sysroot=/usr/local/google/home/dalesat/fuchsia/third_party/ffmpeg/../../prebuilt/third_party/sysroot/linux --extra-cflags='--target=aarch64-linux-gnu' --extra-ldflags='--target=aarch64-linux-gnu' --disable-linux-perf --disable-error-resilience"
+#define FFMPEG_LICENSE "LGPL version 2.1 or later"
+#define CONFIG_THIS_YEAR 2020
+#define FFMPEG_DATADIR "/usr/local/share/ffmpeg"
+#define AVCONV_DATADIR "/usr/local/share/ffmpeg"
+#define CC_IDENT "Fuchsia clang version 11.0.0 (https://fuchsia.googlesource.com/a/third_party/llvm-project dd484baffdf4a92e564c38a17d35a742e633b0e0)"
+#define av_restrict restrict
+#define EXTERN_PREFIX ""
+#define EXTERN_ASM
+#define BUILDSUF ""
+#define SLIBSUF ".so"
+#define HAVE_MMX2 HAVE_MMXEXT
+#define SWS_MAX_FILTER_SIZE 256
+#define ARCH_AARCH64 1
+#define ARCH_ALPHA 0
+#define ARCH_ARM 0
+#define ARCH_AVR32 0
+#define ARCH_AVR32_AP 0
+#define ARCH_AVR32_UC 0
+#define ARCH_BFIN 0
+#define ARCH_IA64 0
+#define ARCH_M68K 0
+#define ARCH_MIPS 0
+#define ARCH_MIPS64 0
+#define ARCH_PARISC 0
+#define ARCH_PPC 0
+#define ARCH_PPC64 0
+#define ARCH_S390 0
+#define ARCH_SH4 0
+#define ARCH_SPARC 0
+#define ARCH_SPARC64 0
+#define ARCH_TILEGX 0
+#define ARCH_TILEPRO 0
+#define ARCH_TOMI 0
+#define ARCH_X86 0
+#define ARCH_X86_32 0
+#define ARCH_X86_64 0
+#define HAVE_ARMV5TE 0
+#define HAVE_ARMV6 0
+#define HAVE_ARMV6T2 0
+#define HAVE_ARMV8 1
+#define HAVE_NEON 1
+#define HAVE_VFP 1
+#define HAVE_VFPV3 0
+#define HAVE_SETEND 0
+#define HAVE_ALTIVEC 0
+#define HAVE_DCBZL 0
+#define HAVE_LDBRX 0
+#define HAVE_POWER8 0
+#define HAVE_PPC4XX 0
+#define HAVE_VSX 0
+#define HAVE_AESNI 0
+#define HAVE_AMD3DNOW 0
+#define HAVE_AMD3DNOWEXT 0
+#define HAVE_AVX 0
+#define HAVE_AVX2 0
+#define HAVE_AVX512 0
+#define HAVE_FMA3 0
+#define HAVE_FMA4 0
+#define HAVE_MMX 0
+#define HAVE_MMXEXT 0
+#define HAVE_SSE 0
+#define HAVE_SSE2 0
+#define HAVE_SSE3 0
+#define HAVE_SSE4 0
+#define HAVE_SSE42 0
+#define HAVE_SSSE3 0
+#define HAVE_XOP 0
+#define HAVE_CPUNOP 0
+#define HAVE_I686 0
+#define HAVE_MIPSFPU 0
+#define HAVE_MIPS32R2 0
+#define HAVE_MIPS32R5 0
+#define HAVE_MIPS64R2 0
+#define HAVE_MIPS32R6 0
+#define HAVE_MIPS64R6 0
+#define HAVE_MIPSDSP 0
+#define HAVE_MIPSDSPR2 0
+#define HAVE_MSA 0
+#define HAVE_MSA2 0
+#define HAVE_LOONGSON2 0
+#define HAVE_LOONGSON3 0
+#define HAVE_MMI 0
+#define HAVE_ARMV5TE_EXTERNAL 0
+#define HAVE_ARMV6_EXTERNAL 0
+#define HAVE_ARMV6T2_EXTERNAL 0
+#define HAVE_ARMV8_EXTERNAL 1
+#define HAVE_NEON_EXTERNAL 1
+#define HAVE_VFP_EXTERNAL 1
+#define HAVE_VFPV3_EXTERNAL 0
+#define HAVE_SETEND_EXTERNAL 0
+#define HAVE_ALTIVEC_EXTERNAL 0
+#define HAVE_DCBZL_EXTERNAL 0
+#define HAVE_LDBRX_EXTERNAL 0
+#define HAVE_POWER8_EXTERNAL 0
+#define HAVE_PPC4XX_EXTERNAL 0
+#define HAVE_VSX_EXTERNAL 0
+#define HAVE_AESNI_EXTERNAL 0
+#define HAVE_AMD3DNOW_EXTERNAL 0
+#define HAVE_AMD3DNOWEXT_EXTERNAL 0
+#define HAVE_AVX_EXTERNAL 0
+#define HAVE_AVX2_EXTERNAL 0
+#define HAVE_AVX512_EXTERNAL 0
+#define HAVE_FMA3_EXTERNAL 0
+#define HAVE_FMA4_EXTERNAL 0
+#define HAVE_MMX_EXTERNAL 0
+#define HAVE_MMXEXT_EXTERNAL 0
+#define HAVE_SSE_EXTERNAL 0
+#define HAVE_SSE2_EXTERNAL 0
+#define HAVE_SSE3_EXTERNAL 0
+#define HAVE_SSE4_EXTERNAL 0
+#define HAVE_SSE42_EXTERNAL 0
+#define HAVE_SSSE3_EXTERNAL 0
+#define HAVE_XOP_EXTERNAL 0
+#define HAVE_CPUNOP_EXTERNAL 0
+#define HAVE_I686_EXTERNAL 0
+#define HAVE_MIPSFPU_EXTERNAL 0
+#define HAVE_MIPS32R2_EXTERNAL 0
+#define HAVE_MIPS32R5_EXTERNAL 0
+#define HAVE_MIPS64R2_EXTERNAL 0
+#define HAVE_MIPS32R6_EXTERNAL 0
+#define HAVE_MIPS64R6_EXTERNAL 0
+#define HAVE_MIPSDSP_EXTERNAL 0
+#define HAVE_MIPSDSPR2_EXTERNAL 0
+#define HAVE_MSA_EXTERNAL 0
+#define HAVE_MSA2_EXTERNAL 0
+#define HAVE_LOONGSON2_EXTERNAL 0
+#define HAVE_LOONGSON3_EXTERNAL 0
+#define HAVE_MMI_EXTERNAL 0
+#define HAVE_ARMV5TE_INLINE 0
+#define HAVE_ARMV6_INLINE 0
+#define HAVE_ARMV6T2_INLINE 0
+#define HAVE_ARMV8_INLINE 1
+#define HAVE_NEON_INLINE 1
+#define HAVE_VFP_INLINE 1
+#define HAVE_VFPV3_INLINE 0
+#define HAVE_SETEND_INLINE 0
+#define HAVE_ALTIVEC_INLINE 0
+#define HAVE_DCBZL_INLINE 0
+#define HAVE_LDBRX_INLINE 0
+#define HAVE_POWER8_INLINE 0
+#define HAVE_PPC4XX_INLINE 0
+#define HAVE_VSX_INLINE 0
+#define HAVE_AESNI_INLINE 0
+#define HAVE_AMD3DNOW_INLINE 0
+#define HAVE_AMD3DNOWEXT_INLINE 0
+#define HAVE_AVX_INLINE 0
+#define HAVE_AVX2_INLINE 0
+#define HAVE_AVX512_INLINE 0
+#define HAVE_FMA3_INLINE 0
+#define HAVE_FMA4_INLINE 0
+#define HAVE_MMX_INLINE 0
+#define HAVE_MMXEXT_INLINE 0
+#define HAVE_SSE_INLINE 0
+#define HAVE_SSE2_INLINE 0
+#define HAVE_SSE3_INLINE 0
+#define HAVE_SSE4_INLINE 0
+#define HAVE_SSE42_INLINE 0
+#define HAVE_SSSE3_INLINE 0
+#define HAVE_XOP_INLINE 0
+#define HAVE_CPUNOP_INLINE 0
+#define HAVE_I686_INLINE 0
+#define HAVE_MIPSFPU_INLINE 0
+#define HAVE_MIPS32R2_INLINE 0
+#define HAVE_MIPS32R5_INLINE 0
+#define HAVE_MIPS64R2_INLINE 0
+#define HAVE_MIPS32R6_INLINE 0
+#define HAVE_MIPS64R6_INLINE 0
+#define HAVE_MIPSDSP_INLINE 0
+#define HAVE_MIPSDSPR2_INLINE 0
+#define HAVE_MSA_INLINE 0
+#define HAVE_MSA2_INLINE 0
+#define HAVE_LOONGSON2_INLINE 0
+#define HAVE_LOONGSON3_INLINE 0
+#define HAVE_MMI_INLINE 0
+#define HAVE_ALIGNED_STACK 1
+#define HAVE_FAST_64BIT 1
+#define HAVE_FAST_CLZ 1
+#define HAVE_FAST_CMOV 0
+#define HAVE_LOCAL_ALIGNED 0
+#define HAVE_SIMD_ALIGN_16 1
+#define HAVE_SIMD_ALIGN_32 0
+#define HAVE_SIMD_ALIGN_64 0
+#define HAVE_ATOMIC_CAS_PTR 0
+#define HAVE_MACHINE_RW_BARRIER 0
+#define HAVE_MEMORYBARRIER 0
+#define HAVE_MM_EMPTY 0
+#define HAVE_RDTSC 0
+#define HAVE_SEM_TIMEDWAIT 1
+#define HAVE_SYNC_VAL_COMPARE_AND_SWAP 1
+#define HAVE_CABS 0
+#define HAVE_CEXP 0
+#define HAVE_INLINE_ASM 1
+#define HAVE_SYMVER 0
+#define HAVE_X86ASM 0
+#define HAVE_BIGENDIAN 0
+#define HAVE_FAST_UNALIGNED 1
+#define HAVE_ARPA_INET_H 0
+#define HAVE_ASM_TYPES_H 1
+#define HAVE_CDIO_PARANOIA_H 0
+#define HAVE_CDIO_PARANOIA_PARANOIA_H 0
+#define HAVE_CUDA_H 0
+#define HAVE_DISPATCH_DISPATCH_H 0
+#define HAVE_DEV_BKTR_IOCTL_BT848_H 0
+#define HAVE_DEV_BKTR_IOCTL_METEOR_H 0
+#define HAVE_DEV_IC_BT8XX_H 0
+#define HAVE_DEV_VIDEO_BKTR_IOCTL_BT848_H 0
+#define HAVE_DEV_VIDEO_METEOR_IOCTL_METEOR_H 0
+#define HAVE_DIRECT_H 0
+#define HAVE_DIRENT_H 1
+#define HAVE_DXGIDEBUG_H 0
+#define HAVE_DXVA_H 0
+#define HAVE_ES2_GL_H 0
+#define HAVE_GSM_H 0
+#define HAVE_IO_H 0
+#define HAVE_LINUX_PERF_EVENT_H 1
+#define HAVE_MACHINE_IOCTL_BT848_H 0
+#define HAVE_MACHINE_IOCTL_METEOR_H 0
+#define HAVE_MALLOC_H 1
+#define HAVE_OPENCV2_CORE_CORE_C_H 0
+#define HAVE_OPENGL_GL3_H 0
+#define HAVE_POLL_H 1
+#define HAVE_SYS_PARAM_H 1
+#define HAVE_SYS_RESOURCE_H 1
+#define HAVE_SYS_SELECT_H 1
+#define HAVE_SYS_SOUNDCARD_H 1
+#define HAVE_SYS_TIME_H 1
+#define HAVE_SYS_UN_H 1
+#define HAVE_SYS_VIDEOIO_H 0
+#define HAVE_TERMIOS_H 1
+#define HAVE_UDPLITE_H 0
+#define HAVE_UNISTD_H 1
+#define HAVE_VALGRIND_VALGRIND_H 0
+#define HAVE_WINDOWS_H 0
+#define HAVE_WINSOCK2_H 0
+#define HAVE_INTRINSICS_NEON 1
+#define HAVE_ATANF 1
+#define HAVE_ATAN2F 1
+#define HAVE_CBRT 1
+#define HAVE_CBRTF 1
+#define HAVE_COPYSIGN 1
+#define HAVE_COSF 1
+#define HAVE_ERF 1
+#define HAVE_EXP2 1
+#define HAVE_EXP2F 1
+#define HAVE_EXPF 1
+#define HAVE_HYPOT 1
+#define HAVE_ISFINITE 1
+#define HAVE_ISINF 1
+#define HAVE_ISNAN 1
+#define HAVE_LDEXPF 1
+#define HAVE_LLRINT 1
+#define HAVE_LLRINTF 1
+#define HAVE_LOG2 1
+#define HAVE_LOG2F 1
+#define HAVE_LOG10F 1
+#define HAVE_LRINT 1
+#define HAVE_LRINTF 1
+#define HAVE_POWF 1
+#define HAVE_RINT 1
+#define HAVE_ROUND 1
+#define HAVE_ROUNDF 1
+#define HAVE_SINF 1
+#define HAVE_TRUNC 1
+#define HAVE_TRUNCF 1
+#define HAVE_DOS_PATHS 0
+#define HAVE_LIBC_MSVCRT 0
+#define HAVE_MMAL_PARAMETER_VIDEO_MAX_NUM_CALLBACKS 0
+#define HAVE_SECTION_DATA_REL_RO 1
+#define HAVE_THREADS 1
+#define HAVE_UWP 0
+#define HAVE_WINRT 0
+#define HAVE_ACCESS 1
+#define HAVE_ALIGNED_MALLOC 0
+#define HAVE_ARC4RANDOM 0
+#define HAVE_CLOCK_GETTIME 1
+#define HAVE_CLOSESOCKET 0
+#define HAVE_COMMANDLINETOARGVW 0
+#define HAVE_FCNTL 1
+#define HAVE_GETADDRINFO 0
+#define HAVE_GETHRTIME 0
+#define HAVE_GETOPT 1
+#define HAVE_GETMODULEHANDLE 0
+#define HAVE_GETPROCESSAFFINITYMASK 0
+#define HAVE_GETPROCESSMEMORYINFO 0
+#define HAVE_GETPROCESSTIMES 0
+#define HAVE_GETRUSAGE 1
+#define HAVE_GETSTDHANDLE 0
+#define HAVE_GETSYSTEMTIMEASFILETIME 0
+#define HAVE_GETTIMEOFDAY 1
+#define HAVE_GLOB 1
+#define HAVE_GLXGETPROCADDRESS 0
+#define HAVE_GMTIME_R 1
+#define HAVE_INET_ATON 0
+#define HAVE_ISATTY 1
+#define HAVE_KBHIT 0
+#define HAVE_LOCALTIME_R 1
+#define HAVE_LSTAT 1
+#define HAVE_LZO1X_999_COMPRESS 0
+#define HAVE_MACH_ABSOLUTE_TIME 0
+#define HAVE_MAPVIEWOFFILE 0
+#define HAVE_MEMALIGN 1
+#define HAVE_MKSTEMP 1
+#define HAVE_MMAP 1
+#define HAVE_MPROTECT 1
+#define HAVE_NANOSLEEP 1
+#define HAVE_PEEKNAMEDPIPE 0
+#define HAVE_POSIX_MEMALIGN 1
+#define HAVE_PTHREAD_CANCEL 1
+#define HAVE_SCHED_GETAFFINITY 1
+#define HAVE_SECITEMIMPORT 0
+#define HAVE_SETCONSOLETEXTATTRIBUTE 0
+#define HAVE_SETCONSOLECTRLHANDLER 0
+#define HAVE_SETDLLDIRECTORY 0
+#define HAVE_SETMODE 0
+#define HAVE_SETRLIMIT 1
+#define HAVE_SLEEP 0
+#define HAVE_STRERROR_R 1
+#define HAVE_SYSCONF 1
+#define HAVE_SYSCTL 0
+#define HAVE_USLEEP 1
+#define HAVE_UTGETOSTYPEFROMSTRING 0
+#define HAVE_VIRTUALALLOC 0
+#define HAVE_WGLGETPROCADDRESS 0
+#define HAVE_BCRYPT 0
+#define HAVE_VAAPI_DRM 0
+#define HAVE_VAAPI_X11 0
+#define HAVE_VDPAU_X11 0
+#define HAVE_PTHREADS 1
+#define HAVE_OS2THREADS 0
+#define HAVE_W32THREADS 0
+#define HAVE_AS_ARCH_DIRECTIVE 0
+#define HAVE_AS_DN_DIRECTIVE 0
+#define HAVE_AS_FPU_DIRECTIVE 0
+#define HAVE_AS_FUNC 0
+#define HAVE_AS_OBJECT_ARCH 0
+#define HAVE_ASM_MOD_Q 0
+#define HAVE_BLOCKS_EXTENSION 0
+#define HAVE_EBP_AVAILABLE 0
+#define HAVE_EBX_AVAILABLE 0
+#define HAVE_GNU_AS 0
+#define HAVE_GNU_WINDRES 0
+#define HAVE_IBM_ASM 0
+#define HAVE_INLINE_ASM_DIRECT_SYMBOL_REFS 0
+#define HAVE_INLINE_ASM_LABELS 1
+#define HAVE_INLINE_ASM_NONLOCAL_LABELS 1
+#define HAVE_PRAGMA_DEPRECATED 1
+#define HAVE_RSYNC_CONTIMEOUT 1
+#define HAVE_SYMVER_ASM_LABEL 1
+#define HAVE_SYMVER_GNU_ASM 1
+/* #define HAVE_VFP_ARGS 0 -- softfp/hardfp selection is done by the fuchsia build */
+#define HAVE_XFORM_ASM 0
+#define HAVE_XMM_CLOBBERS 0
+#define HAVE_KCMVIDEOCODECTYPE_HEVC 0
+#define HAVE_KCVPIXELFORMATTYPE_420YPCBCR10BIPLANARVIDEORANGE 0
+#define HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_SMPTE_ST_2084_PQ 0
+#define HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_ITU_R_2100_HLG 0
+#define HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_LINEAR 0
+#define HAVE_SOCKLEN_T 0
+#define HAVE_STRUCT_ADDRINFO 0
+#define HAVE_STRUCT_GROUP_SOURCE_REQ 0
+#define HAVE_STRUCT_IP_MREQ_SOURCE 0
+#define HAVE_STRUCT_IPV6_MREQ 0
+#define HAVE_STRUCT_MSGHDR_MSG_FLAGS 0
+#define HAVE_STRUCT_POLLFD 0
+#define HAVE_STRUCT_RUSAGE_RU_MAXRSS 1
+#define HAVE_STRUCT_SCTP_EVENT_SUBSCRIBE 0
+#define HAVE_STRUCT_SOCKADDR_IN6 0
+#define HAVE_STRUCT_SOCKADDR_SA_LEN 0
+#define HAVE_STRUCT_SOCKADDR_STORAGE 0
+#define HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC 1
+#define HAVE_STRUCT_V4L2_FRMIVALENUM_DISCRETE 0
+#define HAVE_MAKEINFO 0
+#define HAVE_MAKEINFO_HTML 0
+#define HAVE_OPENCL_D3D11 0
+#define HAVE_OPENCL_DRM_ARM 0
+#define HAVE_OPENCL_DRM_BEIGNET 0
+#define HAVE_OPENCL_DXVA2 0
+#define HAVE_OPENCL_VAAPI_BEIGNET 0
+#define HAVE_OPENCL_VAAPI_INTEL_MEDIA 0
+#define HAVE_PERL 1
+#define HAVE_POD2MAN 1
+#define HAVE_TEXI2HTML 0
+#define CONFIG_DOC 0
+#define CONFIG_HTMLPAGES 0
+#define CONFIG_MANPAGES 0
+#define CONFIG_PODPAGES 0
+#define CONFIG_TXTPAGES 0
+#define CONFIG_AVIO_LIST_DIR_EXAMPLE 1
+#define CONFIG_AVIO_READING_EXAMPLE 1
+#define CONFIG_DECODE_AUDIO_EXAMPLE 1
+#define CONFIG_DECODE_VIDEO_EXAMPLE 1
+#define CONFIG_DEMUXING_DECODING_EXAMPLE 1
+#define CONFIG_ENCODE_AUDIO_EXAMPLE 1
+#define CONFIG_ENCODE_VIDEO_EXAMPLE 1
+#define CONFIG_EXTRACT_MVS_EXAMPLE 1
+#define CONFIG_FILTER_AUDIO_EXAMPLE 0
+#define CONFIG_FILTERING_AUDIO_EXAMPLE 0
+#define CONFIG_FILTERING_VIDEO_EXAMPLE 0
+#define CONFIG_HTTP_MULTICLIENT_EXAMPLE 1
+#define CONFIG_HW_DECODE_EXAMPLE 1
+#define CONFIG_METADATA_EXAMPLE 1
+#define CONFIG_MUXING_EXAMPLE 0
+#define CONFIG_QSVDEC_EXAMPLE 0
+#define CONFIG_REMUXING_EXAMPLE 1
+#define CONFIG_RESAMPLING_AUDIO_EXAMPLE 0
+#define CONFIG_SCALING_VIDEO_EXAMPLE 0
+#define CONFIG_TRANSCODE_AAC_EXAMPLE 0
+#define CONFIG_TRANSCODING_EXAMPLE 0
+#define CONFIG_VAAPI_ENCODE_EXAMPLE 0
+#define CONFIG_VAAPI_TRANSCODE_EXAMPLE 0
+#define CONFIG_AVISYNTH 0
+#define CONFIG_FREI0R 0
+#define CONFIG_LIBCDIO 0
+#define CONFIG_LIBDAVS2 0
+#define CONFIG_LIBRUBBERBAND 0
+#define CONFIG_LIBVIDSTAB 0
+#define CONFIG_LIBX264 0
+#define CONFIG_LIBX265 0
+#define CONFIG_LIBXAVS 0
+#define CONFIG_LIBXAVS2 0
+#define CONFIG_LIBXVID 0
+#define CONFIG_DECKLINK 0
+#define CONFIG_LIBFDK_AAC 0
+#define CONFIG_OPENSSL 0
+#define CONFIG_LIBTLS 0
+#define CONFIG_GMP 0
+#define CONFIG_LIBARIBB24 0
+#define CONFIG_LIBLENSFUN 0
+#define CONFIG_LIBOPENCORE_AMRNB 0
+#define CONFIG_LIBOPENCORE_AMRWB 0
+#define CONFIG_LIBVMAF 0
+#define CONFIG_LIBVO_AMRWBENC 0
+#define CONFIG_MBEDTLS 0
+#define CONFIG_RKMPP 0
+#define CONFIG_LIBSMBCLIENT 0
+#define CONFIG_CHROMAPRINT 0
+#define CONFIG_GCRYPT 0
+#define CONFIG_GNUTLS 0
+#define CONFIG_JNI 0
+#define CONFIG_LADSPA 0
+#define CONFIG_LIBAOM 0
+#define CONFIG_LIBASS 0
+#define CONFIG_LIBBLURAY 0
+#define CONFIG_LIBBS2B 0
+#define CONFIG_LIBCACA 0
+#define CONFIG_LIBCELT 0
+#define CONFIG_LIBCODEC2 0
+#define CONFIG_LIBDAV1D 0
+#define CONFIG_LIBDC1394 0
+#define CONFIG_LIBDRM 0
+#define CONFIG_LIBFLITE 0
+#define CONFIG_LIBFONTCONFIG 0
+#define CONFIG_LIBFREETYPE 0
+#define CONFIG_LIBFRIBIDI 0
+#define CONFIG_LIBGLSLANG 0
+#define CONFIG_LIBGME 0
+#define CONFIG_LIBGSM 0
+#define CONFIG_LIBIEC61883 0
+#define CONFIG_LIBILBC 0
+#define CONFIG_LIBJACK 0
+#define CONFIG_LIBKLVANC 0
+#define CONFIG_LIBKVAZAAR 0
+#define CONFIG_LIBMODPLUG 0
+#define CONFIG_LIBMP3LAME 0
+#define CONFIG_LIBMYSOFA 0
+#define CONFIG_LIBOPENCV 0
+#define CONFIG_LIBOPENH264 0
+#define CONFIG_LIBOPENJPEG 0
+#define CONFIG_LIBOPENMPT 0
+#define CONFIG_LIBOPUS 1
+#define CONFIG_LIBPULSE 0
+#define CONFIG_LIBRABBITMQ 0
+#define CONFIG_LIBRAV1E 0
+#define CONFIG_LIBRSVG 0
+#define CONFIG_LIBRTMP 0
+#define CONFIG_LIBSHINE 0
+#define CONFIG_LIBSMBCLIENT 0
+#define CONFIG_LIBSNAPPY 0
+#define CONFIG_LIBSOXR 0
+#define CONFIG_LIBSPEEX 0
+#define CONFIG_LIBSRT 0
+#define CONFIG_LIBSSH 0
+#define CONFIG_LIBTENSORFLOW 0
+#define CONFIG_LIBTESSERACT 0
+#define CONFIG_LIBTHEORA 0
+#define CONFIG_LIBTWOLAME 0
+#define CONFIG_LIBV4L2 0
+#define CONFIG_LIBVORBIS 0
+#define CONFIG_LIBVPX 0
+#define CONFIG_LIBWAVPACK 0
+#define CONFIG_LIBWEBP 0
+#define CONFIG_LIBXML2 0
+#define CONFIG_LIBZIMG 0
+#define CONFIG_LIBZMQ 0
+#define CONFIG_LIBZVBI 0
+#define CONFIG_LV2 0
+#define CONFIG_MEDIACODEC 0
+#define CONFIG_OPENAL 0
+#define CONFIG_OPENGL 0
+#define CONFIG_POCKETSPHINX 0
+#define CONFIG_VAPOURSYNTH 0
+#define CONFIG_ALSA 0
+#define CONFIG_APPKIT 0
+#define CONFIG_AVFOUNDATION 0
+#define CONFIG_BZLIB 0
+#define CONFIG_COREIMAGE 0
+#define CONFIG_ICONV 0
+#define CONFIG_LIBXCB 0
+#define CONFIG_LIBXCB_SHM 0
+#define CONFIG_LIBXCB_SHAPE 0
+#define CONFIG_LIBXCB_XFIXES 0
+#define CONFIG_LZMA 0
+#define CONFIG_SCHANNEL 0
+#define CONFIG_SDL2 0
+#define CONFIG_SECURETRANSPORT 0
+#define CONFIG_SNDIO 0
+#define CONFIG_XLIB 0
+#define CONFIG_ZLIB 0
+#define CONFIG_CUDA_NVCC 0
+#define CONFIG_CUDA_SDK 0
+#define CONFIG_LIBNPP 0
+#define CONFIG_LIBMFX 0
+#define CONFIG_MMAL 0
+#define CONFIG_OMX 0
+#define CONFIG_OPENCL 0
+#define CONFIG_VULKAN 0
+#define CONFIG_AMF 0
+#define CONFIG_AUDIOTOOLBOX 0
+#define CONFIG_CRYSTALHD 0
+#define CONFIG_CUDA 0
+#define CONFIG_CUDA_LLVM 0
+#define CONFIG_CUVID 0
+#define CONFIG_D3D11VA 0
+#define CONFIG_DXVA2 0
+#define CONFIG_FFNVCODEC 0
+#define CONFIG_NVDEC 0
+#define CONFIG_NVENC 0
+#define CONFIG_VAAPI 0
+#define CONFIG_VDPAU 0
+#define CONFIG_VIDEOTOOLBOX 0
+#define CONFIG_V4L2_M2M 0
+#define CONFIG_XVMC 0
+#define CONFIG_FTRAPV 0
+#define CONFIG_GRAY 0
+#define CONFIG_HARDCODED_TABLES 0
+#define CONFIG_OMX_RPI 0
+#define CONFIG_RUNTIME_CPUDETECT 1
+#define CONFIG_SAFE_BITSTREAM_READER 1
+#define CONFIG_SHARED 0
+#define CONFIG_SMALL 0
+#define CONFIG_STATIC 1
+#define CONFIG_SWSCALE_ALPHA 1
+#define CONFIG_GPL 0
+#define CONFIG_NONFREE 0
+#define CONFIG_VERSION3 0
+#define CONFIG_AVDEVICE 0
+#define CONFIG_AVFILTER 0
+#define CONFIG_SWSCALE 0
+#define CONFIG_POSTPROC 0
+#define CONFIG_AVFORMAT 1
+#define CONFIG_AVCODEC 1
+#define CONFIG_SWRESAMPLE 0
+#define CONFIG_AVRESAMPLE 0
+#define CONFIG_AVUTIL 1
+#define CONFIG_FFPLAY 0
+#define CONFIG_FFPROBE 0
+#define CONFIG_FFMPEG 0
+#define CONFIG_DCT 1
+#define CONFIG_DWT 0
+#define CONFIG_ERROR_RESILIENCE 0
+#define CONFIG_FAAN 0
+#define CONFIG_FAST_UNALIGNED 1
+#define CONFIG_FFT 1
+#define CONFIG_LSP 0
+#define CONFIG_LZO 0
+#define CONFIG_MDCT 1
+#define CONFIG_PIXELUTILS 0
+#define CONFIG_NETWORK 0
+#define CONFIG_RDFT 1
+#define CONFIG_AUTODETECT 0
+#define CONFIG_FONTCONFIG 0
+#define CONFIG_LARGE_TESTS 1
+#define CONFIG_LINUX_PERF 0
+#define CONFIG_MEMORY_POISONING 0
+#define CONFIG_NEON_CLOBBER_TEST 0
+#define CONFIG_OSSFUZZ 0
+#define CONFIG_PIC 1
+#define CONFIG_THUMB 0
+#define CONFIG_VALGRIND_BACKTRACE 0
+#define CONFIG_XMM_CLOBBER_TEST 0
+#define CONFIG_BSFS 1
+#define CONFIG_DECODERS 1
+#define CONFIG_ENCODERS 0
+#define CONFIG_HWACCELS 0
+#define CONFIG_PARSERS 1
+#define CONFIG_INDEVS 0
+#define CONFIG_OUTDEVS 0
+#define CONFIG_FILTERS 0
+#define CONFIG_DEMUXERS 1
+#define CONFIG_MUXERS 0
+#define CONFIG_PROTOCOLS 0
+#define CONFIG_AANDCTTABLES 0
+#define CONFIG_AC3DSP 0
+#define CONFIG_ADTS_HEADER 0
+#define CONFIG_AUDIO_FRAME_QUEUE 1
+#define CONFIG_AUDIODSP 0
+#define CONFIG_BLOCKDSP 0
+#define CONFIG_BSWAPDSP 0
+#define CONFIG_CABAC 0
+#define CONFIG_CBS 0
+#define CONFIG_CBS_AV1 0
+#define CONFIG_CBS_H264 0
+#define CONFIG_CBS_H265 0
+#define CONFIG_CBS_JPEG 0
+#define CONFIG_CBS_MPEG2 0
+#define CONFIG_CBS_VP9 0
+#define CONFIG_DIRAC_PARSE 1
+#define CONFIG_DNN 0
+#define CONFIG_DVPROFILE 0
+#define CONFIG_EXIF 0
+#define CONFIG_FAANDCT 0
+#define CONFIG_FAANIDCT 0
+#define CONFIG_FDCTDSP 0
+#define CONFIG_FLACDSP 1
+#define CONFIG_FMTCONVERT 0
+#define CONFIG_FRAME_THREAD_ENCODER 0
+#define CONFIG_G722DSP 0
+#define CONFIG_GOLOMB 1
+#define CONFIG_GPLV3 0
+#define CONFIG_H263DSP 0
+#define CONFIG_H264CHROMA 0
+#define CONFIG_H264DSP 0
+#define CONFIG_H264PARSE 0
+#define CONFIG_H264PRED 1
+#define CONFIG_H264QPEL 0
+#define CONFIG_HEVCPARSE 0
+#define CONFIG_HPELDSP 1
+#define CONFIG_HUFFMAN 0
+#define CONFIG_HUFFYUVDSP 0
+#define CONFIG_HUFFYUVENCDSP 0
+#define CONFIG_IDCTDSP 0
+#define CONFIG_IIRFILTER 0
+#define CONFIG_MDCT15 0
+#define CONFIG_INTRAX8 0
+#define CONFIG_ISO_MEDIA 1
+#define CONFIG_IVIDSP 0
+#define CONFIG_JPEGTABLES 0
+#define CONFIG_LGPLV3 0
+#define CONFIG_LIBX262 0
+#define CONFIG_LLAUDDSP 0
+#define CONFIG_LLVIDDSP 0
+#define CONFIG_LLVIDENCDSP 0
+#define CONFIG_LPC 0
+#define CONFIG_LZF 0
+#define CONFIG_ME_CMP 0
+#define CONFIG_MPEG_ER 0
+#define CONFIG_MPEGAUDIO 1
+#define CONFIG_MPEGAUDIODSP 1
+#define CONFIG_MPEGAUDIOHEADER 1
+#define CONFIG_MPEGVIDEO 0
+#define CONFIG_MPEGVIDEOENC 0
+#define CONFIG_MSS34DSP 0
+#define CONFIG_PIXBLOCKDSP 0
+#define CONFIG_QPELDSP 0
+#define CONFIG_QSV 0
+#define CONFIG_QSVDEC 0
+#define CONFIG_QSVENC 0
+#define CONFIG_QSVVPP 0
+#define CONFIG_RANGECODER 0
+#define CONFIG_RIFFDEC 1
+#define CONFIG_RIFFENC 0
+#define CONFIG_RTPDEC 0
+#define CONFIG_RTPENC_CHAIN 0
+#define CONFIG_RV34DSP 0
+#define CONFIG_SCENE_SAD 0
+#define CONFIG_SINEWIN 0
+#define CONFIG_SNAPPY 0
+#define CONFIG_SRTP 0
+#define CONFIG_STARTCODE 0
+#define CONFIG_TEXTUREDSP 0
+#define CONFIG_TEXTUREDSPENC 0
+#define CONFIG_TPELDSP 0
+#define CONFIG_VAAPI_1 0
+#define CONFIG_VAAPI_ENCODE 0
+#define CONFIG_VC1DSP 0
+#define CONFIG_VIDEODSP 1
+#define CONFIG_VP3DSP 1
+#define CONFIG_VP56DSP 0
+#define CONFIG_VP8DSP 1
+#define CONFIG_WMA_FREQS 0
+#define CONFIG_WMV2DSP 0
+#define CONFIG_AAC_ADTSTOASC_BSF 0
+#define CONFIG_AV1_FRAME_MERGE_BSF 0
+#define CONFIG_AV1_FRAME_SPLIT_BSF 0
+#define CONFIG_AV1_METADATA_BSF 0
+#define CONFIG_CHOMP_BSF 0
+#define CONFIG_DUMP_EXTRADATA_BSF 0
+#define CONFIG_DCA_CORE_BSF 0
+#define CONFIG_EAC3_CORE_BSF 0
+#define CONFIG_EXTRACT_EXTRADATA_BSF 0
+#define CONFIG_FILTER_UNITS_BSF 0
+#define CONFIG_H264_METADATA_BSF 0
+#define CONFIG_H264_MP4TOANNEXB_BSF 0
+#define CONFIG_H264_REDUNDANT_PPS_BSF 0
+#define CONFIG_HAPQA_EXTRACT_BSF 0
+#define CONFIG_HEVC_METADATA_BSF 0
+#define CONFIG_HEVC_MP4TOANNEXB_BSF 0
+#define CONFIG_IMX_DUMP_HEADER_BSF 0
+#define CONFIG_MJPEG2JPEG_BSF 0
+#define CONFIG_MJPEGA_DUMP_HEADER_BSF 0
+#define CONFIG_MP3_HEADER_DECOMPRESS_BSF 0
+#define CONFIG_MPEG2_METADATA_BSF 0
+#define CONFIG_MPEG4_UNPACK_BFRAMES_BSF 0
+#define CONFIG_MOV2TEXTSUB_BSF 0
+#define CONFIG_NOISE_BSF 0
+#define CONFIG_NULL_BSF 1
+#define CONFIG_PRORES_METADATA_BSF 0
+#define CONFIG_REMOVE_EXTRADATA_BSF 0
+#define CONFIG_TEXT2MOVSUB_BSF 0
+#define CONFIG_TRACE_HEADERS_BSF 0
+#define CONFIG_TRUEHD_CORE_BSF 0
+#define CONFIG_VP9_METADATA_BSF 0
+#define CONFIG_VP9_RAW_REORDER_BSF 0
+#define CONFIG_VP9_SUPERFRAME_BSF 0
+#define CONFIG_VP9_SUPERFRAME_SPLIT_BSF 0
+#define CONFIG_AASC_DECODER 0
+#define CONFIG_AIC_DECODER 0
+#define CONFIG_ALIAS_PIX_DECODER 0
+#define CONFIG_AGM_DECODER 0
+#define CONFIG_AMV_DECODER 0
+#define CONFIG_ANM_DECODER 0
+#define CONFIG_ANSI_DECODER 0
+#define CONFIG_APNG_DECODER 0
+#define CONFIG_ARBC_DECODER 0
+#define CONFIG_ASV1_DECODER 0
+#define CONFIG_ASV2_DECODER 0
+#define CONFIG_AURA_DECODER 0
+#define CONFIG_AURA2_DECODER 0
+#define CONFIG_AVRP_DECODER 0
+#define CONFIG_AVRN_DECODER 0
+#define CONFIG_AVS_DECODER 0
+#define CONFIG_AVUI_DECODER 0
+#define CONFIG_AYUV_DECODER 0
+#define CONFIG_BETHSOFTVID_DECODER 0
+#define CONFIG_BFI_DECODER 0
+#define CONFIG_BINK_DECODER 0
+#define CONFIG_BITPACKED_DECODER 0
+#define CONFIG_BMP_DECODER 0
+#define CONFIG_BMV_VIDEO_DECODER 0
+#define CONFIG_BRENDER_PIX_DECODER 0
+#define CONFIG_C93_DECODER 0
+#define CONFIG_CAVS_DECODER 0
+#define CONFIG_CDGRAPHICS_DECODER 0
+#define CONFIG_CDTOONS_DECODER 0
+#define CONFIG_CDXL_DECODER 0
+#define CONFIG_CFHD_DECODER 0
+#define CONFIG_CINEPAK_DECODER 0
+#define CONFIG_CLEARVIDEO_DECODER 0
+#define CONFIG_CLJR_DECODER 0
+#define CONFIG_CLLC_DECODER 0
+#define CONFIG_COMFORTNOISE_DECODER 0
+#define CONFIG_CPIA_DECODER 0
+#define CONFIG_CSCD_DECODER 0
+#define CONFIG_CYUV_DECODER 0
+#define CONFIG_DDS_DECODER 0
+#define CONFIG_DFA_DECODER 0
+#define CONFIG_DIRAC_DECODER 0
+#define CONFIG_DNXHD_DECODER 0
+#define CONFIG_DPX_DECODER 0
+#define CONFIG_DSICINVIDEO_DECODER 0
+#define CONFIG_DVAUDIO_DECODER 0
+#define CONFIG_DVVIDEO_DECODER 0
+#define CONFIG_DXA_DECODER 0
+#define CONFIG_DXTORY_DECODER 0
+#define CONFIG_DXV_DECODER 0
+#define CONFIG_EACMV_DECODER 0
+#define CONFIG_EAMAD_DECODER 0
+#define CONFIG_EATGQ_DECODER 0
+#define CONFIG_EATGV_DECODER 0
+#define CONFIG_EATQI_DECODER 0
+#define CONFIG_EIGHTBPS_DECODER 0
+#define CONFIG_EIGHTSVX_EXP_DECODER 0
+#define CONFIG_EIGHTSVX_FIB_DECODER 0
+#define CONFIG_ESCAPE124_DECODER 0
+#define CONFIG_ESCAPE130_DECODER 0
+#define CONFIG_EXR_DECODER 0
+#define CONFIG_FFV1_DECODER 0
+#define CONFIG_FFVHUFF_DECODER 0
+#define CONFIG_FIC_DECODER 0
+#define CONFIG_FITS_DECODER 0
+#define CONFIG_FLASHSV_DECODER 0
+#define CONFIG_FLASHSV2_DECODER 0
+#define CONFIG_FLIC_DECODER 0
+#define CONFIG_FLV_DECODER 0
+#define CONFIG_FMVC_DECODER 0
+#define CONFIG_FOURXM_DECODER 0
+#define CONFIG_FRAPS_DECODER 0
+#define CONFIG_FRWU_DECODER 0
+#define CONFIG_G2M_DECODER 0
+#define CONFIG_GDV_DECODER 0
+#define CONFIG_GIF_DECODER 0
+#define CONFIG_H261_DECODER 0
+#define CONFIG_H263_DECODER 0
+#define CONFIG_H263I_DECODER 0
+#define CONFIG_H263P_DECODER 0
+#define CONFIG_H263_V4L2M2M_DECODER 0
+#define CONFIG_H264_DECODER 0
+#define CONFIG_H264_CRYSTALHD_DECODER 0
+#define CONFIG_H264_V4L2M2M_DECODER 0
+#define CONFIG_H264_MEDIACODEC_DECODER 0
+#define CONFIG_H264_MMAL_DECODER 0
+#define CONFIG_H264_QSV_DECODER 0
+#define CONFIG_H264_RKMPP_DECODER 0
+#define CONFIG_HAP_DECODER 0
+#define CONFIG_HEVC_DECODER 0
+#define CONFIG_HEVC_QSV_DECODER 0
+#define CONFIG_HEVC_RKMPP_DECODER 0
+#define CONFIG_HEVC_V4L2M2M_DECODER 0
+#define CONFIG_HNM4_VIDEO_DECODER 0
+#define CONFIG_HQ_HQA_DECODER 0
+#define CONFIG_HQX_DECODER 0
+#define CONFIG_HUFFYUV_DECODER 0
+#define CONFIG_HYMT_DECODER 0
+#define CONFIG_IDCIN_DECODER 0
+#define CONFIG_IFF_ILBM_DECODER 0
+#define CONFIG_IMM4_DECODER 0
+#define CONFIG_IMM5_DECODER 0
+#define CONFIG_INDEO2_DECODER 0
+#define CONFIG_INDEO3_DECODER 0
+#define CONFIG_INDEO4_DECODER 0
+#define CONFIG_INDEO5_DECODER 0
+#define CONFIG_INTERPLAY_VIDEO_DECODER 0
+#define CONFIG_JPEG2000_DECODER 0
+#define CONFIG_JPEGLS_DECODER 0
+#define CONFIG_JV_DECODER 0
+#define CONFIG_KGV1_DECODER 0
+#define CONFIG_KMVC_DECODER 0
+#define CONFIG_LAGARITH_DECODER 0
+#define CONFIG_LOCO_DECODER 0
+#define CONFIG_LSCR_DECODER 0
+#define CONFIG_M101_DECODER 0
+#define CONFIG_MAGICYUV_DECODER 0
+#define CONFIG_MDEC_DECODER 0
+#define CONFIG_MIMIC_DECODER 0
+#define CONFIG_MJPEG_DECODER 0
+#define CONFIG_MJPEGB_DECODER 0
+#define CONFIG_MMVIDEO_DECODER 0
+#define CONFIG_MOTIONPIXELS_DECODER 0
+#define CONFIG_MPEG1VIDEO_DECODER 0
+#define CONFIG_MPEG2VIDEO_DECODER 0
+#define CONFIG_MPEG4_DECODER 0
+#define CONFIG_MPEG4_CRYSTALHD_DECODER 0
+#define CONFIG_MPEG4_V4L2M2M_DECODER 0
+#define CONFIG_MPEG4_MMAL_DECODER 0
+#define CONFIG_MPEGVIDEO_DECODER 0
+#define CONFIG_MPEG1_V4L2M2M_DECODER 0
+#define CONFIG_MPEG2_MMAL_DECODER 0
+#define CONFIG_MPEG2_CRYSTALHD_DECODER 0
+#define CONFIG_MPEG2_V4L2M2M_DECODER 0
+#define CONFIG_MPEG2_QSV_DECODER 0
+#define CONFIG_MPEG2_MEDIACODEC_DECODER 0
+#define CONFIG_MSA1_DECODER 0
+#define CONFIG_MSCC_DECODER 0
+#define CONFIG_MSMPEG4V1_DECODER 0
+#define CONFIG_MSMPEG4V2_DECODER 0
+#define CONFIG_MSMPEG4V3_DECODER 0
+#define CONFIG_MSMPEG4_CRYSTALHD_DECODER 0
+#define CONFIG_MSRLE_DECODER 0
+#define CONFIG_MSS1_DECODER 0
+#define CONFIG_MSS2_DECODER 0
+#define CONFIG_MSVIDEO1_DECODER 0
+#define CONFIG_MSZH_DECODER 0
+#define CONFIG_MTS2_DECODER 0
+#define CONFIG_MV30_DECODER 0
+#define CONFIG_MVC1_DECODER 0
+#define CONFIG_MVC2_DECODER 0
+#define CONFIG_MVDV_DECODER 0
+#define CONFIG_MVHA_DECODER 0
+#define CONFIG_MWSC_DECODER 0
+#define CONFIG_MXPEG_DECODER 0
+#define CONFIG_NUV_DECODER 0
+#define CONFIG_PAF_VIDEO_DECODER 0
+#define CONFIG_PAM_DECODER 0
+#define CONFIG_PBM_DECODER 0
+#define CONFIG_PCX_DECODER 0
+#define CONFIG_PGM_DECODER 0
+#define CONFIG_PGMYUV_DECODER 0
+#define CONFIG_PICTOR_DECODER 0
+#define CONFIG_PIXLET_DECODER 0
+#define CONFIG_PNG_DECODER 0
+#define CONFIG_PPM_DECODER 0
+#define CONFIG_PRORES_DECODER 0
+#define CONFIG_PROSUMER_DECODER 0
+#define CONFIG_PSD_DECODER 0
+#define CONFIG_PTX_DECODER 0
+#define CONFIG_QDRAW_DECODER 0
+#define CONFIG_QPEG_DECODER 0
+#define CONFIG_QTRLE_DECODER 0
+#define CONFIG_R10K_DECODER 0
+#define CONFIG_R210_DECODER 0
+#define CONFIG_RASC_DECODER 0
+#define CONFIG_RAWVIDEO_DECODER 0
+#define CONFIG_RL2_DECODER 0
+#define CONFIG_ROQ_DECODER 0
+#define CONFIG_RPZA_DECODER 0
+#define CONFIG_RSCC_DECODER 0
+#define CONFIG_RV10_DECODER 0
+#define CONFIG_RV20_DECODER 0
+#define CONFIG_RV30_DECODER 0
+#define CONFIG_RV40_DECODER 0
+#define CONFIG_S302M_DECODER 0
+#define CONFIG_SANM_DECODER 0
+#define CONFIG_SCPR_DECODER 0
+#define CONFIG_SCREENPRESSO_DECODER 0
+#define CONFIG_SGI_DECODER 0
+#define CONFIG_SGIRLE_DECODER 0
+#define CONFIG_SHEERVIDEO_DECODER 0
+#define CONFIG_SMACKER_DECODER 0
+#define CONFIG_SMC_DECODER 0
+#define CONFIG_SMVJPEG_DECODER 0
+#define CONFIG_SNOW_DECODER 0
+#define CONFIG_SP5X_DECODER 0
+#define CONFIG_SPEEDHQ_DECODER 0
+#define CONFIG_SRGC_DECODER 0
+#define CONFIG_SUNRAST_DECODER 0
+#define CONFIG_SVQ1_DECODER 0
+#define CONFIG_SVQ3_DECODER 0
+#define CONFIG_TARGA_DECODER 0
+#define CONFIG_TARGA_Y216_DECODER 0
+#define CONFIG_TDSC_DECODER 0
+#define CONFIG_THEORA_DECODER 1
+#define CONFIG_THP_DECODER 0
+#define CONFIG_TIERTEXSEQVIDEO_DECODER 0
+#define CONFIG_TIFF_DECODER 0
+#define CONFIG_TMV_DECODER 0
+#define CONFIG_TRUEMOTION1_DECODER 0
+#define CONFIG_TRUEMOTION2_DECODER 0
+#define CONFIG_TRUEMOTION2RT_DECODER 0
+#define CONFIG_TSCC_DECODER 0
+#define CONFIG_TSCC2_DECODER 0
+#define CONFIG_TXD_DECODER 0
+#define CONFIG_ULTI_DECODER 0
+#define CONFIG_UTVIDEO_DECODER 0
+#define CONFIG_V210_DECODER 0
+#define CONFIG_V210X_DECODER 0
+#define CONFIG_V308_DECODER 0
+#define CONFIG_V408_DECODER 0
+#define CONFIG_V410_DECODER 0
+#define CONFIG_VB_DECODER 0
+#define CONFIG_VBLE_DECODER 0
+#define CONFIG_VC1_DECODER 0
+#define CONFIG_VC1_CRYSTALHD_DECODER 0
+#define CONFIG_VC1IMAGE_DECODER 0
+#define CONFIG_VC1_MMAL_DECODER 0
+#define CONFIG_VC1_QSV_DECODER 0
+#define CONFIG_VC1_V4L2M2M_DECODER 0
+#define CONFIG_VCR1_DECODER 0
+#define CONFIG_VMDVIDEO_DECODER 0
+#define CONFIG_VMNC_DECODER 0
+#define CONFIG_VP3_DECODER 1
+#define CONFIG_VP4_DECODER 0
+#define CONFIG_VP5_DECODER 0
+#define CONFIG_VP6_DECODER 0
+#define CONFIG_VP6A_DECODER 0
+#define CONFIG_VP6F_DECODER 0
+#define CONFIG_VP7_DECODER 0
+#define CONFIG_VP8_DECODER 1
+#define CONFIG_VP8_RKMPP_DECODER 0
+#define CONFIG_VP8_V4L2M2M_DECODER 0
+#define CONFIG_VP9_DECODER 0
+#define CONFIG_VP9_RKMPP_DECODER 0
+#define CONFIG_VP9_V4L2M2M_DECODER 0
+#define CONFIG_VQA_DECODER 0
+#define CONFIG_WEBP_DECODER 0
+#define CONFIG_WCMV_DECODER 0
+#define CONFIG_WRAPPED_AVFRAME_DECODER 0
+#define CONFIG_WMV1_DECODER 0
+#define CONFIG_WMV2_DECODER 0
+#define CONFIG_WMV3_DECODER 0
+#define CONFIG_WMV3_CRYSTALHD_DECODER 0
+#define CONFIG_WMV3IMAGE_DECODER 0
+#define CONFIG_WNV1_DECODER 0
+#define CONFIG_XAN_WC3_DECODER 0
+#define CONFIG_XAN_WC4_DECODER 0
+#define CONFIG_XBM_DECODER 0
+#define CONFIG_XFACE_DECODER 0
+#define CONFIG_XL_DECODER 0
+#define CONFIG_XPM_DECODER 0
+#define CONFIG_XWD_DECODER 0
+#define CONFIG_Y41P_DECODER 0
+#define CONFIG_YLC_DECODER 0
+#define CONFIG_YOP_DECODER 0
+#define CONFIG_YUV4_DECODER 0
+#define CONFIG_ZERO12V_DECODER 0
+#define CONFIG_ZEROCODEC_DECODER 0
+#define CONFIG_ZLIB_DECODER 0
+#define CONFIG_ZMBV_DECODER 0
+#define CONFIG_AAC_DECODER 0
+#define CONFIG_AAC_FIXED_DECODER 0
+#define CONFIG_AAC_LATM_DECODER 0
+#define CONFIG_AC3_DECODER 0
+#define CONFIG_AC3_FIXED_DECODER 0
+#define CONFIG_ACELP_KELVIN_DECODER 0
+#define CONFIG_ALAC_DECODER 0
+#define CONFIG_ALS_DECODER 0
+#define CONFIG_AMRNB_DECODER 0
+#define CONFIG_AMRWB_DECODER 0
+#define CONFIG_APE_DECODER 0
+#define CONFIG_APTX_DECODER 1
+#define CONFIG_APTX_HD_DECODER 0
+#define CONFIG_ATRAC1_DECODER 0
+#define CONFIG_ATRAC3_DECODER 0
+#define CONFIG_ATRAC3AL_DECODER 0
+#define CONFIG_ATRAC3P_DECODER 0
+#define CONFIG_ATRAC3PAL_DECODER 0
+#define CONFIG_ATRAC9_DECODER 0
+#define CONFIG_BINKAUDIO_DCT_DECODER 0
+#define CONFIG_BINKAUDIO_RDFT_DECODER 0
+#define CONFIG_BMV_AUDIO_DECODER 0
+#define CONFIG_COOK_DECODER 0
+#define CONFIG_DCA_DECODER 0
+#define CONFIG_DOLBY_E_DECODER 0
+#define CONFIG_DSD_LSBF_DECODER 0
+#define CONFIG_DSD_MSBF_DECODER 0
+#define CONFIG_DSD_LSBF_PLANAR_DECODER 0
+#define CONFIG_DSD_MSBF_PLANAR_DECODER 0
+#define CONFIG_DSICINAUDIO_DECODER 0
+#define CONFIG_DSS_SP_DECODER 0
+#define CONFIG_DST_DECODER 0
+#define CONFIG_EAC3_DECODER 0
+#define CONFIG_EVRC_DECODER 0
+#define CONFIG_FFWAVESYNTH_DECODER 0
+#define CONFIG_FLAC_DECODER 1
+#define CONFIG_G723_1_DECODER 0
+#define CONFIG_G729_DECODER 0
+#define CONFIG_GSM_DECODER 0
+#define CONFIG_GSM_MS_DECODER 0
+#define CONFIG_HCA_DECODER 0
+#define CONFIG_HCOM_DECODER 0
+#define CONFIG_IAC_DECODER 0
+#define CONFIG_ILBC_DECODER 0
+#define CONFIG_IMC_DECODER 0
+#define CONFIG_INTERPLAY_ACM_DECODER 0
+#define CONFIG_MACE3_DECODER 0
+#define CONFIG_MACE6_DECODER 0
+#define CONFIG_METASOUND_DECODER 0
+#define CONFIG_MLP_DECODER 0
+#define CONFIG_MP1_DECODER 0
+#define CONFIG_MP1FLOAT_DECODER 0
+#define CONFIG_MP2_DECODER 0
+#define CONFIG_MP2FLOAT_DECODER 0
+#define CONFIG_MP3FLOAT_DECODER 0
+#define CONFIG_MP3_DECODER 1
+#define CONFIG_MP3ADUFLOAT_DECODER 0
+#define CONFIG_MP3ADU_DECODER 0
+#define CONFIG_MP3ON4FLOAT_DECODER 0
+#define CONFIG_MP3ON4_DECODER 0
+#define CONFIG_MPC7_DECODER 0
+#define CONFIG_MPC8_DECODER 0
+#define CONFIG_NELLYMOSER_DECODER 0
+#define CONFIG_ON2AVC_DECODER 0
+#define CONFIG_OPUS_DECODER 0
+#define CONFIG_PAF_AUDIO_DECODER 0
+#define CONFIG_QCELP_DECODER 0
+#define CONFIG_QDM2_DECODER 0
+#define CONFIG_QDMC_DECODER 0
+#define CONFIG_RA_144_DECODER 0
+#define CONFIG_RA_288_DECODER 0
+#define CONFIG_RALF_DECODER 0
+#define CONFIG_SBC_DECODER 1
+#define CONFIG_SHORTEN_DECODER 0
+#define CONFIG_SIPR_DECODER 0
+#define CONFIG_SIREN_DECODER 0
+#define CONFIG_SMACKAUD_DECODER 0
+#define CONFIG_SONIC_DECODER 0
+#define CONFIG_TAK_DECODER 0
+#define CONFIG_TRUEHD_DECODER 0
+#define CONFIG_TRUESPEECH_DECODER 0
+#define CONFIG_TTA_DECODER 0
+#define CONFIG_TWINVQ_DECODER 0
+#define CONFIG_VMDAUDIO_DECODER 0
+#define CONFIG_VORBIS_DECODER 1
+#define CONFIG_WAVPACK_DECODER 0
+#define CONFIG_WMALOSSLESS_DECODER 0
+#define CONFIG_WMAPRO_DECODER 0
+#define CONFIG_WMAV1_DECODER 0
+#define CONFIG_WMAV2_DECODER 0
+#define CONFIG_WMAVOICE_DECODER 0
+#define CONFIG_WS_SND1_DECODER 0
+#define CONFIG_XMA1_DECODER 0
+#define CONFIG_XMA2_DECODER 0
+#define CONFIG_PCM_ALAW_DECODER 1
+#define CONFIG_PCM_BLURAY_DECODER 0
+#define CONFIG_PCM_DVD_DECODER 0
+#define CONFIG_PCM_F16LE_DECODER 0
+#define CONFIG_PCM_F24LE_DECODER 0
+#define CONFIG_PCM_F32BE_DECODER 0
+#define CONFIG_PCM_F32LE_DECODER 1
+#define CONFIG_PCM_F64BE_DECODER 0
+#define CONFIG_PCM_F64LE_DECODER 0
+#define CONFIG_PCM_LXF_DECODER 0
+#define CONFIG_PCM_MULAW_DECODER 1
+#define CONFIG_PCM_S8_DECODER 0
+#define CONFIG_PCM_S8_PLANAR_DECODER 0
+#define CONFIG_PCM_S16BE_DECODER 1
+#define CONFIG_PCM_S16BE_PLANAR_DECODER 0
+#define CONFIG_PCM_S16LE_DECODER 1
+#define CONFIG_PCM_S16LE_PLANAR_DECODER 0
+#define CONFIG_PCM_S24BE_DECODER 1
+#define CONFIG_PCM_S24DAUD_DECODER 0
+#define CONFIG_PCM_S24LE_DECODER 1
+#define CONFIG_PCM_S24LE_PLANAR_DECODER 0
+#define CONFIG_PCM_S32BE_DECODER 0
+#define CONFIG_PCM_S32LE_DECODER 1
+#define CONFIG_PCM_S32LE_PLANAR_DECODER 0
+#define CONFIG_PCM_S64BE_DECODER 0
+#define CONFIG_PCM_S64LE_DECODER 0
+#define CONFIG_PCM_U8_DECODER 1
+#define CONFIG_PCM_U16BE_DECODER 0
+#define CONFIG_PCM_U16LE_DECODER 0
+#define CONFIG_PCM_U24BE_DECODER 0
+#define CONFIG_PCM_U24LE_DECODER 0
+#define CONFIG_PCM_U32BE_DECODER 0
+#define CONFIG_PCM_U32LE_DECODER 0
+#define CONFIG_PCM_VIDC_DECODER 0
+#define CONFIG_DERF_DPCM_DECODER 0
+#define CONFIG_GREMLIN_DPCM_DECODER 0
+#define CONFIG_INTERPLAY_DPCM_DECODER 0
+#define CONFIG_ROQ_DPCM_DECODER 0
+#define CONFIG_SDX2_DPCM_DECODER 0
+#define CONFIG_SOL_DPCM_DECODER 0
+#define CONFIG_XAN_DPCM_DECODER 0
+#define CONFIG_ADPCM_4XM_DECODER 0
+#define CONFIG_ADPCM_ADX_DECODER 0
+#define CONFIG_ADPCM_AFC_DECODER 0
+#define CONFIG_ADPCM_AGM_DECODER 0
+#define CONFIG_ADPCM_AICA_DECODER 0
+#define CONFIG_ADPCM_ARGO_DECODER 0
+#define CONFIG_ADPCM_CT_DECODER 0
+#define CONFIG_ADPCM_DTK_DECODER 0
+#define CONFIG_ADPCM_EA_DECODER 0
+#define CONFIG_ADPCM_EA_MAXIS_XA_DECODER 0
+#define CONFIG_ADPCM_EA_R1_DECODER 0
+#define CONFIG_ADPCM_EA_R2_DECODER 0
+#define CONFIG_ADPCM_EA_R3_DECODER 0
+#define CONFIG_ADPCM_EA_XAS_DECODER 0
+#define CONFIG_ADPCM_G722_DECODER 0
+#define CONFIG_ADPCM_G726_DECODER 0
+#define CONFIG_ADPCM_G726LE_DECODER 0
+#define CONFIG_ADPCM_IMA_AMV_DECODER 0
+#define CONFIG_ADPCM_IMA_ALP_DECODER 0
+#define CONFIG_ADPCM_IMA_APC_DECODER 0
+#define CONFIG_ADPCM_IMA_APM_DECODER 0
+#define CONFIG_ADPCM_IMA_DAT4_DECODER 0
+#define CONFIG_ADPCM_IMA_DK3_DECODER 0
+#define CONFIG_ADPCM_IMA_DK4_DECODER 0
+#define CONFIG_ADPCM_IMA_EA_EACS_DECODER 0
+#define CONFIG_ADPCM_IMA_EA_SEAD_DECODER 0
+#define CONFIG_ADPCM_IMA_ISS_DECODER 0
+#define CONFIG_ADPCM_IMA_MTF_DECODER 0
+#define CONFIG_ADPCM_IMA_OKI_DECODER 0
+#define CONFIG_ADPCM_IMA_QT_DECODER 0
+#define CONFIG_ADPCM_IMA_RAD_DECODER 0
+#define CONFIG_ADPCM_IMA_SSI_DECODER 0
+#define CONFIG_ADPCM_IMA_SMJPEG_DECODER 0
+#define CONFIG_ADPCM_IMA_WAV_DECODER 0
+#define CONFIG_ADPCM_IMA_WS_DECODER 0
+#define CONFIG_ADPCM_MS_DECODER 0
+#define CONFIG_ADPCM_MTAF_DECODER 0
+#define CONFIG_ADPCM_PSX_DECODER 0
+#define CONFIG_ADPCM_SBPRO_2_DECODER 0
+#define CONFIG_ADPCM_SBPRO_3_DECODER 0
+#define CONFIG_ADPCM_SBPRO_4_DECODER 0
+#define CONFIG_ADPCM_SWF_DECODER 0
+#define CONFIG_ADPCM_THP_DECODER 0
+#define CONFIG_ADPCM_THP_LE_DECODER 0
+#define CONFIG_ADPCM_VIMA_DECODER 0
+#define CONFIG_ADPCM_XA_DECODER 0
+#define CONFIG_ADPCM_YAMAHA_DECODER 0
+#define CONFIG_ADPCM_ZORK_DECODER 0
+#define CONFIG_SSA_DECODER 0
+#define CONFIG_ASS_DECODER 0
+#define CONFIG_CCAPTION_DECODER 0
+#define CONFIG_DVBSUB_DECODER 0
+#define CONFIG_DVDSUB_DECODER 0
+#define CONFIG_JACOSUB_DECODER 0
+#define CONFIG_MICRODVD_DECODER 0
+#define CONFIG_MOVTEXT_DECODER 0
+#define CONFIG_MPL2_DECODER 0
+#define CONFIG_PGSSUB_DECODER 0
+#define CONFIG_PJS_DECODER 0
+#define CONFIG_REALTEXT_DECODER 0
+#define CONFIG_SAMI_DECODER 0
+#define CONFIG_SRT_DECODER 0
+#define CONFIG_STL_DECODER 0
+#define CONFIG_SUBRIP_DECODER 0
+#define CONFIG_SUBVIEWER_DECODER 0
+#define CONFIG_SUBVIEWER1_DECODER 0
+#define CONFIG_TEXT_DECODER 0
+#define CONFIG_VPLAYER_DECODER 0
+#define CONFIG_WEBVTT_DECODER 0
+#define CONFIG_XSUB_DECODER 0
+#define CONFIG_AAC_AT_DECODER 0
+#define CONFIG_AC3_AT_DECODER 0
+#define CONFIG_ADPCM_IMA_QT_AT_DECODER 0
+#define CONFIG_ALAC_AT_DECODER 0
+#define CONFIG_AMR_NB_AT_DECODER 0
+#define CONFIG_EAC3_AT_DECODER 0
+#define CONFIG_GSM_MS_AT_DECODER 0
+#define CONFIG_ILBC_AT_DECODER 0
+#define CONFIG_MP1_AT_DECODER 0
+#define CONFIG_MP2_AT_DECODER 0
+#define CONFIG_MP3_AT_DECODER 0
+#define CONFIG_PCM_ALAW_AT_DECODER 0
+#define CONFIG_PCM_MULAW_AT_DECODER 0
+#define CONFIG_QDMC_AT_DECODER 0
+#define CONFIG_QDM2_AT_DECODER 0
+#define CONFIG_LIBARIBB24_DECODER 0
+#define CONFIG_LIBCELT_DECODER 0
+#define CONFIG_LIBCODEC2_DECODER 0
+#define CONFIG_LIBDAV1D_DECODER 0
+#define CONFIG_LIBDAVS2_DECODER 0
+#define CONFIG_LIBFDK_AAC_DECODER 0
+#define CONFIG_LIBGSM_DECODER 0
+#define CONFIG_LIBGSM_MS_DECODER 0
+#define CONFIG_LIBILBC_DECODER 0
+#define CONFIG_LIBOPENCORE_AMRNB_DECODER 0
+#define CONFIG_LIBOPENCORE_AMRWB_DECODER 0
+#define CONFIG_LIBOPENJPEG_DECODER 0
+#define CONFIG_LIBOPUS_DECODER 1
+#define CONFIG_LIBRSVG_DECODER 0
+#define CONFIG_LIBSPEEX_DECODER 0
+#define CONFIG_LIBVORBIS_DECODER 0
+#define CONFIG_LIBVPX_VP8_DECODER 0
+#define CONFIG_LIBVPX_VP9_DECODER 0
+#define CONFIG_LIBZVBI_TELETEXT_DECODER 0
+#define CONFIG_BINTEXT_DECODER 0
+#define CONFIG_XBIN_DECODER 0
+#define CONFIG_IDF_DECODER 0
+#define CONFIG_LIBAOM_AV1_DECODER 0
+#define CONFIG_LIBOPENH264_DECODER 0
+#define CONFIG_H264_CUVID_DECODER 0
+#define CONFIG_HEVC_CUVID_DECODER 0
+#define CONFIG_HEVC_MEDIACODEC_DECODER 0
+#define CONFIG_MJPEG_CUVID_DECODER 0
+#define CONFIG_MJPEG_QSV_DECODER 0
+#define CONFIG_MPEG1_CUVID_DECODER 0
+#define CONFIG_MPEG2_CUVID_DECODER 0
+#define CONFIG_MPEG4_CUVID_DECODER 0
+#define CONFIG_MPEG4_MEDIACODEC_DECODER 0
+#define CONFIG_VC1_CUVID_DECODER 0
+#define CONFIG_VP8_CUVID_DECODER 0
+#define CONFIG_VP8_MEDIACODEC_DECODER 0
+#define CONFIG_VP8_QSV_DECODER 0
+#define CONFIG_VP9_CUVID_DECODER 0
+#define CONFIG_VP9_MEDIACODEC_DECODER 0
+#define CONFIG_VP9_QSV_DECODER 0
+#define CONFIG_A64MULTI_ENCODER 0
+#define CONFIG_A64MULTI5_ENCODER 0
+#define CONFIG_ALIAS_PIX_ENCODER 0
+#define CONFIG_AMV_ENCODER 0
+#define CONFIG_APNG_ENCODER 0
+#define CONFIG_ASV1_ENCODER 0
+#define CONFIG_ASV2_ENCODER 0
+#define CONFIG_AVRP_ENCODER 0
+#define CONFIG_AVUI_ENCODER 0
+#define CONFIG_AYUV_ENCODER 0
+#define CONFIG_BMP_ENCODER 0
+#define CONFIG_CINEPAK_ENCODER 0
+#define CONFIG_CLJR_ENCODER 0
+#define CONFIG_COMFORTNOISE_ENCODER 0
+#define CONFIG_DNXHD_ENCODER 0
+#define CONFIG_DPX_ENCODER 0
+#define CONFIG_DVVIDEO_ENCODER 0
+#define CONFIG_FFV1_ENCODER 0
+#define CONFIG_FFVHUFF_ENCODER 0
+#define CONFIG_FITS_ENCODER 0
+#define CONFIG_FLASHSV_ENCODER 0
+#define CONFIG_FLASHSV2_ENCODER 0
+#define CONFIG_FLV_ENCODER 0
+#define CONFIG_GIF_ENCODER 0
+#define CONFIG_H261_ENCODER 0
+#define CONFIG_H263_ENCODER 0
+#define CONFIG_H263P_ENCODER 0
+#define CONFIG_HAP_ENCODER 0
+#define CONFIG_HUFFYUV_ENCODER 0
+#define CONFIG_JPEG2000_ENCODER 0
+#define CONFIG_JPEGLS_ENCODER 0
+#define CONFIG_LJPEG_ENCODER 0
+#define CONFIG_MAGICYUV_ENCODER 0
+#define CONFIG_MJPEG_ENCODER 0
+#define CONFIG_MPEG1VIDEO_ENCODER 0
+#define CONFIG_MPEG2VIDEO_ENCODER 0
+#define CONFIG_MPEG4_ENCODER 0
+#define CONFIG_MSMPEG4V2_ENCODER 0
+#define CONFIG_MSMPEG4V3_ENCODER 0
+#define CONFIG_MSVIDEO1_ENCODER 0
+#define CONFIG_PAM_ENCODER 0
+#define CONFIG_PBM_ENCODER 0
+#define CONFIG_PCX_ENCODER 0
+#define CONFIG_PGM_ENCODER 0
+#define CONFIG_PGMYUV_ENCODER 0
+#define CONFIG_PNG_ENCODER 0
+#define CONFIG_PPM_ENCODER 0
+#define CONFIG_PRORES_ENCODER 0
+#define CONFIG_PRORES_AW_ENCODER 0
+#define CONFIG_PRORES_KS_ENCODER 0
+#define CONFIG_QTRLE_ENCODER 0
+#define CONFIG_R10K_ENCODER 0
+#define CONFIG_R210_ENCODER 0
+#define CONFIG_RAWVIDEO_ENCODER 0
+#define CONFIG_ROQ_ENCODER 0
+#define CONFIG_RV10_ENCODER 0
+#define CONFIG_RV20_ENCODER 0
+#define CONFIG_S302M_ENCODER 0
+#define CONFIG_SGI_ENCODER 0
+#define CONFIG_SNOW_ENCODER 0
+#define CONFIG_SUNRAST_ENCODER 0
+#define CONFIG_SVQ1_ENCODER 0
+#define CONFIG_TARGA_ENCODER 0
+#define CONFIG_TIFF_ENCODER 0
+#define CONFIG_UTVIDEO_ENCODER 0
+#define CONFIG_V210_ENCODER 0
+#define CONFIG_V308_ENCODER 0
+#define CONFIG_V408_ENCODER 0
+#define CONFIG_V410_ENCODER 0
+#define CONFIG_VC2_ENCODER 0
+#define CONFIG_WRAPPED_AVFRAME_ENCODER 0
+#define CONFIG_WMV1_ENCODER 0
+#define CONFIG_WMV2_ENCODER 0
+#define CONFIG_XBM_ENCODER 0
+#define CONFIG_XFACE_ENCODER 0
+#define CONFIG_XWD_ENCODER 0
+#define CONFIG_Y41P_ENCODER 0
+#define CONFIG_YUV4_ENCODER 0
+#define CONFIG_ZLIB_ENCODER 0
+#define CONFIG_ZMBV_ENCODER 0
+#define CONFIG_AAC_ENCODER 0
+#define CONFIG_AC3_ENCODER 0
+#define CONFIG_AC3_FIXED_ENCODER 0
+#define CONFIG_ALAC_ENCODER 0
+#define CONFIG_APTX_ENCODER 0
+#define CONFIG_APTX_HD_ENCODER 0
+#define CONFIG_DCA_ENCODER 0
+#define CONFIG_EAC3_ENCODER 0
+#define CONFIG_FLAC_ENCODER 0
+#define CONFIG_G723_1_ENCODER 0
+#define CONFIG_MLP_ENCODER 0
+#define CONFIG_MP2_ENCODER 0
+#define CONFIG_MP2FIXED_ENCODER 0
+#define CONFIG_NELLYMOSER_ENCODER 0
+#define CONFIG_OPUS_ENCODER 0
+#define CONFIG_RA_144_ENCODER 0
+#define CONFIG_SBC_ENCODER 0
+#define CONFIG_SONIC_ENCODER 0
+#define CONFIG_SONIC_LS_ENCODER 0
+#define CONFIG_TRUEHD_ENCODER 0
+#define CONFIG_TTA_ENCODER 0
+#define CONFIG_VORBIS_ENCODER 0
+#define CONFIG_WAVPACK_ENCODER 0
+#define CONFIG_WMAV1_ENCODER 0
+#define CONFIG_WMAV2_ENCODER 0
+#define CONFIG_PCM_ALAW_ENCODER 0
+#define CONFIG_PCM_DVD_ENCODER 0
+#define CONFIG_PCM_F32BE_ENCODER 0
+#define CONFIG_PCM_F32LE_ENCODER 0
+#define CONFIG_PCM_F64BE_ENCODER 0
+#define CONFIG_PCM_F64LE_ENCODER 0
+#define CONFIG_PCM_MULAW_ENCODER 0
+#define CONFIG_PCM_S8_ENCODER 0
+#define CONFIG_PCM_S8_PLANAR_ENCODER 0
+#define CONFIG_PCM_S16BE_ENCODER 0
+#define CONFIG_PCM_S16BE_PLANAR_ENCODER 0
+#define CONFIG_PCM_S16LE_ENCODER 0
+#define CONFIG_PCM_S16LE_PLANAR_ENCODER 0
+#define CONFIG_PCM_S24BE_ENCODER 0
+#define CONFIG_PCM_S24DAUD_ENCODER 0
+#define CONFIG_PCM_S24LE_ENCODER 0
+#define CONFIG_PCM_S24LE_PLANAR_ENCODER 0
+#define CONFIG_PCM_S32BE_ENCODER 0
+#define CONFIG_PCM_S32LE_ENCODER 0
+#define CONFIG_PCM_S32LE_PLANAR_ENCODER 0
+#define CONFIG_PCM_S64BE_ENCODER 0
+#define CONFIG_PCM_S64LE_ENCODER 0
+#define CONFIG_PCM_U8_ENCODER 0
+#define CONFIG_PCM_U16BE_ENCODER 0
+#define CONFIG_PCM_U16LE_ENCODER 0
+#define CONFIG_PCM_U24BE_ENCODER 0
+#define CONFIG_PCM_U24LE_ENCODER 0
+#define CONFIG_PCM_U32BE_ENCODER 0
+#define CONFIG_PCM_U32LE_ENCODER 0
+#define CONFIG_PCM_VIDC_ENCODER 0
+#define CONFIG_ROQ_DPCM_ENCODER 0
+#define CONFIG_ADPCM_ADX_ENCODER 0
+#define CONFIG_ADPCM_G722_ENCODER 0
+#define CONFIG_ADPCM_G726_ENCODER 0
+#define CONFIG_ADPCM_G726LE_ENCODER 0
+#define CONFIG_ADPCM_IMA_QT_ENCODER 0
+#define CONFIG_ADPCM_IMA_WAV_ENCODER 0
+#define CONFIG_ADPCM_MS_ENCODER 0
+#define CONFIG_ADPCM_SWF_ENCODER 0
+#define CONFIG_ADPCM_YAMAHA_ENCODER 0
+#define CONFIG_SSA_ENCODER 0
+#define CONFIG_ASS_ENCODER 0
+#define CONFIG_DVBSUB_ENCODER 0
+#define CONFIG_DVDSUB_ENCODER 0
+#define CONFIG_MOVTEXT_ENCODER 0
+#define CONFIG_SRT_ENCODER 0
+#define CONFIG_SUBRIP_ENCODER 0
+#define CONFIG_TEXT_ENCODER 0
+#define CONFIG_WEBVTT_ENCODER 0
+#define CONFIG_XSUB_ENCODER 0
+#define CONFIG_AAC_AT_ENCODER 0
+#define CONFIG_ALAC_AT_ENCODER 0
+#define CONFIG_ILBC_AT_ENCODER 0
+#define CONFIG_PCM_ALAW_AT_ENCODER 0
+#define CONFIG_PCM_MULAW_AT_ENCODER 0
+#define CONFIG_LIBAOM_AV1_ENCODER 0
+#define CONFIG_LIBCODEC2_ENCODER 0
+#define CONFIG_LIBFDK_AAC_ENCODER 0
+#define CONFIG_LIBGSM_ENCODER 0
+#define CONFIG_LIBGSM_MS_ENCODER 0
+#define CONFIG_LIBILBC_ENCODER 0
+#define CONFIG_LIBMP3LAME_ENCODER 0
+#define CONFIG_LIBOPENCORE_AMRNB_ENCODER 0
+#define CONFIG_LIBOPENJPEG_ENCODER 0
+#define CONFIG_LIBOPUS_ENCODER 0
+#define CONFIG_LIBRAV1E_ENCODER 0
+#define CONFIG_LIBSHINE_ENCODER 0
+#define CONFIG_LIBSPEEX_ENCODER 0
+#define CONFIG_LIBTHEORA_ENCODER 0
+#define CONFIG_LIBTWOLAME_ENCODER 0
+#define CONFIG_LIBVO_AMRWBENC_ENCODER 0
+#define CONFIG_LIBVORBIS_ENCODER 0
+#define CONFIG_LIBVPX_VP8_ENCODER 0
+#define CONFIG_LIBVPX_VP9_ENCODER 0
+#define CONFIG_LIBWAVPACK_ENCODER 0
+#define CONFIG_LIBWEBP_ANIM_ENCODER 0
+#define CONFIG_LIBWEBP_ENCODER 0
+#define CONFIG_LIBX262_ENCODER 0
+#define CONFIG_LIBX264_ENCODER 0
+#define CONFIG_LIBX264RGB_ENCODER 0
+#define CONFIG_LIBX265_ENCODER 0
+#define CONFIG_LIBXAVS_ENCODER 0
+#define CONFIG_LIBXAVS2_ENCODER 0
+#define CONFIG_LIBXVID_ENCODER 0
+#define CONFIG_H263_V4L2M2M_ENCODER 0
+#define CONFIG_LIBOPENH264_ENCODER 0
+#define CONFIG_H264_AMF_ENCODER 0
+#define CONFIG_H264_NVENC_ENCODER 0
+#define CONFIG_H264_OMX_ENCODER 0
+#define CONFIG_H264_QSV_ENCODER 0
+#define CONFIG_H264_V4L2M2M_ENCODER 0
+#define CONFIG_H264_VAAPI_ENCODER 0
+#define CONFIG_H264_VIDEOTOOLBOX_ENCODER 0
+#define CONFIG_NVENC_ENCODER 0
+#define CONFIG_NVENC_H264_ENCODER 0
+#define CONFIG_NVENC_HEVC_ENCODER 0
+#define CONFIG_HEVC_AMF_ENCODER 0
+#define CONFIG_HEVC_NVENC_ENCODER 0
+#define CONFIG_HEVC_QSV_ENCODER 0
+#define CONFIG_HEVC_V4L2M2M_ENCODER 0
+#define CONFIG_HEVC_VAAPI_ENCODER 0
+#define CONFIG_HEVC_VIDEOTOOLBOX_ENCODER 0
+#define CONFIG_LIBKVAZAAR_ENCODER 0
+#define CONFIG_MJPEG_QSV_ENCODER 0
+#define CONFIG_MJPEG_VAAPI_ENCODER 0
+#define CONFIG_MPEG2_QSV_ENCODER 0
+#define CONFIG_MPEG2_VAAPI_ENCODER 0
+#define CONFIG_MPEG4_OMX_ENCODER 0
+#define CONFIG_MPEG4_V4L2M2M_ENCODER 0
+#define CONFIG_VP8_V4L2M2M_ENCODER 0
+#define CONFIG_VP8_VAAPI_ENCODER 0
+#define CONFIG_VP9_VAAPI_ENCODER 0
+#define CONFIG_VP9_QSV_ENCODER 0
+#define CONFIG_H263_VAAPI_HWACCEL 0
+#define CONFIG_H263_VIDEOTOOLBOX_HWACCEL 0
+#define CONFIG_H264_D3D11VA_HWACCEL 0
+#define CONFIG_H264_D3D11VA2_HWACCEL 0
+#define CONFIG_H264_DXVA2_HWACCEL 0
+#define CONFIG_H264_NVDEC_HWACCEL 0
+#define CONFIG_H264_VAAPI_HWACCEL 0
+#define CONFIG_H264_VDPAU_HWACCEL 0
+#define CONFIG_H264_VIDEOTOOLBOX_HWACCEL 0
+#define CONFIG_HEVC_D3D11VA_HWACCEL 0
+#define CONFIG_HEVC_D3D11VA2_HWACCEL 0
+#define CONFIG_HEVC_DXVA2_HWACCEL 0
+#define CONFIG_HEVC_NVDEC_HWACCEL 0
+#define CONFIG_HEVC_VAAPI_HWACCEL 0
+#define CONFIG_HEVC_VDPAU_HWACCEL 0
+#define CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL 0
+#define CONFIG_MJPEG_NVDEC_HWACCEL 0
+#define CONFIG_MJPEG_VAAPI_HWACCEL 0
+#define CONFIG_MPEG1_NVDEC_HWACCEL 0
+#define CONFIG_MPEG1_VDPAU_HWACCEL 0
+#define CONFIG_MPEG1_VIDEOTOOLBOX_HWACCEL 0
+#define CONFIG_MPEG1_XVMC_HWACCEL 0
+#define CONFIG_MPEG2_D3D11VA_HWACCEL 0
+#define CONFIG_MPEG2_D3D11VA2_HWACCEL 0
+#define CONFIG_MPEG2_NVDEC_HWACCEL 0
+#define CONFIG_MPEG2_DXVA2_HWACCEL 0
+#define CONFIG_MPEG2_VAAPI_HWACCEL 0
+#define CONFIG_MPEG2_VDPAU_HWACCEL 0
+#define CONFIG_MPEG2_VIDEOTOOLBOX_HWACCEL 0
+#define CONFIG_MPEG2_XVMC_HWACCEL 0
+#define CONFIG_MPEG4_NVDEC_HWACCEL 0
+#define CONFIG_MPEG4_VAAPI_HWACCEL 0
+#define CONFIG_MPEG4_VDPAU_HWACCEL 0
+#define CONFIG_MPEG4_VIDEOTOOLBOX_HWACCEL 0
+#define CONFIG_VC1_D3D11VA_HWACCEL 0
+#define CONFIG_VC1_D3D11VA2_HWACCEL 0
+#define CONFIG_VC1_DXVA2_HWACCEL 0
+#define CONFIG_VC1_NVDEC_HWACCEL 0
+#define CONFIG_VC1_VAAPI_HWACCEL 0
+#define CONFIG_VC1_VDPAU_HWACCEL 0
+#define CONFIG_VP8_NVDEC_HWACCEL 0
+#define CONFIG_VP8_VAAPI_HWACCEL 0
+#define CONFIG_VP9_D3D11VA_HWACCEL 0
+#define CONFIG_VP9_D3D11VA2_HWACCEL 0
+#define CONFIG_VP9_DXVA2_HWACCEL 0
+#define CONFIG_VP9_NVDEC_HWACCEL 0
+#define CONFIG_VP9_VAAPI_HWACCEL 0
+#define CONFIG_VP9_VDPAU_HWACCEL 0
+#define CONFIG_WMV3_D3D11VA_HWACCEL 0
+#define CONFIG_WMV3_D3D11VA2_HWACCEL 0
+#define CONFIG_WMV3_DXVA2_HWACCEL 0
+#define CONFIG_WMV3_NVDEC_HWACCEL 0
+#define CONFIG_WMV3_VAAPI_HWACCEL 0
+#define CONFIG_WMV3_VDPAU_HWACCEL 0
+#define CONFIG_AAC_PARSER 0
+#define CONFIG_AAC_LATM_PARSER 0
+#define CONFIG_AC3_PARSER 0
+#define CONFIG_ADX_PARSER 0
+#define CONFIG_AV1_PARSER 0
+#define CONFIG_AVS2_PARSER 0
+#define CONFIG_BMP_PARSER 0
+#define CONFIG_CAVSVIDEO_PARSER 0
+#define CONFIG_COOK_PARSER 0
+#define CONFIG_DCA_PARSER 0
+#define CONFIG_DIRAC_PARSER 0
+#define CONFIG_DNXHD_PARSER 0
+#define CONFIG_DPX_PARSER 0
+#define CONFIG_DVAUDIO_PARSER 0
+#define CONFIG_DVBSUB_PARSER 0
+#define CONFIG_DVDSUB_PARSER 0
+#define CONFIG_DVD_NAV_PARSER 0
+#define CONFIG_FLAC_PARSER 1
+#define CONFIG_G723_1_PARSER 0
+#define CONFIG_G729_PARSER 0
+#define CONFIG_GIF_PARSER 0
+#define CONFIG_GSM_PARSER 0
+#define CONFIG_H261_PARSER 0
+#define CONFIG_H263_PARSER 0
+#define CONFIG_H264_PARSER 0
+#define CONFIG_HEVC_PARSER 0
+#define CONFIG_MJPEG_PARSER 0
+#define CONFIG_MLP_PARSER 0
+#define CONFIG_MPEG4VIDEO_PARSER 0
+#define CONFIG_MPEGAUDIO_PARSER 1
+#define CONFIG_MPEGVIDEO_PARSER 0
+#define CONFIG_OPUS_PARSER 1
+#define CONFIG_PNG_PARSER 0
+#define CONFIG_PNM_PARSER 0
+#define CONFIG_RV30_PARSER 0
+#define CONFIG_RV40_PARSER 0
+#define CONFIG_SBC_PARSER 0
+#define CONFIG_SIPR_PARSER 0
+#define CONFIG_TAK_PARSER 0
+#define CONFIG_VC1_PARSER 0
+#define CONFIG_VORBIS_PARSER 1
+#define CONFIG_VP3_PARSER 1
+#define CONFIG_VP8_PARSER 1
+#define CONFIG_VP9_PARSER 0
+#define CONFIG_WEBP_PARSER 0
+#define CONFIG_XMA_PARSER 0
+#define CONFIG_ALSA_INDEV 0
+#define CONFIG_ANDROID_CAMERA_INDEV 0
+#define CONFIG_AVFOUNDATION_INDEV 0
+#define CONFIG_BKTR_INDEV 0
+#define CONFIG_DECKLINK_INDEV 0
+#define CONFIG_DSHOW_INDEV 0
+#define CONFIG_FBDEV_INDEV 0
+#define CONFIG_GDIGRAB_INDEV 0
+#define CONFIG_IEC61883_INDEV 0
+#define CONFIG_JACK_INDEV 0
+#define CONFIG_KMSGRAB_INDEV 0
+#define CONFIG_LAVFI_INDEV 0
+#define CONFIG_OPENAL_INDEV 0
+#define CONFIG_OSS_INDEV 0
+#define CONFIG_PULSE_INDEV 0
+#define CONFIG_SNDIO_INDEV 0
+#define CONFIG_V4L2_INDEV 0
+#define CONFIG_VFWCAP_INDEV 0
+#define CONFIG_XCBGRAB_INDEV 0
+#define CONFIG_LIBCDIO_INDEV 0
+#define CONFIG_LIBDC1394_INDEV 0
+#define CONFIG_ALSA_OUTDEV 0
+#define CONFIG_CACA_OUTDEV 0
+#define CONFIG_DECKLINK_OUTDEV 0
+#define CONFIG_FBDEV_OUTDEV 0
+#define CONFIG_OPENGL_OUTDEV 0
+#define CONFIG_OSS_OUTDEV 0
+#define CONFIG_PULSE_OUTDEV 0
+#define CONFIG_SDL2_OUTDEV 0
+#define CONFIG_SNDIO_OUTDEV 0
+#define CONFIG_V4L2_OUTDEV 0
+#define CONFIG_XV_OUTDEV 0
+#define CONFIG_ABENCH_FILTER 0
+#define CONFIG_ACOMPRESSOR_FILTER 0
+#define CONFIG_ACONTRAST_FILTER 0
+#define CONFIG_ACOPY_FILTER 0
+#define CONFIG_ACUE_FILTER 0
+#define CONFIG_ACROSSFADE_FILTER 0
+#define CONFIG_ACROSSOVER_FILTER 0
+#define CONFIG_ACRUSHER_FILTER 0
+#define CONFIG_ADECLICK_FILTER 0
+#define CONFIG_ADECLIP_FILTER 0
+#define CONFIG_ADELAY_FILTER 0
+#define CONFIG_ADERIVATIVE_FILTER 0
+#define CONFIG_AECHO_FILTER 0
+#define CONFIG_AEMPHASIS_FILTER 0
+#define CONFIG_AEVAL_FILTER 0
+#define CONFIG_AFADE_FILTER 0
+#define CONFIG_AFFTDN_FILTER 0
+#define CONFIG_AFFTFILT_FILTER 0
+#define CONFIG_AFIR_FILTER 0
+#define CONFIG_AFORMAT_FILTER 0
+#define CONFIG_AGATE_FILTER 0
+#define CONFIG_AIIR_FILTER 0
+#define CONFIG_AINTEGRAL_FILTER 0
+#define CONFIG_AINTERLEAVE_FILTER 0
+#define CONFIG_ALIMITER_FILTER 0
+#define CONFIG_ALLPASS_FILTER 0
+#define CONFIG_ALOOP_FILTER 0
+#define CONFIG_AMERGE_FILTER 0
+#define CONFIG_AMETADATA_FILTER 0
+#define CONFIG_AMIX_FILTER 0
+#define CONFIG_AMULTIPLY_FILTER 0
+#define CONFIG_ANEQUALIZER_FILTER 0
+#define CONFIG_ANLMDN_FILTER 0
+#define CONFIG_ANLMS_FILTER 0
+#define CONFIG_ANULL_FILTER 0
+#define CONFIG_APAD_FILTER 0
+#define CONFIG_APERMS_FILTER 0
+#define CONFIG_APHASER_FILTER 0
+#define CONFIG_APULSATOR_FILTER 0
+#define CONFIG_AREALTIME_FILTER 0
+#define CONFIG_ARESAMPLE_FILTER 0
+#define CONFIG_AREVERSE_FILTER 0
+#define CONFIG_ARNNDN_FILTER 0
+#define CONFIG_ASELECT_FILTER 0
+#define CONFIG_ASENDCMD_FILTER 0
+#define CONFIG_ASETNSAMPLES_FILTER 0
+#define CONFIG_ASETPTS_FILTER 0
+#define CONFIG_ASETRATE_FILTER 0
+#define CONFIG_ASETTB_FILTER 0
+#define CONFIG_ASHOWINFO_FILTER 0
+#define CONFIG_ASIDEDATA_FILTER 0
+#define CONFIG_ASOFTCLIP_FILTER 0
+#define CONFIG_ASPLIT_FILTER 0
+#define CONFIG_ASR_FILTER 0
+#define CONFIG_ASTATS_FILTER 0
+#define CONFIG_ASTREAMSELECT_FILTER 0
+#define CONFIG_ATEMPO_FILTER 0
+#define CONFIG_ATRIM_FILTER 0
+#define CONFIG_AXCORRELATE_FILTER 0
+#define CONFIG_AZMQ_FILTER 0
+#define CONFIG_BANDPASS_FILTER 0
+#define CONFIG_BANDREJECT_FILTER 0
+#define CONFIG_BASS_FILTER 0
+#define CONFIG_BIQUAD_FILTER 0
+#define CONFIG_BS2B_FILTER 0
+#define CONFIG_CHROMABER_VULKAN_FILTER 0
+#define CONFIG_CHANNELMAP_FILTER 0
+#define CONFIG_CHANNELSPLIT_FILTER 0
+#define CONFIG_CHORUS_FILTER 0
+#define CONFIG_COMPAND_FILTER 0
+#define CONFIG_COMPENSATIONDELAY_FILTER 0
+#define CONFIG_CROSSFEED_FILTER 0
+#define CONFIG_CRYSTALIZER_FILTER 0
+#define CONFIG_DCSHIFT_FILTER 0
+#define CONFIG_DEESSER_FILTER 0
+#define CONFIG_DRMETER_FILTER 0
+#define CONFIG_DYNAUDNORM_FILTER 0
+#define CONFIG_EARWAX_FILTER 0
+#define CONFIG_EBUR128_FILTER 0
+#define CONFIG_EQUALIZER_FILTER 0
+#define CONFIG_EXTRASTEREO_FILTER 0
+#define CONFIG_FIREQUALIZER_FILTER 0
+#define CONFIG_FLANGER_FILTER 0
+#define CONFIG_HAAS_FILTER 0
+#define CONFIG_HDCD_FILTER 0
+#define CONFIG_HEADPHONE_FILTER 0
+#define CONFIG_HIGHPASS_FILTER 0
+#define CONFIG_HIGHSHELF_FILTER 0
+#define CONFIG_JOIN_FILTER 0
+#define CONFIG_LADSPA_FILTER 0
+#define CONFIG_LOUDNORM_FILTER 0
+#define CONFIG_LOWPASS_FILTER 0
+#define CONFIG_LOWSHELF_FILTER 0
+#define CONFIG_LV2_FILTER 0
+#define CONFIG_MCOMPAND_FILTER 0
+#define CONFIG_PAN_FILTER 0
+#define CONFIG_REPLAYGAIN_FILTER 0
+#define CONFIG_RESAMPLE_FILTER 0
+#define CONFIG_RUBBERBAND_FILTER 0
+#define CONFIG_SIDECHAINCOMPRESS_FILTER 0
+#define CONFIG_SIDECHAINGATE_FILTER 0
+#define CONFIG_SILENCEDETECT_FILTER 0
+#define CONFIG_SILENCEREMOVE_FILTER 0
+#define CONFIG_SOFALIZER_FILTER 0
+#define CONFIG_STEREOTOOLS_FILTER 0
+#define CONFIG_STEREOWIDEN_FILTER 0
+#define CONFIG_SUPEREQUALIZER_FILTER 0
+#define CONFIG_SURROUND_FILTER 0
+#define CONFIG_TREBLE_FILTER 0
+#define CONFIG_TREMOLO_FILTER 0
+#define CONFIG_VIBRATO_FILTER 0
+#define CONFIG_VOLUME_FILTER 0
+#define CONFIG_VOLUMEDETECT_FILTER 0
+#define CONFIG_AEVALSRC_FILTER 0
+#define CONFIG_AFIRSRC_FILTER 0
+#define CONFIG_ANOISESRC_FILTER 0
+#define CONFIG_ANULLSRC_FILTER 0
+#define CONFIG_FLITE_FILTER 0
+#define CONFIG_HILBERT_FILTER 0
+#define CONFIG_SINC_FILTER 0
+#define CONFIG_SINE_FILTER 0
+#define CONFIG_ANULLSINK_FILTER 0
+#define CONFIG_ADDROI_FILTER 0
+#define CONFIG_ALPHAEXTRACT_FILTER 0
+#define CONFIG_ALPHAMERGE_FILTER 0
+#define CONFIG_AMPLIFY_FILTER 0
+#define CONFIG_ASS_FILTER 0
+#define CONFIG_ATADENOISE_FILTER 0
+#define CONFIG_AVGBLUR_FILTER 0
+#define CONFIG_AVGBLUR_OPENCL_FILTER 0
+#define CONFIG_AVGBLUR_VULKAN_FILTER 0
+#define CONFIG_BBOX_FILTER 0
+#define CONFIG_BENCH_FILTER 0
+#define CONFIG_BILATERAL_FILTER 0
+#define CONFIG_BITPLANENOISE_FILTER 0
+#define CONFIG_BLACKDETECT_FILTER 0
+#define CONFIG_BLACKFRAME_FILTER 0
+#define CONFIG_BLEND_FILTER 0
+#define CONFIG_BM3D_FILTER 0
+#define CONFIG_BOXBLUR_FILTER 0
+#define CONFIG_BOXBLUR_OPENCL_FILTER 0
+#define CONFIG_BWDIF_FILTER 0
+#define CONFIG_CAS_FILTER 0
+#define CONFIG_CHROMAHOLD_FILTER 0
+#define CONFIG_CHROMAKEY_FILTER 0
+#define CONFIG_CHROMASHIFT_FILTER 0
+#define CONFIG_CIESCOPE_FILTER 0
+#define CONFIG_CODECVIEW_FILTER 0
+#define CONFIG_COLORBALANCE_FILTER 0
+#define CONFIG_COLORCHANNELMIXER_FILTER 0
+#define CONFIG_COLORKEY_FILTER 0
+#define CONFIG_COLORKEY_OPENCL_FILTER 0
+#define CONFIG_COLORHOLD_FILTER 0
+#define CONFIG_COLORLEVELS_FILTER 0
+#define CONFIG_COLORMATRIX_FILTER 0
+#define CONFIG_COLORSPACE_FILTER 0
+#define CONFIG_CONVOLUTION_FILTER 0
+#define CONFIG_CONVOLUTION_OPENCL_FILTER 0
+#define CONFIG_CONVOLVE_FILTER 0
+#define CONFIG_COPY_FILTER 0
+#define CONFIG_COREIMAGE_FILTER 0
+#define CONFIG_COVER_RECT_FILTER 0
+#define CONFIG_CROP_FILTER 0
+#define CONFIG_CROPDETECT_FILTER 0
+#define CONFIG_CUE_FILTER 0
+#define CONFIG_CURVES_FILTER 0
+#define CONFIG_DATASCOPE_FILTER 0
+#define CONFIG_DCTDNOIZ_FILTER 0
+#define CONFIG_DEBAND_FILTER 0
+#define CONFIG_DEBLOCK_FILTER 0
+#define CONFIG_DECIMATE_FILTER 0
+#define CONFIG_DECONVOLVE_FILTER 0
+#define CONFIG_DEDOT_FILTER 0
+#define CONFIG_DEFLATE_FILTER 0
+#define CONFIG_DEFLICKER_FILTER 0
+#define CONFIG_DEINTERLACE_QSV_FILTER 0
+#define CONFIG_DEINTERLACE_VAAPI_FILTER 0
+#define CONFIG_DEJUDDER_FILTER 0
+#define CONFIG_DELOGO_FILTER 0
+#define CONFIG_DENOISE_VAAPI_FILTER 0
+#define CONFIG_DERAIN_FILTER 0
+#define CONFIG_DESHAKE_FILTER 0
+#define CONFIG_DESHAKE_OPENCL_FILTER 0
+#define CONFIG_DESPILL_FILTER 0
+#define CONFIG_DETELECINE_FILTER 0
+#define CONFIG_DILATION_FILTER 0
+#define CONFIG_DILATION_OPENCL_FILTER 0
+#define CONFIG_DISPLACE_FILTER 0
+#define CONFIG_DNN_PROCESSING_FILTER 0
+#define CONFIG_DOUBLEWEAVE_FILTER 0
+#define CONFIG_DRAWBOX_FILTER 0
+#define CONFIG_DRAWGRAPH_FILTER 0
+#define CONFIG_DRAWGRID_FILTER 0
+#define CONFIG_DRAWTEXT_FILTER 0
+#define CONFIG_EDGEDETECT_FILTER 0
+#define CONFIG_ELBG_FILTER 0
+#define CONFIG_ENTROPY_FILTER 0
+#define CONFIG_EQ_FILTER 0
+#define CONFIG_EROSION_FILTER 0
+#define CONFIG_EROSION_OPENCL_FILTER 0
+#define CONFIG_EXTRACTPLANES_FILTER 0
+#define CONFIG_FADE_FILTER 0
+#define CONFIG_FFTDNOIZ_FILTER 0
+#define CONFIG_FFTFILT_FILTER 0
+#define CONFIG_FIELD_FILTER 0
+#define CONFIG_FIELDHINT_FILTER 0
+#define CONFIG_FIELDMATCH_FILTER 0
+#define CONFIG_FIELDORDER_FILTER 0
+#define CONFIG_FILLBORDERS_FILTER 0
+#define CONFIG_FIND_RECT_FILTER 0
+#define CONFIG_FLOODFILL_FILTER 0
+#define CONFIG_FORMAT_FILTER 0
+#define CONFIG_FPS_FILTER 0
+#define CONFIG_FRAMEPACK_FILTER 0
+#define CONFIG_FRAMERATE_FILTER 0
+#define CONFIG_FRAMESTEP_FILTER 0
+#define CONFIG_FREEZEDETECT_FILTER 0
+#define CONFIG_FREEZEFRAMES_FILTER 0
+#define CONFIG_FREI0R_FILTER 0
+#define CONFIG_FSPP_FILTER 0
+#define CONFIG_GBLUR_FILTER 0
+#define CONFIG_GEQ_FILTER 0
+#define CONFIG_GRADFUN_FILTER 0
+#define CONFIG_GRAPHMONITOR_FILTER 0
+#define CONFIG_GREYEDGE_FILTER 0
+#define CONFIG_HALDCLUT_FILTER 0
+#define CONFIG_HFLIP_FILTER 0
+#define CONFIG_HISTEQ_FILTER 0
+#define CONFIG_HISTOGRAM_FILTER 0
+#define CONFIG_HQDN3D_FILTER 0
+#define CONFIG_HQX_FILTER 0
+#define CONFIG_HSTACK_FILTER 0
+#define CONFIG_HUE_FILTER 0
+#define CONFIG_HWDOWNLOAD_FILTER 0
+#define CONFIG_HWMAP_FILTER 0
+#define CONFIG_HWUPLOAD_FILTER 0
+#define CONFIG_HWUPLOAD_CUDA_FILTER 0
+#define CONFIG_HYSTERESIS_FILTER 0
+#define CONFIG_IDET_FILTER 0
+#define CONFIG_IL_FILTER 0
+#define CONFIG_INFLATE_FILTER 0
+#define CONFIG_INTERLACE_FILTER 0
+#define CONFIG_INTERLEAVE_FILTER 0
+#define CONFIG_KERNDEINT_FILTER 0
+#define CONFIG_LAGFUN_FILTER 0
+#define CONFIG_LENSCORRECTION_FILTER 0
+#define CONFIG_LENSFUN_FILTER 0
+#define CONFIG_LIBVMAF_FILTER 0
+#define CONFIG_LIMITER_FILTER 0
+#define CONFIG_LOOP_FILTER 0
+#define CONFIG_LUMAKEY_FILTER 0
+#define CONFIG_LUT_FILTER 0
+#define CONFIG_LUT1D_FILTER 0
+#define CONFIG_LUT2_FILTER 0
+#define CONFIG_LUT3D_FILTER 0
+#define CONFIG_LUTRGB_FILTER 0
+#define CONFIG_LUTYUV_FILTER 0
+#define CONFIG_MASKEDCLAMP_FILTER 0
+#define CONFIG_MASKEDMAX_FILTER 0
+#define CONFIG_MASKEDMERGE_FILTER 0
+#define CONFIG_MASKEDMIN_FILTER 0
+#define CONFIG_MASKEDTHRESHOLD_FILTER 0
+#define CONFIG_MASKFUN_FILTER 0
+#define CONFIG_MCDEINT_FILTER 0
+#define CONFIG_MEDIAN_FILTER 0
+#define CONFIG_MERGEPLANES_FILTER 0
+#define CONFIG_MESTIMATE_FILTER 0
+#define CONFIG_METADATA_FILTER 0
+#define CONFIG_MIDEQUALIZER_FILTER 0
+#define CONFIG_MINTERPOLATE_FILTER 0
+#define CONFIG_MIX_FILTER 0
+#define CONFIG_MPDECIMATE_FILTER 0
+#define CONFIG_NEGATE_FILTER 0
+#define CONFIG_NLMEANS_FILTER 0
+#define CONFIG_NLMEANS_OPENCL_FILTER 0
+#define CONFIG_NNEDI_FILTER 0
+#define CONFIG_NOFORMAT_FILTER 0
+#define CONFIG_NOISE_FILTER 0
+#define CONFIG_NORMALIZE_FILTER 0
+#define CONFIG_NULL_FILTER 0
+#define CONFIG_OCR_FILTER 0
+#define CONFIG_OCV_FILTER 0
+#define CONFIG_OSCILLOSCOPE_FILTER 0
+#define CONFIG_OVERLAY_FILTER 0
+#define CONFIG_OVERLAY_OPENCL_FILTER 0
+#define CONFIG_OVERLAY_QSV_FILTER 0
+#define CONFIG_OVERLAY_VULKAN_FILTER 0
+#define CONFIG_OVERLAY_CUDA_FILTER 0
+#define CONFIG_OWDENOISE_FILTER 0
+#define CONFIG_PAD_FILTER 0
+#define CONFIG_PAD_OPENCL_FILTER 0
+#define CONFIG_PALETTEGEN_FILTER 0
+#define CONFIG_PALETTEUSE_FILTER 0
+#define CONFIG_PERMS_FILTER 0
+#define CONFIG_PERSPECTIVE_FILTER 0
+#define CONFIG_PHASE_FILTER 0
+#define CONFIG_PHOTOSENSITIVITY_FILTER 0
+#define CONFIG_PIXDESCTEST_FILTER 0
+#define CONFIG_PIXSCOPE_FILTER 0
+#define CONFIG_PP_FILTER 0
+#define CONFIG_PP7_FILTER 0
+#define CONFIG_PREMULTIPLY_FILTER 0
+#define CONFIG_PREWITT_FILTER 0
+#define CONFIG_PREWITT_OPENCL_FILTER 0
+#define CONFIG_PROCAMP_VAAPI_FILTER 0
+#define CONFIG_PROGRAM_OPENCL_FILTER 0
+#define CONFIG_PSEUDOCOLOR_FILTER 0
+#define CONFIG_PSNR_FILTER 0
+#define CONFIG_PULLUP_FILTER 0
+#define CONFIG_QP_FILTER 0
+#define CONFIG_RANDOM_FILTER 0
+#define CONFIG_READEIA608_FILTER 0
+#define CONFIG_READVITC_FILTER 0
+#define CONFIG_REALTIME_FILTER 0
+#define CONFIG_REMAP_FILTER 0
+#define CONFIG_REMOVEGRAIN_FILTER 0
+#define CONFIG_REMOVELOGO_FILTER 0
+#define CONFIG_REPEATFIELDS_FILTER 0
+#define CONFIG_REVERSE_FILTER 0
+#define CONFIG_RGBASHIFT_FILTER 0
+#define CONFIG_ROBERTS_FILTER 0
+#define CONFIG_ROBERTS_OPENCL_FILTER 0
+#define CONFIG_ROTATE_FILTER 0
+#define CONFIG_SAB_FILTER 0
+#define CONFIG_SCALE_FILTER 0
+#define CONFIG_SCALE_CUDA_FILTER 0
+#define CONFIG_SCALE_NPP_FILTER 0
+#define CONFIG_SCALE_QSV_FILTER 0
+#define CONFIG_SCALE_VAAPI_FILTER 0
+#define CONFIG_SCALE_VULKAN_FILTER 0
+#define CONFIG_SCALE2REF_FILTER 0
+#define CONFIG_SCROLL_FILTER 0
+#define CONFIG_SELECT_FILTER 0
+#define CONFIG_SELECTIVECOLOR_FILTER 0
+#define CONFIG_SENDCMD_FILTER 0
+#define CONFIG_SEPARATEFIELDS_FILTER 0
+#define CONFIG_SETDAR_FILTER 0
+#define CONFIG_SETFIELD_FILTER 0
+#define CONFIG_SETPARAMS_FILTER 0
+#define CONFIG_SETPTS_FILTER 0
+#define CONFIG_SETRANGE_FILTER 0
+#define CONFIG_SETSAR_FILTER 0
+#define CONFIG_SETTB_FILTER 0
+#define CONFIG_SHARPNESS_VAAPI_FILTER 0
+#define CONFIG_SHOWINFO_FILTER 0
+#define CONFIG_SHOWPALETTE_FILTER 0
+#define CONFIG_SHUFFLEFRAMES_FILTER 0
+#define CONFIG_SHUFFLEPLANES_FILTER 0
+#define CONFIG_SIDEDATA_FILTER 0
+#define CONFIG_SIGNALSTATS_FILTER 0
+#define CONFIG_SIGNATURE_FILTER 0
+#define CONFIG_SMARTBLUR_FILTER 0
+#define CONFIG_SOBEL_FILTER 0
+#define CONFIG_SOBEL_OPENCL_FILTER 0
+#define CONFIG_SPLIT_FILTER 0
+#define CONFIG_SPP_FILTER 0
+#define CONFIG_SR_FILTER 0
+#define CONFIG_SSIM_FILTER 0
+#define CONFIG_STEREO3D_FILTER 0
+#define CONFIG_STREAMSELECT_FILTER 0
+#define CONFIG_SUBTITLES_FILTER 0
+#define CONFIG_SUPER2XSAI_FILTER 0
+#define CONFIG_SWAPRECT_FILTER 0
+#define CONFIG_SWAPUV_FILTER 0
+#define CONFIG_TBLEND_FILTER 0
+#define CONFIG_TELECINE_FILTER 0
+#define CONFIG_THISTOGRAM_FILTER 0
+#define CONFIG_THRESHOLD_FILTER 0
+#define CONFIG_THUMBNAIL_FILTER 0
+#define CONFIG_THUMBNAIL_CUDA_FILTER 0
+#define CONFIG_TILE_FILTER 0
+#define CONFIG_TINTERLACE_FILTER 0
+#define CONFIG_TLUT2_FILTER 0
+#define CONFIG_TMEDIAN_FILTER 0
+#define CONFIG_TMIX_FILTER 0
+#define CONFIG_TONEMAP_FILTER 0
+#define CONFIG_TONEMAP_OPENCL_FILTER 0
+#define CONFIG_TONEMAP_VAAPI_FILTER 0
+#define CONFIG_TPAD_FILTER 0
+#define CONFIG_TRANSPOSE_FILTER 0
+#define CONFIG_TRANSPOSE_NPP_FILTER 0
+#define CONFIG_TRANSPOSE_OPENCL_FILTER 0
+#define CONFIG_TRANSPOSE_VAAPI_FILTER 0
+#define CONFIG_TRIM_FILTER 0
+#define CONFIG_UNPREMULTIPLY_FILTER 0
+#define CONFIG_UNSHARP_FILTER 0
+#define CONFIG_UNSHARP_OPENCL_FILTER 0
+#define CONFIG_USPP_FILTER 0
+#define CONFIG_V360_FILTER 0
+#define CONFIG_VAGUEDENOISER_FILTER 0
+#define CONFIG_VECTORSCOPE_FILTER 0
+#define CONFIG_VFLIP_FILTER 0
+#define CONFIG_VFRDET_FILTER 0
+#define CONFIG_VIBRANCE_FILTER 0
+#define CONFIG_VIDSTABDETECT_FILTER 0
+#define CONFIG_VIDSTABTRANSFORM_FILTER 0
+#define CONFIG_VIGNETTE_FILTER 0
+#define CONFIG_VMAFMOTION_FILTER 0
+#define CONFIG_VPP_QSV_FILTER 0
+#define CONFIG_VSTACK_FILTER 0
+#define CONFIG_W3FDIF_FILTER 0
+#define CONFIG_WAVEFORM_FILTER 0
+#define CONFIG_WEAVE_FILTER 0
+#define CONFIG_XBR_FILTER 0
+#define CONFIG_XFADE_FILTER 0
+#define CONFIG_XFADE_OPENCL_FILTER 0
+#define CONFIG_XMEDIAN_FILTER 0
+#define CONFIG_XSTACK_FILTER 0
+#define CONFIG_YADIF_FILTER 0
+#define CONFIG_YADIF_CUDA_FILTER 0
+#define CONFIG_YAEPBLUR_FILTER 0
+#define CONFIG_ZMQ_FILTER 0
+#define CONFIG_ZOOMPAN_FILTER 0
+#define CONFIG_ZSCALE_FILTER 0
+#define CONFIG_ALLRGB_FILTER 0
+#define CONFIG_ALLYUV_FILTER 0
+#define CONFIG_CELLAUTO_FILTER 0
+#define CONFIG_COLOR_FILTER 0
+#define CONFIG_COREIMAGESRC_FILTER 0
+#define CONFIG_FREI0R_SRC_FILTER 0
+#define CONFIG_HALDCLUTSRC_FILTER 0
+#define CONFIG_LIFE_FILTER 0
+#define CONFIG_MANDELBROT_FILTER 0
+#define CONFIG_MPTESTSRC_FILTER 0
+#define CONFIG_NULLSRC_FILTER 0
+#define CONFIG_OPENCLSRC_FILTER 0
+#define CONFIG_PAL75BARS_FILTER 0
+#define CONFIG_PAL100BARS_FILTER 0
+#define CONFIG_RGBTESTSRC_FILTER 0
+#define CONFIG_SIERPINSKI_FILTER 0
+#define CONFIG_SMPTEBARS_FILTER 0
+#define CONFIG_SMPTEHDBARS_FILTER 0
+#define CONFIG_TESTSRC_FILTER 0
+#define CONFIG_TESTSRC2_FILTER 0
+#define CONFIG_YUVTESTSRC_FILTER 0
+#define CONFIG_NULLSINK_FILTER 0
+#define CONFIG_ABITSCOPE_FILTER 0
+#define CONFIG_ADRAWGRAPH_FILTER 0
+#define CONFIG_AGRAPHMONITOR_FILTER 0
+#define CONFIG_AHISTOGRAM_FILTER 0
+#define CONFIG_APHASEMETER_FILTER 0
+#define CONFIG_AVECTORSCOPE_FILTER 0
+#define CONFIG_CONCAT_FILTER 0
+#define CONFIG_SHOWCQT_FILTER 0
+#define CONFIG_SHOWFREQS_FILTER 0
+#define CONFIG_SHOWSPATIAL_FILTER 0
+#define CONFIG_SHOWSPECTRUM_FILTER 0
+#define CONFIG_SHOWSPECTRUMPIC_FILTER 0
+#define CONFIG_SHOWVOLUME_FILTER 0
+#define CONFIG_SHOWWAVES_FILTER 0
+#define CONFIG_SHOWWAVESPIC_FILTER 0
+#define CONFIG_SPECTRUMSYNTH_FILTER 0
+#define CONFIG_AMOVIE_FILTER 0
+#define CONFIG_MOVIE_FILTER 0
+#define CONFIG_AFIFO_FILTER 0
+#define CONFIG_FIFO_FILTER 0
+#define CONFIG_AA_DEMUXER 0
+#define CONFIG_AAC_DEMUXER 0
+#define CONFIG_AC3_DEMUXER 0
+#define CONFIG_ACM_DEMUXER 0
+#define CONFIG_ACT_DEMUXER 0
+#define CONFIG_ADF_DEMUXER 0
+#define CONFIG_ADP_DEMUXER 0
+#define CONFIG_ADS_DEMUXER 0
+#define CONFIG_ADX_DEMUXER 0
+#define CONFIG_AEA_DEMUXER 0
+#define CONFIG_AFC_DEMUXER 0
+#define CONFIG_AIFF_DEMUXER 0
+#define CONFIG_AIX_DEMUXER 0
+#define CONFIG_ALP_DEMUXER 0
+#define CONFIG_AMR_DEMUXER 0
+#define CONFIG_AMRNB_DEMUXER 0
+#define CONFIG_AMRWB_DEMUXER 0
+#define CONFIG_ANM_DEMUXER 0
+#define CONFIG_APC_DEMUXER 0
+#define CONFIG_APE_DEMUXER 0
+#define CONFIG_APM_DEMUXER 0
+#define CONFIG_APNG_DEMUXER 0
+#define CONFIG_APTX_DEMUXER 0
+#define CONFIG_APTX_HD_DEMUXER 0
+#define CONFIG_AQTITLE_DEMUXER 0
+#define CONFIG_ARGO_ASF_DEMUXER 0
+#define CONFIG_ASF_DEMUXER 0
+#define CONFIG_ASF_O_DEMUXER 0
+#define CONFIG_ASS_DEMUXER 0
+#define CONFIG_AST_DEMUXER 0
+#define CONFIG_AU_DEMUXER 0
+#define CONFIG_AV1_DEMUXER 0
+#define CONFIG_AVI_DEMUXER 0
+#define CONFIG_AVISYNTH_DEMUXER 0
+#define CONFIG_AVR_DEMUXER 0
+#define CONFIG_AVS_DEMUXER 0
+#define CONFIG_AVS2_DEMUXER 0
+#define CONFIG_BETHSOFTVID_DEMUXER 0
+#define CONFIG_BFI_DEMUXER 0
+#define CONFIG_BINTEXT_DEMUXER 0
+#define CONFIG_BINK_DEMUXER 0
+#define CONFIG_BIT_DEMUXER 0
+#define CONFIG_BMV_DEMUXER 0
+#define CONFIG_BFSTM_DEMUXER 0
+#define CONFIG_BRSTM_DEMUXER 0
+#define CONFIG_BOA_DEMUXER 0
+#define CONFIG_C93_DEMUXER 0
+#define CONFIG_CAF_DEMUXER 0
+#define CONFIG_CAVSVIDEO_DEMUXER 0
+#define CONFIG_CDG_DEMUXER 0
+#define CONFIG_CDXL_DEMUXER 0
+#define CONFIG_CINE_DEMUXER 0
+#define CONFIG_CODEC2_DEMUXER 0
+#define CONFIG_CODEC2RAW_DEMUXER 0
+#define CONFIG_CONCAT_DEMUXER 0
+#define CONFIG_DASH_DEMUXER 0
+#define CONFIG_DATA_DEMUXER 0
+#define CONFIG_DAUD_DEMUXER 0
+#define CONFIG_DCSTR_DEMUXER 0
+#define CONFIG_DERF_DEMUXER 0
+#define CONFIG_DFA_DEMUXER 0
+#define CONFIG_DHAV_DEMUXER 0
+#define CONFIG_DIRAC_DEMUXER 0
+#define CONFIG_DNXHD_DEMUXER 0
+#define CONFIG_DSF_DEMUXER 0
+#define CONFIG_DSICIN_DEMUXER 0
+#define CONFIG_DSS_DEMUXER 0
+#define CONFIG_DTS_DEMUXER 0
+#define CONFIG_DTSHD_DEMUXER 0
+#define CONFIG_DV_DEMUXER 0
+#define CONFIG_DVBSUB_DEMUXER 0
+#define CONFIG_DVBTXT_DEMUXER 0
+#define CONFIG_DXA_DEMUXER 0
+#define CONFIG_EA_DEMUXER 0
+#define CONFIG_EA_CDATA_DEMUXER 0
+#define CONFIG_EAC3_DEMUXER 0
+#define CONFIG_EPAF_DEMUXER 0
+#define CONFIG_FFMETADATA_DEMUXER 0
+#define CONFIG_FILMSTRIP_DEMUXER 0
+#define CONFIG_FITS_DEMUXER 0
+#define CONFIG_FLAC_DEMUXER 1
+#define CONFIG_FLIC_DEMUXER 0
+#define CONFIG_FLV_DEMUXER 0
+#define CONFIG_LIVE_FLV_DEMUXER 0
+#define CONFIG_FOURXM_DEMUXER 0
+#define CONFIG_FRM_DEMUXER 0
+#define CONFIG_FSB_DEMUXER 0
+#define CONFIG_FWSE_DEMUXER 0
+#define CONFIG_G722_DEMUXER 0
+#define CONFIG_G723_1_DEMUXER 0
+#define CONFIG_G726_DEMUXER 0
+#define CONFIG_G726LE_DEMUXER 0
+#define CONFIG_G729_DEMUXER 0
+#define CONFIG_GDV_DEMUXER 0
+#define CONFIG_GENH_DEMUXER 0
+#define CONFIG_GIF_DEMUXER 0
+#define CONFIG_GSM_DEMUXER 0
+#define CONFIG_GXF_DEMUXER 0
+#define CONFIG_H261_DEMUXER 0
+#define CONFIG_H263_DEMUXER 0
+#define CONFIG_H264_DEMUXER 0
+#define CONFIG_HCA_DEMUXER 0
+#define CONFIG_HCOM_DEMUXER 0
+#define CONFIG_HEVC_DEMUXER 0
+#define CONFIG_HLS_DEMUXER 0
+#define CONFIG_HNM_DEMUXER 0
+#define CONFIG_ICO_DEMUXER 0
+#define CONFIG_IDCIN_DEMUXER 0
+#define CONFIG_IDF_DEMUXER 0
+#define CONFIG_IFF_DEMUXER 0
+#define CONFIG_IFV_DEMUXER 0
+#define CONFIG_ILBC_DEMUXER 0
+#define CONFIG_IMAGE2_DEMUXER 0
+#define CONFIG_IMAGE2PIPE_DEMUXER 0
+#define CONFIG_IMAGE2_ALIAS_PIX_DEMUXER 0
+#define CONFIG_IMAGE2_BRENDER_PIX_DEMUXER 0
+#define CONFIG_INGENIENT_DEMUXER 0
+#define CONFIG_IPMOVIE_DEMUXER 0
+#define CONFIG_IRCAM_DEMUXER 0
+#define CONFIG_ISS_DEMUXER 0
+#define CONFIG_IV8_DEMUXER 0
+#define CONFIG_IVF_DEMUXER 0
+#define CONFIG_IVR_DEMUXER 0
+#define CONFIG_JACOSUB_DEMUXER 0
+#define CONFIG_JV_DEMUXER 0
+#define CONFIG_KUX_DEMUXER 0
+#define CONFIG_KVAG_DEMUXER 0
+#define CONFIG_LMLM4_DEMUXER 0
+#define CONFIG_LOAS_DEMUXER 0
+#define CONFIG_LRC_DEMUXER 0
+#define CONFIG_LVF_DEMUXER 0
+#define CONFIG_LXF_DEMUXER 0
+#define CONFIG_M4V_DEMUXER 0
+#define CONFIG_MATROSKA_DEMUXER 1
+#define CONFIG_MGSTS_DEMUXER 0
+#define CONFIG_MICRODVD_DEMUXER 0
+#define CONFIG_MJPEG_DEMUXER 0
+#define CONFIG_MJPEG_2000_DEMUXER 0
+#define CONFIG_MLP_DEMUXER 0
+#define CONFIG_MLV_DEMUXER 0
+#define CONFIG_MM_DEMUXER 0
+#define CONFIG_MMF_DEMUXER 0
+#define CONFIG_MOV_DEMUXER 1
+#define CONFIG_MP3_DEMUXER 1
+#define CONFIG_MPC_DEMUXER 0
+#define CONFIG_MPC8_DEMUXER 0
+#define CONFIG_MPEGPS_DEMUXER 0
+#define CONFIG_MPEGTS_DEMUXER 0
+#define CONFIG_MPEGTSRAW_DEMUXER 0
+#define CONFIG_MPEGVIDEO_DEMUXER 0
+#define CONFIG_MPJPEG_DEMUXER 0
+#define CONFIG_MPL2_DEMUXER 0
+#define CONFIG_MPSUB_DEMUXER 0
+#define CONFIG_MSF_DEMUXER 0
+#define CONFIG_MSNWC_TCP_DEMUXER 0
+#define CONFIG_MTAF_DEMUXER 0
+#define CONFIG_MTV_DEMUXER 0
+#define CONFIG_MUSX_DEMUXER 0
+#define CONFIG_MV_DEMUXER 0
+#define CONFIG_MVI_DEMUXER 0
+#define CONFIG_MXF_DEMUXER 0
+#define CONFIG_MXG_DEMUXER 0
+#define CONFIG_NC_DEMUXER 0
+#define CONFIG_NISTSPHERE_DEMUXER 0
+#define CONFIG_NSP_DEMUXER 0
+#define CONFIG_NSV_DEMUXER 0
+#define CONFIG_NUT_DEMUXER 0
+#define CONFIG_NUV_DEMUXER 0
+#define CONFIG_OGG_DEMUXER 1
+#define CONFIG_OMA_DEMUXER 0
+#define CONFIG_PAF_DEMUXER 0
+#define CONFIG_PCM_ALAW_DEMUXER 0
+#define CONFIG_PCM_MULAW_DEMUXER 0
+#define CONFIG_PCM_VIDC_DEMUXER 0
+#define CONFIG_PCM_F64BE_DEMUXER 0
+#define CONFIG_PCM_F64LE_DEMUXER 0
+#define CONFIG_PCM_F32BE_DEMUXER 0
+#define CONFIG_PCM_F32LE_DEMUXER 0
+#define CONFIG_PCM_S32BE_DEMUXER 0
+#define CONFIG_PCM_S32LE_DEMUXER 0
+#define CONFIG_PCM_S24BE_DEMUXER 0
+#define CONFIG_PCM_S24LE_DEMUXER 0
+#define CONFIG_PCM_S16BE_DEMUXER 0
+#define CONFIG_PCM_S16LE_DEMUXER 0
+#define CONFIG_PCM_S8_DEMUXER 0
+#define CONFIG_PCM_U32BE_DEMUXER 0
+#define CONFIG_PCM_U32LE_DEMUXER 0
+#define CONFIG_PCM_U24BE_DEMUXER 0
+#define CONFIG_PCM_U24LE_DEMUXER 0
+#define CONFIG_PCM_U16BE_DEMUXER 0
+#define CONFIG_PCM_U16LE_DEMUXER 0
+#define CONFIG_PCM_U8_DEMUXER 0
+#define CONFIG_PJS_DEMUXER 0
+#define CONFIG_PMP_DEMUXER 0
+#define CONFIG_PVA_DEMUXER 0
+#define CONFIG_PVF_DEMUXER 0
+#define CONFIG_QCP_DEMUXER 0
+#define CONFIG_R3D_DEMUXER 0
+#define CONFIG_RAWVIDEO_DEMUXER 0
+#define CONFIG_REALTEXT_DEMUXER 0
+#define CONFIG_REDSPARK_DEMUXER 0
+#define CONFIG_RL2_DEMUXER 0
+#define CONFIG_RM_DEMUXER 0
+#define CONFIG_ROQ_DEMUXER 0
+#define CONFIG_RPL_DEMUXER 0
+#define CONFIG_RSD_DEMUXER 0
+#define CONFIG_RSO_DEMUXER 0
+#define CONFIG_RTP_DEMUXER 0
+#define CONFIG_RTSP_DEMUXER 0
+#define CONFIG_S337M_DEMUXER 0
+#define CONFIG_SAMI_DEMUXER 0
+#define CONFIG_SAP_DEMUXER 0
+#define CONFIG_SBC_DEMUXER 0
+#define CONFIG_SBG_DEMUXER 0
+#define CONFIG_SCC_DEMUXER 0
+#define CONFIG_SDP_DEMUXER 0
+#define CONFIG_SDR2_DEMUXER 0
+#define CONFIG_SDS_DEMUXER 0
+#define CONFIG_SDX_DEMUXER 0
+#define CONFIG_SEGAFILM_DEMUXER 0
+#define CONFIG_SER_DEMUXER 0
+#define CONFIG_SHORTEN_DEMUXER 0
+#define CONFIG_SIFF_DEMUXER 0
+#define CONFIG_SLN_DEMUXER 0
+#define CONFIG_SMACKER_DEMUXER 0
+#define CONFIG_SMJPEG_DEMUXER 0
+#define CONFIG_SMUSH_DEMUXER 0
+#define CONFIG_SOL_DEMUXER 0
+#define CONFIG_SOX_DEMUXER 0
+#define CONFIG_SPDIF_DEMUXER 0
+#define CONFIG_SRT_DEMUXER 0
+#define CONFIG_STR_DEMUXER 0
+#define CONFIG_STL_DEMUXER 0
+#define CONFIG_SUBVIEWER1_DEMUXER 0
+#define CONFIG_SUBVIEWER_DEMUXER 0
+#define CONFIG_SUP_DEMUXER 0
+#define CONFIG_SVAG_DEMUXER 0
+#define CONFIG_SWF_DEMUXER 0
+#define CONFIG_TAK_DEMUXER 0
+#define CONFIG_TEDCAPTIONS_DEMUXER 0
+#define CONFIG_THP_DEMUXER 0
+#define CONFIG_THREEDOSTR_DEMUXER 0
+#define CONFIG_TIERTEXSEQ_DEMUXER 0
+#define CONFIG_TMV_DEMUXER 0
+#define CONFIG_TRUEHD_DEMUXER 0
+#define CONFIG_TTA_DEMUXER 0
+#define CONFIG_TXD_DEMUXER 0
+#define CONFIG_TTY_DEMUXER 0
+#define CONFIG_TY_DEMUXER 0
+#define CONFIG_V210_DEMUXER 0
+#define CONFIG_V210X_DEMUXER 0
+#define CONFIG_VAG_DEMUXER 0
+#define CONFIG_VC1_DEMUXER 0
+#define CONFIG_VC1T_DEMUXER 0
+#define CONFIG_VIVIDAS_DEMUXER 0
+#define CONFIG_VIVO_DEMUXER 0
+#define CONFIG_VMD_DEMUXER 0
+#define CONFIG_VOBSUB_DEMUXER 0
+#define CONFIG_VOC_DEMUXER 0
+#define CONFIG_VPK_DEMUXER 0
+#define CONFIG_VPLAYER_DEMUXER 0
+#define CONFIG_VQF_DEMUXER 0
+#define CONFIG_W64_DEMUXER 0
+#define CONFIG_WAV_DEMUXER 1
+#define CONFIG_WC3_DEMUXER 0
+#define CONFIG_WEBM_DASH_MANIFEST_DEMUXER 0
+#define CONFIG_WEBVTT_DEMUXER 0
+#define CONFIG_WSAUD_DEMUXER 0
+#define CONFIG_WSD_DEMUXER 0
+#define CONFIG_WSVQA_DEMUXER 0
+#define CONFIG_WTV_DEMUXER 0
+#define CONFIG_WVE_DEMUXER 0
+#define CONFIG_WV_DEMUXER 0
+#define CONFIG_XA_DEMUXER 0
+#define CONFIG_XBIN_DEMUXER 0
+#define CONFIG_XMV_DEMUXER 0
+#define CONFIG_XVAG_DEMUXER 0
+#define CONFIG_XWMA_DEMUXER 0
+#define CONFIG_YOP_DEMUXER 0
+#define CONFIG_YUV4MPEGPIPE_DEMUXER 0
+#define CONFIG_IMAGE_BMP_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_DDS_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_DPX_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_EXR_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_GIF_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_J2K_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_JPEG_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_JPEGLS_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_PAM_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_PBM_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_PCX_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_PGMYUV_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_PGM_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_PICTOR_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_PNG_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_PPM_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_PSD_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_QDRAW_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_SGI_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_SVG_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_SUNRAST_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_TIFF_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_WEBP_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_XPM_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_XWD_PIPE_DEMUXER 0
+#define CONFIG_LIBGME_DEMUXER 0
+#define CONFIG_LIBMODPLUG_DEMUXER 0
+#define CONFIG_LIBOPENMPT_DEMUXER 0
+#define CONFIG_VAPOURSYNTH_DEMUXER 0
+#define CONFIG_A64_MUXER 0
+#define CONFIG_AC3_MUXER 0
+#define CONFIG_ADTS_MUXER 0
+#define CONFIG_ADX_MUXER 0
+#define CONFIG_AIFF_MUXER 0
+#define CONFIG_AMR_MUXER 0
+#define CONFIG_APNG_MUXER 0
+#define CONFIG_APTX_MUXER 0
+#define CONFIG_APTX_HD_MUXER 0
+#define CONFIG_ASF_MUXER 0
+#define CONFIG_ASS_MUXER 0
+#define CONFIG_AST_MUXER 0
+#define CONFIG_ASF_STREAM_MUXER 0
+#define CONFIG_AU_MUXER 0
+#define CONFIG_AVI_MUXER 0
+#define CONFIG_AVM2_MUXER 0
+#define CONFIG_AVS2_MUXER 0
+#define CONFIG_BIT_MUXER 0
+#define CONFIG_CAF_MUXER 0
+#define CONFIG_CAVSVIDEO_MUXER 0
+#define CONFIG_CODEC2_MUXER 0
+#define CONFIG_CODEC2RAW_MUXER 0
+#define CONFIG_CRC_MUXER 0
+#define CONFIG_DASH_MUXER 0
+#define CONFIG_DATA_MUXER 0
+#define CONFIG_DAUD_MUXER 0
+#define CONFIG_DIRAC_MUXER 0
+#define CONFIG_DNXHD_MUXER 0
+#define CONFIG_DTS_MUXER 0
+#define CONFIG_DV_MUXER 0
+#define CONFIG_EAC3_MUXER 0
+#define CONFIG_F4V_MUXER 0
+#define CONFIG_FFMETADATA_MUXER 0
+#define CONFIG_FIFO_MUXER 0
+#define CONFIG_FIFO_TEST_MUXER 0
+#define CONFIG_FILMSTRIP_MUXER 0
+#define CONFIG_FITS_MUXER 0
+#define CONFIG_FLAC_MUXER 0
+#define CONFIG_FLV_MUXER 0
+#define CONFIG_FRAMECRC_MUXER 0
+#define CONFIG_FRAMEHASH_MUXER 0
+#define CONFIG_FRAMEMD5_MUXER 0
+#define CONFIG_G722_MUXER 0
+#define CONFIG_G723_1_MUXER 0
+#define CONFIG_G726_MUXER 0
+#define CONFIG_G726LE_MUXER 0
+#define CONFIG_GIF_MUXER 0
+#define CONFIG_GSM_MUXER 0
+#define CONFIG_GXF_MUXER 0
+#define CONFIG_H261_MUXER 0
+#define CONFIG_H263_MUXER 0
+#define CONFIG_H264_MUXER 0
+#define CONFIG_HASH_MUXER 0
+#define CONFIG_HDS_MUXER 0
+#define CONFIG_HEVC_MUXER 0
+#define CONFIG_HLS_MUXER 0
+#define CONFIG_ICO_MUXER 0
+#define CONFIG_ILBC_MUXER 0
+#define CONFIG_IMAGE2_MUXER 0
+#define CONFIG_IMAGE2PIPE_MUXER 0
+#define CONFIG_IPOD_MUXER 0
+#define CONFIG_IRCAM_MUXER 0
+#define CONFIG_ISMV_MUXER 0
+#define CONFIG_IVF_MUXER 0
+#define CONFIG_JACOSUB_MUXER 0
+#define CONFIG_LATM_MUXER 0
+#define CONFIG_LRC_MUXER 0
+#define CONFIG_M4V_MUXER 0
+#define CONFIG_MD5_MUXER 0
+#define CONFIG_MATROSKA_MUXER 0
+#define CONFIG_MATROSKA_AUDIO_MUXER 0
+#define CONFIG_MICRODVD_MUXER 0
+#define CONFIG_MJPEG_MUXER 0
+#define CONFIG_MLP_MUXER 0
+#define CONFIG_MMF_MUXER 0
+#define CONFIG_MOV_MUXER 0
+#define CONFIG_MP2_MUXER 0
+#define CONFIG_MP3_MUXER 0
+#define CONFIG_MP4_MUXER 0
+#define CONFIG_MPEG1SYSTEM_MUXER 0
+#define CONFIG_MPEG1VCD_MUXER 0
+#define CONFIG_MPEG1VIDEO_MUXER 0
+#define CONFIG_MPEG2DVD_MUXER 0
+#define CONFIG_MPEG2SVCD_MUXER 0
+#define CONFIG_MPEG2VIDEO_MUXER 0
+#define CONFIG_MPEG2VOB_MUXER 0
+#define CONFIG_MPEGTS_MUXER 0
+#define CONFIG_MPJPEG_MUXER 0
+#define CONFIG_MXF_MUXER 0
+#define CONFIG_MXF_D10_MUXER 0
+#define CONFIG_MXF_OPATOM_MUXER 0
+#define CONFIG_NULL_MUXER 0
+#define CONFIG_NUT_MUXER 0
+#define CONFIG_OGA_MUXER 0
+#define CONFIG_OGG_MUXER 0
+#define CONFIG_OGV_MUXER 0
+#define CONFIG_OMA_MUXER 0
+#define CONFIG_OPUS_MUXER 0
+#define CONFIG_PCM_ALAW_MUXER 0
+#define CONFIG_PCM_MULAW_MUXER 0
+#define CONFIG_PCM_VIDC_MUXER 0
+#define CONFIG_PCM_F64BE_MUXER 0
+#define CONFIG_PCM_F64LE_MUXER 0
+#define CONFIG_PCM_F32BE_MUXER 0
+#define CONFIG_PCM_F32LE_MUXER 0
+#define CONFIG_PCM_S32BE_MUXER 0
+#define CONFIG_PCM_S32LE_MUXER 0
+#define CONFIG_PCM_S24BE_MUXER 0
+#define CONFIG_PCM_S24LE_MUXER 0
+#define CONFIG_PCM_S16BE_MUXER 0
+#define CONFIG_PCM_S16LE_MUXER 0
+#define CONFIG_PCM_S8_MUXER 0
+#define CONFIG_PCM_U32BE_MUXER 0
+#define CONFIG_PCM_U32LE_MUXER 0
+#define CONFIG_PCM_U24BE_MUXER 0
+#define CONFIG_PCM_U24LE_MUXER 0
+#define CONFIG_PCM_U16BE_MUXER 0
+#define CONFIG_PCM_U16LE_MUXER 0
+#define CONFIG_PCM_U8_MUXER 0
+#define CONFIG_PSP_MUXER 0
+#define CONFIG_RAWVIDEO_MUXER 0
+#define CONFIG_RM_MUXER 0
+#define CONFIG_ROQ_MUXER 0
+#define CONFIG_RSO_MUXER 0
+#define CONFIG_RTP_MUXER 0
+#define CONFIG_RTP_MPEGTS_MUXER 0
+#define CONFIG_RTSP_MUXER 0
+#define CONFIG_SAP_MUXER 0
+#define CONFIG_SBC_MUXER 0
+#define CONFIG_SCC_MUXER 0
+#define CONFIG_SEGAFILM_MUXER 0
+#define CONFIG_SEGMENT_MUXER 0
+#define CONFIG_STREAM_SEGMENT_MUXER 0
+#define CONFIG_SINGLEJPEG_MUXER 0
+#define CONFIG_SMJPEG_MUXER 0
+#define CONFIG_SMOOTHSTREAMING_MUXER 0
+#define CONFIG_SOX_MUXER 0
+#define CONFIG_SPX_MUXER 0
+#define CONFIG_SPDIF_MUXER 0
+#define CONFIG_SRT_MUXER 0
+#define CONFIG_STREAMHASH_MUXER 0
+#define CONFIG_SUP_MUXER 0
+#define CONFIG_SWF_MUXER 0
+#define CONFIG_TEE_MUXER 0
+#define CONFIG_TG2_MUXER 0
+#define CONFIG_TGP_MUXER 0
+#define CONFIG_MKVTIMESTAMP_V2_MUXER 0
+#define CONFIG_TRUEHD_MUXER 0
+#define CONFIG_TTA_MUXER 0
+#define CONFIG_UNCODEDFRAMECRC_MUXER 0
+#define CONFIG_VC1_MUXER 0
+#define CONFIG_VC1T_MUXER 0
+#define CONFIG_VOC_MUXER 0
+#define CONFIG_W64_MUXER 0
+#define CONFIG_WAV_MUXER 0
+#define CONFIG_WEBM_MUXER 0
+#define CONFIG_WEBM_DASH_MANIFEST_MUXER 0
+#define CONFIG_WEBM_CHUNK_MUXER 0
+#define CONFIG_WEBP_MUXER 0
+#define CONFIG_WEBVTT_MUXER 0
+#define CONFIG_WTV_MUXER 0
+#define CONFIG_WV_MUXER 0
+#define CONFIG_YUV4MPEGPIPE_MUXER 0
+#define CONFIG_CHROMAPRINT_MUXER 0
+#define CONFIG_ASYNC_PROTOCOL 0
+#define CONFIG_BLURAY_PROTOCOL 0
+#define CONFIG_CACHE_PROTOCOL 0
+#define CONFIG_CONCAT_PROTOCOL 0
+#define CONFIG_CRYPTO_PROTOCOL 0
+#define CONFIG_DATA_PROTOCOL 0
+#define CONFIG_FFRTMPCRYPT_PROTOCOL 0
+#define CONFIG_FFRTMPHTTP_PROTOCOL 0
+#define CONFIG_FILE_PROTOCOL 0
+#define CONFIG_FTP_PROTOCOL 0
+#define CONFIG_GOPHER_PROTOCOL 0
+#define CONFIG_HLS_PROTOCOL 0
+#define CONFIG_HTTP_PROTOCOL 0
+#define CONFIG_HTTPPROXY_PROTOCOL 0
+#define CONFIG_HTTPS_PROTOCOL 0
+#define CONFIG_ICECAST_PROTOCOL 0
+#define CONFIG_MMSH_PROTOCOL 0
+#define CONFIG_MMST_PROTOCOL 0
+#define CONFIG_MD5_PROTOCOL 0
+#define CONFIG_PIPE_PROTOCOL 0
+#define CONFIG_PROMPEG_PROTOCOL 0
+#define CONFIG_RTMP_PROTOCOL 0
+#define CONFIG_RTMPE_PROTOCOL 0
+#define CONFIG_RTMPS_PROTOCOL 0
+#define CONFIG_RTMPT_PROTOCOL 0
+#define CONFIG_RTMPTE_PROTOCOL 0
+#define CONFIG_RTMPTS_PROTOCOL 0
+#define CONFIG_RTP_PROTOCOL 0
+#define CONFIG_SCTP_PROTOCOL 0
+#define CONFIG_SRTP_PROTOCOL 0
+#define CONFIG_SUBFILE_PROTOCOL 0
+#define CONFIG_TEE_PROTOCOL 0
+#define CONFIG_TCP_PROTOCOL 0
+#define CONFIG_TLS_PROTOCOL 0
+#define CONFIG_UDP_PROTOCOL 0
+#define CONFIG_UDPLITE_PROTOCOL 0
+#define CONFIG_UNIX_PROTOCOL 0
+#define CONFIG_LIBAMQP_PROTOCOL 0
+#define CONFIG_LIBRTMP_PROTOCOL 0
+#define CONFIG_LIBRTMPE_PROTOCOL 0
+#define CONFIG_LIBRTMPS_PROTOCOL 0
+#define CONFIG_LIBRTMPT_PROTOCOL 0
+#define CONFIG_LIBRTMPTE_PROTOCOL 0
+#define CONFIG_LIBSRT_PROTOCOL 0
+#define CONFIG_LIBSSH_PROTOCOL 0
+#define CONFIG_LIBSMBCLIENT_PROTOCOL 0
+#define CONFIG_LIBZMQ_PROTOCOL 0
+#endif /* FFMPEG_CONFIG_H */
diff --git a/fuchsia/config/default/arm64/libavcodec/bsf_list.c b/fuchsia/config/default/arm64/libavcodec/bsf_list.c
new file mode 100644
index 0000000..d31ece9
--- /dev/null
+++ b/fuchsia/config/default/arm64/libavcodec/bsf_list.c
@@ -0,0 +1,3 @@
+static const AVBitStreamFilter * const bitstream_filters[] = {
+ &ff_null_bsf,
+ NULL };
diff --git a/fuchsia/config/default/arm64/libavcodec/codec_list.c b/fuchsia/config/default/arm64/libavcodec/codec_list.c
new file mode 100644
index 0000000..6c53695
--- /dev/null
+++ b/fuchsia/config/default/arm64/libavcodec/codec_list.c
@@ -0,0 +1,20 @@
+static const AVCodec * const codec_list[] = {
+ &ff_theora_decoder,
+ &ff_vp3_decoder,
+ &ff_vp8_decoder,
+ &ff_aptx_decoder,
+ &ff_flac_decoder,
+ &ff_mp3_decoder,
+ &ff_sbc_decoder,
+ &ff_vorbis_decoder,
+ &ff_pcm_alaw_decoder,
+ &ff_pcm_f32le_decoder,
+ &ff_pcm_mulaw_decoder,
+ &ff_pcm_s16be_decoder,
+ &ff_pcm_s16le_decoder,
+ &ff_pcm_s24be_decoder,
+ &ff_pcm_s24le_decoder,
+ &ff_pcm_s32le_decoder,
+ &ff_pcm_u8_decoder,
+ &ff_libopus_decoder,
+ NULL };
diff --git a/fuchsia/config/default/arm64/libavcodec/parser_list.c b/fuchsia/config/default/arm64/libavcodec/parser_list.c
new file mode 100644
index 0000000..4c59b89
--- /dev/null
+++ b/fuchsia/config/default/arm64/libavcodec/parser_list.c
@@ -0,0 +1,8 @@
+static const AVCodecParser * const parser_list[] = {
+ &ff_flac_parser,
+ &ff_mpegaudio_parser,
+ &ff_opus_parser,
+ &ff_vorbis_parser,
+ &ff_vp3_parser,
+ &ff_vp8_parser,
+ NULL };
diff --git a/fuchsia/config/default/arm64/libavformat/demuxer_list.c b/fuchsia/config/default/arm64/libavformat/demuxer_list.c
new file mode 100644
index 0000000..1908ba1
--- /dev/null
+++ b/fuchsia/config/default/arm64/libavformat/demuxer_list.c
@@ -0,0 +1,8 @@
+static const AVInputFormat * const demuxer_list[] = {
+ &ff_flac_demuxer,
+ &ff_matroska_demuxer,
+ &ff_mov_demuxer,
+ &ff_mp3_demuxer,
+ &ff_ogg_demuxer,
+ &ff_wav_demuxer,
+ NULL };
diff --git a/fuchsia/config/default/arm64/libavformat/muxer_list.c b/fuchsia/config/default/arm64/libavformat/muxer_list.c
new file mode 100644
index 0000000..f36d949
--- /dev/null
+++ b/fuchsia/config/default/arm64/libavformat/muxer_list.c
@@ -0,0 +1,2 @@
+static const AVOutputFormat * const muxer_list[] = {
+ NULL };
diff --git a/fuchsia/config/default/arm64/libavformat/protocol_list.c b/fuchsia/config/default/arm64/libavformat/protocol_list.c
new file mode 100644
index 0000000..247e1e4
--- /dev/null
+++ b/fuchsia/config/default/arm64/libavformat/protocol_list.c
@@ -0,0 +1,2 @@
+static const URLProtocol * const url_protocols[] = {
+ NULL };
diff --git a/fuchsia/config/default/arm64/libavutil/avconfig.h b/fuchsia/config/default/arm64/libavutil/avconfig.h
new file mode 100644
index 0000000..c289fbb
--- /dev/null
+++ b/fuchsia/config/default/arm64/libavutil/avconfig.h
@@ -0,0 +1,6 @@
+/* Generated by ffmpeg configure */
+#ifndef AVUTIL_AVCONFIG_H
+#define AVUTIL_AVCONFIG_H
+#define AV_HAVE_BIGENDIAN 0
+#define AV_HAVE_FAST_UNALIGNED 1
+#endif /* AVUTIL_AVCONFIG_H */
diff --git a/fuchsia/config/default/arm64/libavutil/ffversion.h b/fuchsia/config/default/arm64/libavutil/ffversion.h
new file mode 100644
index 0000000..fc76199
--- /dev/null
+++ b/fuchsia/config/default/arm64/libavutil/ffversion.h
@@ -0,0 +1,5 @@
+/* Automatically generated by version.sh, do not manually edit! */
+#ifndef AVUTIL_FFVERSION_H
+#define AVUTIL_FFVERSION_H
+#define FFMPEG_VERSION "N-97662-gaaac2c26d9"
+#endif /* AVUTIL_FFVERSION_H */
diff --git a/fuchsia/config/default/x64/config.asm b/fuchsia/config/default/x64/config.asm
new file mode 100644
index 0000000..46239d0
--- /dev/null
+++ b/fuchsia/config/default/x64/config.asm
@@ -0,0 +1,2572 @@
+; Automatically generated by configure - do not modify!
+%define ARCH_AARCH64 0
+%define ARCH_ALPHA 0
+%define ARCH_ARM 0
+%define ARCH_AVR32 0
+%define ARCH_AVR32_AP 0
+%define ARCH_AVR32_UC 0
+%define ARCH_BFIN 0
+%define ARCH_IA64 0
+%define ARCH_M68K 0
+%define ARCH_MIPS 0
+%define ARCH_MIPS64 0
+%define ARCH_PARISC 0
+%define ARCH_PPC 0
+%define ARCH_PPC64 0
+%define ARCH_S390 0
+%define ARCH_SH4 0
+%define ARCH_SPARC 0
+%define ARCH_SPARC64 0
+%define ARCH_TILEGX 0
+%define ARCH_TILEPRO 0
+%define ARCH_TOMI 0
+%define ARCH_X86 1
+%define ARCH_X86_32 0
+%define ARCH_X86_64 1
+%define HAVE_ARMV5TE 0
+%define HAVE_ARMV6 0
+%define HAVE_ARMV6T2 0
+%define HAVE_ARMV8 0
+%define HAVE_NEON 0
+%define HAVE_VFP 0
+%define HAVE_VFPV3 0
+%define HAVE_SETEND 0
+%define HAVE_ALTIVEC 0
+%define HAVE_DCBZL 0
+%define HAVE_LDBRX 0
+%define HAVE_POWER8 0
+%define HAVE_PPC4XX 0
+%define HAVE_VSX 0
+%define HAVE_AESNI 1
+%define HAVE_AMD3DNOW 1
+%define HAVE_AMD3DNOWEXT 1
+%define HAVE_AVX 1
+%define HAVE_AVX2 1
+%define HAVE_AVX512 1
+%define HAVE_FMA3 1
+%define HAVE_FMA4 1
+%define HAVE_MMX 1
+%define HAVE_MMXEXT 1
+%define HAVE_SSE 1
+%define HAVE_SSE2 1
+%define HAVE_SSE3 1
+%define HAVE_SSE4 1
+%define HAVE_SSE42 1
+%define HAVE_SSSE3 1
+%define HAVE_XOP 1
+%define HAVE_CPUNOP 1
+%define HAVE_I686 1
+%define HAVE_MIPSFPU 0
+%define HAVE_MIPS32R2 0
+%define HAVE_MIPS32R5 0
+%define HAVE_MIPS64R2 0
+%define HAVE_MIPS32R6 0
+%define HAVE_MIPS64R6 0
+%define HAVE_MIPSDSP 0
+%define HAVE_MIPSDSPR2 0
+%define HAVE_MSA 0
+%define HAVE_MSA2 0
+%define HAVE_LOONGSON2 0
+%define HAVE_LOONGSON3 0
+%define HAVE_MMI 0
+%define HAVE_ARMV5TE_EXTERNAL 0
+%define HAVE_ARMV6_EXTERNAL 0
+%define HAVE_ARMV6T2_EXTERNAL 0
+%define HAVE_ARMV8_EXTERNAL 0
+%define HAVE_NEON_EXTERNAL 0
+%define HAVE_VFP_EXTERNAL 0
+%define HAVE_VFPV3_EXTERNAL 0
+%define HAVE_SETEND_EXTERNAL 0
+%define HAVE_ALTIVEC_EXTERNAL 0
+%define HAVE_DCBZL_EXTERNAL 0
+%define HAVE_LDBRX_EXTERNAL 0
+%define HAVE_POWER8_EXTERNAL 0
+%define HAVE_PPC4XX_EXTERNAL 0
+%define HAVE_VSX_EXTERNAL 0
+%define HAVE_AESNI_EXTERNAL 1
+%define HAVE_AMD3DNOW_EXTERNAL 1
+%define HAVE_AMD3DNOWEXT_EXTERNAL 1
+%define HAVE_AVX_EXTERNAL 1
+%define HAVE_AVX2_EXTERNAL 1
+%define HAVE_AVX512_EXTERNAL 0
+%define HAVE_FMA3_EXTERNAL 1
+%define HAVE_FMA4_EXTERNAL 1
+%define HAVE_MMX_EXTERNAL 1
+%define HAVE_MMXEXT_EXTERNAL 1
+%define HAVE_SSE_EXTERNAL 1
+%define HAVE_SSE2_EXTERNAL 1
+%define HAVE_SSE3_EXTERNAL 1
+%define HAVE_SSE4_EXTERNAL 1
+%define HAVE_SSE42_EXTERNAL 1
+%define HAVE_SSSE3_EXTERNAL 1
+%define HAVE_XOP_EXTERNAL 1
+%define HAVE_CPUNOP_EXTERNAL 0
+%define HAVE_I686_EXTERNAL 0
+%define HAVE_MIPSFPU_EXTERNAL 0
+%define HAVE_MIPS32R2_EXTERNAL 0
+%define HAVE_MIPS32R5_EXTERNAL 0
+%define HAVE_MIPS64R2_EXTERNAL 0
+%define HAVE_MIPS32R6_EXTERNAL 0
+%define HAVE_MIPS64R6_EXTERNAL 0
+%define HAVE_MIPSDSP_EXTERNAL 0
+%define HAVE_MIPSDSPR2_EXTERNAL 0
+%define HAVE_MSA_EXTERNAL 0
+%define HAVE_MSA2_EXTERNAL 0
+%define HAVE_LOONGSON2_EXTERNAL 0
+%define HAVE_LOONGSON3_EXTERNAL 0
+%define HAVE_MMI_EXTERNAL 0
+%define HAVE_ARMV5TE_INLINE 0
+%define HAVE_ARMV6_INLINE 0
+%define HAVE_ARMV6T2_INLINE 0
+%define HAVE_ARMV8_INLINE 0
+%define HAVE_NEON_INLINE 0
+%define HAVE_VFP_INLINE 0
+%define HAVE_VFPV3_INLINE 0
+%define HAVE_SETEND_INLINE 0
+%define HAVE_ALTIVEC_INLINE 0
+%define HAVE_DCBZL_INLINE 0
+%define HAVE_LDBRX_INLINE 0
+%define HAVE_POWER8_INLINE 0
+%define HAVE_PPC4XX_INLINE 0
+%define HAVE_VSX_INLINE 0
+%define HAVE_AESNI_INLINE 1
+%define HAVE_AMD3DNOW_INLINE 1
+%define HAVE_AMD3DNOWEXT_INLINE 1
+%define HAVE_AVX_INLINE 1
+%define HAVE_AVX2_INLINE 1
+%define HAVE_AVX512_INLINE 1
+%define HAVE_FMA3_INLINE 1
+%define HAVE_FMA4_INLINE 1
+%define HAVE_MMX_INLINE 1
+%define HAVE_MMXEXT_INLINE 1
+%define HAVE_SSE_INLINE 1
+%define HAVE_SSE2_INLINE 1
+%define HAVE_SSE3_INLINE 1
+%define HAVE_SSE4_INLINE 1
+%define HAVE_SSE42_INLINE 1
+%define HAVE_SSSE3_INLINE 1
+%define HAVE_XOP_INLINE 1
+%define HAVE_CPUNOP_INLINE 0
+%define HAVE_I686_INLINE 0
+%define HAVE_MIPSFPU_INLINE 0
+%define HAVE_MIPS32R2_INLINE 0
+%define HAVE_MIPS32R5_INLINE 0
+%define HAVE_MIPS64R2_INLINE 0
+%define HAVE_MIPS32R6_INLINE 0
+%define HAVE_MIPS64R6_INLINE 0
+%define HAVE_MIPSDSP_INLINE 0
+%define HAVE_MIPSDSPR2_INLINE 0
+%define HAVE_MSA_INLINE 0
+%define HAVE_MSA2_INLINE 0
+%define HAVE_LOONGSON2_INLINE 0
+%define HAVE_LOONGSON3_INLINE 0
+%define HAVE_MMI_INLINE 0
+%define HAVE_ALIGNED_STACK 1
+%define HAVE_FAST_64BIT 1
+%define HAVE_FAST_CLZ 1
+%define HAVE_FAST_CMOV 1
+%define HAVE_LOCAL_ALIGNED 1
+%define HAVE_SIMD_ALIGN_16 1
+%define HAVE_SIMD_ALIGN_32 1
+%define HAVE_SIMD_ALIGN_64 1
+%define HAVE_ATOMIC_CAS_PTR 0
+%define HAVE_MACHINE_RW_BARRIER 0
+%define HAVE_MEMORYBARRIER 0
+%define HAVE_MM_EMPTY 1
+%define HAVE_RDTSC 0
+%define HAVE_SEM_TIMEDWAIT 1
+%define HAVE_SYNC_VAL_COMPARE_AND_SWAP 1
+%define HAVE_CABS 0
+%define HAVE_CEXP 0
+%define HAVE_INLINE_ASM 1
+%define HAVE_SYMVER 0
+%define HAVE_X86ASM 1
+%define HAVE_BIGENDIAN 0
+%define HAVE_FAST_UNALIGNED 1
+%define HAVE_ARPA_INET_H 0
+%define HAVE_ASM_TYPES_H 1
+%define HAVE_CDIO_PARANOIA_H 0
+%define HAVE_CDIO_PARANOIA_PARANOIA_H 0
+%define HAVE_CUDA_H 0
+%define HAVE_DISPATCH_DISPATCH_H 0
+%define HAVE_DEV_BKTR_IOCTL_BT848_H 0
+%define HAVE_DEV_BKTR_IOCTL_METEOR_H 0
+%define HAVE_DEV_IC_BT8XX_H 0
+%define HAVE_DEV_VIDEO_BKTR_IOCTL_BT848_H 0
+%define HAVE_DEV_VIDEO_METEOR_IOCTL_METEOR_H 0
+%define HAVE_DIRECT_H 0
+%define HAVE_DIRENT_H 1
+%define HAVE_DXGIDEBUG_H 0
+%define HAVE_DXVA_H 0
+%define HAVE_ES2_GL_H 0
+%define HAVE_GSM_H 0
+%define HAVE_IO_H 0
+%define HAVE_LINUX_PERF_EVENT_H 1
+%define HAVE_MACHINE_IOCTL_BT848_H 0
+%define HAVE_MACHINE_IOCTL_METEOR_H 0
+%define HAVE_MALLOC_H 1
+%define HAVE_OPENCV2_CORE_CORE_C_H 0
+%define HAVE_OPENGL_GL3_H 0
+%define HAVE_POLL_H 1
+%define HAVE_SYS_PARAM_H 1
+%define HAVE_SYS_RESOURCE_H 1
+%define HAVE_SYS_SELECT_H 1
+%define HAVE_SYS_SOUNDCARD_H 1
+%define HAVE_SYS_TIME_H 1
+%define HAVE_SYS_UN_H 1
+%define HAVE_SYS_VIDEOIO_H 0
+%define HAVE_TERMIOS_H 1
+%define HAVE_UDPLITE_H 0
+%define HAVE_UNISTD_H 1
+%define HAVE_VALGRIND_VALGRIND_H 0
+%define HAVE_WINDOWS_H 0
+%define HAVE_WINSOCK2_H 0
+%define HAVE_INTRINSICS_NEON 0
+%define HAVE_ATANF 1
+%define HAVE_ATAN2F 1
+%define HAVE_CBRT 1
+%define HAVE_CBRTF 1
+%define HAVE_COPYSIGN 1
+%define HAVE_COSF 1
+%define HAVE_ERF 1
+%define HAVE_EXP2 1
+%define HAVE_EXP2F 1
+%define HAVE_EXPF 1
+%define HAVE_HYPOT 1
+%define HAVE_ISFINITE 1
+%define HAVE_ISINF 1
+%define HAVE_ISNAN 1
+%define HAVE_LDEXPF 1
+%define HAVE_LLRINT 1
+%define HAVE_LLRINTF 1
+%define HAVE_LOG2 1
+%define HAVE_LOG2F 1
+%define HAVE_LOG10F 1
+%define HAVE_LRINT 1
+%define HAVE_LRINTF 1
+%define HAVE_POWF 1
+%define HAVE_RINT 1
+%define HAVE_ROUND 1
+%define HAVE_ROUNDF 1
+%define HAVE_SINF 1
+%define HAVE_TRUNC 1
+%define HAVE_TRUNCF 1
+%define HAVE_DOS_PATHS 0
+%define HAVE_LIBC_MSVCRT 0
+%define HAVE_MMAL_PARAMETER_VIDEO_MAX_NUM_CALLBACKS 0
+%define HAVE_SECTION_DATA_REL_RO 1
+%define HAVE_THREADS 1
+%define HAVE_UWP 0
+%define HAVE_WINRT 0
+%define HAVE_ACCESS 1
+%define HAVE_ALIGNED_MALLOC 0
+%define HAVE_ARC4RANDOM 0
+%define HAVE_CLOCK_GETTIME 1
+%define HAVE_CLOSESOCKET 0
+%define HAVE_COMMANDLINETOARGVW 0
+%define HAVE_FCNTL 1
+%define HAVE_GETADDRINFO 0
+%define HAVE_GETHRTIME 0
+%define HAVE_GETOPT 1
+%define HAVE_GETMODULEHANDLE 0
+%define HAVE_GETPROCESSAFFINITYMASK 0
+%define HAVE_GETPROCESSMEMORYINFO 0
+%define HAVE_GETPROCESSTIMES 0
+%define HAVE_GETRUSAGE 1
+%define HAVE_GETSTDHANDLE 0
+%define HAVE_GETSYSTEMTIMEASFILETIME 0
+%define HAVE_GETTIMEOFDAY 1
+%define HAVE_GLOB 1
+%define HAVE_GLXGETPROCADDRESS 0
+%define HAVE_GMTIME_R 1
+%define HAVE_INET_ATON 0
+%define HAVE_ISATTY 1
+%define HAVE_KBHIT 0
+%define HAVE_LOCALTIME_R 1
+%define HAVE_LSTAT 1
+%define HAVE_LZO1X_999_COMPRESS 0
+%define HAVE_MACH_ABSOLUTE_TIME 0
+%define HAVE_MAPVIEWOFFILE 0
+%define HAVE_MEMALIGN 1
+%define HAVE_MKSTEMP 1
+%define HAVE_MMAP 1
+%define HAVE_MPROTECT 1
+%define HAVE_NANOSLEEP 1
+%define HAVE_PEEKNAMEDPIPE 0
+%define HAVE_POSIX_MEMALIGN 1
+%define HAVE_PTHREAD_CANCEL 1
+%define HAVE_SCHED_GETAFFINITY 1
+%define HAVE_SECITEMIMPORT 0
+%define HAVE_SETCONSOLETEXTATTRIBUTE 0
+%define HAVE_SETCONSOLECTRLHANDLER 0
+%define HAVE_SETDLLDIRECTORY 0
+%define HAVE_SETMODE 0
+%define HAVE_SETRLIMIT 1
+%define HAVE_SLEEP 0
+%define HAVE_STRERROR_R 1
+%define HAVE_SYSCONF 1
+%define HAVE_SYSCTL 1
+%define HAVE_USLEEP 1
+%define HAVE_UTGETOSTYPEFROMSTRING 0
+%define HAVE_VIRTUALALLOC 0
+%define HAVE_WGLGETPROCADDRESS 0
+%define HAVE_BCRYPT 0
+%define HAVE_VAAPI_DRM 0
+%define HAVE_VAAPI_X11 0
+%define HAVE_VDPAU_X11 0
+%define HAVE_PTHREADS 1
+%define HAVE_OS2THREADS 0
+%define HAVE_W32THREADS 0
+%define HAVE_AS_ARCH_DIRECTIVE 0
+%define HAVE_AS_DN_DIRECTIVE 0
+%define HAVE_AS_FPU_DIRECTIVE 0
+%define HAVE_AS_FUNC 0
+%define HAVE_AS_OBJECT_ARCH 0
+%define HAVE_ASM_MOD_Q 0
+%define HAVE_BLOCKS_EXTENSION 0
+%define HAVE_EBP_AVAILABLE 1
+%define HAVE_EBX_AVAILABLE 1
+%define HAVE_GNU_AS 0
+%define HAVE_GNU_WINDRES 0
+%define HAVE_IBM_ASM 0
+%define HAVE_INLINE_ASM_DIRECT_SYMBOL_REFS 0
+%define HAVE_INLINE_ASM_LABELS 1
+%define HAVE_INLINE_ASM_NONLOCAL_LABELS 1
+%define HAVE_PRAGMA_DEPRECATED 1
+%define HAVE_RSYNC_CONTIMEOUT 1
+%define HAVE_SYMVER_ASM_LABEL 1
+%define HAVE_SYMVER_GNU_ASM 1
+%define HAVE_VFP_ARGS 0
+%define HAVE_XFORM_ASM 0
+%define HAVE_XMM_CLOBBERS 1
+%define HAVE_KCMVIDEOCODECTYPE_HEVC 0
+%define HAVE_KCVPIXELFORMATTYPE_420YPCBCR10BIPLANARVIDEORANGE 0
+%define HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_SMPTE_ST_2084_PQ 0
+%define HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_ITU_R_2100_HLG 0
+%define HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_LINEAR 0
+%define HAVE_SOCKLEN_T 0
+%define HAVE_STRUCT_ADDRINFO 0
+%define HAVE_STRUCT_GROUP_SOURCE_REQ 0
+%define HAVE_STRUCT_IP_MREQ_SOURCE 0
+%define HAVE_STRUCT_IPV6_MREQ 0
+%define HAVE_STRUCT_MSGHDR_MSG_FLAGS 0
+%define HAVE_STRUCT_POLLFD 0
+%define HAVE_STRUCT_RUSAGE_RU_MAXRSS 1
+%define HAVE_STRUCT_SCTP_EVENT_SUBSCRIBE 0
+%define HAVE_STRUCT_SOCKADDR_IN6 0
+%define HAVE_STRUCT_SOCKADDR_SA_LEN 0
+%define HAVE_STRUCT_SOCKADDR_STORAGE 0
+%define HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC 1
+%define HAVE_STRUCT_V4L2_FRMIVALENUM_DISCRETE 0
+%define HAVE_MAKEINFO 0
+%define HAVE_MAKEINFO_HTML 0
+%define HAVE_OPENCL_D3D11 0
+%define HAVE_OPENCL_DRM_ARM 0
+%define HAVE_OPENCL_DRM_BEIGNET 0
+%define HAVE_OPENCL_DXVA2 0
+%define HAVE_OPENCL_VAAPI_BEIGNET 0
+%define HAVE_OPENCL_VAAPI_INTEL_MEDIA 0
+%define HAVE_PERL 1
+%define HAVE_POD2MAN 1
+%define HAVE_TEXI2HTML 0
+%define CONFIG_DOC 0
+%define CONFIG_HTMLPAGES 0
+%define CONFIG_MANPAGES 0
+%define CONFIG_PODPAGES 0
+%define CONFIG_TXTPAGES 0
+%define CONFIG_AVIO_LIST_DIR_EXAMPLE 1
+%define CONFIG_AVIO_READING_EXAMPLE 1
+%define CONFIG_DECODE_AUDIO_EXAMPLE 1
+%define CONFIG_DECODE_VIDEO_EXAMPLE 1
+%define CONFIG_DEMUXING_DECODING_EXAMPLE 1
+%define CONFIG_ENCODE_AUDIO_EXAMPLE 1
+%define CONFIG_ENCODE_VIDEO_EXAMPLE 1
+%define CONFIG_EXTRACT_MVS_EXAMPLE 1
+%define CONFIG_FILTER_AUDIO_EXAMPLE 0
+%define CONFIG_FILTERING_AUDIO_EXAMPLE 0
+%define CONFIG_FILTERING_VIDEO_EXAMPLE 0
+%define CONFIG_HTTP_MULTICLIENT_EXAMPLE 1
+%define CONFIG_HW_DECODE_EXAMPLE 1
+%define CONFIG_METADATA_EXAMPLE 1
+%define CONFIG_MUXING_EXAMPLE 0
+%define CONFIG_QSVDEC_EXAMPLE 0
+%define CONFIG_REMUXING_EXAMPLE 1
+%define CONFIG_RESAMPLING_AUDIO_EXAMPLE 0
+%define CONFIG_SCALING_VIDEO_EXAMPLE 0
+%define CONFIG_TRANSCODE_AAC_EXAMPLE 0
+%define CONFIG_TRANSCODING_EXAMPLE 0
+%define CONFIG_VAAPI_ENCODE_EXAMPLE 0
+%define CONFIG_VAAPI_TRANSCODE_EXAMPLE 0
+%define CONFIG_AVISYNTH 0
+%define CONFIG_FREI0R 0
+%define CONFIG_LIBCDIO 0
+%define CONFIG_LIBDAVS2 0
+%define CONFIG_LIBRUBBERBAND 0
+%define CONFIG_LIBVIDSTAB 0
+%define CONFIG_LIBX264 0
+%define CONFIG_LIBX265 0
+%define CONFIG_LIBXAVS 0
+%define CONFIG_LIBXAVS2 0
+%define CONFIG_LIBXVID 0
+%define CONFIG_DECKLINK 0
+%define CONFIG_LIBFDK_AAC 0
+%define CONFIG_OPENSSL 0
+%define CONFIG_LIBTLS 0
+%define CONFIG_GMP 0
+%define CONFIG_LIBARIBB24 0
+%define CONFIG_LIBLENSFUN 0
+%define CONFIG_LIBOPENCORE_AMRNB 0
+%define CONFIG_LIBOPENCORE_AMRWB 0
+%define CONFIG_LIBVMAF 0
+%define CONFIG_LIBVO_AMRWBENC 0
+%define CONFIG_MBEDTLS 0
+%define CONFIG_RKMPP 0
+%define CONFIG_LIBSMBCLIENT 0
+%define CONFIG_CHROMAPRINT 0
+%define CONFIG_GCRYPT 0
+%define CONFIG_GNUTLS 0
+%define CONFIG_JNI 0
+%define CONFIG_LADSPA 0
+%define CONFIG_LIBAOM 0
+%define CONFIG_LIBASS 0
+%define CONFIG_LIBBLURAY 0
+%define CONFIG_LIBBS2B 0
+%define CONFIG_LIBCACA 0
+%define CONFIG_LIBCELT 0
+%define CONFIG_LIBCODEC2 0
+%define CONFIG_LIBDAV1D 0
+%define CONFIG_LIBDC1394 0
+%define CONFIG_LIBDRM 0
+%define CONFIG_LIBFLITE 0
+%define CONFIG_LIBFONTCONFIG 0
+%define CONFIG_LIBFREETYPE 0
+%define CONFIG_LIBFRIBIDI 0
+%define CONFIG_LIBGLSLANG 0
+%define CONFIG_LIBGME 0
+%define CONFIG_LIBGSM 0
+%define CONFIG_LIBIEC61883 0
+%define CONFIG_LIBILBC 0
+%define CONFIG_LIBJACK 0
+%define CONFIG_LIBKLVANC 0
+%define CONFIG_LIBKVAZAAR 0
+%define CONFIG_LIBMODPLUG 0
+%define CONFIG_LIBMP3LAME 0
+%define CONFIG_LIBMYSOFA 0
+%define CONFIG_LIBOPENCV 0
+%define CONFIG_LIBOPENH264 0
+%define CONFIG_LIBOPENJPEG 0
+%define CONFIG_LIBOPENMPT 0
+%define CONFIG_LIBOPUS 1
+%define CONFIG_LIBPULSE 0
+%define CONFIG_LIBRABBITMQ 0
+%define CONFIG_LIBRAV1E 0
+%define CONFIG_LIBRSVG 0
+%define CONFIG_LIBRTMP 0
+%define CONFIG_LIBSHINE 0
+%define CONFIG_LIBSMBCLIENT 0
+%define CONFIG_LIBSNAPPY 0
+%define CONFIG_LIBSOXR 0
+%define CONFIG_LIBSPEEX 0
+%define CONFIG_LIBSRT 0
+%define CONFIG_LIBSSH 0
+%define CONFIG_LIBTENSORFLOW 0
+%define CONFIG_LIBTESSERACT 0
+%define CONFIG_LIBTHEORA 0
+%define CONFIG_LIBTWOLAME 0
+%define CONFIG_LIBV4L2 0
+%define CONFIG_LIBVORBIS 0
+%define CONFIG_LIBVPX 0
+%define CONFIG_LIBWAVPACK 0
+%define CONFIG_LIBWEBP 0
+%define CONFIG_LIBXML2 0
+%define CONFIG_LIBZIMG 0
+%define CONFIG_LIBZMQ 0
+%define CONFIG_LIBZVBI 0
+%define CONFIG_LV2 0
+%define CONFIG_MEDIACODEC 0
+%define CONFIG_OPENAL 0
+%define CONFIG_OPENGL 0
+%define CONFIG_POCKETSPHINX 0
+%define CONFIG_VAPOURSYNTH 0
+%define CONFIG_ALSA 0
+%define CONFIG_APPKIT 0
+%define CONFIG_AVFOUNDATION 0
+%define CONFIG_BZLIB 0
+%define CONFIG_COREIMAGE 0
+%define CONFIG_ICONV 0
+%define CONFIG_LIBXCB 0
+%define CONFIG_LIBXCB_SHM 0
+%define CONFIG_LIBXCB_SHAPE 0
+%define CONFIG_LIBXCB_XFIXES 0
+%define CONFIG_LZMA 0
+%define CONFIG_SCHANNEL 0
+%define CONFIG_SDL2 0
+%define CONFIG_SECURETRANSPORT 0
+%define CONFIG_SNDIO 0
+%define CONFIG_XLIB 0
+%define CONFIG_ZLIB 0
+%define CONFIG_CUDA_NVCC 0
+%define CONFIG_CUDA_SDK 0
+%define CONFIG_LIBNPP 0
+%define CONFIG_LIBMFX 0
+%define CONFIG_MMAL 0
+%define CONFIG_OMX 0
+%define CONFIG_OPENCL 0
+%define CONFIG_VULKAN 0
+%define CONFIG_AMF 0
+%define CONFIG_AUDIOTOOLBOX 0
+%define CONFIG_CRYSTALHD 0
+%define CONFIG_CUDA 0
+%define CONFIG_CUDA_LLVM 0
+%define CONFIG_CUVID 0
+%define CONFIG_D3D11VA 0
+%define CONFIG_DXVA2 0
+%define CONFIG_FFNVCODEC 0
+%define CONFIG_NVDEC 0
+%define CONFIG_NVENC 0
+%define CONFIG_VAAPI 0
+%define CONFIG_VDPAU 0
+%define CONFIG_VIDEOTOOLBOX 0
+%define CONFIG_V4L2_M2M 0
+%define CONFIG_XVMC 0
+%define CONFIG_FTRAPV 0
+%define CONFIG_GRAY 0
+%define CONFIG_HARDCODED_TABLES 0
+%define CONFIG_OMX_RPI 0
+%define CONFIG_RUNTIME_CPUDETECT 1
+%define CONFIG_SAFE_BITSTREAM_READER 1
+%define CONFIG_SHARED 0
+%define CONFIG_SMALL 0
+%define CONFIG_STATIC 1
+%define CONFIG_SWSCALE_ALPHA 1
+%define CONFIG_GPL 0
+%define CONFIG_NONFREE 0
+%define CONFIG_VERSION3 0
+%define CONFIG_AVDEVICE 0
+%define CONFIG_AVFILTER 0
+%define CONFIG_SWSCALE 0
+%define CONFIG_POSTPROC 0
+%define CONFIG_AVFORMAT 1
+%define CONFIG_AVCODEC 1
+%define CONFIG_SWRESAMPLE 0
+%define CONFIG_AVRESAMPLE 0
+%define CONFIG_AVUTIL 1
+%define CONFIG_FFPLAY 0
+%define CONFIG_FFPROBE 0
+%define CONFIG_FFMPEG 0
+%define CONFIG_DCT 1
+%define CONFIG_DWT 0
+%define CONFIG_ERROR_RESILIENCE 0
+%define CONFIG_FAAN 0
+%define CONFIG_FAST_UNALIGNED 1
+%define CONFIG_FFT 1
+%define CONFIG_LSP 0
+%define CONFIG_LZO 0
+%define CONFIG_MDCT 1
+%define CONFIG_PIXELUTILS 0
+%define CONFIG_NETWORK 0
+%define CONFIG_RDFT 1
+%define CONFIG_AUTODETECT 0
+%define CONFIG_FONTCONFIG 0
+%define CONFIG_LARGE_TESTS 1
+%define CONFIG_LINUX_PERF 0
+%define CONFIG_MEMORY_POISONING 0
+%define CONFIG_NEON_CLOBBER_TEST 0
+%define CONFIG_OSSFUZZ 0
+%define CONFIG_PIC 1
+%define CONFIG_THUMB 0
+%define CONFIG_VALGRIND_BACKTRACE 0
+%define CONFIG_XMM_CLOBBER_TEST 0
+%define CONFIG_BSFS 1
+%define CONFIG_DECODERS 1
+%define CONFIG_ENCODERS 0
+%define CONFIG_HWACCELS 0
+%define CONFIG_PARSERS 1
+%define CONFIG_INDEVS 0
+%define CONFIG_OUTDEVS 0
+%define CONFIG_FILTERS 0
+%define CONFIG_DEMUXERS 1
+%define CONFIG_MUXERS 0
+%define CONFIG_PROTOCOLS 0
+%define CONFIG_AANDCTTABLES 0
+%define CONFIG_AC3DSP 0
+%define CONFIG_ADTS_HEADER 0
+%define CONFIG_AUDIO_FRAME_QUEUE 1
+%define CONFIG_AUDIODSP 0
+%define CONFIG_BLOCKDSP 0
+%define CONFIG_BSWAPDSP 0
+%define CONFIG_CABAC 0
+%define CONFIG_CBS 0
+%define CONFIG_CBS_AV1 0
+%define CONFIG_CBS_H264 0
+%define CONFIG_CBS_H265 0
+%define CONFIG_CBS_JPEG 0
+%define CONFIG_CBS_MPEG2 0
+%define CONFIG_CBS_VP9 0
+%define CONFIG_DIRAC_PARSE 1
+%define CONFIG_DNN 0
+%define CONFIG_DVPROFILE 0
+%define CONFIG_EXIF 0
+%define CONFIG_FAANDCT 0
+%define CONFIG_FAANIDCT 0
+%define CONFIG_FDCTDSP 0
+%define CONFIG_FLACDSP 1
+%define CONFIG_FMTCONVERT 0
+%define CONFIG_FRAME_THREAD_ENCODER 0
+%define CONFIG_G722DSP 0
+%define CONFIG_GOLOMB 1
+%define CONFIG_GPLV3 0
+%define CONFIG_H263DSP 0
+%define CONFIG_H264CHROMA 0
+%define CONFIG_H264DSP 0
+%define CONFIG_H264PARSE 0
+%define CONFIG_H264PRED 1
+%define CONFIG_H264QPEL 0
+%define CONFIG_HEVCPARSE 0
+%define CONFIG_HPELDSP 1
+%define CONFIG_HUFFMAN 0
+%define CONFIG_HUFFYUVDSP 0
+%define CONFIG_HUFFYUVENCDSP 0
+%define CONFIG_IDCTDSP 0
+%define CONFIG_IIRFILTER 0
+%define CONFIG_MDCT15 0
+%define CONFIG_INTRAX8 0
+%define CONFIG_ISO_MEDIA 1
+%define CONFIG_IVIDSP 0
+%define CONFIG_JPEGTABLES 0
+%define CONFIG_LGPLV3 0
+%define CONFIG_LIBX262 0
+%define CONFIG_LLAUDDSP 0
+%define CONFIG_LLVIDDSP 0
+%define CONFIG_LLVIDENCDSP 0
+%define CONFIG_LPC 0
+%define CONFIG_LZF 0
+%define CONFIG_ME_CMP 0
+%define CONFIG_MPEG_ER 0
+%define CONFIG_MPEGAUDIO 1
+%define CONFIG_MPEGAUDIODSP 1
+%define CONFIG_MPEGAUDIOHEADER 1
+%define CONFIG_MPEGVIDEO 0
+%define CONFIG_MPEGVIDEOENC 0
+%define CONFIG_MSS34DSP 0
+%define CONFIG_PIXBLOCKDSP 0
+%define CONFIG_QPELDSP 0
+%define CONFIG_QSV 0
+%define CONFIG_QSVDEC 0
+%define CONFIG_QSVENC 0
+%define CONFIG_QSVVPP 0
+%define CONFIG_RANGECODER 0
+%define CONFIG_RIFFDEC 1
+%define CONFIG_RIFFENC 0
+%define CONFIG_RTPDEC 0
+%define CONFIG_RTPENC_CHAIN 0
+%define CONFIG_RV34DSP 0
+%define CONFIG_SCENE_SAD 0
+%define CONFIG_SINEWIN 0
+%define CONFIG_SNAPPY 0
+%define CONFIG_SRTP 0
+%define CONFIG_STARTCODE 0
+%define CONFIG_TEXTUREDSP 0
+%define CONFIG_TEXTUREDSPENC 0
+%define CONFIG_TPELDSP 0
+%define CONFIG_VAAPI_1 0
+%define CONFIG_VAAPI_ENCODE 0
+%define CONFIG_VC1DSP 0
+%define CONFIG_VIDEODSP 1
+%define CONFIG_VP3DSP 1
+%define CONFIG_VP56DSP 0
+%define CONFIG_VP8DSP 1
+%define CONFIG_WMA_FREQS 0
+%define CONFIG_WMV2DSP 0
+%define CONFIG_AAC_ADTSTOASC_BSF 0
+%define CONFIG_AV1_FRAME_MERGE_BSF 0
+%define CONFIG_AV1_FRAME_SPLIT_BSF 0
+%define CONFIG_AV1_METADATA_BSF 0
+%define CONFIG_CHOMP_BSF 0
+%define CONFIG_DUMP_EXTRADATA_BSF 0
+%define CONFIG_DCA_CORE_BSF 0
+%define CONFIG_EAC3_CORE_BSF 0
+%define CONFIG_EXTRACT_EXTRADATA_BSF 0
+%define CONFIG_FILTER_UNITS_BSF 0
+%define CONFIG_H264_METADATA_BSF 0
+%define CONFIG_H264_MP4TOANNEXB_BSF 0
+%define CONFIG_H264_REDUNDANT_PPS_BSF 0
+%define CONFIG_HAPQA_EXTRACT_BSF 0
+%define CONFIG_HEVC_METADATA_BSF 0
+%define CONFIG_HEVC_MP4TOANNEXB_BSF 0
+%define CONFIG_IMX_DUMP_HEADER_BSF 0
+%define CONFIG_MJPEG2JPEG_BSF 0
+%define CONFIG_MJPEGA_DUMP_HEADER_BSF 0
+%define CONFIG_MP3_HEADER_DECOMPRESS_BSF 0
+%define CONFIG_MPEG2_METADATA_BSF 0
+%define CONFIG_MPEG4_UNPACK_BFRAMES_BSF 0
+%define CONFIG_MOV2TEXTSUB_BSF 0
+%define CONFIG_NOISE_BSF 0
+%define CONFIG_NULL_BSF 1
+%define CONFIG_PRORES_METADATA_BSF 0
+%define CONFIG_REMOVE_EXTRADATA_BSF 0
+%define CONFIG_TEXT2MOVSUB_BSF 0
+%define CONFIG_TRACE_HEADERS_BSF 0
+%define CONFIG_TRUEHD_CORE_BSF 0
+%define CONFIG_VP9_METADATA_BSF 0
+%define CONFIG_VP9_RAW_REORDER_BSF 0
+%define CONFIG_VP9_SUPERFRAME_BSF 0
+%define CONFIG_VP9_SUPERFRAME_SPLIT_BSF 1
+%define CONFIG_AASC_DECODER 0
+%define CONFIG_AIC_DECODER 0
+%define CONFIG_ALIAS_PIX_DECODER 0
+%define CONFIG_AGM_DECODER 0
+%define CONFIG_AMV_DECODER 0
+%define CONFIG_ANM_DECODER 0
+%define CONFIG_ANSI_DECODER 0
+%define CONFIG_APNG_DECODER 0
+%define CONFIG_ARBC_DECODER 0
+%define CONFIG_ASV1_DECODER 0
+%define CONFIG_ASV2_DECODER 0
+%define CONFIG_AURA_DECODER 0
+%define CONFIG_AURA2_DECODER 0
+%define CONFIG_AVRP_DECODER 0
+%define CONFIG_AVRN_DECODER 0
+%define CONFIG_AVS_DECODER 0
+%define CONFIG_AVUI_DECODER 0
+%define CONFIG_AYUV_DECODER 0
+%define CONFIG_BETHSOFTVID_DECODER 0
+%define CONFIG_BFI_DECODER 0
+%define CONFIG_BINK_DECODER 0
+%define CONFIG_BITPACKED_DECODER 0
+%define CONFIG_BMP_DECODER 0
+%define CONFIG_BMV_VIDEO_DECODER 0
+%define CONFIG_BRENDER_PIX_DECODER 0
+%define CONFIG_C93_DECODER 0
+%define CONFIG_CAVS_DECODER 0
+%define CONFIG_CDGRAPHICS_DECODER 0
+%define CONFIG_CDTOONS_DECODER 0
+%define CONFIG_CDXL_DECODER 0
+%define CONFIG_CFHD_DECODER 0
+%define CONFIG_CINEPAK_DECODER 0
+%define CONFIG_CLEARVIDEO_DECODER 0
+%define CONFIG_CLJR_DECODER 0
+%define CONFIG_CLLC_DECODER 0
+%define CONFIG_COMFORTNOISE_DECODER 0
+%define CONFIG_CPIA_DECODER 0
+%define CONFIG_CSCD_DECODER 0
+%define CONFIG_CYUV_DECODER 0
+%define CONFIG_DDS_DECODER 0
+%define CONFIG_DFA_DECODER 0
+%define CONFIG_DIRAC_DECODER 0
+%define CONFIG_DNXHD_DECODER 0
+%define CONFIG_DPX_DECODER 0
+%define CONFIG_DSICINVIDEO_DECODER 0
+%define CONFIG_DVAUDIO_DECODER 0
+%define CONFIG_DVVIDEO_DECODER 0
+%define CONFIG_DXA_DECODER 0
+%define CONFIG_DXTORY_DECODER 0
+%define CONFIG_DXV_DECODER 0
+%define CONFIG_EACMV_DECODER 0
+%define CONFIG_EAMAD_DECODER 0
+%define CONFIG_EATGQ_DECODER 0
+%define CONFIG_EATGV_DECODER 0
+%define CONFIG_EATQI_DECODER 0
+%define CONFIG_EIGHTBPS_DECODER 0
+%define CONFIG_EIGHTSVX_EXP_DECODER 0
+%define CONFIG_EIGHTSVX_FIB_DECODER 0
+%define CONFIG_ESCAPE124_DECODER 0
+%define CONFIG_ESCAPE130_DECODER 0
+%define CONFIG_EXR_DECODER 0
+%define CONFIG_FFV1_DECODER 0
+%define CONFIG_FFVHUFF_DECODER 0
+%define CONFIG_FIC_DECODER 0
+%define CONFIG_FITS_DECODER 0
+%define CONFIG_FLASHSV_DECODER 0
+%define CONFIG_FLASHSV2_DECODER 0
+%define CONFIG_FLIC_DECODER 0
+%define CONFIG_FLV_DECODER 0
+%define CONFIG_FMVC_DECODER 0
+%define CONFIG_FOURXM_DECODER 0
+%define CONFIG_FRAPS_DECODER 0
+%define CONFIG_FRWU_DECODER 0
+%define CONFIG_G2M_DECODER 0
+%define CONFIG_GDV_DECODER 0
+%define CONFIG_GIF_DECODER 0
+%define CONFIG_H261_DECODER 0
+%define CONFIG_H263_DECODER 0
+%define CONFIG_H263I_DECODER 0
+%define CONFIG_H263P_DECODER 0
+%define CONFIG_H263_V4L2M2M_DECODER 0
+%define CONFIG_H264_DECODER 0
+%define CONFIG_H264_CRYSTALHD_DECODER 0
+%define CONFIG_H264_V4L2M2M_DECODER 0
+%define CONFIG_H264_MEDIACODEC_DECODER 0
+%define CONFIG_H264_MMAL_DECODER 0
+%define CONFIG_H264_QSV_DECODER 0
+%define CONFIG_H264_RKMPP_DECODER 0
+%define CONFIG_HAP_DECODER 0
+%define CONFIG_HEVC_DECODER 0
+%define CONFIG_HEVC_QSV_DECODER 0
+%define CONFIG_HEVC_RKMPP_DECODER 0
+%define CONFIG_HEVC_V4L2M2M_DECODER 0
+%define CONFIG_HNM4_VIDEO_DECODER 0
+%define CONFIG_HQ_HQA_DECODER 0
+%define CONFIG_HQX_DECODER 0
+%define CONFIG_HUFFYUV_DECODER 0
+%define CONFIG_HYMT_DECODER 0
+%define CONFIG_IDCIN_DECODER 0
+%define CONFIG_IFF_ILBM_DECODER 0
+%define CONFIG_IMM4_DECODER 0
+%define CONFIG_IMM5_DECODER 0
+%define CONFIG_INDEO2_DECODER 0
+%define CONFIG_INDEO3_DECODER 0
+%define CONFIG_INDEO4_DECODER 0
+%define CONFIG_INDEO5_DECODER 0
+%define CONFIG_INTERPLAY_VIDEO_DECODER 0
+%define CONFIG_JPEG2000_DECODER 0
+%define CONFIG_JPEGLS_DECODER 0
+%define CONFIG_JV_DECODER 0
+%define CONFIG_KGV1_DECODER 0
+%define CONFIG_KMVC_DECODER 0
+%define CONFIG_LAGARITH_DECODER 0
+%define CONFIG_LOCO_DECODER 0
+%define CONFIG_LSCR_DECODER 0
+%define CONFIG_M101_DECODER 0
+%define CONFIG_MAGICYUV_DECODER 0
+%define CONFIG_MDEC_DECODER 0
+%define CONFIG_MIMIC_DECODER 0
+%define CONFIG_MJPEG_DECODER 0
+%define CONFIG_MJPEGB_DECODER 0
+%define CONFIG_MMVIDEO_DECODER 0
+%define CONFIG_MOTIONPIXELS_DECODER 0
+%define CONFIG_MPEG1VIDEO_DECODER 0
+%define CONFIG_MPEG2VIDEO_DECODER 0
+%define CONFIG_MPEG4_DECODER 0
+%define CONFIG_MPEG4_CRYSTALHD_DECODER 0
+%define CONFIG_MPEG4_V4L2M2M_DECODER 0
+%define CONFIG_MPEG4_MMAL_DECODER 0
+%define CONFIG_MPEGVIDEO_DECODER 0
+%define CONFIG_MPEG1_V4L2M2M_DECODER 0
+%define CONFIG_MPEG2_MMAL_DECODER 0
+%define CONFIG_MPEG2_CRYSTALHD_DECODER 0
+%define CONFIG_MPEG2_V4L2M2M_DECODER 0
+%define CONFIG_MPEG2_QSV_DECODER 0
+%define CONFIG_MPEG2_MEDIACODEC_DECODER 0
+%define CONFIG_MSA1_DECODER 0
+%define CONFIG_MSCC_DECODER 0
+%define CONFIG_MSMPEG4V1_DECODER 0
+%define CONFIG_MSMPEG4V2_DECODER 0
+%define CONFIG_MSMPEG4V3_DECODER 0
+%define CONFIG_MSMPEG4_CRYSTALHD_DECODER 0
+%define CONFIG_MSRLE_DECODER 0
+%define CONFIG_MSS1_DECODER 0
+%define CONFIG_MSS2_DECODER 0
+%define CONFIG_MSVIDEO1_DECODER 0
+%define CONFIG_MSZH_DECODER 0
+%define CONFIG_MTS2_DECODER 0
+%define CONFIG_MV30_DECODER 0
+%define CONFIG_MVC1_DECODER 0
+%define CONFIG_MVC2_DECODER 0
+%define CONFIG_MVDV_DECODER 0
+%define CONFIG_MVHA_DECODER 0
+%define CONFIG_MWSC_DECODER 0
+%define CONFIG_MXPEG_DECODER 0
+%define CONFIG_NUV_DECODER 0
+%define CONFIG_PAF_VIDEO_DECODER 0
+%define CONFIG_PAM_DECODER 0
+%define CONFIG_PBM_DECODER 0
+%define CONFIG_PCX_DECODER 0
+%define CONFIG_PGM_DECODER 0
+%define CONFIG_PGMYUV_DECODER 0
+%define CONFIG_PICTOR_DECODER 0
+%define CONFIG_PIXLET_DECODER 0
+%define CONFIG_PNG_DECODER 0
+%define CONFIG_PPM_DECODER 0
+%define CONFIG_PRORES_DECODER 0
+%define CONFIG_PROSUMER_DECODER 0
+%define CONFIG_PSD_DECODER 0
+%define CONFIG_PTX_DECODER 0
+%define CONFIG_QDRAW_DECODER 0
+%define CONFIG_QPEG_DECODER 0
+%define CONFIG_QTRLE_DECODER 0
+%define CONFIG_R10K_DECODER 0
+%define CONFIG_R210_DECODER 0
+%define CONFIG_RASC_DECODER 0
+%define CONFIG_RAWVIDEO_DECODER 0
+%define CONFIG_RL2_DECODER 0
+%define CONFIG_ROQ_DECODER 0
+%define CONFIG_RPZA_DECODER 0
+%define CONFIG_RSCC_DECODER 0
+%define CONFIG_RV10_DECODER 0
+%define CONFIG_RV20_DECODER 0
+%define CONFIG_RV30_DECODER 0
+%define CONFIG_RV40_DECODER 0
+%define CONFIG_S302M_DECODER 0
+%define CONFIG_SANM_DECODER 0
+%define CONFIG_SCPR_DECODER 0
+%define CONFIG_SCREENPRESSO_DECODER 0
+%define CONFIG_SGI_DECODER 0
+%define CONFIG_SGIRLE_DECODER 0
+%define CONFIG_SHEERVIDEO_DECODER 0
+%define CONFIG_SMACKER_DECODER 0
+%define CONFIG_SMC_DECODER 0
+%define CONFIG_SMVJPEG_DECODER 0
+%define CONFIG_SNOW_DECODER 0
+%define CONFIG_SP5X_DECODER 0
+%define CONFIG_SPEEDHQ_DECODER 0
+%define CONFIG_SRGC_DECODER 0
+%define CONFIG_SUNRAST_DECODER 0
+%define CONFIG_SVQ1_DECODER 0
+%define CONFIG_SVQ3_DECODER 0
+%define CONFIG_TARGA_DECODER 0
+%define CONFIG_TARGA_Y216_DECODER 0
+%define CONFIG_TDSC_DECODER 0
+%define CONFIG_THEORA_DECODER 1
+%define CONFIG_THP_DECODER 0
+%define CONFIG_TIERTEXSEQVIDEO_DECODER 0
+%define CONFIG_TIFF_DECODER 0
+%define CONFIG_TMV_DECODER 0
+%define CONFIG_TRUEMOTION1_DECODER 0
+%define CONFIG_TRUEMOTION2_DECODER 0
+%define CONFIG_TRUEMOTION2RT_DECODER 0
+%define CONFIG_TSCC_DECODER 0
+%define CONFIG_TSCC2_DECODER 0
+%define CONFIG_TXD_DECODER 0
+%define CONFIG_ULTI_DECODER 0
+%define CONFIG_UTVIDEO_DECODER 0
+%define CONFIG_V210_DECODER 0
+%define CONFIG_V210X_DECODER 0
+%define CONFIG_V308_DECODER 0
+%define CONFIG_V408_DECODER 0
+%define CONFIG_V410_DECODER 0
+%define CONFIG_VB_DECODER 0
+%define CONFIG_VBLE_DECODER 0
+%define CONFIG_VC1_DECODER 0
+%define CONFIG_VC1_CRYSTALHD_DECODER 0
+%define CONFIG_VC1IMAGE_DECODER 0
+%define CONFIG_VC1_MMAL_DECODER 0
+%define CONFIG_VC1_QSV_DECODER 0
+%define CONFIG_VC1_V4L2M2M_DECODER 0
+%define CONFIG_VCR1_DECODER 0
+%define CONFIG_VMDVIDEO_DECODER 0
+%define CONFIG_VMNC_DECODER 0
+%define CONFIG_VP3_DECODER 1
+%define CONFIG_VP4_DECODER 0
+%define CONFIG_VP5_DECODER 0
+%define CONFIG_VP6_DECODER 0
+%define CONFIG_VP6A_DECODER 0
+%define CONFIG_VP6F_DECODER 0
+%define CONFIG_VP7_DECODER 0
+%define CONFIG_VP8_DECODER 1
+%define CONFIG_VP8_RKMPP_DECODER 0
+%define CONFIG_VP8_V4L2M2M_DECODER 0
+%define CONFIG_VP9_DECODER 1
+%define CONFIG_VP9_RKMPP_DECODER 0
+%define CONFIG_VP9_V4L2M2M_DECODER 0
+%define CONFIG_VQA_DECODER 0
+%define CONFIG_WEBP_DECODER 0
+%define CONFIG_WCMV_DECODER 0
+%define CONFIG_WRAPPED_AVFRAME_DECODER 0
+%define CONFIG_WMV1_DECODER 0
+%define CONFIG_WMV2_DECODER 0
+%define CONFIG_WMV3_DECODER 0
+%define CONFIG_WMV3_CRYSTALHD_DECODER 0
+%define CONFIG_WMV3IMAGE_DECODER 0
+%define CONFIG_WNV1_DECODER 0
+%define CONFIG_XAN_WC3_DECODER 0
+%define CONFIG_XAN_WC4_DECODER 0
+%define CONFIG_XBM_DECODER 0
+%define CONFIG_XFACE_DECODER 0
+%define CONFIG_XL_DECODER 0
+%define CONFIG_XPM_DECODER 0
+%define CONFIG_XWD_DECODER 0
+%define CONFIG_Y41P_DECODER 0
+%define CONFIG_YLC_DECODER 0
+%define CONFIG_YOP_DECODER 0
+%define CONFIG_YUV4_DECODER 0
+%define CONFIG_ZERO12V_DECODER 0
+%define CONFIG_ZEROCODEC_DECODER 0
+%define CONFIG_ZLIB_DECODER 0
+%define CONFIG_ZMBV_DECODER 0
+%define CONFIG_AAC_DECODER 0
+%define CONFIG_AAC_FIXED_DECODER 0
+%define CONFIG_AAC_LATM_DECODER 0
+%define CONFIG_AC3_DECODER 0
+%define CONFIG_AC3_FIXED_DECODER 0
+%define CONFIG_ACELP_KELVIN_DECODER 0
+%define CONFIG_ALAC_DECODER 0
+%define CONFIG_ALS_DECODER 0
+%define CONFIG_AMRNB_DECODER 0
+%define CONFIG_AMRWB_DECODER 0
+%define CONFIG_APE_DECODER 0
+%define CONFIG_APTX_DECODER 1
+%define CONFIG_APTX_HD_DECODER 0
+%define CONFIG_ATRAC1_DECODER 0
+%define CONFIG_ATRAC3_DECODER 0
+%define CONFIG_ATRAC3AL_DECODER 0
+%define CONFIG_ATRAC3P_DECODER 0
+%define CONFIG_ATRAC3PAL_DECODER 0
+%define CONFIG_ATRAC9_DECODER 0
+%define CONFIG_BINKAUDIO_DCT_DECODER 0
+%define CONFIG_BINKAUDIO_RDFT_DECODER 0
+%define CONFIG_BMV_AUDIO_DECODER 0
+%define CONFIG_COOK_DECODER 0
+%define CONFIG_DCA_DECODER 0
+%define CONFIG_DOLBY_E_DECODER 0
+%define CONFIG_DSD_LSBF_DECODER 0
+%define CONFIG_DSD_MSBF_DECODER 0
+%define CONFIG_DSD_LSBF_PLANAR_DECODER 0
+%define CONFIG_DSD_MSBF_PLANAR_DECODER 0
+%define CONFIG_DSICINAUDIO_DECODER 0
+%define CONFIG_DSS_SP_DECODER 0
+%define CONFIG_DST_DECODER 0
+%define CONFIG_EAC3_DECODER 0
+%define CONFIG_EVRC_DECODER 0
+%define CONFIG_FFWAVESYNTH_DECODER 0
+%define CONFIG_FLAC_DECODER 1
+%define CONFIG_G723_1_DECODER 0
+%define CONFIG_G729_DECODER 0
+%define CONFIG_GSM_DECODER 0
+%define CONFIG_GSM_MS_DECODER 0
+%define CONFIG_HCA_DECODER 0
+%define CONFIG_HCOM_DECODER 0
+%define CONFIG_IAC_DECODER 0
+%define CONFIG_ILBC_DECODER 0
+%define CONFIG_IMC_DECODER 0
+%define CONFIG_INTERPLAY_ACM_DECODER 0
+%define CONFIG_MACE3_DECODER 0
+%define CONFIG_MACE6_DECODER 0
+%define CONFIG_METASOUND_DECODER 0
+%define CONFIG_MLP_DECODER 0
+%define CONFIG_MP1_DECODER 0
+%define CONFIG_MP1FLOAT_DECODER 0
+%define CONFIG_MP2_DECODER 0
+%define CONFIG_MP2FLOAT_DECODER 0
+%define CONFIG_MP3FLOAT_DECODER 0
+%define CONFIG_MP3_DECODER 1
+%define CONFIG_MP3ADUFLOAT_DECODER 0
+%define CONFIG_MP3ADU_DECODER 0
+%define CONFIG_MP3ON4FLOAT_DECODER 0
+%define CONFIG_MP3ON4_DECODER 0
+%define CONFIG_MPC7_DECODER 0
+%define CONFIG_MPC8_DECODER 0
+%define CONFIG_NELLYMOSER_DECODER 0
+%define CONFIG_ON2AVC_DECODER 0
+%define CONFIG_OPUS_DECODER 0
+%define CONFIG_PAF_AUDIO_DECODER 0
+%define CONFIG_QCELP_DECODER 0
+%define CONFIG_QDM2_DECODER 0
+%define CONFIG_QDMC_DECODER 0
+%define CONFIG_RA_144_DECODER 0
+%define CONFIG_RA_288_DECODER 0
+%define CONFIG_RALF_DECODER 0
+%define CONFIG_SBC_DECODER 1
+%define CONFIG_SHORTEN_DECODER 0
+%define CONFIG_SIPR_DECODER 0
+%define CONFIG_SIREN_DECODER 0
+%define CONFIG_SMACKAUD_DECODER 0
+%define CONFIG_SONIC_DECODER 0
+%define CONFIG_TAK_DECODER 0
+%define CONFIG_TRUEHD_DECODER 0
+%define CONFIG_TRUESPEECH_DECODER 0
+%define CONFIG_TTA_DECODER 0
+%define CONFIG_TWINVQ_DECODER 0
+%define CONFIG_VMDAUDIO_DECODER 0
+%define CONFIG_VORBIS_DECODER 1
+%define CONFIG_WAVPACK_DECODER 0
+%define CONFIG_WMALOSSLESS_DECODER 0
+%define CONFIG_WMAPRO_DECODER 0
+%define CONFIG_WMAV1_DECODER 0
+%define CONFIG_WMAV2_DECODER 0
+%define CONFIG_WMAVOICE_DECODER 0
+%define CONFIG_WS_SND1_DECODER 0
+%define CONFIG_XMA1_DECODER 0
+%define CONFIG_XMA2_DECODER 0
+%define CONFIG_PCM_ALAW_DECODER 1
+%define CONFIG_PCM_BLURAY_DECODER 0
+%define CONFIG_PCM_DVD_DECODER 0
+%define CONFIG_PCM_F16LE_DECODER 0
+%define CONFIG_PCM_F24LE_DECODER 0
+%define CONFIG_PCM_F32BE_DECODER 0
+%define CONFIG_PCM_F32LE_DECODER 1
+%define CONFIG_PCM_F64BE_DECODER 0
+%define CONFIG_PCM_F64LE_DECODER 0
+%define CONFIG_PCM_LXF_DECODER 0
+%define CONFIG_PCM_MULAW_DECODER 1
+%define CONFIG_PCM_S8_DECODER 0
+%define CONFIG_PCM_S8_PLANAR_DECODER 0
+%define CONFIG_PCM_S16BE_DECODER 1
+%define CONFIG_PCM_S16BE_PLANAR_DECODER 0
+%define CONFIG_PCM_S16LE_DECODER 1
+%define CONFIG_PCM_S16LE_PLANAR_DECODER 0
+%define CONFIG_PCM_S24BE_DECODER 1
+%define CONFIG_PCM_S24DAUD_DECODER 0
+%define CONFIG_PCM_S24LE_DECODER 1
+%define CONFIG_PCM_S24LE_PLANAR_DECODER 0
+%define CONFIG_PCM_S32BE_DECODER 0
+%define CONFIG_PCM_S32LE_DECODER 1
+%define CONFIG_PCM_S32LE_PLANAR_DECODER 0
+%define CONFIG_PCM_S64BE_DECODER 0
+%define CONFIG_PCM_S64LE_DECODER 0
+%define CONFIG_PCM_U8_DECODER 1
+%define CONFIG_PCM_U16BE_DECODER 0
+%define CONFIG_PCM_U16LE_DECODER 0
+%define CONFIG_PCM_U24BE_DECODER 0
+%define CONFIG_PCM_U24LE_DECODER 0
+%define CONFIG_PCM_U32BE_DECODER 0
+%define CONFIG_PCM_U32LE_DECODER 0
+%define CONFIG_PCM_VIDC_DECODER 0
+%define CONFIG_DERF_DPCM_DECODER 0
+%define CONFIG_GREMLIN_DPCM_DECODER 0
+%define CONFIG_INTERPLAY_DPCM_DECODER 0
+%define CONFIG_ROQ_DPCM_DECODER 0
+%define CONFIG_SDX2_DPCM_DECODER 0
+%define CONFIG_SOL_DPCM_DECODER 0
+%define CONFIG_XAN_DPCM_DECODER 0
+%define CONFIG_ADPCM_4XM_DECODER 0
+%define CONFIG_ADPCM_ADX_DECODER 0
+%define CONFIG_ADPCM_AFC_DECODER 0
+%define CONFIG_ADPCM_AGM_DECODER 0
+%define CONFIG_ADPCM_AICA_DECODER 0
+%define CONFIG_ADPCM_ARGO_DECODER 0
+%define CONFIG_ADPCM_CT_DECODER 0
+%define CONFIG_ADPCM_DTK_DECODER 0
+%define CONFIG_ADPCM_EA_DECODER 0
+%define CONFIG_ADPCM_EA_MAXIS_XA_DECODER 0
+%define CONFIG_ADPCM_EA_R1_DECODER 0
+%define CONFIG_ADPCM_EA_R2_DECODER 0
+%define CONFIG_ADPCM_EA_R3_DECODER 0
+%define CONFIG_ADPCM_EA_XAS_DECODER 0
+%define CONFIG_ADPCM_G722_DECODER 0
+%define CONFIG_ADPCM_G726_DECODER 0
+%define CONFIG_ADPCM_G726LE_DECODER 0
+%define CONFIG_ADPCM_IMA_AMV_DECODER 0
+%define CONFIG_ADPCM_IMA_ALP_DECODER 0
+%define CONFIG_ADPCM_IMA_APC_DECODER 0
+%define CONFIG_ADPCM_IMA_APM_DECODER 0
+%define CONFIG_ADPCM_IMA_DAT4_DECODER 0
+%define CONFIG_ADPCM_IMA_DK3_DECODER 0
+%define CONFIG_ADPCM_IMA_DK4_DECODER 0
+%define CONFIG_ADPCM_IMA_EA_EACS_DECODER 0
+%define CONFIG_ADPCM_IMA_EA_SEAD_DECODER 0
+%define CONFIG_ADPCM_IMA_ISS_DECODER 0
+%define CONFIG_ADPCM_IMA_MTF_DECODER 0
+%define CONFIG_ADPCM_IMA_OKI_DECODER 0
+%define CONFIG_ADPCM_IMA_QT_DECODER 0
+%define CONFIG_ADPCM_IMA_RAD_DECODER 0
+%define CONFIG_ADPCM_IMA_SSI_DECODER 0
+%define CONFIG_ADPCM_IMA_SMJPEG_DECODER 0
+%define CONFIG_ADPCM_IMA_WAV_DECODER 0
+%define CONFIG_ADPCM_IMA_WS_DECODER 0
+%define CONFIG_ADPCM_MS_DECODER 0
+%define CONFIG_ADPCM_MTAF_DECODER 0
+%define CONFIG_ADPCM_PSX_DECODER 0
+%define CONFIG_ADPCM_SBPRO_2_DECODER 0
+%define CONFIG_ADPCM_SBPRO_3_DECODER 0
+%define CONFIG_ADPCM_SBPRO_4_DECODER 0
+%define CONFIG_ADPCM_SWF_DECODER 0
+%define CONFIG_ADPCM_THP_DECODER 0
+%define CONFIG_ADPCM_THP_LE_DECODER 0
+%define CONFIG_ADPCM_VIMA_DECODER 0
+%define CONFIG_ADPCM_XA_DECODER 0
+%define CONFIG_ADPCM_YAMAHA_DECODER 0
+%define CONFIG_ADPCM_ZORK_DECODER 0
+%define CONFIG_SSA_DECODER 0
+%define CONFIG_ASS_DECODER 0
+%define CONFIG_CCAPTION_DECODER 0
+%define CONFIG_DVBSUB_DECODER 0
+%define CONFIG_DVDSUB_DECODER 0
+%define CONFIG_JACOSUB_DECODER 0
+%define CONFIG_MICRODVD_DECODER 0
+%define CONFIG_MOVTEXT_DECODER 0
+%define CONFIG_MPL2_DECODER 0
+%define CONFIG_PGSSUB_DECODER 0
+%define CONFIG_PJS_DECODER 0
+%define CONFIG_REALTEXT_DECODER 0
+%define CONFIG_SAMI_DECODER 0
+%define CONFIG_SRT_DECODER 0
+%define CONFIG_STL_DECODER 0
+%define CONFIG_SUBRIP_DECODER 0
+%define CONFIG_SUBVIEWER_DECODER 0
+%define CONFIG_SUBVIEWER1_DECODER 0
+%define CONFIG_TEXT_DECODER 0
+%define CONFIG_VPLAYER_DECODER 0
+%define CONFIG_WEBVTT_DECODER 0
+%define CONFIG_XSUB_DECODER 0
+%define CONFIG_AAC_AT_DECODER 0
+%define CONFIG_AC3_AT_DECODER 0
+%define CONFIG_ADPCM_IMA_QT_AT_DECODER 0
+%define CONFIG_ALAC_AT_DECODER 0
+%define CONFIG_AMR_NB_AT_DECODER 0
+%define CONFIG_EAC3_AT_DECODER 0
+%define CONFIG_GSM_MS_AT_DECODER 0
+%define CONFIG_ILBC_AT_DECODER 0
+%define CONFIG_MP1_AT_DECODER 0
+%define CONFIG_MP2_AT_DECODER 0
+%define CONFIG_MP3_AT_DECODER 0
+%define CONFIG_PCM_ALAW_AT_DECODER 0
+%define CONFIG_PCM_MULAW_AT_DECODER 0
+%define CONFIG_QDMC_AT_DECODER 0
+%define CONFIG_QDM2_AT_DECODER 0
+%define CONFIG_LIBARIBB24_DECODER 0
+%define CONFIG_LIBCELT_DECODER 0
+%define CONFIG_LIBCODEC2_DECODER 0
+%define CONFIG_LIBDAV1D_DECODER 0
+%define CONFIG_LIBDAVS2_DECODER 0
+%define CONFIG_LIBFDK_AAC_DECODER 0
+%define CONFIG_LIBGSM_DECODER 0
+%define CONFIG_LIBGSM_MS_DECODER 0
+%define CONFIG_LIBILBC_DECODER 0
+%define CONFIG_LIBOPENCORE_AMRNB_DECODER 0
+%define CONFIG_LIBOPENCORE_AMRWB_DECODER 0
+%define CONFIG_LIBOPENJPEG_DECODER 0
+%define CONFIG_LIBOPUS_DECODER 1
+%define CONFIG_LIBRSVG_DECODER 0
+%define CONFIG_LIBSPEEX_DECODER 0
+%define CONFIG_LIBVORBIS_DECODER 0
+%define CONFIG_LIBVPX_VP8_DECODER 0
+%define CONFIG_LIBVPX_VP9_DECODER 0
+%define CONFIG_LIBZVBI_TELETEXT_DECODER 0
+%define CONFIG_BINTEXT_DECODER 0
+%define CONFIG_XBIN_DECODER 0
+%define CONFIG_IDF_DECODER 0
+%define CONFIG_LIBAOM_AV1_DECODER 0
+%define CONFIG_LIBOPENH264_DECODER 0
+%define CONFIG_H264_CUVID_DECODER 0
+%define CONFIG_HEVC_CUVID_DECODER 0
+%define CONFIG_HEVC_MEDIACODEC_DECODER 0
+%define CONFIG_MJPEG_CUVID_DECODER 0
+%define CONFIG_MJPEG_QSV_DECODER 0
+%define CONFIG_MPEG1_CUVID_DECODER 0
+%define CONFIG_MPEG2_CUVID_DECODER 0
+%define CONFIG_MPEG4_CUVID_DECODER 0
+%define CONFIG_MPEG4_MEDIACODEC_DECODER 0
+%define CONFIG_VC1_CUVID_DECODER 0
+%define CONFIG_VP8_CUVID_DECODER 0
+%define CONFIG_VP8_MEDIACODEC_DECODER 0
+%define CONFIG_VP8_QSV_DECODER 0
+%define CONFIG_VP9_CUVID_DECODER 0
+%define CONFIG_VP9_MEDIACODEC_DECODER 0
+%define CONFIG_VP9_QSV_DECODER 0
+%define CONFIG_A64MULTI_ENCODER 0
+%define CONFIG_A64MULTI5_ENCODER 0
+%define CONFIG_ALIAS_PIX_ENCODER 0
+%define CONFIG_AMV_ENCODER 0
+%define CONFIG_APNG_ENCODER 0
+%define CONFIG_ASV1_ENCODER 0
+%define CONFIG_ASV2_ENCODER 0
+%define CONFIG_AVRP_ENCODER 0
+%define CONFIG_AVUI_ENCODER 0
+%define CONFIG_AYUV_ENCODER 0
+%define CONFIG_BMP_ENCODER 0
+%define CONFIG_CINEPAK_ENCODER 0
+%define CONFIG_CLJR_ENCODER 0
+%define CONFIG_COMFORTNOISE_ENCODER 0
+%define CONFIG_DNXHD_ENCODER 0
+%define CONFIG_DPX_ENCODER 0
+%define CONFIG_DVVIDEO_ENCODER 0
+%define CONFIG_FFV1_ENCODER 0
+%define CONFIG_FFVHUFF_ENCODER 0
+%define CONFIG_FITS_ENCODER 0
+%define CONFIG_FLASHSV_ENCODER 0
+%define CONFIG_FLASHSV2_ENCODER 0
+%define CONFIG_FLV_ENCODER 0
+%define CONFIG_GIF_ENCODER 0
+%define CONFIG_H261_ENCODER 0
+%define CONFIG_H263_ENCODER 0
+%define CONFIG_H263P_ENCODER 0
+%define CONFIG_HAP_ENCODER 0
+%define CONFIG_HUFFYUV_ENCODER 0
+%define CONFIG_JPEG2000_ENCODER 0
+%define CONFIG_JPEGLS_ENCODER 0
+%define CONFIG_LJPEG_ENCODER 0
+%define CONFIG_MAGICYUV_ENCODER 0
+%define CONFIG_MJPEG_ENCODER 0
+%define CONFIG_MPEG1VIDEO_ENCODER 0
+%define CONFIG_MPEG2VIDEO_ENCODER 0
+%define CONFIG_MPEG4_ENCODER 0
+%define CONFIG_MSMPEG4V2_ENCODER 0
+%define CONFIG_MSMPEG4V3_ENCODER 0
+%define CONFIG_MSVIDEO1_ENCODER 0
+%define CONFIG_PAM_ENCODER 0
+%define CONFIG_PBM_ENCODER 0
+%define CONFIG_PCX_ENCODER 0
+%define CONFIG_PGM_ENCODER 0
+%define CONFIG_PGMYUV_ENCODER 0
+%define CONFIG_PNG_ENCODER 0
+%define CONFIG_PPM_ENCODER 0
+%define CONFIG_PRORES_ENCODER 0
+%define CONFIG_PRORES_AW_ENCODER 0
+%define CONFIG_PRORES_KS_ENCODER 0
+%define CONFIG_QTRLE_ENCODER 0
+%define CONFIG_R10K_ENCODER 0
+%define CONFIG_R210_ENCODER 0
+%define CONFIG_RAWVIDEO_ENCODER 0
+%define CONFIG_ROQ_ENCODER 0
+%define CONFIG_RV10_ENCODER 0
+%define CONFIG_RV20_ENCODER 0
+%define CONFIG_S302M_ENCODER 0
+%define CONFIG_SGI_ENCODER 0
+%define CONFIG_SNOW_ENCODER 0
+%define CONFIG_SUNRAST_ENCODER 0
+%define CONFIG_SVQ1_ENCODER 0
+%define CONFIG_TARGA_ENCODER 0
+%define CONFIG_TIFF_ENCODER 0
+%define CONFIG_UTVIDEO_ENCODER 0
+%define CONFIG_V210_ENCODER 0
+%define CONFIG_V308_ENCODER 0
+%define CONFIG_V408_ENCODER 0
+%define CONFIG_V410_ENCODER 0
+%define CONFIG_VC2_ENCODER 0
+%define CONFIG_WRAPPED_AVFRAME_ENCODER 0
+%define CONFIG_WMV1_ENCODER 0
+%define CONFIG_WMV2_ENCODER 0
+%define CONFIG_XBM_ENCODER 0
+%define CONFIG_XFACE_ENCODER 0
+%define CONFIG_XWD_ENCODER 0
+%define CONFIG_Y41P_ENCODER 0
+%define CONFIG_YUV4_ENCODER 0
+%define CONFIG_ZLIB_ENCODER 0
+%define CONFIG_ZMBV_ENCODER 0
+%define CONFIG_AAC_ENCODER 0
+%define CONFIG_AC3_ENCODER 0
+%define CONFIG_AC3_FIXED_ENCODER 0
+%define CONFIG_ALAC_ENCODER 0
+%define CONFIG_APTX_ENCODER 0
+%define CONFIG_APTX_HD_ENCODER 0
+%define CONFIG_DCA_ENCODER 0
+%define CONFIG_EAC3_ENCODER 0
+%define CONFIG_FLAC_ENCODER 0
+%define CONFIG_G723_1_ENCODER 0
+%define CONFIG_MLP_ENCODER 0
+%define CONFIG_MP2_ENCODER 0
+%define CONFIG_MP2FIXED_ENCODER 0
+%define CONFIG_NELLYMOSER_ENCODER 0
+%define CONFIG_OPUS_ENCODER 0
+%define CONFIG_RA_144_ENCODER 0
+%define CONFIG_SBC_ENCODER 0
+%define CONFIG_SONIC_ENCODER 0
+%define CONFIG_SONIC_LS_ENCODER 0
+%define CONFIG_TRUEHD_ENCODER 0
+%define CONFIG_TTA_ENCODER 0
+%define CONFIG_VORBIS_ENCODER 0
+%define CONFIG_WAVPACK_ENCODER 0
+%define CONFIG_WMAV1_ENCODER 0
+%define CONFIG_WMAV2_ENCODER 0
+%define CONFIG_PCM_ALAW_ENCODER 0
+%define CONFIG_PCM_DVD_ENCODER 0
+%define CONFIG_PCM_F32BE_ENCODER 0
+%define CONFIG_PCM_F32LE_ENCODER 0
+%define CONFIG_PCM_F64BE_ENCODER 0
+%define CONFIG_PCM_F64LE_ENCODER 0
+%define CONFIG_PCM_MULAW_ENCODER 0
+%define CONFIG_PCM_S8_ENCODER 0
+%define CONFIG_PCM_S8_PLANAR_ENCODER 0
+%define CONFIG_PCM_S16BE_ENCODER 0
+%define CONFIG_PCM_S16BE_PLANAR_ENCODER 0
+%define CONFIG_PCM_S16LE_ENCODER 0
+%define CONFIG_PCM_S16LE_PLANAR_ENCODER 0
+%define CONFIG_PCM_S24BE_ENCODER 0
+%define CONFIG_PCM_S24DAUD_ENCODER 0
+%define CONFIG_PCM_S24LE_ENCODER 0
+%define CONFIG_PCM_S24LE_PLANAR_ENCODER 0
+%define CONFIG_PCM_S32BE_ENCODER 0
+%define CONFIG_PCM_S32LE_ENCODER 0
+%define CONFIG_PCM_S32LE_PLANAR_ENCODER 0
+%define CONFIG_PCM_S64BE_ENCODER 0
+%define CONFIG_PCM_S64LE_ENCODER 0
+%define CONFIG_PCM_U8_ENCODER 0
+%define CONFIG_PCM_U16BE_ENCODER 0
+%define CONFIG_PCM_U16LE_ENCODER 0
+%define CONFIG_PCM_U24BE_ENCODER 0
+%define CONFIG_PCM_U24LE_ENCODER 0
+%define CONFIG_PCM_U32BE_ENCODER 0
+%define CONFIG_PCM_U32LE_ENCODER 0
+%define CONFIG_PCM_VIDC_ENCODER 0
+%define CONFIG_ROQ_DPCM_ENCODER 0
+%define CONFIG_ADPCM_ADX_ENCODER 0
+%define CONFIG_ADPCM_G722_ENCODER 0
+%define CONFIG_ADPCM_G726_ENCODER 0
+%define CONFIG_ADPCM_G726LE_ENCODER 0
+%define CONFIG_ADPCM_IMA_QT_ENCODER 0
+%define CONFIG_ADPCM_IMA_WAV_ENCODER 0
+%define CONFIG_ADPCM_MS_ENCODER 0
+%define CONFIG_ADPCM_SWF_ENCODER 0
+%define CONFIG_ADPCM_YAMAHA_ENCODER 0
+%define CONFIG_SSA_ENCODER 0
+%define CONFIG_ASS_ENCODER 0
+%define CONFIG_DVBSUB_ENCODER 0
+%define CONFIG_DVDSUB_ENCODER 0
+%define CONFIG_MOVTEXT_ENCODER 0
+%define CONFIG_SRT_ENCODER 0
+%define CONFIG_SUBRIP_ENCODER 0
+%define CONFIG_TEXT_ENCODER 0
+%define CONFIG_WEBVTT_ENCODER 0
+%define CONFIG_XSUB_ENCODER 0
+%define CONFIG_AAC_AT_ENCODER 0
+%define CONFIG_ALAC_AT_ENCODER 0
+%define CONFIG_ILBC_AT_ENCODER 0
+%define CONFIG_PCM_ALAW_AT_ENCODER 0
+%define CONFIG_PCM_MULAW_AT_ENCODER 0
+%define CONFIG_LIBAOM_AV1_ENCODER 0
+%define CONFIG_LIBCODEC2_ENCODER 0
+%define CONFIG_LIBFDK_AAC_ENCODER 0
+%define CONFIG_LIBGSM_ENCODER 0
+%define CONFIG_LIBGSM_MS_ENCODER 0
+%define CONFIG_LIBILBC_ENCODER 0
+%define CONFIG_LIBMP3LAME_ENCODER 0
+%define CONFIG_LIBOPENCORE_AMRNB_ENCODER 0
+%define CONFIG_LIBOPENJPEG_ENCODER 0
+%define CONFIG_LIBOPUS_ENCODER 0
+%define CONFIG_LIBRAV1E_ENCODER 0
+%define CONFIG_LIBSHINE_ENCODER 0
+%define CONFIG_LIBSPEEX_ENCODER 0
+%define CONFIG_LIBTHEORA_ENCODER 0
+%define CONFIG_LIBTWOLAME_ENCODER 0
+%define CONFIG_LIBVO_AMRWBENC_ENCODER 0
+%define CONFIG_LIBVORBIS_ENCODER 0
+%define CONFIG_LIBVPX_VP8_ENCODER 0
+%define CONFIG_LIBVPX_VP9_ENCODER 0
+%define CONFIG_LIBWAVPACK_ENCODER 0
+%define CONFIG_LIBWEBP_ANIM_ENCODER 0
+%define CONFIG_LIBWEBP_ENCODER 0
+%define CONFIG_LIBX262_ENCODER 0
+%define CONFIG_LIBX264_ENCODER 0
+%define CONFIG_LIBX264RGB_ENCODER 0
+%define CONFIG_LIBX265_ENCODER 0
+%define CONFIG_LIBXAVS_ENCODER 0
+%define CONFIG_LIBXAVS2_ENCODER 0
+%define CONFIG_LIBXVID_ENCODER 0
+%define CONFIG_H263_V4L2M2M_ENCODER 0
+%define CONFIG_LIBOPENH264_ENCODER 0
+%define CONFIG_H264_AMF_ENCODER 0
+%define CONFIG_H264_NVENC_ENCODER 0
+%define CONFIG_H264_OMX_ENCODER 0
+%define CONFIG_H264_QSV_ENCODER 0
+%define CONFIG_H264_V4L2M2M_ENCODER 0
+%define CONFIG_H264_VAAPI_ENCODER 0
+%define CONFIG_H264_VIDEOTOOLBOX_ENCODER 0
+%define CONFIG_NVENC_ENCODER 0
+%define CONFIG_NVENC_H264_ENCODER 0
+%define CONFIG_NVENC_HEVC_ENCODER 0
+%define CONFIG_HEVC_AMF_ENCODER 0
+%define CONFIG_HEVC_NVENC_ENCODER 0
+%define CONFIG_HEVC_QSV_ENCODER 0
+%define CONFIG_HEVC_V4L2M2M_ENCODER 0
+%define CONFIG_HEVC_VAAPI_ENCODER 0
+%define CONFIG_HEVC_VIDEOTOOLBOX_ENCODER 0
+%define CONFIG_LIBKVAZAAR_ENCODER 0
+%define CONFIG_MJPEG_QSV_ENCODER 0
+%define CONFIG_MJPEG_VAAPI_ENCODER 0
+%define CONFIG_MPEG2_QSV_ENCODER 0
+%define CONFIG_MPEG2_VAAPI_ENCODER 0
+%define CONFIG_MPEG4_OMX_ENCODER 0
+%define CONFIG_MPEG4_V4L2M2M_ENCODER 0
+%define CONFIG_VP8_V4L2M2M_ENCODER 0
+%define CONFIG_VP8_VAAPI_ENCODER 0
+%define CONFIG_VP9_VAAPI_ENCODER 0
+%define CONFIG_VP9_QSV_ENCODER 0
+%define CONFIG_H263_VAAPI_HWACCEL 0
+%define CONFIG_H263_VIDEOTOOLBOX_HWACCEL 0
+%define CONFIG_H264_D3D11VA_HWACCEL 0
+%define CONFIG_H264_D3D11VA2_HWACCEL 0
+%define CONFIG_H264_DXVA2_HWACCEL 0
+%define CONFIG_H264_NVDEC_HWACCEL 0
+%define CONFIG_H264_VAAPI_HWACCEL 0
+%define CONFIG_H264_VDPAU_HWACCEL 0
+%define CONFIG_H264_VIDEOTOOLBOX_HWACCEL 0
+%define CONFIG_HEVC_D3D11VA_HWACCEL 0
+%define CONFIG_HEVC_D3D11VA2_HWACCEL 0
+%define CONFIG_HEVC_DXVA2_HWACCEL 0
+%define CONFIG_HEVC_NVDEC_HWACCEL 0
+%define CONFIG_HEVC_VAAPI_HWACCEL 0
+%define CONFIG_HEVC_VDPAU_HWACCEL 0
+%define CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL 0
+%define CONFIG_MJPEG_NVDEC_HWACCEL 0
+%define CONFIG_MJPEG_VAAPI_HWACCEL 0
+%define CONFIG_MPEG1_NVDEC_HWACCEL 0
+%define CONFIG_MPEG1_VDPAU_HWACCEL 0
+%define CONFIG_MPEG1_VIDEOTOOLBOX_HWACCEL 0
+%define CONFIG_MPEG1_XVMC_HWACCEL 0
+%define CONFIG_MPEG2_D3D11VA_HWACCEL 0
+%define CONFIG_MPEG2_D3D11VA2_HWACCEL 0
+%define CONFIG_MPEG2_NVDEC_HWACCEL 0
+%define CONFIG_MPEG2_DXVA2_HWACCEL 0
+%define CONFIG_MPEG2_VAAPI_HWACCEL 0
+%define CONFIG_MPEG2_VDPAU_HWACCEL 0
+%define CONFIG_MPEG2_VIDEOTOOLBOX_HWACCEL 0
+%define CONFIG_MPEG2_XVMC_HWACCEL 0
+%define CONFIG_MPEG4_NVDEC_HWACCEL 0
+%define CONFIG_MPEG4_VAAPI_HWACCEL 0
+%define CONFIG_MPEG4_VDPAU_HWACCEL 0
+%define CONFIG_MPEG4_VIDEOTOOLBOX_HWACCEL 0
+%define CONFIG_VC1_D3D11VA_HWACCEL 0
+%define CONFIG_VC1_D3D11VA2_HWACCEL 0
+%define CONFIG_VC1_DXVA2_HWACCEL 0
+%define CONFIG_VC1_NVDEC_HWACCEL 0
+%define CONFIG_VC1_VAAPI_HWACCEL 0
+%define CONFIG_VC1_VDPAU_HWACCEL 0
+%define CONFIG_VP8_NVDEC_HWACCEL 0
+%define CONFIG_VP8_VAAPI_HWACCEL 0
+%define CONFIG_VP9_D3D11VA_HWACCEL 0
+%define CONFIG_VP9_D3D11VA2_HWACCEL 0
+%define CONFIG_VP9_DXVA2_HWACCEL 0
+%define CONFIG_VP9_NVDEC_HWACCEL 0
+%define CONFIG_VP9_VAAPI_HWACCEL 0
+%define CONFIG_VP9_VDPAU_HWACCEL 0
+%define CONFIG_WMV3_D3D11VA_HWACCEL 0
+%define CONFIG_WMV3_D3D11VA2_HWACCEL 0
+%define CONFIG_WMV3_DXVA2_HWACCEL 0
+%define CONFIG_WMV3_NVDEC_HWACCEL 0
+%define CONFIG_WMV3_VAAPI_HWACCEL 0
+%define CONFIG_WMV3_VDPAU_HWACCEL 0
+%define CONFIG_AAC_PARSER 0
+%define CONFIG_AAC_LATM_PARSER 0
+%define CONFIG_AC3_PARSER 0
+%define CONFIG_ADX_PARSER 0
+%define CONFIG_AV1_PARSER 0
+%define CONFIG_AVS2_PARSER 0
+%define CONFIG_BMP_PARSER 0
+%define CONFIG_CAVSVIDEO_PARSER 0
+%define CONFIG_COOK_PARSER 0
+%define CONFIG_DCA_PARSER 0
+%define CONFIG_DIRAC_PARSER 0
+%define CONFIG_DNXHD_PARSER 0
+%define CONFIG_DPX_PARSER 0
+%define CONFIG_DVAUDIO_PARSER 0
+%define CONFIG_DVBSUB_PARSER 0
+%define CONFIG_DVDSUB_PARSER 0
+%define CONFIG_DVD_NAV_PARSER 0
+%define CONFIG_FLAC_PARSER 1
+%define CONFIG_G723_1_PARSER 0
+%define CONFIG_G729_PARSER 0
+%define CONFIG_GIF_PARSER 0
+%define CONFIG_GSM_PARSER 0
+%define CONFIG_H261_PARSER 0
+%define CONFIG_H263_PARSER 0
+%define CONFIG_H264_PARSER 0
+%define CONFIG_HEVC_PARSER 0
+%define CONFIG_MJPEG_PARSER 0
+%define CONFIG_MLP_PARSER 0
+%define CONFIG_MPEG4VIDEO_PARSER 0
+%define CONFIG_MPEGAUDIO_PARSER 1
+%define CONFIG_MPEGVIDEO_PARSER 0
+%define CONFIG_OPUS_PARSER 1
+%define CONFIG_PNG_PARSER 0
+%define CONFIG_PNM_PARSER 0
+%define CONFIG_RV30_PARSER 0
+%define CONFIG_RV40_PARSER 0
+%define CONFIG_SBC_PARSER 0
+%define CONFIG_SIPR_PARSER 0
+%define CONFIG_TAK_PARSER 0
+%define CONFIG_VC1_PARSER 0
+%define CONFIG_VORBIS_PARSER 1
+%define CONFIG_VP3_PARSER 1
+%define CONFIG_VP8_PARSER 1
+%define CONFIG_VP9_PARSER 1
+%define CONFIG_WEBP_PARSER 0
+%define CONFIG_XMA_PARSER 0
+%define CONFIG_ALSA_INDEV 0
+%define CONFIG_ANDROID_CAMERA_INDEV 0
+%define CONFIG_AVFOUNDATION_INDEV 0
+%define CONFIG_BKTR_INDEV 0
+%define CONFIG_DECKLINK_INDEV 0
+%define CONFIG_DSHOW_INDEV 0
+%define CONFIG_FBDEV_INDEV 0
+%define CONFIG_GDIGRAB_INDEV 0
+%define CONFIG_IEC61883_INDEV 0
+%define CONFIG_JACK_INDEV 0
+%define CONFIG_KMSGRAB_INDEV 0
+%define CONFIG_LAVFI_INDEV 0
+%define CONFIG_OPENAL_INDEV 0
+%define CONFIG_OSS_INDEV 0
+%define CONFIG_PULSE_INDEV 0
+%define CONFIG_SNDIO_INDEV 0
+%define CONFIG_V4L2_INDEV 0
+%define CONFIG_VFWCAP_INDEV 0
+%define CONFIG_XCBGRAB_INDEV 0
+%define CONFIG_LIBCDIO_INDEV 0
+%define CONFIG_LIBDC1394_INDEV 0
+%define CONFIG_ALSA_OUTDEV 0
+%define CONFIG_CACA_OUTDEV 0
+%define CONFIG_DECKLINK_OUTDEV 0
+%define CONFIG_FBDEV_OUTDEV 0
+%define CONFIG_OPENGL_OUTDEV 0
+%define CONFIG_OSS_OUTDEV 0
+%define CONFIG_PULSE_OUTDEV 0
+%define CONFIG_SDL2_OUTDEV 0
+%define CONFIG_SNDIO_OUTDEV 0
+%define CONFIG_V4L2_OUTDEV 0
+%define CONFIG_XV_OUTDEV 0
+%define CONFIG_ABENCH_FILTER 0
+%define CONFIG_ACOMPRESSOR_FILTER 0
+%define CONFIG_ACONTRAST_FILTER 0
+%define CONFIG_ACOPY_FILTER 0
+%define CONFIG_ACUE_FILTER 0
+%define CONFIG_ACROSSFADE_FILTER 0
+%define CONFIG_ACROSSOVER_FILTER 0
+%define CONFIG_ACRUSHER_FILTER 0
+%define CONFIG_ADECLICK_FILTER 0
+%define CONFIG_ADECLIP_FILTER 0
+%define CONFIG_ADELAY_FILTER 0
+%define CONFIG_ADERIVATIVE_FILTER 0
+%define CONFIG_AECHO_FILTER 0
+%define CONFIG_AEMPHASIS_FILTER 0
+%define CONFIG_AEVAL_FILTER 0
+%define CONFIG_AFADE_FILTER 0
+%define CONFIG_AFFTDN_FILTER 0
+%define CONFIG_AFFTFILT_FILTER 0
+%define CONFIG_AFIR_FILTER 0
+%define CONFIG_AFORMAT_FILTER 0
+%define CONFIG_AGATE_FILTER 0
+%define CONFIG_AIIR_FILTER 0
+%define CONFIG_AINTEGRAL_FILTER 0
+%define CONFIG_AINTERLEAVE_FILTER 0
+%define CONFIG_ALIMITER_FILTER 0
+%define CONFIG_ALLPASS_FILTER 0
+%define CONFIG_ALOOP_FILTER 0
+%define CONFIG_AMERGE_FILTER 0
+%define CONFIG_AMETADATA_FILTER 0
+%define CONFIG_AMIX_FILTER 0
+%define CONFIG_AMULTIPLY_FILTER 0
+%define CONFIG_ANEQUALIZER_FILTER 0
+%define CONFIG_ANLMDN_FILTER 0
+%define CONFIG_ANLMS_FILTER 0
+%define CONFIG_ANULL_FILTER 0
+%define CONFIG_APAD_FILTER 0
+%define CONFIG_APERMS_FILTER 0
+%define CONFIG_APHASER_FILTER 0
+%define CONFIG_APULSATOR_FILTER 0
+%define CONFIG_AREALTIME_FILTER 0
+%define CONFIG_ARESAMPLE_FILTER 0
+%define CONFIG_AREVERSE_FILTER 0
+%define CONFIG_ARNNDN_FILTER 0
+%define CONFIG_ASELECT_FILTER 0
+%define CONFIG_ASENDCMD_FILTER 0
+%define CONFIG_ASETNSAMPLES_FILTER 0
+%define CONFIG_ASETPTS_FILTER 0
+%define CONFIG_ASETRATE_FILTER 0
+%define CONFIG_ASETTB_FILTER 0
+%define CONFIG_ASHOWINFO_FILTER 0
+%define CONFIG_ASIDEDATA_FILTER 0
+%define CONFIG_ASOFTCLIP_FILTER 0
+%define CONFIG_ASPLIT_FILTER 0
+%define CONFIG_ASR_FILTER 0
+%define CONFIG_ASTATS_FILTER 0
+%define CONFIG_ASTREAMSELECT_FILTER 0
+%define CONFIG_ATEMPO_FILTER 0
+%define CONFIG_ATRIM_FILTER 0
+%define CONFIG_AXCORRELATE_FILTER 0
+%define CONFIG_AZMQ_FILTER 0
+%define CONFIG_BANDPASS_FILTER 0
+%define CONFIG_BANDREJECT_FILTER 0
+%define CONFIG_BASS_FILTER 0
+%define CONFIG_BIQUAD_FILTER 0
+%define CONFIG_BS2B_FILTER 0
+%define CONFIG_CHROMABER_VULKAN_FILTER 0
+%define CONFIG_CHANNELMAP_FILTER 0
+%define CONFIG_CHANNELSPLIT_FILTER 0
+%define CONFIG_CHORUS_FILTER 0
+%define CONFIG_COMPAND_FILTER 0
+%define CONFIG_COMPENSATIONDELAY_FILTER 0
+%define CONFIG_CROSSFEED_FILTER 0
+%define CONFIG_CRYSTALIZER_FILTER 0
+%define CONFIG_DCSHIFT_FILTER 0
+%define CONFIG_DEESSER_FILTER 0
+%define CONFIG_DRMETER_FILTER 0
+%define CONFIG_DYNAUDNORM_FILTER 0
+%define CONFIG_EARWAX_FILTER 0
+%define CONFIG_EBUR128_FILTER 0
+%define CONFIG_EQUALIZER_FILTER 0
+%define CONFIG_EXTRASTEREO_FILTER 0
+%define CONFIG_FIREQUALIZER_FILTER 0
+%define CONFIG_FLANGER_FILTER 0
+%define CONFIG_HAAS_FILTER 0
+%define CONFIG_HDCD_FILTER 0
+%define CONFIG_HEADPHONE_FILTER 0
+%define CONFIG_HIGHPASS_FILTER 0
+%define CONFIG_HIGHSHELF_FILTER 0
+%define CONFIG_JOIN_FILTER 0
+%define CONFIG_LADSPA_FILTER 0
+%define CONFIG_LOUDNORM_FILTER 0
+%define CONFIG_LOWPASS_FILTER 0
+%define CONFIG_LOWSHELF_FILTER 0
+%define CONFIG_LV2_FILTER 0
+%define CONFIG_MCOMPAND_FILTER 0
+%define CONFIG_PAN_FILTER 0
+%define CONFIG_REPLAYGAIN_FILTER 0
+%define CONFIG_RESAMPLE_FILTER 0
+%define CONFIG_RUBBERBAND_FILTER 0
+%define CONFIG_SIDECHAINCOMPRESS_FILTER 0
+%define CONFIG_SIDECHAINGATE_FILTER 0
+%define CONFIG_SILENCEDETECT_FILTER 0
+%define CONFIG_SILENCEREMOVE_FILTER 0
+%define CONFIG_SOFALIZER_FILTER 0
+%define CONFIG_STEREOTOOLS_FILTER 0
+%define CONFIG_STEREOWIDEN_FILTER 0
+%define CONFIG_SUPEREQUALIZER_FILTER 0
+%define CONFIG_SURROUND_FILTER 0
+%define CONFIG_TREBLE_FILTER 0
+%define CONFIG_TREMOLO_FILTER 0
+%define CONFIG_VIBRATO_FILTER 0
+%define CONFIG_VOLUME_FILTER 0
+%define CONFIG_VOLUMEDETECT_FILTER 0
+%define CONFIG_AEVALSRC_FILTER 0
+%define CONFIG_AFIRSRC_FILTER 0
+%define CONFIG_ANOISESRC_FILTER 0
+%define CONFIG_ANULLSRC_FILTER 0
+%define CONFIG_FLITE_FILTER 0
+%define CONFIG_HILBERT_FILTER 0
+%define CONFIG_SINC_FILTER 0
+%define CONFIG_SINE_FILTER 0
+%define CONFIG_ANULLSINK_FILTER 0
+%define CONFIG_ADDROI_FILTER 0
+%define CONFIG_ALPHAEXTRACT_FILTER 0
+%define CONFIG_ALPHAMERGE_FILTER 0
+%define CONFIG_AMPLIFY_FILTER 0
+%define CONFIG_ASS_FILTER 0
+%define CONFIG_ATADENOISE_FILTER 0
+%define CONFIG_AVGBLUR_FILTER 0
+%define CONFIG_AVGBLUR_OPENCL_FILTER 0
+%define CONFIG_AVGBLUR_VULKAN_FILTER 0
+%define CONFIG_BBOX_FILTER 0
+%define CONFIG_BENCH_FILTER 0
+%define CONFIG_BILATERAL_FILTER 0
+%define CONFIG_BITPLANENOISE_FILTER 0
+%define CONFIG_BLACKDETECT_FILTER 0
+%define CONFIG_BLACKFRAME_FILTER 0
+%define CONFIG_BLEND_FILTER 0
+%define CONFIG_BM3D_FILTER 0
+%define CONFIG_BOXBLUR_FILTER 0
+%define CONFIG_BOXBLUR_OPENCL_FILTER 0
+%define CONFIG_BWDIF_FILTER 0
+%define CONFIG_CAS_FILTER 0
+%define CONFIG_CHROMAHOLD_FILTER 0
+%define CONFIG_CHROMAKEY_FILTER 0
+%define CONFIG_CHROMASHIFT_FILTER 0
+%define CONFIG_CIESCOPE_FILTER 0
+%define CONFIG_CODECVIEW_FILTER 0
+%define CONFIG_COLORBALANCE_FILTER 0
+%define CONFIG_COLORCHANNELMIXER_FILTER 0
+%define CONFIG_COLORKEY_FILTER 0
+%define CONFIG_COLORKEY_OPENCL_FILTER 0
+%define CONFIG_COLORHOLD_FILTER 0
+%define CONFIG_COLORLEVELS_FILTER 0
+%define CONFIG_COLORMATRIX_FILTER 0
+%define CONFIG_COLORSPACE_FILTER 0
+%define CONFIG_CONVOLUTION_FILTER 0
+%define CONFIG_CONVOLUTION_OPENCL_FILTER 0
+%define CONFIG_CONVOLVE_FILTER 0
+%define CONFIG_COPY_FILTER 0
+%define CONFIG_COREIMAGE_FILTER 0
+%define CONFIG_COVER_RECT_FILTER 0
+%define CONFIG_CROP_FILTER 0
+%define CONFIG_CROPDETECT_FILTER 0
+%define CONFIG_CUE_FILTER 0
+%define CONFIG_CURVES_FILTER 0
+%define CONFIG_DATASCOPE_FILTER 0
+%define CONFIG_DCTDNOIZ_FILTER 0
+%define CONFIG_DEBAND_FILTER 0
+%define CONFIG_DEBLOCK_FILTER 0
+%define CONFIG_DECIMATE_FILTER 0
+%define CONFIG_DECONVOLVE_FILTER 0
+%define CONFIG_DEDOT_FILTER 0
+%define CONFIG_DEFLATE_FILTER 0
+%define CONFIG_DEFLICKER_FILTER 0
+%define CONFIG_DEINTERLACE_QSV_FILTER 0
+%define CONFIG_DEINTERLACE_VAAPI_FILTER 0
+%define CONFIG_DEJUDDER_FILTER 0
+%define CONFIG_DELOGO_FILTER 0
+%define CONFIG_DENOISE_VAAPI_FILTER 0
+%define CONFIG_DERAIN_FILTER 0
+%define CONFIG_DESHAKE_FILTER 0
+%define CONFIG_DESHAKE_OPENCL_FILTER 0
+%define CONFIG_DESPILL_FILTER 0
+%define CONFIG_DETELECINE_FILTER 0
+%define CONFIG_DILATION_FILTER 0
+%define CONFIG_DILATION_OPENCL_FILTER 0
+%define CONFIG_DISPLACE_FILTER 0
+%define CONFIG_DNN_PROCESSING_FILTER 0
+%define CONFIG_DOUBLEWEAVE_FILTER 0
+%define CONFIG_DRAWBOX_FILTER 0
+%define CONFIG_DRAWGRAPH_FILTER 0
+%define CONFIG_DRAWGRID_FILTER 0
+%define CONFIG_DRAWTEXT_FILTER 0
+%define CONFIG_EDGEDETECT_FILTER 0
+%define CONFIG_ELBG_FILTER 0
+%define CONFIG_ENTROPY_FILTER 0
+%define CONFIG_EQ_FILTER 0
+%define CONFIG_EROSION_FILTER 0
+%define CONFIG_EROSION_OPENCL_FILTER 0
+%define CONFIG_EXTRACTPLANES_FILTER 0
+%define CONFIG_FADE_FILTER 0
+%define CONFIG_FFTDNOIZ_FILTER 0
+%define CONFIG_FFTFILT_FILTER 0
+%define CONFIG_FIELD_FILTER 0
+%define CONFIG_FIELDHINT_FILTER 0
+%define CONFIG_FIELDMATCH_FILTER 0
+%define CONFIG_FIELDORDER_FILTER 0
+%define CONFIG_FILLBORDERS_FILTER 0
+%define CONFIG_FIND_RECT_FILTER 0
+%define CONFIG_FLOODFILL_FILTER 0
+%define CONFIG_FORMAT_FILTER 0
+%define CONFIG_FPS_FILTER 0
+%define CONFIG_FRAMEPACK_FILTER 0
+%define CONFIG_FRAMERATE_FILTER 0
+%define CONFIG_FRAMESTEP_FILTER 0
+%define CONFIG_FREEZEDETECT_FILTER 0
+%define CONFIG_FREEZEFRAMES_FILTER 0
+%define CONFIG_FREI0R_FILTER 0
+%define CONFIG_FSPP_FILTER 0
+%define CONFIG_GBLUR_FILTER 0
+%define CONFIG_GEQ_FILTER 0
+%define CONFIG_GRADFUN_FILTER 0
+%define CONFIG_GRAPHMONITOR_FILTER 0
+%define CONFIG_GREYEDGE_FILTER 0
+%define CONFIG_HALDCLUT_FILTER 0
+%define CONFIG_HFLIP_FILTER 0
+%define CONFIG_HISTEQ_FILTER 0
+%define CONFIG_HISTOGRAM_FILTER 0
+%define CONFIG_HQDN3D_FILTER 0
+%define CONFIG_HQX_FILTER 0
+%define CONFIG_HSTACK_FILTER 0
+%define CONFIG_HUE_FILTER 0
+%define CONFIG_HWDOWNLOAD_FILTER 0
+%define CONFIG_HWMAP_FILTER 0
+%define CONFIG_HWUPLOAD_FILTER 0
+%define CONFIG_HWUPLOAD_CUDA_FILTER 0
+%define CONFIG_HYSTERESIS_FILTER 0
+%define CONFIG_IDET_FILTER 0
+%define CONFIG_IL_FILTER 0
+%define CONFIG_INFLATE_FILTER 0
+%define CONFIG_INTERLACE_FILTER 0
+%define CONFIG_INTERLEAVE_FILTER 0
+%define CONFIG_KERNDEINT_FILTER 0
+%define CONFIG_LAGFUN_FILTER 0
+%define CONFIG_LENSCORRECTION_FILTER 0
+%define CONFIG_LENSFUN_FILTER 0
+%define CONFIG_LIBVMAF_FILTER 0
+%define CONFIG_LIMITER_FILTER 0
+%define CONFIG_LOOP_FILTER 0
+%define CONFIG_LUMAKEY_FILTER 0
+%define CONFIG_LUT_FILTER 0
+%define CONFIG_LUT1D_FILTER 0
+%define CONFIG_LUT2_FILTER 0
+%define CONFIG_LUT3D_FILTER 0
+%define CONFIG_LUTRGB_FILTER 0
+%define CONFIG_LUTYUV_FILTER 0
+%define CONFIG_MASKEDCLAMP_FILTER 0
+%define CONFIG_MASKEDMAX_FILTER 0
+%define CONFIG_MASKEDMERGE_FILTER 0
+%define CONFIG_MASKEDMIN_FILTER 0
+%define CONFIG_MASKEDTHRESHOLD_FILTER 0
+%define CONFIG_MASKFUN_FILTER 0
+%define CONFIG_MCDEINT_FILTER 0
+%define CONFIG_MEDIAN_FILTER 0
+%define CONFIG_MERGEPLANES_FILTER 0
+%define CONFIG_MESTIMATE_FILTER 0
+%define CONFIG_METADATA_FILTER 0
+%define CONFIG_MIDEQUALIZER_FILTER 0
+%define CONFIG_MINTERPOLATE_FILTER 0
+%define CONFIG_MIX_FILTER 0
+%define CONFIG_MPDECIMATE_FILTER 0
+%define CONFIG_NEGATE_FILTER 0
+%define CONFIG_NLMEANS_FILTER 0
+%define CONFIG_NLMEANS_OPENCL_FILTER 0
+%define CONFIG_NNEDI_FILTER 0
+%define CONFIG_NOFORMAT_FILTER 0
+%define CONFIG_NOISE_FILTER 0
+%define CONFIG_NORMALIZE_FILTER 0
+%define CONFIG_NULL_FILTER 0
+%define CONFIG_OCR_FILTER 0
+%define CONFIG_OCV_FILTER 0
+%define CONFIG_OSCILLOSCOPE_FILTER 0
+%define CONFIG_OVERLAY_FILTER 0
+%define CONFIG_OVERLAY_OPENCL_FILTER 0
+%define CONFIG_OVERLAY_QSV_FILTER 0
+%define CONFIG_OVERLAY_VULKAN_FILTER 0
+%define CONFIG_OVERLAY_CUDA_FILTER 0
+%define CONFIG_OWDENOISE_FILTER 0
+%define CONFIG_PAD_FILTER 0
+%define CONFIG_PAD_OPENCL_FILTER 0
+%define CONFIG_PALETTEGEN_FILTER 0
+%define CONFIG_PALETTEUSE_FILTER 0
+%define CONFIG_PERMS_FILTER 0
+%define CONFIG_PERSPECTIVE_FILTER 0
+%define CONFIG_PHASE_FILTER 0
+%define CONFIG_PHOTOSENSITIVITY_FILTER 0
+%define CONFIG_PIXDESCTEST_FILTER 0
+%define CONFIG_PIXSCOPE_FILTER 0
+%define CONFIG_PP_FILTER 0
+%define CONFIG_PP7_FILTER 0
+%define CONFIG_PREMULTIPLY_FILTER 0
+%define CONFIG_PREWITT_FILTER 0
+%define CONFIG_PREWITT_OPENCL_FILTER 0
+%define CONFIG_PROCAMP_VAAPI_FILTER 0
+%define CONFIG_PROGRAM_OPENCL_FILTER 0
+%define CONFIG_PSEUDOCOLOR_FILTER 0
+%define CONFIG_PSNR_FILTER 0
+%define CONFIG_PULLUP_FILTER 0
+%define CONFIG_QP_FILTER 0
+%define CONFIG_RANDOM_FILTER 0
+%define CONFIG_READEIA608_FILTER 0
+%define CONFIG_READVITC_FILTER 0
+%define CONFIG_REALTIME_FILTER 0
+%define CONFIG_REMAP_FILTER 0
+%define CONFIG_REMOVEGRAIN_FILTER 0
+%define CONFIG_REMOVELOGO_FILTER 0
+%define CONFIG_REPEATFIELDS_FILTER 0
+%define CONFIG_REVERSE_FILTER 0
+%define CONFIG_RGBASHIFT_FILTER 0
+%define CONFIG_ROBERTS_FILTER 0
+%define CONFIG_ROBERTS_OPENCL_FILTER 0
+%define CONFIG_ROTATE_FILTER 0
+%define CONFIG_SAB_FILTER 0
+%define CONFIG_SCALE_FILTER 0
+%define CONFIG_SCALE_CUDA_FILTER 0
+%define CONFIG_SCALE_NPP_FILTER 0
+%define CONFIG_SCALE_QSV_FILTER 0
+%define CONFIG_SCALE_VAAPI_FILTER 0
+%define CONFIG_SCALE_VULKAN_FILTER 0
+%define CONFIG_SCALE2REF_FILTER 0
+%define CONFIG_SCROLL_FILTER 0
+%define CONFIG_SELECT_FILTER 0
+%define CONFIG_SELECTIVECOLOR_FILTER 0
+%define CONFIG_SENDCMD_FILTER 0
+%define CONFIG_SEPARATEFIELDS_FILTER 0
+%define CONFIG_SETDAR_FILTER 0
+%define CONFIG_SETFIELD_FILTER 0
+%define CONFIG_SETPARAMS_FILTER 0
+%define CONFIG_SETPTS_FILTER 0
+%define CONFIG_SETRANGE_FILTER 0
+%define CONFIG_SETSAR_FILTER 0
+%define CONFIG_SETTB_FILTER 0
+%define CONFIG_SHARPNESS_VAAPI_FILTER 0
+%define CONFIG_SHOWINFO_FILTER 0
+%define CONFIG_SHOWPALETTE_FILTER 0
+%define CONFIG_SHUFFLEFRAMES_FILTER 0
+%define CONFIG_SHUFFLEPLANES_FILTER 0
+%define CONFIG_SIDEDATA_FILTER 0
+%define CONFIG_SIGNALSTATS_FILTER 0
+%define CONFIG_SIGNATURE_FILTER 0
+%define CONFIG_SMARTBLUR_FILTER 0
+%define CONFIG_SOBEL_FILTER 0
+%define CONFIG_SOBEL_OPENCL_FILTER 0
+%define CONFIG_SPLIT_FILTER 0
+%define CONFIG_SPP_FILTER 0
+%define CONFIG_SR_FILTER 0
+%define CONFIG_SSIM_FILTER 0
+%define CONFIG_STEREO3D_FILTER 0
+%define CONFIG_STREAMSELECT_FILTER 0
+%define CONFIG_SUBTITLES_FILTER 0
+%define CONFIG_SUPER2XSAI_FILTER 0
+%define CONFIG_SWAPRECT_FILTER 0
+%define CONFIG_SWAPUV_FILTER 0
+%define CONFIG_TBLEND_FILTER 0
+%define CONFIG_TELECINE_FILTER 0
+%define CONFIG_THISTOGRAM_FILTER 0
+%define CONFIG_THRESHOLD_FILTER 0
+%define CONFIG_THUMBNAIL_FILTER 0
+%define CONFIG_THUMBNAIL_CUDA_FILTER 0
+%define CONFIG_TILE_FILTER 0
+%define CONFIG_TINTERLACE_FILTER 0
+%define CONFIG_TLUT2_FILTER 0
+%define CONFIG_TMEDIAN_FILTER 0
+%define CONFIG_TMIX_FILTER 0
+%define CONFIG_TONEMAP_FILTER 0
+%define CONFIG_TONEMAP_OPENCL_FILTER 0
+%define CONFIG_TONEMAP_VAAPI_FILTER 0
+%define CONFIG_TPAD_FILTER 0
+%define CONFIG_TRANSPOSE_FILTER 0
+%define CONFIG_TRANSPOSE_NPP_FILTER 0
+%define CONFIG_TRANSPOSE_OPENCL_FILTER 0
+%define CONFIG_TRANSPOSE_VAAPI_FILTER 0
+%define CONFIG_TRIM_FILTER 0
+%define CONFIG_UNPREMULTIPLY_FILTER 0
+%define CONFIG_UNSHARP_FILTER 0
+%define CONFIG_UNSHARP_OPENCL_FILTER 0
+%define CONFIG_USPP_FILTER 0
+%define CONFIG_V360_FILTER 0
+%define CONFIG_VAGUEDENOISER_FILTER 0
+%define CONFIG_VECTORSCOPE_FILTER 0
+%define CONFIG_VFLIP_FILTER 0
+%define CONFIG_VFRDET_FILTER 0
+%define CONFIG_VIBRANCE_FILTER 0
+%define CONFIG_VIDSTABDETECT_FILTER 0
+%define CONFIG_VIDSTABTRANSFORM_FILTER 0
+%define CONFIG_VIGNETTE_FILTER 0
+%define CONFIG_VMAFMOTION_FILTER 0
+%define CONFIG_VPP_QSV_FILTER 0
+%define CONFIG_VSTACK_FILTER 0
+%define CONFIG_W3FDIF_FILTER 0
+%define CONFIG_WAVEFORM_FILTER 0
+%define CONFIG_WEAVE_FILTER 0
+%define CONFIG_XBR_FILTER 0
+%define CONFIG_XFADE_FILTER 0
+%define CONFIG_XFADE_OPENCL_FILTER 0
+%define CONFIG_XMEDIAN_FILTER 0
+%define CONFIG_XSTACK_FILTER 0
+%define CONFIG_YADIF_FILTER 0
+%define CONFIG_YADIF_CUDA_FILTER 0
+%define CONFIG_YAEPBLUR_FILTER 0
+%define CONFIG_ZMQ_FILTER 0
+%define CONFIG_ZOOMPAN_FILTER 0
+%define CONFIG_ZSCALE_FILTER 0
+%define CONFIG_ALLRGB_FILTER 0
+%define CONFIG_ALLYUV_FILTER 0
+%define CONFIG_CELLAUTO_FILTER 0
+%define CONFIG_COLOR_FILTER 0
+%define CONFIG_COREIMAGESRC_FILTER 0
+%define CONFIG_FREI0R_SRC_FILTER 0
+%define CONFIG_HALDCLUTSRC_FILTER 0
+%define CONFIG_LIFE_FILTER 0
+%define CONFIG_MANDELBROT_FILTER 0
+%define CONFIG_MPTESTSRC_FILTER 0
+%define CONFIG_NULLSRC_FILTER 0
+%define CONFIG_OPENCLSRC_FILTER 0
+%define CONFIG_PAL75BARS_FILTER 0
+%define CONFIG_PAL100BARS_FILTER 0
+%define CONFIG_RGBTESTSRC_FILTER 0
+%define CONFIG_SIERPINSKI_FILTER 0
+%define CONFIG_SMPTEBARS_FILTER 0
+%define CONFIG_SMPTEHDBARS_FILTER 0
+%define CONFIG_TESTSRC_FILTER 0
+%define CONFIG_TESTSRC2_FILTER 0
+%define CONFIG_YUVTESTSRC_FILTER 0
+%define CONFIG_NULLSINK_FILTER 0
+%define CONFIG_ABITSCOPE_FILTER 0
+%define CONFIG_ADRAWGRAPH_FILTER 0
+%define CONFIG_AGRAPHMONITOR_FILTER 0
+%define CONFIG_AHISTOGRAM_FILTER 0
+%define CONFIG_APHASEMETER_FILTER 0
+%define CONFIG_AVECTORSCOPE_FILTER 0
+%define CONFIG_CONCAT_FILTER 0
+%define CONFIG_SHOWCQT_FILTER 0
+%define CONFIG_SHOWFREQS_FILTER 0
+%define CONFIG_SHOWSPATIAL_FILTER 0
+%define CONFIG_SHOWSPECTRUM_FILTER 0
+%define CONFIG_SHOWSPECTRUMPIC_FILTER 0
+%define CONFIG_SHOWVOLUME_FILTER 0
+%define CONFIG_SHOWWAVES_FILTER 0
+%define CONFIG_SHOWWAVESPIC_FILTER 0
+%define CONFIG_SPECTRUMSYNTH_FILTER 0
+%define CONFIG_AMOVIE_FILTER 0
+%define CONFIG_MOVIE_FILTER 0
+%define CONFIG_AFIFO_FILTER 0
+%define CONFIG_FIFO_FILTER 0
+%define CONFIG_AA_DEMUXER 0
+%define CONFIG_AAC_DEMUXER 0
+%define CONFIG_AC3_DEMUXER 0
+%define CONFIG_ACM_DEMUXER 0
+%define CONFIG_ACT_DEMUXER 0
+%define CONFIG_ADF_DEMUXER 0
+%define CONFIG_ADP_DEMUXER 0
+%define CONFIG_ADS_DEMUXER 0
+%define CONFIG_ADX_DEMUXER 0
+%define CONFIG_AEA_DEMUXER 0
+%define CONFIG_AFC_DEMUXER 0
+%define CONFIG_AIFF_DEMUXER 0
+%define CONFIG_AIX_DEMUXER 0
+%define CONFIG_ALP_DEMUXER 0
+%define CONFIG_AMR_DEMUXER 0
+%define CONFIG_AMRNB_DEMUXER 0
+%define CONFIG_AMRWB_DEMUXER 0
+%define CONFIG_ANM_DEMUXER 0
+%define CONFIG_APC_DEMUXER 0
+%define CONFIG_APE_DEMUXER 0
+%define CONFIG_APM_DEMUXER 0
+%define CONFIG_APNG_DEMUXER 0
+%define CONFIG_APTX_DEMUXER 0
+%define CONFIG_APTX_HD_DEMUXER 0
+%define CONFIG_AQTITLE_DEMUXER 0
+%define CONFIG_ARGO_ASF_DEMUXER 0
+%define CONFIG_ASF_DEMUXER 0
+%define CONFIG_ASF_O_DEMUXER 0
+%define CONFIG_ASS_DEMUXER 0
+%define CONFIG_AST_DEMUXER 0
+%define CONFIG_AU_DEMUXER 0
+%define CONFIG_AV1_DEMUXER 0
+%define CONFIG_AVI_DEMUXER 0
+%define CONFIG_AVISYNTH_DEMUXER 0
+%define CONFIG_AVR_DEMUXER 0
+%define CONFIG_AVS_DEMUXER 0
+%define CONFIG_AVS2_DEMUXER 0
+%define CONFIG_BETHSOFTVID_DEMUXER 0
+%define CONFIG_BFI_DEMUXER 0
+%define CONFIG_BINTEXT_DEMUXER 0
+%define CONFIG_BINK_DEMUXER 0
+%define CONFIG_BIT_DEMUXER 0
+%define CONFIG_BMV_DEMUXER 0
+%define CONFIG_BFSTM_DEMUXER 0
+%define CONFIG_BRSTM_DEMUXER 0
+%define CONFIG_BOA_DEMUXER 0
+%define CONFIG_C93_DEMUXER 0
+%define CONFIG_CAF_DEMUXER 0
+%define CONFIG_CAVSVIDEO_DEMUXER 0
+%define CONFIG_CDG_DEMUXER 0
+%define CONFIG_CDXL_DEMUXER 0
+%define CONFIG_CINE_DEMUXER 0
+%define CONFIG_CODEC2_DEMUXER 0
+%define CONFIG_CODEC2RAW_DEMUXER 0
+%define CONFIG_CONCAT_DEMUXER 0
+%define CONFIG_DASH_DEMUXER 0
+%define CONFIG_DATA_DEMUXER 0
+%define CONFIG_DAUD_DEMUXER 0
+%define CONFIG_DCSTR_DEMUXER 0
+%define CONFIG_DERF_DEMUXER 0
+%define CONFIG_DFA_DEMUXER 0
+%define CONFIG_DHAV_DEMUXER 0
+%define CONFIG_DIRAC_DEMUXER 0
+%define CONFIG_DNXHD_DEMUXER 0
+%define CONFIG_DSF_DEMUXER 0
+%define CONFIG_DSICIN_DEMUXER 0
+%define CONFIG_DSS_DEMUXER 0
+%define CONFIG_DTS_DEMUXER 0
+%define CONFIG_DTSHD_DEMUXER 0
+%define CONFIG_DV_DEMUXER 0
+%define CONFIG_DVBSUB_DEMUXER 0
+%define CONFIG_DVBTXT_DEMUXER 0
+%define CONFIG_DXA_DEMUXER 0
+%define CONFIG_EA_DEMUXER 0
+%define CONFIG_EA_CDATA_DEMUXER 0
+%define CONFIG_EAC3_DEMUXER 0
+%define CONFIG_EPAF_DEMUXER 0
+%define CONFIG_FFMETADATA_DEMUXER 0
+%define CONFIG_FILMSTRIP_DEMUXER 0
+%define CONFIG_FITS_DEMUXER 0
+%define CONFIG_FLAC_DEMUXER 1
+%define CONFIG_FLIC_DEMUXER 0
+%define CONFIG_FLV_DEMUXER 0
+%define CONFIG_LIVE_FLV_DEMUXER 0
+%define CONFIG_FOURXM_DEMUXER 0
+%define CONFIG_FRM_DEMUXER 0
+%define CONFIG_FSB_DEMUXER 0
+%define CONFIG_FWSE_DEMUXER 0
+%define CONFIG_G722_DEMUXER 0
+%define CONFIG_G723_1_DEMUXER 0
+%define CONFIG_G726_DEMUXER 0
+%define CONFIG_G726LE_DEMUXER 0
+%define CONFIG_G729_DEMUXER 0
+%define CONFIG_GDV_DEMUXER 0
+%define CONFIG_GENH_DEMUXER 0
+%define CONFIG_GIF_DEMUXER 0
+%define CONFIG_GSM_DEMUXER 0
+%define CONFIG_GXF_DEMUXER 0
+%define CONFIG_H261_DEMUXER 0
+%define CONFIG_H263_DEMUXER 0
+%define CONFIG_H264_DEMUXER 0
+%define CONFIG_HCA_DEMUXER 0
+%define CONFIG_HCOM_DEMUXER 0
+%define CONFIG_HEVC_DEMUXER 0
+%define CONFIG_HLS_DEMUXER 0
+%define CONFIG_HNM_DEMUXER 0
+%define CONFIG_ICO_DEMUXER 0
+%define CONFIG_IDCIN_DEMUXER 0
+%define CONFIG_IDF_DEMUXER 0
+%define CONFIG_IFF_DEMUXER 0
+%define CONFIG_IFV_DEMUXER 0
+%define CONFIG_ILBC_DEMUXER 0
+%define CONFIG_IMAGE2_DEMUXER 0
+%define CONFIG_IMAGE2PIPE_DEMUXER 0
+%define CONFIG_IMAGE2_ALIAS_PIX_DEMUXER 0
+%define CONFIG_IMAGE2_BRENDER_PIX_DEMUXER 0
+%define CONFIG_INGENIENT_DEMUXER 0
+%define CONFIG_IPMOVIE_DEMUXER 0
+%define CONFIG_IRCAM_DEMUXER 0
+%define CONFIG_ISS_DEMUXER 0
+%define CONFIG_IV8_DEMUXER 0
+%define CONFIG_IVF_DEMUXER 0
+%define CONFIG_IVR_DEMUXER 0
+%define CONFIG_JACOSUB_DEMUXER 0
+%define CONFIG_JV_DEMUXER 0
+%define CONFIG_KUX_DEMUXER 0
+%define CONFIG_KVAG_DEMUXER 0
+%define CONFIG_LMLM4_DEMUXER 0
+%define CONFIG_LOAS_DEMUXER 0
+%define CONFIG_LRC_DEMUXER 0
+%define CONFIG_LVF_DEMUXER 0
+%define CONFIG_LXF_DEMUXER 0
+%define CONFIG_M4V_DEMUXER 0
+%define CONFIG_MATROSKA_DEMUXER 1
+%define CONFIG_MGSTS_DEMUXER 0
+%define CONFIG_MICRODVD_DEMUXER 0
+%define CONFIG_MJPEG_DEMUXER 0
+%define CONFIG_MJPEG_2000_DEMUXER 0
+%define CONFIG_MLP_DEMUXER 0
+%define CONFIG_MLV_DEMUXER 0
+%define CONFIG_MM_DEMUXER 0
+%define CONFIG_MMF_DEMUXER 0
+%define CONFIG_MOV_DEMUXER 1
+%define CONFIG_MP3_DEMUXER 1
+%define CONFIG_MPC_DEMUXER 0
+%define CONFIG_MPC8_DEMUXER 0
+%define CONFIG_MPEGPS_DEMUXER 0
+%define CONFIG_MPEGTS_DEMUXER 0
+%define CONFIG_MPEGTSRAW_DEMUXER 0
+%define CONFIG_MPEGVIDEO_DEMUXER 0
+%define CONFIG_MPJPEG_DEMUXER 0
+%define CONFIG_MPL2_DEMUXER 0
+%define CONFIG_MPSUB_DEMUXER 0
+%define CONFIG_MSF_DEMUXER 0
+%define CONFIG_MSNWC_TCP_DEMUXER 0
+%define CONFIG_MTAF_DEMUXER 0
+%define CONFIG_MTV_DEMUXER 0
+%define CONFIG_MUSX_DEMUXER 0
+%define CONFIG_MV_DEMUXER 0
+%define CONFIG_MVI_DEMUXER 0
+%define CONFIG_MXF_DEMUXER 0
+%define CONFIG_MXG_DEMUXER 0
+%define CONFIG_NC_DEMUXER 0
+%define CONFIG_NISTSPHERE_DEMUXER 0
+%define CONFIG_NSP_DEMUXER 0
+%define CONFIG_NSV_DEMUXER 0
+%define CONFIG_NUT_DEMUXER 0
+%define CONFIG_NUV_DEMUXER 0
+%define CONFIG_OGG_DEMUXER 1
+%define CONFIG_OMA_DEMUXER 0
+%define CONFIG_PAF_DEMUXER 0
+%define CONFIG_PCM_ALAW_DEMUXER 0
+%define CONFIG_PCM_MULAW_DEMUXER 0
+%define CONFIG_PCM_VIDC_DEMUXER 0
+%define CONFIG_PCM_F64BE_DEMUXER 0
+%define CONFIG_PCM_F64LE_DEMUXER 0
+%define CONFIG_PCM_F32BE_DEMUXER 0
+%define CONFIG_PCM_F32LE_DEMUXER 0
+%define CONFIG_PCM_S32BE_DEMUXER 0
+%define CONFIG_PCM_S32LE_DEMUXER 0
+%define CONFIG_PCM_S24BE_DEMUXER 0
+%define CONFIG_PCM_S24LE_DEMUXER 0
+%define CONFIG_PCM_S16BE_DEMUXER 0
+%define CONFIG_PCM_S16LE_DEMUXER 0
+%define CONFIG_PCM_S8_DEMUXER 0
+%define CONFIG_PCM_U32BE_DEMUXER 0
+%define CONFIG_PCM_U32LE_DEMUXER 0
+%define CONFIG_PCM_U24BE_DEMUXER 0
+%define CONFIG_PCM_U24LE_DEMUXER 0
+%define CONFIG_PCM_U16BE_DEMUXER 0
+%define CONFIG_PCM_U16LE_DEMUXER 0
+%define CONFIG_PCM_U8_DEMUXER 0
+%define CONFIG_PJS_DEMUXER 0
+%define CONFIG_PMP_DEMUXER 0
+%define CONFIG_PVA_DEMUXER 0
+%define CONFIG_PVF_DEMUXER 0
+%define CONFIG_QCP_DEMUXER 0
+%define CONFIG_R3D_DEMUXER 0
+%define CONFIG_RAWVIDEO_DEMUXER 0
+%define CONFIG_REALTEXT_DEMUXER 0
+%define CONFIG_REDSPARK_DEMUXER 0
+%define CONFIG_RL2_DEMUXER 0
+%define CONFIG_RM_DEMUXER 0
+%define CONFIG_ROQ_DEMUXER 0
+%define CONFIG_RPL_DEMUXER 0
+%define CONFIG_RSD_DEMUXER 0
+%define CONFIG_RSO_DEMUXER 0
+%define CONFIG_RTP_DEMUXER 0
+%define CONFIG_RTSP_DEMUXER 0
+%define CONFIG_S337M_DEMUXER 0
+%define CONFIG_SAMI_DEMUXER 0
+%define CONFIG_SAP_DEMUXER 0
+%define CONFIG_SBC_DEMUXER 0
+%define CONFIG_SBG_DEMUXER 0
+%define CONFIG_SCC_DEMUXER 0
+%define CONFIG_SDP_DEMUXER 0
+%define CONFIG_SDR2_DEMUXER 0
+%define CONFIG_SDS_DEMUXER 0
+%define CONFIG_SDX_DEMUXER 0
+%define CONFIG_SEGAFILM_DEMUXER 0
+%define CONFIG_SER_DEMUXER 0
+%define CONFIG_SHORTEN_DEMUXER 0
+%define CONFIG_SIFF_DEMUXER 0
+%define CONFIG_SLN_DEMUXER 0
+%define CONFIG_SMACKER_DEMUXER 0
+%define CONFIG_SMJPEG_DEMUXER 0
+%define CONFIG_SMUSH_DEMUXER 0
+%define CONFIG_SOL_DEMUXER 0
+%define CONFIG_SOX_DEMUXER 0
+%define CONFIG_SPDIF_DEMUXER 0
+%define CONFIG_SRT_DEMUXER 0
+%define CONFIG_STR_DEMUXER 0
+%define CONFIG_STL_DEMUXER 0
+%define CONFIG_SUBVIEWER1_DEMUXER 0
+%define CONFIG_SUBVIEWER_DEMUXER 0
+%define CONFIG_SUP_DEMUXER 0
+%define CONFIG_SVAG_DEMUXER 0
+%define CONFIG_SWF_DEMUXER 0
+%define CONFIG_TAK_DEMUXER 0
+%define CONFIG_TEDCAPTIONS_DEMUXER 0
+%define CONFIG_THP_DEMUXER 0
+%define CONFIG_THREEDOSTR_DEMUXER 0
+%define CONFIG_TIERTEXSEQ_DEMUXER 0
+%define CONFIG_TMV_DEMUXER 0
+%define CONFIG_TRUEHD_DEMUXER 0
+%define CONFIG_TTA_DEMUXER 0
+%define CONFIG_TXD_DEMUXER 0
+%define CONFIG_TTY_DEMUXER 0
+%define CONFIG_TY_DEMUXER 0
+%define CONFIG_V210_DEMUXER 0
+%define CONFIG_V210X_DEMUXER 0
+%define CONFIG_VAG_DEMUXER 0
+%define CONFIG_VC1_DEMUXER 0
+%define CONFIG_VC1T_DEMUXER 0
+%define CONFIG_VIVIDAS_DEMUXER 0
+%define CONFIG_VIVO_DEMUXER 0
+%define CONFIG_VMD_DEMUXER 0
+%define CONFIG_VOBSUB_DEMUXER 0
+%define CONFIG_VOC_DEMUXER 0
+%define CONFIG_VPK_DEMUXER 0
+%define CONFIG_VPLAYER_DEMUXER 0
+%define CONFIG_VQF_DEMUXER 0
+%define CONFIG_W64_DEMUXER 0
+%define CONFIG_WAV_DEMUXER 1
+%define CONFIG_WC3_DEMUXER 0
+%define CONFIG_WEBM_DASH_MANIFEST_DEMUXER 0
+%define CONFIG_WEBVTT_DEMUXER 0
+%define CONFIG_WSAUD_DEMUXER 0
+%define CONFIG_WSD_DEMUXER 0
+%define CONFIG_WSVQA_DEMUXER 0
+%define CONFIG_WTV_DEMUXER 0
+%define CONFIG_WVE_DEMUXER 0
+%define CONFIG_WV_DEMUXER 0
+%define CONFIG_XA_DEMUXER 0
+%define CONFIG_XBIN_DEMUXER 0
+%define CONFIG_XMV_DEMUXER 0
+%define CONFIG_XVAG_DEMUXER 0
+%define CONFIG_XWMA_DEMUXER 0
+%define CONFIG_YOP_DEMUXER 0
+%define CONFIG_YUV4MPEGPIPE_DEMUXER 0
+%define CONFIG_IMAGE_BMP_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_DDS_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_DPX_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_EXR_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_GIF_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_J2K_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_JPEG_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_JPEGLS_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_PAM_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_PBM_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_PCX_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_PGMYUV_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_PGM_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_PICTOR_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_PNG_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_PPM_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_PSD_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_QDRAW_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_SGI_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_SVG_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_SUNRAST_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_TIFF_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_WEBP_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_XPM_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_XWD_PIPE_DEMUXER 0
+%define CONFIG_LIBGME_DEMUXER 0
+%define CONFIG_LIBMODPLUG_DEMUXER 0
+%define CONFIG_LIBOPENMPT_DEMUXER 0
+%define CONFIG_VAPOURSYNTH_DEMUXER 0
+%define CONFIG_A64_MUXER 0
+%define CONFIG_AC3_MUXER 0
+%define CONFIG_ADTS_MUXER 0
+%define CONFIG_ADX_MUXER 0
+%define CONFIG_AIFF_MUXER 0
+%define CONFIG_AMR_MUXER 0
+%define CONFIG_APNG_MUXER 0
+%define CONFIG_APTX_MUXER 0
+%define CONFIG_APTX_HD_MUXER 0
+%define CONFIG_ASF_MUXER 0
+%define CONFIG_ASS_MUXER 0
+%define CONFIG_AST_MUXER 0
+%define CONFIG_ASF_STREAM_MUXER 0
+%define CONFIG_AU_MUXER 0
+%define CONFIG_AVI_MUXER 0
+%define CONFIG_AVM2_MUXER 0
+%define CONFIG_AVS2_MUXER 0
+%define CONFIG_BIT_MUXER 0
+%define CONFIG_CAF_MUXER 0
+%define CONFIG_CAVSVIDEO_MUXER 0
+%define CONFIG_CODEC2_MUXER 0
+%define CONFIG_CODEC2RAW_MUXER 0
+%define CONFIG_CRC_MUXER 0
+%define CONFIG_DASH_MUXER 0
+%define CONFIG_DATA_MUXER 0
+%define CONFIG_DAUD_MUXER 0
+%define CONFIG_DIRAC_MUXER 0
+%define CONFIG_DNXHD_MUXER 0
+%define CONFIG_DTS_MUXER 0
+%define CONFIG_DV_MUXER 0
+%define CONFIG_EAC3_MUXER 0
+%define CONFIG_F4V_MUXER 0
+%define CONFIG_FFMETADATA_MUXER 0
+%define CONFIG_FIFO_MUXER 0
+%define CONFIG_FIFO_TEST_MUXER 0
+%define CONFIG_FILMSTRIP_MUXER 0
+%define CONFIG_FITS_MUXER 0
+%define CONFIG_FLAC_MUXER 0
+%define CONFIG_FLV_MUXER 0
+%define CONFIG_FRAMECRC_MUXER 0
+%define CONFIG_FRAMEHASH_MUXER 0
+%define CONFIG_FRAMEMD5_MUXER 0
+%define CONFIG_G722_MUXER 0
+%define CONFIG_G723_1_MUXER 0
+%define CONFIG_G726_MUXER 0
+%define CONFIG_G726LE_MUXER 0
+%define CONFIG_GIF_MUXER 0
+%define CONFIG_GSM_MUXER 0
+%define CONFIG_GXF_MUXER 0
+%define CONFIG_H261_MUXER 0
+%define CONFIG_H263_MUXER 0
+%define CONFIG_H264_MUXER 0
+%define CONFIG_HASH_MUXER 0
+%define CONFIG_HDS_MUXER 0
+%define CONFIG_HEVC_MUXER 0
+%define CONFIG_HLS_MUXER 0
+%define CONFIG_ICO_MUXER 0
+%define CONFIG_ILBC_MUXER 0
+%define CONFIG_IMAGE2_MUXER 0
+%define CONFIG_IMAGE2PIPE_MUXER 0
+%define CONFIG_IPOD_MUXER 0
+%define CONFIG_IRCAM_MUXER 0
+%define CONFIG_ISMV_MUXER 0
+%define CONFIG_IVF_MUXER 0
+%define CONFIG_JACOSUB_MUXER 0
+%define CONFIG_LATM_MUXER 0
+%define CONFIG_LRC_MUXER 0
+%define CONFIG_M4V_MUXER 0
+%define CONFIG_MD5_MUXER 0
+%define CONFIG_MATROSKA_MUXER 0
+%define CONFIG_MATROSKA_AUDIO_MUXER 0
+%define CONFIG_MICRODVD_MUXER 0
+%define CONFIG_MJPEG_MUXER 0
+%define CONFIG_MLP_MUXER 0
+%define CONFIG_MMF_MUXER 0
+%define CONFIG_MOV_MUXER 0
+%define CONFIG_MP2_MUXER 0
+%define CONFIG_MP3_MUXER 0
+%define CONFIG_MP4_MUXER 0
+%define CONFIG_MPEG1SYSTEM_MUXER 0
+%define CONFIG_MPEG1VCD_MUXER 0
+%define CONFIG_MPEG1VIDEO_MUXER 0
+%define CONFIG_MPEG2DVD_MUXER 0
+%define CONFIG_MPEG2SVCD_MUXER 0
+%define CONFIG_MPEG2VIDEO_MUXER 0
+%define CONFIG_MPEG2VOB_MUXER 0
+%define CONFIG_MPEGTS_MUXER 0
+%define CONFIG_MPJPEG_MUXER 0
+%define CONFIG_MXF_MUXER 0
+%define CONFIG_MXF_D10_MUXER 0
+%define CONFIG_MXF_OPATOM_MUXER 0
+%define CONFIG_NULL_MUXER 0
+%define CONFIG_NUT_MUXER 0
+%define CONFIG_OGA_MUXER 0
+%define CONFIG_OGG_MUXER 0
+%define CONFIG_OGV_MUXER 0
+%define CONFIG_OMA_MUXER 0
+%define CONFIG_OPUS_MUXER 0
+%define CONFIG_PCM_ALAW_MUXER 0
+%define CONFIG_PCM_MULAW_MUXER 0
+%define CONFIG_PCM_VIDC_MUXER 0
+%define CONFIG_PCM_F64BE_MUXER 0
+%define CONFIG_PCM_F64LE_MUXER 0
+%define CONFIG_PCM_F32BE_MUXER 0
+%define CONFIG_PCM_F32LE_MUXER 0
+%define CONFIG_PCM_S32BE_MUXER 0
+%define CONFIG_PCM_S32LE_MUXER 0
+%define CONFIG_PCM_S24BE_MUXER 0
+%define CONFIG_PCM_S24LE_MUXER 0
+%define CONFIG_PCM_S16BE_MUXER 0
+%define CONFIG_PCM_S16LE_MUXER 0
+%define CONFIG_PCM_S8_MUXER 0
+%define CONFIG_PCM_U32BE_MUXER 0
+%define CONFIG_PCM_U32LE_MUXER 0
+%define CONFIG_PCM_U24BE_MUXER 0
+%define CONFIG_PCM_U24LE_MUXER 0
+%define CONFIG_PCM_U16BE_MUXER 0
+%define CONFIG_PCM_U16LE_MUXER 0
+%define CONFIG_PCM_U8_MUXER 0
+%define CONFIG_PSP_MUXER 0
+%define CONFIG_RAWVIDEO_MUXER 0
+%define CONFIG_RM_MUXER 0
+%define CONFIG_ROQ_MUXER 0
+%define CONFIG_RSO_MUXER 0
+%define CONFIG_RTP_MUXER 0
+%define CONFIG_RTP_MPEGTS_MUXER 0
+%define CONFIG_RTSP_MUXER 0
+%define CONFIG_SAP_MUXER 0
+%define CONFIG_SBC_MUXER 0
+%define CONFIG_SCC_MUXER 0
+%define CONFIG_SEGAFILM_MUXER 0
+%define CONFIG_SEGMENT_MUXER 0
+%define CONFIG_STREAM_SEGMENT_MUXER 0
+%define CONFIG_SINGLEJPEG_MUXER 0
+%define CONFIG_SMJPEG_MUXER 0
+%define CONFIG_SMOOTHSTREAMING_MUXER 0
+%define CONFIG_SOX_MUXER 0
+%define CONFIG_SPX_MUXER 0
+%define CONFIG_SPDIF_MUXER 0
+%define CONFIG_SRT_MUXER 0
+%define CONFIG_STREAMHASH_MUXER 0
+%define CONFIG_SUP_MUXER 0
+%define CONFIG_SWF_MUXER 0
+%define CONFIG_TEE_MUXER 0
+%define CONFIG_TG2_MUXER 0
+%define CONFIG_TGP_MUXER 0
+%define CONFIG_MKVTIMESTAMP_V2_MUXER 0
+%define CONFIG_TRUEHD_MUXER 0
+%define CONFIG_TTA_MUXER 0
+%define CONFIG_UNCODEDFRAMECRC_MUXER 0
+%define CONFIG_VC1_MUXER 0
+%define CONFIG_VC1T_MUXER 0
+%define CONFIG_VOC_MUXER 0
+%define CONFIG_W64_MUXER 0
+%define CONFIG_WAV_MUXER 0
+%define CONFIG_WEBM_MUXER 0
+%define CONFIG_WEBM_DASH_MANIFEST_MUXER 0
+%define CONFIG_WEBM_CHUNK_MUXER 0
+%define CONFIG_WEBP_MUXER 0
+%define CONFIG_WEBVTT_MUXER 0
+%define CONFIG_WTV_MUXER 0
+%define CONFIG_WV_MUXER 0
+%define CONFIG_YUV4MPEGPIPE_MUXER 0
+%define CONFIG_CHROMAPRINT_MUXER 0
+%define CONFIG_ASYNC_PROTOCOL 0
+%define CONFIG_BLURAY_PROTOCOL 0
+%define CONFIG_CACHE_PROTOCOL 0
+%define CONFIG_CONCAT_PROTOCOL 0
+%define CONFIG_CRYPTO_PROTOCOL 0
+%define CONFIG_DATA_PROTOCOL 0
+%define CONFIG_FFRTMPCRYPT_PROTOCOL 0
+%define CONFIG_FFRTMPHTTP_PROTOCOL 0
+%define CONFIG_FILE_PROTOCOL 0
+%define CONFIG_FTP_PROTOCOL 0
+%define CONFIG_GOPHER_PROTOCOL 0
+%define CONFIG_HLS_PROTOCOL 0
+%define CONFIG_HTTP_PROTOCOL 0
+%define CONFIG_HTTPPROXY_PROTOCOL 0
+%define CONFIG_HTTPS_PROTOCOL 0
+%define CONFIG_ICECAST_PROTOCOL 0
+%define CONFIG_MMSH_PROTOCOL 0
+%define CONFIG_MMST_PROTOCOL 0
+%define CONFIG_MD5_PROTOCOL 0
+%define CONFIG_PIPE_PROTOCOL 0
+%define CONFIG_PROMPEG_PROTOCOL 0
+%define CONFIG_RTMP_PROTOCOL 0
+%define CONFIG_RTMPE_PROTOCOL 0
+%define CONFIG_RTMPS_PROTOCOL 0
+%define CONFIG_RTMPT_PROTOCOL 0
+%define CONFIG_RTMPTE_PROTOCOL 0
+%define CONFIG_RTMPTS_PROTOCOL 0
+%define CONFIG_RTP_PROTOCOL 0
+%define CONFIG_SCTP_PROTOCOL 0
+%define CONFIG_SRTP_PROTOCOL 0
+%define CONFIG_SUBFILE_PROTOCOL 0
+%define CONFIG_TEE_PROTOCOL 0
+%define CONFIG_TCP_PROTOCOL 0
+%define CONFIG_TLS_PROTOCOL 0
+%define CONFIG_UDP_PROTOCOL 0
+%define CONFIG_UDPLITE_PROTOCOL 0
+%define CONFIG_UNIX_PROTOCOL 0
+%define CONFIG_LIBAMQP_PROTOCOL 0
+%define CONFIG_LIBRTMP_PROTOCOL 0
+%define CONFIG_LIBRTMPE_PROTOCOL 0
+%define CONFIG_LIBRTMPS_PROTOCOL 0
+%define CONFIG_LIBRTMPT_PROTOCOL 0
+%define CONFIG_LIBRTMPTE_PROTOCOL 0
+%define CONFIG_LIBSRT_PROTOCOL 0
+%define CONFIG_LIBSSH_PROTOCOL 0
+%define CONFIG_LIBSMBCLIENT_PROTOCOL 0
+%define CONFIG_LIBZMQ_PROTOCOL 0
diff --git a/fuchsia/config/default/x64/config.h b/fuchsia/config/default/x64/config.h
new file mode 100644
index 0000000..b9d250d
--- /dev/null
+++ b/fuchsia/config/default/x64/config.h
@@ -0,0 +1,2588 @@
+/* Automatically generated by configure - do not modify! */
+#ifndef FFMPEG_CONFIG_H
+#define FFMPEG_CONFIG_H
+#define FFMPEG_CONFIGURATION "--disable-everything --disable-all --disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages --disable-static --enable-avcodec --enable-avformat --enable-avutil --enable-fft --enable-rdft --enable-static --enable-libopus --disable-debug --disable-bzlib --disable-iconv --disable-lzo --disable-network --disable-schannel --disable-sdl2 --disable-symver --disable-xlib --disable-zlib --disable-securetransport --disable-faan --disable-alsa --disable-autodetect --enable-decoder='vorbis,libopus,flac' --enable-decoder='pcm_u8,pcm_s16le,pcm_s24le,pcm_s32le,pcm_f32le,mp3' --enable-decoder='pcm_s16be,pcm_s24be,pcm_mulaw,pcm_alaw' --enable-decoder='theora,vp8,sbc,aptx' --enable-demuxer='ogg,matroska,wav,flac,mp3,mov' --enable-parser='opus,vorbis,flac,mpegaudio' --extra-cflags=-I/usr/local/google/home/dalesat/fuchsia/third_party/opus/include --enable-parser='vp3,vp8' --optflags='\"-O2\"' --enable-pic --x86asmexe=yasm --enable-pic --enable-lto --cc=clang --cxx=clang++ --ld=clang --enable-decoder=vp9 --enable-parser=vp9 --sysroot=/usr/local/google/home/dalesat/fuchsia/third_party/ffmpeg/../../prebuilt/third_party/sysroot/linux --extra-ldflags='-fuse-ld=lld' --disable-error-resilience"
+#define FFMPEG_LICENSE "LGPL version 2.1 or later"
+#define CONFIG_THIS_YEAR 2020
+#define FFMPEG_DATADIR "/usr/local/share/ffmpeg"
+#define AVCONV_DATADIR "/usr/local/share/ffmpeg"
+#define CC_IDENT "Fuchsia clang version 11.0.0 (https://fuchsia.googlesource.com/a/third_party/llvm-project dd484baffdf4a92e564c38a17d35a742e633b0e0)"
+#define av_restrict restrict
+#define EXTERN_PREFIX ""
+#define EXTERN_ASM
+#define BUILDSUF ""
+#define SLIBSUF ".so"
+#define HAVE_MMX2 HAVE_MMXEXT
+#define SWS_MAX_FILTER_SIZE 256
+#define ARCH_AARCH64 0
+#define ARCH_ALPHA 0
+#define ARCH_ARM 0
+#define ARCH_AVR32 0
+#define ARCH_AVR32_AP 0
+#define ARCH_AVR32_UC 0
+#define ARCH_BFIN 0
+#define ARCH_IA64 0
+#define ARCH_M68K 0
+#define ARCH_MIPS 0
+#define ARCH_MIPS64 0
+#define ARCH_PARISC 0
+#define ARCH_PPC 0
+#define ARCH_PPC64 0
+#define ARCH_S390 0
+#define ARCH_SH4 0
+#define ARCH_SPARC 0
+#define ARCH_SPARC64 0
+#define ARCH_TILEGX 0
+#define ARCH_TILEPRO 0
+#define ARCH_TOMI 0
+#define ARCH_X86 1
+#define ARCH_X86_32 0
+#define ARCH_X86_64 1
+#define HAVE_ARMV5TE 0
+#define HAVE_ARMV6 0
+#define HAVE_ARMV6T2 0
+#define HAVE_ARMV8 0
+#define HAVE_NEON 0
+#define HAVE_VFP 0
+#define HAVE_VFPV3 0
+#define HAVE_SETEND 0
+#define HAVE_ALTIVEC 0
+#define HAVE_DCBZL 0
+#define HAVE_LDBRX 0
+#define HAVE_POWER8 0
+#define HAVE_PPC4XX 0
+#define HAVE_VSX 0
+#define HAVE_AESNI 1
+#define HAVE_AMD3DNOW 1
+#define HAVE_AMD3DNOWEXT 1
+#define HAVE_AVX 1
+#define HAVE_AVX2 1
+#define HAVE_AVX512 1
+#define HAVE_FMA3 1
+#define HAVE_FMA4 1
+#define HAVE_MMX 1
+#define HAVE_MMXEXT 1
+#define HAVE_SSE 1
+#define HAVE_SSE2 1
+#define HAVE_SSE3 1
+#define HAVE_SSE4 1
+#define HAVE_SSE42 1
+#define HAVE_SSSE3 1
+#define HAVE_XOP 1
+#define HAVE_CPUNOP 1
+#define HAVE_I686 1
+#define HAVE_MIPSFPU 0
+#define HAVE_MIPS32R2 0
+#define HAVE_MIPS32R5 0
+#define HAVE_MIPS64R2 0
+#define HAVE_MIPS32R6 0
+#define HAVE_MIPS64R6 0
+#define HAVE_MIPSDSP 0
+#define HAVE_MIPSDSPR2 0
+#define HAVE_MSA 0
+#define HAVE_MSA2 0
+#define HAVE_LOONGSON2 0
+#define HAVE_LOONGSON3 0
+#define HAVE_MMI 0
+#define HAVE_ARMV5TE_EXTERNAL 0
+#define HAVE_ARMV6_EXTERNAL 0
+#define HAVE_ARMV6T2_EXTERNAL 0
+#define HAVE_ARMV8_EXTERNAL 0
+#define HAVE_NEON_EXTERNAL 0
+#define HAVE_VFP_EXTERNAL 0
+#define HAVE_VFPV3_EXTERNAL 0
+#define HAVE_SETEND_EXTERNAL 0
+#define HAVE_ALTIVEC_EXTERNAL 0
+#define HAVE_DCBZL_EXTERNAL 0
+#define HAVE_LDBRX_EXTERNAL 0
+#define HAVE_POWER8_EXTERNAL 0
+#define HAVE_PPC4XX_EXTERNAL 0
+#define HAVE_VSX_EXTERNAL 0
+#define HAVE_AESNI_EXTERNAL 1
+#define HAVE_AMD3DNOW_EXTERNAL 1
+#define HAVE_AMD3DNOWEXT_EXTERNAL 1
+#define HAVE_AVX_EXTERNAL 1
+#define HAVE_AVX2_EXTERNAL 1
+#define HAVE_AVX512_EXTERNAL 0
+#define HAVE_FMA3_EXTERNAL 1
+#define HAVE_FMA4_EXTERNAL 1
+#define HAVE_MMX_EXTERNAL 1
+#define HAVE_MMXEXT_EXTERNAL 1
+#define HAVE_SSE_EXTERNAL 1
+#define HAVE_SSE2_EXTERNAL 1
+#define HAVE_SSE3_EXTERNAL 1
+#define HAVE_SSE4_EXTERNAL 1
+#define HAVE_SSE42_EXTERNAL 1
+#define HAVE_SSSE3_EXTERNAL 1
+#define HAVE_XOP_EXTERNAL 1
+#define HAVE_CPUNOP_EXTERNAL 0
+#define HAVE_I686_EXTERNAL 0
+#define HAVE_MIPSFPU_EXTERNAL 0
+#define HAVE_MIPS32R2_EXTERNAL 0
+#define HAVE_MIPS32R5_EXTERNAL 0
+#define HAVE_MIPS64R2_EXTERNAL 0
+#define HAVE_MIPS32R6_EXTERNAL 0
+#define HAVE_MIPS64R6_EXTERNAL 0
+#define HAVE_MIPSDSP_EXTERNAL 0
+#define HAVE_MIPSDSPR2_EXTERNAL 0
+#define HAVE_MSA_EXTERNAL 0
+#define HAVE_MSA2_EXTERNAL 0
+#define HAVE_LOONGSON2_EXTERNAL 0
+#define HAVE_LOONGSON3_EXTERNAL 0
+#define HAVE_MMI_EXTERNAL 0
+#define HAVE_ARMV5TE_INLINE 0
+#define HAVE_ARMV6_INLINE 0
+#define HAVE_ARMV6T2_INLINE 0
+#define HAVE_ARMV8_INLINE 0
+#define HAVE_NEON_INLINE 0
+#define HAVE_VFP_INLINE 0
+#define HAVE_VFPV3_INLINE 0
+#define HAVE_SETEND_INLINE 0
+#define HAVE_ALTIVEC_INLINE 0
+#define HAVE_DCBZL_INLINE 0
+#define HAVE_LDBRX_INLINE 0
+#define HAVE_POWER8_INLINE 0
+#define HAVE_PPC4XX_INLINE 0
+#define HAVE_VSX_INLINE 0
+#define HAVE_AESNI_INLINE 1
+#define HAVE_AMD3DNOW_INLINE 1
+#define HAVE_AMD3DNOWEXT_INLINE 1
+#define HAVE_AVX_INLINE 1
+#define HAVE_AVX2_INLINE 1
+#define HAVE_AVX512_INLINE 1
+#define HAVE_FMA3_INLINE 1
+#define HAVE_FMA4_INLINE 1
+#define HAVE_MMX_INLINE 1
+#define HAVE_MMXEXT_INLINE 1
+#define HAVE_SSE_INLINE 1
+#define HAVE_SSE2_INLINE 1
+#define HAVE_SSE3_INLINE 1
+#define HAVE_SSE4_INLINE 1
+#define HAVE_SSE42_INLINE 1
+#define HAVE_SSSE3_INLINE 1
+#define HAVE_XOP_INLINE 1
+#define HAVE_CPUNOP_INLINE 0
+#define HAVE_I686_INLINE 0
+#define HAVE_MIPSFPU_INLINE 0
+#define HAVE_MIPS32R2_INLINE 0
+#define HAVE_MIPS32R5_INLINE 0
+#define HAVE_MIPS64R2_INLINE 0
+#define HAVE_MIPS32R6_INLINE 0
+#define HAVE_MIPS64R6_INLINE 0
+#define HAVE_MIPSDSP_INLINE 0
+#define HAVE_MIPSDSPR2_INLINE 0
+#define HAVE_MSA_INLINE 0
+#define HAVE_MSA2_INLINE 0
+#define HAVE_LOONGSON2_INLINE 0
+#define HAVE_LOONGSON3_INLINE 0
+#define HAVE_MMI_INLINE 0
+#define HAVE_ALIGNED_STACK 1
+#define HAVE_FAST_64BIT 1
+#define HAVE_FAST_CLZ 1
+#define HAVE_FAST_CMOV 1
+#define HAVE_LOCAL_ALIGNED 1
+#define HAVE_SIMD_ALIGN_16 1
+#define HAVE_SIMD_ALIGN_32 1
+#define HAVE_SIMD_ALIGN_64 1
+#define HAVE_ATOMIC_CAS_PTR 0
+#define HAVE_MACHINE_RW_BARRIER 0
+#define HAVE_MEMORYBARRIER 0
+#define HAVE_MM_EMPTY 1
+#define HAVE_RDTSC 0
+#define HAVE_SEM_TIMEDWAIT 1
+#define HAVE_SYNC_VAL_COMPARE_AND_SWAP 1
+#define HAVE_CABS 0
+#define HAVE_CEXP 0
+#define HAVE_INLINE_ASM 1
+#define HAVE_SYMVER 0
+#define HAVE_X86ASM 1
+#define HAVE_BIGENDIAN 0
+#define HAVE_FAST_UNALIGNED 1
+#define HAVE_ARPA_INET_H 0
+#define HAVE_ASM_TYPES_H 1
+#define HAVE_CDIO_PARANOIA_H 0
+#define HAVE_CDIO_PARANOIA_PARANOIA_H 0
+#define HAVE_CUDA_H 0
+#define HAVE_DISPATCH_DISPATCH_H 0
+#define HAVE_DEV_BKTR_IOCTL_BT848_H 0
+#define HAVE_DEV_BKTR_IOCTL_METEOR_H 0
+#define HAVE_DEV_IC_BT8XX_H 0
+#define HAVE_DEV_VIDEO_BKTR_IOCTL_BT848_H 0
+#define HAVE_DEV_VIDEO_METEOR_IOCTL_METEOR_H 0
+#define HAVE_DIRECT_H 0
+#define HAVE_DIRENT_H 1
+#define HAVE_DXGIDEBUG_H 0
+#define HAVE_DXVA_H 0
+#define HAVE_ES2_GL_H 0
+#define HAVE_GSM_H 0
+#define HAVE_IO_H 0
+#define HAVE_LINUX_PERF_EVENT_H 1
+#define HAVE_MACHINE_IOCTL_BT848_H 0
+#define HAVE_MACHINE_IOCTL_METEOR_H 0
+#define HAVE_MALLOC_H 1
+#define HAVE_OPENCV2_CORE_CORE_C_H 0
+#define HAVE_OPENGL_GL3_H 0
+#define HAVE_POLL_H 1
+#define HAVE_SYS_PARAM_H 1
+#define HAVE_SYS_RESOURCE_H 1
+#define HAVE_SYS_SELECT_H 1
+#define HAVE_SYS_SOUNDCARD_H 1
+#define HAVE_SYS_TIME_H 1
+#define HAVE_SYS_UN_H 1
+#define HAVE_SYS_VIDEOIO_H 0
+#define HAVE_TERMIOS_H 1
+#define HAVE_UDPLITE_H 0
+#define HAVE_UNISTD_H 1
+#define HAVE_VALGRIND_VALGRIND_H 0
+#define HAVE_WINDOWS_H 0
+#define HAVE_WINSOCK2_H 0
+#define HAVE_INTRINSICS_NEON 0
+#define HAVE_ATANF 1
+#define HAVE_ATAN2F 1
+#define HAVE_CBRT 1
+#define HAVE_CBRTF 1
+#define HAVE_COPYSIGN 1
+#define HAVE_COSF 1
+#define HAVE_ERF 1
+#define HAVE_EXP2 1
+#define HAVE_EXP2F 1
+#define HAVE_EXPF 1
+#define HAVE_HYPOT 1
+#define HAVE_ISFINITE 1
+#define HAVE_ISINF 1
+#define HAVE_ISNAN 1
+#define HAVE_LDEXPF 1
+#define HAVE_LLRINT 1
+#define HAVE_LLRINTF 1
+#define HAVE_LOG2 1
+#define HAVE_LOG2F 1
+#define HAVE_LOG10F 1
+#define HAVE_LRINT 1
+#define HAVE_LRINTF 1
+#define HAVE_POWF 1
+#define HAVE_RINT 1
+#define HAVE_ROUND 1
+#define HAVE_ROUNDF 1
+#define HAVE_SINF 1
+#define HAVE_TRUNC 1
+#define HAVE_TRUNCF 1
+#define HAVE_DOS_PATHS 0
+#define HAVE_LIBC_MSVCRT 0
+#define HAVE_MMAL_PARAMETER_VIDEO_MAX_NUM_CALLBACKS 0
+#define HAVE_SECTION_DATA_REL_RO 1
+#define HAVE_THREADS 1
+#define HAVE_UWP 0
+#define HAVE_WINRT 0
+#define HAVE_ACCESS 1
+#define HAVE_ALIGNED_MALLOC 0
+#define HAVE_ARC4RANDOM 0
+#define HAVE_CLOCK_GETTIME 1
+#define HAVE_CLOSESOCKET 0
+#define HAVE_COMMANDLINETOARGVW 0
+#define HAVE_FCNTL 1
+#define HAVE_GETADDRINFO 0
+#define HAVE_GETHRTIME 0
+#define HAVE_GETOPT 1
+#define HAVE_GETMODULEHANDLE 0
+#define HAVE_GETPROCESSAFFINITYMASK 0
+#define HAVE_GETPROCESSMEMORYINFO 0
+#define HAVE_GETPROCESSTIMES 0
+#define HAVE_GETRUSAGE 1
+#define HAVE_GETSTDHANDLE 0
+#define HAVE_GETSYSTEMTIMEASFILETIME 0
+#define HAVE_GETTIMEOFDAY 1
+#define HAVE_GLOB 1
+#define HAVE_GLXGETPROCADDRESS 0
+#define HAVE_GMTIME_R 1
+#define HAVE_INET_ATON 0
+#define HAVE_ISATTY 1
+#define HAVE_KBHIT 0
+#define HAVE_LOCALTIME_R 1
+#define HAVE_LSTAT 1
+#define HAVE_LZO1X_999_COMPRESS 0
+#define HAVE_MACH_ABSOLUTE_TIME 0
+#define HAVE_MAPVIEWOFFILE 0
+#define HAVE_MEMALIGN 1
+#define HAVE_MKSTEMP 1
+#define HAVE_MMAP 1
+#define HAVE_MPROTECT 1
+#define HAVE_NANOSLEEP 1
+#define HAVE_PEEKNAMEDPIPE 0
+#define HAVE_POSIX_MEMALIGN 1
+#define HAVE_PTHREAD_CANCEL 1
+#define HAVE_SCHED_GETAFFINITY 1
+#define HAVE_SECITEMIMPORT 0
+#define HAVE_SETCONSOLETEXTATTRIBUTE 0
+#define HAVE_SETCONSOLECTRLHANDLER 0
+#define HAVE_SETDLLDIRECTORY 0
+#define HAVE_SETMODE 0
+#define HAVE_SETRLIMIT 1
+#define HAVE_SLEEP 0
+#define HAVE_STRERROR_R 1
+#define HAVE_SYSCONF 1
+#define HAVE_SYSCTL 0
+#define HAVE_USLEEP 1
+#define HAVE_UTGETOSTYPEFROMSTRING 0
+#define HAVE_VIRTUALALLOC 0
+#define HAVE_WGLGETPROCADDRESS 0
+#define HAVE_BCRYPT 0
+#define HAVE_VAAPI_DRM 0
+#define HAVE_VAAPI_X11 0
+#define HAVE_VDPAU_X11 0
+#define HAVE_PTHREADS 1
+#define HAVE_OS2THREADS 0
+#define HAVE_W32THREADS 0
+#define HAVE_AS_ARCH_DIRECTIVE 0
+#define HAVE_AS_DN_DIRECTIVE 0
+#define HAVE_AS_FPU_DIRECTIVE 0
+#define HAVE_AS_FUNC 0
+#define HAVE_AS_OBJECT_ARCH 0
+#define HAVE_ASM_MOD_Q 0
+#define HAVE_BLOCKS_EXTENSION 0
+#define HAVE_EBP_AVAILABLE 1
+#define HAVE_EBX_AVAILABLE 1
+#define HAVE_GNU_AS 0
+#define HAVE_GNU_WINDRES 0
+#define HAVE_IBM_ASM 0
+#define HAVE_INLINE_ASM_DIRECT_SYMBOL_REFS 0
+#define HAVE_INLINE_ASM_LABELS 1
+#define HAVE_INLINE_ASM_NONLOCAL_LABELS 1
+#define HAVE_PRAGMA_DEPRECATED 1
+#define HAVE_RSYNC_CONTIMEOUT 1
+#define HAVE_SYMVER_ASM_LABEL 1
+#define HAVE_SYMVER_GNU_ASM 1
+#define HAVE_VFP_ARGS 0
+#define HAVE_XFORM_ASM 0
+#define HAVE_XMM_CLOBBERS 1
+#define HAVE_KCMVIDEOCODECTYPE_HEVC 0
+#define HAVE_KCVPIXELFORMATTYPE_420YPCBCR10BIPLANARVIDEORANGE 0
+#define HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_SMPTE_ST_2084_PQ 0
+#define HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_ITU_R_2100_HLG 0
+#define HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_LINEAR 0
+#define HAVE_SOCKLEN_T 0
+#define HAVE_STRUCT_ADDRINFO 0
+#define HAVE_STRUCT_GROUP_SOURCE_REQ 0
+#define HAVE_STRUCT_IP_MREQ_SOURCE 0
+#define HAVE_STRUCT_IPV6_MREQ 0
+#define HAVE_STRUCT_MSGHDR_MSG_FLAGS 0
+#define HAVE_STRUCT_POLLFD 0
+#define HAVE_STRUCT_RUSAGE_RU_MAXRSS 1
+#define HAVE_STRUCT_SCTP_EVENT_SUBSCRIBE 0
+#define HAVE_STRUCT_SOCKADDR_IN6 0
+#define HAVE_STRUCT_SOCKADDR_SA_LEN 0
+#define HAVE_STRUCT_SOCKADDR_STORAGE 0
+#define HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC 1
+#define HAVE_STRUCT_V4L2_FRMIVALENUM_DISCRETE 0
+#define HAVE_MAKEINFO 0
+#define HAVE_MAKEINFO_HTML 0
+#define HAVE_OPENCL_D3D11 0
+#define HAVE_OPENCL_DRM_ARM 0
+#define HAVE_OPENCL_DRM_BEIGNET 0
+#define HAVE_OPENCL_DXVA2 0
+#define HAVE_OPENCL_VAAPI_BEIGNET 0
+#define HAVE_OPENCL_VAAPI_INTEL_MEDIA 0
+#define HAVE_PERL 1
+#define HAVE_POD2MAN 1
+#define HAVE_TEXI2HTML 0
+#define CONFIG_DOC 0
+#define CONFIG_HTMLPAGES 0
+#define CONFIG_MANPAGES 0
+#define CONFIG_PODPAGES 0
+#define CONFIG_TXTPAGES 0
+#define CONFIG_AVIO_LIST_DIR_EXAMPLE 1
+#define CONFIG_AVIO_READING_EXAMPLE 1
+#define CONFIG_DECODE_AUDIO_EXAMPLE 1
+#define CONFIG_DECODE_VIDEO_EXAMPLE 1
+#define CONFIG_DEMUXING_DECODING_EXAMPLE 1
+#define CONFIG_ENCODE_AUDIO_EXAMPLE 1
+#define CONFIG_ENCODE_VIDEO_EXAMPLE 1
+#define CONFIG_EXTRACT_MVS_EXAMPLE 1
+#define CONFIG_FILTER_AUDIO_EXAMPLE 0
+#define CONFIG_FILTERING_AUDIO_EXAMPLE 0
+#define CONFIG_FILTERING_VIDEO_EXAMPLE 0
+#define CONFIG_HTTP_MULTICLIENT_EXAMPLE 1
+#define CONFIG_HW_DECODE_EXAMPLE 1
+#define CONFIG_METADATA_EXAMPLE 1
+#define CONFIG_MUXING_EXAMPLE 0
+#define CONFIG_QSVDEC_EXAMPLE 0
+#define CONFIG_REMUXING_EXAMPLE 1
+#define CONFIG_RESAMPLING_AUDIO_EXAMPLE 0
+#define CONFIG_SCALING_VIDEO_EXAMPLE 0
+#define CONFIG_TRANSCODE_AAC_EXAMPLE 0
+#define CONFIG_TRANSCODING_EXAMPLE 0
+#define CONFIG_VAAPI_ENCODE_EXAMPLE 0
+#define CONFIG_VAAPI_TRANSCODE_EXAMPLE 0
+#define CONFIG_AVISYNTH 0
+#define CONFIG_FREI0R 0
+#define CONFIG_LIBCDIO 0
+#define CONFIG_LIBDAVS2 0
+#define CONFIG_LIBRUBBERBAND 0
+#define CONFIG_LIBVIDSTAB 0
+#define CONFIG_LIBX264 0
+#define CONFIG_LIBX265 0
+#define CONFIG_LIBXAVS 0
+#define CONFIG_LIBXAVS2 0
+#define CONFIG_LIBXVID 0
+#define CONFIG_DECKLINK 0
+#define CONFIG_LIBFDK_AAC 0
+#define CONFIG_OPENSSL 0
+#define CONFIG_LIBTLS 0
+#define CONFIG_GMP 0
+#define CONFIG_LIBARIBB24 0
+#define CONFIG_LIBLENSFUN 0
+#define CONFIG_LIBOPENCORE_AMRNB 0
+#define CONFIG_LIBOPENCORE_AMRWB 0
+#define CONFIG_LIBVMAF 0
+#define CONFIG_LIBVO_AMRWBENC 0
+#define CONFIG_MBEDTLS 0
+#define CONFIG_RKMPP 0
+#define CONFIG_LIBSMBCLIENT 0
+#define CONFIG_CHROMAPRINT 0
+#define CONFIG_GCRYPT 0
+#define CONFIG_GNUTLS 0
+#define CONFIG_JNI 0
+#define CONFIG_LADSPA 0
+#define CONFIG_LIBAOM 0
+#define CONFIG_LIBASS 0
+#define CONFIG_LIBBLURAY 0
+#define CONFIG_LIBBS2B 0
+#define CONFIG_LIBCACA 0
+#define CONFIG_LIBCELT 0
+#define CONFIG_LIBCODEC2 0
+#define CONFIG_LIBDAV1D 0
+#define CONFIG_LIBDC1394 0
+#define CONFIG_LIBDRM 0
+#define CONFIG_LIBFLITE 0
+#define CONFIG_LIBFONTCONFIG 0
+#define CONFIG_LIBFREETYPE 0
+#define CONFIG_LIBFRIBIDI 0
+#define CONFIG_LIBGLSLANG 0
+#define CONFIG_LIBGME 0
+#define CONFIG_LIBGSM 0
+#define CONFIG_LIBIEC61883 0
+#define CONFIG_LIBILBC 0
+#define CONFIG_LIBJACK 0
+#define CONFIG_LIBKLVANC 0
+#define CONFIG_LIBKVAZAAR 0
+#define CONFIG_LIBMODPLUG 0
+#define CONFIG_LIBMP3LAME 0
+#define CONFIG_LIBMYSOFA 0
+#define CONFIG_LIBOPENCV 0
+#define CONFIG_LIBOPENH264 0
+#define CONFIG_LIBOPENJPEG 0
+#define CONFIG_LIBOPENMPT 0
+#define CONFIG_LIBOPUS 1
+#define CONFIG_LIBPULSE 0
+#define CONFIG_LIBRABBITMQ 0
+#define CONFIG_LIBRAV1E 0
+#define CONFIG_LIBRSVG 0
+#define CONFIG_LIBRTMP 0
+#define CONFIG_LIBSHINE 0
+#define CONFIG_LIBSMBCLIENT 0
+#define CONFIG_LIBSNAPPY 0
+#define CONFIG_LIBSOXR 0
+#define CONFIG_LIBSPEEX 0
+#define CONFIG_LIBSRT 0
+#define CONFIG_LIBSSH 0
+#define CONFIG_LIBTENSORFLOW 0
+#define CONFIG_LIBTESSERACT 0
+#define CONFIG_LIBTHEORA 0
+#define CONFIG_LIBTWOLAME 0
+#define CONFIG_LIBV4L2 0
+#define CONFIG_LIBVORBIS 0
+#define CONFIG_LIBVPX 0
+#define CONFIG_LIBWAVPACK 0
+#define CONFIG_LIBWEBP 0
+#define CONFIG_LIBXML2 0
+#define CONFIG_LIBZIMG 0
+#define CONFIG_LIBZMQ 0
+#define CONFIG_LIBZVBI 0
+#define CONFIG_LV2 0
+#define CONFIG_MEDIACODEC 0
+#define CONFIG_OPENAL 0
+#define CONFIG_OPENGL 0
+#define CONFIG_POCKETSPHINX 0
+#define CONFIG_VAPOURSYNTH 0
+#define CONFIG_ALSA 0
+#define CONFIG_APPKIT 0
+#define CONFIG_AVFOUNDATION 0
+#define CONFIG_BZLIB 0
+#define CONFIG_COREIMAGE 0
+#define CONFIG_ICONV 0
+#define CONFIG_LIBXCB 0
+#define CONFIG_LIBXCB_SHM 0
+#define CONFIG_LIBXCB_SHAPE 0
+#define CONFIG_LIBXCB_XFIXES 0
+#define CONFIG_LZMA 0
+#define CONFIG_SCHANNEL 0
+#define CONFIG_SDL2 0
+#define CONFIG_SECURETRANSPORT 0
+#define CONFIG_SNDIO 0
+#define CONFIG_XLIB 0
+#define CONFIG_ZLIB 0
+#define CONFIG_CUDA_NVCC 0
+#define CONFIG_CUDA_SDK 0
+#define CONFIG_LIBNPP 0
+#define CONFIG_LIBMFX 0
+#define CONFIG_MMAL 0
+#define CONFIG_OMX 0
+#define CONFIG_OPENCL 0
+#define CONFIG_VULKAN 0
+#define CONFIG_AMF 0
+#define CONFIG_AUDIOTOOLBOX 0
+#define CONFIG_CRYSTALHD 0
+#define CONFIG_CUDA 0
+#define CONFIG_CUDA_LLVM 0
+#define CONFIG_CUVID 0
+#define CONFIG_D3D11VA 0
+#define CONFIG_DXVA2 0
+#define CONFIG_FFNVCODEC 0
+#define CONFIG_NVDEC 0
+#define CONFIG_NVENC 0
+#define CONFIG_VAAPI 0
+#define CONFIG_VDPAU 0
+#define CONFIG_VIDEOTOOLBOX 0
+#define CONFIG_V4L2_M2M 0
+#define CONFIG_XVMC 0
+#define CONFIG_FTRAPV 0
+#define CONFIG_GRAY 0
+#define CONFIG_HARDCODED_TABLES 0
+#define CONFIG_OMX_RPI 0
+#define CONFIG_RUNTIME_CPUDETECT 1
+#define CONFIG_SAFE_BITSTREAM_READER 1
+#define CONFIG_SHARED 0
+#define CONFIG_SMALL 0
+#define CONFIG_STATIC 1
+#define CONFIG_SWSCALE_ALPHA 1
+#define CONFIG_GPL 0
+#define CONFIG_NONFREE 0
+#define CONFIG_VERSION3 0
+#define CONFIG_AVDEVICE 0
+#define CONFIG_AVFILTER 0
+#define CONFIG_SWSCALE 0
+#define CONFIG_POSTPROC 0
+#define CONFIG_AVFORMAT 1
+#define CONFIG_AVCODEC 1
+#define CONFIG_SWRESAMPLE 0
+#define CONFIG_AVRESAMPLE 0
+#define CONFIG_AVUTIL 1
+#define CONFIG_FFPLAY 0
+#define CONFIG_FFPROBE 0
+#define CONFIG_FFMPEG 0
+#define CONFIG_DCT 1
+#define CONFIG_DWT 0
+#define CONFIG_ERROR_RESILIENCE 0
+#define CONFIG_FAAN 0
+#define CONFIG_FAST_UNALIGNED 1
+#define CONFIG_FFT 1
+#define CONFIG_LSP 0
+#define CONFIG_LZO 0
+#define CONFIG_MDCT 1
+#define CONFIG_PIXELUTILS 0
+#define CONFIG_NETWORK 0
+#define CONFIG_RDFT 1
+#define CONFIG_AUTODETECT 0
+#define CONFIG_FONTCONFIG 0
+#define CONFIG_LARGE_TESTS 1
+#define CONFIG_LINUX_PERF 0
+#define CONFIG_MEMORY_POISONING 0
+#define CONFIG_NEON_CLOBBER_TEST 0
+#define CONFIG_OSSFUZZ 0
+#define CONFIG_PIC 1
+#define CONFIG_THUMB 0
+#define CONFIG_VALGRIND_BACKTRACE 0
+#define CONFIG_XMM_CLOBBER_TEST 0
+#define CONFIG_BSFS 1
+#define CONFIG_DECODERS 1
+#define CONFIG_ENCODERS 0
+#define CONFIG_HWACCELS 0
+#define CONFIG_PARSERS 1
+#define CONFIG_INDEVS 0
+#define CONFIG_OUTDEVS 0
+#define CONFIG_FILTERS 0
+#define CONFIG_DEMUXERS 1
+#define CONFIG_MUXERS 0
+#define CONFIG_PROTOCOLS 0
+#define CONFIG_AANDCTTABLES 0
+#define CONFIG_AC3DSP 0
+#define CONFIG_ADTS_HEADER 0
+#define CONFIG_AUDIO_FRAME_QUEUE 1
+#define CONFIG_AUDIODSP 0
+#define CONFIG_BLOCKDSP 0
+#define CONFIG_BSWAPDSP 0
+#define CONFIG_CABAC 0
+#define CONFIG_CBS 0
+#define CONFIG_CBS_AV1 0
+#define CONFIG_CBS_H264 0
+#define CONFIG_CBS_H265 0
+#define CONFIG_CBS_JPEG 0
+#define CONFIG_CBS_MPEG2 0
+#define CONFIG_CBS_VP9 0
+#define CONFIG_DIRAC_PARSE 1
+#define CONFIG_DNN 0
+#define CONFIG_DVPROFILE 0
+#define CONFIG_EXIF 0
+#define CONFIG_FAANDCT 0
+#define CONFIG_FAANIDCT 0
+#define CONFIG_FDCTDSP 0
+#define CONFIG_FLACDSP 1
+#define CONFIG_FMTCONVERT 0
+#define CONFIG_FRAME_THREAD_ENCODER 0
+#define CONFIG_G722DSP 0
+#define CONFIG_GOLOMB 1
+#define CONFIG_GPLV3 0
+#define CONFIG_H263DSP 0
+#define CONFIG_H264CHROMA 0
+#define CONFIG_H264DSP 0
+#define CONFIG_H264PARSE 0
+#define CONFIG_H264PRED 1
+#define CONFIG_H264QPEL 0
+#define CONFIG_HEVCPARSE 0
+#define CONFIG_HPELDSP 1
+#define CONFIG_HUFFMAN 0
+#define CONFIG_HUFFYUVDSP 0
+#define CONFIG_HUFFYUVENCDSP 0
+#define CONFIG_IDCTDSP 0
+#define CONFIG_IIRFILTER 0
+#define CONFIG_MDCT15 0
+#define CONFIG_INTRAX8 0
+#define CONFIG_ISO_MEDIA 1
+#define CONFIG_IVIDSP 0
+#define CONFIG_JPEGTABLES 0
+#define CONFIG_LGPLV3 0
+#define CONFIG_LIBX262 0
+#define CONFIG_LLAUDDSP 0
+#define CONFIG_LLVIDDSP 0
+#define CONFIG_LLVIDENCDSP 0
+#define CONFIG_LPC 0
+#define CONFIG_LZF 0
+#define CONFIG_ME_CMP 0
+#define CONFIG_MPEG_ER 0
+#define CONFIG_MPEGAUDIO 1
+#define CONFIG_MPEGAUDIODSP 1
+#define CONFIG_MPEGAUDIOHEADER 1
+#define CONFIG_MPEGVIDEO 0
+#define CONFIG_MPEGVIDEOENC 0
+#define CONFIG_MSS34DSP 0
+#define CONFIG_PIXBLOCKDSP 0
+#define CONFIG_QPELDSP 0
+#define CONFIG_QSV 0
+#define CONFIG_QSVDEC 0
+#define CONFIG_QSVENC 0
+#define CONFIG_QSVVPP 0
+#define CONFIG_RANGECODER 0
+#define CONFIG_RIFFDEC 1
+#define CONFIG_RIFFENC 0
+#define CONFIG_RTPDEC 0
+#define CONFIG_RTPENC_CHAIN 0
+#define CONFIG_RV34DSP 0
+#define CONFIG_SCENE_SAD 0
+#define CONFIG_SINEWIN 0
+#define CONFIG_SNAPPY 0
+#define CONFIG_SRTP 0
+#define CONFIG_STARTCODE 0
+#define CONFIG_TEXTUREDSP 0
+#define CONFIG_TEXTUREDSPENC 0
+#define CONFIG_TPELDSP 0
+#define CONFIG_VAAPI_1 0
+#define CONFIG_VAAPI_ENCODE 0
+#define CONFIG_VC1DSP 0
+#define CONFIG_VIDEODSP 1
+#define CONFIG_VP3DSP 1
+#define CONFIG_VP56DSP 0
+#define CONFIG_VP8DSP 1
+#define CONFIG_WMA_FREQS 0
+#define CONFIG_WMV2DSP 0
+#define CONFIG_AAC_ADTSTOASC_BSF 0
+#define CONFIG_AV1_FRAME_MERGE_BSF 0
+#define CONFIG_AV1_FRAME_SPLIT_BSF 0
+#define CONFIG_AV1_METADATA_BSF 0
+#define CONFIG_CHOMP_BSF 0
+#define CONFIG_DUMP_EXTRADATA_BSF 0
+#define CONFIG_DCA_CORE_BSF 0
+#define CONFIG_EAC3_CORE_BSF 0
+#define CONFIG_EXTRACT_EXTRADATA_BSF 0
+#define CONFIG_FILTER_UNITS_BSF 0
+#define CONFIG_H264_METADATA_BSF 0
+#define CONFIG_H264_MP4TOANNEXB_BSF 0
+#define CONFIG_H264_REDUNDANT_PPS_BSF 0
+#define CONFIG_HAPQA_EXTRACT_BSF 0
+#define CONFIG_HEVC_METADATA_BSF 0
+#define CONFIG_HEVC_MP4TOANNEXB_BSF 0
+#define CONFIG_IMX_DUMP_HEADER_BSF 0
+#define CONFIG_MJPEG2JPEG_BSF 0
+#define CONFIG_MJPEGA_DUMP_HEADER_BSF 0
+#define CONFIG_MP3_HEADER_DECOMPRESS_BSF 0
+#define CONFIG_MPEG2_METADATA_BSF 0
+#define CONFIG_MPEG4_UNPACK_BFRAMES_BSF 0
+#define CONFIG_MOV2TEXTSUB_BSF 0
+#define CONFIG_NOISE_BSF 0
+#define CONFIG_NULL_BSF 1
+#define CONFIG_PRORES_METADATA_BSF 0
+#define CONFIG_REMOVE_EXTRADATA_BSF 0
+#define CONFIG_TEXT2MOVSUB_BSF 0
+#define CONFIG_TRACE_HEADERS_BSF 0
+#define CONFIG_TRUEHD_CORE_BSF 0
+#define CONFIG_VP9_METADATA_BSF 0
+#define CONFIG_VP9_RAW_REORDER_BSF 0
+#define CONFIG_VP9_SUPERFRAME_BSF 0
+#define CONFIG_VP9_SUPERFRAME_SPLIT_BSF 1
+#define CONFIG_AASC_DECODER 0
+#define CONFIG_AIC_DECODER 0
+#define CONFIG_ALIAS_PIX_DECODER 0
+#define CONFIG_AGM_DECODER 0
+#define CONFIG_AMV_DECODER 0
+#define CONFIG_ANM_DECODER 0
+#define CONFIG_ANSI_DECODER 0
+#define CONFIG_APNG_DECODER 0
+#define CONFIG_ARBC_DECODER 0
+#define CONFIG_ASV1_DECODER 0
+#define CONFIG_ASV2_DECODER 0
+#define CONFIG_AURA_DECODER 0
+#define CONFIG_AURA2_DECODER 0
+#define CONFIG_AVRP_DECODER 0
+#define CONFIG_AVRN_DECODER 0
+#define CONFIG_AVS_DECODER 0
+#define CONFIG_AVUI_DECODER 0
+#define CONFIG_AYUV_DECODER 0
+#define CONFIG_BETHSOFTVID_DECODER 0
+#define CONFIG_BFI_DECODER 0
+#define CONFIG_BINK_DECODER 0
+#define CONFIG_BITPACKED_DECODER 0
+#define CONFIG_BMP_DECODER 0
+#define CONFIG_BMV_VIDEO_DECODER 0
+#define CONFIG_BRENDER_PIX_DECODER 0
+#define CONFIG_C93_DECODER 0
+#define CONFIG_CAVS_DECODER 0
+#define CONFIG_CDGRAPHICS_DECODER 0
+#define CONFIG_CDTOONS_DECODER 0
+#define CONFIG_CDXL_DECODER 0
+#define CONFIG_CFHD_DECODER 0
+#define CONFIG_CINEPAK_DECODER 0
+#define CONFIG_CLEARVIDEO_DECODER 0
+#define CONFIG_CLJR_DECODER 0
+#define CONFIG_CLLC_DECODER 0
+#define CONFIG_COMFORTNOISE_DECODER 0
+#define CONFIG_CPIA_DECODER 0
+#define CONFIG_CSCD_DECODER 0
+#define CONFIG_CYUV_DECODER 0
+#define CONFIG_DDS_DECODER 0
+#define CONFIG_DFA_DECODER 0
+#define CONFIG_DIRAC_DECODER 0
+#define CONFIG_DNXHD_DECODER 0
+#define CONFIG_DPX_DECODER 0
+#define CONFIG_DSICINVIDEO_DECODER 0
+#define CONFIG_DVAUDIO_DECODER 0
+#define CONFIG_DVVIDEO_DECODER 0
+#define CONFIG_DXA_DECODER 0
+#define CONFIG_DXTORY_DECODER 0
+#define CONFIG_DXV_DECODER 0
+#define CONFIG_EACMV_DECODER 0
+#define CONFIG_EAMAD_DECODER 0
+#define CONFIG_EATGQ_DECODER 0
+#define CONFIG_EATGV_DECODER 0
+#define CONFIG_EATQI_DECODER 0
+#define CONFIG_EIGHTBPS_DECODER 0
+#define CONFIG_EIGHTSVX_EXP_DECODER 0
+#define CONFIG_EIGHTSVX_FIB_DECODER 0
+#define CONFIG_ESCAPE124_DECODER 0
+#define CONFIG_ESCAPE130_DECODER 0
+#define CONFIG_EXR_DECODER 0
+#define CONFIG_FFV1_DECODER 0
+#define CONFIG_FFVHUFF_DECODER 0
+#define CONFIG_FIC_DECODER 0
+#define CONFIG_FITS_DECODER 0
+#define CONFIG_FLASHSV_DECODER 0
+#define CONFIG_FLASHSV2_DECODER 0
+#define CONFIG_FLIC_DECODER 0
+#define CONFIG_FLV_DECODER 0
+#define CONFIG_FMVC_DECODER 0
+#define CONFIG_FOURXM_DECODER 0
+#define CONFIG_FRAPS_DECODER 0
+#define CONFIG_FRWU_DECODER 0
+#define CONFIG_G2M_DECODER 0
+#define CONFIG_GDV_DECODER 0
+#define CONFIG_GIF_DECODER 0
+#define CONFIG_H261_DECODER 0
+#define CONFIG_H263_DECODER 0
+#define CONFIG_H263I_DECODER 0
+#define CONFIG_H263P_DECODER 0
+#define CONFIG_H263_V4L2M2M_DECODER 0
+#define CONFIG_H264_DECODER 0
+#define CONFIG_H264_CRYSTALHD_DECODER 0
+#define CONFIG_H264_V4L2M2M_DECODER 0
+#define CONFIG_H264_MEDIACODEC_DECODER 0
+#define CONFIG_H264_MMAL_DECODER 0
+#define CONFIG_H264_QSV_DECODER 0
+#define CONFIG_H264_RKMPP_DECODER 0
+#define CONFIG_HAP_DECODER 0
+#define CONFIG_HEVC_DECODER 0
+#define CONFIG_HEVC_QSV_DECODER 0
+#define CONFIG_HEVC_RKMPP_DECODER 0
+#define CONFIG_HEVC_V4L2M2M_DECODER 0
+#define CONFIG_HNM4_VIDEO_DECODER 0
+#define CONFIG_HQ_HQA_DECODER 0
+#define CONFIG_HQX_DECODER 0
+#define CONFIG_HUFFYUV_DECODER 0
+#define CONFIG_HYMT_DECODER 0
+#define CONFIG_IDCIN_DECODER 0
+#define CONFIG_IFF_ILBM_DECODER 0
+#define CONFIG_IMM4_DECODER 0
+#define CONFIG_IMM5_DECODER 0
+#define CONFIG_INDEO2_DECODER 0
+#define CONFIG_INDEO3_DECODER 0
+#define CONFIG_INDEO4_DECODER 0
+#define CONFIG_INDEO5_DECODER 0
+#define CONFIG_INTERPLAY_VIDEO_DECODER 0
+#define CONFIG_JPEG2000_DECODER 0
+#define CONFIG_JPEGLS_DECODER 0
+#define CONFIG_JV_DECODER 0
+#define CONFIG_KGV1_DECODER 0
+#define CONFIG_KMVC_DECODER 0
+#define CONFIG_LAGARITH_DECODER 0
+#define CONFIG_LOCO_DECODER 0
+#define CONFIG_LSCR_DECODER 0
+#define CONFIG_M101_DECODER 0
+#define CONFIG_MAGICYUV_DECODER 0
+#define CONFIG_MDEC_DECODER 0
+#define CONFIG_MIMIC_DECODER 0
+#define CONFIG_MJPEG_DECODER 0
+#define CONFIG_MJPEGB_DECODER 0
+#define CONFIG_MMVIDEO_DECODER 0
+#define CONFIG_MOTIONPIXELS_DECODER 0
+#define CONFIG_MPEG1VIDEO_DECODER 0
+#define CONFIG_MPEG2VIDEO_DECODER 0
+#define CONFIG_MPEG4_DECODER 0
+#define CONFIG_MPEG4_CRYSTALHD_DECODER 0
+#define CONFIG_MPEG4_V4L2M2M_DECODER 0
+#define CONFIG_MPEG4_MMAL_DECODER 0
+#define CONFIG_MPEGVIDEO_DECODER 0
+#define CONFIG_MPEG1_V4L2M2M_DECODER 0
+#define CONFIG_MPEG2_MMAL_DECODER 0
+#define CONFIG_MPEG2_CRYSTALHD_DECODER 0
+#define CONFIG_MPEG2_V4L2M2M_DECODER 0
+#define CONFIG_MPEG2_QSV_DECODER 0
+#define CONFIG_MPEG2_MEDIACODEC_DECODER 0
+#define CONFIG_MSA1_DECODER 0
+#define CONFIG_MSCC_DECODER 0
+#define CONFIG_MSMPEG4V1_DECODER 0
+#define CONFIG_MSMPEG4V2_DECODER 0
+#define CONFIG_MSMPEG4V3_DECODER 0
+#define CONFIG_MSMPEG4_CRYSTALHD_DECODER 0
+#define CONFIG_MSRLE_DECODER 0
+#define CONFIG_MSS1_DECODER 0
+#define CONFIG_MSS2_DECODER 0
+#define CONFIG_MSVIDEO1_DECODER 0
+#define CONFIG_MSZH_DECODER 0
+#define CONFIG_MTS2_DECODER 0
+#define CONFIG_MV30_DECODER 0
+#define CONFIG_MVC1_DECODER 0
+#define CONFIG_MVC2_DECODER 0
+#define CONFIG_MVDV_DECODER 0
+#define CONFIG_MVHA_DECODER 0
+#define CONFIG_MWSC_DECODER 0
+#define CONFIG_MXPEG_DECODER 0
+#define CONFIG_NUV_DECODER 0
+#define CONFIG_PAF_VIDEO_DECODER 0
+#define CONFIG_PAM_DECODER 0
+#define CONFIG_PBM_DECODER 0
+#define CONFIG_PCX_DECODER 0
+#define CONFIG_PGM_DECODER 0
+#define CONFIG_PGMYUV_DECODER 0
+#define CONFIG_PICTOR_DECODER 0
+#define CONFIG_PIXLET_DECODER 0
+#define CONFIG_PNG_DECODER 0
+#define CONFIG_PPM_DECODER 0
+#define CONFIG_PRORES_DECODER 0
+#define CONFIG_PROSUMER_DECODER 0
+#define CONFIG_PSD_DECODER 0
+#define CONFIG_PTX_DECODER 0
+#define CONFIG_QDRAW_DECODER 0
+#define CONFIG_QPEG_DECODER 0
+#define CONFIG_QTRLE_DECODER 0
+#define CONFIG_R10K_DECODER 0
+#define CONFIG_R210_DECODER 0
+#define CONFIG_RASC_DECODER 0
+#define CONFIG_RAWVIDEO_DECODER 0
+#define CONFIG_RL2_DECODER 0
+#define CONFIG_ROQ_DECODER 0
+#define CONFIG_RPZA_DECODER 0
+#define CONFIG_RSCC_DECODER 0
+#define CONFIG_RV10_DECODER 0
+#define CONFIG_RV20_DECODER 0
+#define CONFIG_RV30_DECODER 0
+#define CONFIG_RV40_DECODER 0
+#define CONFIG_S302M_DECODER 0
+#define CONFIG_SANM_DECODER 0
+#define CONFIG_SCPR_DECODER 0
+#define CONFIG_SCREENPRESSO_DECODER 0
+#define CONFIG_SGI_DECODER 0
+#define CONFIG_SGIRLE_DECODER 0
+#define CONFIG_SHEERVIDEO_DECODER 0
+#define CONFIG_SMACKER_DECODER 0
+#define CONFIG_SMC_DECODER 0
+#define CONFIG_SMVJPEG_DECODER 0
+#define CONFIG_SNOW_DECODER 0
+#define CONFIG_SP5X_DECODER 0
+#define CONFIG_SPEEDHQ_DECODER 0
+#define CONFIG_SRGC_DECODER 0
+#define CONFIG_SUNRAST_DECODER 0
+#define CONFIG_SVQ1_DECODER 0
+#define CONFIG_SVQ3_DECODER 0
+#define CONFIG_TARGA_DECODER 0
+#define CONFIG_TARGA_Y216_DECODER 0
+#define CONFIG_TDSC_DECODER 0
+#define CONFIG_THEORA_DECODER 1
+#define CONFIG_THP_DECODER 0
+#define CONFIG_TIERTEXSEQVIDEO_DECODER 0
+#define CONFIG_TIFF_DECODER 0
+#define CONFIG_TMV_DECODER 0
+#define CONFIG_TRUEMOTION1_DECODER 0
+#define CONFIG_TRUEMOTION2_DECODER 0
+#define CONFIG_TRUEMOTION2RT_DECODER 0
+#define CONFIG_TSCC_DECODER 0
+#define CONFIG_TSCC2_DECODER 0
+#define CONFIG_TXD_DECODER 0
+#define CONFIG_ULTI_DECODER 0
+#define CONFIG_UTVIDEO_DECODER 0
+#define CONFIG_V210_DECODER 0
+#define CONFIG_V210X_DECODER 0
+#define CONFIG_V308_DECODER 0
+#define CONFIG_V408_DECODER 0
+#define CONFIG_V410_DECODER 0
+#define CONFIG_VB_DECODER 0
+#define CONFIG_VBLE_DECODER 0
+#define CONFIG_VC1_DECODER 0
+#define CONFIG_VC1_CRYSTALHD_DECODER 0
+#define CONFIG_VC1IMAGE_DECODER 0
+#define CONFIG_VC1_MMAL_DECODER 0
+#define CONFIG_VC1_QSV_DECODER 0
+#define CONFIG_VC1_V4L2M2M_DECODER 0
+#define CONFIG_VCR1_DECODER 0
+#define CONFIG_VMDVIDEO_DECODER 0
+#define CONFIG_VMNC_DECODER 0
+#define CONFIG_VP3_DECODER 1
+#define CONFIG_VP4_DECODER 0
+#define CONFIG_VP5_DECODER 0
+#define CONFIG_VP6_DECODER 0
+#define CONFIG_VP6A_DECODER 0
+#define CONFIG_VP6F_DECODER 0
+#define CONFIG_VP7_DECODER 0
+#define CONFIG_VP8_DECODER 1
+#define CONFIG_VP8_RKMPP_DECODER 0
+#define CONFIG_VP8_V4L2M2M_DECODER 0
+#define CONFIG_VP9_DECODER 1
+#define CONFIG_VP9_RKMPP_DECODER 0
+#define CONFIG_VP9_V4L2M2M_DECODER 0
+#define CONFIG_VQA_DECODER 0
+#define CONFIG_WEBP_DECODER 0
+#define CONFIG_WCMV_DECODER 0
+#define CONFIG_WRAPPED_AVFRAME_DECODER 0
+#define CONFIG_WMV1_DECODER 0
+#define CONFIG_WMV2_DECODER 0
+#define CONFIG_WMV3_DECODER 0
+#define CONFIG_WMV3_CRYSTALHD_DECODER 0
+#define CONFIG_WMV3IMAGE_DECODER 0
+#define CONFIG_WNV1_DECODER 0
+#define CONFIG_XAN_WC3_DECODER 0
+#define CONFIG_XAN_WC4_DECODER 0
+#define CONFIG_XBM_DECODER 0
+#define CONFIG_XFACE_DECODER 0
+#define CONFIG_XL_DECODER 0
+#define CONFIG_XPM_DECODER 0
+#define CONFIG_XWD_DECODER 0
+#define CONFIG_Y41P_DECODER 0
+#define CONFIG_YLC_DECODER 0
+#define CONFIG_YOP_DECODER 0
+#define CONFIG_YUV4_DECODER 0
+#define CONFIG_ZERO12V_DECODER 0
+#define CONFIG_ZEROCODEC_DECODER 0
+#define CONFIG_ZLIB_DECODER 0
+#define CONFIG_ZMBV_DECODER 0
+#define CONFIG_AAC_DECODER 0
+#define CONFIG_AAC_FIXED_DECODER 0
+#define CONFIG_AAC_LATM_DECODER 0
+#define CONFIG_AC3_DECODER 0
+#define CONFIG_AC3_FIXED_DECODER 0
+#define CONFIG_ACELP_KELVIN_DECODER 0
+#define CONFIG_ALAC_DECODER 0
+#define CONFIG_ALS_DECODER 0
+#define CONFIG_AMRNB_DECODER 0
+#define CONFIG_AMRWB_DECODER 0
+#define CONFIG_APE_DECODER 0
+#define CONFIG_APTX_DECODER 1
+#define CONFIG_APTX_HD_DECODER 0
+#define CONFIG_ATRAC1_DECODER 0
+#define CONFIG_ATRAC3_DECODER 0
+#define CONFIG_ATRAC3AL_DECODER 0
+#define CONFIG_ATRAC3P_DECODER 0
+#define CONFIG_ATRAC3PAL_DECODER 0
+#define CONFIG_ATRAC9_DECODER 0
+#define CONFIG_BINKAUDIO_DCT_DECODER 0
+#define CONFIG_BINKAUDIO_RDFT_DECODER 0
+#define CONFIG_BMV_AUDIO_DECODER 0
+#define CONFIG_COOK_DECODER 0
+#define CONFIG_DCA_DECODER 0
+#define CONFIG_DOLBY_E_DECODER 0
+#define CONFIG_DSD_LSBF_DECODER 0
+#define CONFIG_DSD_MSBF_DECODER 0
+#define CONFIG_DSD_LSBF_PLANAR_DECODER 0
+#define CONFIG_DSD_MSBF_PLANAR_DECODER 0
+#define CONFIG_DSICINAUDIO_DECODER 0
+#define CONFIG_DSS_SP_DECODER 0
+#define CONFIG_DST_DECODER 0
+#define CONFIG_EAC3_DECODER 0
+#define CONFIG_EVRC_DECODER 0
+#define CONFIG_FFWAVESYNTH_DECODER 0
+#define CONFIG_FLAC_DECODER 1
+#define CONFIG_G723_1_DECODER 0
+#define CONFIG_G729_DECODER 0
+#define CONFIG_GSM_DECODER 0
+#define CONFIG_GSM_MS_DECODER 0
+#define CONFIG_HCA_DECODER 0
+#define CONFIG_HCOM_DECODER 0
+#define CONFIG_IAC_DECODER 0
+#define CONFIG_ILBC_DECODER 0
+#define CONFIG_IMC_DECODER 0
+#define CONFIG_INTERPLAY_ACM_DECODER 0
+#define CONFIG_MACE3_DECODER 0
+#define CONFIG_MACE6_DECODER 0
+#define CONFIG_METASOUND_DECODER 0
+#define CONFIG_MLP_DECODER 0
+#define CONFIG_MP1_DECODER 0
+#define CONFIG_MP1FLOAT_DECODER 0
+#define CONFIG_MP2_DECODER 0
+#define CONFIG_MP2FLOAT_DECODER 0
+#define CONFIG_MP3FLOAT_DECODER 0
+#define CONFIG_MP3_DECODER 1
+#define CONFIG_MP3ADUFLOAT_DECODER 0
+#define CONFIG_MP3ADU_DECODER 0
+#define CONFIG_MP3ON4FLOAT_DECODER 0
+#define CONFIG_MP3ON4_DECODER 0
+#define CONFIG_MPC7_DECODER 0
+#define CONFIG_MPC8_DECODER 0
+#define CONFIG_NELLYMOSER_DECODER 0
+#define CONFIG_ON2AVC_DECODER 0
+#define CONFIG_OPUS_DECODER 0
+#define CONFIG_PAF_AUDIO_DECODER 0
+#define CONFIG_QCELP_DECODER 0
+#define CONFIG_QDM2_DECODER 0
+#define CONFIG_QDMC_DECODER 0
+#define CONFIG_RA_144_DECODER 0
+#define CONFIG_RA_288_DECODER 0
+#define CONFIG_RALF_DECODER 0
+#define CONFIG_SBC_DECODER 1
+#define CONFIG_SHORTEN_DECODER 0
+#define CONFIG_SIPR_DECODER 0
+#define CONFIG_SIREN_DECODER 0
+#define CONFIG_SMACKAUD_DECODER 0
+#define CONFIG_SONIC_DECODER 0
+#define CONFIG_TAK_DECODER 0
+#define CONFIG_TRUEHD_DECODER 0
+#define CONFIG_TRUESPEECH_DECODER 0
+#define CONFIG_TTA_DECODER 0
+#define CONFIG_TWINVQ_DECODER 0
+#define CONFIG_VMDAUDIO_DECODER 0
+#define CONFIG_VORBIS_DECODER 1
+#define CONFIG_WAVPACK_DECODER 0
+#define CONFIG_WMALOSSLESS_DECODER 0
+#define CONFIG_WMAPRO_DECODER 0
+#define CONFIG_WMAV1_DECODER 0
+#define CONFIG_WMAV2_DECODER 0
+#define CONFIG_WMAVOICE_DECODER 0
+#define CONFIG_WS_SND1_DECODER 0
+#define CONFIG_XMA1_DECODER 0
+#define CONFIG_XMA2_DECODER 0
+#define CONFIG_PCM_ALAW_DECODER 1
+#define CONFIG_PCM_BLURAY_DECODER 0
+#define CONFIG_PCM_DVD_DECODER 0
+#define CONFIG_PCM_F16LE_DECODER 0
+#define CONFIG_PCM_F24LE_DECODER 0
+#define CONFIG_PCM_F32BE_DECODER 0
+#define CONFIG_PCM_F32LE_DECODER 1
+#define CONFIG_PCM_F64BE_DECODER 0
+#define CONFIG_PCM_F64LE_DECODER 0
+#define CONFIG_PCM_LXF_DECODER 0
+#define CONFIG_PCM_MULAW_DECODER 1
+#define CONFIG_PCM_S8_DECODER 0
+#define CONFIG_PCM_S8_PLANAR_DECODER 0
+#define CONFIG_PCM_S16BE_DECODER 1
+#define CONFIG_PCM_S16BE_PLANAR_DECODER 0
+#define CONFIG_PCM_S16LE_DECODER 1
+#define CONFIG_PCM_S16LE_PLANAR_DECODER 0
+#define CONFIG_PCM_S24BE_DECODER 1
+#define CONFIG_PCM_S24DAUD_DECODER 0
+#define CONFIG_PCM_S24LE_DECODER 1
+#define CONFIG_PCM_S24LE_PLANAR_DECODER 0
+#define CONFIG_PCM_S32BE_DECODER 0
+#define CONFIG_PCM_S32LE_DECODER 1
+#define CONFIG_PCM_S32LE_PLANAR_DECODER 0
+#define CONFIG_PCM_S64BE_DECODER 0
+#define CONFIG_PCM_S64LE_DECODER 0
+#define CONFIG_PCM_U8_DECODER 1
+#define CONFIG_PCM_U16BE_DECODER 0
+#define CONFIG_PCM_U16LE_DECODER 0
+#define CONFIG_PCM_U24BE_DECODER 0
+#define CONFIG_PCM_U24LE_DECODER 0
+#define CONFIG_PCM_U32BE_DECODER 0
+#define CONFIG_PCM_U32LE_DECODER 0
+#define CONFIG_PCM_VIDC_DECODER 0
+#define CONFIG_DERF_DPCM_DECODER 0
+#define CONFIG_GREMLIN_DPCM_DECODER 0
+#define CONFIG_INTERPLAY_DPCM_DECODER 0
+#define CONFIG_ROQ_DPCM_DECODER 0
+#define CONFIG_SDX2_DPCM_DECODER 0
+#define CONFIG_SOL_DPCM_DECODER 0
+#define CONFIG_XAN_DPCM_DECODER 0
+#define CONFIG_ADPCM_4XM_DECODER 0
+#define CONFIG_ADPCM_ADX_DECODER 0
+#define CONFIG_ADPCM_AFC_DECODER 0
+#define CONFIG_ADPCM_AGM_DECODER 0
+#define CONFIG_ADPCM_AICA_DECODER 0
+#define CONFIG_ADPCM_ARGO_DECODER 0
+#define CONFIG_ADPCM_CT_DECODER 0
+#define CONFIG_ADPCM_DTK_DECODER 0
+#define CONFIG_ADPCM_EA_DECODER 0
+#define CONFIG_ADPCM_EA_MAXIS_XA_DECODER 0
+#define CONFIG_ADPCM_EA_R1_DECODER 0
+#define CONFIG_ADPCM_EA_R2_DECODER 0
+#define CONFIG_ADPCM_EA_R3_DECODER 0
+#define CONFIG_ADPCM_EA_XAS_DECODER 0
+#define CONFIG_ADPCM_G722_DECODER 0
+#define CONFIG_ADPCM_G726_DECODER 0
+#define CONFIG_ADPCM_G726LE_DECODER 0
+#define CONFIG_ADPCM_IMA_AMV_DECODER 0
+#define CONFIG_ADPCM_IMA_ALP_DECODER 0
+#define CONFIG_ADPCM_IMA_APC_DECODER 0
+#define CONFIG_ADPCM_IMA_APM_DECODER 0
+#define CONFIG_ADPCM_IMA_DAT4_DECODER 0
+#define CONFIG_ADPCM_IMA_DK3_DECODER 0
+#define CONFIG_ADPCM_IMA_DK4_DECODER 0
+#define CONFIG_ADPCM_IMA_EA_EACS_DECODER 0
+#define CONFIG_ADPCM_IMA_EA_SEAD_DECODER 0
+#define CONFIG_ADPCM_IMA_ISS_DECODER 0
+#define CONFIG_ADPCM_IMA_MTF_DECODER 0
+#define CONFIG_ADPCM_IMA_OKI_DECODER 0
+#define CONFIG_ADPCM_IMA_QT_DECODER 0
+#define CONFIG_ADPCM_IMA_RAD_DECODER 0
+#define CONFIG_ADPCM_IMA_SSI_DECODER 0
+#define CONFIG_ADPCM_IMA_SMJPEG_DECODER 0
+#define CONFIG_ADPCM_IMA_WAV_DECODER 0
+#define CONFIG_ADPCM_IMA_WS_DECODER 0
+#define CONFIG_ADPCM_MS_DECODER 0
+#define CONFIG_ADPCM_MTAF_DECODER 0
+#define CONFIG_ADPCM_PSX_DECODER 0
+#define CONFIG_ADPCM_SBPRO_2_DECODER 0
+#define CONFIG_ADPCM_SBPRO_3_DECODER 0
+#define CONFIG_ADPCM_SBPRO_4_DECODER 0
+#define CONFIG_ADPCM_SWF_DECODER 0
+#define CONFIG_ADPCM_THP_DECODER 0
+#define CONFIG_ADPCM_THP_LE_DECODER 0
+#define CONFIG_ADPCM_VIMA_DECODER 0
+#define CONFIG_ADPCM_XA_DECODER 0
+#define CONFIG_ADPCM_YAMAHA_DECODER 0
+#define CONFIG_ADPCM_ZORK_DECODER 0
+#define CONFIG_SSA_DECODER 0
+#define CONFIG_ASS_DECODER 0
+#define CONFIG_CCAPTION_DECODER 0
+#define CONFIG_DVBSUB_DECODER 0
+#define CONFIG_DVDSUB_DECODER 0
+#define CONFIG_JACOSUB_DECODER 0
+#define CONFIG_MICRODVD_DECODER 0
+#define CONFIG_MOVTEXT_DECODER 0
+#define CONFIG_MPL2_DECODER 0
+#define CONFIG_PGSSUB_DECODER 0
+#define CONFIG_PJS_DECODER 0
+#define CONFIG_REALTEXT_DECODER 0
+#define CONFIG_SAMI_DECODER 0
+#define CONFIG_SRT_DECODER 0
+#define CONFIG_STL_DECODER 0
+#define CONFIG_SUBRIP_DECODER 0
+#define CONFIG_SUBVIEWER_DECODER 0
+#define CONFIG_SUBVIEWER1_DECODER 0
+#define CONFIG_TEXT_DECODER 0
+#define CONFIG_VPLAYER_DECODER 0
+#define CONFIG_WEBVTT_DECODER 0
+#define CONFIG_XSUB_DECODER 0
+#define CONFIG_AAC_AT_DECODER 0
+#define CONFIG_AC3_AT_DECODER 0
+#define CONFIG_ADPCM_IMA_QT_AT_DECODER 0
+#define CONFIG_ALAC_AT_DECODER 0
+#define CONFIG_AMR_NB_AT_DECODER 0
+#define CONFIG_EAC3_AT_DECODER 0
+#define CONFIG_GSM_MS_AT_DECODER 0
+#define CONFIG_ILBC_AT_DECODER 0
+#define CONFIG_MP1_AT_DECODER 0
+#define CONFIG_MP2_AT_DECODER 0
+#define CONFIG_MP3_AT_DECODER 0
+#define CONFIG_PCM_ALAW_AT_DECODER 0
+#define CONFIG_PCM_MULAW_AT_DECODER 0
+#define CONFIG_QDMC_AT_DECODER 0
+#define CONFIG_QDM2_AT_DECODER 0
+#define CONFIG_LIBARIBB24_DECODER 0
+#define CONFIG_LIBCELT_DECODER 0
+#define CONFIG_LIBCODEC2_DECODER 0
+#define CONFIG_LIBDAV1D_DECODER 0
+#define CONFIG_LIBDAVS2_DECODER 0
+#define CONFIG_LIBFDK_AAC_DECODER 0
+#define CONFIG_LIBGSM_DECODER 0
+#define CONFIG_LIBGSM_MS_DECODER 0
+#define CONFIG_LIBILBC_DECODER 0
+#define CONFIG_LIBOPENCORE_AMRNB_DECODER 0
+#define CONFIG_LIBOPENCORE_AMRWB_DECODER 0
+#define CONFIG_LIBOPENJPEG_DECODER 0
+#define CONFIG_LIBOPUS_DECODER 1
+#define CONFIG_LIBRSVG_DECODER 0
+#define CONFIG_LIBSPEEX_DECODER 0
+#define CONFIG_LIBVORBIS_DECODER 0
+#define CONFIG_LIBVPX_VP8_DECODER 0
+#define CONFIG_LIBVPX_VP9_DECODER 0
+#define CONFIG_LIBZVBI_TELETEXT_DECODER 0
+#define CONFIG_BINTEXT_DECODER 0
+#define CONFIG_XBIN_DECODER 0
+#define CONFIG_IDF_DECODER 0
+#define CONFIG_LIBAOM_AV1_DECODER 0
+#define CONFIG_LIBOPENH264_DECODER 0
+#define CONFIG_H264_CUVID_DECODER 0
+#define CONFIG_HEVC_CUVID_DECODER 0
+#define CONFIG_HEVC_MEDIACODEC_DECODER 0
+#define CONFIG_MJPEG_CUVID_DECODER 0
+#define CONFIG_MJPEG_QSV_DECODER 0
+#define CONFIG_MPEG1_CUVID_DECODER 0
+#define CONFIG_MPEG2_CUVID_DECODER 0
+#define CONFIG_MPEG4_CUVID_DECODER 0
+#define CONFIG_MPEG4_MEDIACODEC_DECODER 0
+#define CONFIG_VC1_CUVID_DECODER 0
+#define CONFIG_VP8_CUVID_DECODER 0
+#define CONFIG_VP8_MEDIACODEC_DECODER 0
+#define CONFIG_VP8_QSV_DECODER 0
+#define CONFIG_VP9_CUVID_DECODER 0
+#define CONFIG_VP9_MEDIACODEC_DECODER 0
+#define CONFIG_VP9_QSV_DECODER 0
+#define CONFIG_A64MULTI_ENCODER 0
+#define CONFIG_A64MULTI5_ENCODER 0
+#define CONFIG_ALIAS_PIX_ENCODER 0
+#define CONFIG_AMV_ENCODER 0
+#define CONFIG_APNG_ENCODER 0
+#define CONFIG_ASV1_ENCODER 0
+#define CONFIG_ASV2_ENCODER 0
+#define CONFIG_AVRP_ENCODER 0
+#define CONFIG_AVUI_ENCODER 0
+#define CONFIG_AYUV_ENCODER 0
+#define CONFIG_BMP_ENCODER 0
+#define CONFIG_CINEPAK_ENCODER 0
+#define CONFIG_CLJR_ENCODER 0
+#define CONFIG_COMFORTNOISE_ENCODER 0
+#define CONFIG_DNXHD_ENCODER 0
+#define CONFIG_DPX_ENCODER 0
+#define CONFIG_DVVIDEO_ENCODER 0
+#define CONFIG_FFV1_ENCODER 0
+#define CONFIG_FFVHUFF_ENCODER 0
+#define CONFIG_FITS_ENCODER 0
+#define CONFIG_FLASHSV_ENCODER 0
+#define CONFIG_FLASHSV2_ENCODER 0
+#define CONFIG_FLV_ENCODER 0
+#define CONFIG_GIF_ENCODER 0
+#define CONFIG_H261_ENCODER 0
+#define CONFIG_H263_ENCODER 0
+#define CONFIG_H263P_ENCODER 0
+#define CONFIG_HAP_ENCODER 0
+#define CONFIG_HUFFYUV_ENCODER 0
+#define CONFIG_JPEG2000_ENCODER 0
+#define CONFIG_JPEGLS_ENCODER 0
+#define CONFIG_LJPEG_ENCODER 0
+#define CONFIG_MAGICYUV_ENCODER 0
+#define CONFIG_MJPEG_ENCODER 0
+#define CONFIG_MPEG1VIDEO_ENCODER 0
+#define CONFIG_MPEG2VIDEO_ENCODER 0
+#define CONFIG_MPEG4_ENCODER 0
+#define CONFIG_MSMPEG4V2_ENCODER 0
+#define CONFIG_MSMPEG4V3_ENCODER 0
+#define CONFIG_MSVIDEO1_ENCODER 0
+#define CONFIG_PAM_ENCODER 0
+#define CONFIG_PBM_ENCODER 0
+#define CONFIG_PCX_ENCODER 0
+#define CONFIG_PGM_ENCODER 0
+#define CONFIG_PGMYUV_ENCODER 0
+#define CONFIG_PNG_ENCODER 0
+#define CONFIG_PPM_ENCODER 0
+#define CONFIG_PRORES_ENCODER 0
+#define CONFIG_PRORES_AW_ENCODER 0
+#define CONFIG_PRORES_KS_ENCODER 0
+#define CONFIG_QTRLE_ENCODER 0
+#define CONFIG_R10K_ENCODER 0
+#define CONFIG_R210_ENCODER 0
+#define CONFIG_RAWVIDEO_ENCODER 0
+#define CONFIG_ROQ_ENCODER 0
+#define CONFIG_RV10_ENCODER 0
+#define CONFIG_RV20_ENCODER 0
+#define CONFIG_S302M_ENCODER 0
+#define CONFIG_SGI_ENCODER 0
+#define CONFIG_SNOW_ENCODER 0
+#define CONFIG_SUNRAST_ENCODER 0
+#define CONFIG_SVQ1_ENCODER 0
+#define CONFIG_TARGA_ENCODER 0
+#define CONFIG_TIFF_ENCODER 0
+#define CONFIG_UTVIDEO_ENCODER 0
+#define CONFIG_V210_ENCODER 0
+#define CONFIG_V308_ENCODER 0
+#define CONFIG_V408_ENCODER 0
+#define CONFIG_V410_ENCODER 0
+#define CONFIG_VC2_ENCODER 0
+#define CONFIG_WRAPPED_AVFRAME_ENCODER 0
+#define CONFIG_WMV1_ENCODER 0
+#define CONFIG_WMV2_ENCODER 0
+#define CONFIG_XBM_ENCODER 0
+#define CONFIG_XFACE_ENCODER 0
+#define CONFIG_XWD_ENCODER 0
+#define CONFIG_Y41P_ENCODER 0
+#define CONFIG_YUV4_ENCODER 0
+#define CONFIG_ZLIB_ENCODER 0
+#define CONFIG_ZMBV_ENCODER 0
+#define CONFIG_AAC_ENCODER 0
+#define CONFIG_AC3_ENCODER 0
+#define CONFIG_AC3_FIXED_ENCODER 0
+#define CONFIG_ALAC_ENCODER 0
+#define CONFIG_APTX_ENCODER 0
+#define CONFIG_APTX_HD_ENCODER 0
+#define CONFIG_DCA_ENCODER 0
+#define CONFIG_EAC3_ENCODER 0
+#define CONFIG_FLAC_ENCODER 0
+#define CONFIG_G723_1_ENCODER 0
+#define CONFIG_MLP_ENCODER 0
+#define CONFIG_MP2_ENCODER 0
+#define CONFIG_MP2FIXED_ENCODER 0
+#define CONFIG_NELLYMOSER_ENCODER 0
+#define CONFIG_OPUS_ENCODER 0
+#define CONFIG_RA_144_ENCODER 0
+#define CONFIG_SBC_ENCODER 0
+#define CONFIG_SONIC_ENCODER 0
+#define CONFIG_SONIC_LS_ENCODER 0
+#define CONFIG_TRUEHD_ENCODER 0
+#define CONFIG_TTA_ENCODER 0
+#define CONFIG_VORBIS_ENCODER 0
+#define CONFIG_WAVPACK_ENCODER 0
+#define CONFIG_WMAV1_ENCODER 0
+#define CONFIG_WMAV2_ENCODER 0
+#define CONFIG_PCM_ALAW_ENCODER 0
+#define CONFIG_PCM_DVD_ENCODER 0
+#define CONFIG_PCM_F32BE_ENCODER 0
+#define CONFIG_PCM_F32LE_ENCODER 0
+#define CONFIG_PCM_F64BE_ENCODER 0
+#define CONFIG_PCM_F64LE_ENCODER 0
+#define CONFIG_PCM_MULAW_ENCODER 0
+#define CONFIG_PCM_S8_ENCODER 0
+#define CONFIG_PCM_S8_PLANAR_ENCODER 0
+#define CONFIG_PCM_S16BE_ENCODER 0
+#define CONFIG_PCM_S16BE_PLANAR_ENCODER 0
+#define CONFIG_PCM_S16LE_ENCODER 0
+#define CONFIG_PCM_S16LE_PLANAR_ENCODER 0
+#define CONFIG_PCM_S24BE_ENCODER 0
+#define CONFIG_PCM_S24DAUD_ENCODER 0
+#define CONFIG_PCM_S24LE_ENCODER 0
+#define CONFIG_PCM_S24LE_PLANAR_ENCODER 0
+#define CONFIG_PCM_S32BE_ENCODER 0
+#define CONFIG_PCM_S32LE_ENCODER 0
+#define CONFIG_PCM_S32LE_PLANAR_ENCODER 0
+#define CONFIG_PCM_S64BE_ENCODER 0
+#define CONFIG_PCM_S64LE_ENCODER 0
+#define CONFIG_PCM_U8_ENCODER 0
+#define CONFIG_PCM_U16BE_ENCODER 0
+#define CONFIG_PCM_U16LE_ENCODER 0
+#define CONFIG_PCM_U24BE_ENCODER 0
+#define CONFIG_PCM_U24LE_ENCODER 0
+#define CONFIG_PCM_U32BE_ENCODER 0
+#define CONFIG_PCM_U32LE_ENCODER 0
+#define CONFIG_PCM_VIDC_ENCODER 0
+#define CONFIG_ROQ_DPCM_ENCODER 0
+#define CONFIG_ADPCM_ADX_ENCODER 0
+#define CONFIG_ADPCM_G722_ENCODER 0
+#define CONFIG_ADPCM_G726_ENCODER 0
+#define CONFIG_ADPCM_G726LE_ENCODER 0
+#define CONFIG_ADPCM_IMA_QT_ENCODER 0
+#define CONFIG_ADPCM_IMA_WAV_ENCODER 0
+#define CONFIG_ADPCM_MS_ENCODER 0
+#define CONFIG_ADPCM_SWF_ENCODER 0
+#define CONFIG_ADPCM_YAMAHA_ENCODER 0
+#define CONFIG_SSA_ENCODER 0
+#define CONFIG_ASS_ENCODER 0
+#define CONFIG_DVBSUB_ENCODER 0
+#define CONFIG_DVDSUB_ENCODER 0
+#define CONFIG_MOVTEXT_ENCODER 0
+#define CONFIG_SRT_ENCODER 0
+#define CONFIG_SUBRIP_ENCODER 0
+#define CONFIG_TEXT_ENCODER 0
+#define CONFIG_WEBVTT_ENCODER 0
+#define CONFIG_XSUB_ENCODER 0
+#define CONFIG_AAC_AT_ENCODER 0
+#define CONFIG_ALAC_AT_ENCODER 0
+#define CONFIG_ILBC_AT_ENCODER 0
+#define CONFIG_PCM_ALAW_AT_ENCODER 0
+#define CONFIG_PCM_MULAW_AT_ENCODER 0
+#define CONFIG_LIBAOM_AV1_ENCODER 0
+#define CONFIG_LIBCODEC2_ENCODER 0
+#define CONFIG_LIBFDK_AAC_ENCODER 0
+#define CONFIG_LIBGSM_ENCODER 0
+#define CONFIG_LIBGSM_MS_ENCODER 0
+#define CONFIG_LIBILBC_ENCODER 0
+#define CONFIG_LIBMP3LAME_ENCODER 0
+#define CONFIG_LIBOPENCORE_AMRNB_ENCODER 0
+#define CONFIG_LIBOPENJPEG_ENCODER 0
+#define CONFIG_LIBOPUS_ENCODER 0
+#define CONFIG_LIBRAV1E_ENCODER 0
+#define CONFIG_LIBSHINE_ENCODER 0
+#define CONFIG_LIBSPEEX_ENCODER 0
+#define CONFIG_LIBTHEORA_ENCODER 0
+#define CONFIG_LIBTWOLAME_ENCODER 0
+#define CONFIG_LIBVO_AMRWBENC_ENCODER 0
+#define CONFIG_LIBVORBIS_ENCODER 0
+#define CONFIG_LIBVPX_VP8_ENCODER 0
+#define CONFIG_LIBVPX_VP9_ENCODER 0
+#define CONFIG_LIBWAVPACK_ENCODER 0
+#define CONFIG_LIBWEBP_ANIM_ENCODER 0
+#define CONFIG_LIBWEBP_ENCODER 0
+#define CONFIG_LIBX262_ENCODER 0
+#define CONFIG_LIBX264_ENCODER 0
+#define CONFIG_LIBX264RGB_ENCODER 0
+#define CONFIG_LIBX265_ENCODER 0
+#define CONFIG_LIBXAVS_ENCODER 0
+#define CONFIG_LIBXAVS2_ENCODER 0
+#define CONFIG_LIBXVID_ENCODER 0
+#define CONFIG_H263_V4L2M2M_ENCODER 0
+#define CONFIG_LIBOPENH264_ENCODER 0
+#define CONFIG_H264_AMF_ENCODER 0
+#define CONFIG_H264_NVENC_ENCODER 0
+#define CONFIG_H264_OMX_ENCODER 0
+#define CONFIG_H264_QSV_ENCODER 0
+#define CONFIG_H264_V4L2M2M_ENCODER 0
+#define CONFIG_H264_VAAPI_ENCODER 0
+#define CONFIG_H264_VIDEOTOOLBOX_ENCODER 0
+#define CONFIG_NVENC_ENCODER 0
+#define CONFIG_NVENC_H264_ENCODER 0
+#define CONFIG_NVENC_HEVC_ENCODER 0
+#define CONFIG_HEVC_AMF_ENCODER 0
+#define CONFIG_HEVC_NVENC_ENCODER 0
+#define CONFIG_HEVC_QSV_ENCODER 0
+#define CONFIG_HEVC_V4L2M2M_ENCODER 0
+#define CONFIG_HEVC_VAAPI_ENCODER 0
+#define CONFIG_HEVC_VIDEOTOOLBOX_ENCODER 0
+#define CONFIG_LIBKVAZAAR_ENCODER 0
+#define CONFIG_MJPEG_QSV_ENCODER 0
+#define CONFIG_MJPEG_VAAPI_ENCODER 0
+#define CONFIG_MPEG2_QSV_ENCODER 0
+#define CONFIG_MPEG2_VAAPI_ENCODER 0
+#define CONFIG_MPEG4_OMX_ENCODER 0
+#define CONFIG_MPEG4_V4L2M2M_ENCODER 0
+#define CONFIG_VP8_V4L2M2M_ENCODER 0
+#define CONFIG_VP8_VAAPI_ENCODER 0
+#define CONFIG_VP9_VAAPI_ENCODER 0
+#define CONFIG_VP9_QSV_ENCODER 0
+#define CONFIG_H263_VAAPI_HWACCEL 0
+#define CONFIG_H263_VIDEOTOOLBOX_HWACCEL 0
+#define CONFIG_H264_D3D11VA_HWACCEL 0
+#define CONFIG_H264_D3D11VA2_HWACCEL 0
+#define CONFIG_H264_DXVA2_HWACCEL 0
+#define CONFIG_H264_NVDEC_HWACCEL 0
+#define CONFIG_H264_VAAPI_HWACCEL 0
+#define CONFIG_H264_VDPAU_HWACCEL 0
+#define CONFIG_H264_VIDEOTOOLBOX_HWACCEL 0
+#define CONFIG_HEVC_D3D11VA_HWACCEL 0
+#define CONFIG_HEVC_D3D11VA2_HWACCEL 0
+#define CONFIG_HEVC_DXVA2_HWACCEL 0
+#define CONFIG_HEVC_NVDEC_HWACCEL 0
+#define CONFIG_HEVC_VAAPI_HWACCEL 0
+#define CONFIG_HEVC_VDPAU_HWACCEL 0
+#define CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL 0
+#define CONFIG_MJPEG_NVDEC_HWACCEL 0
+#define CONFIG_MJPEG_VAAPI_HWACCEL 0
+#define CONFIG_MPEG1_NVDEC_HWACCEL 0
+#define CONFIG_MPEG1_VDPAU_HWACCEL 0
+#define CONFIG_MPEG1_VIDEOTOOLBOX_HWACCEL 0
+#define CONFIG_MPEG1_XVMC_HWACCEL 0
+#define CONFIG_MPEG2_D3D11VA_HWACCEL 0
+#define CONFIG_MPEG2_D3D11VA2_HWACCEL 0
+#define CONFIG_MPEG2_NVDEC_HWACCEL 0
+#define CONFIG_MPEG2_DXVA2_HWACCEL 0
+#define CONFIG_MPEG2_VAAPI_HWACCEL 0
+#define CONFIG_MPEG2_VDPAU_HWACCEL 0
+#define CONFIG_MPEG2_VIDEOTOOLBOX_HWACCEL 0
+#define CONFIG_MPEG2_XVMC_HWACCEL 0
+#define CONFIG_MPEG4_NVDEC_HWACCEL 0
+#define CONFIG_MPEG4_VAAPI_HWACCEL 0
+#define CONFIG_MPEG4_VDPAU_HWACCEL 0
+#define CONFIG_MPEG4_VIDEOTOOLBOX_HWACCEL 0
+#define CONFIG_VC1_D3D11VA_HWACCEL 0
+#define CONFIG_VC1_D3D11VA2_HWACCEL 0
+#define CONFIG_VC1_DXVA2_HWACCEL 0
+#define CONFIG_VC1_NVDEC_HWACCEL 0
+#define CONFIG_VC1_VAAPI_HWACCEL 0
+#define CONFIG_VC1_VDPAU_HWACCEL 0
+#define CONFIG_VP8_NVDEC_HWACCEL 0
+#define CONFIG_VP8_VAAPI_HWACCEL 0
+#define CONFIG_VP9_D3D11VA_HWACCEL 0
+#define CONFIG_VP9_D3D11VA2_HWACCEL 0
+#define CONFIG_VP9_DXVA2_HWACCEL 0
+#define CONFIG_VP9_NVDEC_HWACCEL 0
+#define CONFIG_VP9_VAAPI_HWACCEL 0
+#define CONFIG_VP9_VDPAU_HWACCEL 0
+#define CONFIG_WMV3_D3D11VA_HWACCEL 0
+#define CONFIG_WMV3_D3D11VA2_HWACCEL 0
+#define CONFIG_WMV3_DXVA2_HWACCEL 0
+#define CONFIG_WMV3_NVDEC_HWACCEL 0
+#define CONFIG_WMV3_VAAPI_HWACCEL 0
+#define CONFIG_WMV3_VDPAU_HWACCEL 0
+#define CONFIG_AAC_PARSER 0
+#define CONFIG_AAC_LATM_PARSER 0
+#define CONFIG_AC3_PARSER 0
+#define CONFIG_ADX_PARSER 0
+#define CONFIG_AV1_PARSER 0
+#define CONFIG_AVS2_PARSER 0
+#define CONFIG_BMP_PARSER 0
+#define CONFIG_CAVSVIDEO_PARSER 0
+#define CONFIG_COOK_PARSER 0
+#define CONFIG_DCA_PARSER 0
+#define CONFIG_DIRAC_PARSER 0
+#define CONFIG_DNXHD_PARSER 0
+#define CONFIG_DPX_PARSER 0
+#define CONFIG_DVAUDIO_PARSER 0
+#define CONFIG_DVBSUB_PARSER 0
+#define CONFIG_DVDSUB_PARSER 0
+#define CONFIG_DVD_NAV_PARSER 0
+#define CONFIG_FLAC_PARSER 1
+#define CONFIG_G723_1_PARSER 0
+#define CONFIG_G729_PARSER 0
+#define CONFIG_GIF_PARSER 0
+#define CONFIG_GSM_PARSER 0
+#define CONFIG_H261_PARSER 0
+#define CONFIG_H263_PARSER 0
+#define CONFIG_H264_PARSER 0
+#define CONFIG_HEVC_PARSER 0
+#define CONFIG_MJPEG_PARSER 0
+#define CONFIG_MLP_PARSER 0
+#define CONFIG_MPEG4VIDEO_PARSER 0
+#define CONFIG_MPEGAUDIO_PARSER 1
+#define CONFIG_MPEGVIDEO_PARSER 0
+#define CONFIG_OPUS_PARSER 1
+#define CONFIG_PNG_PARSER 0
+#define CONFIG_PNM_PARSER 0
+#define CONFIG_RV30_PARSER 0
+#define CONFIG_RV40_PARSER 0
+#define CONFIG_SBC_PARSER 0
+#define CONFIG_SIPR_PARSER 0
+#define CONFIG_TAK_PARSER 0
+#define CONFIG_VC1_PARSER 0
+#define CONFIG_VORBIS_PARSER 1
+#define CONFIG_VP3_PARSER 1
+#define CONFIG_VP8_PARSER 1
+#define CONFIG_VP9_PARSER 1
+#define CONFIG_WEBP_PARSER 0
+#define CONFIG_XMA_PARSER 0
+#define CONFIG_ALSA_INDEV 0
+#define CONFIG_ANDROID_CAMERA_INDEV 0
+#define CONFIG_AVFOUNDATION_INDEV 0
+#define CONFIG_BKTR_INDEV 0
+#define CONFIG_DECKLINK_INDEV 0
+#define CONFIG_DSHOW_INDEV 0
+#define CONFIG_FBDEV_INDEV 0
+#define CONFIG_GDIGRAB_INDEV 0
+#define CONFIG_IEC61883_INDEV 0
+#define CONFIG_JACK_INDEV 0
+#define CONFIG_KMSGRAB_INDEV 0
+#define CONFIG_LAVFI_INDEV 0
+#define CONFIG_OPENAL_INDEV 0
+#define CONFIG_OSS_INDEV 0
+#define CONFIG_PULSE_INDEV 0
+#define CONFIG_SNDIO_INDEV 0
+#define CONFIG_V4L2_INDEV 0
+#define CONFIG_VFWCAP_INDEV 0
+#define CONFIG_XCBGRAB_INDEV 0
+#define CONFIG_LIBCDIO_INDEV 0
+#define CONFIG_LIBDC1394_INDEV 0
+#define CONFIG_ALSA_OUTDEV 0
+#define CONFIG_CACA_OUTDEV 0
+#define CONFIG_DECKLINK_OUTDEV 0
+#define CONFIG_FBDEV_OUTDEV 0
+#define CONFIG_OPENGL_OUTDEV 0
+#define CONFIG_OSS_OUTDEV 0
+#define CONFIG_PULSE_OUTDEV 0
+#define CONFIG_SDL2_OUTDEV 0
+#define CONFIG_SNDIO_OUTDEV 0
+#define CONFIG_V4L2_OUTDEV 0
+#define CONFIG_XV_OUTDEV 0
+#define CONFIG_ABENCH_FILTER 0
+#define CONFIG_ACOMPRESSOR_FILTER 0
+#define CONFIG_ACONTRAST_FILTER 0
+#define CONFIG_ACOPY_FILTER 0
+#define CONFIG_ACUE_FILTER 0
+#define CONFIG_ACROSSFADE_FILTER 0
+#define CONFIG_ACROSSOVER_FILTER 0
+#define CONFIG_ACRUSHER_FILTER 0
+#define CONFIG_ADECLICK_FILTER 0
+#define CONFIG_ADECLIP_FILTER 0
+#define CONFIG_ADELAY_FILTER 0
+#define CONFIG_ADERIVATIVE_FILTER 0
+#define CONFIG_AECHO_FILTER 0
+#define CONFIG_AEMPHASIS_FILTER 0
+#define CONFIG_AEVAL_FILTER 0
+#define CONFIG_AFADE_FILTER 0
+#define CONFIG_AFFTDN_FILTER 0
+#define CONFIG_AFFTFILT_FILTER 0
+#define CONFIG_AFIR_FILTER 0
+#define CONFIG_AFORMAT_FILTER 0
+#define CONFIG_AGATE_FILTER 0
+#define CONFIG_AIIR_FILTER 0
+#define CONFIG_AINTEGRAL_FILTER 0
+#define CONFIG_AINTERLEAVE_FILTER 0
+#define CONFIG_ALIMITER_FILTER 0
+#define CONFIG_ALLPASS_FILTER 0
+#define CONFIG_ALOOP_FILTER 0
+#define CONFIG_AMERGE_FILTER 0
+#define CONFIG_AMETADATA_FILTER 0
+#define CONFIG_AMIX_FILTER 0
+#define CONFIG_AMULTIPLY_FILTER 0
+#define CONFIG_ANEQUALIZER_FILTER 0
+#define CONFIG_ANLMDN_FILTER 0
+#define CONFIG_ANLMS_FILTER 0
+#define CONFIG_ANULL_FILTER 0
+#define CONFIG_APAD_FILTER 0
+#define CONFIG_APERMS_FILTER 0
+#define CONFIG_APHASER_FILTER 0
+#define CONFIG_APULSATOR_FILTER 0
+#define CONFIG_AREALTIME_FILTER 0
+#define CONFIG_ARESAMPLE_FILTER 0
+#define CONFIG_AREVERSE_FILTER 0
+#define CONFIG_ARNNDN_FILTER 0
+#define CONFIG_ASELECT_FILTER 0
+#define CONFIG_ASENDCMD_FILTER 0
+#define CONFIG_ASETNSAMPLES_FILTER 0
+#define CONFIG_ASETPTS_FILTER 0
+#define CONFIG_ASETRATE_FILTER 0
+#define CONFIG_ASETTB_FILTER 0
+#define CONFIG_ASHOWINFO_FILTER 0
+#define CONFIG_ASIDEDATA_FILTER 0
+#define CONFIG_ASOFTCLIP_FILTER 0
+#define CONFIG_ASPLIT_FILTER 0
+#define CONFIG_ASR_FILTER 0
+#define CONFIG_ASTATS_FILTER 0
+#define CONFIG_ASTREAMSELECT_FILTER 0
+#define CONFIG_ATEMPO_FILTER 0
+#define CONFIG_ATRIM_FILTER 0
+#define CONFIG_AXCORRELATE_FILTER 0
+#define CONFIG_AZMQ_FILTER 0
+#define CONFIG_BANDPASS_FILTER 0
+#define CONFIG_BANDREJECT_FILTER 0
+#define CONFIG_BASS_FILTER 0
+#define CONFIG_BIQUAD_FILTER 0
+#define CONFIG_BS2B_FILTER 0
+#define CONFIG_CHROMABER_VULKAN_FILTER 0
+#define CONFIG_CHANNELMAP_FILTER 0
+#define CONFIG_CHANNELSPLIT_FILTER 0
+#define CONFIG_CHORUS_FILTER 0
+#define CONFIG_COMPAND_FILTER 0
+#define CONFIG_COMPENSATIONDELAY_FILTER 0
+#define CONFIG_CROSSFEED_FILTER 0
+#define CONFIG_CRYSTALIZER_FILTER 0
+#define CONFIG_DCSHIFT_FILTER 0
+#define CONFIG_DEESSER_FILTER 0
+#define CONFIG_DRMETER_FILTER 0
+#define CONFIG_DYNAUDNORM_FILTER 0
+#define CONFIG_EARWAX_FILTER 0
+#define CONFIG_EBUR128_FILTER 0
+#define CONFIG_EQUALIZER_FILTER 0
+#define CONFIG_EXTRASTEREO_FILTER 0
+#define CONFIG_FIREQUALIZER_FILTER 0
+#define CONFIG_FLANGER_FILTER 0
+#define CONFIG_HAAS_FILTER 0
+#define CONFIG_HDCD_FILTER 0
+#define CONFIG_HEADPHONE_FILTER 0
+#define CONFIG_HIGHPASS_FILTER 0
+#define CONFIG_HIGHSHELF_FILTER 0
+#define CONFIG_JOIN_FILTER 0
+#define CONFIG_LADSPA_FILTER 0
+#define CONFIG_LOUDNORM_FILTER 0
+#define CONFIG_LOWPASS_FILTER 0
+#define CONFIG_LOWSHELF_FILTER 0
+#define CONFIG_LV2_FILTER 0
+#define CONFIG_MCOMPAND_FILTER 0
+#define CONFIG_PAN_FILTER 0
+#define CONFIG_REPLAYGAIN_FILTER 0
+#define CONFIG_RESAMPLE_FILTER 0
+#define CONFIG_RUBBERBAND_FILTER 0
+#define CONFIG_SIDECHAINCOMPRESS_FILTER 0
+#define CONFIG_SIDECHAINGATE_FILTER 0
+#define CONFIG_SILENCEDETECT_FILTER 0
+#define CONFIG_SILENCEREMOVE_FILTER 0
+#define CONFIG_SOFALIZER_FILTER 0
+#define CONFIG_STEREOTOOLS_FILTER 0
+#define CONFIG_STEREOWIDEN_FILTER 0
+#define CONFIG_SUPEREQUALIZER_FILTER 0
+#define CONFIG_SURROUND_FILTER 0
+#define CONFIG_TREBLE_FILTER 0
+#define CONFIG_TREMOLO_FILTER 0
+#define CONFIG_VIBRATO_FILTER 0
+#define CONFIG_VOLUME_FILTER 0
+#define CONFIG_VOLUMEDETECT_FILTER 0
+#define CONFIG_AEVALSRC_FILTER 0
+#define CONFIG_AFIRSRC_FILTER 0
+#define CONFIG_ANOISESRC_FILTER 0
+#define CONFIG_ANULLSRC_FILTER 0
+#define CONFIG_FLITE_FILTER 0
+#define CONFIG_HILBERT_FILTER 0
+#define CONFIG_SINC_FILTER 0
+#define CONFIG_SINE_FILTER 0
+#define CONFIG_ANULLSINK_FILTER 0
+#define CONFIG_ADDROI_FILTER 0
+#define CONFIG_ALPHAEXTRACT_FILTER 0
+#define CONFIG_ALPHAMERGE_FILTER 0
+#define CONFIG_AMPLIFY_FILTER 0
+#define CONFIG_ASS_FILTER 0
+#define CONFIG_ATADENOISE_FILTER 0
+#define CONFIG_AVGBLUR_FILTER 0
+#define CONFIG_AVGBLUR_OPENCL_FILTER 0
+#define CONFIG_AVGBLUR_VULKAN_FILTER 0
+#define CONFIG_BBOX_FILTER 0
+#define CONFIG_BENCH_FILTER 0
+#define CONFIG_BILATERAL_FILTER 0
+#define CONFIG_BITPLANENOISE_FILTER 0
+#define CONFIG_BLACKDETECT_FILTER 0
+#define CONFIG_BLACKFRAME_FILTER 0
+#define CONFIG_BLEND_FILTER 0
+#define CONFIG_BM3D_FILTER 0
+#define CONFIG_BOXBLUR_FILTER 0
+#define CONFIG_BOXBLUR_OPENCL_FILTER 0
+#define CONFIG_BWDIF_FILTER 0
+#define CONFIG_CAS_FILTER 0
+#define CONFIG_CHROMAHOLD_FILTER 0
+#define CONFIG_CHROMAKEY_FILTER 0
+#define CONFIG_CHROMASHIFT_FILTER 0
+#define CONFIG_CIESCOPE_FILTER 0
+#define CONFIG_CODECVIEW_FILTER 0
+#define CONFIG_COLORBALANCE_FILTER 0
+#define CONFIG_COLORCHANNELMIXER_FILTER 0
+#define CONFIG_COLORKEY_FILTER 0
+#define CONFIG_COLORKEY_OPENCL_FILTER 0
+#define CONFIG_COLORHOLD_FILTER 0
+#define CONFIG_COLORLEVELS_FILTER 0
+#define CONFIG_COLORMATRIX_FILTER 0
+#define CONFIG_COLORSPACE_FILTER 0
+#define CONFIG_CONVOLUTION_FILTER 0
+#define CONFIG_CONVOLUTION_OPENCL_FILTER 0
+#define CONFIG_CONVOLVE_FILTER 0
+#define CONFIG_COPY_FILTER 0
+#define CONFIG_COREIMAGE_FILTER 0
+#define CONFIG_COVER_RECT_FILTER 0
+#define CONFIG_CROP_FILTER 0
+#define CONFIG_CROPDETECT_FILTER 0
+#define CONFIG_CUE_FILTER 0
+#define CONFIG_CURVES_FILTER 0
+#define CONFIG_DATASCOPE_FILTER 0
+#define CONFIG_DCTDNOIZ_FILTER 0
+#define CONFIG_DEBAND_FILTER 0
+#define CONFIG_DEBLOCK_FILTER 0
+#define CONFIG_DECIMATE_FILTER 0
+#define CONFIG_DECONVOLVE_FILTER 0
+#define CONFIG_DEDOT_FILTER 0
+#define CONFIG_DEFLATE_FILTER 0
+#define CONFIG_DEFLICKER_FILTER 0
+#define CONFIG_DEINTERLACE_QSV_FILTER 0
+#define CONFIG_DEINTERLACE_VAAPI_FILTER 0
+#define CONFIG_DEJUDDER_FILTER 0
+#define CONFIG_DELOGO_FILTER 0
+#define CONFIG_DENOISE_VAAPI_FILTER 0
+#define CONFIG_DERAIN_FILTER 0
+#define CONFIG_DESHAKE_FILTER 0
+#define CONFIG_DESHAKE_OPENCL_FILTER 0
+#define CONFIG_DESPILL_FILTER 0
+#define CONFIG_DETELECINE_FILTER 0
+#define CONFIG_DILATION_FILTER 0
+#define CONFIG_DILATION_OPENCL_FILTER 0
+#define CONFIG_DISPLACE_FILTER 0
+#define CONFIG_DNN_PROCESSING_FILTER 0
+#define CONFIG_DOUBLEWEAVE_FILTER 0
+#define CONFIG_DRAWBOX_FILTER 0
+#define CONFIG_DRAWGRAPH_FILTER 0
+#define CONFIG_DRAWGRID_FILTER 0
+#define CONFIG_DRAWTEXT_FILTER 0
+#define CONFIG_EDGEDETECT_FILTER 0
+#define CONFIG_ELBG_FILTER 0
+#define CONFIG_ENTROPY_FILTER 0
+#define CONFIG_EQ_FILTER 0
+#define CONFIG_EROSION_FILTER 0
+#define CONFIG_EROSION_OPENCL_FILTER 0
+#define CONFIG_EXTRACTPLANES_FILTER 0
+#define CONFIG_FADE_FILTER 0
+#define CONFIG_FFTDNOIZ_FILTER 0
+#define CONFIG_FFTFILT_FILTER 0
+#define CONFIG_FIELD_FILTER 0
+#define CONFIG_FIELDHINT_FILTER 0
+#define CONFIG_FIELDMATCH_FILTER 0
+#define CONFIG_FIELDORDER_FILTER 0
+#define CONFIG_FILLBORDERS_FILTER 0
+#define CONFIG_FIND_RECT_FILTER 0
+#define CONFIG_FLOODFILL_FILTER 0
+#define CONFIG_FORMAT_FILTER 0
+#define CONFIG_FPS_FILTER 0
+#define CONFIG_FRAMEPACK_FILTER 0
+#define CONFIG_FRAMERATE_FILTER 0
+#define CONFIG_FRAMESTEP_FILTER 0
+#define CONFIG_FREEZEDETECT_FILTER 0
+#define CONFIG_FREEZEFRAMES_FILTER 0
+#define CONFIG_FREI0R_FILTER 0
+#define CONFIG_FSPP_FILTER 0
+#define CONFIG_GBLUR_FILTER 0
+#define CONFIG_GEQ_FILTER 0
+#define CONFIG_GRADFUN_FILTER 0
+#define CONFIG_GRAPHMONITOR_FILTER 0
+#define CONFIG_GREYEDGE_FILTER 0
+#define CONFIG_HALDCLUT_FILTER 0
+#define CONFIG_HFLIP_FILTER 0
+#define CONFIG_HISTEQ_FILTER 0
+#define CONFIG_HISTOGRAM_FILTER 0
+#define CONFIG_HQDN3D_FILTER 0
+#define CONFIG_HQX_FILTER 0
+#define CONFIG_HSTACK_FILTER 0
+#define CONFIG_HUE_FILTER 0
+#define CONFIG_HWDOWNLOAD_FILTER 0
+#define CONFIG_HWMAP_FILTER 0
+#define CONFIG_HWUPLOAD_FILTER 0
+#define CONFIG_HWUPLOAD_CUDA_FILTER 0
+#define CONFIG_HYSTERESIS_FILTER 0
+#define CONFIG_IDET_FILTER 0
+#define CONFIG_IL_FILTER 0
+#define CONFIG_INFLATE_FILTER 0
+#define CONFIG_INTERLACE_FILTER 0
+#define CONFIG_INTERLEAVE_FILTER 0
+#define CONFIG_KERNDEINT_FILTER 0
+#define CONFIG_LAGFUN_FILTER 0
+#define CONFIG_LENSCORRECTION_FILTER 0
+#define CONFIG_LENSFUN_FILTER 0
+#define CONFIG_LIBVMAF_FILTER 0
+#define CONFIG_LIMITER_FILTER 0
+#define CONFIG_LOOP_FILTER 0
+#define CONFIG_LUMAKEY_FILTER 0
+#define CONFIG_LUT_FILTER 0
+#define CONFIG_LUT1D_FILTER 0
+#define CONFIG_LUT2_FILTER 0
+#define CONFIG_LUT3D_FILTER 0
+#define CONFIG_LUTRGB_FILTER 0
+#define CONFIG_LUTYUV_FILTER 0
+#define CONFIG_MASKEDCLAMP_FILTER 0
+#define CONFIG_MASKEDMAX_FILTER 0
+#define CONFIG_MASKEDMERGE_FILTER 0
+#define CONFIG_MASKEDMIN_FILTER 0
+#define CONFIG_MASKEDTHRESHOLD_FILTER 0
+#define CONFIG_MASKFUN_FILTER 0
+#define CONFIG_MCDEINT_FILTER 0
+#define CONFIG_MEDIAN_FILTER 0
+#define CONFIG_MERGEPLANES_FILTER 0
+#define CONFIG_MESTIMATE_FILTER 0
+#define CONFIG_METADATA_FILTER 0
+#define CONFIG_MIDEQUALIZER_FILTER 0
+#define CONFIG_MINTERPOLATE_FILTER 0
+#define CONFIG_MIX_FILTER 0
+#define CONFIG_MPDECIMATE_FILTER 0
+#define CONFIG_NEGATE_FILTER 0
+#define CONFIG_NLMEANS_FILTER 0
+#define CONFIG_NLMEANS_OPENCL_FILTER 0
+#define CONFIG_NNEDI_FILTER 0
+#define CONFIG_NOFORMAT_FILTER 0
+#define CONFIG_NOISE_FILTER 0
+#define CONFIG_NORMALIZE_FILTER 0
+#define CONFIG_NULL_FILTER 0
+#define CONFIG_OCR_FILTER 0
+#define CONFIG_OCV_FILTER 0
+#define CONFIG_OSCILLOSCOPE_FILTER 0
+#define CONFIG_OVERLAY_FILTER 0
+#define CONFIG_OVERLAY_OPENCL_FILTER 0
+#define CONFIG_OVERLAY_QSV_FILTER 0
+#define CONFIG_OVERLAY_VULKAN_FILTER 0
+#define CONFIG_OVERLAY_CUDA_FILTER 0
+#define CONFIG_OWDENOISE_FILTER 0
+#define CONFIG_PAD_FILTER 0
+#define CONFIG_PAD_OPENCL_FILTER 0
+#define CONFIG_PALETTEGEN_FILTER 0
+#define CONFIG_PALETTEUSE_FILTER 0
+#define CONFIG_PERMS_FILTER 0
+#define CONFIG_PERSPECTIVE_FILTER 0
+#define CONFIG_PHASE_FILTER 0
+#define CONFIG_PHOTOSENSITIVITY_FILTER 0
+#define CONFIG_PIXDESCTEST_FILTER 0
+#define CONFIG_PIXSCOPE_FILTER 0
+#define CONFIG_PP_FILTER 0
+#define CONFIG_PP7_FILTER 0
+#define CONFIG_PREMULTIPLY_FILTER 0
+#define CONFIG_PREWITT_FILTER 0
+#define CONFIG_PREWITT_OPENCL_FILTER 0
+#define CONFIG_PROCAMP_VAAPI_FILTER 0
+#define CONFIG_PROGRAM_OPENCL_FILTER 0
+#define CONFIG_PSEUDOCOLOR_FILTER 0
+#define CONFIG_PSNR_FILTER 0
+#define CONFIG_PULLUP_FILTER 0
+#define CONFIG_QP_FILTER 0
+#define CONFIG_RANDOM_FILTER 0
+#define CONFIG_READEIA608_FILTER 0
+#define CONFIG_READVITC_FILTER 0
+#define CONFIG_REALTIME_FILTER 0
+#define CONFIG_REMAP_FILTER 0
+#define CONFIG_REMOVEGRAIN_FILTER 0
+#define CONFIG_REMOVELOGO_FILTER 0
+#define CONFIG_REPEATFIELDS_FILTER 0
+#define CONFIG_REVERSE_FILTER 0
+#define CONFIG_RGBASHIFT_FILTER 0
+#define CONFIG_ROBERTS_FILTER 0
+#define CONFIG_ROBERTS_OPENCL_FILTER 0
+#define CONFIG_ROTATE_FILTER 0
+#define CONFIG_SAB_FILTER 0
+#define CONFIG_SCALE_FILTER 0
+#define CONFIG_SCALE_CUDA_FILTER 0
+#define CONFIG_SCALE_NPP_FILTER 0
+#define CONFIG_SCALE_QSV_FILTER 0
+#define CONFIG_SCALE_VAAPI_FILTER 0
+#define CONFIG_SCALE_VULKAN_FILTER 0
+#define CONFIG_SCALE2REF_FILTER 0
+#define CONFIG_SCROLL_FILTER 0
+#define CONFIG_SELECT_FILTER 0
+#define CONFIG_SELECTIVECOLOR_FILTER 0
+#define CONFIG_SENDCMD_FILTER 0
+#define CONFIG_SEPARATEFIELDS_FILTER 0
+#define CONFIG_SETDAR_FILTER 0
+#define CONFIG_SETFIELD_FILTER 0
+#define CONFIG_SETPARAMS_FILTER 0
+#define CONFIG_SETPTS_FILTER 0
+#define CONFIG_SETRANGE_FILTER 0
+#define CONFIG_SETSAR_FILTER 0
+#define CONFIG_SETTB_FILTER 0
+#define CONFIG_SHARPNESS_VAAPI_FILTER 0
+#define CONFIG_SHOWINFO_FILTER 0
+#define CONFIG_SHOWPALETTE_FILTER 0
+#define CONFIG_SHUFFLEFRAMES_FILTER 0
+#define CONFIG_SHUFFLEPLANES_FILTER 0
+#define CONFIG_SIDEDATA_FILTER 0
+#define CONFIG_SIGNALSTATS_FILTER 0
+#define CONFIG_SIGNATURE_FILTER 0
+#define CONFIG_SMARTBLUR_FILTER 0
+#define CONFIG_SOBEL_FILTER 0
+#define CONFIG_SOBEL_OPENCL_FILTER 0
+#define CONFIG_SPLIT_FILTER 0
+#define CONFIG_SPP_FILTER 0
+#define CONFIG_SR_FILTER 0
+#define CONFIG_SSIM_FILTER 0
+#define CONFIG_STEREO3D_FILTER 0
+#define CONFIG_STREAMSELECT_FILTER 0
+#define CONFIG_SUBTITLES_FILTER 0
+#define CONFIG_SUPER2XSAI_FILTER 0
+#define CONFIG_SWAPRECT_FILTER 0
+#define CONFIG_SWAPUV_FILTER 0
+#define CONFIG_TBLEND_FILTER 0
+#define CONFIG_TELECINE_FILTER 0
+#define CONFIG_THISTOGRAM_FILTER 0
+#define CONFIG_THRESHOLD_FILTER 0
+#define CONFIG_THUMBNAIL_FILTER 0
+#define CONFIG_THUMBNAIL_CUDA_FILTER 0
+#define CONFIG_TILE_FILTER 0
+#define CONFIG_TINTERLACE_FILTER 0
+#define CONFIG_TLUT2_FILTER 0
+#define CONFIG_TMEDIAN_FILTER 0
+#define CONFIG_TMIX_FILTER 0
+#define CONFIG_TONEMAP_FILTER 0
+#define CONFIG_TONEMAP_OPENCL_FILTER 0
+#define CONFIG_TONEMAP_VAAPI_FILTER 0
+#define CONFIG_TPAD_FILTER 0
+#define CONFIG_TRANSPOSE_FILTER 0
+#define CONFIG_TRANSPOSE_NPP_FILTER 0
+#define CONFIG_TRANSPOSE_OPENCL_FILTER 0
+#define CONFIG_TRANSPOSE_VAAPI_FILTER 0
+#define CONFIG_TRIM_FILTER 0
+#define CONFIG_UNPREMULTIPLY_FILTER 0
+#define CONFIG_UNSHARP_FILTER 0
+#define CONFIG_UNSHARP_OPENCL_FILTER 0
+#define CONFIG_USPP_FILTER 0
+#define CONFIG_V360_FILTER 0
+#define CONFIG_VAGUEDENOISER_FILTER 0
+#define CONFIG_VECTORSCOPE_FILTER 0
+#define CONFIG_VFLIP_FILTER 0
+#define CONFIG_VFRDET_FILTER 0
+#define CONFIG_VIBRANCE_FILTER 0
+#define CONFIG_VIDSTABDETECT_FILTER 0
+#define CONFIG_VIDSTABTRANSFORM_FILTER 0
+#define CONFIG_VIGNETTE_FILTER 0
+#define CONFIG_VMAFMOTION_FILTER 0
+#define CONFIG_VPP_QSV_FILTER 0
+#define CONFIG_VSTACK_FILTER 0
+#define CONFIG_W3FDIF_FILTER 0
+#define CONFIG_WAVEFORM_FILTER 0
+#define CONFIG_WEAVE_FILTER 0
+#define CONFIG_XBR_FILTER 0
+#define CONFIG_XFADE_FILTER 0
+#define CONFIG_XFADE_OPENCL_FILTER 0
+#define CONFIG_XMEDIAN_FILTER 0
+#define CONFIG_XSTACK_FILTER 0
+#define CONFIG_YADIF_FILTER 0
+#define CONFIG_YADIF_CUDA_FILTER 0
+#define CONFIG_YAEPBLUR_FILTER 0
+#define CONFIG_ZMQ_FILTER 0
+#define CONFIG_ZOOMPAN_FILTER 0
+#define CONFIG_ZSCALE_FILTER 0
+#define CONFIG_ALLRGB_FILTER 0
+#define CONFIG_ALLYUV_FILTER 0
+#define CONFIG_CELLAUTO_FILTER 0
+#define CONFIG_COLOR_FILTER 0
+#define CONFIG_COREIMAGESRC_FILTER 0
+#define CONFIG_FREI0R_SRC_FILTER 0
+#define CONFIG_HALDCLUTSRC_FILTER 0
+#define CONFIG_LIFE_FILTER 0
+#define CONFIG_MANDELBROT_FILTER 0
+#define CONFIG_MPTESTSRC_FILTER 0
+#define CONFIG_NULLSRC_FILTER 0
+#define CONFIG_OPENCLSRC_FILTER 0
+#define CONFIG_PAL75BARS_FILTER 0
+#define CONFIG_PAL100BARS_FILTER 0
+#define CONFIG_RGBTESTSRC_FILTER 0
+#define CONFIG_SIERPINSKI_FILTER 0
+#define CONFIG_SMPTEBARS_FILTER 0
+#define CONFIG_SMPTEHDBARS_FILTER 0
+#define CONFIG_TESTSRC_FILTER 0
+#define CONFIG_TESTSRC2_FILTER 0
+#define CONFIG_YUVTESTSRC_FILTER 0
+#define CONFIG_NULLSINK_FILTER 0
+#define CONFIG_ABITSCOPE_FILTER 0
+#define CONFIG_ADRAWGRAPH_FILTER 0
+#define CONFIG_AGRAPHMONITOR_FILTER 0
+#define CONFIG_AHISTOGRAM_FILTER 0
+#define CONFIG_APHASEMETER_FILTER 0
+#define CONFIG_AVECTORSCOPE_FILTER 0
+#define CONFIG_CONCAT_FILTER 0
+#define CONFIG_SHOWCQT_FILTER 0
+#define CONFIG_SHOWFREQS_FILTER 0
+#define CONFIG_SHOWSPATIAL_FILTER 0
+#define CONFIG_SHOWSPECTRUM_FILTER 0
+#define CONFIG_SHOWSPECTRUMPIC_FILTER 0
+#define CONFIG_SHOWVOLUME_FILTER 0
+#define CONFIG_SHOWWAVES_FILTER 0
+#define CONFIG_SHOWWAVESPIC_FILTER 0
+#define CONFIG_SPECTRUMSYNTH_FILTER 0
+#define CONFIG_AMOVIE_FILTER 0
+#define CONFIG_MOVIE_FILTER 0
+#define CONFIG_AFIFO_FILTER 0
+#define CONFIG_FIFO_FILTER 0
+#define CONFIG_AA_DEMUXER 0
+#define CONFIG_AAC_DEMUXER 0
+#define CONFIG_AC3_DEMUXER 0
+#define CONFIG_ACM_DEMUXER 0
+#define CONFIG_ACT_DEMUXER 0
+#define CONFIG_ADF_DEMUXER 0
+#define CONFIG_ADP_DEMUXER 0
+#define CONFIG_ADS_DEMUXER 0
+#define CONFIG_ADX_DEMUXER 0
+#define CONFIG_AEA_DEMUXER 0
+#define CONFIG_AFC_DEMUXER 0
+#define CONFIG_AIFF_DEMUXER 0
+#define CONFIG_AIX_DEMUXER 0
+#define CONFIG_ALP_DEMUXER 0
+#define CONFIG_AMR_DEMUXER 0
+#define CONFIG_AMRNB_DEMUXER 0
+#define CONFIG_AMRWB_DEMUXER 0
+#define CONFIG_ANM_DEMUXER 0
+#define CONFIG_APC_DEMUXER 0
+#define CONFIG_APE_DEMUXER 0
+#define CONFIG_APM_DEMUXER 0
+#define CONFIG_APNG_DEMUXER 0
+#define CONFIG_APTX_DEMUXER 0
+#define CONFIG_APTX_HD_DEMUXER 0
+#define CONFIG_AQTITLE_DEMUXER 0
+#define CONFIG_ARGO_ASF_DEMUXER 0
+#define CONFIG_ASF_DEMUXER 0
+#define CONFIG_ASF_O_DEMUXER 0
+#define CONFIG_ASS_DEMUXER 0
+#define CONFIG_AST_DEMUXER 0
+#define CONFIG_AU_DEMUXER 0
+#define CONFIG_AV1_DEMUXER 0
+#define CONFIG_AVI_DEMUXER 0
+#define CONFIG_AVISYNTH_DEMUXER 0
+#define CONFIG_AVR_DEMUXER 0
+#define CONFIG_AVS_DEMUXER 0
+#define CONFIG_AVS2_DEMUXER 0
+#define CONFIG_BETHSOFTVID_DEMUXER 0
+#define CONFIG_BFI_DEMUXER 0
+#define CONFIG_BINTEXT_DEMUXER 0
+#define CONFIG_BINK_DEMUXER 0
+#define CONFIG_BIT_DEMUXER 0
+#define CONFIG_BMV_DEMUXER 0
+#define CONFIG_BFSTM_DEMUXER 0
+#define CONFIG_BRSTM_DEMUXER 0
+#define CONFIG_BOA_DEMUXER 0
+#define CONFIG_C93_DEMUXER 0
+#define CONFIG_CAF_DEMUXER 0
+#define CONFIG_CAVSVIDEO_DEMUXER 0
+#define CONFIG_CDG_DEMUXER 0
+#define CONFIG_CDXL_DEMUXER 0
+#define CONFIG_CINE_DEMUXER 0
+#define CONFIG_CODEC2_DEMUXER 0
+#define CONFIG_CODEC2RAW_DEMUXER 0
+#define CONFIG_CONCAT_DEMUXER 0
+#define CONFIG_DASH_DEMUXER 0
+#define CONFIG_DATA_DEMUXER 0
+#define CONFIG_DAUD_DEMUXER 0
+#define CONFIG_DCSTR_DEMUXER 0
+#define CONFIG_DERF_DEMUXER 0
+#define CONFIG_DFA_DEMUXER 0
+#define CONFIG_DHAV_DEMUXER 0
+#define CONFIG_DIRAC_DEMUXER 0
+#define CONFIG_DNXHD_DEMUXER 0
+#define CONFIG_DSF_DEMUXER 0
+#define CONFIG_DSICIN_DEMUXER 0
+#define CONFIG_DSS_DEMUXER 0
+#define CONFIG_DTS_DEMUXER 0
+#define CONFIG_DTSHD_DEMUXER 0
+#define CONFIG_DV_DEMUXER 0
+#define CONFIG_DVBSUB_DEMUXER 0
+#define CONFIG_DVBTXT_DEMUXER 0
+#define CONFIG_DXA_DEMUXER 0
+#define CONFIG_EA_DEMUXER 0
+#define CONFIG_EA_CDATA_DEMUXER 0
+#define CONFIG_EAC3_DEMUXER 0
+#define CONFIG_EPAF_DEMUXER 0
+#define CONFIG_FFMETADATA_DEMUXER 0
+#define CONFIG_FILMSTRIP_DEMUXER 0
+#define CONFIG_FITS_DEMUXER 0
+#define CONFIG_FLAC_DEMUXER 1
+#define CONFIG_FLIC_DEMUXER 0
+#define CONFIG_FLV_DEMUXER 0
+#define CONFIG_LIVE_FLV_DEMUXER 0
+#define CONFIG_FOURXM_DEMUXER 0
+#define CONFIG_FRM_DEMUXER 0
+#define CONFIG_FSB_DEMUXER 0
+#define CONFIG_FWSE_DEMUXER 0
+#define CONFIG_G722_DEMUXER 0
+#define CONFIG_G723_1_DEMUXER 0
+#define CONFIG_G726_DEMUXER 0
+#define CONFIG_G726LE_DEMUXER 0
+#define CONFIG_G729_DEMUXER 0
+#define CONFIG_GDV_DEMUXER 0
+#define CONFIG_GENH_DEMUXER 0
+#define CONFIG_GIF_DEMUXER 0
+#define CONFIG_GSM_DEMUXER 0
+#define CONFIG_GXF_DEMUXER 0
+#define CONFIG_H261_DEMUXER 0
+#define CONFIG_H263_DEMUXER 0
+#define CONFIG_H264_DEMUXER 0
+#define CONFIG_HCA_DEMUXER 0
+#define CONFIG_HCOM_DEMUXER 0
+#define CONFIG_HEVC_DEMUXER 0
+#define CONFIG_HLS_DEMUXER 0
+#define CONFIG_HNM_DEMUXER 0
+#define CONFIG_ICO_DEMUXER 0
+#define CONFIG_IDCIN_DEMUXER 0
+#define CONFIG_IDF_DEMUXER 0
+#define CONFIG_IFF_DEMUXER 0
+#define CONFIG_IFV_DEMUXER 0
+#define CONFIG_ILBC_DEMUXER 0
+#define CONFIG_IMAGE2_DEMUXER 0
+#define CONFIG_IMAGE2PIPE_DEMUXER 0
+#define CONFIG_IMAGE2_ALIAS_PIX_DEMUXER 0
+#define CONFIG_IMAGE2_BRENDER_PIX_DEMUXER 0
+#define CONFIG_INGENIENT_DEMUXER 0
+#define CONFIG_IPMOVIE_DEMUXER 0
+#define CONFIG_IRCAM_DEMUXER 0
+#define CONFIG_ISS_DEMUXER 0
+#define CONFIG_IV8_DEMUXER 0
+#define CONFIG_IVF_DEMUXER 0
+#define CONFIG_IVR_DEMUXER 0
+#define CONFIG_JACOSUB_DEMUXER 0
+#define CONFIG_JV_DEMUXER 0
+#define CONFIG_KUX_DEMUXER 0
+#define CONFIG_KVAG_DEMUXER 0
+#define CONFIG_LMLM4_DEMUXER 0
+#define CONFIG_LOAS_DEMUXER 0
+#define CONFIG_LRC_DEMUXER 0
+#define CONFIG_LVF_DEMUXER 0
+#define CONFIG_LXF_DEMUXER 0
+#define CONFIG_M4V_DEMUXER 0
+#define CONFIG_MATROSKA_DEMUXER 1
+#define CONFIG_MGSTS_DEMUXER 0
+#define CONFIG_MICRODVD_DEMUXER 0
+#define CONFIG_MJPEG_DEMUXER 0
+#define CONFIG_MJPEG_2000_DEMUXER 0
+#define CONFIG_MLP_DEMUXER 0
+#define CONFIG_MLV_DEMUXER 0
+#define CONFIG_MM_DEMUXER 0
+#define CONFIG_MMF_DEMUXER 0
+#define CONFIG_MOV_DEMUXER 1
+#define CONFIG_MP3_DEMUXER 1
+#define CONFIG_MPC_DEMUXER 0
+#define CONFIG_MPC8_DEMUXER 0
+#define CONFIG_MPEGPS_DEMUXER 0
+#define CONFIG_MPEGTS_DEMUXER 0
+#define CONFIG_MPEGTSRAW_DEMUXER 0
+#define CONFIG_MPEGVIDEO_DEMUXER 0
+#define CONFIG_MPJPEG_DEMUXER 0
+#define CONFIG_MPL2_DEMUXER 0
+#define CONFIG_MPSUB_DEMUXER 0
+#define CONFIG_MSF_DEMUXER 0
+#define CONFIG_MSNWC_TCP_DEMUXER 0
+#define CONFIG_MTAF_DEMUXER 0
+#define CONFIG_MTV_DEMUXER 0
+#define CONFIG_MUSX_DEMUXER 0
+#define CONFIG_MV_DEMUXER 0
+#define CONFIG_MVI_DEMUXER 0
+#define CONFIG_MXF_DEMUXER 0
+#define CONFIG_MXG_DEMUXER 0
+#define CONFIG_NC_DEMUXER 0
+#define CONFIG_NISTSPHERE_DEMUXER 0
+#define CONFIG_NSP_DEMUXER 0
+#define CONFIG_NSV_DEMUXER 0
+#define CONFIG_NUT_DEMUXER 0
+#define CONFIG_NUV_DEMUXER 0
+#define CONFIG_OGG_DEMUXER 1
+#define CONFIG_OMA_DEMUXER 0
+#define CONFIG_PAF_DEMUXER 0
+#define CONFIG_PCM_ALAW_DEMUXER 0
+#define CONFIG_PCM_MULAW_DEMUXER 0
+#define CONFIG_PCM_VIDC_DEMUXER 0
+#define CONFIG_PCM_F64BE_DEMUXER 0
+#define CONFIG_PCM_F64LE_DEMUXER 0
+#define CONFIG_PCM_F32BE_DEMUXER 0
+#define CONFIG_PCM_F32LE_DEMUXER 0
+#define CONFIG_PCM_S32BE_DEMUXER 0
+#define CONFIG_PCM_S32LE_DEMUXER 0
+#define CONFIG_PCM_S24BE_DEMUXER 0
+#define CONFIG_PCM_S24LE_DEMUXER 0
+#define CONFIG_PCM_S16BE_DEMUXER 0
+#define CONFIG_PCM_S16LE_DEMUXER 0
+#define CONFIG_PCM_S8_DEMUXER 0
+#define CONFIG_PCM_U32BE_DEMUXER 0
+#define CONFIG_PCM_U32LE_DEMUXER 0
+#define CONFIG_PCM_U24BE_DEMUXER 0
+#define CONFIG_PCM_U24LE_DEMUXER 0
+#define CONFIG_PCM_U16BE_DEMUXER 0
+#define CONFIG_PCM_U16LE_DEMUXER 0
+#define CONFIG_PCM_U8_DEMUXER 0
+#define CONFIG_PJS_DEMUXER 0
+#define CONFIG_PMP_DEMUXER 0
+#define CONFIG_PVA_DEMUXER 0
+#define CONFIG_PVF_DEMUXER 0
+#define CONFIG_QCP_DEMUXER 0
+#define CONFIG_R3D_DEMUXER 0
+#define CONFIG_RAWVIDEO_DEMUXER 0
+#define CONFIG_REALTEXT_DEMUXER 0
+#define CONFIG_REDSPARK_DEMUXER 0
+#define CONFIG_RL2_DEMUXER 0
+#define CONFIG_RM_DEMUXER 0
+#define CONFIG_ROQ_DEMUXER 0
+#define CONFIG_RPL_DEMUXER 0
+#define CONFIG_RSD_DEMUXER 0
+#define CONFIG_RSO_DEMUXER 0
+#define CONFIG_RTP_DEMUXER 0
+#define CONFIG_RTSP_DEMUXER 0
+#define CONFIG_S337M_DEMUXER 0
+#define CONFIG_SAMI_DEMUXER 0
+#define CONFIG_SAP_DEMUXER 0
+#define CONFIG_SBC_DEMUXER 0
+#define CONFIG_SBG_DEMUXER 0
+#define CONFIG_SCC_DEMUXER 0
+#define CONFIG_SDP_DEMUXER 0
+#define CONFIG_SDR2_DEMUXER 0
+#define CONFIG_SDS_DEMUXER 0
+#define CONFIG_SDX_DEMUXER 0
+#define CONFIG_SEGAFILM_DEMUXER 0
+#define CONFIG_SER_DEMUXER 0
+#define CONFIG_SHORTEN_DEMUXER 0
+#define CONFIG_SIFF_DEMUXER 0
+#define CONFIG_SLN_DEMUXER 0
+#define CONFIG_SMACKER_DEMUXER 0
+#define CONFIG_SMJPEG_DEMUXER 0
+#define CONFIG_SMUSH_DEMUXER 0
+#define CONFIG_SOL_DEMUXER 0
+#define CONFIG_SOX_DEMUXER 0
+#define CONFIG_SPDIF_DEMUXER 0
+#define CONFIG_SRT_DEMUXER 0
+#define CONFIG_STR_DEMUXER 0
+#define CONFIG_STL_DEMUXER 0
+#define CONFIG_SUBVIEWER1_DEMUXER 0
+#define CONFIG_SUBVIEWER_DEMUXER 0
+#define CONFIG_SUP_DEMUXER 0
+#define CONFIG_SVAG_DEMUXER 0
+#define CONFIG_SWF_DEMUXER 0
+#define CONFIG_TAK_DEMUXER 0
+#define CONFIG_TEDCAPTIONS_DEMUXER 0
+#define CONFIG_THP_DEMUXER 0
+#define CONFIG_THREEDOSTR_DEMUXER 0
+#define CONFIG_TIERTEXSEQ_DEMUXER 0
+#define CONFIG_TMV_DEMUXER 0
+#define CONFIG_TRUEHD_DEMUXER 0
+#define CONFIG_TTA_DEMUXER 0
+#define CONFIG_TXD_DEMUXER 0
+#define CONFIG_TTY_DEMUXER 0
+#define CONFIG_TY_DEMUXER 0
+#define CONFIG_V210_DEMUXER 0
+#define CONFIG_V210X_DEMUXER 0
+#define CONFIG_VAG_DEMUXER 0
+#define CONFIG_VC1_DEMUXER 0
+#define CONFIG_VC1T_DEMUXER 0
+#define CONFIG_VIVIDAS_DEMUXER 0
+#define CONFIG_VIVO_DEMUXER 0
+#define CONFIG_VMD_DEMUXER 0
+#define CONFIG_VOBSUB_DEMUXER 0
+#define CONFIG_VOC_DEMUXER 0
+#define CONFIG_VPK_DEMUXER 0
+#define CONFIG_VPLAYER_DEMUXER 0
+#define CONFIG_VQF_DEMUXER 0
+#define CONFIG_W64_DEMUXER 0
+#define CONFIG_WAV_DEMUXER 1
+#define CONFIG_WC3_DEMUXER 0
+#define CONFIG_WEBM_DASH_MANIFEST_DEMUXER 0
+#define CONFIG_WEBVTT_DEMUXER 0
+#define CONFIG_WSAUD_DEMUXER 0
+#define CONFIG_WSD_DEMUXER 0
+#define CONFIG_WSVQA_DEMUXER 0
+#define CONFIG_WTV_DEMUXER 0
+#define CONFIG_WVE_DEMUXER 0
+#define CONFIG_WV_DEMUXER 0
+#define CONFIG_XA_DEMUXER 0
+#define CONFIG_XBIN_DEMUXER 0
+#define CONFIG_XMV_DEMUXER 0
+#define CONFIG_XVAG_DEMUXER 0
+#define CONFIG_XWMA_DEMUXER 0
+#define CONFIG_YOP_DEMUXER 0
+#define CONFIG_YUV4MPEGPIPE_DEMUXER 0
+#define CONFIG_IMAGE_BMP_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_DDS_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_DPX_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_EXR_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_GIF_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_J2K_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_JPEG_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_JPEGLS_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_PAM_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_PBM_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_PCX_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_PGMYUV_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_PGM_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_PICTOR_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_PNG_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_PPM_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_PSD_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_QDRAW_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_SGI_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_SVG_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_SUNRAST_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_TIFF_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_WEBP_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_XPM_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_XWD_PIPE_DEMUXER 0
+#define CONFIG_LIBGME_DEMUXER 0
+#define CONFIG_LIBMODPLUG_DEMUXER 0
+#define CONFIG_LIBOPENMPT_DEMUXER 0
+#define CONFIG_VAPOURSYNTH_DEMUXER 0
+#define CONFIG_A64_MUXER 0
+#define CONFIG_AC3_MUXER 0
+#define CONFIG_ADTS_MUXER 0
+#define CONFIG_ADX_MUXER 0
+#define CONFIG_AIFF_MUXER 0
+#define CONFIG_AMR_MUXER 0
+#define CONFIG_APNG_MUXER 0
+#define CONFIG_APTX_MUXER 0
+#define CONFIG_APTX_HD_MUXER 0
+#define CONFIG_ASF_MUXER 0
+#define CONFIG_ASS_MUXER 0
+#define CONFIG_AST_MUXER 0
+#define CONFIG_ASF_STREAM_MUXER 0
+#define CONFIG_AU_MUXER 0
+#define CONFIG_AVI_MUXER 0
+#define CONFIG_AVM2_MUXER 0
+#define CONFIG_AVS2_MUXER 0
+#define CONFIG_BIT_MUXER 0
+#define CONFIG_CAF_MUXER 0
+#define CONFIG_CAVSVIDEO_MUXER 0
+#define CONFIG_CODEC2_MUXER 0
+#define CONFIG_CODEC2RAW_MUXER 0
+#define CONFIG_CRC_MUXER 0
+#define CONFIG_DASH_MUXER 0
+#define CONFIG_DATA_MUXER 0
+#define CONFIG_DAUD_MUXER 0
+#define CONFIG_DIRAC_MUXER 0
+#define CONFIG_DNXHD_MUXER 0
+#define CONFIG_DTS_MUXER 0
+#define CONFIG_DV_MUXER 0
+#define CONFIG_EAC3_MUXER 0
+#define CONFIG_F4V_MUXER 0
+#define CONFIG_FFMETADATA_MUXER 0
+#define CONFIG_FIFO_MUXER 0
+#define CONFIG_FIFO_TEST_MUXER 0
+#define CONFIG_FILMSTRIP_MUXER 0
+#define CONFIG_FITS_MUXER 0
+#define CONFIG_FLAC_MUXER 0
+#define CONFIG_FLV_MUXER 0
+#define CONFIG_FRAMECRC_MUXER 0
+#define CONFIG_FRAMEHASH_MUXER 0
+#define CONFIG_FRAMEMD5_MUXER 0
+#define CONFIG_G722_MUXER 0
+#define CONFIG_G723_1_MUXER 0
+#define CONFIG_G726_MUXER 0
+#define CONFIG_G726LE_MUXER 0
+#define CONFIG_GIF_MUXER 0
+#define CONFIG_GSM_MUXER 0
+#define CONFIG_GXF_MUXER 0
+#define CONFIG_H261_MUXER 0
+#define CONFIG_H263_MUXER 0
+#define CONFIG_H264_MUXER 0
+#define CONFIG_HASH_MUXER 0
+#define CONFIG_HDS_MUXER 0
+#define CONFIG_HEVC_MUXER 0
+#define CONFIG_HLS_MUXER 0
+#define CONFIG_ICO_MUXER 0
+#define CONFIG_ILBC_MUXER 0
+#define CONFIG_IMAGE2_MUXER 0
+#define CONFIG_IMAGE2PIPE_MUXER 0
+#define CONFIG_IPOD_MUXER 0
+#define CONFIG_IRCAM_MUXER 0
+#define CONFIG_ISMV_MUXER 0
+#define CONFIG_IVF_MUXER 0
+#define CONFIG_JACOSUB_MUXER 0
+#define CONFIG_LATM_MUXER 0
+#define CONFIG_LRC_MUXER 0
+#define CONFIG_M4V_MUXER 0
+#define CONFIG_MD5_MUXER 0
+#define CONFIG_MATROSKA_MUXER 0
+#define CONFIG_MATROSKA_AUDIO_MUXER 0
+#define CONFIG_MICRODVD_MUXER 0
+#define CONFIG_MJPEG_MUXER 0
+#define CONFIG_MLP_MUXER 0
+#define CONFIG_MMF_MUXER 0
+#define CONFIG_MOV_MUXER 0
+#define CONFIG_MP2_MUXER 0
+#define CONFIG_MP3_MUXER 0
+#define CONFIG_MP4_MUXER 0
+#define CONFIG_MPEG1SYSTEM_MUXER 0
+#define CONFIG_MPEG1VCD_MUXER 0
+#define CONFIG_MPEG1VIDEO_MUXER 0
+#define CONFIG_MPEG2DVD_MUXER 0
+#define CONFIG_MPEG2SVCD_MUXER 0
+#define CONFIG_MPEG2VIDEO_MUXER 0
+#define CONFIG_MPEG2VOB_MUXER 0
+#define CONFIG_MPEGTS_MUXER 0
+#define CONFIG_MPJPEG_MUXER 0
+#define CONFIG_MXF_MUXER 0
+#define CONFIG_MXF_D10_MUXER 0
+#define CONFIG_MXF_OPATOM_MUXER 0
+#define CONFIG_NULL_MUXER 0
+#define CONFIG_NUT_MUXER 0
+#define CONFIG_OGA_MUXER 0
+#define CONFIG_OGG_MUXER 0
+#define CONFIG_OGV_MUXER 0
+#define CONFIG_OMA_MUXER 0
+#define CONFIG_OPUS_MUXER 0
+#define CONFIG_PCM_ALAW_MUXER 0
+#define CONFIG_PCM_MULAW_MUXER 0
+#define CONFIG_PCM_VIDC_MUXER 0
+#define CONFIG_PCM_F64BE_MUXER 0
+#define CONFIG_PCM_F64LE_MUXER 0
+#define CONFIG_PCM_F32BE_MUXER 0
+#define CONFIG_PCM_F32LE_MUXER 0
+#define CONFIG_PCM_S32BE_MUXER 0
+#define CONFIG_PCM_S32LE_MUXER 0
+#define CONFIG_PCM_S24BE_MUXER 0
+#define CONFIG_PCM_S24LE_MUXER 0
+#define CONFIG_PCM_S16BE_MUXER 0
+#define CONFIG_PCM_S16LE_MUXER 0
+#define CONFIG_PCM_S8_MUXER 0
+#define CONFIG_PCM_U32BE_MUXER 0
+#define CONFIG_PCM_U32LE_MUXER 0
+#define CONFIG_PCM_U24BE_MUXER 0
+#define CONFIG_PCM_U24LE_MUXER 0
+#define CONFIG_PCM_U16BE_MUXER 0
+#define CONFIG_PCM_U16LE_MUXER 0
+#define CONFIG_PCM_U8_MUXER 0
+#define CONFIG_PSP_MUXER 0
+#define CONFIG_RAWVIDEO_MUXER 0
+#define CONFIG_RM_MUXER 0
+#define CONFIG_ROQ_MUXER 0
+#define CONFIG_RSO_MUXER 0
+#define CONFIG_RTP_MUXER 0
+#define CONFIG_RTP_MPEGTS_MUXER 0
+#define CONFIG_RTSP_MUXER 0
+#define CONFIG_SAP_MUXER 0
+#define CONFIG_SBC_MUXER 0
+#define CONFIG_SCC_MUXER 0
+#define CONFIG_SEGAFILM_MUXER 0
+#define CONFIG_SEGMENT_MUXER 0
+#define CONFIG_STREAM_SEGMENT_MUXER 0
+#define CONFIG_SINGLEJPEG_MUXER 0
+#define CONFIG_SMJPEG_MUXER 0
+#define CONFIG_SMOOTHSTREAMING_MUXER 0
+#define CONFIG_SOX_MUXER 0
+#define CONFIG_SPX_MUXER 0
+#define CONFIG_SPDIF_MUXER 0
+#define CONFIG_SRT_MUXER 0
+#define CONFIG_STREAMHASH_MUXER 0
+#define CONFIG_SUP_MUXER 0
+#define CONFIG_SWF_MUXER 0
+#define CONFIG_TEE_MUXER 0
+#define CONFIG_TG2_MUXER 0
+#define CONFIG_TGP_MUXER 0
+#define CONFIG_MKVTIMESTAMP_V2_MUXER 0
+#define CONFIG_TRUEHD_MUXER 0
+#define CONFIG_TTA_MUXER 0
+#define CONFIG_UNCODEDFRAMECRC_MUXER 0
+#define CONFIG_VC1_MUXER 0
+#define CONFIG_VC1T_MUXER 0
+#define CONFIG_VOC_MUXER 0
+#define CONFIG_W64_MUXER 0
+#define CONFIG_WAV_MUXER 0
+#define CONFIG_WEBM_MUXER 0
+#define CONFIG_WEBM_DASH_MANIFEST_MUXER 0
+#define CONFIG_WEBM_CHUNK_MUXER 0
+#define CONFIG_WEBP_MUXER 0
+#define CONFIG_WEBVTT_MUXER 0
+#define CONFIG_WTV_MUXER 0
+#define CONFIG_WV_MUXER 0
+#define CONFIG_YUV4MPEGPIPE_MUXER 0
+#define CONFIG_CHROMAPRINT_MUXER 0
+#define CONFIG_ASYNC_PROTOCOL 0
+#define CONFIG_BLURAY_PROTOCOL 0
+#define CONFIG_CACHE_PROTOCOL 0
+#define CONFIG_CONCAT_PROTOCOL 0
+#define CONFIG_CRYPTO_PROTOCOL 0
+#define CONFIG_DATA_PROTOCOL 0
+#define CONFIG_FFRTMPCRYPT_PROTOCOL 0
+#define CONFIG_FFRTMPHTTP_PROTOCOL 0
+#define CONFIG_FILE_PROTOCOL 0
+#define CONFIG_FTP_PROTOCOL 0
+#define CONFIG_GOPHER_PROTOCOL 0
+#define CONFIG_HLS_PROTOCOL 0
+#define CONFIG_HTTP_PROTOCOL 0
+#define CONFIG_HTTPPROXY_PROTOCOL 0
+#define CONFIG_HTTPS_PROTOCOL 0
+#define CONFIG_ICECAST_PROTOCOL 0
+#define CONFIG_MMSH_PROTOCOL 0
+#define CONFIG_MMST_PROTOCOL 0
+#define CONFIG_MD5_PROTOCOL 0
+#define CONFIG_PIPE_PROTOCOL 0
+#define CONFIG_PROMPEG_PROTOCOL 0
+#define CONFIG_RTMP_PROTOCOL 0
+#define CONFIG_RTMPE_PROTOCOL 0
+#define CONFIG_RTMPS_PROTOCOL 0
+#define CONFIG_RTMPT_PROTOCOL 0
+#define CONFIG_RTMPTE_PROTOCOL 0
+#define CONFIG_RTMPTS_PROTOCOL 0
+#define CONFIG_RTP_PROTOCOL 0
+#define CONFIG_SCTP_PROTOCOL 0
+#define CONFIG_SRTP_PROTOCOL 0
+#define CONFIG_SUBFILE_PROTOCOL 0
+#define CONFIG_TEE_PROTOCOL 0
+#define CONFIG_TCP_PROTOCOL 0
+#define CONFIG_TLS_PROTOCOL 0
+#define CONFIG_UDP_PROTOCOL 0
+#define CONFIG_UDPLITE_PROTOCOL 0
+#define CONFIG_UNIX_PROTOCOL 0
+#define CONFIG_LIBAMQP_PROTOCOL 0
+#define CONFIG_LIBRTMP_PROTOCOL 0
+#define CONFIG_LIBRTMPE_PROTOCOL 0
+#define CONFIG_LIBRTMPS_PROTOCOL 0
+#define CONFIG_LIBRTMPT_PROTOCOL 0
+#define CONFIG_LIBRTMPTE_PROTOCOL 0
+#define CONFIG_LIBSRT_PROTOCOL 0
+#define CONFIG_LIBSSH_PROTOCOL 0
+#define CONFIG_LIBSMBCLIENT_PROTOCOL 0
+#define CONFIG_LIBZMQ_PROTOCOL 0
+#endif /* FFMPEG_CONFIG_H */
diff --git a/fuchsia/config/default/x64/libavcodec/bsf_list.c b/fuchsia/config/default/x64/libavcodec/bsf_list.c
new file mode 100644
index 0000000..ee5ac8a
--- /dev/null
+++ b/fuchsia/config/default/x64/libavcodec/bsf_list.c
@@ -0,0 +1,4 @@
+static const AVBitStreamFilter * const bitstream_filters[] = {
+ &ff_null_bsf,
+ &ff_vp9_superframe_split_bsf,
+ NULL };
diff --git a/fuchsia/config/default/x64/libavcodec/codec_list.c b/fuchsia/config/default/x64/libavcodec/codec_list.c
new file mode 100644
index 0000000..8e4d5e8
--- /dev/null
+++ b/fuchsia/config/default/x64/libavcodec/codec_list.c
@@ -0,0 +1,21 @@
+static const AVCodec * const codec_list[] = {
+ &ff_theora_decoder,
+ &ff_vp3_decoder,
+ &ff_vp8_decoder,
+ &ff_vp9_decoder,
+ &ff_aptx_decoder,
+ &ff_flac_decoder,
+ &ff_mp3_decoder,
+ &ff_sbc_decoder,
+ &ff_vorbis_decoder,
+ &ff_pcm_alaw_decoder,
+ &ff_pcm_f32le_decoder,
+ &ff_pcm_mulaw_decoder,
+ &ff_pcm_s16be_decoder,
+ &ff_pcm_s16le_decoder,
+ &ff_pcm_s24be_decoder,
+ &ff_pcm_s24le_decoder,
+ &ff_pcm_s32le_decoder,
+ &ff_pcm_u8_decoder,
+ &ff_libopus_decoder,
+ NULL };
diff --git a/fuchsia/config/default/x64/libavcodec/parser_list.c b/fuchsia/config/default/x64/libavcodec/parser_list.c
new file mode 100644
index 0000000..f81fbe8
--- /dev/null
+++ b/fuchsia/config/default/x64/libavcodec/parser_list.c
@@ -0,0 +1,9 @@
+static const AVCodecParser * const parser_list[] = {
+ &ff_flac_parser,
+ &ff_mpegaudio_parser,
+ &ff_opus_parser,
+ &ff_vorbis_parser,
+ &ff_vp3_parser,
+ &ff_vp8_parser,
+ &ff_vp9_parser,
+ NULL };
diff --git a/fuchsia/config/default/x64/libavformat/demuxer_list.c b/fuchsia/config/default/x64/libavformat/demuxer_list.c
new file mode 100644
index 0000000..1908ba1
--- /dev/null
+++ b/fuchsia/config/default/x64/libavformat/demuxer_list.c
@@ -0,0 +1,8 @@
+static const AVInputFormat * const demuxer_list[] = {
+ &ff_flac_demuxer,
+ &ff_matroska_demuxer,
+ &ff_mov_demuxer,
+ &ff_mp3_demuxer,
+ &ff_ogg_demuxer,
+ &ff_wav_demuxer,
+ NULL };
diff --git a/fuchsia/config/default/x64/libavformat/muxer_list.c b/fuchsia/config/default/x64/libavformat/muxer_list.c
new file mode 100644
index 0000000..f36d949
--- /dev/null
+++ b/fuchsia/config/default/x64/libavformat/muxer_list.c
@@ -0,0 +1,2 @@
+static const AVOutputFormat * const muxer_list[] = {
+ NULL };
diff --git a/fuchsia/config/default/x64/libavformat/protocol_list.c b/fuchsia/config/default/x64/libavformat/protocol_list.c
new file mode 100644
index 0000000..247e1e4
--- /dev/null
+++ b/fuchsia/config/default/x64/libavformat/protocol_list.c
@@ -0,0 +1,2 @@
+static const URLProtocol * const url_protocols[] = {
+ NULL };
diff --git a/fuchsia/config/default/x64/libavutil/avconfig.h b/fuchsia/config/default/x64/libavutil/avconfig.h
new file mode 100644
index 0000000..c289fbb
--- /dev/null
+++ b/fuchsia/config/default/x64/libavutil/avconfig.h
@@ -0,0 +1,6 @@
+/* Generated by ffmpeg configure */
+#ifndef AVUTIL_AVCONFIG_H
+#define AVUTIL_AVCONFIG_H
+#define AV_HAVE_BIGENDIAN 0
+#define AV_HAVE_FAST_UNALIGNED 1
+#endif /* AVUTIL_AVCONFIG_H */
diff --git a/fuchsia/config/default/x64/libavutil/ffversion.h b/fuchsia/config/default/x64/libavutil/ffversion.h
new file mode 100644
index 0000000..fc76199
--- /dev/null
+++ b/fuchsia/config/default/x64/libavutil/ffversion.h
@@ -0,0 +1,5 @@
+/* Automatically generated by version.sh, do not manually edit! */
+#ifndef AVUTIL_FFVERSION_H
+#define AVUTIL_FFVERSION_H
+#define FFMPEG_VERSION "N-97662-gaaac2c26d9"
+#endif /* AVUTIL_FFVERSION_H */
diff --git a/fuchsia/config/max/arm64/config.h b/fuchsia/config/max/arm64/config.h
new file mode 100644
index 0000000..9915440
--- /dev/null
+++ b/fuchsia/config/max/arm64/config.h
@@ -0,0 +1,2588 @@
+/* Automatically generated by configure - do not modify! */
+#ifndef FFMPEG_CONFIG_H
+#define FFMPEG_CONFIG_H
+#define FFMPEG_CONFIGURATION "--disable-everything --disable-all --disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages --disable-static --enable-avcodec --enable-avformat --enable-avutil --enable-fft --enable-rdft --enable-static --enable-libopus --disable-debug --disable-bzlib --disable-iconv --disable-lzo --disable-network --disable-schannel --disable-sdl2 --disable-symver --disable-xlib --disable-zlib --disable-securetransport --disable-faan --disable-alsa --disable-autodetect --enable-decoder='vorbis,libopus,flac' --enable-decoder='pcm_u8,pcm_s16le,pcm_s24le,pcm_s32le,pcm_f32le,mp3' --enable-decoder='pcm_s16be,pcm_s24be,pcm_mulaw,pcm_alaw' --enable-decoder='theora,vp8,sbc,aptx' --enable-demuxer='ogg,matroska,wav,flac,mp3,mov' --enable-parser='opus,vorbis,flac,mpegaudio' --extra-cflags=-I/usr/local/google/home/dalesat/fuchsia/third_party/opus/include --enable-parser='vp3,vp8' --optflags='\"-O2\"' --enable-pic --x86asmexe=yasm --enable-pic --enable-lto --cc=clang --cxx=clang++ --ld=clang --enable-cross-compile --cross-prefix=/usr/bin/x86_64-linux-gnu- --target-os=linux --arch=aarch64 --enable-armv8 --extra-cflags='-march=armv8-a' --sysroot=/usr/local/google/home/dalesat/fuchsia/third_party/ffmpeg/../../prebuilt/third_party/sysroot/linux --extra-cflags='--target=aarch64-linux-gnu' --extra-ldflags='--target=aarch64-linux-gnu' --disable-linux-perf --enable-decoder='aac,aac_latm,h264,mp3' --enable-demuxer='aac,mp3,mov' --enable-parser='aac,aac_latm,h264,mpegaudio' --enable-decoder=mpeg4 --enable-parser='h263,mpeg4video' --enable-demuxer=avi --enable-demuxer=amr --enable-decoder='amrnb,amrwb' --enable-decoder=gsm_ms --enable-demuxer=gsm --enable-parser=gsm"
+#define FFMPEG_LICENSE "LGPL version 2.1 or later"
+#define CONFIG_THIS_YEAR 2020
+#define FFMPEG_DATADIR "/usr/local/share/ffmpeg"
+#define AVCONV_DATADIR "/usr/local/share/ffmpeg"
+#define CC_IDENT "Fuchsia clang version 11.0.0 (https://fuchsia.googlesource.com/a/third_party/llvm-project dd484baffdf4a92e564c38a17d35a742e633b0e0)"
+#define av_restrict restrict
+#define EXTERN_PREFIX ""
+#define EXTERN_ASM
+#define BUILDSUF ""
+#define SLIBSUF ".so"
+#define HAVE_MMX2 HAVE_MMXEXT
+#define SWS_MAX_FILTER_SIZE 256
+#define ARCH_AARCH64 1
+#define ARCH_ALPHA 0
+#define ARCH_ARM 0
+#define ARCH_AVR32 0
+#define ARCH_AVR32_AP 0
+#define ARCH_AVR32_UC 0
+#define ARCH_BFIN 0
+#define ARCH_IA64 0
+#define ARCH_M68K 0
+#define ARCH_MIPS 0
+#define ARCH_MIPS64 0
+#define ARCH_PARISC 0
+#define ARCH_PPC 0
+#define ARCH_PPC64 0
+#define ARCH_S390 0
+#define ARCH_SH4 0
+#define ARCH_SPARC 0
+#define ARCH_SPARC64 0
+#define ARCH_TILEGX 0
+#define ARCH_TILEPRO 0
+#define ARCH_TOMI 0
+#define ARCH_X86 0
+#define ARCH_X86_32 0
+#define ARCH_X86_64 0
+#define HAVE_ARMV5TE 0
+#define HAVE_ARMV6 0
+#define HAVE_ARMV6T2 0
+#define HAVE_ARMV8 1
+#define HAVE_NEON 1
+#define HAVE_VFP 1
+#define HAVE_VFPV3 0
+#define HAVE_SETEND 0
+#define HAVE_ALTIVEC 0
+#define HAVE_DCBZL 0
+#define HAVE_LDBRX 0
+#define HAVE_POWER8 0
+#define HAVE_PPC4XX 0
+#define HAVE_VSX 0
+#define HAVE_AESNI 0
+#define HAVE_AMD3DNOW 0
+#define HAVE_AMD3DNOWEXT 0
+#define HAVE_AVX 0
+#define HAVE_AVX2 0
+#define HAVE_AVX512 0
+#define HAVE_FMA3 0
+#define HAVE_FMA4 0
+#define HAVE_MMX 0
+#define HAVE_MMXEXT 0
+#define HAVE_SSE 0
+#define HAVE_SSE2 0
+#define HAVE_SSE3 0
+#define HAVE_SSE4 0
+#define HAVE_SSE42 0
+#define HAVE_SSSE3 0
+#define HAVE_XOP 0
+#define HAVE_CPUNOP 0
+#define HAVE_I686 0
+#define HAVE_MIPSFPU 0
+#define HAVE_MIPS32R2 0
+#define HAVE_MIPS32R5 0
+#define HAVE_MIPS64R2 0
+#define HAVE_MIPS32R6 0
+#define HAVE_MIPS64R6 0
+#define HAVE_MIPSDSP 0
+#define HAVE_MIPSDSPR2 0
+#define HAVE_MSA 0
+#define HAVE_MSA2 0
+#define HAVE_LOONGSON2 0
+#define HAVE_LOONGSON3 0
+#define HAVE_MMI 0
+#define HAVE_ARMV5TE_EXTERNAL 0
+#define HAVE_ARMV6_EXTERNAL 0
+#define HAVE_ARMV6T2_EXTERNAL 0
+#define HAVE_ARMV8_EXTERNAL 1
+#define HAVE_NEON_EXTERNAL 1
+#define HAVE_VFP_EXTERNAL 1
+#define HAVE_VFPV3_EXTERNAL 0
+#define HAVE_SETEND_EXTERNAL 0
+#define HAVE_ALTIVEC_EXTERNAL 0
+#define HAVE_DCBZL_EXTERNAL 0
+#define HAVE_LDBRX_EXTERNAL 0
+#define HAVE_POWER8_EXTERNAL 0
+#define HAVE_PPC4XX_EXTERNAL 0
+#define HAVE_VSX_EXTERNAL 0
+#define HAVE_AESNI_EXTERNAL 0
+#define HAVE_AMD3DNOW_EXTERNAL 0
+#define HAVE_AMD3DNOWEXT_EXTERNAL 0
+#define HAVE_AVX_EXTERNAL 0
+#define HAVE_AVX2_EXTERNAL 0
+#define HAVE_AVX512_EXTERNAL 0
+#define HAVE_FMA3_EXTERNAL 0
+#define HAVE_FMA4_EXTERNAL 0
+#define HAVE_MMX_EXTERNAL 0
+#define HAVE_MMXEXT_EXTERNAL 0
+#define HAVE_SSE_EXTERNAL 0
+#define HAVE_SSE2_EXTERNAL 0
+#define HAVE_SSE3_EXTERNAL 0
+#define HAVE_SSE4_EXTERNAL 0
+#define HAVE_SSE42_EXTERNAL 0
+#define HAVE_SSSE3_EXTERNAL 0
+#define HAVE_XOP_EXTERNAL 0
+#define HAVE_CPUNOP_EXTERNAL 0
+#define HAVE_I686_EXTERNAL 0
+#define HAVE_MIPSFPU_EXTERNAL 0
+#define HAVE_MIPS32R2_EXTERNAL 0
+#define HAVE_MIPS32R5_EXTERNAL 0
+#define HAVE_MIPS64R2_EXTERNAL 0
+#define HAVE_MIPS32R6_EXTERNAL 0
+#define HAVE_MIPS64R6_EXTERNAL 0
+#define HAVE_MIPSDSP_EXTERNAL 0
+#define HAVE_MIPSDSPR2_EXTERNAL 0
+#define HAVE_MSA_EXTERNAL 0
+#define HAVE_MSA2_EXTERNAL 0
+#define HAVE_LOONGSON2_EXTERNAL 0
+#define HAVE_LOONGSON3_EXTERNAL 0
+#define HAVE_MMI_EXTERNAL 0
+#define HAVE_ARMV5TE_INLINE 0
+#define HAVE_ARMV6_INLINE 0
+#define HAVE_ARMV6T2_INLINE 0
+#define HAVE_ARMV8_INLINE 1
+#define HAVE_NEON_INLINE 1
+#define HAVE_VFP_INLINE 1
+#define HAVE_VFPV3_INLINE 0
+#define HAVE_SETEND_INLINE 0
+#define HAVE_ALTIVEC_INLINE 0
+#define HAVE_DCBZL_INLINE 0
+#define HAVE_LDBRX_INLINE 0
+#define HAVE_POWER8_INLINE 0
+#define HAVE_PPC4XX_INLINE 0
+#define HAVE_VSX_INLINE 0
+#define HAVE_AESNI_INLINE 0
+#define HAVE_AMD3DNOW_INLINE 0
+#define HAVE_AMD3DNOWEXT_INLINE 0
+#define HAVE_AVX_INLINE 0
+#define HAVE_AVX2_INLINE 0
+#define HAVE_AVX512_INLINE 0
+#define HAVE_FMA3_INLINE 0
+#define HAVE_FMA4_INLINE 0
+#define HAVE_MMX_INLINE 0
+#define HAVE_MMXEXT_INLINE 0
+#define HAVE_SSE_INLINE 0
+#define HAVE_SSE2_INLINE 0
+#define HAVE_SSE3_INLINE 0
+#define HAVE_SSE4_INLINE 0
+#define HAVE_SSE42_INLINE 0
+#define HAVE_SSSE3_INLINE 0
+#define HAVE_XOP_INLINE 0
+#define HAVE_CPUNOP_INLINE 0
+#define HAVE_I686_INLINE 0
+#define HAVE_MIPSFPU_INLINE 0
+#define HAVE_MIPS32R2_INLINE 0
+#define HAVE_MIPS32R5_INLINE 0
+#define HAVE_MIPS64R2_INLINE 0
+#define HAVE_MIPS32R6_INLINE 0
+#define HAVE_MIPS64R6_INLINE 0
+#define HAVE_MIPSDSP_INLINE 0
+#define HAVE_MIPSDSPR2_INLINE 0
+#define HAVE_MSA_INLINE 0
+#define HAVE_MSA2_INLINE 0
+#define HAVE_LOONGSON2_INLINE 0
+#define HAVE_LOONGSON3_INLINE 0
+#define HAVE_MMI_INLINE 0
+#define HAVE_ALIGNED_STACK 1
+#define HAVE_FAST_64BIT 1
+#define HAVE_FAST_CLZ 1
+#define HAVE_FAST_CMOV 0
+#define HAVE_LOCAL_ALIGNED 0
+#define HAVE_SIMD_ALIGN_16 1
+#define HAVE_SIMD_ALIGN_32 0
+#define HAVE_SIMD_ALIGN_64 0
+#define HAVE_ATOMIC_CAS_PTR 0
+#define HAVE_MACHINE_RW_BARRIER 0
+#define HAVE_MEMORYBARRIER 0
+#define HAVE_MM_EMPTY 0
+#define HAVE_RDTSC 0
+#define HAVE_SEM_TIMEDWAIT 1
+#define HAVE_SYNC_VAL_COMPARE_AND_SWAP 1
+#define HAVE_CABS 0
+#define HAVE_CEXP 0
+#define HAVE_INLINE_ASM 1
+#define HAVE_SYMVER 0
+#define HAVE_X86ASM 0
+#define HAVE_BIGENDIAN 0
+#define HAVE_FAST_UNALIGNED 1
+#define HAVE_ARPA_INET_H 0
+#define HAVE_ASM_TYPES_H 1
+#define HAVE_CDIO_PARANOIA_H 0
+#define HAVE_CDIO_PARANOIA_PARANOIA_H 0
+#define HAVE_CUDA_H 0
+#define HAVE_DISPATCH_DISPATCH_H 0
+#define HAVE_DEV_BKTR_IOCTL_BT848_H 0
+#define HAVE_DEV_BKTR_IOCTL_METEOR_H 0
+#define HAVE_DEV_IC_BT8XX_H 0
+#define HAVE_DEV_VIDEO_BKTR_IOCTL_BT848_H 0
+#define HAVE_DEV_VIDEO_METEOR_IOCTL_METEOR_H 0
+#define HAVE_DIRECT_H 0
+#define HAVE_DIRENT_H 1
+#define HAVE_DXGIDEBUG_H 0
+#define HAVE_DXVA_H 0
+#define HAVE_ES2_GL_H 0
+#define HAVE_GSM_H 0
+#define HAVE_IO_H 0
+#define HAVE_LINUX_PERF_EVENT_H 1
+#define HAVE_MACHINE_IOCTL_BT848_H 0
+#define HAVE_MACHINE_IOCTL_METEOR_H 0
+#define HAVE_MALLOC_H 1
+#define HAVE_OPENCV2_CORE_CORE_C_H 0
+#define HAVE_OPENGL_GL3_H 0
+#define HAVE_POLL_H 1
+#define HAVE_SYS_PARAM_H 1
+#define HAVE_SYS_RESOURCE_H 1
+#define HAVE_SYS_SELECT_H 1
+#define HAVE_SYS_SOUNDCARD_H 1
+#define HAVE_SYS_TIME_H 1
+#define HAVE_SYS_UN_H 1
+#define HAVE_SYS_VIDEOIO_H 0
+#define HAVE_TERMIOS_H 1
+#define HAVE_UDPLITE_H 0
+#define HAVE_UNISTD_H 1
+#define HAVE_VALGRIND_VALGRIND_H 0
+#define HAVE_WINDOWS_H 0
+#define HAVE_WINSOCK2_H 0
+#define HAVE_INTRINSICS_NEON 1
+#define HAVE_ATANF 1
+#define HAVE_ATAN2F 1
+#define HAVE_CBRT 1
+#define HAVE_CBRTF 1
+#define HAVE_COPYSIGN 1
+#define HAVE_COSF 1
+#define HAVE_ERF 1
+#define HAVE_EXP2 1
+#define HAVE_EXP2F 1
+#define HAVE_EXPF 1
+#define HAVE_HYPOT 1
+#define HAVE_ISFINITE 1
+#define HAVE_ISINF 1
+#define HAVE_ISNAN 1
+#define HAVE_LDEXPF 1
+#define HAVE_LLRINT 1
+#define HAVE_LLRINTF 1
+#define HAVE_LOG2 1
+#define HAVE_LOG2F 1
+#define HAVE_LOG10F 1
+#define HAVE_LRINT 1
+#define HAVE_LRINTF 1
+#define HAVE_POWF 1
+#define HAVE_RINT 1
+#define HAVE_ROUND 1
+#define HAVE_ROUNDF 1
+#define HAVE_SINF 1
+#define HAVE_TRUNC 1
+#define HAVE_TRUNCF 1
+#define HAVE_DOS_PATHS 0
+#define HAVE_LIBC_MSVCRT 0
+#define HAVE_MMAL_PARAMETER_VIDEO_MAX_NUM_CALLBACKS 0
+#define HAVE_SECTION_DATA_REL_RO 1
+#define HAVE_THREADS 1
+#define HAVE_UWP 0
+#define HAVE_WINRT 0
+#define HAVE_ACCESS 1
+#define HAVE_ALIGNED_MALLOC 0
+#define HAVE_ARC4RANDOM 0
+#define HAVE_CLOCK_GETTIME 1
+#define HAVE_CLOSESOCKET 0
+#define HAVE_COMMANDLINETOARGVW 0
+#define HAVE_FCNTL 1
+#define HAVE_GETADDRINFO 0
+#define HAVE_GETHRTIME 0
+#define HAVE_GETOPT 1
+#define HAVE_GETMODULEHANDLE 0
+#define HAVE_GETPROCESSAFFINITYMASK 0
+#define HAVE_GETPROCESSMEMORYINFO 0
+#define HAVE_GETPROCESSTIMES 0
+#define HAVE_GETRUSAGE 1
+#define HAVE_GETSTDHANDLE 0
+#define HAVE_GETSYSTEMTIMEASFILETIME 0
+#define HAVE_GETTIMEOFDAY 1
+#define HAVE_GLOB 1
+#define HAVE_GLXGETPROCADDRESS 0
+#define HAVE_GMTIME_R 1
+#define HAVE_INET_ATON 0
+#define HAVE_ISATTY 1
+#define HAVE_KBHIT 0
+#define HAVE_LOCALTIME_R 1
+#define HAVE_LSTAT 1
+#define HAVE_LZO1X_999_COMPRESS 0
+#define HAVE_MACH_ABSOLUTE_TIME 0
+#define HAVE_MAPVIEWOFFILE 0
+#define HAVE_MEMALIGN 1
+#define HAVE_MKSTEMP 1
+#define HAVE_MMAP 1
+#define HAVE_MPROTECT 1
+#define HAVE_NANOSLEEP 1
+#define HAVE_PEEKNAMEDPIPE 0
+#define HAVE_POSIX_MEMALIGN 1
+#define HAVE_PTHREAD_CANCEL 1
+#define HAVE_SCHED_GETAFFINITY 1
+#define HAVE_SECITEMIMPORT 0
+#define HAVE_SETCONSOLETEXTATTRIBUTE 0
+#define HAVE_SETCONSOLECTRLHANDLER 0
+#define HAVE_SETDLLDIRECTORY 0
+#define HAVE_SETMODE 0
+#define HAVE_SETRLIMIT 1
+#define HAVE_SLEEP 0
+#define HAVE_STRERROR_R 1
+#define HAVE_SYSCONF 1
+#define HAVE_SYSCTL 0
+#define HAVE_USLEEP 1
+#define HAVE_UTGETOSTYPEFROMSTRING 0
+#define HAVE_VIRTUALALLOC 0
+#define HAVE_WGLGETPROCADDRESS 0
+#define HAVE_BCRYPT 0
+#define HAVE_VAAPI_DRM 0
+#define HAVE_VAAPI_X11 0
+#define HAVE_VDPAU_X11 0
+#define HAVE_PTHREADS 1
+#define HAVE_OS2THREADS 0
+#define HAVE_W32THREADS 0
+#define HAVE_AS_ARCH_DIRECTIVE 0
+#define HAVE_AS_DN_DIRECTIVE 0
+#define HAVE_AS_FPU_DIRECTIVE 0
+#define HAVE_AS_FUNC 0
+#define HAVE_AS_OBJECT_ARCH 0
+#define HAVE_ASM_MOD_Q 0
+#define HAVE_BLOCKS_EXTENSION 0
+#define HAVE_EBP_AVAILABLE 0
+#define HAVE_EBX_AVAILABLE 0
+#define HAVE_GNU_AS 0
+#define HAVE_GNU_WINDRES 0
+#define HAVE_IBM_ASM 0
+#define HAVE_INLINE_ASM_DIRECT_SYMBOL_REFS 0
+#define HAVE_INLINE_ASM_LABELS 1
+#define HAVE_INLINE_ASM_NONLOCAL_LABELS 1
+#define HAVE_PRAGMA_DEPRECATED 1
+#define HAVE_RSYNC_CONTIMEOUT 1
+#define HAVE_SYMVER_ASM_LABEL 1
+#define HAVE_SYMVER_GNU_ASM 1
+/* #define HAVE_VFP_ARGS 0 -- softfp/hardfp selection is done by the fuchsia build */
+#define HAVE_XFORM_ASM 0
+#define HAVE_XMM_CLOBBERS 0
+#define HAVE_KCMVIDEOCODECTYPE_HEVC 0
+#define HAVE_KCVPIXELFORMATTYPE_420YPCBCR10BIPLANARVIDEORANGE 0
+#define HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_SMPTE_ST_2084_PQ 0
+#define HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_ITU_R_2100_HLG 0
+#define HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_LINEAR 0
+#define HAVE_SOCKLEN_T 0
+#define HAVE_STRUCT_ADDRINFO 0
+#define HAVE_STRUCT_GROUP_SOURCE_REQ 0
+#define HAVE_STRUCT_IP_MREQ_SOURCE 0
+#define HAVE_STRUCT_IPV6_MREQ 0
+#define HAVE_STRUCT_MSGHDR_MSG_FLAGS 0
+#define HAVE_STRUCT_POLLFD 0
+#define HAVE_STRUCT_RUSAGE_RU_MAXRSS 1
+#define HAVE_STRUCT_SCTP_EVENT_SUBSCRIBE 0
+#define HAVE_STRUCT_SOCKADDR_IN6 0
+#define HAVE_STRUCT_SOCKADDR_SA_LEN 0
+#define HAVE_STRUCT_SOCKADDR_STORAGE 0
+#define HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC 1
+#define HAVE_STRUCT_V4L2_FRMIVALENUM_DISCRETE 0
+#define HAVE_MAKEINFO 0
+#define HAVE_MAKEINFO_HTML 0
+#define HAVE_OPENCL_D3D11 0
+#define HAVE_OPENCL_DRM_ARM 0
+#define HAVE_OPENCL_DRM_BEIGNET 0
+#define HAVE_OPENCL_DXVA2 0
+#define HAVE_OPENCL_VAAPI_BEIGNET 0
+#define HAVE_OPENCL_VAAPI_INTEL_MEDIA 0
+#define HAVE_PERL 1
+#define HAVE_POD2MAN 1
+#define HAVE_TEXI2HTML 0
+#define CONFIG_DOC 0
+#define CONFIG_HTMLPAGES 0
+#define CONFIG_MANPAGES 0
+#define CONFIG_PODPAGES 0
+#define CONFIG_TXTPAGES 0
+#define CONFIG_AVIO_LIST_DIR_EXAMPLE 1
+#define CONFIG_AVIO_READING_EXAMPLE 1
+#define CONFIG_DECODE_AUDIO_EXAMPLE 1
+#define CONFIG_DECODE_VIDEO_EXAMPLE 1
+#define CONFIG_DEMUXING_DECODING_EXAMPLE 1
+#define CONFIG_ENCODE_AUDIO_EXAMPLE 1
+#define CONFIG_ENCODE_VIDEO_EXAMPLE 1
+#define CONFIG_EXTRACT_MVS_EXAMPLE 1
+#define CONFIG_FILTER_AUDIO_EXAMPLE 0
+#define CONFIG_FILTERING_AUDIO_EXAMPLE 0
+#define CONFIG_FILTERING_VIDEO_EXAMPLE 0
+#define CONFIG_HTTP_MULTICLIENT_EXAMPLE 1
+#define CONFIG_HW_DECODE_EXAMPLE 1
+#define CONFIG_METADATA_EXAMPLE 1
+#define CONFIG_MUXING_EXAMPLE 0
+#define CONFIG_QSVDEC_EXAMPLE 0
+#define CONFIG_REMUXING_EXAMPLE 1
+#define CONFIG_RESAMPLING_AUDIO_EXAMPLE 0
+#define CONFIG_SCALING_VIDEO_EXAMPLE 0
+#define CONFIG_TRANSCODE_AAC_EXAMPLE 0
+#define CONFIG_TRANSCODING_EXAMPLE 0
+#define CONFIG_VAAPI_ENCODE_EXAMPLE 0
+#define CONFIG_VAAPI_TRANSCODE_EXAMPLE 0
+#define CONFIG_AVISYNTH 0
+#define CONFIG_FREI0R 0
+#define CONFIG_LIBCDIO 0
+#define CONFIG_LIBDAVS2 0
+#define CONFIG_LIBRUBBERBAND 0
+#define CONFIG_LIBVIDSTAB 0
+#define CONFIG_LIBX264 0
+#define CONFIG_LIBX265 0
+#define CONFIG_LIBXAVS 0
+#define CONFIG_LIBXAVS2 0
+#define CONFIG_LIBXVID 0
+#define CONFIG_DECKLINK 0
+#define CONFIG_LIBFDK_AAC 0
+#define CONFIG_OPENSSL 0
+#define CONFIG_LIBTLS 0
+#define CONFIG_GMP 0
+#define CONFIG_LIBARIBB24 0
+#define CONFIG_LIBLENSFUN 0
+#define CONFIG_LIBOPENCORE_AMRNB 0
+#define CONFIG_LIBOPENCORE_AMRWB 0
+#define CONFIG_LIBVMAF 0
+#define CONFIG_LIBVO_AMRWBENC 0
+#define CONFIG_MBEDTLS 0
+#define CONFIG_RKMPP 0
+#define CONFIG_LIBSMBCLIENT 0
+#define CONFIG_CHROMAPRINT 0
+#define CONFIG_GCRYPT 0
+#define CONFIG_GNUTLS 0
+#define CONFIG_JNI 0
+#define CONFIG_LADSPA 0
+#define CONFIG_LIBAOM 0
+#define CONFIG_LIBASS 0
+#define CONFIG_LIBBLURAY 0
+#define CONFIG_LIBBS2B 0
+#define CONFIG_LIBCACA 0
+#define CONFIG_LIBCELT 0
+#define CONFIG_LIBCODEC2 0
+#define CONFIG_LIBDAV1D 0
+#define CONFIG_LIBDC1394 0
+#define CONFIG_LIBDRM 0
+#define CONFIG_LIBFLITE 0
+#define CONFIG_LIBFONTCONFIG 0
+#define CONFIG_LIBFREETYPE 0
+#define CONFIG_LIBFRIBIDI 0
+#define CONFIG_LIBGLSLANG 0
+#define CONFIG_LIBGME 0
+#define CONFIG_LIBGSM 0
+#define CONFIG_LIBIEC61883 0
+#define CONFIG_LIBILBC 0
+#define CONFIG_LIBJACK 0
+#define CONFIG_LIBKLVANC 0
+#define CONFIG_LIBKVAZAAR 0
+#define CONFIG_LIBMODPLUG 0
+#define CONFIG_LIBMP3LAME 0
+#define CONFIG_LIBMYSOFA 0
+#define CONFIG_LIBOPENCV 0
+#define CONFIG_LIBOPENH264 0
+#define CONFIG_LIBOPENJPEG 0
+#define CONFIG_LIBOPENMPT 0
+#define CONFIG_LIBOPUS 1
+#define CONFIG_LIBPULSE 0
+#define CONFIG_LIBRABBITMQ 0
+#define CONFIG_LIBRAV1E 0
+#define CONFIG_LIBRSVG 0
+#define CONFIG_LIBRTMP 0
+#define CONFIG_LIBSHINE 0
+#define CONFIG_LIBSMBCLIENT 0
+#define CONFIG_LIBSNAPPY 0
+#define CONFIG_LIBSOXR 0
+#define CONFIG_LIBSPEEX 0
+#define CONFIG_LIBSRT 0
+#define CONFIG_LIBSSH 0
+#define CONFIG_LIBTENSORFLOW 0
+#define CONFIG_LIBTESSERACT 0
+#define CONFIG_LIBTHEORA 0
+#define CONFIG_LIBTWOLAME 0
+#define CONFIG_LIBV4L2 0
+#define CONFIG_LIBVORBIS 0
+#define CONFIG_LIBVPX 0
+#define CONFIG_LIBWAVPACK 0
+#define CONFIG_LIBWEBP 0
+#define CONFIG_LIBXML2 0
+#define CONFIG_LIBZIMG 0
+#define CONFIG_LIBZMQ 0
+#define CONFIG_LIBZVBI 0
+#define CONFIG_LV2 0
+#define CONFIG_MEDIACODEC 0
+#define CONFIG_OPENAL 0
+#define CONFIG_OPENGL 0
+#define CONFIG_POCKETSPHINX 0
+#define CONFIG_VAPOURSYNTH 0
+#define CONFIG_ALSA 0
+#define CONFIG_APPKIT 0
+#define CONFIG_AVFOUNDATION 0
+#define CONFIG_BZLIB 0
+#define CONFIG_COREIMAGE 0
+#define CONFIG_ICONV 0
+#define CONFIG_LIBXCB 0
+#define CONFIG_LIBXCB_SHM 0
+#define CONFIG_LIBXCB_SHAPE 0
+#define CONFIG_LIBXCB_XFIXES 0
+#define CONFIG_LZMA 0
+#define CONFIG_SCHANNEL 0
+#define CONFIG_SDL2 0
+#define CONFIG_SECURETRANSPORT 0
+#define CONFIG_SNDIO 0
+#define CONFIG_XLIB 0
+#define CONFIG_ZLIB 0
+#define CONFIG_CUDA_NVCC 0
+#define CONFIG_CUDA_SDK 0
+#define CONFIG_LIBNPP 0
+#define CONFIG_LIBMFX 0
+#define CONFIG_MMAL 0
+#define CONFIG_OMX 0
+#define CONFIG_OPENCL 0
+#define CONFIG_VULKAN 0
+#define CONFIG_AMF 0
+#define CONFIG_AUDIOTOOLBOX 0
+#define CONFIG_CRYSTALHD 0
+#define CONFIG_CUDA 0
+#define CONFIG_CUDA_LLVM 0
+#define CONFIG_CUVID 0
+#define CONFIG_D3D11VA 0
+#define CONFIG_DXVA2 0
+#define CONFIG_FFNVCODEC 0
+#define CONFIG_NVDEC 0
+#define CONFIG_NVENC 0
+#define CONFIG_VAAPI 0
+#define CONFIG_VDPAU 0
+#define CONFIG_VIDEOTOOLBOX 0
+#define CONFIG_V4L2_M2M 0
+#define CONFIG_XVMC 0
+#define CONFIG_FTRAPV 0
+#define CONFIG_GRAY 0
+#define CONFIG_HARDCODED_TABLES 0
+#define CONFIG_OMX_RPI 0
+#define CONFIG_RUNTIME_CPUDETECT 1
+#define CONFIG_SAFE_BITSTREAM_READER 1
+#define CONFIG_SHARED 0
+#define CONFIG_SMALL 0
+#define CONFIG_STATIC 1
+#define CONFIG_SWSCALE_ALPHA 1
+#define CONFIG_GPL 0
+#define CONFIG_NONFREE 0
+#define CONFIG_VERSION3 0
+#define CONFIG_AVDEVICE 0
+#define CONFIG_AVFILTER 0
+#define CONFIG_SWSCALE 0
+#define CONFIG_POSTPROC 0
+#define CONFIG_AVFORMAT 1
+#define CONFIG_AVCODEC 1
+#define CONFIG_SWRESAMPLE 0
+#define CONFIG_AVRESAMPLE 0
+#define CONFIG_AVUTIL 1
+#define CONFIG_FFPLAY 0
+#define CONFIG_FFPROBE 0
+#define CONFIG_FFMPEG 0
+#define CONFIG_DCT 1
+#define CONFIG_DWT 0
+#define CONFIG_ERROR_RESILIENCE 1
+#define CONFIG_FAAN 0
+#define CONFIG_FAST_UNALIGNED 1
+#define CONFIG_FFT 1
+#define CONFIG_LSP 1
+#define CONFIG_LZO 0
+#define CONFIG_MDCT 1
+#define CONFIG_PIXELUTILS 0
+#define CONFIG_NETWORK 0
+#define CONFIG_RDFT 1
+#define CONFIG_AUTODETECT 0
+#define CONFIG_FONTCONFIG 0
+#define CONFIG_LARGE_TESTS 1
+#define CONFIG_LINUX_PERF 0
+#define CONFIG_MEMORY_POISONING 0
+#define CONFIG_NEON_CLOBBER_TEST 0
+#define CONFIG_OSSFUZZ 0
+#define CONFIG_PIC 1
+#define CONFIG_THUMB 0
+#define CONFIG_VALGRIND_BACKTRACE 0
+#define CONFIG_XMM_CLOBBER_TEST 0
+#define CONFIG_BSFS 1
+#define CONFIG_DECODERS 1
+#define CONFIG_ENCODERS 0
+#define CONFIG_HWACCELS 0
+#define CONFIG_PARSERS 1
+#define CONFIG_INDEVS 0
+#define CONFIG_OUTDEVS 0
+#define CONFIG_FILTERS 0
+#define CONFIG_DEMUXERS 1
+#define CONFIG_MUXERS 0
+#define CONFIG_PROTOCOLS 0
+#define CONFIG_AANDCTTABLES 0
+#define CONFIG_AC3DSP 0
+#define CONFIG_ADTS_HEADER 1
+#define CONFIG_AUDIO_FRAME_QUEUE 1
+#define CONFIG_AUDIODSP 0
+#define CONFIG_BLOCKDSP 1
+#define CONFIG_BSWAPDSP 0
+#define CONFIG_CABAC 1
+#define CONFIG_CBS 0
+#define CONFIG_CBS_AV1 0
+#define CONFIG_CBS_H264 0
+#define CONFIG_CBS_H265 0
+#define CONFIG_CBS_JPEG 0
+#define CONFIG_CBS_MPEG2 0
+#define CONFIG_CBS_VP9 0
+#define CONFIG_DIRAC_PARSE 1
+#define CONFIG_DNN 0
+#define CONFIG_DVPROFILE 0
+#define CONFIG_EXIF 1
+#define CONFIG_FAANDCT 0
+#define CONFIG_FAANIDCT 0
+#define CONFIG_FDCTDSP 1
+#define CONFIG_FLACDSP 1
+#define CONFIG_FMTCONVERT 0
+#define CONFIG_FRAME_THREAD_ENCODER 0
+#define CONFIG_G722DSP 0
+#define CONFIG_GOLOMB 1
+#define CONFIG_GPLV3 0
+#define CONFIG_H263DSP 1
+#define CONFIG_H264CHROMA 1
+#define CONFIG_H264DSP 1
+#define CONFIG_H264PARSE 1
+#define CONFIG_H264PRED 1
+#define CONFIG_H264QPEL 1
+#define CONFIG_HEVCPARSE 0
+#define CONFIG_HPELDSP 1
+#define CONFIG_HUFFMAN 0
+#define CONFIG_HUFFYUVDSP 0
+#define CONFIG_HUFFYUVENCDSP 0
+#define CONFIG_IDCTDSP 1
+#define CONFIG_IIRFILTER 0
+#define CONFIG_MDCT15 1
+#define CONFIG_INTRAX8 0
+#define CONFIG_ISO_MEDIA 1
+#define CONFIG_IVIDSP 0
+#define CONFIG_JPEGTABLES 0
+#define CONFIG_LGPLV3 0
+#define CONFIG_LIBX262 0
+#define CONFIG_LLAUDDSP 0
+#define CONFIG_LLVIDDSP 0
+#define CONFIG_LLVIDENCDSP 0
+#define CONFIG_LPC 0
+#define CONFIG_LZF 0
+#define CONFIG_ME_CMP 1
+#define CONFIG_MPEG_ER 1
+#define CONFIG_MPEGAUDIO 1
+#define CONFIG_MPEGAUDIODSP 1
+#define CONFIG_MPEGAUDIOHEADER 1
+#define CONFIG_MPEGVIDEO 1
+#define CONFIG_MPEGVIDEOENC 0
+#define CONFIG_MSS34DSP 0
+#define CONFIG_PIXBLOCKDSP 1
+#define CONFIG_QPELDSP 1
+#define CONFIG_QSV 0
+#define CONFIG_QSVDEC 0
+#define CONFIG_QSVENC 0
+#define CONFIG_QSVVPP 0
+#define CONFIG_RANGECODER 0
+#define CONFIG_RIFFDEC 1
+#define CONFIG_RIFFENC 0
+#define CONFIG_RTPDEC 0
+#define CONFIG_RTPENC_CHAIN 0
+#define CONFIG_RV34DSP 0
+#define CONFIG_SCENE_SAD 0
+#define CONFIG_SINEWIN 1
+#define CONFIG_SNAPPY 0
+#define CONFIG_SRTP 0
+#define CONFIG_STARTCODE 1
+#define CONFIG_TEXTUREDSP 0
+#define CONFIG_TEXTUREDSPENC 0
+#define CONFIG_TPELDSP 0
+#define CONFIG_VAAPI_1 0
+#define CONFIG_VAAPI_ENCODE 0
+#define CONFIG_VC1DSP 0
+#define CONFIG_VIDEODSP 1
+#define CONFIG_VP3DSP 1
+#define CONFIG_VP56DSP 0
+#define CONFIG_VP8DSP 1
+#define CONFIG_WMA_FREQS 0
+#define CONFIG_WMV2DSP 0
+#define CONFIG_AAC_ADTSTOASC_BSF 0
+#define CONFIG_AV1_FRAME_MERGE_BSF 0
+#define CONFIG_AV1_FRAME_SPLIT_BSF 0
+#define CONFIG_AV1_METADATA_BSF 0
+#define CONFIG_CHOMP_BSF 0
+#define CONFIG_DUMP_EXTRADATA_BSF 0
+#define CONFIG_DCA_CORE_BSF 0
+#define CONFIG_EAC3_CORE_BSF 0
+#define CONFIG_EXTRACT_EXTRADATA_BSF 0
+#define CONFIG_FILTER_UNITS_BSF 0
+#define CONFIG_H264_METADATA_BSF 0
+#define CONFIG_H264_MP4TOANNEXB_BSF 0
+#define CONFIG_H264_REDUNDANT_PPS_BSF 0
+#define CONFIG_HAPQA_EXTRACT_BSF 0
+#define CONFIG_HEVC_METADATA_BSF 0
+#define CONFIG_HEVC_MP4TOANNEXB_BSF 0
+#define CONFIG_IMX_DUMP_HEADER_BSF 0
+#define CONFIG_MJPEG2JPEG_BSF 0
+#define CONFIG_MJPEGA_DUMP_HEADER_BSF 0
+#define CONFIG_MP3_HEADER_DECOMPRESS_BSF 0
+#define CONFIG_MPEG2_METADATA_BSF 0
+#define CONFIG_MPEG4_UNPACK_BFRAMES_BSF 0
+#define CONFIG_MOV2TEXTSUB_BSF 0
+#define CONFIG_NOISE_BSF 0
+#define CONFIG_NULL_BSF 1
+#define CONFIG_PRORES_METADATA_BSF 0
+#define CONFIG_REMOVE_EXTRADATA_BSF 0
+#define CONFIG_TEXT2MOVSUB_BSF 0
+#define CONFIG_TRACE_HEADERS_BSF 0
+#define CONFIG_TRUEHD_CORE_BSF 0
+#define CONFIG_VP9_METADATA_BSF 0
+#define CONFIG_VP9_RAW_REORDER_BSF 0
+#define CONFIG_VP9_SUPERFRAME_BSF 0
+#define CONFIG_VP9_SUPERFRAME_SPLIT_BSF 0
+#define CONFIG_AASC_DECODER 0
+#define CONFIG_AIC_DECODER 0
+#define CONFIG_ALIAS_PIX_DECODER 0
+#define CONFIG_AGM_DECODER 0
+#define CONFIG_AMV_DECODER 0
+#define CONFIG_ANM_DECODER 0
+#define CONFIG_ANSI_DECODER 0
+#define CONFIG_APNG_DECODER 0
+#define CONFIG_ARBC_DECODER 0
+#define CONFIG_ASV1_DECODER 0
+#define CONFIG_ASV2_DECODER 0
+#define CONFIG_AURA_DECODER 0
+#define CONFIG_AURA2_DECODER 0
+#define CONFIG_AVRP_DECODER 0
+#define CONFIG_AVRN_DECODER 0
+#define CONFIG_AVS_DECODER 0
+#define CONFIG_AVUI_DECODER 0
+#define CONFIG_AYUV_DECODER 0
+#define CONFIG_BETHSOFTVID_DECODER 0
+#define CONFIG_BFI_DECODER 0
+#define CONFIG_BINK_DECODER 0
+#define CONFIG_BITPACKED_DECODER 0
+#define CONFIG_BMP_DECODER 0
+#define CONFIG_BMV_VIDEO_DECODER 0
+#define CONFIG_BRENDER_PIX_DECODER 0
+#define CONFIG_C93_DECODER 0
+#define CONFIG_CAVS_DECODER 0
+#define CONFIG_CDGRAPHICS_DECODER 0
+#define CONFIG_CDTOONS_DECODER 0
+#define CONFIG_CDXL_DECODER 0
+#define CONFIG_CFHD_DECODER 0
+#define CONFIG_CINEPAK_DECODER 0
+#define CONFIG_CLEARVIDEO_DECODER 0
+#define CONFIG_CLJR_DECODER 0
+#define CONFIG_CLLC_DECODER 0
+#define CONFIG_COMFORTNOISE_DECODER 0
+#define CONFIG_CPIA_DECODER 0
+#define CONFIG_CSCD_DECODER 0
+#define CONFIG_CYUV_DECODER 0
+#define CONFIG_DDS_DECODER 0
+#define CONFIG_DFA_DECODER 0
+#define CONFIG_DIRAC_DECODER 0
+#define CONFIG_DNXHD_DECODER 0
+#define CONFIG_DPX_DECODER 0
+#define CONFIG_DSICINVIDEO_DECODER 0
+#define CONFIG_DVAUDIO_DECODER 0
+#define CONFIG_DVVIDEO_DECODER 0
+#define CONFIG_DXA_DECODER 0
+#define CONFIG_DXTORY_DECODER 0
+#define CONFIG_DXV_DECODER 0
+#define CONFIG_EACMV_DECODER 0
+#define CONFIG_EAMAD_DECODER 0
+#define CONFIG_EATGQ_DECODER 0
+#define CONFIG_EATGV_DECODER 0
+#define CONFIG_EATQI_DECODER 0
+#define CONFIG_EIGHTBPS_DECODER 0
+#define CONFIG_EIGHTSVX_EXP_DECODER 0
+#define CONFIG_EIGHTSVX_FIB_DECODER 0
+#define CONFIG_ESCAPE124_DECODER 0
+#define CONFIG_ESCAPE130_DECODER 0
+#define CONFIG_EXR_DECODER 0
+#define CONFIG_FFV1_DECODER 0
+#define CONFIG_FFVHUFF_DECODER 0
+#define CONFIG_FIC_DECODER 0
+#define CONFIG_FITS_DECODER 0
+#define CONFIG_FLASHSV_DECODER 0
+#define CONFIG_FLASHSV2_DECODER 0
+#define CONFIG_FLIC_DECODER 0
+#define CONFIG_FLV_DECODER 0
+#define CONFIG_FMVC_DECODER 0
+#define CONFIG_FOURXM_DECODER 0
+#define CONFIG_FRAPS_DECODER 0
+#define CONFIG_FRWU_DECODER 0
+#define CONFIG_G2M_DECODER 0
+#define CONFIG_GDV_DECODER 0
+#define CONFIG_GIF_DECODER 0
+#define CONFIG_H261_DECODER 0
+#define CONFIG_H263_DECODER 1
+#define CONFIG_H263I_DECODER 0
+#define CONFIG_H263P_DECODER 0
+#define CONFIG_H263_V4L2M2M_DECODER 0
+#define CONFIG_H264_DECODER 1
+#define CONFIG_H264_CRYSTALHD_DECODER 0
+#define CONFIG_H264_V4L2M2M_DECODER 0
+#define CONFIG_H264_MEDIACODEC_DECODER 0
+#define CONFIG_H264_MMAL_DECODER 0
+#define CONFIG_H264_QSV_DECODER 0
+#define CONFIG_H264_RKMPP_DECODER 0
+#define CONFIG_HAP_DECODER 0
+#define CONFIG_HEVC_DECODER 0
+#define CONFIG_HEVC_QSV_DECODER 0
+#define CONFIG_HEVC_RKMPP_DECODER 0
+#define CONFIG_HEVC_V4L2M2M_DECODER 0
+#define CONFIG_HNM4_VIDEO_DECODER 0
+#define CONFIG_HQ_HQA_DECODER 0
+#define CONFIG_HQX_DECODER 0
+#define CONFIG_HUFFYUV_DECODER 0
+#define CONFIG_HYMT_DECODER 0
+#define CONFIG_IDCIN_DECODER 0
+#define CONFIG_IFF_ILBM_DECODER 0
+#define CONFIG_IMM4_DECODER 0
+#define CONFIG_IMM5_DECODER 0
+#define CONFIG_INDEO2_DECODER 0
+#define CONFIG_INDEO3_DECODER 0
+#define CONFIG_INDEO4_DECODER 0
+#define CONFIG_INDEO5_DECODER 0
+#define CONFIG_INTERPLAY_VIDEO_DECODER 0
+#define CONFIG_JPEG2000_DECODER 0
+#define CONFIG_JPEGLS_DECODER 0
+#define CONFIG_JV_DECODER 0
+#define CONFIG_KGV1_DECODER 0
+#define CONFIG_KMVC_DECODER 0
+#define CONFIG_LAGARITH_DECODER 0
+#define CONFIG_LOCO_DECODER 0
+#define CONFIG_LSCR_DECODER 0
+#define CONFIG_M101_DECODER 0
+#define CONFIG_MAGICYUV_DECODER 0
+#define CONFIG_MDEC_DECODER 0
+#define CONFIG_MIMIC_DECODER 0
+#define CONFIG_MJPEG_DECODER 0
+#define CONFIG_MJPEGB_DECODER 0
+#define CONFIG_MMVIDEO_DECODER 0
+#define CONFIG_MOTIONPIXELS_DECODER 0
+#define CONFIG_MPEG1VIDEO_DECODER 0
+#define CONFIG_MPEG2VIDEO_DECODER 0
+#define CONFIG_MPEG4_DECODER 1
+#define CONFIG_MPEG4_CRYSTALHD_DECODER 0
+#define CONFIG_MPEG4_V4L2M2M_DECODER 0
+#define CONFIG_MPEG4_MMAL_DECODER 0
+#define CONFIG_MPEGVIDEO_DECODER 0
+#define CONFIG_MPEG1_V4L2M2M_DECODER 0
+#define CONFIG_MPEG2_MMAL_DECODER 0
+#define CONFIG_MPEG2_CRYSTALHD_DECODER 0
+#define CONFIG_MPEG2_V4L2M2M_DECODER 0
+#define CONFIG_MPEG2_QSV_DECODER 0
+#define CONFIG_MPEG2_MEDIACODEC_DECODER 0
+#define CONFIG_MSA1_DECODER 0
+#define CONFIG_MSCC_DECODER 0
+#define CONFIG_MSMPEG4V1_DECODER 0
+#define CONFIG_MSMPEG4V2_DECODER 0
+#define CONFIG_MSMPEG4V3_DECODER 0
+#define CONFIG_MSMPEG4_CRYSTALHD_DECODER 0
+#define CONFIG_MSRLE_DECODER 0
+#define CONFIG_MSS1_DECODER 0
+#define CONFIG_MSS2_DECODER 0
+#define CONFIG_MSVIDEO1_DECODER 0
+#define CONFIG_MSZH_DECODER 0
+#define CONFIG_MTS2_DECODER 0
+#define CONFIG_MV30_DECODER 0
+#define CONFIG_MVC1_DECODER 0
+#define CONFIG_MVC2_DECODER 0
+#define CONFIG_MVDV_DECODER 0
+#define CONFIG_MVHA_DECODER 0
+#define CONFIG_MWSC_DECODER 0
+#define CONFIG_MXPEG_DECODER 0
+#define CONFIG_NUV_DECODER 0
+#define CONFIG_PAF_VIDEO_DECODER 0
+#define CONFIG_PAM_DECODER 0
+#define CONFIG_PBM_DECODER 0
+#define CONFIG_PCX_DECODER 0
+#define CONFIG_PGM_DECODER 0
+#define CONFIG_PGMYUV_DECODER 0
+#define CONFIG_PICTOR_DECODER 0
+#define CONFIG_PIXLET_DECODER 0
+#define CONFIG_PNG_DECODER 0
+#define CONFIG_PPM_DECODER 0
+#define CONFIG_PRORES_DECODER 0
+#define CONFIG_PROSUMER_DECODER 0
+#define CONFIG_PSD_DECODER 0
+#define CONFIG_PTX_DECODER 0
+#define CONFIG_QDRAW_DECODER 0
+#define CONFIG_QPEG_DECODER 0
+#define CONFIG_QTRLE_DECODER 0
+#define CONFIG_R10K_DECODER 0
+#define CONFIG_R210_DECODER 0
+#define CONFIG_RASC_DECODER 0
+#define CONFIG_RAWVIDEO_DECODER 0
+#define CONFIG_RL2_DECODER 0
+#define CONFIG_ROQ_DECODER 0
+#define CONFIG_RPZA_DECODER 0
+#define CONFIG_RSCC_DECODER 0
+#define CONFIG_RV10_DECODER 0
+#define CONFIG_RV20_DECODER 0
+#define CONFIG_RV30_DECODER 0
+#define CONFIG_RV40_DECODER 0
+#define CONFIG_S302M_DECODER 0
+#define CONFIG_SANM_DECODER 0
+#define CONFIG_SCPR_DECODER 0
+#define CONFIG_SCREENPRESSO_DECODER 0
+#define CONFIG_SGI_DECODER 0
+#define CONFIG_SGIRLE_DECODER 0
+#define CONFIG_SHEERVIDEO_DECODER 0
+#define CONFIG_SMACKER_DECODER 0
+#define CONFIG_SMC_DECODER 0
+#define CONFIG_SMVJPEG_DECODER 0
+#define CONFIG_SNOW_DECODER 0
+#define CONFIG_SP5X_DECODER 0
+#define CONFIG_SPEEDHQ_DECODER 0
+#define CONFIG_SRGC_DECODER 0
+#define CONFIG_SUNRAST_DECODER 0
+#define CONFIG_SVQ1_DECODER 0
+#define CONFIG_SVQ3_DECODER 0
+#define CONFIG_TARGA_DECODER 0
+#define CONFIG_TARGA_Y216_DECODER 0
+#define CONFIG_TDSC_DECODER 0
+#define CONFIG_THEORA_DECODER 1
+#define CONFIG_THP_DECODER 0
+#define CONFIG_TIERTEXSEQVIDEO_DECODER 0
+#define CONFIG_TIFF_DECODER 0
+#define CONFIG_TMV_DECODER 0
+#define CONFIG_TRUEMOTION1_DECODER 0
+#define CONFIG_TRUEMOTION2_DECODER 0
+#define CONFIG_TRUEMOTION2RT_DECODER 0
+#define CONFIG_TSCC_DECODER 0
+#define CONFIG_TSCC2_DECODER 0
+#define CONFIG_TXD_DECODER 0
+#define CONFIG_ULTI_DECODER 0
+#define CONFIG_UTVIDEO_DECODER 0
+#define CONFIG_V210_DECODER 0
+#define CONFIG_V210X_DECODER 0
+#define CONFIG_V308_DECODER 0
+#define CONFIG_V408_DECODER 0
+#define CONFIG_V410_DECODER 0
+#define CONFIG_VB_DECODER 0
+#define CONFIG_VBLE_DECODER 0
+#define CONFIG_VC1_DECODER 0
+#define CONFIG_VC1_CRYSTALHD_DECODER 0
+#define CONFIG_VC1IMAGE_DECODER 0
+#define CONFIG_VC1_MMAL_DECODER 0
+#define CONFIG_VC1_QSV_DECODER 0
+#define CONFIG_VC1_V4L2M2M_DECODER 0
+#define CONFIG_VCR1_DECODER 0
+#define CONFIG_VMDVIDEO_DECODER 0
+#define CONFIG_VMNC_DECODER 0
+#define CONFIG_VP3_DECODER 1
+#define CONFIG_VP4_DECODER 0
+#define CONFIG_VP5_DECODER 0
+#define CONFIG_VP6_DECODER 0
+#define CONFIG_VP6A_DECODER 0
+#define CONFIG_VP6F_DECODER 0
+#define CONFIG_VP7_DECODER 0
+#define CONFIG_VP8_DECODER 1
+#define CONFIG_VP8_RKMPP_DECODER 0
+#define CONFIG_VP8_V4L2M2M_DECODER 0
+#define CONFIG_VP9_DECODER 0
+#define CONFIG_VP9_RKMPP_DECODER 0
+#define CONFIG_VP9_V4L2M2M_DECODER 0
+#define CONFIG_VQA_DECODER 0
+#define CONFIG_WEBP_DECODER 0
+#define CONFIG_WCMV_DECODER 0
+#define CONFIG_WRAPPED_AVFRAME_DECODER 0
+#define CONFIG_WMV1_DECODER 0
+#define CONFIG_WMV2_DECODER 0
+#define CONFIG_WMV3_DECODER 0
+#define CONFIG_WMV3_CRYSTALHD_DECODER 0
+#define CONFIG_WMV3IMAGE_DECODER 0
+#define CONFIG_WNV1_DECODER 0
+#define CONFIG_XAN_WC3_DECODER 0
+#define CONFIG_XAN_WC4_DECODER 0
+#define CONFIG_XBM_DECODER 0
+#define CONFIG_XFACE_DECODER 0
+#define CONFIG_XL_DECODER 0
+#define CONFIG_XPM_DECODER 0
+#define CONFIG_XWD_DECODER 0
+#define CONFIG_Y41P_DECODER 0
+#define CONFIG_YLC_DECODER 0
+#define CONFIG_YOP_DECODER 0
+#define CONFIG_YUV4_DECODER 0
+#define CONFIG_ZERO12V_DECODER 0
+#define CONFIG_ZEROCODEC_DECODER 0
+#define CONFIG_ZLIB_DECODER 0
+#define CONFIG_ZMBV_DECODER 0
+#define CONFIG_AAC_DECODER 1
+#define CONFIG_AAC_FIXED_DECODER 0
+#define CONFIG_AAC_LATM_DECODER 1
+#define CONFIG_AC3_DECODER 0
+#define CONFIG_AC3_FIXED_DECODER 0
+#define CONFIG_ACELP_KELVIN_DECODER 0
+#define CONFIG_ALAC_DECODER 0
+#define CONFIG_ALS_DECODER 0
+#define CONFIG_AMRNB_DECODER 1
+#define CONFIG_AMRWB_DECODER 1
+#define CONFIG_APE_DECODER 0
+#define CONFIG_APTX_DECODER 1
+#define CONFIG_APTX_HD_DECODER 0
+#define CONFIG_ATRAC1_DECODER 0
+#define CONFIG_ATRAC3_DECODER 0
+#define CONFIG_ATRAC3AL_DECODER 0
+#define CONFIG_ATRAC3P_DECODER 0
+#define CONFIG_ATRAC3PAL_DECODER 0
+#define CONFIG_ATRAC9_DECODER 0
+#define CONFIG_BINKAUDIO_DCT_DECODER 0
+#define CONFIG_BINKAUDIO_RDFT_DECODER 0
+#define CONFIG_BMV_AUDIO_DECODER 0
+#define CONFIG_COOK_DECODER 0
+#define CONFIG_DCA_DECODER 0
+#define CONFIG_DOLBY_E_DECODER 0
+#define CONFIG_DSD_LSBF_DECODER 0
+#define CONFIG_DSD_MSBF_DECODER 0
+#define CONFIG_DSD_LSBF_PLANAR_DECODER 0
+#define CONFIG_DSD_MSBF_PLANAR_DECODER 0
+#define CONFIG_DSICINAUDIO_DECODER 0
+#define CONFIG_DSS_SP_DECODER 0
+#define CONFIG_DST_DECODER 0
+#define CONFIG_EAC3_DECODER 0
+#define CONFIG_EVRC_DECODER 0
+#define CONFIG_FFWAVESYNTH_DECODER 0
+#define CONFIG_FLAC_DECODER 1
+#define CONFIG_G723_1_DECODER 0
+#define CONFIG_G729_DECODER 0
+#define CONFIG_GSM_DECODER 0
+#define CONFIG_GSM_MS_DECODER 1
+#define CONFIG_HCA_DECODER 0
+#define CONFIG_HCOM_DECODER 0
+#define CONFIG_IAC_DECODER 0
+#define CONFIG_ILBC_DECODER 0
+#define CONFIG_IMC_DECODER 0
+#define CONFIG_INTERPLAY_ACM_DECODER 0
+#define CONFIG_MACE3_DECODER 0
+#define CONFIG_MACE6_DECODER 0
+#define CONFIG_METASOUND_DECODER 0
+#define CONFIG_MLP_DECODER 0
+#define CONFIG_MP1_DECODER 0
+#define CONFIG_MP1FLOAT_DECODER 0
+#define CONFIG_MP2_DECODER 0
+#define CONFIG_MP2FLOAT_DECODER 0
+#define CONFIG_MP3FLOAT_DECODER 0
+#define CONFIG_MP3_DECODER 1
+#define CONFIG_MP3ADUFLOAT_DECODER 0
+#define CONFIG_MP3ADU_DECODER 0
+#define CONFIG_MP3ON4FLOAT_DECODER 0
+#define CONFIG_MP3ON4_DECODER 0
+#define CONFIG_MPC7_DECODER 0
+#define CONFIG_MPC8_DECODER 0
+#define CONFIG_NELLYMOSER_DECODER 0
+#define CONFIG_ON2AVC_DECODER 0
+#define CONFIG_OPUS_DECODER 0
+#define CONFIG_PAF_AUDIO_DECODER 0
+#define CONFIG_QCELP_DECODER 0
+#define CONFIG_QDM2_DECODER 0
+#define CONFIG_QDMC_DECODER 0
+#define CONFIG_RA_144_DECODER 0
+#define CONFIG_RA_288_DECODER 0
+#define CONFIG_RALF_DECODER 0
+#define CONFIG_SBC_DECODER 1
+#define CONFIG_SHORTEN_DECODER 0
+#define CONFIG_SIPR_DECODER 0
+#define CONFIG_SIREN_DECODER 0
+#define CONFIG_SMACKAUD_DECODER 0
+#define CONFIG_SONIC_DECODER 0
+#define CONFIG_TAK_DECODER 0
+#define CONFIG_TRUEHD_DECODER 0
+#define CONFIG_TRUESPEECH_DECODER 0
+#define CONFIG_TTA_DECODER 0
+#define CONFIG_TWINVQ_DECODER 0
+#define CONFIG_VMDAUDIO_DECODER 0
+#define CONFIG_VORBIS_DECODER 1
+#define CONFIG_WAVPACK_DECODER 0
+#define CONFIG_WMALOSSLESS_DECODER 0
+#define CONFIG_WMAPRO_DECODER 0
+#define CONFIG_WMAV1_DECODER 0
+#define CONFIG_WMAV2_DECODER 0
+#define CONFIG_WMAVOICE_DECODER 0
+#define CONFIG_WS_SND1_DECODER 0
+#define CONFIG_XMA1_DECODER 0
+#define CONFIG_XMA2_DECODER 0
+#define CONFIG_PCM_ALAW_DECODER 1
+#define CONFIG_PCM_BLURAY_DECODER 0
+#define CONFIG_PCM_DVD_DECODER 0
+#define CONFIG_PCM_F16LE_DECODER 0
+#define CONFIG_PCM_F24LE_DECODER 0
+#define CONFIG_PCM_F32BE_DECODER 0
+#define CONFIG_PCM_F32LE_DECODER 1
+#define CONFIG_PCM_F64BE_DECODER 0
+#define CONFIG_PCM_F64LE_DECODER 0
+#define CONFIG_PCM_LXF_DECODER 0
+#define CONFIG_PCM_MULAW_DECODER 1
+#define CONFIG_PCM_S8_DECODER 0
+#define CONFIG_PCM_S8_PLANAR_DECODER 0
+#define CONFIG_PCM_S16BE_DECODER 1
+#define CONFIG_PCM_S16BE_PLANAR_DECODER 0
+#define CONFIG_PCM_S16LE_DECODER 1
+#define CONFIG_PCM_S16LE_PLANAR_DECODER 0
+#define CONFIG_PCM_S24BE_DECODER 1
+#define CONFIG_PCM_S24DAUD_DECODER 0
+#define CONFIG_PCM_S24LE_DECODER 1
+#define CONFIG_PCM_S24LE_PLANAR_DECODER 0
+#define CONFIG_PCM_S32BE_DECODER 0
+#define CONFIG_PCM_S32LE_DECODER 1
+#define CONFIG_PCM_S32LE_PLANAR_DECODER 0
+#define CONFIG_PCM_S64BE_DECODER 0
+#define CONFIG_PCM_S64LE_DECODER 0
+#define CONFIG_PCM_U8_DECODER 1
+#define CONFIG_PCM_U16BE_DECODER 0
+#define CONFIG_PCM_U16LE_DECODER 0
+#define CONFIG_PCM_U24BE_DECODER 0
+#define CONFIG_PCM_U24LE_DECODER 0
+#define CONFIG_PCM_U32BE_DECODER 0
+#define CONFIG_PCM_U32LE_DECODER 0
+#define CONFIG_PCM_VIDC_DECODER 0
+#define CONFIG_DERF_DPCM_DECODER 0
+#define CONFIG_GREMLIN_DPCM_DECODER 0
+#define CONFIG_INTERPLAY_DPCM_DECODER 0
+#define CONFIG_ROQ_DPCM_DECODER 0
+#define CONFIG_SDX2_DPCM_DECODER 0
+#define CONFIG_SOL_DPCM_DECODER 0
+#define CONFIG_XAN_DPCM_DECODER 0
+#define CONFIG_ADPCM_4XM_DECODER 0
+#define CONFIG_ADPCM_ADX_DECODER 0
+#define CONFIG_ADPCM_AFC_DECODER 0
+#define CONFIG_ADPCM_AGM_DECODER 0
+#define CONFIG_ADPCM_AICA_DECODER 0
+#define CONFIG_ADPCM_ARGO_DECODER 0
+#define CONFIG_ADPCM_CT_DECODER 0
+#define CONFIG_ADPCM_DTK_DECODER 0
+#define CONFIG_ADPCM_EA_DECODER 0
+#define CONFIG_ADPCM_EA_MAXIS_XA_DECODER 0
+#define CONFIG_ADPCM_EA_R1_DECODER 0
+#define CONFIG_ADPCM_EA_R2_DECODER 0
+#define CONFIG_ADPCM_EA_R3_DECODER 0
+#define CONFIG_ADPCM_EA_XAS_DECODER 0
+#define CONFIG_ADPCM_G722_DECODER 0
+#define CONFIG_ADPCM_G726_DECODER 0
+#define CONFIG_ADPCM_G726LE_DECODER 0
+#define CONFIG_ADPCM_IMA_AMV_DECODER 0
+#define CONFIG_ADPCM_IMA_ALP_DECODER 0
+#define CONFIG_ADPCM_IMA_APC_DECODER 0
+#define CONFIG_ADPCM_IMA_APM_DECODER 0
+#define CONFIG_ADPCM_IMA_DAT4_DECODER 0
+#define CONFIG_ADPCM_IMA_DK3_DECODER 0
+#define CONFIG_ADPCM_IMA_DK4_DECODER 0
+#define CONFIG_ADPCM_IMA_EA_EACS_DECODER 0
+#define CONFIG_ADPCM_IMA_EA_SEAD_DECODER 0
+#define CONFIG_ADPCM_IMA_ISS_DECODER 0
+#define CONFIG_ADPCM_IMA_MTF_DECODER 0
+#define CONFIG_ADPCM_IMA_OKI_DECODER 0
+#define CONFIG_ADPCM_IMA_QT_DECODER 0
+#define CONFIG_ADPCM_IMA_RAD_DECODER 0
+#define CONFIG_ADPCM_IMA_SSI_DECODER 0
+#define CONFIG_ADPCM_IMA_SMJPEG_DECODER 0
+#define CONFIG_ADPCM_IMA_WAV_DECODER 0
+#define CONFIG_ADPCM_IMA_WS_DECODER 0
+#define CONFIG_ADPCM_MS_DECODER 0
+#define CONFIG_ADPCM_MTAF_DECODER 0
+#define CONFIG_ADPCM_PSX_DECODER 0
+#define CONFIG_ADPCM_SBPRO_2_DECODER 0
+#define CONFIG_ADPCM_SBPRO_3_DECODER 0
+#define CONFIG_ADPCM_SBPRO_4_DECODER 0
+#define CONFIG_ADPCM_SWF_DECODER 0
+#define CONFIG_ADPCM_THP_DECODER 0
+#define CONFIG_ADPCM_THP_LE_DECODER 0
+#define CONFIG_ADPCM_VIMA_DECODER 0
+#define CONFIG_ADPCM_XA_DECODER 0
+#define CONFIG_ADPCM_YAMAHA_DECODER 0
+#define CONFIG_ADPCM_ZORK_DECODER 0
+#define CONFIG_SSA_DECODER 0
+#define CONFIG_ASS_DECODER 0
+#define CONFIG_CCAPTION_DECODER 0
+#define CONFIG_DVBSUB_DECODER 0
+#define CONFIG_DVDSUB_DECODER 0
+#define CONFIG_JACOSUB_DECODER 0
+#define CONFIG_MICRODVD_DECODER 0
+#define CONFIG_MOVTEXT_DECODER 0
+#define CONFIG_MPL2_DECODER 0
+#define CONFIG_PGSSUB_DECODER 0
+#define CONFIG_PJS_DECODER 0
+#define CONFIG_REALTEXT_DECODER 0
+#define CONFIG_SAMI_DECODER 0
+#define CONFIG_SRT_DECODER 0
+#define CONFIG_STL_DECODER 0
+#define CONFIG_SUBRIP_DECODER 0
+#define CONFIG_SUBVIEWER_DECODER 0
+#define CONFIG_SUBVIEWER1_DECODER 0
+#define CONFIG_TEXT_DECODER 0
+#define CONFIG_VPLAYER_DECODER 0
+#define CONFIG_WEBVTT_DECODER 0
+#define CONFIG_XSUB_DECODER 0
+#define CONFIG_AAC_AT_DECODER 0
+#define CONFIG_AC3_AT_DECODER 0
+#define CONFIG_ADPCM_IMA_QT_AT_DECODER 0
+#define CONFIG_ALAC_AT_DECODER 0
+#define CONFIG_AMR_NB_AT_DECODER 0
+#define CONFIG_EAC3_AT_DECODER 0
+#define CONFIG_GSM_MS_AT_DECODER 0
+#define CONFIG_ILBC_AT_DECODER 0
+#define CONFIG_MP1_AT_DECODER 0
+#define CONFIG_MP2_AT_DECODER 0
+#define CONFIG_MP3_AT_DECODER 0
+#define CONFIG_PCM_ALAW_AT_DECODER 0
+#define CONFIG_PCM_MULAW_AT_DECODER 0
+#define CONFIG_QDMC_AT_DECODER 0
+#define CONFIG_QDM2_AT_DECODER 0
+#define CONFIG_LIBARIBB24_DECODER 0
+#define CONFIG_LIBCELT_DECODER 0
+#define CONFIG_LIBCODEC2_DECODER 0
+#define CONFIG_LIBDAV1D_DECODER 0
+#define CONFIG_LIBDAVS2_DECODER 0
+#define CONFIG_LIBFDK_AAC_DECODER 0
+#define CONFIG_LIBGSM_DECODER 0
+#define CONFIG_LIBGSM_MS_DECODER 0
+#define CONFIG_LIBILBC_DECODER 0
+#define CONFIG_LIBOPENCORE_AMRNB_DECODER 0
+#define CONFIG_LIBOPENCORE_AMRWB_DECODER 0
+#define CONFIG_LIBOPENJPEG_DECODER 0
+#define CONFIG_LIBOPUS_DECODER 1
+#define CONFIG_LIBRSVG_DECODER 0
+#define CONFIG_LIBSPEEX_DECODER 0
+#define CONFIG_LIBVORBIS_DECODER 0
+#define CONFIG_LIBVPX_VP8_DECODER 0
+#define CONFIG_LIBVPX_VP9_DECODER 0
+#define CONFIG_LIBZVBI_TELETEXT_DECODER 0
+#define CONFIG_BINTEXT_DECODER 0
+#define CONFIG_XBIN_DECODER 0
+#define CONFIG_IDF_DECODER 0
+#define CONFIG_LIBAOM_AV1_DECODER 0
+#define CONFIG_LIBOPENH264_DECODER 0
+#define CONFIG_H264_CUVID_DECODER 0
+#define CONFIG_HEVC_CUVID_DECODER 0
+#define CONFIG_HEVC_MEDIACODEC_DECODER 0
+#define CONFIG_MJPEG_CUVID_DECODER 0
+#define CONFIG_MJPEG_QSV_DECODER 0
+#define CONFIG_MPEG1_CUVID_DECODER 0
+#define CONFIG_MPEG2_CUVID_DECODER 0
+#define CONFIG_MPEG4_CUVID_DECODER 0
+#define CONFIG_MPEG4_MEDIACODEC_DECODER 0
+#define CONFIG_VC1_CUVID_DECODER 0
+#define CONFIG_VP8_CUVID_DECODER 0
+#define CONFIG_VP8_MEDIACODEC_DECODER 0
+#define CONFIG_VP8_QSV_DECODER 0
+#define CONFIG_VP9_CUVID_DECODER 0
+#define CONFIG_VP9_MEDIACODEC_DECODER 0
+#define CONFIG_VP9_QSV_DECODER 0
+#define CONFIG_A64MULTI_ENCODER 0
+#define CONFIG_A64MULTI5_ENCODER 0
+#define CONFIG_ALIAS_PIX_ENCODER 0
+#define CONFIG_AMV_ENCODER 0
+#define CONFIG_APNG_ENCODER 0
+#define CONFIG_ASV1_ENCODER 0
+#define CONFIG_ASV2_ENCODER 0
+#define CONFIG_AVRP_ENCODER 0
+#define CONFIG_AVUI_ENCODER 0
+#define CONFIG_AYUV_ENCODER 0
+#define CONFIG_BMP_ENCODER 0
+#define CONFIG_CINEPAK_ENCODER 0
+#define CONFIG_CLJR_ENCODER 0
+#define CONFIG_COMFORTNOISE_ENCODER 0
+#define CONFIG_DNXHD_ENCODER 0
+#define CONFIG_DPX_ENCODER 0
+#define CONFIG_DVVIDEO_ENCODER 0
+#define CONFIG_FFV1_ENCODER 0
+#define CONFIG_FFVHUFF_ENCODER 0
+#define CONFIG_FITS_ENCODER 0
+#define CONFIG_FLASHSV_ENCODER 0
+#define CONFIG_FLASHSV2_ENCODER 0
+#define CONFIG_FLV_ENCODER 0
+#define CONFIG_GIF_ENCODER 0
+#define CONFIG_H261_ENCODER 0
+#define CONFIG_H263_ENCODER 0
+#define CONFIG_H263P_ENCODER 0
+#define CONFIG_HAP_ENCODER 0
+#define CONFIG_HUFFYUV_ENCODER 0
+#define CONFIG_JPEG2000_ENCODER 0
+#define CONFIG_JPEGLS_ENCODER 0
+#define CONFIG_LJPEG_ENCODER 0
+#define CONFIG_MAGICYUV_ENCODER 0
+#define CONFIG_MJPEG_ENCODER 0
+#define CONFIG_MPEG1VIDEO_ENCODER 0
+#define CONFIG_MPEG2VIDEO_ENCODER 0
+#define CONFIG_MPEG4_ENCODER 0
+#define CONFIG_MSMPEG4V2_ENCODER 0
+#define CONFIG_MSMPEG4V3_ENCODER 0
+#define CONFIG_MSVIDEO1_ENCODER 0
+#define CONFIG_PAM_ENCODER 0
+#define CONFIG_PBM_ENCODER 0
+#define CONFIG_PCX_ENCODER 0
+#define CONFIG_PGM_ENCODER 0
+#define CONFIG_PGMYUV_ENCODER 0
+#define CONFIG_PNG_ENCODER 0
+#define CONFIG_PPM_ENCODER 0
+#define CONFIG_PRORES_ENCODER 0
+#define CONFIG_PRORES_AW_ENCODER 0
+#define CONFIG_PRORES_KS_ENCODER 0
+#define CONFIG_QTRLE_ENCODER 0
+#define CONFIG_R10K_ENCODER 0
+#define CONFIG_R210_ENCODER 0
+#define CONFIG_RAWVIDEO_ENCODER 0
+#define CONFIG_ROQ_ENCODER 0
+#define CONFIG_RV10_ENCODER 0
+#define CONFIG_RV20_ENCODER 0
+#define CONFIG_S302M_ENCODER 0
+#define CONFIG_SGI_ENCODER 0
+#define CONFIG_SNOW_ENCODER 0
+#define CONFIG_SUNRAST_ENCODER 0
+#define CONFIG_SVQ1_ENCODER 0
+#define CONFIG_TARGA_ENCODER 0
+#define CONFIG_TIFF_ENCODER 0
+#define CONFIG_UTVIDEO_ENCODER 0
+#define CONFIG_V210_ENCODER 0
+#define CONFIG_V308_ENCODER 0
+#define CONFIG_V408_ENCODER 0
+#define CONFIG_V410_ENCODER 0
+#define CONFIG_VC2_ENCODER 0
+#define CONFIG_WRAPPED_AVFRAME_ENCODER 0
+#define CONFIG_WMV1_ENCODER 0
+#define CONFIG_WMV2_ENCODER 0
+#define CONFIG_XBM_ENCODER 0
+#define CONFIG_XFACE_ENCODER 0
+#define CONFIG_XWD_ENCODER 0
+#define CONFIG_Y41P_ENCODER 0
+#define CONFIG_YUV4_ENCODER 0
+#define CONFIG_ZLIB_ENCODER 0
+#define CONFIG_ZMBV_ENCODER 0
+#define CONFIG_AAC_ENCODER 0
+#define CONFIG_AC3_ENCODER 0
+#define CONFIG_AC3_FIXED_ENCODER 0
+#define CONFIG_ALAC_ENCODER 0
+#define CONFIG_APTX_ENCODER 0
+#define CONFIG_APTX_HD_ENCODER 0
+#define CONFIG_DCA_ENCODER 0
+#define CONFIG_EAC3_ENCODER 0
+#define CONFIG_FLAC_ENCODER 0
+#define CONFIG_G723_1_ENCODER 0
+#define CONFIG_MLP_ENCODER 0
+#define CONFIG_MP2_ENCODER 0
+#define CONFIG_MP2FIXED_ENCODER 0
+#define CONFIG_NELLYMOSER_ENCODER 0
+#define CONFIG_OPUS_ENCODER 0
+#define CONFIG_RA_144_ENCODER 0
+#define CONFIG_SBC_ENCODER 0
+#define CONFIG_SONIC_ENCODER 0
+#define CONFIG_SONIC_LS_ENCODER 0
+#define CONFIG_TRUEHD_ENCODER 0
+#define CONFIG_TTA_ENCODER 0
+#define CONFIG_VORBIS_ENCODER 0
+#define CONFIG_WAVPACK_ENCODER 0
+#define CONFIG_WMAV1_ENCODER 0
+#define CONFIG_WMAV2_ENCODER 0
+#define CONFIG_PCM_ALAW_ENCODER 0
+#define CONFIG_PCM_DVD_ENCODER 0
+#define CONFIG_PCM_F32BE_ENCODER 0
+#define CONFIG_PCM_F32LE_ENCODER 0
+#define CONFIG_PCM_F64BE_ENCODER 0
+#define CONFIG_PCM_F64LE_ENCODER 0
+#define CONFIG_PCM_MULAW_ENCODER 0
+#define CONFIG_PCM_S8_ENCODER 0
+#define CONFIG_PCM_S8_PLANAR_ENCODER 0
+#define CONFIG_PCM_S16BE_ENCODER 0
+#define CONFIG_PCM_S16BE_PLANAR_ENCODER 0
+#define CONFIG_PCM_S16LE_ENCODER 0
+#define CONFIG_PCM_S16LE_PLANAR_ENCODER 0
+#define CONFIG_PCM_S24BE_ENCODER 0
+#define CONFIG_PCM_S24DAUD_ENCODER 0
+#define CONFIG_PCM_S24LE_ENCODER 0
+#define CONFIG_PCM_S24LE_PLANAR_ENCODER 0
+#define CONFIG_PCM_S32BE_ENCODER 0
+#define CONFIG_PCM_S32LE_ENCODER 0
+#define CONFIG_PCM_S32LE_PLANAR_ENCODER 0
+#define CONFIG_PCM_S64BE_ENCODER 0
+#define CONFIG_PCM_S64LE_ENCODER 0
+#define CONFIG_PCM_U8_ENCODER 0
+#define CONFIG_PCM_U16BE_ENCODER 0
+#define CONFIG_PCM_U16LE_ENCODER 0
+#define CONFIG_PCM_U24BE_ENCODER 0
+#define CONFIG_PCM_U24LE_ENCODER 0
+#define CONFIG_PCM_U32BE_ENCODER 0
+#define CONFIG_PCM_U32LE_ENCODER 0
+#define CONFIG_PCM_VIDC_ENCODER 0
+#define CONFIG_ROQ_DPCM_ENCODER 0
+#define CONFIG_ADPCM_ADX_ENCODER 0
+#define CONFIG_ADPCM_G722_ENCODER 0
+#define CONFIG_ADPCM_G726_ENCODER 0
+#define CONFIG_ADPCM_G726LE_ENCODER 0
+#define CONFIG_ADPCM_IMA_QT_ENCODER 0
+#define CONFIG_ADPCM_IMA_WAV_ENCODER 0
+#define CONFIG_ADPCM_MS_ENCODER 0
+#define CONFIG_ADPCM_SWF_ENCODER 0
+#define CONFIG_ADPCM_YAMAHA_ENCODER 0
+#define CONFIG_SSA_ENCODER 0
+#define CONFIG_ASS_ENCODER 0
+#define CONFIG_DVBSUB_ENCODER 0
+#define CONFIG_DVDSUB_ENCODER 0
+#define CONFIG_MOVTEXT_ENCODER 0
+#define CONFIG_SRT_ENCODER 0
+#define CONFIG_SUBRIP_ENCODER 0
+#define CONFIG_TEXT_ENCODER 0
+#define CONFIG_WEBVTT_ENCODER 0
+#define CONFIG_XSUB_ENCODER 0
+#define CONFIG_AAC_AT_ENCODER 0
+#define CONFIG_ALAC_AT_ENCODER 0
+#define CONFIG_ILBC_AT_ENCODER 0
+#define CONFIG_PCM_ALAW_AT_ENCODER 0
+#define CONFIG_PCM_MULAW_AT_ENCODER 0
+#define CONFIG_LIBAOM_AV1_ENCODER 0
+#define CONFIG_LIBCODEC2_ENCODER 0
+#define CONFIG_LIBFDK_AAC_ENCODER 0
+#define CONFIG_LIBGSM_ENCODER 0
+#define CONFIG_LIBGSM_MS_ENCODER 0
+#define CONFIG_LIBILBC_ENCODER 0
+#define CONFIG_LIBMP3LAME_ENCODER 0
+#define CONFIG_LIBOPENCORE_AMRNB_ENCODER 0
+#define CONFIG_LIBOPENJPEG_ENCODER 0
+#define CONFIG_LIBOPUS_ENCODER 0
+#define CONFIG_LIBRAV1E_ENCODER 0
+#define CONFIG_LIBSHINE_ENCODER 0
+#define CONFIG_LIBSPEEX_ENCODER 0
+#define CONFIG_LIBTHEORA_ENCODER 0
+#define CONFIG_LIBTWOLAME_ENCODER 0
+#define CONFIG_LIBVO_AMRWBENC_ENCODER 0
+#define CONFIG_LIBVORBIS_ENCODER 0
+#define CONFIG_LIBVPX_VP8_ENCODER 0
+#define CONFIG_LIBVPX_VP9_ENCODER 0
+#define CONFIG_LIBWAVPACK_ENCODER 0
+#define CONFIG_LIBWEBP_ANIM_ENCODER 0
+#define CONFIG_LIBWEBP_ENCODER 0
+#define CONFIG_LIBX262_ENCODER 0
+#define CONFIG_LIBX264_ENCODER 0
+#define CONFIG_LIBX264RGB_ENCODER 0
+#define CONFIG_LIBX265_ENCODER 0
+#define CONFIG_LIBXAVS_ENCODER 0
+#define CONFIG_LIBXAVS2_ENCODER 0
+#define CONFIG_LIBXVID_ENCODER 0
+#define CONFIG_H263_V4L2M2M_ENCODER 0
+#define CONFIG_LIBOPENH264_ENCODER 0
+#define CONFIG_H264_AMF_ENCODER 0
+#define CONFIG_H264_NVENC_ENCODER 0
+#define CONFIG_H264_OMX_ENCODER 0
+#define CONFIG_H264_QSV_ENCODER 0
+#define CONFIG_H264_V4L2M2M_ENCODER 0
+#define CONFIG_H264_VAAPI_ENCODER 0
+#define CONFIG_H264_VIDEOTOOLBOX_ENCODER 0
+#define CONFIG_NVENC_ENCODER 0
+#define CONFIG_NVENC_H264_ENCODER 0
+#define CONFIG_NVENC_HEVC_ENCODER 0
+#define CONFIG_HEVC_AMF_ENCODER 0
+#define CONFIG_HEVC_NVENC_ENCODER 0
+#define CONFIG_HEVC_QSV_ENCODER 0
+#define CONFIG_HEVC_V4L2M2M_ENCODER 0
+#define CONFIG_HEVC_VAAPI_ENCODER 0
+#define CONFIG_HEVC_VIDEOTOOLBOX_ENCODER 0
+#define CONFIG_LIBKVAZAAR_ENCODER 0
+#define CONFIG_MJPEG_QSV_ENCODER 0
+#define CONFIG_MJPEG_VAAPI_ENCODER 0
+#define CONFIG_MPEG2_QSV_ENCODER 0
+#define CONFIG_MPEG2_VAAPI_ENCODER 0
+#define CONFIG_MPEG4_OMX_ENCODER 0
+#define CONFIG_MPEG4_V4L2M2M_ENCODER 0
+#define CONFIG_VP8_V4L2M2M_ENCODER 0
+#define CONFIG_VP8_VAAPI_ENCODER 0
+#define CONFIG_VP9_VAAPI_ENCODER 0
+#define CONFIG_VP9_QSV_ENCODER 0
+#define CONFIG_H263_VAAPI_HWACCEL 0
+#define CONFIG_H263_VIDEOTOOLBOX_HWACCEL 0
+#define CONFIG_H264_D3D11VA_HWACCEL 0
+#define CONFIG_H264_D3D11VA2_HWACCEL 0
+#define CONFIG_H264_DXVA2_HWACCEL 0
+#define CONFIG_H264_NVDEC_HWACCEL 0
+#define CONFIG_H264_VAAPI_HWACCEL 0
+#define CONFIG_H264_VDPAU_HWACCEL 0
+#define CONFIG_H264_VIDEOTOOLBOX_HWACCEL 0
+#define CONFIG_HEVC_D3D11VA_HWACCEL 0
+#define CONFIG_HEVC_D3D11VA2_HWACCEL 0
+#define CONFIG_HEVC_DXVA2_HWACCEL 0
+#define CONFIG_HEVC_NVDEC_HWACCEL 0
+#define CONFIG_HEVC_VAAPI_HWACCEL 0
+#define CONFIG_HEVC_VDPAU_HWACCEL 0
+#define CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL 0
+#define CONFIG_MJPEG_NVDEC_HWACCEL 0
+#define CONFIG_MJPEG_VAAPI_HWACCEL 0
+#define CONFIG_MPEG1_NVDEC_HWACCEL 0
+#define CONFIG_MPEG1_VDPAU_HWACCEL 0
+#define CONFIG_MPEG1_VIDEOTOOLBOX_HWACCEL 0
+#define CONFIG_MPEG1_XVMC_HWACCEL 0
+#define CONFIG_MPEG2_D3D11VA_HWACCEL 0
+#define CONFIG_MPEG2_D3D11VA2_HWACCEL 0
+#define CONFIG_MPEG2_NVDEC_HWACCEL 0
+#define CONFIG_MPEG2_DXVA2_HWACCEL 0
+#define CONFIG_MPEG2_VAAPI_HWACCEL 0
+#define CONFIG_MPEG2_VDPAU_HWACCEL 0
+#define CONFIG_MPEG2_VIDEOTOOLBOX_HWACCEL 0
+#define CONFIG_MPEG2_XVMC_HWACCEL 0
+#define CONFIG_MPEG4_NVDEC_HWACCEL 0
+#define CONFIG_MPEG4_VAAPI_HWACCEL 0
+#define CONFIG_MPEG4_VDPAU_HWACCEL 0
+#define CONFIG_MPEG4_VIDEOTOOLBOX_HWACCEL 0
+#define CONFIG_VC1_D3D11VA_HWACCEL 0
+#define CONFIG_VC1_D3D11VA2_HWACCEL 0
+#define CONFIG_VC1_DXVA2_HWACCEL 0
+#define CONFIG_VC1_NVDEC_HWACCEL 0
+#define CONFIG_VC1_VAAPI_HWACCEL 0
+#define CONFIG_VC1_VDPAU_HWACCEL 0
+#define CONFIG_VP8_NVDEC_HWACCEL 0
+#define CONFIG_VP8_VAAPI_HWACCEL 0
+#define CONFIG_VP9_D3D11VA_HWACCEL 0
+#define CONFIG_VP9_D3D11VA2_HWACCEL 0
+#define CONFIG_VP9_DXVA2_HWACCEL 0
+#define CONFIG_VP9_NVDEC_HWACCEL 0
+#define CONFIG_VP9_VAAPI_HWACCEL 0
+#define CONFIG_VP9_VDPAU_HWACCEL 0
+#define CONFIG_WMV3_D3D11VA_HWACCEL 0
+#define CONFIG_WMV3_D3D11VA2_HWACCEL 0
+#define CONFIG_WMV3_DXVA2_HWACCEL 0
+#define CONFIG_WMV3_NVDEC_HWACCEL 0
+#define CONFIG_WMV3_VAAPI_HWACCEL 0
+#define CONFIG_WMV3_VDPAU_HWACCEL 0
+#define CONFIG_AAC_PARSER 1
+#define CONFIG_AAC_LATM_PARSER 1
+#define CONFIG_AC3_PARSER 0
+#define CONFIG_ADX_PARSER 0
+#define CONFIG_AV1_PARSER 0
+#define CONFIG_AVS2_PARSER 0
+#define CONFIG_BMP_PARSER 0
+#define CONFIG_CAVSVIDEO_PARSER 0
+#define CONFIG_COOK_PARSER 0
+#define CONFIG_DCA_PARSER 0
+#define CONFIG_DIRAC_PARSER 0
+#define CONFIG_DNXHD_PARSER 0
+#define CONFIG_DPX_PARSER 0
+#define CONFIG_DVAUDIO_PARSER 0
+#define CONFIG_DVBSUB_PARSER 0
+#define CONFIG_DVDSUB_PARSER 0
+#define CONFIG_DVD_NAV_PARSER 0
+#define CONFIG_FLAC_PARSER 1
+#define CONFIG_G723_1_PARSER 0
+#define CONFIG_G729_PARSER 0
+#define CONFIG_GIF_PARSER 0
+#define CONFIG_GSM_PARSER 1
+#define CONFIG_H261_PARSER 0
+#define CONFIG_H263_PARSER 1
+#define CONFIG_H264_PARSER 1
+#define CONFIG_HEVC_PARSER 0
+#define CONFIG_MJPEG_PARSER 0
+#define CONFIG_MLP_PARSER 0
+#define CONFIG_MPEG4VIDEO_PARSER 1
+#define CONFIG_MPEGAUDIO_PARSER 1
+#define CONFIG_MPEGVIDEO_PARSER 0
+#define CONFIG_OPUS_PARSER 1
+#define CONFIG_PNG_PARSER 0
+#define CONFIG_PNM_PARSER 0
+#define CONFIG_RV30_PARSER 0
+#define CONFIG_RV40_PARSER 0
+#define CONFIG_SBC_PARSER 0
+#define CONFIG_SIPR_PARSER 0
+#define CONFIG_TAK_PARSER 0
+#define CONFIG_VC1_PARSER 0
+#define CONFIG_VORBIS_PARSER 1
+#define CONFIG_VP3_PARSER 1
+#define CONFIG_VP8_PARSER 1
+#define CONFIG_VP9_PARSER 0
+#define CONFIG_WEBP_PARSER 0
+#define CONFIG_XMA_PARSER 0
+#define CONFIG_ALSA_INDEV 0
+#define CONFIG_ANDROID_CAMERA_INDEV 0
+#define CONFIG_AVFOUNDATION_INDEV 0
+#define CONFIG_BKTR_INDEV 0
+#define CONFIG_DECKLINK_INDEV 0
+#define CONFIG_DSHOW_INDEV 0
+#define CONFIG_FBDEV_INDEV 0
+#define CONFIG_GDIGRAB_INDEV 0
+#define CONFIG_IEC61883_INDEV 0
+#define CONFIG_JACK_INDEV 0
+#define CONFIG_KMSGRAB_INDEV 0
+#define CONFIG_LAVFI_INDEV 0
+#define CONFIG_OPENAL_INDEV 0
+#define CONFIG_OSS_INDEV 0
+#define CONFIG_PULSE_INDEV 0
+#define CONFIG_SNDIO_INDEV 0
+#define CONFIG_V4L2_INDEV 0
+#define CONFIG_VFWCAP_INDEV 0
+#define CONFIG_XCBGRAB_INDEV 0
+#define CONFIG_LIBCDIO_INDEV 0
+#define CONFIG_LIBDC1394_INDEV 0
+#define CONFIG_ALSA_OUTDEV 0
+#define CONFIG_CACA_OUTDEV 0
+#define CONFIG_DECKLINK_OUTDEV 0
+#define CONFIG_FBDEV_OUTDEV 0
+#define CONFIG_OPENGL_OUTDEV 0
+#define CONFIG_OSS_OUTDEV 0
+#define CONFIG_PULSE_OUTDEV 0
+#define CONFIG_SDL2_OUTDEV 0
+#define CONFIG_SNDIO_OUTDEV 0
+#define CONFIG_V4L2_OUTDEV 0
+#define CONFIG_XV_OUTDEV 0
+#define CONFIG_ABENCH_FILTER 0
+#define CONFIG_ACOMPRESSOR_FILTER 0
+#define CONFIG_ACONTRAST_FILTER 0
+#define CONFIG_ACOPY_FILTER 0
+#define CONFIG_ACUE_FILTER 0
+#define CONFIG_ACROSSFADE_FILTER 0
+#define CONFIG_ACROSSOVER_FILTER 0
+#define CONFIG_ACRUSHER_FILTER 0
+#define CONFIG_ADECLICK_FILTER 0
+#define CONFIG_ADECLIP_FILTER 0
+#define CONFIG_ADELAY_FILTER 0
+#define CONFIG_ADERIVATIVE_FILTER 0
+#define CONFIG_AECHO_FILTER 0
+#define CONFIG_AEMPHASIS_FILTER 0
+#define CONFIG_AEVAL_FILTER 0
+#define CONFIG_AFADE_FILTER 0
+#define CONFIG_AFFTDN_FILTER 0
+#define CONFIG_AFFTFILT_FILTER 0
+#define CONFIG_AFIR_FILTER 0
+#define CONFIG_AFORMAT_FILTER 0
+#define CONFIG_AGATE_FILTER 0
+#define CONFIG_AIIR_FILTER 0
+#define CONFIG_AINTEGRAL_FILTER 0
+#define CONFIG_AINTERLEAVE_FILTER 0
+#define CONFIG_ALIMITER_FILTER 0
+#define CONFIG_ALLPASS_FILTER 0
+#define CONFIG_ALOOP_FILTER 0
+#define CONFIG_AMERGE_FILTER 0
+#define CONFIG_AMETADATA_FILTER 0
+#define CONFIG_AMIX_FILTER 0
+#define CONFIG_AMULTIPLY_FILTER 0
+#define CONFIG_ANEQUALIZER_FILTER 0
+#define CONFIG_ANLMDN_FILTER 0
+#define CONFIG_ANLMS_FILTER 0
+#define CONFIG_ANULL_FILTER 0
+#define CONFIG_APAD_FILTER 0
+#define CONFIG_APERMS_FILTER 0
+#define CONFIG_APHASER_FILTER 0
+#define CONFIG_APULSATOR_FILTER 0
+#define CONFIG_AREALTIME_FILTER 0
+#define CONFIG_ARESAMPLE_FILTER 0
+#define CONFIG_AREVERSE_FILTER 0
+#define CONFIG_ARNNDN_FILTER 0
+#define CONFIG_ASELECT_FILTER 0
+#define CONFIG_ASENDCMD_FILTER 0
+#define CONFIG_ASETNSAMPLES_FILTER 0
+#define CONFIG_ASETPTS_FILTER 0
+#define CONFIG_ASETRATE_FILTER 0
+#define CONFIG_ASETTB_FILTER 0
+#define CONFIG_ASHOWINFO_FILTER 0
+#define CONFIG_ASIDEDATA_FILTER 0
+#define CONFIG_ASOFTCLIP_FILTER 0
+#define CONFIG_ASPLIT_FILTER 0
+#define CONFIG_ASR_FILTER 0
+#define CONFIG_ASTATS_FILTER 0
+#define CONFIG_ASTREAMSELECT_FILTER 0
+#define CONFIG_ATEMPO_FILTER 0
+#define CONFIG_ATRIM_FILTER 0
+#define CONFIG_AXCORRELATE_FILTER 0
+#define CONFIG_AZMQ_FILTER 0
+#define CONFIG_BANDPASS_FILTER 0
+#define CONFIG_BANDREJECT_FILTER 0
+#define CONFIG_BASS_FILTER 0
+#define CONFIG_BIQUAD_FILTER 0
+#define CONFIG_BS2B_FILTER 0
+#define CONFIG_CHROMABER_VULKAN_FILTER 0
+#define CONFIG_CHANNELMAP_FILTER 0
+#define CONFIG_CHANNELSPLIT_FILTER 0
+#define CONFIG_CHORUS_FILTER 0
+#define CONFIG_COMPAND_FILTER 0
+#define CONFIG_COMPENSATIONDELAY_FILTER 0
+#define CONFIG_CROSSFEED_FILTER 0
+#define CONFIG_CRYSTALIZER_FILTER 0
+#define CONFIG_DCSHIFT_FILTER 0
+#define CONFIG_DEESSER_FILTER 0
+#define CONFIG_DRMETER_FILTER 0
+#define CONFIG_DYNAUDNORM_FILTER 0
+#define CONFIG_EARWAX_FILTER 0
+#define CONFIG_EBUR128_FILTER 0
+#define CONFIG_EQUALIZER_FILTER 0
+#define CONFIG_EXTRASTEREO_FILTER 0
+#define CONFIG_FIREQUALIZER_FILTER 0
+#define CONFIG_FLANGER_FILTER 0
+#define CONFIG_HAAS_FILTER 0
+#define CONFIG_HDCD_FILTER 0
+#define CONFIG_HEADPHONE_FILTER 0
+#define CONFIG_HIGHPASS_FILTER 0
+#define CONFIG_HIGHSHELF_FILTER 0
+#define CONFIG_JOIN_FILTER 0
+#define CONFIG_LADSPA_FILTER 0
+#define CONFIG_LOUDNORM_FILTER 0
+#define CONFIG_LOWPASS_FILTER 0
+#define CONFIG_LOWSHELF_FILTER 0
+#define CONFIG_LV2_FILTER 0
+#define CONFIG_MCOMPAND_FILTER 0
+#define CONFIG_PAN_FILTER 0
+#define CONFIG_REPLAYGAIN_FILTER 0
+#define CONFIG_RESAMPLE_FILTER 0
+#define CONFIG_RUBBERBAND_FILTER 0
+#define CONFIG_SIDECHAINCOMPRESS_FILTER 0
+#define CONFIG_SIDECHAINGATE_FILTER 0
+#define CONFIG_SILENCEDETECT_FILTER 0
+#define CONFIG_SILENCEREMOVE_FILTER 0
+#define CONFIG_SOFALIZER_FILTER 0
+#define CONFIG_STEREOTOOLS_FILTER 0
+#define CONFIG_STEREOWIDEN_FILTER 0
+#define CONFIG_SUPEREQUALIZER_FILTER 0
+#define CONFIG_SURROUND_FILTER 0
+#define CONFIG_TREBLE_FILTER 0
+#define CONFIG_TREMOLO_FILTER 0
+#define CONFIG_VIBRATO_FILTER 0
+#define CONFIG_VOLUME_FILTER 0
+#define CONFIG_VOLUMEDETECT_FILTER 0
+#define CONFIG_AEVALSRC_FILTER 0
+#define CONFIG_AFIRSRC_FILTER 0
+#define CONFIG_ANOISESRC_FILTER 0
+#define CONFIG_ANULLSRC_FILTER 0
+#define CONFIG_FLITE_FILTER 0
+#define CONFIG_HILBERT_FILTER 0
+#define CONFIG_SINC_FILTER 0
+#define CONFIG_SINE_FILTER 0
+#define CONFIG_ANULLSINK_FILTER 0
+#define CONFIG_ADDROI_FILTER 0
+#define CONFIG_ALPHAEXTRACT_FILTER 0
+#define CONFIG_ALPHAMERGE_FILTER 0
+#define CONFIG_AMPLIFY_FILTER 0
+#define CONFIG_ASS_FILTER 0
+#define CONFIG_ATADENOISE_FILTER 0
+#define CONFIG_AVGBLUR_FILTER 0
+#define CONFIG_AVGBLUR_OPENCL_FILTER 0
+#define CONFIG_AVGBLUR_VULKAN_FILTER 0
+#define CONFIG_BBOX_FILTER 0
+#define CONFIG_BENCH_FILTER 0
+#define CONFIG_BILATERAL_FILTER 0
+#define CONFIG_BITPLANENOISE_FILTER 0
+#define CONFIG_BLACKDETECT_FILTER 0
+#define CONFIG_BLACKFRAME_FILTER 0
+#define CONFIG_BLEND_FILTER 0
+#define CONFIG_BM3D_FILTER 0
+#define CONFIG_BOXBLUR_FILTER 0
+#define CONFIG_BOXBLUR_OPENCL_FILTER 0
+#define CONFIG_BWDIF_FILTER 0
+#define CONFIG_CAS_FILTER 0
+#define CONFIG_CHROMAHOLD_FILTER 0
+#define CONFIG_CHROMAKEY_FILTER 0
+#define CONFIG_CHROMASHIFT_FILTER 0
+#define CONFIG_CIESCOPE_FILTER 0
+#define CONFIG_CODECVIEW_FILTER 0
+#define CONFIG_COLORBALANCE_FILTER 0
+#define CONFIG_COLORCHANNELMIXER_FILTER 0
+#define CONFIG_COLORKEY_FILTER 0
+#define CONFIG_COLORKEY_OPENCL_FILTER 0
+#define CONFIG_COLORHOLD_FILTER 0
+#define CONFIG_COLORLEVELS_FILTER 0
+#define CONFIG_COLORMATRIX_FILTER 0
+#define CONFIG_COLORSPACE_FILTER 0
+#define CONFIG_CONVOLUTION_FILTER 0
+#define CONFIG_CONVOLUTION_OPENCL_FILTER 0
+#define CONFIG_CONVOLVE_FILTER 0
+#define CONFIG_COPY_FILTER 0
+#define CONFIG_COREIMAGE_FILTER 0
+#define CONFIG_COVER_RECT_FILTER 0
+#define CONFIG_CROP_FILTER 0
+#define CONFIG_CROPDETECT_FILTER 0
+#define CONFIG_CUE_FILTER 0
+#define CONFIG_CURVES_FILTER 0
+#define CONFIG_DATASCOPE_FILTER 0
+#define CONFIG_DCTDNOIZ_FILTER 0
+#define CONFIG_DEBAND_FILTER 0
+#define CONFIG_DEBLOCK_FILTER 0
+#define CONFIG_DECIMATE_FILTER 0
+#define CONFIG_DECONVOLVE_FILTER 0
+#define CONFIG_DEDOT_FILTER 0
+#define CONFIG_DEFLATE_FILTER 0
+#define CONFIG_DEFLICKER_FILTER 0
+#define CONFIG_DEINTERLACE_QSV_FILTER 0
+#define CONFIG_DEINTERLACE_VAAPI_FILTER 0
+#define CONFIG_DEJUDDER_FILTER 0
+#define CONFIG_DELOGO_FILTER 0
+#define CONFIG_DENOISE_VAAPI_FILTER 0
+#define CONFIG_DERAIN_FILTER 0
+#define CONFIG_DESHAKE_FILTER 0
+#define CONFIG_DESHAKE_OPENCL_FILTER 0
+#define CONFIG_DESPILL_FILTER 0
+#define CONFIG_DETELECINE_FILTER 0
+#define CONFIG_DILATION_FILTER 0
+#define CONFIG_DILATION_OPENCL_FILTER 0
+#define CONFIG_DISPLACE_FILTER 0
+#define CONFIG_DNN_PROCESSING_FILTER 0
+#define CONFIG_DOUBLEWEAVE_FILTER 0
+#define CONFIG_DRAWBOX_FILTER 0
+#define CONFIG_DRAWGRAPH_FILTER 0
+#define CONFIG_DRAWGRID_FILTER 0
+#define CONFIG_DRAWTEXT_FILTER 0
+#define CONFIG_EDGEDETECT_FILTER 0
+#define CONFIG_ELBG_FILTER 0
+#define CONFIG_ENTROPY_FILTER 0
+#define CONFIG_EQ_FILTER 0
+#define CONFIG_EROSION_FILTER 0
+#define CONFIG_EROSION_OPENCL_FILTER 0
+#define CONFIG_EXTRACTPLANES_FILTER 0
+#define CONFIG_FADE_FILTER 0
+#define CONFIG_FFTDNOIZ_FILTER 0
+#define CONFIG_FFTFILT_FILTER 0
+#define CONFIG_FIELD_FILTER 0
+#define CONFIG_FIELDHINT_FILTER 0
+#define CONFIG_FIELDMATCH_FILTER 0
+#define CONFIG_FIELDORDER_FILTER 0
+#define CONFIG_FILLBORDERS_FILTER 0
+#define CONFIG_FIND_RECT_FILTER 0
+#define CONFIG_FLOODFILL_FILTER 0
+#define CONFIG_FORMAT_FILTER 0
+#define CONFIG_FPS_FILTER 0
+#define CONFIG_FRAMEPACK_FILTER 0
+#define CONFIG_FRAMERATE_FILTER 0
+#define CONFIG_FRAMESTEP_FILTER 0
+#define CONFIG_FREEZEDETECT_FILTER 0
+#define CONFIG_FREEZEFRAMES_FILTER 0
+#define CONFIG_FREI0R_FILTER 0
+#define CONFIG_FSPP_FILTER 0
+#define CONFIG_GBLUR_FILTER 0
+#define CONFIG_GEQ_FILTER 0
+#define CONFIG_GRADFUN_FILTER 0
+#define CONFIG_GRAPHMONITOR_FILTER 0
+#define CONFIG_GREYEDGE_FILTER 0
+#define CONFIG_HALDCLUT_FILTER 0
+#define CONFIG_HFLIP_FILTER 0
+#define CONFIG_HISTEQ_FILTER 0
+#define CONFIG_HISTOGRAM_FILTER 0
+#define CONFIG_HQDN3D_FILTER 0
+#define CONFIG_HQX_FILTER 0
+#define CONFIG_HSTACK_FILTER 0
+#define CONFIG_HUE_FILTER 0
+#define CONFIG_HWDOWNLOAD_FILTER 0
+#define CONFIG_HWMAP_FILTER 0
+#define CONFIG_HWUPLOAD_FILTER 0
+#define CONFIG_HWUPLOAD_CUDA_FILTER 0
+#define CONFIG_HYSTERESIS_FILTER 0
+#define CONFIG_IDET_FILTER 0
+#define CONFIG_IL_FILTER 0
+#define CONFIG_INFLATE_FILTER 0
+#define CONFIG_INTERLACE_FILTER 0
+#define CONFIG_INTERLEAVE_FILTER 0
+#define CONFIG_KERNDEINT_FILTER 0
+#define CONFIG_LAGFUN_FILTER 0
+#define CONFIG_LENSCORRECTION_FILTER 0
+#define CONFIG_LENSFUN_FILTER 0
+#define CONFIG_LIBVMAF_FILTER 0
+#define CONFIG_LIMITER_FILTER 0
+#define CONFIG_LOOP_FILTER 0
+#define CONFIG_LUMAKEY_FILTER 0
+#define CONFIG_LUT_FILTER 0
+#define CONFIG_LUT1D_FILTER 0
+#define CONFIG_LUT2_FILTER 0
+#define CONFIG_LUT3D_FILTER 0
+#define CONFIG_LUTRGB_FILTER 0
+#define CONFIG_LUTYUV_FILTER 0
+#define CONFIG_MASKEDCLAMP_FILTER 0
+#define CONFIG_MASKEDMAX_FILTER 0
+#define CONFIG_MASKEDMERGE_FILTER 0
+#define CONFIG_MASKEDMIN_FILTER 0
+#define CONFIG_MASKEDTHRESHOLD_FILTER 0
+#define CONFIG_MASKFUN_FILTER 0
+#define CONFIG_MCDEINT_FILTER 0
+#define CONFIG_MEDIAN_FILTER 0
+#define CONFIG_MERGEPLANES_FILTER 0
+#define CONFIG_MESTIMATE_FILTER 0
+#define CONFIG_METADATA_FILTER 0
+#define CONFIG_MIDEQUALIZER_FILTER 0
+#define CONFIG_MINTERPOLATE_FILTER 0
+#define CONFIG_MIX_FILTER 0
+#define CONFIG_MPDECIMATE_FILTER 0
+#define CONFIG_NEGATE_FILTER 0
+#define CONFIG_NLMEANS_FILTER 0
+#define CONFIG_NLMEANS_OPENCL_FILTER 0
+#define CONFIG_NNEDI_FILTER 0
+#define CONFIG_NOFORMAT_FILTER 0
+#define CONFIG_NOISE_FILTER 0
+#define CONFIG_NORMALIZE_FILTER 0
+#define CONFIG_NULL_FILTER 0
+#define CONFIG_OCR_FILTER 0
+#define CONFIG_OCV_FILTER 0
+#define CONFIG_OSCILLOSCOPE_FILTER 0
+#define CONFIG_OVERLAY_FILTER 0
+#define CONFIG_OVERLAY_OPENCL_FILTER 0
+#define CONFIG_OVERLAY_QSV_FILTER 0
+#define CONFIG_OVERLAY_VULKAN_FILTER 0
+#define CONFIG_OVERLAY_CUDA_FILTER 0
+#define CONFIG_OWDENOISE_FILTER 0
+#define CONFIG_PAD_FILTER 0
+#define CONFIG_PAD_OPENCL_FILTER 0
+#define CONFIG_PALETTEGEN_FILTER 0
+#define CONFIG_PALETTEUSE_FILTER 0
+#define CONFIG_PERMS_FILTER 0
+#define CONFIG_PERSPECTIVE_FILTER 0
+#define CONFIG_PHASE_FILTER 0
+#define CONFIG_PHOTOSENSITIVITY_FILTER 0
+#define CONFIG_PIXDESCTEST_FILTER 0
+#define CONFIG_PIXSCOPE_FILTER 0
+#define CONFIG_PP_FILTER 0
+#define CONFIG_PP7_FILTER 0
+#define CONFIG_PREMULTIPLY_FILTER 0
+#define CONFIG_PREWITT_FILTER 0
+#define CONFIG_PREWITT_OPENCL_FILTER 0
+#define CONFIG_PROCAMP_VAAPI_FILTER 0
+#define CONFIG_PROGRAM_OPENCL_FILTER 0
+#define CONFIG_PSEUDOCOLOR_FILTER 0
+#define CONFIG_PSNR_FILTER 0
+#define CONFIG_PULLUP_FILTER 0
+#define CONFIG_QP_FILTER 0
+#define CONFIG_RANDOM_FILTER 0
+#define CONFIG_READEIA608_FILTER 0
+#define CONFIG_READVITC_FILTER 0
+#define CONFIG_REALTIME_FILTER 0
+#define CONFIG_REMAP_FILTER 0
+#define CONFIG_REMOVEGRAIN_FILTER 0
+#define CONFIG_REMOVELOGO_FILTER 0
+#define CONFIG_REPEATFIELDS_FILTER 0
+#define CONFIG_REVERSE_FILTER 0
+#define CONFIG_RGBASHIFT_FILTER 0
+#define CONFIG_ROBERTS_FILTER 0
+#define CONFIG_ROBERTS_OPENCL_FILTER 0
+#define CONFIG_ROTATE_FILTER 0
+#define CONFIG_SAB_FILTER 0
+#define CONFIG_SCALE_FILTER 0
+#define CONFIG_SCALE_CUDA_FILTER 0
+#define CONFIG_SCALE_NPP_FILTER 0
+#define CONFIG_SCALE_QSV_FILTER 0
+#define CONFIG_SCALE_VAAPI_FILTER 0
+#define CONFIG_SCALE_VULKAN_FILTER 0
+#define CONFIG_SCALE2REF_FILTER 0
+#define CONFIG_SCROLL_FILTER 0
+#define CONFIG_SELECT_FILTER 0
+#define CONFIG_SELECTIVECOLOR_FILTER 0
+#define CONFIG_SENDCMD_FILTER 0
+#define CONFIG_SEPARATEFIELDS_FILTER 0
+#define CONFIG_SETDAR_FILTER 0
+#define CONFIG_SETFIELD_FILTER 0
+#define CONFIG_SETPARAMS_FILTER 0
+#define CONFIG_SETPTS_FILTER 0
+#define CONFIG_SETRANGE_FILTER 0
+#define CONFIG_SETSAR_FILTER 0
+#define CONFIG_SETTB_FILTER 0
+#define CONFIG_SHARPNESS_VAAPI_FILTER 0
+#define CONFIG_SHOWINFO_FILTER 0
+#define CONFIG_SHOWPALETTE_FILTER 0
+#define CONFIG_SHUFFLEFRAMES_FILTER 0
+#define CONFIG_SHUFFLEPLANES_FILTER 0
+#define CONFIG_SIDEDATA_FILTER 0
+#define CONFIG_SIGNALSTATS_FILTER 0
+#define CONFIG_SIGNATURE_FILTER 0
+#define CONFIG_SMARTBLUR_FILTER 0
+#define CONFIG_SOBEL_FILTER 0
+#define CONFIG_SOBEL_OPENCL_FILTER 0
+#define CONFIG_SPLIT_FILTER 0
+#define CONFIG_SPP_FILTER 0
+#define CONFIG_SR_FILTER 0
+#define CONFIG_SSIM_FILTER 0
+#define CONFIG_STEREO3D_FILTER 0
+#define CONFIG_STREAMSELECT_FILTER 0
+#define CONFIG_SUBTITLES_FILTER 0
+#define CONFIG_SUPER2XSAI_FILTER 0
+#define CONFIG_SWAPRECT_FILTER 0
+#define CONFIG_SWAPUV_FILTER 0
+#define CONFIG_TBLEND_FILTER 0
+#define CONFIG_TELECINE_FILTER 0
+#define CONFIG_THISTOGRAM_FILTER 0
+#define CONFIG_THRESHOLD_FILTER 0
+#define CONFIG_THUMBNAIL_FILTER 0
+#define CONFIG_THUMBNAIL_CUDA_FILTER 0
+#define CONFIG_TILE_FILTER 0
+#define CONFIG_TINTERLACE_FILTER 0
+#define CONFIG_TLUT2_FILTER 0
+#define CONFIG_TMEDIAN_FILTER 0
+#define CONFIG_TMIX_FILTER 0
+#define CONFIG_TONEMAP_FILTER 0
+#define CONFIG_TONEMAP_OPENCL_FILTER 0
+#define CONFIG_TONEMAP_VAAPI_FILTER 0
+#define CONFIG_TPAD_FILTER 0
+#define CONFIG_TRANSPOSE_FILTER 0
+#define CONFIG_TRANSPOSE_NPP_FILTER 0
+#define CONFIG_TRANSPOSE_OPENCL_FILTER 0
+#define CONFIG_TRANSPOSE_VAAPI_FILTER 0
+#define CONFIG_TRIM_FILTER 0
+#define CONFIG_UNPREMULTIPLY_FILTER 0
+#define CONFIG_UNSHARP_FILTER 0
+#define CONFIG_UNSHARP_OPENCL_FILTER 0
+#define CONFIG_USPP_FILTER 0
+#define CONFIG_V360_FILTER 0
+#define CONFIG_VAGUEDENOISER_FILTER 0
+#define CONFIG_VECTORSCOPE_FILTER 0
+#define CONFIG_VFLIP_FILTER 0
+#define CONFIG_VFRDET_FILTER 0
+#define CONFIG_VIBRANCE_FILTER 0
+#define CONFIG_VIDSTABDETECT_FILTER 0
+#define CONFIG_VIDSTABTRANSFORM_FILTER 0
+#define CONFIG_VIGNETTE_FILTER 0
+#define CONFIG_VMAFMOTION_FILTER 0
+#define CONFIG_VPP_QSV_FILTER 0
+#define CONFIG_VSTACK_FILTER 0
+#define CONFIG_W3FDIF_FILTER 0
+#define CONFIG_WAVEFORM_FILTER 0
+#define CONFIG_WEAVE_FILTER 0
+#define CONFIG_XBR_FILTER 0
+#define CONFIG_XFADE_FILTER 0
+#define CONFIG_XFADE_OPENCL_FILTER 0
+#define CONFIG_XMEDIAN_FILTER 0
+#define CONFIG_XSTACK_FILTER 0
+#define CONFIG_YADIF_FILTER 0
+#define CONFIG_YADIF_CUDA_FILTER 0
+#define CONFIG_YAEPBLUR_FILTER 0
+#define CONFIG_ZMQ_FILTER 0
+#define CONFIG_ZOOMPAN_FILTER 0
+#define CONFIG_ZSCALE_FILTER 0
+#define CONFIG_ALLRGB_FILTER 0
+#define CONFIG_ALLYUV_FILTER 0
+#define CONFIG_CELLAUTO_FILTER 0
+#define CONFIG_COLOR_FILTER 0
+#define CONFIG_COREIMAGESRC_FILTER 0
+#define CONFIG_FREI0R_SRC_FILTER 0
+#define CONFIG_HALDCLUTSRC_FILTER 0
+#define CONFIG_LIFE_FILTER 0
+#define CONFIG_MANDELBROT_FILTER 0
+#define CONFIG_MPTESTSRC_FILTER 0
+#define CONFIG_NULLSRC_FILTER 0
+#define CONFIG_OPENCLSRC_FILTER 0
+#define CONFIG_PAL75BARS_FILTER 0
+#define CONFIG_PAL100BARS_FILTER 0
+#define CONFIG_RGBTESTSRC_FILTER 0
+#define CONFIG_SIERPINSKI_FILTER 0
+#define CONFIG_SMPTEBARS_FILTER 0
+#define CONFIG_SMPTEHDBARS_FILTER 0
+#define CONFIG_TESTSRC_FILTER 0
+#define CONFIG_TESTSRC2_FILTER 0
+#define CONFIG_YUVTESTSRC_FILTER 0
+#define CONFIG_NULLSINK_FILTER 0
+#define CONFIG_ABITSCOPE_FILTER 0
+#define CONFIG_ADRAWGRAPH_FILTER 0
+#define CONFIG_AGRAPHMONITOR_FILTER 0
+#define CONFIG_AHISTOGRAM_FILTER 0
+#define CONFIG_APHASEMETER_FILTER 0
+#define CONFIG_AVECTORSCOPE_FILTER 0
+#define CONFIG_CONCAT_FILTER 0
+#define CONFIG_SHOWCQT_FILTER 0
+#define CONFIG_SHOWFREQS_FILTER 0
+#define CONFIG_SHOWSPATIAL_FILTER 0
+#define CONFIG_SHOWSPECTRUM_FILTER 0
+#define CONFIG_SHOWSPECTRUMPIC_FILTER 0
+#define CONFIG_SHOWVOLUME_FILTER 0
+#define CONFIG_SHOWWAVES_FILTER 0
+#define CONFIG_SHOWWAVESPIC_FILTER 0
+#define CONFIG_SPECTRUMSYNTH_FILTER 0
+#define CONFIG_AMOVIE_FILTER 0
+#define CONFIG_MOVIE_FILTER 0
+#define CONFIG_AFIFO_FILTER 0
+#define CONFIG_FIFO_FILTER 0
+#define CONFIG_AA_DEMUXER 0
+#define CONFIG_AAC_DEMUXER 1
+#define CONFIG_AC3_DEMUXER 0
+#define CONFIG_ACM_DEMUXER 0
+#define CONFIG_ACT_DEMUXER 0
+#define CONFIG_ADF_DEMUXER 0
+#define CONFIG_ADP_DEMUXER 0
+#define CONFIG_ADS_DEMUXER 0
+#define CONFIG_ADX_DEMUXER 0
+#define CONFIG_AEA_DEMUXER 0
+#define CONFIG_AFC_DEMUXER 0
+#define CONFIG_AIFF_DEMUXER 0
+#define CONFIG_AIX_DEMUXER 0
+#define CONFIG_ALP_DEMUXER 0
+#define CONFIG_AMR_DEMUXER 1
+#define CONFIG_AMRNB_DEMUXER 0
+#define CONFIG_AMRWB_DEMUXER 0
+#define CONFIG_ANM_DEMUXER 0
+#define CONFIG_APC_DEMUXER 0
+#define CONFIG_APE_DEMUXER 0
+#define CONFIG_APM_DEMUXER 0
+#define CONFIG_APNG_DEMUXER 0
+#define CONFIG_APTX_DEMUXER 0
+#define CONFIG_APTX_HD_DEMUXER 0
+#define CONFIG_AQTITLE_DEMUXER 0
+#define CONFIG_ARGO_ASF_DEMUXER 0
+#define CONFIG_ASF_DEMUXER 0
+#define CONFIG_ASF_O_DEMUXER 0
+#define CONFIG_ASS_DEMUXER 0
+#define CONFIG_AST_DEMUXER 0
+#define CONFIG_AU_DEMUXER 0
+#define CONFIG_AV1_DEMUXER 0
+#define CONFIG_AVI_DEMUXER 1
+#define CONFIG_AVISYNTH_DEMUXER 0
+#define CONFIG_AVR_DEMUXER 0
+#define CONFIG_AVS_DEMUXER 0
+#define CONFIG_AVS2_DEMUXER 0
+#define CONFIG_BETHSOFTVID_DEMUXER 0
+#define CONFIG_BFI_DEMUXER 0
+#define CONFIG_BINTEXT_DEMUXER 0
+#define CONFIG_BINK_DEMUXER 0
+#define CONFIG_BIT_DEMUXER 0
+#define CONFIG_BMV_DEMUXER 0
+#define CONFIG_BFSTM_DEMUXER 0
+#define CONFIG_BRSTM_DEMUXER 0
+#define CONFIG_BOA_DEMUXER 0
+#define CONFIG_C93_DEMUXER 0
+#define CONFIG_CAF_DEMUXER 0
+#define CONFIG_CAVSVIDEO_DEMUXER 0
+#define CONFIG_CDG_DEMUXER 0
+#define CONFIG_CDXL_DEMUXER 0
+#define CONFIG_CINE_DEMUXER 0
+#define CONFIG_CODEC2_DEMUXER 0
+#define CONFIG_CODEC2RAW_DEMUXER 0
+#define CONFIG_CONCAT_DEMUXER 0
+#define CONFIG_DASH_DEMUXER 0
+#define CONFIG_DATA_DEMUXER 0
+#define CONFIG_DAUD_DEMUXER 0
+#define CONFIG_DCSTR_DEMUXER 0
+#define CONFIG_DERF_DEMUXER 0
+#define CONFIG_DFA_DEMUXER 0
+#define CONFIG_DHAV_DEMUXER 0
+#define CONFIG_DIRAC_DEMUXER 0
+#define CONFIG_DNXHD_DEMUXER 0
+#define CONFIG_DSF_DEMUXER 0
+#define CONFIG_DSICIN_DEMUXER 0
+#define CONFIG_DSS_DEMUXER 0
+#define CONFIG_DTS_DEMUXER 0
+#define CONFIG_DTSHD_DEMUXER 0
+#define CONFIG_DV_DEMUXER 0
+#define CONFIG_DVBSUB_DEMUXER 0
+#define CONFIG_DVBTXT_DEMUXER 0
+#define CONFIG_DXA_DEMUXER 0
+#define CONFIG_EA_DEMUXER 0
+#define CONFIG_EA_CDATA_DEMUXER 0
+#define CONFIG_EAC3_DEMUXER 0
+#define CONFIG_EPAF_DEMUXER 0
+#define CONFIG_FFMETADATA_DEMUXER 0
+#define CONFIG_FILMSTRIP_DEMUXER 0
+#define CONFIG_FITS_DEMUXER 0
+#define CONFIG_FLAC_DEMUXER 1
+#define CONFIG_FLIC_DEMUXER 0
+#define CONFIG_FLV_DEMUXER 0
+#define CONFIG_LIVE_FLV_DEMUXER 0
+#define CONFIG_FOURXM_DEMUXER 0
+#define CONFIG_FRM_DEMUXER 0
+#define CONFIG_FSB_DEMUXER 0
+#define CONFIG_FWSE_DEMUXER 0
+#define CONFIG_G722_DEMUXER 0
+#define CONFIG_G723_1_DEMUXER 0
+#define CONFIG_G726_DEMUXER 0
+#define CONFIG_G726LE_DEMUXER 0
+#define CONFIG_G729_DEMUXER 0
+#define CONFIG_GDV_DEMUXER 0
+#define CONFIG_GENH_DEMUXER 0
+#define CONFIG_GIF_DEMUXER 0
+#define CONFIG_GSM_DEMUXER 1
+#define CONFIG_GXF_DEMUXER 0
+#define CONFIG_H261_DEMUXER 0
+#define CONFIG_H263_DEMUXER 0
+#define CONFIG_H264_DEMUXER 0
+#define CONFIG_HCA_DEMUXER 0
+#define CONFIG_HCOM_DEMUXER 0
+#define CONFIG_HEVC_DEMUXER 0
+#define CONFIG_HLS_DEMUXER 0
+#define CONFIG_HNM_DEMUXER 0
+#define CONFIG_ICO_DEMUXER 0
+#define CONFIG_IDCIN_DEMUXER 0
+#define CONFIG_IDF_DEMUXER 0
+#define CONFIG_IFF_DEMUXER 0
+#define CONFIG_IFV_DEMUXER 0
+#define CONFIG_ILBC_DEMUXER 0
+#define CONFIG_IMAGE2_DEMUXER 0
+#define CONFIG_IMAGE2PIPE_DEMUXER 0
+#define CONFIG_IMAGE2_ALIAS_PIX_DEMUXER 0
+#define CONFIG_IMAGE2_BRENDER_PIX_DEMUXER 0
+#define CONFIG_INGENIENT_DEMUXER 0
+#define CONFIG_IPMOVIE_DEMUXER 0
+#define CONFIG_IRCAM_DEMUXER 0
+#define CONFIG_ISS_DEMUXER 0
+#define CONFIG_IV8_DEMUXER 0
+#define CONFIG_IVF_DEMUXER 0
+#define CONFIG_IVR_DEMUXER 0
+#define CONFIG_JACOSUB_DEMUXER 0
+#define CONFIG_JV_DEMUXER 0
+#define CONFIG_KUX_DEMUXER 0
+#define CONFIG_KVAG_DEMUXER 0
+#define CONFIG_LMLM4_DEMUXER 0
+#define CONFIG_LOAS_DEMUXER 0
+#define CONFIG_LRC_DEMUXER 0
+#define CONFIG_LVF_DEMUXER 0
+#define CONFIG_LXF_DEMUXER 0
+#define CONFIG_M4V_DEMUXER 0
+#define CONFIG_MATROSKA_DEMUXER 1
+#define CONFIG_MGSTS_DEMUXER 0
+#define CONFIG_MICRODVD_DEMUXER 0
+#define CONFIG_MJPEG_DEMUXER 0
+#define CONFIG_MJPEG_2000_DEMUXER 0
+#define CONFIG_MLP_DEMUXER 0
+#define CONFIG_MLV_DEMUXER 0
+#define CONFIG_MM_DEMUXER 0
+#define CONFIG_MMF_DEMUXER 0
+#define CONFIG_MOV_DEMUXER 1
+#define CONFIG_MP3_DEMUXER 1
+#define CONFIG_MPC_DEMUXER 0
+#define CONFIG_MPC8_DEMUXER 0
+#define CONFIG_MPEGPS_DEMUXER 0
+#define CONFIG_MPEGTS_DEMUXER 0
+#define CONFIG_MPEGTSRAW_DEMUXER 0
+#define CONFIG_MPEGVIDEO_DEMUXER 0
+#define CONFIG_MPJPEG_DEMUXER 0
+#define CONFIG_MPL2_DEMUXER 0
+#define CONFIG_MPSUB_DEMUXER 0
+#define CONFIG_MSF_DEMUXER 0
+#define CONFIG_MSNWC_TCP_DEMUXER 0
+#define CONFIG_MTAF_DEMUXER 0
+#define CONFIG_MTV_DEMUXER 0
+#define CONFIG_MUSX_DEMUXER 0
+#define CONFIG_MV_DEMUXER 0
+#define CONFIG_MVI_DEMUXER 0
+#define CONFIG_MXF_DEMUXER 0
+#define CONFIG_MXG_DEMUXER 0
+#define CONFIG_NC_DEMUXER 0
+#define CONFIG_NISTSPHERE_DEMUXER 0
+#define CONFIG_NSP_DEMUXER 0
+#define CONFIG_NSV_DEMUXER 0
+#define CONFIG_NUT_DEMUXER 0
+#define CONFIG_NUV_DEMUXER 0
+#define CONFIG_OGG_DEMUXER 1
+#define CONFIG_OMA_DEMUXER 0
+#define CONFIG_PAF_DEMUXER 0
+#define CONFIG_PCM_ALAW_DEMUXER 0
+#define CONFIG_PCM_MULAW_DEMUXER 0
+#define CONFIG_PCM_VIDC_DEMUXER 0
+#define CONFIG_PCM_F64BE_DEMUXER 0
+#define CONFIG_PCM_F64LE_DEMUXER 0
+#define CONFIG_PCM_F32BE_DEMUXER 0
+#define CONFIG_PCM_F32LE_DEMUXER 0
+#define CONFIG_PCM_S32BE_DEMUXER 0
+#define CONFIG_PCM_S32LE_DEMUXER 0
+#define CONFIG_PCM_S24BE_DEMUXER 0
+#define CONFIG_PCM_S24LE_DEMUXER 0
+#define CONFIG_PCM_S16BE_DEMUXER 0
+#define CONFIG_PCM_S16LE_DEMUXER 0
+#define CONFIG_PCM_S8_DEMUXER 0
+#define CONFIG_PCM_U32BE_DEMUXER 0
+#define CONFIG_PCM_U32LE_DEMUXER 0
+#define CONFIG_PCM_U24BE_DEMUXER 0
+#define CONFIG_PCM_U24LE_DEMUXER 0
+#define CONFIG_PCM_U16BE_DEMUXER 0
+#define CONFIG_PCM_U16LE_DEMUXER 0
+#define CONFIG_PCM_U8_DEMUXER 0
+#define CONFIG_PJS_DEMUXER 0
+#define CONFIG_PMP_DEMUXER 0
+#define CONFIG_PVA_DEMUXER 0
+#define CONFIG_PVF_DEMUXER 0
+#define CONFIG_QCP_DEMUXER 0
+#define CONFIG_R3D_DEMUXER 0
+#define CONFIG_RAWVIDEO_DEMUXER 0
+#define CONFIG_REALTEXT_DEMUXER 0
+#define CONFIG_REDSPARK_DEMUXER 0
+#define CONFIG_RL2_DEMUXER 0
+#define CONFIG_RM_DEMUXER 0
+#define CONFIG_ROQ_DEMUXER 0
+#define CONFIG_RPL_DEMUXER 0
+#define CONFIG_RSD_DEMUXER 0
+#define CONFIG_RSO_DEMUXER 0
+#define CONFIG_RTP_DEMUXER 0
+#define CONFIG_RTSP_DEMUXER 0
+#define CONFIG_S337M_DEMUXER 0
+#define CONFIG_SAMI_DEMUXER 0
+#define CONFIG_SAP_DEMUXER 0
+#define CONFIG_SBC_DEMUXER 0
+#define CONFIG_SBG_DEMUXER 0
+#define CONFIG_SCC_DEMUXER 0
+#define CONFIG_SDP_DEMUXER 0
+#define CONFIG_SDR2_DEMUXER 0
+#define CONFIG_SDS_DEMUXER 0
+#define CONFIG_SDX_DEMUXER 0
+#define CONFIG_SEGAFILM_DEMUXER 0
+#define CONFIG_SER_DEMUXER 0
+#define CONFIG_SHORTEN_DEMUXER 0
+#define CONFIG_SIFF_DEMUXER 0
+#define CONFIG_SLN_DEMUXER 0
+#define CONFIG_SMACKER_DEMUXER 0
+#define CONFIG_SMJPEG_DEMUXER 0
+#define CONFIG_SMUSH_DEMUXER 0
+#define CONFIG_SOL_DEMUXER 0
+#define CONFIG_SOX_DEMUXER 0
+#define CONFIG_SPDIF_DEMUXER 0
+#define CONFIG_SRT_DEMUXER 0
+#define CONFIG_STR_DEMUXER 0
+#define CONFIG_STL_DEMUXER 0
+#define CONFIG_SUBVIEWER1_DEMUXER 0
+#define CONFIG_SUBVIEWER_DEMUXER 0
+#define CONFIG_SUP_DEMUXER 0
+#define CONFIG_SVAG_DEMUXER 0
+#define CONFIG_SWF_DEMUXER 0
+#define CONFIG_TAK_DEMUXER 0
+#define CONFIG_TEDCAPTIONS_DEMUXER 0
+#define CONFIG_THP_DEMUXER 0
+#define CONFIG_THREEDOSTR_DEMUXER 0
+#define CONFIG_TIERTEXSEQ_DEMUXER 0
+#define CONFIG_TMV_DEMUXER 0
+#define CONFIG_TRUEHD_DEMUXER 0
+#define CONFIG_TTA_DEMUXER 0
+#define CONFIG_TXD_DEMUXER 0
+#define CONFIG_TTY_DEMUXER 0
+#define CONFIG_TY_DEMUXER 0
+#define CONFIG_V210_DEMUXER 0
+#define CONFIG_V210X_DEMUXER 0
+#define CONFIG_VAG_DEMUXER 0
+#define CONFIG_VC1_DEMUXER 0
+#define CONFIG_VC1T_DEMUXER 0
+#define CONFIG_VIVIDAS_DEMUXER 0
+#define CONFIG_VIVO_DEMUXER 0
+#define CONFIG_VMD_DEMUXER 0
+#define CONFIG_VOBSUB_DEMUXER 0
+#define CONFIG_VOC_DEMUXER 0
+#define CONFIG_VPK_DEMUXER 0
+#define CONFIG_VPLAYER_DEMUXER 0
+#define CONFIG_VQF_DEMUXER 0
+#define CONFIG_W64_DEMUXER 0
+#define CONFIG_WAV_DEMUXER 1
+#define CONFIG_WC3_DEMUXER 0
+#define CONFIG_WEBM_DASH_MANIFEST_DEMUXER 0
+#define CONFIG_WEBVTT_DEMUXER 0
+#define CONFIG_WSAUD_DEMUXER 0
+#define CONFIG_WSD_DEMUXER 0
+#define CONFIG_WSVQA_DEMUXER 0
+#define CONFIG_WTV_DEMUXER 0
+#define CONFIG_WVE_DEMUXER 0
+#define CONFIG_WV_DEMUXER 0
+#define CONFIG_XA_DEMUXER 0
+#define CONFIG_XBIN_DEMUXER 0
+#define CONFIG_XMV_DEMUXER 0
+#define CONFIG_XVAG_DEMUXER 0
+#define CONFIG_XWMA_DEMUXER 0
+#define CONFIG_YOP_DEMUXER 0
+#define CONFIG_YUV4MPEGPIPE_DEMUXER 0
+#define CONFIG_IMAGE_BMP_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_DDS_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_DPX_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_EXR_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_GIF_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_J2K_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_JPEG_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_JPEGLS_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_PAM_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_PBM_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_PCX_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_PGMYUV_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_PGM_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_PICTOR_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_PNG_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_PPM_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_PSD_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_QDRAW_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_SGI_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_SVG_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_SUNRAST_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_TIFF_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_WEBP_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_XPM_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_XWD_PIPE_DEMUXER 0
+#define CONFIG_LIBGME_DEMUXER 0
+#define CONFIG_LIBMODPLUG_DEMUXER 0
+#define CONFIG_LIBOPENMPT_DEMUXER 0
+#define CONFIG_VAPOURSYNTH_DEMUXER 0
+#define CONFIG_A64_MUXER 0
+#define CONFIG_AC3_MUXER 0
+#define CONFIG_ADTS_MUXER 0
+#define CONFIG_ADX_MUXER 0
+#define CONFIG_AIFF_MUXER 0
+#define CONFIG_AMR_MUXER 0
+#define CONFIG_APNG_MUXER 0
+#define CONFIG_APTX_MUXER 0
+#define CONFIG_APTX_HD_MUXER 0
+#define CONFIG_ASF_MUXER 0
+#define CONFIG_ASS_MUXER 0
+#define CONFIG_AST_MUXER 0
+#define CONFIG_ASF_STREAM_MUXER 0
+#define CONFIG_AU_MUXER 0
+#define CONFIG_AVI_MUXER 0
+#define CONFIG_AVM2_MUXER 0
+#define CONFIG_AVS2_MUXER 0
+#define CONFIG_BIT_MUXER 0
+#define CONFIG_CAF_MUXER 0
+#define CONFIG_CAVSVIDEO_MUXER 0
+#define CONFIG_CODEC2_MUXER 0
+#define CONFIG_CODEC2RAW_MUXER 0
+#define CONFIG_CRC_MUXER 0
+#define CONFIG_DASH_MUXER 0
+#define CONFIG_DATA_MUXER 0
+#define CONFIG_DAUD_MUXER 0
+#define CONFIG_DIRAC_MUXER 0
+#define CONFIG_DNXHD_MUXER 0
+#define CONFIG_DTS_MUXER 0
+#define CONFIG_DV_MUXER 0
+#define CONFIG_EAC3_MUXER 0
+#define CONFIG_F4V_MUXER 0
+#define CONFIG_FFMETADATA_MUXER 0
+#define CONFIG_FIFO_MUXER 0
+#define CONFIG_FIFO_TEST_MUXER 0
+#define CONFIG_FILMSTRIP_MUXER 0
+#define CONFIG_FITS_MUXER 0
+#define CONFIG_FLAC_MUXER 0
+#define CONFIG_FLV_MUXER 0
+#define CONFIG_FRAMECRC_MUXER 0
+#define CONFIG_FRAMEHASH_MUXER 0
+#define CONFIG_FRAMEMD5_MUXER 0
+#define CONFIG_G722_MUXER 0
+#define CONFIG_G723_1_MUXER 0
+#define CONFIG_G726_MUXER 0
+#define CONFIG_G726LE_MUXER 0
+#define CONFIG_GIF_MUXER 0
+#define CONFIG_GSM_MUXER 0
+#define CONFIG_GXF_MUXER 0
+#define CONFIG_H261_MUXER 0
+#define CONFIG_H263_MUXER 0
+#define CONFIG_H264_MUXER 0
+#define CONFIG_HASH_MUXER 0
+#define CONFIG_HDS_MUXER 0
+#define CONFIG_HEVC_MUXER 0
+#define CONFIG_HLS_MUXER 0
+#define CONFIG_ICO_MUXER 0
+#define CONFIG_ILBC_MUXER 0
+#define CONFIG_IMAGE2_MUXER 0
+#define CONFIG_IMAGE2PIPE_MUXER 0
+#define CONFIG_IPOD_MUXER 0
+#define CONFIG_IRCAM_MUXER 0
+#define CONFIG_ISMV_MUXER 0
+#define CONFIG_IVF_MUXER 0
+#define CONFIG_JACOSUB_MUXER 0
+#define CONFIG_LATM_MUXER 0
+#define CONFIG_LRC_MUXER 0
+#define CONFIG_M4V_MUXER 0
+#define CONFIG_MD5_MUXER 0
+#define CONFIG_MATROSKA_MUXER 0
+#define CONFIG_MATROSKA_AUDIO_MUXER 0
+#define CONFIG_MICRODVD_MUXER 0
+#define CONFIG_MJPEG_MUXER 0
+#define CONFIG_MLP_MUXER 0
+#define CONFIG_MMF_MUXER 0
+#define CONFIG_MOV_MUXER 0
+#define CONFIG_MP2_MUXER 0
+#define CONFIG_MP3_MUXER 0
+#define CONFIG_MP4_MUXER 0
+#define CONFIG_MPEG1SYSTEM_MUXER 0
+#define CONFIG_MPEG1VCD_MUXER 0
+#define CONFIG_MPEG1VIDEO_MUXER 0
+#define CONFIG_MPEG2DVD_MUXER 0
+#define CONFIG_MPEG2SVCD_MUXER 0
+#define CONFIG_MPEG2VIDEO_MUXER 0
+#define CONFIG_MPEG2VOB_MUXER 0
+#define CONFIG_MPEGTS_MUXER 0
+#define CONFIG_MPJPEG_MUXER 0
+#define CONFIG_MXF_MUXER 0
+#define CONFIG_MXF_D10_MUXER 0
+#define CONFIG_MXF_OPATOM_MUXER 0
+#define CONFIG_NULL_MUXER 0
+#define CONFIG_NUT_MUXER 0
+#define CONFIG_OGA_MUXER 0
+#define CONFIG_OGG_MUXER 0
+#define CONFIG_OGV_MUXER 0
+#define CONFIG_OMA_MUXER 0
+#define CONFIG_OPUS_MUXER 0
+#define CONFIG_PCM_ALAW_MUXER 0
+#define CONFIG_PCM_MULAW_MUXER 0
+#define CONFIG_PCM_VIDC_MUXER 0
+#define CONFIG_PCM_F64BE_MUXER 0
+#define CONFIG_PCM_F64LE_MUXER 0
+#define CONFIG_PCM_F32BE_MUXER 0
+#define CONFIG_PCM_F32LE_MUXER 0
+#define CONFIG_PCM_S32BE_MUXER 0
+#define CONFIG_PCM_S32LE_MUXER 0
+#define CONFIG_PCM_S24BE_MUXER 0
+#define CONFIG_PCM_S24LE_MUXER 0
+#define CONFIG_PCM_S16BE_MUXER 0
+#define CONFIG_PCM_S16LE_MUXER 0
+#define CONFIG_PCM_S8_MUXER 0
+#define CONFIG_PCM_U32BE_MUXER 0
+#define CONFIG_PCM_U32LE_MUXER 0
+#define CONFIG_PCM_U24BE_MUXER 0
+#define CONFIG_PCM_U24LE_MUXER 0
+#define CONFIG_PCM_U16BE_MUXER 0
+#define CONFIG_PCM_U16LE_MUXER 0
+#define CONFIG_PCM_U8_MUXER 0
+#define CONFIG_PSP_MUXER 0
+#define CONFIG_RAWVIDEO_MUXER 0
+#define CONFIG_RM_MUXER 0
+#define CONFIG_ROQ_MUXER 0
+#define CONFIG_RSO_MUXER 0
+#define CONFIG_RTP_MUXER 0
+#define CONFIG_RTP_MPEGTS_MUXER 0
+#define CONFIG_RTSP_MUXER 0
+#define CONFIG_SAP_MUXER 0
+#define CONFIG_SBC_MUXER 0
+#define CONFIG_SCC_MUXER 0
+#define CONFIG_SEGAFILM_MUXER 0
+#define CONFIG_SEGMENT_MUXER 0
+#define CONFIG_STREAM_SEGMENT_MUXER 0
+#define CONFIG_SINGLEJPEG_MUXER 0
+#define CONFIG_SMJPEG_MUXER 0
+#define CONFIG_SMOOTHSTREAMING_MUXER 0
+#define CONFIG_SOX_MUXER 0
+#define CONFIG_SPX_MUXER 0
+#define CONFIG_SPDIF_MUXER 0
+#define CONFIG_SRT_MUXER 0
+#define CONFIG_STREAMHASH_MUXER 0
+#define CONFIG_SUP_MUXER 0
+#define CONFIG_SWF_MUXER 0
+#define CONFIG_TEE_MUXER 0
+#define CONFIG_TG2_MUXER 0
+#define CONFIG_TGP_MUXER 0
+#define CONFIG_MKVTIMESTAMP_V2_MUXER 0
+#define CONFIG_TRUEHD_MUXER 0
+#define CONFIG_TTA_MUXER 0
+#define CONFIG_UNCODEDFRAMECRC_MUXER 0
+#define CONFIG_VC1_MUXER 0
+#define CONFIG_VC1T_MUXER 0
+#define CONFIG_VOC_MUXER 0
+#define CONFIG_W64_MUXER 0
+#define CONFIG_WAV_MUXER 0
+#define CONFIG_WEBM_MUXER 0
+#define CONFIG_WEBM_DASH_MANIFEST_MUXER 0
+#define CONFIG_WEBM_CHUNK_MUXER 0
+#define CONFIG_WEBP_MUXER 0
+#define CONFIG_WEBVTT_MUXER 0
+#define CONFIG_WTV_MUXER 0
+#define CONFIG_WV_MUXER 0
+#define CONFIG_YUV4MPEGPIPE_MUXER 0
+#define CONFIG_CHROMAPRINT_MUXER 0
+#define CONFIG_ASYNC_PROTOCOL 0
+#define CONFIG_BLURAY_PROTOCOL 0
+#define CONFIG_CACHE_PROTOCOL 0
+#define CONFIG_CONCAT_PROTOCOL 0
+#define CONFIG_CRYPTO_PROTOCOL 0
+#define CONFIG_DATA_PROTOCOL 0
+#define CONFIG_FFRTMPCRYPT_PROTOCOL 0
+#define CONFIG_FFRTMPHTTP_PROTOCOL 0
+#define CONFIG_FILE_PROTOCOL 0
+#define CONFIG_FTP_PROTOCOL 0
+#define CONFIG_GOPHER_PROTOCOL 0
+#define CONFIG_HLS_PROTOCOL 0
+#define CONFIG_HTTP_PROTOCOL 0
+#define CONFIG_HTTPPROXY_PROTOCOL 0
+#define CONFIG_HTTPS_PROTOCOL 0
+#define CONFIG_ICECAST_PROTOCOL 0
+#define CONFIG_MMSH_PROTOCOL 0
+#define CONFIG_MMST_PROTOCOL 0
+#define CONFIG_MD5_PROTOCOL 0
+#define CONFIG_PIPE_PROTOCOL 0
+#define CONFIG_PROMPEG_PROTOCOL 0
+#define CONFIG_RTMP_PROTOCOL 0
+#define CONFIG_RTMPE_PROTOCOL 0
+#define CONFIG_RTMPS_PROTOCOL 0
+#define CONFIG_RTMPT_PROTOCOL 0
+#define CONFIG_RTMPTE_PROTOCOL 0
+#define CONFIG_RTMPTS_PROTOCOL 0
+#define CONFIG_RTP_PROTOCOL 0
+#define CONFIG_SCTP_PROTOCOL 0
+#define CONFIG_SRTP_PROTOCOL 0
+#define CONFIG_SUBFILE_PROTOCOL 0
+#define CONFIG_TEE_PROTOCOL 0
+#define CONFIG_TCP_PROTOCOL 0
+#define CONFIG_TLS_PROTOCOL 0
+#define CONFIG_UDP_PROTOCOL 0
+#define CONFIG_UDPLITE_PROTOCOL 0
+#define CONFIG_UNIX_PROTOCOL 0
+#define CONFIG_LIBAMQP_PROTOCOL 0
+#define CONFIG_LIBRTMP_PROTOCOL 0
+#define CONFIG_LIBRTMPE_PROTOCOL 0
+#define CONFIG_LIBRTMPS_PROTOCOL 0
+#define CONFIG_LIBRTMPT_PROTOCOL 0
+#define CONFIG_LIBRTMPTE_PROTOCOL 0
+#define CONFIG_LIBSRT_PROTOCOL 0
+#define CONFIG_LIBSSH_PROTOCOL 0
+#define CONFIG_LIBSMBCLIENT_PROTOCOL 0
+#define CONFIG_LIBZMQ_PROTOCOL 0
+#endif /* FFMPEG_CONFIG_H */
diff --git a/fuchsia/config/max/arm64/libavcodec/bsf_list.c b/fuchsia/config/max/arm64/libavcodec/bsf_list.c
new file mode 100644
index 0000000..d31ece9
--- /dev/null
+++ b/fuchsia/config/max/arm64/libavcodec/bsf_list.c
@@ -0,0 +1,3 @@
+static const AVBitStreamFilter * const bitstream_filters[] = {
+ &ff_null_bsf,
+ NULL };
diff --git a/fuchsia/config/max/arm64/libavcodec/codec_list.c b/fuchsia/config/max/arm64/libavcodec/codec_list.c
new file mode 100644
index 0000000..2051e92
--- /dev/null
+++ b/fuchsia/config/max/arm64/libavcodec/codec_list.c
@@ -0,0 +1,28 @@
+static const AVCodec * const codec_list[] = {
+ &ff_h263_decoder,
+ &ff_h264_decoder,
+ &ff_mpeg4_decoder,
+ &ff_theora_decoder,
+ &ff_vp3_decoder,
+ &ff_vp8_decoder,
+ &ff_aac_decoder,
+ &ff_aac_latm_decoder,
+ &ff_amrnb_decoder,
+ &ff_amrwb_decoder,
+ &ff_aptx_decoder,
+ &ff_flac_decoder,
+ &ff_gsm_ms_decoder,
+ &ff_mp3_decoder,
+ &ff_sbc_decoder,
+ &ff_vorbis_decoder,
+ &ff_pcm_alaw_decoder,
+ &ff_pcm_f32le_decoder,
+ &ff_pcm_mulaw_decoder,
+ &ff_pcm_s16be_decoder,
+ &ff_pcm_s16le_decoder,
+ &ff_pcm_s24be_decoder,
+ &ff_pcm_s24le_decoder,
+ &ff_pcm_s32le_decoder,
+ &ff_pcm_u8_decoder,
+ &ff_libopus_decoder,
+ NULL };
diff --git a/fuchsia/config/max/arm64/libavcodec/parser_list.c b/fuchsia/config/max/arm64/libavcodec/parser_list.c
new file mode 100644
index 0000000..06905eb
--- /dev/null
+++ b/fuchsia/config/max/arm64/libavcodec/parser_list.c
@@ -0,0 +1,14 @@
+static const AVCodecParser * const parser_list[] = {
+ &ff_aac_parser,
+ &ff_aac_latm_parser,
+ &ff_flac_parser,
+ &ff_gsm_parser,
+ &ff_h263_parser,
+ &ff_h264_parser,
+ &ff_mpeg4video_parser,
+ &ff_mpegaudio_parser,
+ &ff_opus_parser,
+ &ff_vorbis_parser,
+ &ff_vp3_parser,
+ &ff_vp8_parser,
+ NULL };
diff --git a/fuchsia/config/max/arm64/libavformat/demuxer_list.c b/fuchsia/config/max/arm64/libavformat/demuxer_list.c
new file mode 100644
index 0000000..241417e
--- /dev/null
+++ b/fuchsia/config/max/arm64/libavformat/demuxer_list.c
@@ -0,0 +1,12 @@
+static const AVInputFormat * const demuxer_list[] = {
+ &ff_aac_demuxer,
+ &ff_amr_demuxer,
+ &ff_avi_demuxer,
+ &ff_flac_demuxer,
+ &ff_gsm_demuxer,
+ &ff_matroska_demuxer,
+ &ff_mov_demuxer,
+ &ff_mp3_demuxer,
+ &ff_ogg_demuxer,
+ &ff_wav_demuxer,
+ NULL };
diff --git a/fuchsia/config/max/arm64/libavformat/muxer_list.c b/fuchsia/config/max/arm64/libavformat/muxer_list.c
new file mode 100644
index 0000000..f36d949
--- /dev/null
+++ b/fuchsia/config/max/arm64/libavformat/muxer_list.c
@@ -0,0 +1,2 @@
+static const AVOutputFormat * const muxer_list[] = {
+ NULL };
diff --git a/fuchsia/config/max/arm64/libavformat/protocol_list.c b/fuchsia/config/max/arm64/libavformat/protocol_list.c
new file mode 100644
index 0000000..247e1e4
--- /dev/null
+++ b/fuchsia/config/max/arm64/libavformat/protocol_list.c
@@ -0,0 +1,2 @@
+static const URLProtocol * const url_protocols[] = {
+ NULL };
diff --git a/fuchsia/config/max/arm64/libavutil/avconfig.h b/fuchsia/config/max/arm64/libavutil/avconfig.h
new file mode 100644
index 0000000..c289fbb
--- /dev/null
+++ b/fuchsia/config/max/arm64/libavutil/avconfig.h
@@ -0,0 +1,6 @@
+/* Generated by ffmpeg configure */
+#ifndef AVUTIL_AVCONFIG_H
+#define AVUTIL_AVCONFIG_H
+#define AV_HAVE_BIGENDIAN 0
+#define AV_HAVE_FAST_UNALIGNED 1
+#endif /* AVUTIL_AVCONFIG_H */
diff --git a/fuchsia/config/max/arm64/libavutil/ffversion.h b/fuchsia/config/max/arm64/libavutil/ffversion.h
new file mode 100644
index 0000000..fc76199
--- /dev/null
+++ b/fuchsia/config/max/arm64/libavutil/ffversion.h
@@ -0,0 +1,5 @@
+/* Automatically generated by version.sh, do not manually edit! */
+#ifndef AVUTIL_FFVERSION_H
+#define AVUTIL_FFVERSION_H
+#define FFMPEG_VERSION "N-97662-gaaac2c26d9"
+#endif /* AVUTIL_FFVERSION_H */
diff --git a/fuchsia/config/max/x64/config.asm b/fuchsia/config/max/x64/config.asm
new file mode 100644
index 0000000..c7d35bd
--- /dev/null
+++ b/fuchsia/config/max/x64/config.asm
@@ -0,0 +1,2572 @@
+; Automatically generated by configure - do not modify!
+%define ARCH_AARCH64 0
+%define ARCH_ALPHA 0
+%define ARCH_ARM 0
+%define ARCH_AVR32 0
+%define ARCH_AVR32_AP 0
+%define ARCH_AVR32_UC 0
+%define ARCH_BFIN 0
+%define ARCH_IA64 0
+%define ARCH_M68K 0
+%define ARCH_MIPS 0
+%define ARCH_MIPS64 0
+%define ARCH_PARISC 0
+%define ARCH_PPC 0
+%define ARCH_PPC64 0
+%define ARCH_S390 0
+%define ARCH_SH4 0
+%define ARCH_SPARC 0
+%define ARCH_SPARC64 0
+%define ARCH_TILEGX 0
+%define ARCH_TILEPRO 0
+%define ARCH_TOMI 0
+%define ARCH_X86 1
+%define ARCH_X86_32 0
+%define ARCH_X86_64 1
+%define HAVE_ARMV5TE 0
+%define HAVE_ARMV6 0
+%define HAVE_ARMV6T2 0
+%define HAVE_ARMV8 0
+%define HAVE_NEON 0
+%define HAVE_VFP 0
+%define HAVE_VFPV3 0
+%define HAVE_SETEND 0
+%define HAVE_ALTIVEC 0
+%define HAVE_DCBZL 0
+%define HAVE_LDBRX 0
+%define HAVE_POWER8 0
+%define HAVE_PPC4XX 0
+%define HAVE_VSX 0
+%define HAVE_AESNI 1
+%define HAVE_AMD3DNOW 1
+%define HAVE_AMD3DNOWEXT 1
+%define HAVE_AVX 1
+%define HAVE_AVX2 1
+%define HAVE_AVX512 1
+%define HAVE_FMA3 1
+%define HAVE_FMA4 1
+%define HAVE_MMX 1
+%define HAVE_MMXEXT 1
+%define HAVE_SSE 1
+%define HAVE_SSE2 1
+%define HAVE_SSE3 1
+%define HAVE_SSE4 1
+%define HAVE_SSE42 1
+%define HAVE_SSSE3 1
+%define HAVE_XOP 1
+%define HAVE_CPUNOP 1
+%define HAVE_I686 1
+%define HAVE_MIPSFPU 0
+%define HAVE_MIPS32R2 0
+%define HAVE_MIPS32R5 0
+%define HAVE_MIPS64R2 0
+%define HAVE_MIPS32R6 0
+%define HAVE_MIPS64R6 0
+%define HAVE_MIPSDSP 0
+%define HAVE_MIPSDSPR2 0
+%define HAVE_MSA 0
+%define HAVE_MSA2 0
+%define HAVE_LOONGSON2 0
+%define HAVE_LOONGSON3 0
+%define HAVE_MMI 0
+%define HAVE_ARMV5TE_EXTERNAL 0
+%define HAVE_ARMV6_EXTERNAL 0
+%define HAVE_ARMV6T2_EXTERNAL 0
+%define HAVE_ARMV8_EXTERNAL 0
+%define HAVE_NEON_EXTERNAL 0
+%define HAVE_VFP_EXTERNAL 0
+%define HAVE_VFPV3_EXTERNAL 0
+%define HAVE_SETEND_EXTERNAL 0
+%define HAVE_ALTIVEC_EXTERNAL 0
+%define HAVE_DCBZL_EXTERNAL 0
+%define HAVE_LDBRX_EXTERNAL 0
+%define HAVE_POWER8_EXTERNAL 0
+%define HAVE_PPC4XX_EXTERNAL 0
+%define HAVE_VSX_EXTERNAL 0
+%define HAVE_AESNI_EXTERNAL 1
+%define HAVE_AMD3DNOW_EXTERNAL 1
+%define HAVE_AMD3DNOWEXT_EXTERNAL 1
+%define HAVE_AVX_EXTERNAL 1
+%define HAVE_AVX2_EXTERNAL 1
+%define HAVE_AVX512_EXTERNAL 0
+%define HAVE_FMA3_EXTERNAL 1
+%define HAVE_FMA4_EXTERNAL 1
+%define HAVE_MMX_EXTERNAL 1
+%define HAVE_MMXEXT_EXTERNAL 1
+%define HAVE_SSE_EXTERNAL 1
+%define HAVE_SSE2_EXTERNAL 1
+%define HAVE_SSE3_EXTERNAL 1
+%define HAVE_SSE4_EXTERNAL 1
+%define HAVE_SSE42_EXTERNAL 1
+%define HAVE_SSSE3_EXTERNAL 1
+%define HAVE_XOP_EXTERNAL 1
+%define HAVE_CPUNOP_EXTERNAL 0
+%define HAVE_I686_EXTERNAL 0
+%define HAVE_MIPSFPU_EXTERNAL 0
+%define HAVE_MIPS32R2_EXTERNAL 0
+%define HAVE_MIPS32R5_EXTERNAL 0
+%define HAVE_MIPS64R2_EXTERNAL 0
+%define HAVE_MIPS32R6_EXTERNAL 0
+%define HAVE_MIPS64R6_EXTERNAL 0
+%define HAVE_MIPSDSP_EXTERNAL 0
+%define HAVE_MIPSDSPR2_EXTERNAL 0
+%define HAVE_MSA_EXTERNAL 0
+%define HAVE_MSA2_EXTERNAL 0
+%define HAVE_LOONGSON2_EXTERNAL 0
+%define HAVE_LOONGSON3_EXTERNAL 0
+%define HAVE_MMI_EXTERNAL 0
+%define HAVE_ARMV5TE_INLINE 0
+%define HAVE_ARMV6_INLINE 0
+%define HAVE_ARMV6T2_INLINE 0
+%define HAVE_ARMV8_INLINE 0
+%define HAVE_NEON_INLINE 0
+%define HAVE_VFP_INLINE 0
+%define HAVE_VFPV3_INLINE 0
+%define HAVE_SETEND_INLINE 0
+%define HAVE_ALTIVEC_INLINE 0
+%define HAVE_DCBZL_INLINE 0
+%define HAVE_LDBRX_INLINE 0
+%define HAVE_POWER8_INLINE 0
+%define HAVE_PPC4XX_INLINE 0
+%define HAVE_VSX_INLINE 0
+%define HAVE_AESNI_INLINE 1
+%define HAVE_AMD3DNOW_INLINE 1
+%define HAVE_AMD3DNOWEXT_INLINE 1
+%define HAVE_AVX_INLINE 1
+%define HAVE_AVX2_INLINE 1
+%define HAVE_AVX512_INLINE 1
+%define HAVE_FMA3_INLINE 1
+%define HAVE_FMA4_INLINE 1
+%define HAVE_MMX_INLINE 1
+%define HAVE_MMXEXT_INLINE 1
+%define HAVE_SSE_INLINE 1
+%define HAVE_SSE2_INLINE 1
+%define HAVE_SSE3_INLINE 1
+%define HAVE_SSE4_INLINE 1
+%define HAVE_SSE42_INLINE 1
+%define HAVE_SSSE3_INLINE 1
+%define HAVE_XOP_INLINE 1
+%define HAVE_CPUNOP_INLINE 0
+%define HAVE_I686_INLINE 0
+%define HAVE_MIPSFPU_INLINE 0
+%define HAVE_MIPS32R2_INLINE 0
+%define HAVE_MIPS32R5_INLINE 0
+%define HAVE_MIPS64R2_INLINE 0
+%define HAVE_MIPS32R6_INLINE 0
+%define HAVE_MIPS64R6_INLINE 0
+%define HAVE_MIPSDSP_INLINE 0
+%define HAVE_MIPSDSPR2_INLINE 0
+%define HAVE_MSA_INLINE 0
+%define HAVE_MSA2_INLINE 0
+%define HAVE_LOONGSON2_INLINE 0
+%define HAVE_LOONGSON3_INLINE 0
+%define HAVE_MMI_INLINE 0
+%define HAVE_ALIGNED_STACK 1
+%define HAVE_FAST_64BIT 1
+%define HAVE_FAST_CLZ 1
+%define HAVE_FAST_CMOV 1
+%define HAVE_LOCAL_ALIGNED 1
+%define HAVE_SIMD_ALIGN_16 1
+%define HAVE_SIMD_ALIGN_32 1
+%define HAVE_SIMD_ALIGN_64 1
+%define HAVE_ATOMIC_CAS_PTR 0
+%define HAVE_MACHINE_RW_BARRIER 0
+%define HAVE_MEMORYBARRIER 0
+%define HAVE_MM_EMPTY 1
+%define HAVE_RDTSC 0
+%define HAVE_SEM_TIMEDWAIT 1
+%define HAVE_SYNC_VAL_COMPARE_AND_SWAP 1
+%define HAVE_CABS 0
+%define HAVE_CEXP 0
+%define HAVE_INLINE_ASM 1
+%define HAVE_SYMVER 0
+%define HAVE_X86ASM 1
+%define HAVE_BIGENDIAN 0
+%define HAVE_FAST_UNALIGNED 1
+%define HAVE_ARPA_INET_H 0
+%define HAVE_ASM_TYPES_H 1
+%define HAVE_CDIO_PARANOIA_H 0
+%define HAVE_CDIO_PARANOIA_PARANOIA_H 0
+%define HAVE_CUDA_H 0
+%define HAVE_DISPATCH_DISPATCH_H 0
+%define HAVE_DEV_BKTR_IOCTL_BT848_H 0
+%define HAVE_DEV_BKTR_IOCTL_METEOR_H 0
+%define HAVE_DEV_IC_BT8XX_H 0
+%define HAVE_DEV_VIDEO_BKTR_IOCTL_BT848_H 0
+%define HAVE_DEV_VIDEO_METEOR_IOCTL_METEOR_H 0
+%define HAVE_DIRECT_H 0
+%define HAVE_DIRENT_H 1
+%define HAVE_DXGIDEBUG_H 0
+%define HAVE_DXVA_H 0
+%define HAVE_ES2_GL_H 0
+%define HAVE_GSM_H 0
+%define HAVE_IO_H 0
+%define HAVE_LINUX_PERF_EVENT_H 1
+%define HAVE_MACHINE_IOCTL_BT848_H 0
+%define HAVE_MACHINE_IOCTL_METEOR_H 0
+%define HAVE_MALLOC_H 1
+%define HAVE_OPENCV2_CORE_CORE_C_H 0
+%define HAVE_OPENGL_GL3_H 0
+%define HAVE_POLL_H 1
+%define HAVE_SYS_PARAM_H 1
+%define HAVE_SYS_RESOURCE_H 1
+%define HAVE_SYS_SELECT_H 1
+%define HAVE_SYS_SOUNDCARD_H 1
+%define HAVE_SYS_TIME_H 1
+%define HAVE_SYS_UN_H 1
+%define HAVE_SYS_VIDEOIO_H 0
+%define HAVE_TERMIOS_H 1
+%define HAVE_UDPLITE_H 0
+%define HAVE_UNISTD_H 1
+%define HAVE_VALGRIND_VALGRIND_H 0
+%define HAVE_WINDOWS_H 0
+%define HAVE_WINSOCK2_H 0
+%define HAVE_INTRINSICS_NEON 0
+%define HAVE_ATANF 1
+%define HAVE_ATAN2F 1
+%define HAVE_CBRT 1
+%define HAVE_CBRTF 1
+%define HAVE_COPYSIGN 1
+%define HAVE_COSF 1
+%define HAVE_ERF 1
+%define HAVE_EXP2 1
+%define HAVE_EXP2F 1
+%define HAVE_EXPF 1
+%define HAVE_HYPOT 1
+%define HAVE_ISFINITE 1
+%define HAVE_ISINF 1
+%define HAVE_ISNAN 1
+%define HAVE_LDEXPF 1
+%define HAVE_LLRINT 1
+%define HAVE_LLRINTF 1
+%define HAVE_LOG2 1
+%define HAVE_LOG2F 1
+%define HAVE_LOG10F 1
+%define HAVE_LRINT 1
+%define HAVE_LRINTF 1
+%define HAVE_POWF 1
+%define HAVE_RINT 1
+%define HAVE_ROUND 1
+%define HAVE_ROUNDF 1
+%define HAVE_SINF 1
+%define HAVE_TRUNC 1
+%define HAVE_TRUNCF 1
+%define HAVE_DOS_PATHS 0
+%define HAVE_LIBC_MSVCRT 0
+%define HAVE_MMAL_PARAMETER_VIDEO_MAX_NUM_CALLBACKS 0
+%define HAVE_SECTION_DATA_REL_RO 1
+%define HAVE_THREADS 1
+%define HAVE_UWP 0
+%define HAVE_WINRT 0
+%define HAVE_ACCESS 1
+%define HAVE_ALIGNED_MALLOC 0
+%define HAVE_ARC4RANDOM 0
+%define HAVE_CLOCK_GETTIME 1
+%define HAVE_CLOSESOCKET 0
+%define HAVE_COMMANDLINETOARGVW 0
+%define HAVE_FCNTL 1
+%define HAVE_GETADDRINFO 0
+%define HAVE_GETHRTIME 0
+%define HAVE_GETOPT 1
+%define HAVE_GETMODULEHANDLE 0
+%define HAVE_GETPROCESSAFFINITYMASK 0
+%define HAVE_GETPROCESSMEMORYINFO 0
+%define HAVE_GETPROCESSTIMES 0
+%define HAVE_GETRUSAGE 1
+%define HAVE_GETSTDHANDLE 0
+%define HAVE_GETSYSTEMTIMEASFILETIME 0
+%define HAVE_GETTIMEOFDAY 1
+%define HAVE_GLOB 1
+%define HAVE_GLXGETPROCADDRESS 0
+%define HAVE_GMTIME_R 1
+%define HAVE_INET_ATON 0
+%define HAVE_ISATTY 1
+%define HAVE_KBHIT 0
+%define HAVE_LOCALTIME_R 1
+%define HAVE_LSTAT 1
+%define HAVE_LZO1X_999_COMPRESS 0
+%define HAVE_MACH_ABSOLUTE_TIME 0
+%define HAVE_MAPVIEWOFFILE 0
+%define HAVE_MEMALIGN 1
+%define HAVE_MKSTEMP 1
+%define HAVE_MMAP 1
+%define HAVE_MPROTECT 1
+%define HAVE_NANOSLEEP 1
+%define HAVE_PEEKNAMEDPIPE 0
+%define HAVE_POSIX_MEMALIGN 1
+%define HAVE_PTHREAD_CANCEL 1
+%define HAVE_SCHED_GETAFFINITY 1
+%define HAVE_SECITEMIMPORT 0
+%define HAVE_SETCONSOLETEXTATTRIBUTE 0
+%define HAVE_SETCONSOLECTRLHANDLER 0
+%define HAVE_SETDLLDIRECTORY 0
+%define HAVE_SETMODE 0
+%define HAVE_SETRLIMIT 1
+%define HAVE_SLEEP 0
+%define HAVE_STRERROR_R 1
+%define HAVE_SYSCONF 1
+%define HAVE_SYSCTL 1
+%define HAVE_USLEEP 1
+%define HAVE_UTGETOSTYPEFROMSTRING 0
+%define HAVE_VIRTUALALLOC 0
+%define HAVE_WGLGETPROCADDRESS 0
+%define HAVE_BCRYPT 0
+%define HAVE_VAAPI_DRM 0
+%define HAVE_VAAPI_X11 0
+%define HAVE_VDPAU_X11 0
+%define HAVE_PTHREADS 1
+%define HAVE_OS2THREADS 0
+%define HAVE_W32THREADS 0
+%define HAVE_AS_ARCH_DIRECTIVE 0
+%define HAVE_AS_DN_DIRECTIVE 0
+%define HAVE_AS_FPU_DIRECTIVE 0
+%define HAVE_AS_FUNC 0
+%define HAVE_AS_OBJECT_ARCH 0
+%define HAVE_ASM_MOD_Q 0
+%define HAVE_BLOCKS_EXTENSION 0
+%define HAVE_EBP_AVAILABLE 1
+%define HAVE_EBX_AVAILABLE 1
+%define HAVE_GNU_AS 0
+%define HAVE_GNU_WINDRES 0
+%define HAVE_IBM_ASM 0
+%define HAVE_INLINE_ASM_DIRECT_SYMBOL_REFS 0
+%define HAVE_INLINE_ASM_LABELS 1
+%define HAVE_INLINE_ASM_NONLOCAL_LABELS 1
+%define HAVE_PRAGMA_DEPRECATED 1
+%define HAVE_RSYNC_CONTIMEOUT 1
+%define HAVE_SYMVER_ASM_LABEL 1
+%define HAVE_SYMVER_GNU_ASM 1
+%define HAVE_VFP_ARGS 0
+%define HAVE_XFORM_ASM 0
+%define HAVE_XMM_CLOBBERS 1
+%define HAVE_KCMVIDEOCODECTYPE_HEVC 0
+%define HAVE_KCVPIXELFORMATTYPE_420YPCBCR10BIPLANARVIDEORANGE 0
+%define HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_SMPTE_ST_2084_PQ 0
+%define HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_ITU_R_2100_HLG 0
+%define HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_LINEAR 0
+%define HAVE_SOCKLEN_T 0
+%define HAVE_STRUCT_ADDRINFO 0
+%define HAVE_STRUCT_GROUP_SOURCE_REQ 0
+%define HAVE_STRUCT_IP_MREQ_SOURCE 0
+%define HAVE_STRUCT_IPV6_MREQ 0
+%define HAVE_STRUCT_MSGHDR_MSG_FLAGS 0
+%define HAVE_STRUCT_POLLFD 0
+%define HAVE_STRUCT_RUSAGE_RU_MAXRSS 1
+%define HAVE_STRUCT_SCTP_EVENT_SUBSCRIBE 0
+%define HAVE_STRUCT_SOCKADDR_IN6 0
+%define HAVE_STRUCT_SOCKADDR_SA_LEN 0
+%define HAVE_STRUCT_SOCKADDR_STORAGE 0
+%define HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC 1
+%define HAVE_STRUCT_V4L2_FRMIVALENUM_DISCRETE 0
+%define HAVE_MAKEINFO 0
+%define HAVE_MAKEINFO_HTML 0
+%define HAVE_OPENCL_D3D11 0
+%define HAVE_OPENCL_DRM_ARM 0
+%define HAVE_OPENCL_DRM_BEIGNET 0
+%define HAVE_OPENCL_DXVA2 0
+%define HAVE_OPENCL_VAAPI_BEIGNET 0
+%define HAVE_OPENCL_VAAPI_INTEL_MEDIA 0
+%define HAVE_PERL 1
+%define HAVE_POD2MAN 1
+%define HAVE_TEXI2HTML 0
+%define CONFIG_DOC 0
+%define CONFIG_HTMLPAGES 0
+%define CONFIG_MANPAGES 0
+%define CONFIG_PODPAGES 0
+%define CONFIG_TXTPAGES 0
+%define CONFIG_AVIO_LIST_DIR_EXAMPLE 1
+%define CONFIG_AVIO_READING_EXAMPLE 1
+%define CONFIG_DECODE_AUDIO_EXAMPLE 1
+%define CONFIG_DECODE_VIDEO_EXAMPLE 1
+%define CONFIG_DEMUXING_DECODING_EXAMPLE 1
+%define CONFIG_ENCODE_AUDIO_EXAMPLE 1
+%define CONFIG_ENCODE_VIDEO_EXAMPLE 1
+%define CONFIG_EXTRACT_MVS_EXAMPLE 1
+%define CONFIG_FILTER_AUDIO_EXAMPLE 0
+%define CONFIG_FILTERING_AUDIO_EXAMPLE 0
+%define CONFIG_FILTERING_VIDEO_EXAMPLE 0
+%define CONFIG_HTTP_MULTICLIENT_EXAMPLE 1
+%define CONFIG_HW_DECODE_EXAMPLE 1
+%define CONFIG_METADATA_EXAMPLE 1
+%define CONFIG_MUXING_EXAMPLE 0
+%define CONFIG_QSVDEC_EXAMPLE 0
+%define CONFIG_REMUXING_EXAMPLE 1
+%define CONFIG_RESAMPLING_AUDIO_EXAMPLE 0
+%define CONFIG_SCALING_VIDEO_EXAMPLE 0
+%define CONFIG_TRANSCODE_AAC_EXAMPLE 0
+%define CONFIG_TRANSCODING_EXAMPLE 0
+%define CONFIG_VAAPI_ENCODE_EXAMPLE 0
+%define CONFIG_VAAPI_TRANSCODE_EXAMPLE 0
+%define CONFIG_AVISYNTH 0
+%define CONFIG_FREI0R 0
+%define CONFIG_LIBCDIO 0
+%define CONFIG_LIBDAVS2 0
+%define CONFIG_LIBRUBBERBAND 0
+%define CONFIG_LIBVIDSTAB 0
+%define CONFIG_LIBX264 0
+%define CONFIG_LIBX265 0
+%define CONFIG_LIBXAVS 0
+%define CONFIG_LIBXAVS2 0
+%define CONFIG_LIBXVID 0
+%define CONFIG_DECKLINK 0
+%define CONFIG_LIBFDK_AAC 0
+%define CONFIG_OPENSSL 0
+%define CONFIG_LIBTLS 0
+%define CONFIG_GMP 0
+%define CONFIG_LIBARIBB24 0
+%define CONFIG_LIBLENSFUN 0
+%define CONFIG_LIBOPENCORE_AMRNB 0
+%define CONFIG_LIBOPENCORE_AMRWB 0
+%define CONFIG_LIBVMAF 0
+%define CONFIG_LIBVO_AMRWBENC 0
+%define CONFIG_MBEDTLS 0
+%define CONFIG_RKMPP 0
+%define CONFIG_LIBSMBCLIENT 0
+%define CONFIG_CHROMAPRINT 0
+%define CONFIG_GCRYPT 0
+%define CONFIG_GNUTLS 0
+%define CONFIG_JNI 0
+%define CONFIG_LADSPA 0
+%define CONFIG_LIBAOM 0
+%define CONFIG_LIBASS 0
+%define CONFIG_LIBBLURAY 0
+%define CONFIG_LIBBS2B 0
+%define CONFIG_LIBCACA 0
+%define CONFIG_LIBCELT 0
+%define CONFIG_LIBCODEC2 0
+%define CONFIG_LIBDAV1D 0
+%define CONFIG_LIBDC1394 0
+%define CONFIG_LIBDRM 0
+%define CONFIG_LIBFLITE 0
+%define CONFIG_LIBFONTCONFIG 0
+%define CONFIG_LIBFREETYPE 0
+%define CONFIG_LIBFRIBIDI 0
+%define CONFIG_LIBGLSLANG 0
+%define CONFIG_LIBGME 0
+%define CONFIG_LIBGSM 0
+%define CONFIG_LIBIEC61883 0
+%define CONFIG_LIBILBC 0
+%define CONFIG_LIBJACK 0
+%define CONFIG_LIBKLVANC 0
+%define CONFIG_LIBKVAZAAR 0
+%define CONFIG_LIBMODPLUG 0
+%define CONFIG_LIBMP3LAME 0
+%define CONFIG_LIBMYSOFA 0
+%define CONFIG_LIBOPENCV 0
+%define CONFIG_LIBOPENH264 0
+%define CONFIG_LIBOPENJPEG 0
+%define CONFIG_LIBOPENMPT 0
+%define CONFIG_LIBOPUS 1
+%define CONFIG_LIBPULSE 0
+%define CONFIG_LIBRABBITMQ 0
+%define CONFIG_LIBRAV1E 0
+%define CONFIG_LIBRSVG 0
+%define CONFIG_LIBRTMP 0
+%define CONFIG_LIBSHINE 0
+%define CONFIG_LIBSMBCLIENT 0
+%define CONFIG_LIBSNAPPY 0
+%define CONFIG_LIBSOXR 0
+%define CONFIG_LIBSPEEX 0
+%define CONFIG_LIBSRT 0
+%define CONFIG_LIBSSH 0
+%define CONFIG_LIBTENSORFLOW 0
+%define CONFIG_LIBTESSERACT 0
+%define CONFIG_LIBTHEORA 0
+%define CONFIG_LIBTWOLAME 0
+%define CONFIG_LIBV4L2 0
+%define CONFIG_LIBVORBIS 0
+%define CONFIG_LIBVPX 0
+%define CONFIG_LIBWAVPACK 0
+%define CONFIG_LIBWEBP 0
+%define CONFIG_LIBXML2 0
+%define CONFIG_LIBZIMG 0
+%define CONFIG_LIBZMQ 0
+%define CONFIG_LIBZVBI 0
+%define CONFIG_LV2 0
+%define CONFIG_MEDIACODEC 0
+%define CONFIG_OPENAL 0
+%define CONFIG_OPENGL 0
+%define CONFIG_POCKETSPHINX 0
+%define CONFIG_VAPOURSYNTH 0
+%define CONFIG_ALSA 0
+%define CONFIG_APPKIT 0
+%define CONFIG_AVFOUNDATION 0
+%define CONFIG_BZLIB 0
+%define CONFIG_COREIMAGE 0
+%define CONFIG_ICONV 0
+%define CONFIG_LIBXCB 0
+%define CONFIG_LIBXCB_SHM 0
+%define CONFIG_LIBXCB_SHAPE 0
+%define CONFIG_LIBXCB_XFIXES 0
+%define CONFIG_LZMA 0
+%define CONFIG_SCHANNEL 0
+%define CONFIG_SDL2 0
+%define CONFIG_SECURETRANSPORT 0
+%define CONFIG_SNDIO 0
+%define CONFIG_XLIB 0
+%define CONFIG_ZLIB 0
+%define CONFIG_CUDA_NVCC 0
+%define CONFIG_CUDA_SDK 0
+%define CONFIG_LIBNPP 0
+%define CONFIG_LIBMFX 0
+%define CONFIG_MMAL 0
+%define CONFIG_OMX 0
+%define CONFIG_OPENCL 0
+%define CONFIG_VULKAN 0
+%define CONFIG_AMF 0
+%define CONFIG_AUDIOTOOLBOX 0
+%define CONFIG_CRYSTALHD 0
+%define CONFIG_CUDA 0
+%define CONFIG_CUDA_LLVM 0
+%define CONFIG_CUVID 0
+%define CONFIG_D3D11VA 0
+%define CONFIG_DXVA2 0
+%define CONFIG_FFNVCODEC 0
+%define CONFIG_NVDEC 0
+%define CONFIG_NVENC 0
+%define CONFIG_VAAPI 0
+%define CONFIG_VDPAU 0
+%define CONFIG_VIDEOTOOLBOX 0
+%define CONFIG_V4L2_M2M 0
+%define CONFIG_XVMC 0
+%define CONFIG_FTRAPV 0
+%define CONFIG_GRAY 0
+%define CONFIG_HARDCODED_TABLES 0
+%define CONFIG_OMX_RPI 0
+%define CONFIG_RUNTIME_CPUDETECT 1
+%define CONFIG_SAFE_BITSTREAM_READER 1
+%define CONFIG_SHARED 0
+%define CONFIG_SMALL 0
+%define CONFIG_STATIC 1
+%define CONFIG_SWSCALE_ALPHA 1
+%define CONFIG_GPL 0
+%define CONFIG_NONFREE 0
+%define CONFIG_VERSION3 0
+%define CONFIG_AVDEVICE 0
+%define CONFIG_AVFILTER 0
+%define CONFIG_SWSCALE 0
+%define CONFIG_POSTPROC 0
+%define CONFIG_AVFORMAT 1
+%define CONFIG_AVCODEC 1
+%define CONFIG_SWRESAMPLE 0
+%define CONFIG_AVRESAMPLE 0
+%define CONFIG_AVUTIL 1
+%define CONFIG_FFPLAY 0
+%define CONFIG_FFPROBE 0
+%define CONFIG_FFMPEG 0
+%define CONFIG_DCT 1
+%define CONFIG_DWT 0
+%define CONFIG_ERROR_RESILIENCE 1
+%define CONFIG_FAAN 0
+%define CONFIG_FAST_UNALIGNED 1
+%define CONFIG_FFT 1
+%define CONFIG_LSP 1
+%define CONFIG_LZO 0
+%define CONFIG_MDCT 1
+%define CONFIG_PIXELUTILS 0
+%define CONFIG_NETWORK 0
+%define CONFIG_RDFT 1
+%define CONFIG_AUTODETECT 0
+%define CONFIG_FONTCONFIG 0
+%define CONFIG_LARGE_TESTS 1
+%define CONFIG_LINUX_PERF 0
+%define CONFIG_MEMORY_POISONING 0
+%define CONFIG_NEON_CLOBBER_TEST 0
+%define CONFIG_OSSFUZZ 0
+%define CONFIG_PIC 1
+%define CONFIG_THUMB 0
+%define CONFIG_VALGRIND_BACKTRACE 0
+%define CONFIG_XMM_CLOBBER_TEST 0
+%define CONFIG_BSFS 1
+%define CONFIG_DECODERS 1
+%define CONFIG_ENCODERS 0
+%define CONFIG_HWACCELS 0
+%define CONFIG_PARSERS 1
+%define CONFIG_INDEVS 0
+%define CONFIG_OUTDEVS 0
+%define CONFIG_FILTERS 0
+%define CONFIG_DEMUXERS 1
+%define CONFIG_MUXERS 0
+%define CONFIG_PROTOCOLS 0
+%define CONFIG_AANDCTTABLES 0
+%define CONFIG_AC3DSP 0
+%define CONFIG_ADTS_HEADER 1
+%define CONFIG_AUDIO_FRAME_QUEUE 1
+%define CONFIG_AUDIODSP 0
+%define CONFIG_BLOCKDSP 1
+%define CONFIG_BSWAPDSP 0
+%define CONFIG_CABAC 1
+%define CONFIG_CBS 0
+%define CONFIG_CBS_AV1 0
+%define CONFIG_CBS_H264 0
+%define CONFIG_CBS_H265 0
+%define CONFIG_CBS_JPEG 0
+%define CONFIG_CBS_MPEG2 0
+%define CONFIG_CBS_VP9 0
+%define CONFIG_DIRAC_PARSE 1
+%define CONFIG_DNN 0
+%define CONFIG_DVPROFILE 0
+%define CONFIG_EXIF 1
+%define CONFIG_FAANDCT 0
+%define CONFIG_FAANIDCT 0
+%define CONFIG_FDCTDSP 1
+%define CONFIG_FLACDSP 1
+%define CONFIG_FMTCONVERT 0
+%define CONFIG_FRAME_THREAD_ENCODER 0
+%define CONFIG_G722DSP 0
+%define CONFIG_GOLOMB 1
+%define CONFIG_GPLV3 0
+%define CONFIG_H263DSP 1
+%define CONFIG_H264CHROMA 1
+%define CONFIG_H264DSP 1
+%define CONFIG_H264PARSE 1
+%define CONFIG_H264PRED 1
+%define CONFIG_H264QPEL 1
+%define CONFIG_HEVCPARSE 0
+%define CONFIG_HPELDSP 1
+%define CONFIG_HUFFMAN 0
+%define CONFIG_HUFFYUVDSP 0
+%define CONFIG_HUFFYUVENCDSP 0
+%define CONFIG_IDCTDSP 1
+%define CONFIG_IIRFILTER 0
+%define CONFIG_MDCT15 1
+%define CONFIG_INTRAX8 0
+%define CONFIG_ISO_MEDIA 1
+%define CONFIG_IVIDSP 0
+%define CONFIG_JPEGTABLES 0
+%define CONFIG_LGPLV3 0
+%define CONFIG_LIBX262 0
+%define CONFIG_LLAUDDSP 0
+%define CONFIG_LLVIDDSP 0
+%define CONFIG_LLVIDENCDSP 0
+%define CONFIG_LPC 0
+%define CONFIG_LZF 0
+%define CONFIG_ME_CMP 1
+%define CONFIG_MPEG_ER 1
+%define CONFIG_MPEGAUDIO 1
+%define CONFIG_MPEGAUDIODSP 1
+%define CONFIG_MPEGAUDIOHEADER 1
+%define CONFIG_MPEGVIDEO 1
+%define CONFIG_MPEGVIDEOENC 0
+%define CONFIG_MSS34DSP 0
+%define CONFIG_PIXBLOCKDSP 1
+%define CONFIG_QPELDSP 1
+%define CONFIG_QSV 0
+%define CONFIG_QSVDEC 0
+%define CONFIG_QSVENC 0
+%define CONFIG_QSVVPP 0
+%define CONFIG_RANGECODER 0
+%define CONFIG_RIFFDEC 1
+%define CONFIG_RIFFENC 0
+%define CONFIG_RTPDEC 0
+%define CONFIG_RTPENC_CHAIN 0
+%define CONFIG_RV34DSP 0
+%define CONFIG_SCENE_SAD 0
+%define CONFIG_SINEWIN 1
+%define CONFIG_SNAPPY 0
+%define CONFIG_SRTP 0
+%define CONFIG_STARTCODE 1
+%define CONFIG_TEXTUREDSP 0
+%define CONFIG_TEXTUREDSPENC 0
+%define CONFIG_TPELDSP 0
+%define CONFIG_VAAPI_1 0
+%define CONFIG_VAAPI_ENCODE 0
+%define CONFIG_VC1DSP 0
+%define CONFIG_VIDEODSP 1
+%define CONFIG_VP3DSP 1
+%define CONFIG_VP56DSP 0
+%define CONFIG_VP8DSP 1
+%define CONFIG_WMA_FREQS 0
+%define CONFIG_WMV2DSP 0
+%define CONFIG_AAC_ADTSTOASC_BSF 0
+%define CONFIG_AV1_FRAME_MERGE_BSF 0
+%define CONFIG_AV1_FRAME_SPLIT_BSF 0
+%define CONFIG_AV1_METADATA_BSF 0
+%define CONFIG_CHOMP_BSF 0
+%define CONFIG_DUMP_EXTRADATA_BSF 0
+%define CONFIG_DCA_CORE_BSF 0
+%define CONFIG_EAC3_CORE_BSF 0
+%define CONFIG_EXTRACT_EXTRADATA_BSF 0
+%define CONFIG_FILTER_UNITS_BSF 0
+%define CONFIG_H264_METADATA_BSF 0
+%define CONFIG_H264_MP4TOANNEXB_BSF 0
+%define CONFIG_H264_REDUNDANT_PPS_BSF 0
+%define CONFIG_HAPQA_EXTRACT_BSF 0
+%define CONFIG_HEVC_METADATA_BSF 0
+%define CONFIG_HEVC_MP4TOANNEXB_BSF 0
+%define CONFIG_IMX_DUMP_HEADER_BSF 0
+%define CONFIG_MJPEG2JPEG_BSF 0
+%define CONFIG_MJPEGA_DUMP_HEADER_BSF 0
+%define CONFIG_MP3_HEADER_DECOMPRESS_BSF 0
+%define CONFIG_MPEG2_METADATA_BSF 0
+%define CONFIG_MPEG4_UNPACK_BFRAMES_BSF 0
+%define CONFIG_MOV2TEXTSUB_BSF 0
+%define CONFIG_NOISE_BSF 0
+%define CONFIG_NULL_BSF 1
+%define CONFIG_PRORES_METADATA_BSF 0
+%define CONFIG_REMOVE_EXTRADATA_BSF 0
+%define CONFIG_TEXT2MOVSUB_BSF 0
+%define CONFIG_TRACE_HEADERS_BSF 0
+%define CONFIG_TRUEHD_CORE_BSF 0
+%define CONFIG_VP9_METADATA_BSF 0
+%define CONFIG_VP9_RAW_REORDER_BSF 0
+%define CONFIG_VP9_SUPERFRAME_BSF 0
+%define CONFIG_VP9_SUPERFRAME_SPLIT_BSF 1
+%define CONFIG_AASC_DECODER 0
+%define CONFIG_AIC_DECODER 0
+%define CONFIG_ALIAS_PIX_DECODER 0
+%define CONFIG_AGM_DECODER 0
+%define CONFIG_AMV_DECODER 0
+%define CONFIG_ANM_DECODER 0
+%define CONFIG_ANSI_DECODER 0
+%define CONFIG_APNG_DECODER 0
+%define CONFIG_ARBC_DECODER 0
+%define CONFIG_ASV1_DECODER 0
+%define CONFIG_ASV2_DECODER 0
+%define CONFIG_AURA_DECODER 0
+%define CONFIG_AURA2_DECODER 0
+%define CONFIG_AVRP_DECODER 0
+%define CONFIG_AVRN_DECODER 0
+%define CONFIG_AVS_DECODER 0
+%define CONFIG_AVUI_DECODER 0
+%define CONFIG_AYUV_DECODER 0
+%define CONFIG_BETHSOFTVID_DECODER 0
+%define CONFIG_BFI_DECODER 0
+%define CONFIG_BINK_DECODER 0
+%define CONFIG_BITPACKED_DECODER 0
+%define CONFIG_BMP_DECODER 0
+%define CONFIG_BMV_VIDEO_DECODER 0
+%define CONFIG_BRENDER_PIX_DECODER 0
+%define CONFIG_C93_DECODER 0
+%define CONFIG_CAVS_DECODER 0
+%define CONFIG_CDGRAPHICS_DECODER 0
+%define CONFIG_CDTOONS_DECODER 0
+%define CONFIG_CDXL_DECODER 0
+%define CONFIG_CFHD_DECODER 0
+%define CONFIG_CINEPAK_DECODER 0
+%define CONFIG_CLEARVIDEO_DECODER 0
+%define CONFIG_CLJR_DECODER 0
+%define CONFIG_CLLC_DECODER 0
+%define CONFIG_COMFORTNOISE_DECODER 0
+%define CONFIG_CPIA_DECODER 0
+%define CONFIG_CSCD_DECODER 0
+%define CONFIG_CYUV_DECODER 0
+%define CONFIG_DDS_DECODER 0
+%define CONFIG_DFA_DECODER 0
+%define CONFIG_DIRAC_DECODER 0
+%define CONFIG_DNXHD_DECODER 0
+%define CONFIG_DPX_DECODER 0
+%define CONFIG_DSICINVIDEO_DECODER 0
+%define CONFIG_DVAUDIO_DECODER 0
+%define CONFIG_DVVIDEO_DECODER 0
+%define CONFIG_DXA_DECODER 0
+%define CONFIG_DXTORY_DECODER 0
+%define CONFIG_DXV_DECODER 0
+%define CONFIG_EACMV_DECODER 0
+%define CONFIG_EAMAD_DECODER 0
+%define CONFIG_EATGQ_DECODER 0
+%define CONFIG_EATGV_DECODER 0
+%define CONFIG_EATQI_DECODER 0
+%define CONFIG_EIGHTBPS_DECODER 0
+%define CONFIG_EIGHTSVX_EXP_DECODER 0
+%define CONFIG_EIGHTSVX_FIB_DECODER 0
+%define CONFIG_ESCAPE124_DECODER 0
+%define CONFIG_ESCAPE130_DECODER 0
+%define CONFIG_EXR_DECODER 0
+%define CONFIG_FFV1_DECODER 0
+%define CONFIG_FFVHUFF_DECODER 0
+%define CONFIG_FIC_DECODER 0
+%define CONFIG_FITS_DECODER 0
+%define CONFIG_FLASHSV_DECODER 0
+%define CONFIG_FLASHSV2_DECODER 0
+%define CONFIG_FLIC_DECODER 0
+%define CONFIG_FLV_DECODER 0
+%define CONFIG_FMVC_DECODER 0
+%define CONFIG_FOURXM_DECODER 0
+%define CONFIG_FRAPS_DECODER 0
+%define CONFIG_FRWU_DECODER 0
+%define CONFIG_G2M_DECODER 0
+%define CONFIG_GDV_DECODER 0
+%define CONFIG_GIF_DECODER 0
+%define CONFIG_H261_DECODER 0
+%define CONFIG_H263_DECODER 1
+%define CONFIG_H263I_DECODER 0
+%define CONFIG_H263P_DECODER 0
+%define CONFIG_H263_V4L2M2M_DECODER 0
+%define CONFIG_H264_DECODER 1
+%define CONFIG_H264_CRYSTALHD_DECODER 0
+%define CONFIG_H264_V4L2M2M_DECODER 0
+%define CONFIG_H264_MEDIACODEC_DECODER 0
+%define CONFIG_H264_MMAL_DECODER 0
+%define CONFIG_H264_QSV_DECODER 0
+%define CONFIG_H264_RKMPP_DECODER 0
+%define CONFIG_HAP_DECODER 0
+%define CONFIG_HEVC_DECODER 0
+%define CONFIG_HEVC_QSV_DECODER 0
+%define CONFIG_HEVC_RKMPP_DECODER 0
+%define CONFIG_HEVC_V4L2M2M_DECODER 0
+%define CONFIG_HNM4_VIDEO_DECODER 0
+%define CONFIG_HQ_HQA_DECODER 0
+%define CONFIG_HQX_DECODER 0
+%define CONFIG_HUFFYUV_DECODER 0
+%define CONFIG_HYMT_DECODER 0
+%define CONFIG_IDCIN_DECODER 0
+%define CONFIG_IFF_ILBM_DECODER 0
+%define CONFIG_IMM4_DECODER 0
+%define CONFIG_IMM5_DECODER 0
+%define CONFIG_INDEO2_DECODER 0
+%define CONFIG_INDEO3_DECODER 0
+%define CONFIG_INDEO4_DECODER 0
+%define CONFIG_INDEO5_DECODER 0
+%define CONFIG_INTERPLAY_VIDEO_DECODER 0
+%define CONFIG_JPEG2000_DECODER 0
+%define CONFIG_JPEGLS_DECODER 0
+%define CONFIG_JV_DECODER 0
+%define CONFIG_KGV1_DECODER 0
+%define CONFIG_KMVC_DECODER 0
+%define CONFIG_LAGARITH_DECODER 0
+%define CONFIG_LOCO_DECODER 0
+%define CONFIG_LSCR_DECODER 0
+%define CONFIG_M101_DECODER 0
+%define CONFIG_MAGICYUV_DECODER 0
+%define CONFIG_MDEC_DECODER 0
+%define CONFIG_MIMIC_DECODER 0
+%define CONFIG_MJPEG_DECODER 0
+%define CONFIG_MJPEGB_DECODER 0
+%define CONFIG_MMVIDEO_DECODER 0
+%define CONFIG_MOTIONPIXELS_DECODER 0
+%define CONFIG_MPEG1VIDEO_DECODER 0
+%define CONFIG_MPEG2VIDEO_DECODER 0
+%define CONFIG_MPEG4_DECODER 1
+%define CONFIG_MPEG4_CRYSTALHD_DECODER 0
+%define CONFIG_MPEG4_V4L2M2M_DECODER 0
+%define CONFIG_MPEG4_MMAL_DECODER 0
+%define CONFIG_MPEGVIDEO_DECODER 0
+%define CONFIG_MPEG1_V4L2M2M_DECODER 0
+%define CONFIG_MPEG2_MMAL_DECODER 0
+%define CONFIG_MPEG2_CRYSTALHD_DECODER 0
+%define CONFIG_MPEG2_V4L2M2M_DECODER 0
+%define CONFIG_MPEG2_QSV_DECODER 0
+%define CONFIG_MPEG2_MEDIACODEC_DECODER 0
+%define CONFIG_MSA1_DECODER 0
+%define CONFIG_MSCC_DECODER 0
+%define CONFIG_MSMPEG4V1_DECODER 0
+%define CONFIG_MSMPEG4V2_DECODER 0
+%define CONFIG_MSMPEG4V3_DECODER 0
+%define CONFIG_MSMPEG4_CRYSTALHD_DECODER 0
+%define CONFIG_MSRLE_DECODER 0
+%define CONFIG_MSS1_DECODER 0
+%define CONFIG_MSS2_DECODER 0
+%define CONFIG_MSVIDEO1_DECODER 0
+%define CONFIG_MSZH_DECODER 0
+%define CONFIG_MTS2_DECODER 0
+%define CONFIG_MV30_DECODER 0
+%define CONFIG_MVC1_DECODER 0
+%define CONFIG_MVC2_DECODER 0
+%define CONFIG_MVDV_DECODER 0
+%define CONFIG_MVHA_DECODER 0
+%define CONFIG_MWSC_DECODER 0
+%define CONFIG_MXPEG_DECODER 0
+%define CONFIG_NUV_DECODER 0
+%define CONFIG_PAF_VIDEO_DECODER 0
+%define CONFIG_PAM_DECODER 0
+%define CONFIG_PBM_DECODER 0
+%define CONFIG_PCX_DECODER 0
+%define CONFIG_PGM_DECODER 0
+%define CONFIG_PGMYUV_DECODER 0
+%define CONFIG_PICTOR_DECODER 0
+%define CONFIG_PIXLET_DECODER 0
+%define CONFIG_PNG_DECODER 0
+%define CONFIG_PPM_DECODER 0
+%define CONFIG_PRORES_DECODER 0
+%define CONFIG_PROSUMER_DECODER 0
+%define CONFIG_PSD_DECODER 0
+%define CONFIG_PTX_DECODER 0
+%define CONFIG_QDRAW_DECODER 0
+%define CONFIG_QPEG_DECODER 0
+%define CONFIG_QTRLE_DECODER 0
+%define CONFIG_R10K_DECODER 0
+%define CONFIG_R210_DECODER 0
+%define CONFIG_RASC_DECODER 0
+%define CONFIG_RAWVIDEO_DECODER 0
+%define CONFIG_RL2_DECODER 0
+%define CONFIG_ROQ_DECODER 0
+%define CONFIG_RPZA_DECODER 0
+%define CONFIG_RSCC_DECODER 0
+%define CONFIG_RV10_DECODER 0
+%define CONFIG_RV20_DECODER 0
+%define CONFIG_RV30_DECODER 0
+%define CONFIG_RV40_DECODER 0
+%define CONFIG_S302M_DECODER 0
+%define CONFIG_SANM_DECODER 0
+%define CONFIG_SCPR_DECODER 0
+%define CONFIG_SCREENPRESSO_DECODER 0
+%define CONFIG_SGI_DECODER 0
+%define CONFIG_SGIRLE_DECODER 0
+%define CONFIG_SHEERVIDEO_DECODER 0
+%define CONFIG_SMACKER_DECODER 0
+%define CONFIG_SMC_DECODER 0
+%define CONFIG_SMVJPEG_DECODER 0
+%define CONFIG_SNOW_DECODER 0
+%define CONFIG_SP5X_DECODER 0
+%define CONFIG_SPEEDHQ_DECODER 0
+%define CONFIG_SRGC_DECODER 0
+%define CONFIG_SUNRAST_DECODER 0
+%define CONFIG_SVQ1_DECODER 0
+%define CONFIG_SVQ3_DECODER 0
+%define CONFIG_TARGA_DECODER 0
+%define CONFIG_TARGA_Y216_DECODER 0
+%define CONFIG_TDSC_DECODER 0
+%define CONFIG_THEORA_DECODER 1
+%define CONFIG_THP_DECODER 0
+%define CONFIG_TIERTEXSEQVIDEO_DECODER 0
+%define CONFIG_TIFF_DECODER 0
+%define CONFIG_TMV_DECODER 0
+%define CONFIG_TRUEMOTION1_DECODER 0
+%define CONFIG_TRUEMOTION2_DECODER 0
+%define CONFIG_TRUEMOTION2RT_DECODER 0
+%define CONFIG_TSCC_DECODER 0
+%define CONFIG_TSCC2_DECODER 0
+%define CONFIG_TXD_DECODER 0
+%define CONFIG_ULTI_DECODER 0
+%define CONFIG_UTVIDEO_DECODER 0
+%define CONFIG_V210_DECODER 0
+%define CONFIG_V210X_DECODER 0
+%define CONFIG_V308_DECODER 0
+%define CONFIG_V408_DECODER 0
+%define CONFIG_V410_DECODER 0
+%define CONFIG_VB_DECODER 0
+%define CONFIG_VBLE_DECODER 0
+%define CONFIG_VC1_DECODER 0
+%define CONFIG_VC1_CRYSTALHD_DECODER 0
+%define CONFIG_VC1IMAGE_DECODER 0
+%define CONFIG_VC1_MMAL_DECODER 0
+%define CONFIG_VC1_QSV_DECODER 0
+%define CONFIG_VC1_V4L2M2M_DECODER 0
+%define CONFIG_VCR1_DECODER 0
+%define CONFIG_VMDVIDEO_DECODER 0
+%define CONFIG_VMNC_DECODER 0
+%define CONFIG_VP3_DECODER 1
+%define CONFIG_VP4_DECODER 0
+%define CONFIG_VP5_DECODER 0
+%define CONFIG_VP6_DECODER 0
+%define CONFIG_VP6A_DECODER 0
+%define CONFIG_VP6F_DECODER 0
+%define CONFIG_VP7_DECODER 0
+%define CONFIG_VP8_DECODER 1
+%define CONFIG_VP8_RKMPP_DECODER 0
+%define CONFIG_VP8_V4L2M2M_DECODER 0
+%define CONFIG_VP9_DECODER 1
+%define CONFIG_VP9_RKMPP_DECODER 0
+%define CONFIG_VP9_V4L2M2M_DECODER 0
+%define CONFIG_VQA_DECODER 0
+%define CONFIG_WEBP_DECODER 0
+%define CONFIG_WCMV_DECODER 0
+%define CONFIG_WRAPPED_AVFRAME_DECODER 0
+%define CONFIG_WMV1_DECODER 0
+%define CONFIG_WMV2_DECODER 0
+%define CONFIG_WMV3_DECODER 0
+%define CONFIG_WMV3_CRYSTALHD_DECODER 0
+%define CONFIG_WMV3IMAGE_DECODER 0
+%define CONFIG_WNV1_DECODER 0
+%define CONFIG_XAN_WC3_DECODER 0
+%define CONFIG_XAN_WC4_DECODER 0
+%define CONFIG_XBM_DECODER 0
+%define CONFIG_XFACE_DECODER 0
+%define CONFIG_XL_DECODER 0
+%define CONFIG_XPM_DECODER 0
+%define CONFIG_XWD_DECODER 0
+%define CONFIG_Y41P_DECODER 0
+%define CONFIG_YLC_DECODER 0
+%define CONFIG_YOP_DECODER 0
+%define CONFIG_YUV4_DECODER 0
+%define CONFIG_ZERO12V_DECODER 0
+%define CONFIG_ZEROCODEC_DECODER 0
+%define CONFIG_ZLIB_DECODER 0
+%define CONFIG_ZMBV_DECODER 0
+%define CONFIG_AAC_DECODER 1
+%define CONFIG_AAC_FIXED_DECODER 0
+%define CONFIG_AAC_LATM_DECODER 1
+%define CONFIG_AC3_DECODER 0
+%define CONFIG_AC3_FIXED_DECODER 0
+%define CONFIG_ACELP_KELVIN_DECODER 0
+%define CONFIG_ALAC_DECODER 0
+%define CONFIG_ALS_DECODER 0
+%define CONFIG_AMRNB_DECODER 1
+%define CONFIG_AMRWB_DECODER 1
+%define CONFIG_APE_DECODER 0
+%define CONFIG_APTX_DECODER 1
+%define CONFIG_APTX_HD_DECODER 0
+%define CONFIG_ATRAC1_DECODER 0
+%define CONFIG_ATRAC3_DECODER 0
+%define CONFIG_ATRAC3AL_DECODER 0
+%define CONFIG_ATRAC3P_DECODER 0
+%define CONFIG_ATRAC3PAL_DECODER 0
+%define CONFIG_ATRAC9_DECODER 0
+%define CONFIG_BINKAUDIO_DCT_DECODER 0
+%define CONFIG_BINKAUDIO_RDFT_DECODER 0
+%define CONFIG_BMV_AUDIO_DECODER 0
+%define CONFIG_COOK_DECODER 0
+%define CONFIG_DCA_DECODER 0
+%define CONFIG_DOLBY_E_DECODER 0
+%define CONFIG_DSD_LSBF_DECODER 0
+%define CONFIG_DSD_MSBF_DECODER 0
+%define CONFIG_DSD_LSBF_PLANAR_DECODER 0
+%define CONFIG_DSD_MSBF_PLANAR_DECODER 0
+%define CONFIG_DSICINAUDIO_DECODER 0
+%define CONFIG_DSS_SP_DECODER 0
+%define CONFIG_DST_DECODER 0
+%define CONFIG_EAC3_DECODER 0
+%define CONFIG_EVRC_DECODER 0
+%define CONFIG_FFWAVESYNTH_DECODER 0
+%define CONFIG_FLAC_DECODER 1
+%define CONFIG_G723_1_DECODER 0
+%define CONFIG_G729_DECODER 0
+%define CONFIG_GSM_DECODER 0
+%define CONFIG_GSM_MS_DECODER 1
+%define CONFIG_HCA_DECODER 0
+%define CONFIG_HCOM_DECODER 0
+%define CONFIG_IAC_DECODER 0
+%define CONFIG_ILBC_DECODER 0
+%define CONFIG_IMC_DECODER 0
+%define CONFIG_INTERPLAY_ACM_DECODER 0
+%define CONFIG_MACE3_DECODER 0
+%define CONFIG_MACE6_DECODER 0
+%define CONFIG_METASOUND_DECODER 0
+%define CONFIG_MLP_DECODER 0
+%define CONFIG_MP1_DECODER 0
+%define CONFIG_MP1FLOAT_DECODER 0
+%define CONFIG_MP2_DECODER 0
+%define CONFIG_MP2FLOAT_DECODER 0
+%define CONFIG_MP3FLOAT_DECODER 0
+%define CONFIG_MP3_DECODER 1
+%define CONFIG_MP3ADUFLOAT_DECODER 0
+%define CONFIG_MP3ADU_DECODER 0
+%define CONFIG_MP3ON4FLOAT_DECODER 0
+%define CONFIG_MP3ON4_DECODER 0
+%define CONFIG_MPC7_DECODER 0
+%define CONFIG_MPC8_DECODER 0
+%define CONFIG_NELLYMOSER_DECODER 0
+%define CONFIG_ON2AVC_DECODER 0
+%define CONFIG_OPUS_DECODER 0
+%define CONFIG_PAF_AUDIO_DECODER 0
+%define CONFIG_QCELP_DECODER 0
+%define CONFIG_QDM2_DECODER 0
+%define CONFIG_QDMC_DECODER 0
+%define CONFIG_RA_144_DECODER 0
+%define CONFIG_RA_288_DECODER 0
+%define CONFIG_RALF_DECODER 0
+%define CONFIG_SBC_DECODER 1
+%define CONFIG_SHORTEN_DECODER 0
+%define CONFIG_SIPR_DECODER 0
+%define CONFIG_SIREN_DECODER 0
+%define CONFIG_SMACKAUD_DECODER 0
+%define CONFIG_SONIC_DECODER 0
+%define CONFIG_TAK_DECODER 0
+%define CONFIG_TRUEHD_DECODER 0
+%define CONFIG_TRUESPEECH_DECODER 0
+%define CONFIG_TTA_DECODER 0
+%define CONFIG_TWINVQ_DECODER 0
+%define CONFIG_VMDAUDIO_DECODER 0
+%define CONFIG_VORBIS_DECODER 1
+%define CONFIG_WAVPACK_DECODER 0
+%define CONFIG_WMALOSSLESS_DECODER 0
+%define CONFIG_WMAPRO_DECODER 0
+%define CONFIG_WMAV1_DECODER 0
+%define CONFIG_WMAV2_DECODER 0
+%define CONFIG_WMAVOICE_DECODER 0
+%define CONFIG_WS_SND1_DECODER 0
+%define CONFIG_XMA1_DECODER 0
+%define CONFIG_XMA2_DECODER 0
+%define CONFIG_PCM_ALAW_DECODER 1
+%define CONFIG_PCM_BLURAY_DECODER 0
+%define CONFIG_PCM_DVD_DECODER 0
+%define CONFIG_PCM_F16LE_DECODER 0
+%define CONFIG_PCM_F24LE_DECODER 0
+%define CONFIG_PCM_F32BE_DECODER 0
+%define CONFIG_PCM_F32LE_DECODER 1
+%define CONFIG_PCM_F64BE_DECODER 0
+%define CONFIG_PCM_F64LE_DECODER 0
+%define CONFIG_PCM_LXF_DECODER 0
+%define CONFIG_PCM_MULAW_DECODER 1
+%define CONFIG_PCM_S8_DECODER 0
+%define CONFIG_PCM_S8_PLANAR_DECODER 0
+%define CONFIG_PCM_S16BE_DECODER 1
+%define CONFIG_PCM_S16BE_PLANAR_DECODER 0
+%define CONFIG_PCM_S16LE_DECODER 1
+%define CONFIG_PCM_S16LE_PLANAR_DECODER 0
+%define CONFIG_PCM_S24BE_DECODER 1
+%define CONFIG_PCM_S24DAUD_DECODER 0
+%define CONFIG_PCM_S24LE_DECODER 1
+%define CONFIG_PCM_S24LE_PLANAR_DECODER 0
+%define CONFIG_PCM_S32BE_DECODER 0
+%define CONFIG_PCM_S32LE_DECODER 1
+%define CONFIG_PCM_S32LE_PLANAR_DECODER 0
+%define CONFIG_PCM_S64BE_DECODER 0
+%define CONFIG_PCM_S64LE_DECODER 0
+%define CONFIG_PCM_U8_DECODER 1
+%define CONFIG_PCM_U16BE_DECODER 0
+%define CONFIG_PCM_U16LE_DECODER 0
+%define CONFIG_PCM_U24BE_DECODER 0
+%define CONFIG_PCM_U24LE_DECODER 0
+%define CONFIG_PCM_U32BE_DECODER 0
+%define CONFIG_PCM_U32LE_DECODER 0
+%define CONFIG_PCM_VIDC_DECODER 0
+%define CONFIG_DERF_DPCM_DECODER 0
+%define CONFIG_GREMLIN_DPCM_DECODER 0
+%define CONFIG_INTERPLAY_DPCM_DECODER 0
+%define CONFIG_ROQ_DPCM_DECODER 0
+%define CONFIG_SDX2_DPCM_DECODER 0
+%define CONFIG_SOL_DPCM_DECODER 0
+%define CONFIG_XAN_DPCM_DECODER 0
+%define CONFIG_ADPCM_4XM_DECODER 0
+%define CONFIG_ADPCM_ADX_DECODER 0
+%define CONFIG_ADPCM_AFC_DECODER 0
+%define CONFIG_ADPCM_AGM_DECODER 0
+%define CONFIG_ADPCM_AICA_DECODER 0
+%define CONFIG_ADPCM_ARGO_DECODER 0
+%define CONFIG_ADPCM_CT_DECODER 0
+%define CONFIG_ADPCM_DTK_DECODER 0
+%define CONFIG_ADPCM_EA_DECODER 0
+%define CONFIG_ADPCM_EA_MAXIS_XA_DECODER 0
+%define CONFIG_ADPCM_EA_R1_DECODER 0
+%define CONFIG_ADPCM_EA_R2_DECODER 0
+%define CONFIG_ADPCM_EA_R3_DECODER 0
+%define CONFIG_ADPCM_EA_XAS_DECODER 0
+%define CONFIG_ADPCM_G722_DECODER 0
+%define CONFIG_ADPCM_G726_DECODER 0
+%define CONFIG_ADPCM_G726LE_DECODER 0
+%define CONFIG_ADPCM_IMA_AMV_DECODER 0
+%define CONFIG_ADPCM_IMA_ALP_DECODER 0
+%define CONFIG_ADPCM_IMA_APC_DECODER 0
+%define CONFIG_ADPCM_IMA_APM_DECODER 0
+%define CONFIG_ADPCM_IMA_DAT4_DECODER 0
+%define CONFIG_ADPCM_IMA_DK3_DECODER 0
+%define CONFIG_ADPCM_IMA_DK4_DECODER 0
+%define CONFIG_ADPCM_IMA_EA_EACS_DECODER 0
+%define CONFIG_ADPCM_IMA_EA_SEAD_DECODER 0
+%define CONFIG_ADPCM_IMA_ISS_DECODER 0
+%define CONFIG_ADPCM_IMA_MTF_DECODER 0
+%define CONFIG_ADPCM_IMA_OKI_DECODER 0
+%define CONFIG_ADPCM_IMA_QT_DECODER 0
+%define CONFIG_ADPCM_IMA_RAD_DECODER 0
+%define CONFIG_ADPCM_IMA_SSI_DECODER 0
+%define CONFIG_ADPCM_IMA_SMJPEG_DECODER 0
+%define CONFIG_ADPCM_IMA_WAV_DECODER 0
+%define CONFIG_ADPCM_IMA_WS_DECODER 0
+%define CONFIG_ADPCM_MS_DECODER 0
+%define CONFIG_ADPCM_MTAF_DECODER 0
+%define CONFIG_ADPCM_PSX_DECODER 0
+%define CONFIG_ADPCM_SBPRO_2_DECODER 0
+%define CONFIG_ADPCM_SBPRO_3_DECODER 0
+%define CONFIG_ADPCM_SBPRO_4_DECODER 0
+%define CONFIG_ADPCM_SWF_DECODER 0
+%define CONFIG_ADPCM_THP_DECODER 0
+%define CONFIG_ADPCM_THP_LE_DECODER 0
+%define CONFIG_ADPCM_VIMA_DECODER 0
+%define CONFIG_ADPCM_XA_DECODER 0
+%define CONFIG_ADPCM_YAMAHA_DECODER 0
+%define CONFIG_ADPCM_ZORK_DECODER 0
+%define CONFIG_SSA_DECODER 0
+%define CONFIG_ASS_DECODER 0
+%define CONFIG_CCAPTION_DECODER 0
+%define CONFIG_DVBSUB_DECODER 0
+%define CONFIG_DVDSUB_DECODER 0
+%define CONFIG_JACOSUB_DECODER 0
+%define CONFIG_MICRODVD_DECODER 0
+%define CONFIG_MOVTEXT_DECODER 0
+%define CONFIG_MPL2_DECODER 0
+%define CONFIG_PGSSUB_DECODER 0
+%define CONFIG_PJS_DECODER 0
+%define CONFIG_REALTEXT_DECODER 0
+%define CONFIG_SAMI_DECODER 0
+%define CONFIG_SRT_DECODER 0
+%define CONFIG_STL_DECODER 0
+%define CONFIG_SUBRIP_DECODER 0
+%define CONFIG_SUBVIEWER_DECODER 0
+%define CONFIG_SUBVIEWER1_DECODER 0
+%define CONFIG_TEXT_DECODER 0
+%define CONFIG_VPLAYER_DECODER 0
+%define CONFIG_WEBVTT_DECODER 0
+%define CONFIG_XSUB_DECODER 0
+%define CONFIG_AAC_AT_DECODER 0
+%define CONFIG_AC3_AT_DECODER 0
+%define CONFIG_ADPCM_IMA_QT_AT_DECODER 0
+%define CONFIG_ALAC_AT_DECODER 0
+%define CONFIG_AMR_NB_AT_DECODER 0
+%define CONFIG_EAC3_AT_DECODER 0
+%define CONFIG_GSM_MS_AT_DECODER 0
+%define CONFIG_ILBC_AT_DECODER 0
+%define CONFIG_MP1_AT_DECODER 0
+%define CONFIG_MP2_AT_DECODER 0
+%define CONFIG_MP3_AT_DECODER 0
+%define CONFIG_PCM_ALAW_AT_DECODER 0
+%define CONFIG_PCM_MULAW_AT_DECODER 0
+%define CONFIG_QDMC_AT_DECODER 0
+%define CONFIG_QDM2_AT_DECODER 0
+%define CONFIG_LIBARIBB24_DECODER 0
+%define CONFIG_LIBCELT_DECODER 0
+%define CONFIG_LIBCODEC2_DECODER 0
+%define CONFIG_LIBDAV1D_DECODER 0
+%define CONFIG_LIBDAVS2_DECODER 0
+%define CONFIG_LIBFDK_AAC_DECODER 0
+%define CONFIG_LIBGSM_DECODER 0
+%define CONFIG_LIBGSM_MS_DECODER 0
+%define CONFIG_LIBILBC_DECODER 0
+%define CONFIG_LIBOPENCORE_AMRNB_DECODER 0
+%define CONFIG_LIBOPENCORE_AMRWB_DECODER 0
+%define CONFIG_LIBOPENJPEG_DECODER 0
+%define CONFIG_LIBOPUS_DECODER 1
+%define CONFIG_LIBRSVG_DECODER 0
+%define CONFIG_LIBSPEEX_DECODER 0
+%define CONFIG_LIBVORBIS_DECODER 0
+%define CONFIG_LIBVPX_VP8_DECODER 0
+%define CONFIG_LIBVPX_VP9_DECODER 0
+%define CONFIG_LIBZVBI_TELETEXT_DECODER 0
+%define CONFIG_BINTEXT_DECODER 0
+%define CONFIG_XBIN_DECODER 0
+%define CONFIG_IDF_DECODER 0
+%define CONFIG_LIBAOM_AV1_DECODER 0
+%define CONFIG_LIBOPENH264_DECODER 0
+%define CONFIG_H264_CUVID_DECODER 0
+%define CONFIG_HEVC_CUVID_DECODER 0
+%define CONFIG_HEVC_MEDIACODEC_DECODER 0
+%define CONFIG_MJPEG_CUVID_DECODER 0
+%define CONFIG_MJPEG_QSV_DECODER 0
+%define CONFIG_MPEG1_CUVID_DECODER 0
+%define CONFIG_MPEG2_CUVID_DECODER 0
+%define CONFIG_MPEG4_CUVID_DECODER 0
+%define CONFIG_MPEG4_MEDIACODEC_DECODER 0
+%define CONFIG_VC1_CUVID_DECODER 0
+%define CONFIG_VP8_CUVID_DECODER 0
+%define CONFIG_VP8_MEDIACODEC_DECODER 0
+%define CONFIG_VP8_QSV_DECODER 0
+%define CONFIG_VP9_CUVID_DECODER 0
+%define CONFIG_VP9_MEDIACODEC_DECODER 0
+%define CONFIG_VP9_QSV_DECODER 0
+%define CONFIG_A64MULTI_ENCODER 0
+%define CONFIG_A64MULTI5_ENCODER 0
+%define CONFIG_ALIAS_PIX_ENCODER 0
+%define CONFIG_AMV_ENCODER 0
+%define CONFIG_APNG_ENCODER 0
+%define CONFIG_ASV1_ENCODER 0
+%define CONFIG_ASV2_ENCODER 0
+%define CONFIG_AVRP_ENCODER 0
+%define CONFIG_AVUI_ENCODER 0
+%define CONFIG_AYUV_ENCODER 0
+%define CONFIG_BMP_ENCODER 0
+%define CONFIG_CINEPAK_ENCODER 0
+%define CONFIG_CLJR_ENCODER 0
+%define CONFIG_COMFORTNOISE_ENCODER 0
+%define CONFIG_DNXHD_ENCODER 0
+%define CONFIG_DPX_ENCODER 0
+%define CONFIG_DVVIDEO_ENCODER 0
+%define CONFIG_FFV1_ENCODER 0
+%define CONFIG_FFVHUFF_ENCODER 0
+%define CONFIG_FITS_ENCODER 0
+%define CONFIG_FLASHSV_ENCODER 0
+%define CONFIG_FLASHSV2_ENCODER 0
+%define CONFIG_FLV_ENCODER 0
+%define CONFIG_GIF_ENCODER 0
+%define CONFIG_H261_ENCODER 0
+%define CONFIG_H263_ENCODER 0
+%define CONFIG_H263P_ENCODER 0
+%define CONFIG_HAP_ENCODER 0
+%define CONFIG_HUFFYUV_ENCODER 0
+%define CONFIG_JPEG2000_ENCODER 0
+%define CONFIG_JPEGLS_ENCODER 0
+%define CONFIG_LJPEG_ENCODER 0
+%define CONFIG_MAGICYUV_ENCODER 0
+%define CONFIG_MJPEG_ENCODER 0
+%define CONFIG_MPEG1VIDEO_ENCODER 0
+%define CONFIG_MPEG2VIDEO_ENCODER 0
+%define CONFIG_MPEG4_ENCODER 0
+%define CONFIG_MSMPEG4V2_ENCODER 0
+%define CONFIG_MSMPEG4V3_ENCODER 0
+%define CONFIG_MSVIDEO1_ENCODER 0
+%define CONFIG_PAM_ENCODER 0
+%define CONFIG_PBM_ENCODER 0
+%define CONFIG_PCX_ENCODER 0
+%define CONFIG_PGM_ENCODER 0
+%define CONFIG_PGMYUV_ENCODER 0
+%define CONFIG_PNG_ENCODER 0
+%define CONFIG_PPM_ENCODER 0
+%define CONFIG_PRORES_ENCODER 0
+%define CONFIG_PRORES_AW_ENCODER 0
+%define CONFIG_PRORES_KS_ENCODER 0
+%define CONFIG_QTRLE_ENCODER 0
+%define CONFIG_R10K_ENCODER 0
+%define CONFIG_R210_ENCODER 0
+%define CONFIG_RAWVIDEO_ENCODER 0
+%define CONFIG_ROQ_ENCODER 0
+%define CONFIG_RV10_ENCODER 0
+%define CONFIG_RV20_ENCODER 0
+%define CONFIG_S302M_ENCODER 0
+%define CONFIG_SGI_ENCODER 0
+%define CONFIG_SNOW_ENCODER 0
+%define CONFIG_SUNRAST_ENCODER 0
+%define CONFIG_SVQ1_ENCODER 0
+%define CONFIG_TARGA_ENCODER 0
+%define CONFIG_TIFF_ENCODER 0
+%define CONFIG_UTVIDEO_ENCODER 0
+%define CONFIG_V210_ENCODER 0
+%define CONFIG_V308_ENCODER 0
+%define CONFIG_V408_ENCODER 0
+%define CONFIG_V410_ENCODER 0
+%define CONFIG_VC2_ENCODER 0
+%define CONFIG_WRAPPED_AVFRAME_ENCODER 0
+%define CONFIG_WMV1_ENCODER 0
+%define CONFIG_WMV2_ENCODER 0
+%define CONFIG_XBM_ENCODER 0
+%define CONFIG_XFACE_ENCODER 0
+%define CONFIG_XWD_ENCODER 0
+%define CONFIG_Y41P_ENCODER 0
+%define CONFIG_YUV4_ENCODER 0
+%define CONFIG_ZLIB_ENCODER 0
+%define CONFIG_ZMBV_ENCODER 0
+%define CONFIG_AAC_ENCODER 0
+%define CONFIG_AC3_ENCODER 0
+%define CONFIG_AC3_FIXED_ENCODER 0
+%define CONFIG_ALAC_ENCODER 0
+%define CONFIG_APTX_ENCODER 0
+%define CONFIG_APTX_HD_ENCODER 0
+%define CONFIG_DCA_ENCODER 0
+%define CONFIG_EAC3_ENCODER 0
+%define CONFIG_FLAC_ENCODER 0
+%define CONFIG_G723_1_ENCODER 0
+%define CONFIG_MLP_ENCODER 0
+%define CONFIG_MP2_ENCODER 0
+%define CONFIG_MP2FIXED_ENCODER 0
+%define CONFIG_NELLYMOSER_ENCODER 0
+%define CONFIG_OPUS_ENCODER 0
+%define CONFIG_RA_144_ENCODER 0
+%define CONFIG_SBC_ENCODER 0
+%define CONFIG_SONIC_ENCODER 0
+%define CONFIG_SONIC_LS_ENCODER 0
+%define CONFIG_TRUEHD_ENCODER 0
+%define CONFIG_TTA_ENCODER 0
+%define CONFIG_VORBIS_ENCODER 0
+%define CONFIG_WAVPACK_ENCODER 0
+%define CONFIG_WMAV1_ENCODER 0
+%define CONFIG_WMAV2_ENCODER 0
+%define CONFIG_PCM_ALAW_ENCODER 0
+%define CONFIG_PCM_DVD_ENCODER 0
+%define CONFIG_PCM_F32BE_ENCODER 0
+%define CONFIG_PCM_F32LE_ENCODER 0
+%define CONFIG_PCM_F64BE_ENCODER 0
+%define CONFIG_PCM_F64LE_ENCODER 0
+%define CONFIG_PCM_MULAW_ENCODER 0
+%define CONFIG_PCM_S8_ENCODER 0
+%define CONFIG_PCM_S8_PLANAR_ENCODER 0
+%define CONFIG_PCM_S16BE_ENCODER 0
+%define CONFIG_PCM_S16BE_PLANAR_ENCODER 0
+%define CONFIG_PCM_S16LE_ENCODER 0
+%define CONFIG_PCM_S16LE_PLANAR_ENCODER 0
+%define CONFIG_PCM_S24BE_ENCODER 0
+%define CONFIG_PCM_S24DAUD_ENCODER 0
+%define CONFIG_PCM_S24LE_ENCODER 0
+%define CONFIG_PCM_S24LE_PLANAR_ENCODER 0
+%define CONFIG_PCM_S32BE_ENCODER 0
+%define CONFIG_PCM_S32LE_ENCODER 0
+%define CONFIG_PCM_S32LE_PLANAR_ENCODER 0
+%define CONFIG_PCM_S64BE_ENCODER 0
+%define CONFIG_PCM_S64LE_ENCODER 0
+%define CONFIG_PCM_U8_ENCODER 0
+%define CONFIG_PCM_U16BE_ENCODER 0
+%define CONFIG_PCM_U16LE_ENCODER 0
+%define CONFIG_PCM_U24BE_ENCODER 0
+%define CONFIG_PCM_U24LE_ENCODER 0
+%define CONFIG_PCM_U32BE_ENCODER 0
+%define CONFIG_PCM_U32LE_ENCODER 0
+%define CONFIG_PCM_VIDC_ENCODER 0
+%define CONFIG_ROQ_DPCM_ENCODER 0
+%define CONFIG_ADPCM_ADX_ENCODER 0
+%define CONFIG_ADPCM_G722_ENCODER 0
+%define CONFIG_ADPCM_G726_ENCODER 0
+%define CONFIG_ADPCM_G726LE_ENCODER 0
+%define CONFIG_ADPCM_IMA_QT_ENCODER 0
+%define CONFIG_ADPCM_IMA_WAV_ENCODER 0
+%define CONFIG_ADPCM_MS_ENCODER 0
+%define CONFIG_ADPCM_SWF_ENCODER 0
+%define CONFIG_ADPCM_YAMAHA_ENCODER 0
+%define CONFIG_SSA_ENCODER 0
+%define CONFIG_ASS_ENCODER 0
+%define CONFIG_DVBSUB_ENCODER 0
+%define CONFIG_DVDSUB_ENCODER 0
+%define CONFIG_MOVTEXT_ENCODER 0
+%define CONFIG_SRT_ENCODER 0
+%define CONFIG_SUBRIP_ENCODER 0
+%define CONFIG_TEXT_ENCODER 0
+%define CONFIG_WEBVTT_ENCODER 0
+%define CONFIG_XSUB_ENCODER 0
+%define CONFIG_AAC_AT_ENCODER 0
+%define CONFIG_ALAC_AT_ENCODER 0
+%define CONFIG_ILBC_AT_ENCODER 0
+%define CONFIG_PCM_ALAW_AT_ENCODER 0
+%define CONFIG_PCM_MULAW_AT_ENCODER 0
+%define CONFIG_LIBAOM_AV1_ENCODER 0
+%define CONFIG_LIBCODEC2_ENCODER 0
+%define CONFIG_LIBFDK_AAC_ENCODER 0
+%define CONFIG_LIBGSM_ENCODER 0
+%define CONFIG_LIBGSM_MS_ENCODER 0
+%define CONFIG_LIBILBC_ENCODER 0
+%define CONFIG_LIBMP3LAME_ENCODER 0
+%define CONFIG_LIBOPENCORE_AMRNB_ENCODER 0
+%define CONFIG_LIBOPENJPEG_ENCODER 0
+%define CONFIG_LIBOPUS_ENCODER 0
+%define CONFIG_LIBRAV1E_ENCODER 0
+%define CONFIG_LIBSHINE_ENCODER 0
+%define CONFIG_LIBSPEEX_ENCODER 0
+%define CONFIG_LIBTHEORA_ENCODER 0
+%define CONFIG_LIBTWOLAME_ENCODER 0
+%define CONFIG_LIBVO_AMRWBENC_ENCODER 0
+%define CONFIG_LIBVORBIS_ENCODER 0
+%define CONFIG_LIBVPX_VP8_ENCODER 0
+%define CONFIG_LIBVPX_VP9_ENCODER 0
+%define CONFIG_LIBWAVPACK_ENCODER 0
+%define CONFIG_LIBWEBP_ANIM_ENCODER 0
+%define CONFIG_LIBWEBP_ENCODER 0
+%define CONFIG_LIBX262_ENCODER 0
+%define CONFIG_LIBX264_ENCODER 0
+%define CONFIG_LIBX264RGB_ENCODER 0
+%define CONFIG_LIBX265_ENCODER 0
+%define CONFIG_LIBXAVS_ENCODER 0
+%define CONFIG_LIBXAVS2_ENCODER 0
+%define CONFIG_LIBXVID_ENCODER 0
+%define CONFIG_H263_V4L2M2M_ENCODER 0
+%define CONFIG_LIBOPENH264_ENCODER 0
+%define CONFIG_H264_AMF_ENCODER 0
+%define CONFIG_H264_NVENC_ENCODER 0
+%define CONFIG_H264_OMX_ENCODER 0
+%define CONFIG_H264_QSV_ENCODER 0
+%define CONFIG_H264_V4L2M2M_ENCODER 0
+%define CONFIG_H264_VAAPI_ENCODER 0
+%define CONFIG_H264_VIDEOTOOLBOX_ENCODER 0
+%define CONFIG_NVENC_ENCODER 0
+%define CONFIG_NVENC_H264_ENCODER 0
+%define CONFIG_NVENC_HEVC_ENCODER 0
+%define CONFIG_HEVC_AMF_ENCODER 0
+%define CONFIG_HEVC_NVENC_ENCODER 0
+%define CONFIG_HEVC_QSV_ENCODER 0
+%define CONFIG_HEVC_V4L2M2M_ENCODER 0
+%define CONFIG_HEVC_VAAPI_ENCODER 0
+%define CONFIG_HEVC_VIDEOTOOLBOX_ENCODER 0
+%define CONFIG_LIBKVAZAAR_ENCODER 0
+%define CONFIG_MJPEG_QSV_ENCODER 0
+%define CONFIG_MJPEG_VAAPI_ENCODER 0
+%define CONFIG_MPEG2_QSV_ENCODER 0
+%define CONFIG_MPEG2_VAAPI_ENCODER 0
+%define CONFIG_MPEG4_OMX_ENCODER 0
+%define CONFIG_MPEG4_V4L2M2M_ENCODER 0
+%define CONFIG_VP8_V4L2M2M_ENCODER 0
+%define CONFIG_VP8_VAAPI_ENCODER 0
+%define CONFIG_VP9_VAAPI_ENCODER 0
+%define CONFIG_VP9_QSV_ENCODER 0
+%define CONFIG_H263_VAAPI_HWACCEL 0
+%define CONFIG_H263_VIDEOTOOLBOX_HWACCEL 0
+%define CONFIG_H264_D3D11VA_HWACCEL 0
+%define CONFIG_H264_D3D11VA2_HWACCEL 0
+%define CONFIG_H264_DXVA2_HWACCEL 0
+%define CONFIG_H264_NVDEC_HWACCEL 0
+%define CONFIG_H264_VAAPI_HWACCEL 0
+%define CONFIG_H264_VDPAU_HWACCEL 0
+%define CONFIG_H264_VIDEOTOOLBOX_HWACCEL 0
+%define CONFIG_HEVC_D3D11VA_HWACCEL 0
+%define CONFIG_HEVC_D3D11VA2_HWACCEL 0
+%define CONFIG_HEVC_DXVA2_HWACCEL 0
+%define CONFIG_HEVC_NVDEC_HWACCEL 0
+%define CONFIG_HEVC_VAAPI_HWACCEL 0
+%define CONFIG_HEVC_VDPAU_HWACCEL 0
+%define CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL 0
+%define CONFIG_MJPEG_NVDEC_HWACCEL 0
+%define CONFIG_MJPEG_VAAPI_HWACCEL 0
+%define CONFIG_MPEG1_NVDEC_HWACCEL 0
+%define CONFIG_MPEG1_VDPAU_HWACCEL 0
+%define CONFIG_MPEG1_VIDEOTOOLBOX_HWACCEL 0
+%define CONFIG_MPEG1_XVMC_HWACCEL 0
+%define CONFIG_MPEG2_D3D11VA_HWACCEL 0
+%define CONFIG_MPEG2_D3D11VA2_HWACCEL 0
+%define CONFIG_MPEG2_NVDEC_HWACCEL 0
+%define CONFIG_MPEG2_DXVA2_HWACCEL 0
+%define CONFIG_MPEG2_VAAPI_HWACCEL 0
+%define CONFIG_MPEG2_VDPAU_HWACCEL 0
+%define CONFIG_MPEG2_VIDEOTOOLBOX_HWACCEL 0
+%define CONFIG_MPEG2_XVMC_HWACCEL 0
+%define CONFIG_MPEG4_NVDEC_HWACCEL 0
+%define CONFIG_MPEG4_VAAPI_HWACCEL 0
+%define CONFIG_MPEG4_VDPAU_HWACCEL 0
+%define CONFIG_MPEG4_VIDEOTOOLBOX_HWACCEL 0
+%define CONFIG_VC1_D3D11VA_HWACCEL 0
+%define CONFIG_VC1_D3D11VA2_HWACCEL 0
+%define CONFIG_VC1_DXVA2_HWACCEL 0
+%define CONFIG_VC1_NVDEC_HWACCEL 0
+%define CONFIG_VC1_VAAPI_HWACCEL 0
+%define CONFIG_VC1_VDPAU_HWACCEL 0
+%define CONFIG_VP8_NVDEC_HWACCEL 0
+%define CONFIG_VP8_VAAPI_HWACCEL 0
+%define CONFIG_VP9_D3D11VA_HWACCEL 0
+%define CONFIG_VP9_D3D11VA2_HWACCEL 0
+%define CONFIG_VP9_DXVA2_HWACCEL 0
+%define CONFIG_VP9_NVDEC_HWACCEL 0
+%define CONFIG_VP9_VAAPI_HWACCEL 0
+%define CONFIG_VP9_VDPAU_HWACCEL 0
+%define CONFIG_WMV3_D3D11VA_HWACCEL 0
+%define CONFIG_WMV3_D3D11VA2_HWACCEL 0
+%define CONFIG_WMV3_DXVA2_HWACCEL 0
+%define CONFIG_WMV3_NVDEC_HWACCEL 0
+%define CONFIG_WMV3_VAAPI_HWACCEL 0
+%define CONFIG_WMV3_VDPAU_HWACCEL 0
+%define CONFIG_AAC_PARSER 1
+%define CONFIG_AAC_LATM_PARSER 1
+%define CONFIG_AC3_PARSER 0
+%define CONFIG_ADX_PARSER 0
+%define CONFIG_AV1_PARSER 0
+%define CONFIG_AVS2_PARSER 0
+%define CONFIG_BMP_PARSER 0
+%define CONFIG_CAVSVIDEO_PARSER 0
+%define CONFIG_COOK_PARSER 0
+%define CONFIG_DCA_PARSER 0
+%define CONFIG_DIRAC_PARSER 0
+%define CONFIG_DNXHD_PARSER 0
+%define CONFIG_DPX_PARSER 0
+%define CONFIG_DVAUDIO_PARSER 0
+%define CONFIG_DVBSUB_PARSER 0
+%define CONFIG_DVDSUB_PARSER 0
+%define CONFIG_DVD_NAV_PARSER 0
+%define CONFIG_FLAC_PARSER 1
+%define CONFIG_G723_1_PARSER 0
+%define CONFIG_G729_PARSER 0
+%define CONFIG_GIF_PARSER 0
+%define CONFIG_GSM_PARSER 1
+%define CONFIG_H261_PARSER 0
+%define CONFIG_H263_PARSER 1
+%define CONFIG_H264_PARSER 1
+%define CONFIG_HEVC_PARSER 0
+%define CONFIG_MJPEG_PARSER 0
+%define CONFIG_MLP_PARSER 0
+%define CONFIG_MPEG4VIDEO_PARSER 1
+%define CONFIG_MPEGAUDIO_PARSER 1
+%define CONFIG_MPEGVIDEO_PARSER 0
+%define CONFIG_OPUS_PARSER 1
+%define CONFIG_PNG_PARSER 0
+%define CONFIG_PNM_PARSER 0
+%define CONFIG_RV30_PARSER 0
+%define CONFIG_RV40_PARSER 0
+%define CONFIG_SBC_PARSER 0
+%define CONFIG_SIPR_PARSER 0
+%define CONFIG_TAK_PARSER 0
+%define CONFIG_VC1_PARSER 0
+%define CONFIG_VORBIS_PARSER 1
+%define CONFIG_VP3_PARSER 1
+%define CONFIG_VP8_PARSER 1
+%define CONFIG_VP9_PARSER 1
+%define CONFIG_WEBP_PARSER 0
+%define CONFIG_XMA_PARSER 0
+%define CONFIG_ALSA_INDEV 0
+%define CONFIG_ANDROID_CAMERA_INDEV 0
+%define CONFIG_AVFOUNDATION_INDEV 0
+%define CONFIG_BKTR_INDEV 0
+%define CONFIG_DECKLINK_INDEV 0
+%define CONFIG_DSHOW_INDEV 0
+%define CONFIG_FBDEV_INDEV 0
+%define CONFIG_GDIGRAB_INDEV 0
+%define CONFIG_IEC61883_INDEV 0
+%define CONFIG_JACK_INDEV 0
+%define CONFIG_KMSGRAB_INDEV 0
+%define CONFIG_LAVFI_INDEV 0
+%define CONFIG_OPENAL_INDEV 0
+%define CONFIG_OSS_INDEV 0
+%define CONFIG_PULSE_INDEV 0
+%define CONFIG_SNDIO_INDEV 0
+%define CONFIG_V4L2_INDEV 0
+%define CONFIG_VFWCAP_INDEV 0
+%define CONFIG_XCBGRAB_INDEV 0
+%define CONFIG_LIBCDIO_INDEV 0
+%define CONFIG_LIBDC1394_INDEV 0
+%define CONFIG_ALSA_OUTDEV 0
+%define CONFIG_CACA_OUTDEV 0
+%define CONFIG_DECKLINK_OUTDEV 0
+%define CONFIG_FBDEV_OUTDEV 0
+%define CONFIG_OPENGL_OUTDEV 0
+%define CONFIG_OSS_OUTDEV 0
+%define CONFIG_PULSE_OUTDEV 0
+%define CONFIG_SDL2_OUTDEV 0
+%define CONFIG_SNDIO_OUTDEV 0
+%define CONFIG_V4L2_OUTDEV 0
+%define CONFIG_XV_OUTDEV 0
+%define CONFIG_ABENCH_FILTER 0
+%define CONFIG_ACOMPRESSOR_FILTER 0
+%define CONFIG_ACONTRAST_FILTER 0
+%define CONFIG_ACOPY_FILTER 0
+%define CONFIG_ACUE_FILTER 0
+%define CONFIG_ACROSSFADE_FILTER 0
+%define CONFIG_ACROSSOVER_FILTER 0
+%define CONFIG_ACRUSHER_FILTER 0
+%define CONFIG_ADECLICK_FILTER 0
+%define CONFIG_ADECLIP_FILTER 0
+%define CONFIG_ADELAY_FILTER 0
+%define CONFIG_ADERIVATIVE_FILTER 0
+%define CONFIG_AECHO_FILTER 0
+%define CONFIG_AEMPHASIS_FILTER 0
+%define CONFIG_AEVAL_FILTER 0
+%define CONFIG_AFADE_FILTER 0
+%define CONFIG_AFFTDN_FILTER 0
+%define CONFIG_AFFTFILT_FILTER 0
+%define CONFIG_AFIR_FILTER 0
+%define CONFIG_AFORMAT_FILTER 0
+%define CONFIG_AGATE_FILTER 0
+%define CONFIG_AIIR_FILTER 0
+%define CONFIG_AINTEGRAL_FILTER 0
+%define CONFIG_AINTERLEAVE_FILTER 0
+%define CONFIG_ALIMITER_FILTER 0
+%define CONFIG_ALLPASS_FILTER 0
+%define CONFIG_ALOOP_FILTER 0
+%define CONFIG_AMERGE_FILTER 0
+%define CONFIG_AMETADATA_FILTER 0
+%define CONFIG_AMIX_FILTER 0
+%define CONFIG_AMULTIPLY_FILTER 0
+%define CONFIG_ANEQUALIZER_FILTER 0
+%define CONFIG_ANLMDN_FILTER 0
+%define CONFIG_ANLMS_FILTER 0
+%define CONFIG_ANULL_FILTER 0
+%define CONFIG_APAD_FILTER 0
+%define CONFIG_APERMS_FILTER 0
+%define CONFIG_APHASER_FILTER 0
+%define CONFIG_APULSATOR_FILTER 0
+%define CONFIG_AREALTIME_FILTER 0
+%define CONFIG_ARESAMPLE_FILTER 0
+%define CONFIG_AREVERSE_FILTER 0
+%define CONFIG_ARNNDN_FILTER 0
+%define CONFIG_ASELECT_FILTER 0
+%define CONFIG_ASENDCMD_FILTER 0
+%define CONFIG_ASETNSAMPLES_FILTER 0
+%define CONFIG_ASETPTS_FILTER 0
+%define CONFIG_ASETRATE_FILTER 0
+%define CONFIG_ASETTB_FILTER 0
+%define CONFIG_ASHOWINFO_FILTER 0
+%define CONFIG_ASIDEDATA_FILTER 0
+%define CONFIG_ASOFTCLIP_FILTER 0
+%define CONFIG_ASPLIT_FILTER 0
+%define CONFIG_ASR_FILTER 0
+%define CONFIG_ASTATS_FILTER 0
+%define CONFIG_ASTREAMSELECT_FILTER 0
+%define CONFIG_ATEMPO_FILTER 0
+%define CONFIG_ATRIM_FILTER 0
+%define CONFIG_AXCORRELATE_FILTER 0
+%define CONFIG_AZMQ_FILTER 0
+%define CONFIG_BANDPASS_FILTER 0
+%define CONFIG_BANDREJECT_FILTER 0
+%define CONFIG_BASS_FILTER 0
+%define CONFIG_BIQUAD_FILTER 0
+%define CONFIG_BS2B_FILTER 0
+%define CONFIG_CHROMABER_VULKAN_FILTER 0
+%define CONFIG_CHANNELMAP_FILTER 0
+%define CONFIG_CHANNELSPLIT_FILTER 0
+%define CONFIG_CHORUS_FILTER 0
+%define CONFIG_COMPAND_FILTER 0
+%define CONFIG_COMPENSATIONDELAY_FILTER 0
+%define CONFIG_CROSSFEED_FILTER 0
+%define CONFIG_CRYSTALIZER_FILTER 0
+%define CONFIG_DCSHIFT_FILTER 0
+%define CONFIG_DEESSER_FILTER 0
+%define CONFIG_DRMETER_FILTER 0
+%define CONFIG_DYNAUDNORM_FILTER 0
+%define CONFIG_EARWAX_FILTER 0
+%define CONFIG_EBUR128_FILTER 0
+%define CONFIG_EQUALIZER_FILTER 0
+%define CONFIG_EXTRASTEREO_FILTER 0
+%define CONFIG_FIREQUALIZER_FILTER 0
+%define CONFIG_FLANGER_FILTER 0
+%define CONFIG_HAAS_FILTER 0
+%define CONFIG_HDCD_FILTER 0
+%define CONFIG_HEADPHONE_FILTER 0
+%define CONFIG_HIGHPASS_FILTER 0
+%define CONFIG_HIGHSHELF_FILTER 0
+%define CONFIG_JOIN_FILTER 0
+%define CONFIG_LADSPA_FILTER 0
+%define CONFIG_LOUDNORM_FILTER 0
+%define CONFIG_LOWPASS_FILTER 0
+%define CONFIG_LOWSHELF_FILTER 0
+%define CONFIG_LV2_FILTER 0
+%define CONFIG_MCOMPAND_FILTER 0
+%define CONFIG_PAN_FILTER 0
+%define CONFIG_REPLAYGAIN_FILTER 0
+%define CONFIG_RESAMPLE_FILTER 0
+%define CONFIG_RUBBERBAND_FILTER 0
+%define CONFIG_SIDECHAINCOMPRESS_FILTER 0
+%define CONFIG_SIDECHAINGATE_FILTER 0
+%define CONFIG_SILENCEDETECT_FILTER 0
+%define CONFIG_SILENCEREMOVE_FILTER 0
+%define CONFIG_SOFALIZER_FILTER 0
+%define CONFIG_STEREOTOOLS_FILTER 0
+%define CONFIG_STEREOWIDEN_FILTER 0
+%define CONFIG_SUPEREQUALIZER_FILTER 0
+%define CONFIG_SURROUND_FILTER 0
+%define CONFIG_TREBLE_FILTER 0
+%define CONFIG_TREMOLO_FILTER 0
+%define CONFIG_VIBRATO_FILTER 0
+%define CONFIG_VOLUME_FILTER 0
+%define CONFIG_VOLUMEDETECT_FILTER 0
+%define CONFIG_AEVALSRC_FILTER 0
+%define CONFIG_AFIRSRC_FILTER 0
+%define CONFIG_ANOISESRC_FILTER 0
+%define CONFIG_ANULLSRC_FILTER 0
+%define CONFIG_FLITE_FILTER 0
+%define CONFIG_HILBERT_FILTER 0
+%define CONFIG_SINC_FILTER 0
+%define CONFIG_SINE_FILTER 0
+%define CONFIG_ANULLSINK_FILTER 0
+%define CONFIG_ADDROI_FILTER 0
+%define CONFIG_ALPHAEXTRACT_FILTER 0
+%define CONFIG_ALPHAMERGE_FILTER 0
+%define CONFIG_AMPLIFY_FILTER 0
+%define CONFIG_ASS_FILTER 0
+%define CONFIG_ATADENOISE_FILTER 0
+%define CONFIG_AVGBLUR_FILTER 0
+%define CONFIG_AVGBLUR_OPENCL_FILTER 0
+%define CONFIG_AVGBLUR_VULKAN_FILTER 0
+%define CONFIG_BBOX_FILTER 0
+%define CONFIG_BENCH_FILTER 0
+%define CONFIG_BILATERAL_FILTER 0
+%define CONFIG_BITPLANENOISE_FILTER 0
+%define CONFIG_BLACKDETECT_FILTER 0
+%define CONFIG_BLACKFRAME_FILTER 0
+%define CONFIG_BLEND_FILTER 0
+%define CONFIG_BM3D_FILTER 0
+%define CONFIG_BOXBLUR_FILTER 0
+%define CONFIG_BOXBLUR_OPENCL_FILTER 0
+%define CONFIG_BWDIF_FILTER 0
+%define CONFIG_CAS_FILTER 0
+%define CONFIG_CHROMAHOLD_FILTER 0
+%define CONFIG_CHROMAKEY_FILTER 0
+%define CONFIG_CHROMASHIFT_FILTER 0
+%define CONFIG_CIESCOPE_FILTER 0
+%define CONFIG_CODECVIEW_FILTER 0
+%define CONFIG_COLORBALANCE_FILTER 0
+%define CONFIG_COLORCHANNELMIXER_FILTER 0
+%define CONFIG_COLORKEY_FILTER 0
+%define CONFIG_COLORKEY_OPENCL_FILTER 0
+%define CONFIG_COLORHOLD_FILTER 0
+%define CONFIG_COLORLEVELS_FILTER 0
+%define CONFIG_COLORMATRIX_FILTER 0
+%define CONFIG_COLORSPACE_FILTER 0
+%define CONFIG_CONVOLUTION_FILTER 0
+%define CONFIG_CONVOLUTION_OPENCL_FILTER 0
+%define CONFIG_CONVOLVE_FILTER 0
+%define CONFIG_COPY_FILTER 0
+%define CONFIG_COREIMAGE_FILTER 0
+%define CONFIG_COVER_RECT_FILTER 0
+%define CONFIG_CROP_FILTER 0
+%define CONFIG_CROPDETECT_FILTER 0
+%define CONFIG_CUE_FILTER 0
+%define CONFIG_CURVES_FILTER 0
+%define CONFIG_DATASCOPE_FILTER 0
+%define CONFIG_DCTDNOIZ_FILTER 0
+%define CONFIG_DEBAND_FILTER 0
+%define CONFIG_DEBLOCK_FILTER 0
+%define CONFIG_DECIMATE_FILTER 0
+%define CONFIG_DECONVOLVE_FILTER 0
+%define CONFIG_DEDOT_FILTER 0
+%define CONFIG_DEFLATE_FILTER 0
+%define CONFIG_DEFLICKER_FILTER 0
+%define CONFIG_DEINTERLACE_QSV_FILTER 0
+%define CONFIG_DEINTERLACE_VAAPI_FILTER 0
+%define CONFIG_DEJUDDER_FILTER 0
+%define CONFIG_DELOGO_FILTER 0
+%define CONFIG_DENOISE_VAAPI_FILTER 0
+%define CONFIG_DERAIN_FILTER 0
+%define CONFIG_DESHAKE_FILTER 0
+%define CONFIG_DESHAKE_OPENCL_FILTER 0
+%define CONFIG_DESPILL_FILTER 0
+%define CONFIG_DETELECINE_FILTER 0
+%define CONFIG_DILATION_FILTER 0
+%define CONFIG_DILATION_OPENCL_FILTER 0
+%define CONFIG_DISPLACE_FILTER 0
+%define CONFIG_DNN_PROCESSING_FILTER 0
+%define CONFIG_DOUBLEWEAVE_FILTER 0
+%define CONFIG_DRAWBOX_FILTER 0
+%define CONFIG_DRAWGRAPH_FILTER 0
+%define CONFIG_DRAWGRID_FILTER 0
+%define CONFIG_DRAWTEXT_FILTER 0
+%define CONFIG_EDGEDETECT_FILTER 0
+%define CONFIG_ELBG_FILTER 0
+%define CONFIG_ENTROPY_FILTER 0
+%define CONFIG_EQ_FILTER 0
+%define CONFIG_EROSION_FILTER 0
+%define CONFIG_EROSION_OPENCL_FILTER 0
+%define CONFIG_EXTRACTPLANES_FILTER 0
+%define CONFIG_FADE_FILTER 0
+%define CONFIG_FFTDNOIZ_FILTER 0
+%define CONFIG_FFTFILT_FILTER 0
+%define CONFIG_FIELD_FILTER 0
+%define CONFIG_FIELDHINT_FILTER 0
+%define CONFIG_FIELDMATCH_FILTER 0
+%define CONFIG_FIELDORDER_FILTER 0
+%define CONFIG_FILLBORDERS_FILTER 0
+%define CONFIG_FIND_RECT_FILTER 0
+%define CONFIG_FLOODFILL_FILTER 0
+%define CONFIG_FORMAT_FILTER 0
+%define CONFIG_FPS_FILTER 0
+%define CONFIG_FRAMEPACK_FILTER 0
+%define CONFIG_FRAMERATE_FILTER 0
+%define CONFIG_FRAMESTEP_FILTER 0
+%define CONFIG_FREEZEDETECT_FILTER 0
+%define CONFIG_FREEZEFRAMES_FILTER 0
+%define CONFIG_FREI0R_FILTER 0
+%define CONFIG_FSPP_FILTER 0
+%define CONFIG_GBLUR_FILTER 0
+%define CONFIG_GEQ_FILTER 0
+%define CONFIG_GRADFUN_FILTER 0
+%define CONFIG_GRAPHMONITOR_FILTER 0
+%define CONFIG_GREYEDGE_FILTER 0
+%define CONFIG_HALDCLUT_FILTER 0
+%define CONFIG_HFLIP_FILTER 0
+%define CONFIG_HISTEQ_FILTER 0
+%define CONFIG_HISTOGRAM_FILTER 0
+%define CONFIG_HQDN3D_FILTER 0
+%define CONFIG_HQX_FILTER 0
+%define CONFIG_HSTACK_FILTER 0
+%define CONFIG_HUE_FILTER 0
+%define CONFIG_HWDOWNLOAD_FILTER 0
+%define CONFIG_HWMAP_FILTER 0
+%define CONFIG_HWUPLOAD_FILTER 0
+%define CONFIG_HWUPLOAD_CUDA_FILTER 0
+%define CONFIG_HYSTERESIS_FILTER 0
+%define CONFIG_IDET_FILTER 0
+%define CONFIG_IL_FILTER 0
+%define CONFIG_INFLATE_FILTER 0
+%define CONFIG_INTERLACE_FILTER 0
+%define CONFIG_INTERLEAVE_FILTER 0
+%define CONFIG_KERNDEINT_FILTER 0
+%define CONFIG_LAGFUN_FILTER 0
+%define CONFIG_LENSCORRECTION_FILTER 0
+%define CONFIG_LENSFUN_FILTER 0
+%define CONFIG_LIBVMAF_FILTER 0
+%define CONFIG_LIMITER_FILTER 0
+%define CONFIG_LOOP_FILTER 0
+%define CONFIG_LUMAKEY_FILTER 0
+%define CONFIG_LUT_FILTER 0
+%define CONFIG_LUT1D_FILTER 0
+%define CONFIG_LUT2_FILTER 0
+%define CONFIG_LUT3D_FILTER 0
+%define CONFIG_LUTRGB_FILTER 0
+%define CONFIG_LUTYUV_FILTER 0
+%define CONFIG_MASKEDCLAMP_FILTER 0
+%define CONFIG_MASKEDMAX_FILTER 0
+%define CONFIG_MASKEDMERGE_FILTER 0
+%define CONFIG_MASKEDMIN_FILTER 0
+%define CONFIG_MASKEDTHRESHOLD_FILTER 0
+%define CONFIG_MASKFUN_FILTER 0
+%define CONFIG_MCDEINT_FILTER 0
+%define CONFIG_MEDIAN_FILTER 0
+%define CONFIG_MERGEPLANES_FILTER 0
+%define CONFIG_MESTIMATE_FILTER 0
+%define CONFIG_METADATA_FILTER 0
+%define CONFIG_MIDEQUALIZER_FILTER 0
+%define CONFIG_MINTERPOLATE_FILTER 0
+%define CONFIG_MIX_FILTER 0
+%define CONFIG_MPDECIMATE_FILTER 0
+%define CONFIG_NEGATE_FILTER 0
+%define CONFIG_NLMEANS_FILTER 0
+%define CONFIG_NLMEANS_OPENCL_FILTER 0
+%define CONFIG_NNEDI_FILTER 0
+%define CONFIG_NOFORMAT_FILTER 0
+%define CONFIG_NOISE_FILTER 0
+%define CONFIG_NORMALIZE_FILTER 0
+%define CONFIG_NULL_FILTER 0
+%define CONFIG_OCR_FILTER 0
+%define CONFIG_OCV_FILTER 0
+%define CONFIG_OSCILLOSCOPE_FILTER 0
+%define CONFIG_OVERLAY_FILTER 0
+%define CONFIG_OVERLAY_OPENCL_FILTER 0
+%define CONFIG_OVERLAY_QSV_FILTER 0
+%define CONFIG_OVERLAY_VULKAN_FILTER 0
+%define CONFIG_OVERLAY_CUDA_FILTER 0
+%define CONFIG_OWDENOISE_FILTER 0
+%define CONFIG_PAD_FILTER 0
+%define CONFIG_PAD_OPENCL_FILTER 0
+%define CONFIG_PALETTEGEN_FILTER 0
+%define CONFIG_PALETTEUSE_FILTER 0
+%define CONFIG_PERMS_FILTER 0
+%define CONFIG_PERSPECTIVE_FILTER 0
+%define CONFIG_PHASE_FILTER 0
+%define CONFIG_PHOTOSENSITIVITY_FILTER 0
+%define CONFIG_PIXDESCTEST_FILTER 0
+%define CONFIG_PIXSCOPE_FILTER 0
+%define CONFIG_PP_FILTER 0
+%define CONFIG_PP7_FILTER 0
+%define CONFIG_PREMULTIPLY_FILTER 0
+%define CONFIG_PREWITT_FILTER 0
+%define CONFIG_PREWITT_OPENCL_FILTER 0
+%define CONFIG_PROCAMP_VAAPI_FILTER 0
+%define CONFIG_PROGRAM_OPENCL_FILTER 0
+%define CONFIG_PSEUDOCOLOR_FILTER 0
+%define CONFIG_PSNR_FILTER 0
+%define CONFIG_PULLUP_FILTER 0
+%define CONFIG_QP_FILTER 0
+%define CONFIG_RANDOM_FILTER 0
+%define CONFIG_READEIA608_FILTER 0
+%define CONFIG_READVITC_FILTER 0
+%define CONFIG_REALTIME_FILTER 0
+%define CONFIG_REMAP_FILTER 0
+%define CONFIG_REMOVEGRAIN_FILTER 0
+%define CONFIG_REMOVELOGO_FILTER 0
+%define CONFIG_REPEATFIELDS_FILTER 0
+%define CONFIG_REVERSE_FILTER 0
+%define CONFIG_RGBASHIFT_FILTER 0
+%define CONFIG_ROBERTS_FILTER 0
+%define CONFIG_ROBERTS_OPENCL_FILTER 0
+%define CONFIG_ROTATE_FILTER 0
+%define CONFIG_SAB_FILTER 0
+%define CONFIG_SCALE_FILTER 0
+%define CONFIG_SCALE_CUDA_FILTER 0
+%define CONFIG_SCALE_NPP_FILTER 0
+%define CONFIG_SCALE_QSV_FILTER 0
+%define CONFIG_SCALE_VAAPI_FILTER 0
+%define CONFIG_SCALE_VULKAN_FILTER 0
+%define CONFIG_SCALE2REF_FILTER 0
+%define CONFIG_SCROLL_FILTER 0
+%define CONFIG_SELECT_FILTER 0
+%define CONFIG_SELECTIVECOLOR_FILTER 0
+%define CONFIG_SENDCMD_FILTER 0
+%define CONFIG_SEPARATEFIELDS_FILTER 0
+%define CONFIG_SETDAR_FILTER 0
+%define CONFIG_SETFIELD_FILTER 0
+%define CONFIG_SETPARAMS_FILTER 0
+%define CONFIG_SETPTS_FILTER 0
+%define CONFIG_SETRANGE_FILTER 0
+%define CONFIG_SETSAR_FILTER 0
+%define CONFIG_SETTB_FILTER 0
+%define CONFIG_SHARPNESS_VAAPI_FILTER 0
+%define CONFIG_SHOWINFO_FILTER 0
+%define CONFIG_SHOWPALETTE_FILTER 0
+%define CONFIG_SHUFFLEFRAMES_FILTER 0
+%define CONFIG_SHUFFLEPLANES_FILTER 0
+%define CONFIG_SIDEDATA_FILTER 0
+%define CONFIG_SIGNALSTATS_FILTER 0
+%define CONFIG_SIGNATURE_FILTER 0
+%define CONFIG_SMARTBLUR_FILTER 0
+%define CONFIG_SOBEL_FILTER 0
+%define CONFIG_SOBEL_OPENCL_FILTER 0
+%define CONFIG_SPLIT_FILTER 0
+%define CONFIG_SPP_FILTER 0
+%define CONFIG_SR_FILTER 0
+%define CONFIG_SSIM_FILTER 0
+%define CONFIG_STEREO3D_FILTER 0
+%define CONFIG_STREAMSELECT_FILTER 0
+%define CONFIG_SUBTITLES_FILTER 0
+%define CONFIG_SUPER2XSAI_FILTER 0
+%define CONFIG_SWAPRECT_FILTER 0
+%define CONFIG_SWAPUV_FILTER 0
+%define CONFIG_TBLEND_FILTER 0
+%define CONFIG_TELECINE_FILTER 0
+%define CONFIG_THISTOGRAM_FILTER 0
+%define CONFIG_THRESHOLD_FILTER 0
+%define CONFIG_THUMBNAIL_FILTER 0
+%define CONFIG_THUMBNAIL_CUDA_FILTER 0
+%define CONFIG_TILE_FILTER 0
+%define CONFIG_TINTERLACE_FILTER 0
+%define CONFIG_TLUT2_FILTER 0
+%define CONFIG_TMEDIAN_FILTER 0
+%define CONFIG_TMIX_FILTER 0
+%define CONFIG_TONEMAP_FILTER 0
+%define CONFIG_TONEMAP_OPENCL_FILTER 0
+%define CONFIG_TONEMAP_VAAPI_FILTER 0
+%define CONFIG_TPAD_FILTER 0
+%define CONFIG_TRANSPOSE_FILTER 0
+%define CONFIG_TRANSPOSE_NPP_FILTER 0
+%define CONFIG_TRANSPOSE_OPENCL_FILTER 0
+%define CONFIG_TRANSPOSE_VAAPI_FILTER 0
+%define CONFIG_TRIM_FILTER 0
+%define CONFIG_UNPREMULTIPLY_FILTER 0
+%define CONFIG_UNSHARP_FILTER 0
+%define CONFIG_UNSHARP_OPENCL_FILTER 0
+%define CONFIG_USPP_FILTER 0
+%define CONFIG_V360_FILTER 0
+%define CONFIG_VAGUEDENOISER_FILTER 0
+%define CONFIG_VECTORSCOPE_FILTER 0
+%define CONFIG_VFLIP_FILTER 0
+%define CONFIG_VFRDET_FILTER 0
+%define CONFIG_VIBRANCE_FILTER 0
+%define CONFIG_VIDSTABDETECT_FILTER 0
+%define CONFIG_VIDSTABTRANSFORM_FILTER 0
+%define CONFIG_VIGNETTE_FILTER 0
+%define CONFIG_VMAFMOTION_FILTER 0
+%define CONFIG_VPP_QSV_FILTER 0
+%define CONFIG_VSTACK_FILTER 0
+%define CONFIG_W3FDIF_FILTER 0
+%define CONFIG_WAVEFORM_FILTER 0
+%define CONFIG_WEAVE_FILTER 0
+%define CONFIG_XBR_FILTER 0
+%define CONFIG_XFADE_FILTER 0
+%define CONFIG_XFADE_OPENCL_FILTER 0
+%define CONFIG_XMEDIAN_FILTER 0
+%define CONFIG_XSTACK_FILTER 0
+%define CONFIG_YADIF_FILTER 0
+%define CONFIG_YADIF_CUDA_FILTER 0
+%define CONFIG_YAEPBLUR_FILTER 0
+%define CONFIG_ZMQ_FILTER 0
+%define CONFIG_ZOOMPAN_FILTER 0
+%define CONFIG_ZSCALE_FILTER 0
+%define CONFIG_ALLRGB_FILTER 0
+%define CONFIG_ALLYUV_FILTER 0
+%define CONFIG_CELLAUTO_FILTER 0
+%define CONFIG_COLOR_FILTER 0
+%define CONFIG_COREIMAGESRC_FILTER 0
+%define CONFIG_FREI0R_SRC_FILTER 0
+%define CONFIG_HALDCLUTSRC_FILTER 0
+%define CONFIG_LIFE_FILTER 0
+%define CONFIG_MANDELBROT_FILTER 0
+%define CONFIG_MPTESTSRC_FILTER 0
+%define CONFIG_NULLSRC_FILTER 0
+%define CONFIG_OPENCLSRC_FILTER 0
+%define CONFIG_PAL75BARS_FILTER 0
+%define CONFIG_PAL100BARS_FILTER 0
+%define CONFIG_RGBTESTSRC_FILTER 0
+%define CONFIG_SIERPINSKI_FILTER 0
+%define CONFIG_SMPTEBARS_FILTER 0
+%define CONFIG_SMPTEHDBARS_FILTER 0
+%define CONFIG_TESTSRC_FILTER 0
+%define CONFIG_TESTSRC2_FILTER 0
+%define CONFIG_YUVTESTSRC_FILTER 0
+%define CONFIG_NULLSINK_FILTER 0
+%define CONFIG_ABITSCOPE_FILTER 0
+%define CONFIG_ADRAWGRAPH_FILTER 0
+%define CONFIG_AGRAPHMONITOR_FILTER 0
+%define CONFIG_AHISTOGRAM_FILTER 0
+%define CONFIG_APHASEMETER_FILTER 0
+%define CONFIG_AVECTORSCOPE_FILTER 0
+%define CONFIG_CONCAT_FILTER 0
+%define CONFIG_SHOWCQT_FILTER 0
+%define CONFIG_SHOWFREQS_FILTER 0
+%define CONFIG_SHOWSPATIAL_FILTER 0
+%define CONFIG_SHOWSPECTRUM_FILTER 0
+%define CONFIG_SHOWSPECTRUMPIC_FILTER 0
+%define CONFIG_SHOWVOLUME_FILTER 0
+%define CONFIG_SHOWWAVES_FILTER 0
+%define CONFIG_SHOWWAVESPIC_FILTER 0
+%define CONFIG_SPECTRUMSYNTH_FILTER 0
+%define CONFIG_AMOVIE_FILTER 0
+%define CONFIG_MOVIE_FILTER 0
+%define CONFIG_AFIFO_FILTER 0
+%define CONFIG_FIFO_FILTER 0
+%define CONFIG_AA_DEMUXER 0
+%define CONFIG_AAC_DEMUXER 1
+%define CONFIG_AC3_DEMUXER 0
+%define CONFIG_ACM_DEMUXER 0
+%define CONFIG_ACT_DEMUXER 0
+%define CONFIG_ADF_DEMUXER 0
+%define CONFIG_ADP_DEMUXER 0
+%define CONFIG_ADS_DEMUXER 0
+%define CONFIG_ADX_DEMUXER 0
+%define CONFIG_AEA_DEMUXER 0
+%define CONFIG_AFC_DEMUXER 0
+%define CONFIG_AIFF_DEMUXER 0
+%define CONFIG_AIX_DEMUXER 0
+%define CONFIG_ALP_DEMUXER 0
+%define CONFIG_AMR_DEMUXER 1
+%define CONFIG_AMRNB_DEMUXER 0
+%define CONFIG_AMRWB_DEMUXER 0
+%define CONFIG_ANM_DEMUXER 0
+%define CONFIG_APC_DEMUXER 0
+%define CONFIG_APE_DEMUXER 0
+%define CONFIG_APM_DEMUXER 0
+%define CONFIG_APNG_DEMUXER 0
+%define CONFIG_APTX_DEMUXER 0
+%define CONFIG_APTX_HD_DEMUXER 0
+%define CONFIG_AQTITLE_DEMUXER 0
+%define CONFIG_ARGO_ASF_DEMUXER 0
+%define CONFIG_ASF_DEMUXER 0
+%define CONFIG_ASF_O_DEMUXER 0
+%define CONFIG_ASS_DEMUXER 0
+%define CONFIG_AST_DEMUXER 0
+%define CONFIG_AU_DEMUXER 0
+%define CONFIG_AV1_DEMUXER 0
+%define CONFIG_AVI_DEMUXER 1
+%define CONFIG_AVISYNTH_DEMUXER 0
+%define CONFIG_AVR_DEMUXER 0
+%define CONFIG_AVS_DEMUXER 0
+%define CONFIG_AVS2_DEMUXER 0
+%define CONFIG_BETHSOFTVID_DEMUXER 0
+%define CONFIG_BFI_DEMUXER 0
+%define CONFIG_BINTEXT_DEMUXER 0
+%define CONFIG_BINK_DEMUXER 0
+%define CONFIG_BIT_DEMUXER 0
+%define CONFIG_BMV_DEMUXER 0
+%define CONFIG_BFSTM_DEMUXER 0
+%define CONFIG_BRSTM_DEMUXER 0
+%define CONFIG_BOA_DEMUXER 0
+%define CONFIG_C93_DEMUXER 0
+%define CONFIG_CAF_DEMUXER 0
+%define CONFIG_CAVSVIDEO_DEMUXER 0
+%define CONFIG_CDG_DEMUXER 0
+%define CONFIG_CDXL_DEMUXER 0
+%define CONFIG_CINE_DEMUXER 0
+%define CONFIG_CODEC2_DEMUXER 0
+%define CONFIG_CODEC2RAW_DEMUXER 0
+%define CONFIG_CONCAT_DEMUXER 0
+%define CONFIG_DASH_DEMUXER 0
+%define CONFIG_DATA_DEMUXER 0
+%define CONFIG_DAUD_DEMUXER 0
+%define CONFIG_DCSTR_DEMUXER 0
+%define CONFIG_DERF_DEMUXER 0
+%define CONFIG_DFA_DEMUXER 0
+%define CONFIG_DHAV_DEMUXER 0
+%define CONFIG_DIRAC_DEMUXER 0
+%define CONFIG_DNXHD_DEMUXER 0
+%define CONFIG_DSF_DEMUXER 0
+%define CONFIG_DSICIN_DEMUXER 0
+%define CONFIG_DSS_DEMUXER 0
+%define CONFIG_DTS_DEMUXER 0
+%define CONFIG_DTSHD_DEMUXER 0
+%define CONFIG_DV_DEMUXER 0
+%define CONFIG_DVBSUB_DEMUXER 0
+%define CONFIG_DVBTXT_DEMUXER 0
+%define CONFIG_DXA_DEMUXER 0
+%define CONFIG_EA_DEMUXER 0
+%define CONFIG_EA_CDATA_DEMUXER 0
+%define CONFIG_EAC3_DEMUXER 0
+%define CONFIG_EPAF_DEMUXER 0
+%define CONFIG_FFMETADATA_DEMUXER 0
+%define CONFIG_FILMSTRIP_DEMUXER 0
+%define CONFIG_FITS_DEMUXER 0
+%define CONFIG_FLAC_DEMUXER 1
+%define CONFIG_FLIC_DEMUXER 0
+%define CONFIG_FLV_DEMUXER 0
+%define CONFIG_LIVE_FLV_DEMUXER 0
+%define CONFIG_FOURXM_DEMUXER 0
+%define CONFIG_FRM_DEMUXER 0
+%define CONFIG_FSB_DEMUXER 0
+%define CONFIG_FWSE_DEMUXER 0
+%define CONFIG_G722_DEMUXER 0
+%define CONFIG_G723_1_DEMUXER 0
+%define CONFIG_G726_DEMUXER 0
+%define CONFIG_G726LE_DEMUXER 0
+%define CONFIG_G729_DEMUXER 0
+%define CONFIG_GDV_DEMUXER 0
+%define CONFIG_GENH_DEMUXER 0
+%define CONFIG_GIF_DEMUXER 0
+%define CONFIG_GSM_DEMUXER 1
+%define CONFIG_GXF_DEMUXER 0
+%define CONFIG_H261_DEMUXER 0
+%define CONFIG_H263_DEMUXER 0
+%define CONFIG_H264_DEMUXER 0
+%define CONFIG_HCA_DEMUXER 0
+%define CONFIG_HCOM_DEMUXER 0
+%define CONFIG_HEVC_DEMUXER 0
+%define CONFIG_HLS_DEMUXER 0
+%define CONFIG_HNM_DEMUXER 0
+%define CONFIG_ICO_DEMUXER 0
+%define CONFIG_IDCIN_DEMUXER 0
+%define CONFIG_IDF_DEMUXER 0
+%define CONFIG_IFF_DEMUXER 0
+%define CONFIG_IFV_DEMUXER 0
+%define CONFIG_ILBC_DEMUXER 0
+%define CONFIG_IMAGE2_DEMUXER 0
+%define CONFIG_IMAGE2PIPE_DEMUXER 0
+%define CONFIG_IMAGE2_ALIAS_PIX_DEMUXER 0
+%define CONFIG_IMAGE2_BRENDER_PIX_DEMUXER 0
+%define CONFIG_INGENIENT_DEMUXER 0
+%define CONFIG_IPMOVIE_DEMUXER 0
+%define CONFIG_IRCAM_DEMUXER 0
+%define CONFIG_ISS_DEMUXER 0
+%define CONFIG_IV8_DEMUXER 0
+%define CONFIG_IVF_DEMUXER 0
+%define CONFIG_IVR_DEMUXER 0
+%define CONFIG_JACOSUB_DEMUXER 0
+%define CONFIG_JV_DEMUXER 0
+%define CONFIG_KUX_DEMUXER 0
+%define CONFIG_KVAG_DEMUXER 0
+%define CONFIG_LMLM4_DEMUXER 0
+%define CONFIG_LOAS_DEMUXER 0
+%define CONFIG_LRC_DEMUXER 0
+%define CONFIG_LVF_DEMUXER 0
+%define CONFIG_LXF_DEMUXER 0
+%define CONFIG_M4V_DEMUXER 0
+%define CONFIG_MATROSKA_DEMUXER 1
+%define CONFIG_MGSTS_DEMUXER 0
+%define CONFIG_MICRODVD_DEMUXER 0
+%define CONFIG_MJPEG_DEMUXER 0
+%define CONFIG_MJPEG_2000_DEMUXER 0
+%define CONFIG_MLP_DEMUXER 0
+%define CONFIG_MLV_DEMUXER 0
+%define CONFIG_MM_DEMUXER 0
+%define CONFIG_MMF_DEMUXER 0
+%define CONFIG_MOV_DEMUXER 1
+%define CONFIG_MP3_DEMUXER 1
+%define CONFIG_MPC_DEMUXER 0
+%define CONFIG_MPC8_DEMUXER 0
+%define CONFIG_MPEGPS_DEMUXER 0
+%define CONFIG_MPEGTS_DEMUXER 0
+%define CONFIG_MPEGTSRAW_DEMUXER 0
+%define CONFIG_MPEGVIDEO_DEMUXER 0
+%define CONFIG_MPJPEG_DEMUXER 0
+%define CONFIG_MPL2_DEMUXER 0
+%define CONFIG_MPSUB_DEMUXER 0
+%define CONFIG_MSF_DEMUXER 0
+%define CONFIG_MSNWC_TCP_DEMUXER 0
+%define CONFIG_MTAF_DEMUXER 0
+%define CONFIG_MTV_DEMUXER 0
+%define CONFIG_MUSX_DEMUXER 0
+%define CONFIG_MV_DEMUXER 0
+%define CONFIG_MVI_DEMUXER 0
+%define CONFIG_MXF_DEMUXER 0
+%define CONFIG_MXG_DEMUXER 0
+%define CONFIG_NC_DEMUXER 0
+%define CONFIG_NISTSPHERE_DEMUXER 0
+%define CONFIG_NSP_DEMUXER 0
+%define CONFIG_NSV_DEMUXER 0
+%define CONFIG_NUT_DEMUXER 0
+%define CONFIG_NUV_DEMUXER 0
+%define CONFIG_OGG_DEMUXER 1
+%define CONFIG_OMA_DEMUXER 0
+%define CONFIG_PAF_DEMUXER 0
+%define CONFIG_PCM_ALAW_DEMUXER 0
+%define CONFIG_PCM_MULAW_DEMUXER 0
+%define CONFIG_PCM_VIDC_DEMUXER 0
+%define CONFIG_PCM_F64BE_DEMUXER 0
+%define CONFIG_PCM_F64LE_DEMUXER 0
+%define CONFIG_PCM_F32BE_DEMUXER 0
+%define CONFIG_PCM_F32LE_DEMUXER 0
+%define CONFIG_PCM_S32BE_DEMUXER 0
+%define CONFIG_PCM_S32LE_DEMUXER 0
+%define CONFIG_PCM_S24BE_DEMUXER 0
+%define CONFIG_PCM_S24LE_DEMUXER 0
+%define CONFIG_PCM_S16BE_DEMUXER 0
+%define CONFIG_PCM_S16LE_DEMUXER 0
+%define CONFIG_PCM_S8_DEMUXER 0
+%define CONFIG_PCM_U32BE_DEMUXER 0
+%define CONFIG_PCM_U32LE_DEMUXER 0
+%define CONFIG_PCM_U24BE_DEMUXER 0
+%define CONFIG_PCM_U24LE_DEMUXER 0
+%define CONFIG_PCM_U16BE_DEMUXER 0
+%define CONFIG_PCM_U16LE_DEMUXER 0
+%define CONFIG_PCM_U8_DEMUXER 0
+%define CONFIG_PJS_DEMUXER 0
+%define CONFIG_PMP_DEMUXER 0
+%define CONFIG_PVA_DEMUXER 0
+%define CONFIG_PVF_DEMUXER 0
+%define CONFIG_QCP_DEMUXER 0
+%define CONFIG_R3D_DEMUXER 0
+%define CONFIG_RAWVIDEO_DEMUXER 0
+%define CONFIG_REALTEXT_DEMUXER 0
+%define CONFIG_REDSPARK_DEMUXER 0
+%define CONFIG_RL2_DEMUXER 0
+%define CONFIG_RM_DEMUXER 0
+%define CONFIG_ROQ_DEMUXER 0
+%define CONFIG_RPL_DEMUXER 0
+%define CONFIG_RSD_DEMUXER 0
+%define CONFIG_RSO_DEMUXER 0
+%define CONFIG_RTP_DEMUXER 0
+%define CONFIG_RTSP_DEMUXER 0
+%define CONFIG_S337M_DEMUXER 0
+%define CONFIG_SAMI_DEMUXER 0
+%define CONFIG_SAP_DEMUXER 0
+%define CONFIG_SBC_DEMUXER 0
+%define CONFIG_SBG_DEMUXER 0
+%define CONFIG_SCC_DEMUXER 0
+%define CONFIG_SDP_DEMUXER 0
+%define CONFIG_SDR2_DEMUXER 0
+%define CONFIG_SDS_DEMUXER 0
+%define CONFIG_SDX_DEMUXER 0
+%define CONFIG_SEGAFILM_DEMUXER 0
+%define CONFIG_SER_DEMUXER 0
+%define CONFIG_SHORTEN_DEMUXER 0
+%define CONFIG_SIFF_DEMUXER 0
+%define CONFIG_SLN_DEMUXER 0
+%define CONFIG_SMACKER_DEMUXER 0
+%define CONFIG_SMJPEG_DEMUXER 0
+%define CONFIG_SMUSH_DEMUXER 0
+%define CONFIG_SOL_DEMUXER 0
+%define CONFIG_SOX_DEMUXER 0
+%define CONFIG_SPDIF_DEMUXER 0
+%define CONFIG_SRT_DEMUXER 0
+%define CONFIG_STR_DEMUXER 0
+%define CONFIG_STL_DEMUXER 0
+%define CONFIG_SUBVIEWER1_DEMUXER 0
+%define CONFIG_SUBVIEWER_DEMUXER 0
+%define CONFIG_SUP_DEMUXER 0
+%define CONFIG_SVAG_DEMUXER 0
+%define CONFIG_SWF_DEMUXER 0
+%define CONFIG_TAK_DEMUXER 0
+%define CONFIG_TEDCAPTIONS_DEMUXER 0
+%define CONFIG_THP_DEMUXER 0
+%define CONFIG_THREEDOSTR_DEMUXER 0
+%define CONFIG_TIERTEXSEQ_DEMUXER 0
+%define CONFIG_TMV_DEMUXER 0
+%define CONFIG_TRUEHD_DEMUXER 0
+%define CONFIG_TTA_DEMUXER 0
+%define CONFIG_TXD_DEMUXER 0
+%define CONFIG_TTY_DEMUXER 0
+%define CONFIG_TY_DEMUXER 0
+%define CONFIG_V210_DEMUXER 0
+%define CONFIG_V210X_DEMUXER 0
+%define CONFIG_VAG_DEMUXER 0
+%define CONFIG_VC1_DEMUXER 0
+%define CONFIG_VC1T_DEMUXER 0
+%define CONFIG_VIVIDAS_DEMUXER 0
+%define CONFIG_VIVO_DEMUXER 0
+%define CONFIG_VMD_DEMUXER 0
+%define CONFIG_VOBSUB_DEMUXER 0
+%define CONFIG_VOC_DEMUXER 0
+%define CONFIG_VPK_DEMUXER 0
+%define CONFIG_VPLAYER_DEMUXER 0
+%define CONFIG_VQF_DEMUXER 0
+%define CONFIG_W64_DEMUXER 0
+%define CONFIG_WAV_DEMUXER 1
+%define CONFIG_WC3_DEMUXER 0
+%define CONFIG_WEBM_DASH_MANIFEST_DEMUXER 0
+%define CONFIG_WEBVTT_DEMUXER 0
+%define CONFIG_WSAUD_DEMUXER 0
+%define CONFIG_WSD_DEMUXER 0
+%define CONFIG_WSVQA_DEMUXER 0
+%define CONFIG_WTV_DEMUXER 0
+%define CONFIG_WVE_DEMUXER 0
+%define CONFIG_WV_DEMUXER 0
+%define CONFIG_XA_DEMUXER 0
+%define CONFIG_XBIN_DEMUXER 0
+%define CONFIG_XMV_DEMUXER 0
+%define CONFIG_XVAG_DEMUXER 0
+%define CONFIG_XWMA_DEMUXER 0
+%define CONFIG_YOP_DEMUXER 0
+%define CONFIG_YUV4MPEGPIPE_DEMUXER 0
+%define CONFIG_IMAGE_BMP_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_DDS_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_DPX_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_EXR_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_GIF_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_J2K_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_JPEG_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_JPEGLS_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_PAM_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_PBM_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_PCX_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_PGMYUV_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_PGM_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_PICTOR_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_PNG_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_PPM_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_PSD_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_QDRAW_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_SGI_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_SVG_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_SUNRAST_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_TIFF_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_WEBP_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_XPM_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_XWD_PIPE_DEMUXER 0
+%define CONFIG_LIBGME_DEMUXER 0
+%define CONFIG_LIBMODPLUG_DEMUXER 0
+%define CONFIG_LIBOPENMPT_DEMUXER 0
+%define CONFIG_VAPOURSYNTH_DEMUXER 0
+%define CONFIG_A64_MUXER 0
+%define CONFIG_AC3_MUXER 0
+%define CONFIG_ADTS_MUXER 0
+%define CONFIG_ADX_MUXER 0
+%define CONFIG_AIFF_MUXER 0
+%define CONFIG_AMR_MUXER 0
+%define CONFIG_APNG_MUXER 0
+%define CONFIG_APTX_MUXER 0
+%define CONFIG_APTX_HD_MUXER 0
+%define CONFIG_ASF_MUXER 0
+%define CONFIG_ASS_MUXER 0
+%define CONFIG_AST_MUXER 0
+%define CONFIG_ASF_STREAM_MUXER 0
+%define CONFIG_AU_MUXER 0
+%define CONFIG_AVI_MUXER 0
+%define CONFIG_AVM2_MUXER 0
+%define CONFIG_AVS2_MUXER 0
+%define CONFIG_BIT_MUXER 0
+%define CONFIG_CAF_MUXER 0
+%define CONFIG_CAVSVIDEO_MUXER 0
+%define CONFIG_CODEC2_MUXER 0
+%define CONFIG_CODEC2RAW_MUXER 0
+%define CONFIG_CRC_MUXER 0
+%define CONFIG_DASH_MUXER 0
+%define CONFIG_DATA_MUXER 0
+%define CONFIG_DAUD_MUXER 0
+%define CONFIG_DIRAC_MUXER 0
+%define CONFIG_DNXHD_MUXER 0
+%define CONFIG_DTS_MUXER 0
+%define CONFIG_DV_MUXER 0
+%define CONFIG_EAC3_MUXER 0
+%define CONFIG_F4V_MUXER 0
+%define CONFIG_FFMETADATA_MUXER 0
+%define CONFIG_FIFO_MUXER 0
+%define CONFIG_FIFO_TEST_MUXER 0
+%define CONFIG_FILMSTRIP_MUXER 0
+%define CONFIG_FITS_MUXER 0
+%define CONFIG_FLAC_MUXER 0
+%define CONFIG_FLV_MUXER 0
+%define CONFIG_FRAMECRC_MUXER 0
+%define CONFIG_FRAMEHASH_MUXER 0
+%define CONFIG_FRAMEMD5_MUXER 0
+%define CONFIG_G722_MUXER 0
+%define CONFIG_G723_1_MUXER 0
+%define CONFIG_G726_MUXER 0
+%define CONFIG_G726LE_MUXER 0
+%define CONFIG_GIF_MUXER 0
+%define CONFIG_GSM_MUXER 0
+%define CONFIG_GXF_MUXER 0
+%define CONFIG_H261_MUXER 0
+%define CONFIG_H263_MUXER 0
+%define CONFIG_H264_MUXER 0
+%define CONFIG_HASH_MUXER 0
+%define CONFIG_HDS_MUXER 0
+%define CONFIG_HEVC_MUXER 0
+%define CONFIG_HLS_MUXER 0
+%define CONFIG_ICO_MUXER 0
+%define CONFIG_ILBC_MUXER 0
+%define CONFIG_IMAGE2_MUXER 0
+%define CONFIG_IMAGE2PIPE_MUXER 0
+%define CONFIG_IPOD_MUXER 0
+%define CONFIG_IRCAM_MUXER 0
+%define CONFIG_ISMV_MUXER 0
+%define CONFIG_IVF_MUXER 0
+%define CONFIG_JACOSUB_MUXER 0
+%define CONFIG_LATM_MUXER 0
+%define CONFIG_LRC_MUXER 0
+%define CONFIG_M4V_MUXER 0
+%define CONFIG_MD5_MUXER 0
+%define CONFIG_MATROSKA_MUXER 0
+%define CONFIG_MATROSKA_AUDIO_MUXER 0
+%define CONFIG_MICRODVD_MUXER 0
+%define CONFIG_MJPEG_MUXER 0
+%define CONFIG_MLP_MUXER 0
+%define CONFIG_MMF_MUXER 0
+%define CONFIG_MOV_MUXER 0
+%define CONFIG_MP2_MUXER 0
+%define CONFIG_MP3_MUXER 0
+%define CONFIG_MP4_MUXER 0
+%define CONFIG_MPEG1SYSTEM_MUXER 0
+%define CONFIG_MPEG1VCD_MUXER 0
+%define CONFIG_MPEG1VIDEO_MUXER 0
+%define CONFIG_MPEG2DVD_MUXER 0
+%define CONFIG_MPEG2SVCD_MUXER 0
+%define CONFIG_MPEG2VIDEO_MUXER 0
+%define CONFIG_MPEG2VOB_MUXER 0
+%define CONFIG_MPEGTS_MUXER 0
+%define CONFIG_MPJPEG_MUXER 0
+%define CONFIG_MXF_MUXER 0
+%define CONFIG_MXF_D10_MUXER 0
+%define CONFIG_MXF_OPATOM_MUXER 0
+%define CONFIG_NULL_MUXER 0
+%define CONFIG_NUT_MUXER 0
+%define CONFIG_OGA_MUXER 0
+%define CONFIG_OGG_MUXER 0
+%define CONFIG_OGV_MUXER 0
+%define CONFIG_OMA_MUXER 0
+%define CONFIG_OPUS_MUXER 0
+%define CONFIG_PCM_ALAW_MUXER 0
+%define CONFIG_PCM_MULAW_MUXER 0
+%define CONFIG_PCM_VIDC_MUXER 0
+%define CONFIG_PCM_F64BE_MUXER 0
+%define CONFIG_PCM_F64LE_MUXER 0
+%define CONFIG_PCM_F32BE_MUXER 0
+%define CONFIG_PCM_F32LE_MUXER 0
+%define CONFIG_PCM_S32BE_MUXER 0
+%define CONFIG_PCM_S32LE_MUXER 0
+%define CONFIG_PCM_S24BE_MUXER 0
+%define CONFIG_PCM_S24LE_MUXER 0
+%define CONFIG_PCM_S16BE_MUXER 0
+%define CONFIG_PCM_S16LE_MUXER 0
+%define CONFIG_PCM_S8_MUXER 0
+%define CONFIG_PCM_U32BE_MUXER 0
+%define CONFIG_PCM_U32LE_MUXER 0
+%define CONFIG_PCM_U24BE_MUXER 0
+%define CONFIG_PCM_U24LE_MUXER 0
+%define CONFIG_PCM_U16BE_MUXER 0
+%define CONFIG_PCM_U16LE_MUXER 0
+%define CONFIG_PCM_U8_MUXER 0
+%define CONFIG_PSP_MUXER 0
+%define CONFIG_RAWVIDEO_MUXER 0
+%define CONFIG_RM_MUXER 0
+%define CONFIG_ROQ_MUXER 0
+%define CONFIG_RSO_MUXER 0
+%define CONFIG_RTP_MUXER 0
+%define CONFIG_RTP_MPEGTS_MUXER 0
+%define CONFIG_RTSP_MUXER 0
+%define CONFIG_SAP_MUXER 0
+%define CONFIG_SBC_MUXER 0
+%define CONFIG_SCC_MUXER 0
+%define CONFIG_SEGAFILM_MUXER 0
+%define CONFIG_SEGMENT_MUXER 0
+%define CONFIG_STREAM_SEGMENT_MUXER 0
+%define CONFIG_SINGLEJPEG_MUXER 0
+%define CONFIG_SMJPEG_MUXER 0
+%define CONFIG_SMOOTHSTREAMING_MUXER 0
+%define CONFIG_SOX_MUXER 0
+%define CONFIG_SPX_MUXER 0
+%define CONFIG_SPDIF_MUXER 0
+%define CONFIG_SRT_MUXER 0
+%define CONFIG_STREAMHASH_MUXER 0
+%define CONFIG_SUP_MUXER 0
+%define CONFIG_SWF_MUXER 0
+%define CONFIG_TEE_MUXER 0
+%define CONFIG_TG2_MUXER 0
+%define CONFIG_TGP_MUXER 0
+%define CONFIG_MKVTIMESTAMP_V2_MUXER 0
+%define CONFIG_TRUEHD_MUXER 0
+%define CONFIG_TTA_MUXER 0
+%define CONFIG_UNCODEDFRAMECRC_MUXER 0
+%define CONFIG_VC1_MUXER 0
+%define CONFIG_VC1T_MUXER 0
+%define CONFIG_VOC_MUXER 0
+%define CONFIG_W64_MUXER 0
+%define CONFIG_WAV_MUXER 0
+%define CONFIG_WEBM_MUXER 0
+%define CONFIG_WEBM_DASH_MANIFEST_MUXER 0
+%define CONFIG_WEBM_CHUNK_MUXER 0
+%define CONFIG_WEBP_MUXER 0
+%define CONFIG_WEBVTT_MUXER 0
+%define CONFIG_WTV_MUXER 0
+%define CONFIG_WV_MUXER 0
+%define CONFIG_YUV4MPEGPIPE_MUXER 0
+%define CONFIG_CHROMAPRINT_MUXER 0
+%define CONFIG_ASYNC_PROTOCOL 0
+%define CONFIG_BLURAY_PROTOCOL 0
+%define CONFIG_CACHE_PROTOCOL 0
+%define CONFIG_CONCAT_PROTOCOL 0
+%define CONFIG_CRYPTO_PROTOCOL 0
+%define CONFIG_DATA_PROTOCOL 0
+%define CONFIG_FFRTMPCRYPT_PROTOCOL 0
+%define CONFIG_FFRTMPHTTP_PROTOCOL 0
+%define CONFIG_FILE_PROTOCOL 0
+%define CONFIG_FTP_PROTOCOL 0
+%define CONFIG_GOPHER_PROTOCOL 0
+%define CONFIG_HLS_PROTOCOL 0
+%define CONFIG_HTTP_PROTOCOL 0
+%define CONFIG_HTTPPROXY_PROTOCOL 0
+%define CONFIG_HTTPS_PROTOCOL 0
+%define CONFIG_ICECAST_PROTOCOL 0
+%define CONFIG_MMSH_PROTOCOL 0
+%define CONFIG_MMST_PROTOCOL 0
+%define CONFIG_MD5_PROTOCOL 0
+%define CONFIG_PIPE_PROTOCOL 0
+%define CONFIG_PROMPEG_PROTOCOL 0
+%define CONFIG_RTMP_PROTOCOL 0
+%define CONFIG_RTMPE_PROTOCOL 0
+%define CONFIG_RTMPS_PROTOCOL 0
+%define CONFIG_RTMPT_PROTOCOL 0
+%define CONFIG_RTMPTE_PROTOCOL 0
+%define CONFIG_RTMPTS_PROTOCOL 0
+%define CONFIG_RTP_PROTOCOL 0
+%define CONFIG_SCTP_PROTOCOL 0
+%define CONFIG_SRTP_PROTOCOL 0
+%define CONFIG_SUBFILE_PROTOCOL 0
+%define CONFIG_TEE_PROTOCOL 0
+%define CONFIG_TCP_PROTOCOL 0
+%define CONFIG_TLS_PROTOCOL 0
+%define CONFIG_UDP_PROTOCOL 0
+%define CONFIG_UDPLITE_PROTOCOL 0
+%define CONFIG_UNIX_PROTOCOL 0
+%define CONFIG_LIBAMQP_PROTOCOL 0
+%define CONFIG_LIBRTMP_PROTOCOL 0
+%define CONFIG_LIBRTMPE_PROTOCOL 0
+%define CONFIG_LIBRTMPS_PROTOCOL 0
+%define CONFIG_LIBRTMPT_PROTOCOL 0
+%define CONFIG_LIBRTMPTE_PROTOCOL 0
+%define CONFIG_LIBSRT_PROTOCOL 0
+%define CONFIG_LIBSSH_PROTOCOL 0
+%define CONFIG_LIBSMBCLIENT_PROTOCOL 0
+%define CONFIG_LIBZMQ_PROTOCOL 0
diff --git a/fuchsia/config/max/x64/config.h b/fuchsia/config/max/x64/config.h
new file mode 100644
index 0000000..8bb13d1
--- /dev/null
+++ b/fuchsia/config/max/x64/config.h
@@ -0,0 +1,2588 @@
+/* Automatically generated by configure - do not modify! */
+#ifndef FFMPEG_CONFIG_H
+#define FFMPEG_CONFIG_H
+#define FFMPEG_CONFIGURATION "--disable-everything --disable-all --disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages --disable-static --enable-avcodec --enable-avformat --enable-avutil --enable-fft --enable-rdft --enable-static --enable-libopus --disable-debug --disable-bzlib --disable-iconv --disable-lzo --disable-network --disable-schannel --disable-sdl2 --disable-symver --disable-xlib --disable-zlib --disable-securetransport --disable-faan --disable-alsa --disable-autodetect --enable-decoder='vorbis,libopus,flac' --enable-decoder='pcm_u8,pcm_s16le,pcm_s24le,pcm_s32le,pcm_f32le,mp3' --enable-decoder='pcm_s16be,pcm_s24be,pcm_mulaw,pcm_alaw' --enable-decoder='theora,vp8,sbc,aptx' --enable-demuxer='ogg,matroska,wav,flac,mp3,mov' --enable-parser='opus,vorbis,flac,mpegaudio' --extra-cflags=-I/usr/local/google/home/dalesat/fuchsia/third_party/opus/include --enable-parser='vp3,vp8' --optflags='\"-O2\"' --enable-pic --x86asmexe=yasm --enable-pic --enable-lto --cc=clang --cxx=clang++ --ld=clang --enable-decoder=vp9 --enable-parser=vp9 --sysroot=/usr/local/google/home/dalesat/fuchsia/third_party/ffmpeg/../../prebuilt/third_party/sysroot/linux --extra-ldflags='-fuse-ld=lld' --enable-decoder='aac,aac_latm,h264,mp3' --enable-demuxer='aac,mp3,mov' --enable-parser='aac,aac_latm,h264,mpegaudio' --enable-decoder=mpeg4 --enable-parser='h263,mpeg4video' --enable-demuxer=avi --enable-demuxer=amr --enable-decoder='amrnb,amrwb' --enable-decoder=gsm_ms --enable-demuxer=gsm --enable-parser=gsm"
+#define FFMPEG_LICENSE "LGPL version 2.1 or later"
+#define CONFIG_THIS_YEAR 2020
+#define FFMPEG_DATADIR "/usr/local/share/ffmpeg"
+#define AVCONV_DATADIR "/usr/local/share/ffmpeg"
+#define CC_IDENT "Fuchsia clang version 11.0.0 (https://fuchsia.googlesource.com/a/third_party/llvm-project dd484baffdf4a92e564c38a17d35a742e633b0e0)"
+#define av_restrict restrict
+#define EXTERN_PREFIX ""
+#define EXTERN_ASM
+#define BUILDSUF ""
+#define SLIBSUF ".so"
+#define HAVE_MMX2 HAVE_MMXEXT
+#define SWS_MAX_FILTER_SIZE 256
+#define ARCH_AARCH64 0
+#define ARCH_ALPHA 0
+#define ARCH_ARM 0
+#define ARCH_AVR32 0
+#define ARCH_AVR32_AP 0
+#define ARCH_AVR32_UC 0
+#define ARCH_BFIN 0
+#define ARCH_IA64 0
+#define ARCH_M68K 0
+#define ARCH_MIPS 0
+#define ARCH_MIPS64 0
+#define ARCH_PARISC 0
+#define ARCH_PPC 0
+#define ARCH_PPC64 0
+#define ARCH_S390 0
+#define ARCH_SH4 0
+#define ARCH_SPARC 0
+#define ARCH_SPARC64 0
+#define ARCH_TILEGX 0
+#define ARCH_TILEPRO 0
+#define ARCH_TOMI 0
+#define ARCH_X86 1
+#define ARCH_X86_32 0
+#define ARCH_X86_64 1
+#define HAVE_ARMV5TE 0
+#define HAVE_ARMV6 0
+#define HAVE_ARMV6T2 0
+#define HAVE_ARMV8 0
+#define HAVE_NEON 0
+#define HAVE_VFP 0
+#define HAVE_VFPV3 0
+#define HAVE_SETEND 0
+#define HAVE_ALTIVEC 0
+#define HAVE_DCBZL 0
+#define HAVE_LDBRX 0
+#define HAVE_POWER8 0
+#define HAVE_PPC4XX 0
+#define HAVE_VSX 0
+#define HAVE_AESNI 1
+#define HAVE_AMD3DNOW 1
+#define HAVE_AMD3DNOWEXT 1
+#define HAVE_AVX 1
+#define HAVE_AVX2 1
+#define HAVE_AVX512 1
+#define HAVE_FMA3 1
+#define HAVE_FMA4 1
+#define HAVE_MMX 1
+#define HAVE_MMXEXT 1
+#define HAVE_SSE 1
+#define HAVE_SSE2 1
+#define HAVE_SSE3 1
+#define HAVE_SSE4 1
+#define HAVE_SSE42 1
+#define HAVE_SSSE3 1
+#define HAVE_XOP 1
+#define HAVE_CPUNOP 1
+#define HAVE_I686 1
+#define HAVE_MIPSFPU 0
+#define HAVE_MIPS32R2 0
+#define HAVE_MIPS32R5 0
+#define HAVE_MIPS64R2 0
+#define HAVE_MIPS32R6 0
+#define HAVE_MIPS64R6 0
+#define HAVE_MIPSDSP 0
+#define HAVE_MIPSDSPR2 0
+#define HAVE_MSA 0
+#define HAVE_MSA2 0
+#define HAVE_LOONGSON2 0
+#define HAVE_LOONGSON3 0
+#define HAVE_MMI 0
+#define HAVE_ARMV5TE_EXTERNAL 0
+#define HAVE_ARMV6_EXTERNAL 0
+#define HAVE_ARMV6T2_EXTERNAL 0
+#define HAVE_ARMV8_EXTERNAL 0
+#define HAVE_NEON_EXTERNAL 0
+#define HAVE_VFP_EXTERNAL 0
+#define HAVE_VFPV3_EXTERNAL 0
+#define HAVE_SETEND_EXTERNAL 0
+#define HAVE_ALTIVEC_EXTERNAL 0
+#define HAVE_DCBZL_EXTERNAL 0
+#define HAVE_LDBRX_EXTERNAL 0
+#define HAVE_POWER8_EXTERNAL 0
+#define HAVE_PPC4XX_EXTERNAL 0
+#define HAVE_VSX_EXTERNAL 0
+#define HAVE_AESNI_EXTERNAL 1
+#define HAVE_AMD3DNOW_EXTERNAL 1
+#define HAVE_AMD3DNOWEXT_EXTERNAL 1
+#define HAVE_AVX_EXTERNAL 1
+#define HAVE_AVX2_EXTERNAL 1
+#define HAVE_AVX512_EXTERNAL 0
+#define HAVE_FMA3_EXTERNAL 1
+#define HAVE_FMA4_EXTERNAL 1
+#define HAVE_MMX_EXTERNAL 1
+#define HAVE_MMXEXT_EXTERNAL 1
+#define HAVE_SSE_EXTERNAL 1
+#define HAVE_SSE2_EXTERNAL 1
+#define HAVE_SSE3_EXTERNAL 1
+#define HAVE_SSE4_EXTERNAL 1
+#define HAVE_SSE42_EXTERNAL 1
+#define HAVE_SSSE3_EXTERNAL 1
+#define HAVE_XOP_EXTERNAL 1
+#define HAVE_CPUNOP_EXTERNAL 0
+#define HAVE_I686_EXTERNAL 0
+#define HAVE_MIPSFPU_EXTERNAL 0
+#define HAVE_MIPS32R2_EXTERNAL 0
+#define HAVE_MIPS32R5_EXTERNAL 0
+#define HAVE_MIPS64R2_EXTERNAL 0
+#define HAVE_MIPS32R6_EXTERNAL 0
+#define HAVE_MIPS64R6_EXTERNAL 0
+#define HAVE_MIPSDSP_EXTERNAL 0
+#define HAVE_MIPSDSPR2_EXTERNAL 0
+#define HAVE_MSA_EXTERNAL 0
+#define HAVE_MSA2_EXTERNAL 0
+#define HAVE_LOONGSON2_EXTERNAL 0
+#define HAVE_LOONGSON3_EXTERNAL 0
+#define HAVE_MMI_EXTERNAL 0
+#define HAVE_ARMV5TE_INLINE 0
+#define HAVE_ARMV6_INLINE 0
+#define HAVE_ARMV6T2_INLINE 0
+#define HAVE_ARMV8_INLINE 0
+#define HAVE_NEON_INLINE 0
+#define HAVE_VFP_INLINE 0
+#define HAVE_VFPV3_INLINE 0
+#define HAVE_SETEND_INLINE 0
+#define HAVE_ALTIVEC_INLINE 0
+#define HAVE_DCBZL_INLINE 0
+#define HAVE_LDBRX_INLINE 0
+#define HAVE_POWER8_INLINE 0
+#define HAVE_PPC4XX_INLINE 0
+#define HAVE_VSX_INLINE 0
+#define HAVE_AESNI_INLINE 1
+#define HAVE_AMD3DNOW_INLINE 1
+#define HAVE_AMD3DNOWEXT_INLINE 1
+#define HAVE_AVX_INLINE 1
+#define HAVE_AVX2_INLINE 1
+#define HAVE_AVX512_INLINE 1
+#define HAVE_FMA3_INLINE 1
+#define HAVE_FMA4_INLINE 1
+#define HAVE_MMX_INLINE 1
+#define HAVE_MMXEXT_INLINE 1
+#define HAVE_SSE_INLINE 1
+#define HAVE_SSE2_INLINE 1
+#define HAVE_SSE3_INLINE 1
+#define HAVE_SSE4_INLINE 1
+#define HAVE_SSE42_INLINE 1
+#define HAVE_SSSE3_INLINE 1
+#define HAVE_XOP_INLINE 1
+#define HAVE_CPUNOP_INLINE 0
+#define HAVE_I686_INLINE 0
+#define HAVE_MIPSFPU_INLINE 0
+#define HAVE_MIPS32R2_INLINE 0
+#define HAVE_MIPS32R5_INLINE 0
+#define HAVE_MIPS64R2_INLINE 0
+#define HAVE_MIPS32R6_INLINE 0
+#define HAVE_MIPS64R6_INLINE 0
+#define HAVE_MIPSDSP_INLINE 0
+#define HAVE_MIPSDSPR2_INLINE 0
+#define HAVE_MSA_INLINE 0
+#define HAVE_MSA2_INLINE 0
+#define HAVE_LOONGSON2_INLINE 0
+#define HAVE_LOONGSON3_INLINE 0
+#define HAVE_MMI_INLINE 0
+#define HAVE_ALIGNED_STACK 1
+#define HAVE_FAST_64BIT 1
+#define HAVE_FAST_CLZ 1
+#define HAVE_FAST_CMOV 1
+#define HAVE_LOCAL_ALIGNED 1
+#define HAVE_SIMD_ALIGN_16 1
+#define HAVE_SIMD_ALIGN_32 1
+#define HAVE_SIMD_ALIGN_64 1
+#define HAVE_ATOMIC_CAS_PTR 0
+#define HAVE_MACHINE_RW_BARRIER 0
+#define HAVE_MEMORYBARRIER 0
+#define HAVE_MM_EMPTY 1
+#define HAVE_RDTSC 0
+#define HAVE_SEM_TIMEDWAIT 1
+#define HAVE_SYNC_VAL_COMPARE_AND_SWAP 1
+#define HAVE_CABS 0
+#define HAVE_CEXP 0
+#define HAVE_INLINE_ASM 1
+#define HAVE_SYMVER 0
+#define HAVE_X86ASM 1
+#define HAVE_BIGENDIAN 0
+#define HAVE_FAST_UNALIGNED 1
+#define HAVE_ARPA_INET_H 0
+#define HAVE_ASM_TYPES_H 1
+#define HAVE_CDIO_PARANOIA_H 0
+#define HAVE_CDIO_PARANOIA_PARANOIA_H 0
+#define HAVE_CUDA_H 0
+#define HAVE_DISPATCH_DISPATCH_H 0
+#define HAVE_DEV_BKTR_IOCTL_BT848_H 0
+#define HAVE_DEV_BKTR_IOCTL_METEOR_H 0
+#define HAVE_DEV_IC_BT8XX_H 0
+#define HAVE_DEV_VIDEO_BKTR_IOCTL_BT848_H 0
+#define HAVE_DEV_VIDEO_METEOR_IOCTL_METEOR_H 0
+#define HAVE_DIRECT_H 0
+#define HAVE_DIRENT_H 1
+#define HAVE_DXGIDEBUG_H 0
+#define HAVE_DXVA_H 0
+#define HAVE_ES2_GL_H 0
+#define HAVE_GSM_H 0
+#define HAVE_IO_H 0
+#define HAVE_LINUX_PERF_EVENT_H 1
+#define HAVE_MACHINE_IOCTL_BT848_H 0
+#define HAVE_MACHINE_IOCTL_METEOR_H 0
+#define HAVE_MALLOC_H 1
+#define HAVE_OPENCV2_CORE_CORE_C_H 0
+#define HAVE_OPENGL_GL3_H 0
+#define HAVE_POLL_H 1
+#define HAVE_SYS_PARAM_H 1
+#define HAVE_SYS_RESOURCE_H 1
+#define HAVE_SYS_SELECT_H 1
+#define HAVE_SYS_SOUNDCARD_H 1
+#define HAVE_SYS_TIME_H 1
+#define HAVE_SYS_UN_H 1
+#define HAVE_SYS_VIDEOIO_H 0
+#define HAVE_TERMIOS_H 1
+#define HAVE_UDPLITE_H 0
+#define HAVE_UNISTD_H 1
+#define HAVE_VALGRIND_VALGRIND_H 0
+#define HAVE_WINDOWS_H 0
+#define HAVE_WINSOCK2_H 0
+#define HAVE_INTRINSICS_NEON 0
+#define HAVE_ATANF 1
+#define HAVE_ATAN2F 1
+#define HAVE_CBRT 1
+#define HAVE_CBRTF 1
+#define HAVE_COPYSIGN 1
+#define HAVE_COSF 1
+#define HAVE_ERF 1
+#define HAVE_EXP2 1
+#define HAVE_EXP2F 1
+#define HAVE_EXPF 1
+#define HAVE_HYPOT 1
+#define HAVE_ISFINITE 1
+#define HAVE_ISINF 1
+#define HAVE_ISNAN 1
+#define HAVE_LDEXPF 1
+#define HAVE_LLRINT 1
+#define HAVE_LLRINTF 1
+#define HAVE_LOG2 1
+#define HAVE_LOG2F 1
+#define HAVE_LOG10F 1
+#define HAVE_LRINT 1
+#define HAVE_LRINTF 1
+#define HAVE_POWF 1
+#define HAVE_RINT 1
+#define HAVE_ROUND 1
+#define HAVE_ROUNDF 1
+#define HAVE_SINF 1
+#define HAVE_TRUNC 1
+#define HAVE_TRUNCF 1
+#define HAVE_DOS_PATHS 0
+#define HAVE_LIBC_MSVCRT 0
+#define HAVE_MMAL_PARAMETER_VIDEO_MAX_NUM_CALLBACKS 0
+#define HAVE_SECTION_DATA_REL_RO 1
+#define HAVE_THREADS 1
+#define HAVE_UWP 0
+#define HAVE_WINRT 0
+#define HAVE_ACCESS 1
+#define HAVE_ALIGNED_MALLOC 0
+#define HAVE_ARC4RANDOM 0
+#define HAVE_CLOCK_GETTIME 1
+#define HAVE_CLOSESOCKET 0
+#define HAVE_COMMANDLINETOARGVW 0
+#define HAVE_FCNTL 1
+#define HAVE_GETADDRINFO 0
+#define HAVE_GETHRTIME 0
+#define HAVE_GETOPT 1
+#define HAVE_GETMODULEHANDLE 0
+#define HAVE_GETPROCESSAFFINITYMASK 0
+#define HAVE_GETPROCESSMEMORYINFO 0
+#define HAVE_GETPROCESSTIMES 0
+#define HAVE_GETRUSAGE 1
+#define HAVE_GETSTDHANDLE 0
+#define HAVE_GETSYSTEMTIMEASFILETIME 0
+#define HAVE_GETTIMEOFDAY 1
+#define HAVE_GLOB 1
+#define HAVE_GLXGETPROCADDRESS 0
+#define HAVE_GMTIME_R 1
+#define HAVE_INET_ATON 0
+#define HAVE_ISATTY 1
+#define HAVE_KBHIT 0
+#define HAVE_LOCALTIME_R 1
+#define HAVE_LSTAT 1
+#define HAVE_LZO1X_999_COMPRESS 0
+#define HAVE_MACH_ABSOLUTE_TIME 0
+#define HAVE_MAPVIEWOFFILE 0
+#define HAVE_MEMALIGN 1
+#define HAVE_MKSTEMP 1
+#define HAVE_MMAP 1
+#define HAVE_MPROTECT 1
+#define HAVE_NANOSLEEP 1
+#define HAVE_PEEKNAMEDPIPE 0
+#define HAVE_POSIX_MEMALIGN 1
+#define HAVE_PTHREAD_CANCEL 1
+#define HAVE_SCHED_GETAFFINITY 1
+#define HAVE_SECITEMIMPORT 0
+#define HAVE_SETCONSOLETEXTATTRIBUTE 0
+#define HAVE_SETCONSOLECTRLHANDLER 0
+#define HAVE_SETDLLDIRECTORY 0
+#define HAVE_SETMODE 0
+#define HAVE_SETRLIMIT 1
+#define HAVE_SLEEP 0
+#define HAVE_STRERROR_R 1
+#define HAVE_SYSCONF 1
+#define HAVE_SYSCTL 0
+#define HAVE_USLEEP 1
+#define HAVE_UTGETOSTYPEFROMSTRING 0
+#define HAVE_VIRTUALALLOC 0
+#define HAVE_WGLGETPROCADDRESS 0
+#define HAVE_BCRYPT 0
+#define HAVE_VAAPI_DRM 0
+#define HAVE_VAAPI_X11 0
+#define HAVE_VDPAU_X11 0
+#define HAVE_PTHREADS 1
+#define HAVE_OS2THREADS 0
+#define HAVE_W32THREADS 0
+#define HAVE_AS_ARCH_DIRECTIVE 0
+#define HAVE_AS_DN_DIRECTIVE 0
+#define HAVE_AS_FPU_DIRECTIVE 0
+#define HAVE_AS_FUNC 0
+#define HAVE_AS_OBJECT_ARCH 0
+#define HAVE_ASM_MOD_Q 0
+#define HAVE_BLOCKS_EXTENSION 0
+#define HAVE_EBP_AVAILABLE 1
+#define HAVE_EBX_AVAILABLE 1
+#define HAVE_GNU_AS 0
+#define HAVE_GNU_WINDRES 0
+#define HAVE_IBM_ASM 0
+#define HAVE_INLINE_ASM_DIRECT_SYMBOL_REFS 0
+#define HAVE_INLINE_ASM_LABELS 1
+#define HAVE_INLINE_ASM_NONLOCAL_LABELS 1
+#define HAVE_PRAGMA_DEPRECATED 1
+#define HAVE_RSYNC_CONTIMEOUT 1
+#define HAVE_SYMVER_ASM_LABEL 1
+#define HAVE_SYMVER_GNU_ASM 1
+#define HAVE_VFP_ARGS 0
+#define HAVE_XFORM_ASM 0
+#define HAVE_XMM_CLOBBERS 1
+#define HAVE_KCMVIDEOCODECTYPE_HEVC 0
+#define HAVE_KCVPIXELFORMATTYPE_420YPCBCR10BIPLANARVIDEORANGE 0
+#define HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_SMPTE_ST_2084_PQ 0
+#define HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_ITU_R_2100_HLG 0
+#define HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_LINEAR 0
+#define HAVE_SOCKLEN_T 0
+#define HAVE_STRUCT_ADDRINFO 0
+#define HAVE_STRUCT_GROUP_SOURCE_REQ 0
+#define HAVE_STRUCT_IP_MREQ_SOURCE 0
+#define HAVE_STRUCT_IPV6_MREQ 0
+#define HAVE_STRUCT_MSGHDR_MSG_FLAGS 0
+#define HAVE_STRUCT_POLLFD 0
+#define HAVE_STRUCT_RUSAGE_RU_MAXRSS 1
+#define HAVE_STRUCT_SCTP_EVENT_SUBSCRIBE 0
+#define HAVE_STRUCT_SOCKADDR_IN6 0
+#define HAVE_STRUCT_SOCKADDR_SA_LEN 0
+#define HAVE_STRUCT_SOCKADDR_STORAGE 0
+#define HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC 1
+#define HAVE_STRUCT_V4L2_FRMIVALENUM_DISCRETE 0
+#define HAVE_MAKEINFO 0
+#define HAVE_MAKEINFO_HTML 0
+#define HAVE_OPENCL_D3D11 0
+#define HAVE_OPENCL_DRM_ARM 0
+#define HAVE_OPENCL_DRM_BEIGNET 0
+#define HAVE_OPENCL_DXVA2 0
+#define HAVE_OPENCL_VAAPI_BEIGNET 0
+#define HAVE_OPENCL_VAAPI_INTEL_MEDIA 0
+#define HAVE_PERL 1
+#define HAVE_POD2MAN 1
+#define HAVE_TEXI2HTML 0
+#define CONFIG_DOC 0
+#define CONFIG_HTMLPAGES 0
+#define CONFIG_MANPAGES 0
+#define CONFIG_PODPAGES 0
+#define CONFIG_TXTPAGES 0
+#define CONFIG_AVIO_LIST_DIR_EXAMPLE 1
+#define CONFIG_AVIO_READING_EXAMPLE 1
+#define CONFIG_DECODE_AUDIO_EXAMPLE 1
+#define CONFIG_DECODE_VIDEO_EXAMPLE 1
+#define CONFIG_DEMUXING_DECODING_EXAMPLE 1
+#define CONFIG_ENCODE_AUDIO_EXAMPLE 1
+#define CONFIG_ENCODE_VIDEO_EXAMPLE 1
+#define CONFIG_EXTRACT_MVS_EXAMPLE 1
+#define CONFIG_FILTER_AUDIO_EXAMPLE 0
+#define CONFIG_FILTERING_AUDIO_EXAMPLE 0
+#define CONFIG_FILTERING_VIDEO_EXAMPLE 0
+#define CONFIG_HTTP_MULTICLIENT_EXAMPLE 1
+#define CONFIG_HW_DECODE_EXAMPLE 1
+#define CONFIG_METADATA_EXAMPLE 1
+#define CONFIG_MUXING_EXAMPLE 0
+#define CONFIG_QSVDEC_EXAMPLE 0
+#define CONFIG_REMUXING_EXAMPLE 1
+#define CONFIG_RESAMPLING_AUDIO_EXAMPLE 0
+#define CONFIG_SCALING_VIDEO_EXAMPLE 0
+#define CONFIG_TRANSCODE_AAC_EXAMPLE 0
+#define CONFIG_TRANSCODING_EXAMPLE 0
+#define CONFIG_VAAPI_ENCODE_EXAMPLE 0
+#define CONFIG_VAAPI_TRANSCODE_EXAMPLE 0
+#define CONFIG_AVISYNTH 0
+#define CONFIG_FREI0R 0
+#define CONFIG_LIBCDIO 0
+#define CONFIG_LIBDAVS2 0
+#define CONFIG_LIBRUBBERBAND 0
+#define CONFIG_LIBVIDSTAB 0
+#define CONFIG_LIBX264 0
+#define CONFIG_LIBX265 0
+#define CONFIG_LIBXAVS 0
+#define CONFIG_LIBXAVS2 0
+#define CONFIG_LIBXVID 0
+#define CONFIG_DECKLINK 0
+#define CONFIG_LIBFDK_AAC 0
+#define CONFIG_OPENSSL 0
+#define CONFIG_LIBTLS 0
+#define CONFIG_GMP 0
+#define CONFIG_LIBARIBB24 0
+#define CONFIG_LIBLENSFUN 0
+#define CONFIG_LIBOPENCORE_AMRNB 0
+#define CONFIG_LIBOPENCORE_AMRWB 0
+#define CONFIG_LIBVMAF 0
+#define CONFIG_LIBVO_AMRWBENC 0
+#define CONFIG_MBEDTLS 0
+#define CONFIG_RKMPP 0
+#define CONFIG_LIBSMBCLIENT 0
+#define CONFIG_CHROMAPRINT 0
+#define CONFIG_GCRYPT 0
+#define CONFIG_GNUTLS 0
+#define CONFIG_JNI 0
+#define CONFIG_LADSPA 0
+#define CONFIG_LIBAOM 0
+#define CONFIG_LIBASS 0
+#define CONFIG_LIBBLURAY 0
+#define CONFIG_LIBBS2B 0
+#define CONFIG_LIBCACA 0
+#define CONFIG_LIBCELT 0
+#define CONFIG_LIBCODEC2 0
+#define CONFIG_LIBDAV1D 0
+#define CONFIG_LIBDC1394 0
+#define CONFIG_LIBDRM 0
+#define CONFIG_LIBFLITE 0
+#define CONFIG_LIBFONTCONFIG 0
+#define CONFIG_LIBFREETYPE 0
+#define CONFIG_LIBFRIBIDI 0
+#define CONFIG_LIBGLSLANG 0
+#define CONFIG_LIBGME 0
+#define CONFIG_LIBGSM 0
+#define CONFIG_LIBIEC61883 0
+#define CONFIG_LIBILBC 0
+#define CONFIG_LIBJACK 0
+#define CONFIG_LIBKLVANC 0
+#define CONFIG_LIBKVAZAAR 0
+#define CONFIG_LIBMODPLUG 0
+#define CONFIG_LIBMP3LAME 0
+#define CONFIG_LIBMYSOFA 0
+#define CONFIG_LIBOPENCV 0
+#define CONFIG_LIBOPENH264 0
+#define CONFIG_LIBOPENJPEG 0
+#define CONFIG_LIBOPENMPT 0
+#define CONFIG_LIBOPUS 1
+#define CONFIG_LIBPULSE 0
+#define CONFIG_LIBRABBITMQ 0
+#define CONFIG_LIBRAV1E 0
+#define CONFIG_LIBRSVG 0
+#define CONFIG_LIBRTMP 0
+#define CONFIG_LIBSHINE 0
+#define CONFIG_LIBSMBCLIENT 0
+#define CONFIG_LIBSNAPPY 0
+#define CONFIG_LIBSOXR 0
+#define CONFIG_LIBSPEEX 0
+#define CONFIG_LIBSRT 0
+#define CONFIG_LIBSSH 0
+#define CONFIG_LIBTENSORFLOW 0
+#define CONFIG_LIBTESSERACT 0
+#define CONFIG_LIBTHEORA 0
+#define CONFIG_LIBTWOLAME 0
+#define CONFIG_LIBV4L2 0
+#define CONFIG_LIBVORBIS 0
+#define CONFIG_LIBVPX 0
+#define CONFIG_LIBWAVPACK 0
+#define CONFIG_LIBWEBP 0
+#define CONFIG_LIBXML2 0
+#define CONFIG_LIBZIMG 0
+#define CONFIG_LIBZMQ 0
+#define CONFIG_LIBZVBI 0
+#define CONFIG_LV2 0
+#define CONFIG_MEDIACODEC 0
+#define CONFIG_OPENAL 0
+#define CONFIG_OPENGL 0
+#define CONFIG_POCKETSPHINX 0
+#define CONFIG_VAPOURSYNTH 0
+#define CONFIG_ALSA 0
+#define CONFIG_APPKIT 0
+#define CONFIG_AVFOUNDATION 0
+#define CONFIG_BZLIB 0
+#define CONFIG_COREIMAGE 0
+#define CONFIG_ICONV 0
+#define CONFIG_LIBXCB 0
+#define CONFIG_LIBXCB_SHM 0
+#define CONFIG_LIBXCB_SHAPE 0
+#define CONFIG_LIBXCB_XFIXES 0
+#define CONFIG_LZMA 0
+#define CONFIG_SCHANNEL 0
+#define CONFIG_SDL2 0
+#define CONFIG_SECURETRANSPORT 0
+#define CONFIG_SNDIO 0
+#define CONFIG_XLIB 0
+#define CONFIG_ZLIB 0
+#define CONFIG_CUDA_NVCC 0
+#define CONFIG_CUDA_SDK 0
+#define CONFIG_LIBNPP 0
+#define CONFIG_LIBMFX 0
+#define CONFIG_MMAL 0
+#define CONFIG_OMX 0
+#define CONFIG_OPENCL 0
+#define CONFIG_VULKAN 0
+#define CONFIG_AMF 0
+#define CONFIG_AUDIOTOOLBOX 0
+#define CONFIG_CRYSTALHD 0
+#define CONFIG_CUDA 0
+#define CONFIG_CUDA_LLVM 0
+#define CONFIG_CUVID 0
+#define CONFIG_D3D11VA 0
+#define CONFIG_DXVA2 0
+#define CONFIG_FFNVCODEC 0
+#define CONFIG_NVDEC 0
+#define CONFIG_NVENC 0
+#define CONFIG_VAAPI 0
+#define CONFIG_VDPAU 0
+#define CONFIG_VIDEOTOOLBOX 0
+#define CONFIG_V4L2_M2M 0
+#define CONFIG_XVMC 0
+#define CONFIG_FTRAPV 0
+#define CONFIG_GRAY 0
+#define CONFIG_HARDCODED_TABLES 0
+#define CONFIG_OMX_RPI 0
+#define CONFIG_RUNTIME_CPUDETECT 1
+#define CONFIG_SAFE_BITSTREAM_READER 1
+#define CONFIG_SHARED 0
+#define CONFIG_SMALL 0
+#define CONFIG_STATIC 1
+#define CONFIG_SWSCALE_ALPHA 1
+#define CONFIG_GPL 0
+#define CONFIG_NONFREE 0
+#define CONFIG_VERSION3 0
+#define CONFIG_AVDEVICE 0
+#define CONFIG_AVFILTER 0
+#define CONFIG_SWSCALE 0
+#define CONFIG_POSTPROC 0
+#define CONFIG_AVFORMAT 1
+#define CONFIG_AVCODEC 1
+#define CONFIG_SWRESAMPLE 0
+#define CONFIG_AVRESAMPLE 0
+#define CONFIG_AVUTIL 1
+#define CONFIG_FFPLAY 0
+#define CONFIG_FFPROBE 0
+#define CONFIG_FFMPEG 0
+#define CONFIG_DCT 1
+#define CONFIG_DWT 0
+#define CONFIG_ERROR_RESILIENCE 1
+#define CONFIG_FAAN 0
+#define CONFIG_FAST_UNALIGNED 1
+#define CONFIG_FFT 1
+#define CONFIG_LSP 1
+#define CONFIG_LZO 0
+#define CONFIG_MDCT 1
+#define CONFIG_PIXELUTILS 0
+#define CONFIG_NETWORK 0
+#define CONFIG_RDFT 1
+#define CONFIG_AUTODETECT 0
+#define CONFIG_FONTCONFIG 0
+#define CONFIG_LARGE_TESTS 1
+#define CONFIG_LINUX_PERF 0
+#define CONFIG_MEMORY_POISONING 0
+#define CONFIG_NEON_CLOBBER_TEST 0
+#define CONFIG_OSSFUZZ 0
+#define CONFIG_PIC 1
+#define CONFIG_THUMB 0
+#define CONFIG_VALGRIND_BACKTRACE 0
+#define CONFIG_XMM_CLOBBER_TEST 0
+#define CONFIG_BSFS 1
+#define CONFIG_DECODERS 1
+#define CONFIG_ENCODERS 0
+#define CONFIG_HWACCELS 0
+#define CONFIG_PARSERS 1
+#define CONFIG_INDEVS 0
+#define CONFIG_OUTDEVS 0
+#define CONFIG_FILTERS 0
+#define CONFIG_DEMUXERS 1
+#define CONFIG_MUXERS 0
+#define CONFIG_PROTOCOLS 0
+#define CONFIG_AANDCTTABLES 0
+#define CONFIG_AC3DSP 0
+#define CONFIG_ADTS_HEADER 1
+#define CONFIG_AUDIO_FRAME_QUEUE 1
+#define CONFIG_AUDIODSP 0
+#define CONFIG_BLOCKDSP 1
+#define CONFIG_BSWAPDSP 0
+#define CONFIG_CABAC 1
+#define CONFIG_CBS 0
+#define CONFIG_CBS_AV1 0
+#define CONFIG_CBS_H264 0
+#define CONFIG_CBS_H265 0
+#define CONFIG_CBS_JPEG 0
+#define CONFIG_CBS_MPEG2 0
+#define CONFIG_CBS_VP9 0
+#define CONFIG_DIRAC_PARSE 1
+#define CONFIG_DNN 0
+#define CONFIG_DVPROFILE 0
+#define CONFIG_EXIF 1
+#define CONFIG_FAANDCT 0
+#define CONFIG_FAANIDCT 0
+#define CONFIG_FDCTDSP 1
+#define CONFIG_FLACDSP 1
+#define CONFIG_FMTCONVERT 0
+#define CONFIG_FRAME_THREAD_ENCODER 0
+#define CONFIG_G722DSP 0
+#define CONFIG_GOLOMB 1
+#define CONFIG_GPLV3 0
+#define CONFIG_H263DSP 1
+#define CONFIG_H264CHROMA 1
+#define CONFIG_H264DSP 1
+#define CONFIG_H264PARSE 1
+#define CONFIG_H264PRED 1
+#define CONFIG_H264QPEL 1
+#define CONFIG_HEVCPARSE 0
+#define CONFIG_HPELDSP 1
+#define CONFIG_HUFFMAN 0
+#define CONFIG_HUFFYUVDSP 0
+#define CONFIG_HUFFYUVENCDSP 0
+#define CONFIG_IDCTDSP 1
+#define CONFIG_IIRFILTER 0
+#define CONFIG_MDCT15 1
+#define CONFIG_INTRAX8 0
+#define CONFIG_ISO_MEDIA 1
+#define CONFIG_IVIDSP 0
+#define CONFIG_JPEGTABLES 0
+#define CONFIG_LGPLV3 0
+#define CONFIG_LIBX262 0
+#define CONFIG_LLAUDDSP 0
+#define CONFIG_LLVIDDSP 0
+#define CONFIG_LLVIDENCDSP 0
+#define CONFIG_LPC 0
+#define CONFIG_LZF 0
+#define CONFIG_ME_CMP 1
+#define CONFIG_MPEG_ER 1
+#define CONFIG_MPEGAUDIO 1
+#define CONFIG_MPEGAUDIODSP 1
+#define CONFIG_MPEGAUDIOHEADER 1
+#define CONFIG_MPEGVIDEO 1
+#define CONFIG_MPEGVIDEOENC 0
+#define CONFIG_MSS34DSP 0
+#define CONFIG_PIXBLOCKDSP 1
+#define CONFIG_QPELDSP 1
+#define CONFIG_QSV 0
+#define CONFIG_QSVDEC 0
+#define CONFIG_QSVENC 0
+#define CONFIG_QSVVPP 0
+#define CONFIG_RANGECODER 0
+#define CONFIG_RIFFDEC 1
+#define CONFIG_RIFFENC 0
+#define CONFIG_RTPDEC 0
+#define CONFIG_RTPENC_CHAIN 0
+#define CONFIG_RV34DSP 0
+#define CONFIG_SCENE_SAD 0
+#define CONFIG_SINEWIN 1
+#define CONFIG_SNAPPY 0
+#define CONFIG_SRTP 0
+#define CONFIG_STARTCODE 1
+#define CONFIG_TEXTUREDSP 0
+#define CONFIG_TEXTUREDSPENC 0
+#define CONFIG_TPELDSP 0
+#define CONFIG_VAAPI_1 0
+#define CONFIG_VAAPI_ENCODE 0
+#define CONFIG_VC1DSP 0
+#define CONFIG_VIDEODSP 1
+#define CONFIG_VP3DSP 1
+#define CONFIG_VP56DSP 0
+#define CONFIG_VP8DSP 1
+#define CONFIG_WMA_FREQS 0
+#define CONFIG_WMV2DSP 0
+#define CONFIG_AAC_ADTSTOASC_BSF 0
+#define CONFIG_AV1_FRAME_MERGE_BSF 0
+#define CONFIG_AV1_FRAME_SPLIT_BSF 0
+#define CONFIG_AV1_METADATA_BSF 0
+#define CONFIG_CHOMP_BSF 0
+#define CONFIG_DUMP_EXTRADATA_BSF 0
+#define CONFIG_DCA_CORE_BSF 0
+#define CONFIG_EAC3_CORE_BSF 0
+#define CONFIG_EXTRACT_EXTRADATA_BSF 0
+#define CONFIG_FILTER_UNITS_BSF 0
+#define CONFIG_H264_METADATA_BSF 0
+#define CONFIG_H264_MP4TOANNEXB_BSF 0
+#define CONFIG_H264_REDUNDANT_PPS_BSF 0
+#define CONFIG_HAPQA_EXTRACT_BSF 0
+#define CONFIG_HEVC_METADATA_BSF 0
+#define CONFIG_HEVC_MP4TOANNEXB_BSF 0
+#define CONFIG_IMX_DUMP_HEADER_BSF 0
+#define CONFIG_MJPEG2JPEG_BSF 0
+#define CONFIG_MJPEGA_DUMP_HEADER_BSF 0
+#define CONFIG_MP3_HEADER_DECOMPRESS_BSF 0
+#define CONFIG_MPEG2_METADATA_BSF 0
+#define CONFIG_MPEG4_UNPACK_BFRAMES_BSF 0
+#define CONFIG_MOV2TEXTSUB_BSF 0
+#define CONFIG_NOISE_BSF 0
+#define CONFIG_NULL_BSF 1
+#define CONFIG_PRORES_METADATA_BSF 0
+#define CONFIG_REMOVE_EXTRADATA_BSF 0
+#define CONFIG_TEXT2MOVSUB_BSF 0
+#define CONFIG_TRACE_HEADERS_BSF 0
+#define CONFIG_TRUEHD_CORE_BSF 0
+#define CONFIG_VP9_METADATA_BSF 0
+#define CONFIG_VP9_RAW_REORDER_BSF 0
+#define CONFIG_VP9_SUPERFRAME_BSF 0
+#define CONFIG_VP9_SUPERFRAME_SPLIT_BSF 1
+#define CONFIG_AASC_DECODER 0
+#define CONFIG_AIC_DECODER 0
+#define CONFIG_ALIAS_PIX_DECODER 0
+#define CONFIG_AGM_DECODER 0
+#define CONFIG_AMV_DECODER 0
+#define CONFIG_ANM_DECODER 0
+#define CONFIG_ANSI_DECODER 0
+#define CONFIG_APNG_DECODER 0
+#define CONFIG_ARBC_DECODER 0
+#define CONFIG_ASV1_DECODER 0
+#define CONFIG_ASV2_DECODER 0
+#define CONFIG_AURA_DECODER 0
+#define CONFIG_AURA2_DECODER 0
+#define CONFIG_AVRP_DECODER 0
+#define CONFIG_AVRN_DECODER 0
+#define CONFIG_AVS_DECODER 0
+#define CONFIG_AVUI_DECODER 0
+#define CONFIG_AYUV_DECODER 0
+#define CONFIG_BETHSOFTVID_DECODER 0
+#define CONFIG_BFI_DECODER 0
+#define CONFIG_BINK_DECODER 0
+#define CONFIG_BITPACKED_DECODER 0
+#define CONFIG_BMP_DECODER 0
+#define CONFIG_BMV_VIDEO_DECODER 0
+#define CONFIG_BRENDER_PIX_DECODER 0
+#define CONFIG_C93_DECODER 0
+#define CONFIG_CAVS_DECODER 0
+#define CONFIG_CDGRAPHICS_DECODER 0
+#define CONFIG_CDTOONS_DECODER 0
+#define CONFIG_CDXL_DECODER 0
+#define CONFIG_CFHD_DECODER 0
+#define CONFIG_CINEPAK_DECODER 0
+#define CONFIG_CLEARVIDEO_DECODER 0
+#define CONFIG_CLJR_DECODER 0
+#define CONFIG_CLLC_DECODER 0
+#define CONFIG_COMFORTNOISE_DECODER 0
+#define CONFIG_CPIA_DECODER 0
+#define CONFIG_CSCD_DECODER 0
+#define CONFIG_CYUV_DECODER 0
+#define CONFIG_DDS_DECODER 0
+#define CONFIG_DFA_DECODER 0
+#define CONFIG_DIRAC_DECODER 0
+#define CONFIG_DNXHD_DECODER 0
+#define CONFIG_DPX_DECODER 0
+#define CONFIG_DSICINVIDEO_DECODER 0
+#define CONFIG_DVAUDIO_DECODER 0
+#define CONFIG_DVVIDEO_DECODER 0
+#define CONFIG_DXA_DECODER 0
+#define CONFIG_DXTORY_DECODER 0
+#define CONFIG_DXV_DECODER 0
+#define CONFIG_EACMV_DECODER 0
+#define CONFIG_EAMAD_DECODER 0
+#define CONFIG_EATGQ_DECODER 0
+#define CONFIG_EATGV_DECODER 0
+#define CONFIG_EATQI_DECODER 0
+#define CONFIG_EIGHTBPS_DECODER 0
+#define CONFIG_EIGHTSVX_EXP_DECODER 0
+#define CONFIG_EIGHTSVX_FIB_DECODER 0
+#define CONFIG_ESCAPE124_DECODER 0
+#define CONFIG_ESCAPE130_DECODER 0
+#define CONFIG_EXR_DECODER 0
+#define CONFIG_FFV1_DECODER 0
+#define CONFIG_FFVHUFF_DECODER 0
+#define CONFIG_FIC_DECODER 0
+#define CONFIG_FITS_DECODER 0
+#define CONFIG_FLASHSV_DECODER 0
+#define CONFIG_FLASHSV2_DECODER 0
+#define CONFIG_FLIC_DECODER 0
+#define CONFIG_FLV_DECODER 0
+#define CONFIG_FMVC_DECODER 0
+#define CONFIG_FOURXM_DECODER 0
+#define CONFIG_FRAPS_DECODER 0
+#define CONFIG_FRWU_DECODER 0
+#define CONFIG_G2M_DECODER 0
+#define CONFIG_GDV_DECODER 0
+#define CONFIG_GIF_DECODER 0
+#define CONFIG_H261_DECODER 0
+#define CONFIG_H263_DECODER 1
+#define CONFIG_H263I_DECODER 0
+#define CONFIG_H263P_DECODER 0
+#define CONFIG_H263_V4L2M2M_DECODER 0
+#define CONFIG_H264_DECODER 1
+#define CONFIG_H264_CRYSTALHD_DECODER 0
+#define CONFIG_H264_V4L2M2M_DECODER 0
+#define CONFIG_H264_MEDIACODEC_DECODER 0
+#define CONFIG_H264_MMAL_DECODER 0
+#define CONFIG_H264_QSV_DECODER 0
+#define CONFIG_H264_RKMPP_DECODER 0
+#define CONFIG_HAP_DECODER 0
+#define CONFIG_HEVC_DECODER 0
+#define CONFIG_HEVC_QSV_DECODER 0
+#define CONFIG_HEVC_RKMPP_DECODER 0
+#define CONFIG_HEVC_V4L2M2M_DECODER 0
+#define CONFIG_HNM4_VIDEO_DECODER 0
+#define CONFIG_HQ_HQA_DECODER 0
+#define CONFIG_HQX_DECODER 0
+#define CONFIG_HUFFYUV_DECODER 0
+#define CONFIG_HYMT_DECODER 0
+#define CONFIG_IDCIN_DECODER 0
+#define CONFIG_IFF_ILBM_DECODER 0
+#define CONFIG_IMM4_DECODER 0
+#define CONFIG_IMM5_DECODER 0
+#define CONFIG_INDEO2_DECODER 0
+#define CONFIG_INDEO3_DECODER 0
+#define CONFIG_INDEO4_DECODER 0
+#define CONFIG_INDEO5_DECODER 0
+#define CONFIG_INTERPLAY_VIDEO_DECODER 0
+#define CONFIG_JPEG2000_DECODER 0
+#define CONFIG_JPEGLS_DECODER 0
+#define CONFIG_JV_DECODER 0
+#define CONFIG_KGV1_DECODER 0
+#define CONFIG_KMVC_DECODER 0
+#define CONFIG_LAGARITH_DECODER 0
+#define CONFIG_LOCO_DECODER 0
+#define CONFIG_LSCR_DECODER 0
+#define CONFIG_M101_DECODER 0
+#define CONFIG_MAGICYUV_DECODER 0
+#define CONFIG_MDEC_DECODER 0
+#define CONFIG_MIMIC_DECODER 0
+#define CONFIG_MJPEG_DECODER 0
+#define CONFIG_MJPEGB_DECODER 0
+#define CONFIG_MMVIDEO_DECODER 0
+#define CONFIG_MOTIONPIXELS_DECODER 0
+#define CONFIG_MPEG1VIDEO_DECODER 0
+#define CONFIG_MPEG2VIDEO_DECODER 0
+#define CONFIG_MPEG4_DECODER 1
+#define CONFIG_MPEG4_CRYSTALHD_DECODER 0
+#define CONFIG_MPEG4_V4L2M2M_DECODER 0
+#define CONFIG_MPEG4_MMAL_DECODER 0
+#define CONFIG_MPEGVIDEO_DECODER 0
+#define CONFIG_MPEG1_V4L2M2M_DECODER 0
+#define CONFIG_MPEG2_MMAL_DECODER 0
+#define CONFIG_MPEG2_CRYSTALHD_DECODER 0
+#define CONFIG_MPEG2_V4L2M2M_DECODER 0
+#define CONFIG_MPEG2_QSV_DECODER 0
+#define CONFIG_MPEG2_MEDIACODEC_DECODER 0
+#define CONFIG_MSA1_DECODER 0
+#define CONFIG_MSCC_DECODER 0
+#define CONFIG_MSMPEG4V1_DECODER 0
+#define CONFIG_MSMPEG4V2_DECODER 0
+#define CONFIG_MSMPEG4V3_DECODER 0
+#define CONFIG_MSMPEG4_CRYSTALHD_DECODER 0
+#define CONFIG_MSRLE_DECODER 0
+#define CONFIG_MSS1_DECODER 0
+#define CONFIG_MSS2_DECODER 0
+#define CONFIG_MSVIDEO1_DECODER 0
+#define CONFIG_MSZH_DECODER 0
+#define CONFIG_MTS2_DECODER 0
+#define CONFIG_MV30_DECODER 0
+#define CONFIG_MVC1_DECODER 0
+#define CONFIG_MVC2_DECODER 0
+#define CONFIG_MVDV_DECODER 0
+#define CONFIG_MVHA_DECODER 0
+#define CONFIG_MWSC_DECODER 0
+#define CONFIG_MXPEG_DECODER 0
+#define CONFIG_NUV_DECODER 0
+#define CONFIG_PAF_VIDEO_DECODER 0
+#define CONFIG_PAM_DECODER 0
+#define CONFIG_PBM_DECODER 0
+#define CONFIG_PCX_DECODER 0
+#define CONFIG_PGM_DECODER 0
+#define CONFIG_PGMYUV_DECODER 0
+#define CONFIG_PICTOR_DECODER 0
+#define CONFIG_PIXLET_DECODER 0
+#define CONFIG_PNG_DECODER 0
+#define CONFIG_PPM_DECODER 0
+#define CONFIG_PRORES_DECODER 0
+#define CONFIG_PROSUMER_DECODER 0
+#define CONFIG_PSD_DECODER 0
+#define CONFIG_PTX_DECODER 0
+#define CONFIG_QDRAW_DECODER 0
+#define CONFIG_QPEG_DECODER 0
+#define CONFIG_QTRLE_DECODER 0
+#define CONFIG_R10K_DECODER 0
+#define CONFIG_R210_DECODER 0
+#define CONFIG_RASC_DECODER 0
+#define CONFIG_RAWVIDEO_DECODER 0
+#define CONFIG_RL2_DECODER 0
+#define CONFIG_ROQ_DECODER 0
+#define CONFIG_RPZA_DECODER 0
+#define CONFIG_RSCC_DECODER 0
+#define CONFIG_RV10_DECODER 0
+#define CONFIG_RV20_DECODER 0
+#define CONFIG_RV30_DECODER 0
+#define CONFIG_RV40_DECODER 0
+#define CONFIG_S302M_DECODER 0
+#define CONFIG_SANM_DECODER 0
+#define CONFIG_SCPR_DECODER 0
+#define CONFIG_SCREENPRESSO_DECODER 0
+#define CONFIG_SGI_DECODER 0
+#define CONFIG_SGIRLE_DECODER 0
+#define CONFIG_SHEERVIDEO_DECODER 0
+#define CONFIG_SMACKER_DECODER 0
+#define CONFIG_SMC_DECODER 0
+#define CONFIG_SMVJPEG_DECODER 0
+#define CONFIG_SNOW_DECODER 0
+#define CONFIG_SP5X_DECODER 0
+#define CONFIG_SPEEDHQ_DECODER 0
+#define CONFIG_SRGC_DECODER 0
+#define CONFIG_SUNRAST_DECODER 0
+#define CONFIG_SVQ1_DECODER 0
+#define CONFIG_SVQ3_DECODER 0
+#define CONFIG_TARGA_DECODER 0
+#define CONFIG_TARGA_Y216_DECODER 0
+#define CONFIG_TDSC_DECODER 0
+#define CONFIG_THEORA_DECODER 1
+#define CONFIG_THP_DECODER 0
+#define CONFIG_TIERTEXSEQVIDEO_DECODER 0
+#define CONFIG_TIFF_DECODER 0
+#define CONFIG_TMV_DECODER 0
+#define CONFIG_TRUEMOTION1_DECODER 0
+#define CONFIG_TRUEMOTION2_DECODER 0
+#define CONFIG_TRUEMOTION2RT_DECODER 0
+#define CONFIG_TSCC_DECODER 0
+#define CONFIG_TSCC2_DECODER 0
+#define CONFIG_TXD_DECODER 0
+#define CONFIG_ULTI_DECODER 0
+#define CONFIG_UTVIDEO_DECODER 0
+#define CONFIG_V210_DECODER 0
+#define CONFIG_V210X_DECODER 0
+#define CONFIG_V308_DECODER 0
+#define CONFIG_V408_DECODER 0
+#define CONFIG_V410_DECODER 0
+#define CONFIG_VB_DECODER 0
+#define CONFIG_VBLE_DECODER 0
+#define CONFIG_VC1_DECODER 0
+#define CONFIG_VC1_CRYSTALHD_DECODER 0
+#define CONFIG_VC1IMAGE_DECODER 0
+#define CONFIG_VC1_MMAL_DECODER 0
+#define CONFIG_VC1_QSV_DECODER 0
+#define CONFIG_VC1_V4L2M2M_DECODER 0
+#define CONFIG_VCR1_DECODER 0
+#define CONFIG_VMDVIDEO_DECODER 0
+#define CONFIG_VMNC_DECODER 0
+#define CONFIG_VP3_DECODER 1
+#define CONFIG_VP4_DECODER 0
+#define CONFIG_VP5_DECODER 0
+#define CONFIG_VP6_DECODER 0
+#define CONFIG_VP6A_DECODER 0
+#define CONFIG_VP6F_DECODER 0
+#define CONFIG_VP7_DECODER 0
+#define CONFIG_VP8_DECODER 1
+#define CONFIG_VP8_RKMPP_DECODER 0
+#define CONFIG_VP8_V4L2M2M_DECODER 0
+#define CONFIG_VP9_DECODER 1
+#define CONFIG_VP9_RKMPP_DECODER 0
+#define CONFIG_VP9_V4L2M2M_DECODER 0
+#define CONFIG_VQA_DECODER 0
+#define CONFIG_WEBP_DECODER 0
+#define CONFIG_WCMV_DECODER 0
+#define CONFIG_WRAPPED_AVFRAME_DECODER 0
+#define CONFIG_WMV1_DECODER 0
+#define CONFIG_WMV2_DECODER 0
+#define CONFIG_WMV3_DECODER 0
+#define CONFIG_WMV3_CRYSTALHD_DECODER 0
+#define CONFIG_WMV3IMAGE_DECODER 0
+#define CONFIG_WNV1_DECODER 0
+#define CONFIG_XAN_WC3_DECODER 0
+#define CONFIG_XAN_WC4_DECODER 0
+#define CONFIG_XBM_DECODER 0
+#define CONFIG_XFACE_DECODER 0
+#define CONFIG_XL_DECODER 0
+#define CONFIG_XPM_DECODER 0
+#define CONFIG_XWD_DECODER 0
+#define CONFIG_Y41P_DECODER 0
+#define CONFIG_YLC_DECODER 0
+#define CONFIG_YOP_DECODER 0
+#define CONFIG_YUV4_DECODER 0
+#define CONFIG_ZERO12V_DECODER 0
+#define CONFIG_ZEROCODEC_DECODER 0
+#define CONFIG_ZLIB_DECODER 0
+#define CONFIG_ZMBV_DECODER 0
+#define CONFIG_AAC_DECODER 1
+#define CONFIG_AAC_FIXED_DECODER 0
+#define CONFIG_AAC_LATM_DECODER 1
+#define CONFIG_AC3_DECODER 0
+#define CONFIG_AC3_FIXED_DECODER 0
+#define CONFIG_ACELP_KELVIN_DECODER 0
+#define CONFIG_ALAC_DECODER 0
+#define CONFIG_ALS_DECODER 0
+#define CONFIG_AMRNB_DECODER 1
+#define CONFIG_AMRWB_DECODER 1
+#define CONFIG_APE_DECODER 0
+#define CONFIG_APTX_DECODER 1
+#define CONFIG_APTX_HD_DECODER 0
+#define CONFIG_ATRAC1_DECODER 0
+#define CONFIG_ATRAC3_DECODER 0
+#define CONFIG_ATRAC3AL_DECODER 0
+#define CONFIG_ATRAC3P_DECODER 0
+#define CONFIG_ATRAC3PAL_DECODER 0
+#define CONFIG_ATRAC9_DECODER 0
+#define CONFIG_BINKAUDIO_DCT_DECODER 0
+#define CONFIG_BINKAUDIO_RDFT_DECODER 0
+#define CONFIG_BMV_AUDIO_DECODER 0
+#define CONFIG_COOK_DECODER 0
+#define CONFIG_DCA_DECODER 0
+#define CONFIG_DOLBY_E_DECODER 0
+#define CONFIG_DSD_LSBF_DECODER 0
+#define CONFIG_DSD_MSBF_DECODER 0
+#define CONFIG_DSD_LSBF_PLANAR_DECODER 0
+#define CONFIG_DSD_MSBF_PLANAR_DECODER 0
+#define CONFIG_DSICINAUDIO_DECODER 0
+#define CONFIG_DSS_SP_DECODER 0
+#define CONFIG_DST_DECODER 0
+#define CONFIG_EAC3_DECODER 0
+#define CONFIG_EVRC_DECODER 0
+#define CONFIG_FFWAVESYNTH_DECODER 0
+#define CONFIG_FLAC_DECODER 1
+#define CONFIG_G723_1_DECODER 0
+#define CONFIG_G729_DECODER 0
+#define CONFIG_GSM_DECODER 0
+#define CONFIG_GSM_MS_DECODER 1
+#define CONFIG_HCA_DECODER 0
+#define CONFIG_HCOM_DECODER 0
+#define CONFIG_IAC_DECODER 0
+#define CONFIG_ILBC_DECODER 0
+#define CONFIG_IMC_DECODER 0
+#define CONFIG_INTERPLAY_ACM_DECODER 0
+#define CONFIG_MACE3_DECODER 0
+#define CONFIG_MACE6_DECODER 0
+#define CONFIG_METASOUND_DECODER 0
+#define CONFIG_MLP_DECODER 0
+#define CONFIG_MP1_DECODER 0
+#define CONFIG_MP1FLOAT_DECODER 0
+#define CONFIG_MP2_DECODER 0
+#define CONFIG_MP2FLOAT_DECODER 0
+#define CONFIG_MP3FLOAT_DECODER 0
+#define CONFIG_MP3_DECODER 1
+#define CONFIG_MP3ADUFLOAT_DECODER 0
+#define CONFIG_MP3ADU_DECODER 0
+#define CONFIG_MP3ON4FLOAT_DECODER 0
+#define CONFIG_MP3ON4_DECODER 0
+#define CONFIG_MPC7_DECODER 0
+#define CONFIG_MPC8_DECODER 0
+#define CONFIG_NELLYMOSER_DECODER 0
+#define CONFIG_ON2AVC_DECODER 0
+#define CONFIG_OPUS_DECODER 0
+#define CONFIG_PAF_AUDIO_DECODER 0
+#define CONFIG_QCELP_DECODER 0
+#define CONFIG_QDM2_DECODER 0
+#define CONFIG_QDMC_DECODER 0
+#define CONFIG_RA_144_DECODER 0
+#define CONFIG_RA_288_DECODER 0
+#define CONFIG_RALF_DECODER 0
+#define CONFIG_SBC_DECODER 1
+#define CONFIG_SHORTEN_DECODER 0
+#define CONFIG_SIPR_DECODER 0
+#define CONFIG_SIREN_DECODER 0
+#define CONFIG_SMACKAUD_DECODER 0
+#define CONFIG_SONIC_DECODER 0
+#define CONFIG_TAK_DECODER 0
+#define CONFIG_TRUEHD_DECODER 0
+#define CONFIG_TRUESPEECH_DECODER 0
+#define CONFIG_TTA_DECODER 0
+#define CONFIG_TWINVQ_DECODER 0
+#define CONFIG_VMDAUDIO_DECODER 0
+#define CONFIG_VORBIS_DECODER 1
+#define CONFIG_WAVPACK_DECODER 0
+#define CONFIG_WMALOSSLESS_DECODER 0
+#define CONFIG_WMAPRO_DECODER 0
+#define CONFIG_WMAV1_DECODER 0
+#define CONFIG_WMAV2_DECODER 0
+#define CONFIG_WMAVOICE_DECODER 0
+#define CONFIG_WS_SND1_DECODER 0
+#define CONFIG_XMA1_DECODER 0
+#define CONFIG_XMA2_DECODER 0
+#define CONFIG_PCM_ALAW_DECODER 1
+#define CONFIG_PCM_BLURAY_DECODER 0
+#define CONFIG_PCM_DVD_DECODER 0
+#define CONFIG_PCM_F16LE_DECODER 0
+#define CONFIG_PCM_F24LE_DECODER 0
+#define CONFIG_PCM_F32BE_DECODER 0
+#define CONFIG_PCM_F32LE_DECODER 1
+#define CONFIG_PCM_F64BE_DECODER 0
+#define CONFIG_PCM_F64LE_DECODER 0
+#define CONFIG_PCM_LXF_DECODER 0
+#define CONFIG_PCM_MULAW_DECODER 1
+#define CONFIG_PCM_S8_DECODER 0
+#define CONFIG_PCM_S8_PLANAR_DECODER 0
+#define CONFIG_PCM_S16BE_DECODER 1
+#define CONFIG_PCM_S16BE_PLANAR_DECODER 0
+#define CONFIG_PCM_S16LE_DECODER 1
+#define CONFIG_PCM_S16LE_PLANAR_DECODER 0
+#define CONFIG_PCM_S24BE_DECODER 1
+#define CONFIG_PCM_S24DAUD_DECODER 0
+#define CONFIG_PCM_S24LE_DECODER 1
+#define CONFIG_PCM_S24LE_PLANAR_DECODER 0
+#define CONFIG_PCM_S32BE_DECODER 0
+#define CONFIG_PCM_S32LE_DECODER 1
+#define CONFIG_PCM_S32LE_PLANAR_DECODER 0
+#define CONFIG_PCM_S64BE_DECODER 0
+#define CONFIG_PCM_S64LE_DECODER 0
+#define CONFIG_PCM_U8_DECODER 1
+#define CONFIG_PCM_U16BE_DECODER 0
+#define CONFIG_PCM_U16LE_DECODER 0
+#define CONFIG_PCM_U24BE_DECODER 0
+#define CONFIG_PCM_U24LE_DECODER 0
+#define CONFIG_PCM_U32BE_DECODER 0
+#define CONFIG_PCM_U32LE_DECODER 0
+#define CONFIG_PCM_VIDC_DECODER 0
+#define CONFIG_DERF_DPCM_DECODER 0
+#define CONFIG_GREMLIN_DPCM_DECODER 0
+#define CONFIG_INTERPLAY_DPCM_DECODER 0
+#define CONFIG_ROQ_DPCM_DECODER 0
+#define CONFIG_SDX2_DPCM_DECODER 0
+#define CONFIG_SOL_DPCM_DECODER 0
+#define CONFIG_XAN_DPCM_DECODER 0
+#define CONFIG_ADPCM_4XM_DECODER 0
+#define CONFIG_ADPCM_ADX_DECODER 0
+#define CONFIG_ADPCM_AFC_DECODER 0
+#define CONFIG_ADPCM_AGM_DECODER 0
+#define CONFIG_ADPCM_AICA_DECODER 0
+#define CONFIG_ADPCM_ARGO_DECODER 0
+#define CONFIG_ADPCM_CT_DECODER 0
+#define CONFIG_ADPCM_DTK_DECODER 0
+#define CONFIG_ADPCM_EA_DECODER 0
+#define CONFIG_ADPCM_EA_MAXIS_XA_DECODER 0
+#define CONFIG_ADPCM_EA_R1_DECODER 0
+#define CONFIG_ADPCM_EA_R2_DECODER 0
+#define CONFIG_ADPCM_EA_R3_DECODER 0
+#define CONFIG_ADPCM_EA_XAS_DECODER 0
+#define CONFIG_ADPCM_G722_DECODER 0
+#define CONFIG_ADPCM_G726_DECODER 0
+#define CONFIG_ADPCM_G726LE_DECODER 0
+#define CONFIG_ADPCM_IMA_AMV_DECODER 0
+#define CONFIG_ADPCM_IMA_ALP_DECODER 0
+#define CONFIG_ADPCM_IMA_APC_DECODER 0
+#define CONFIG_ADPCM_IMA_APM_DECODER 0
+#define CONFIG_ADPCM_IMA_DAT4_DECODER 0
+#define CONFIG_ADPCM_IMA_DK3_DECODER 0
+#define CONFIG_ADPCM_IMA_DK4_DECODER 0
+#define CONFIG_ADPCM_IMA_EA_EACS_DECODER 0
+#define CONFIG_ADPCM_IMA_EA_SEAD_DECODER 0
+#define CONFIG_ADPCM_IMA_ISS_DECODER 0
+#define CONFIG_ADPCM_IMA_MTF_DECODER 0
+#define CONFIG_ADPCM_IMA_OKI_DECODER 0
+#define CONFIG_ADPCM_IMA_QT_DECODER 0
+#define CONFIG_ADPCM_IMA_RAD_DECODER 0
+#define CONFIG_ADPCM_IMA_SSI_DECODER 0
+#define CONFIG_ADPCM_IMA_SMJPEG_DECODER 0
+#define CONFIG_ADPCM_IMA_WAV_DECODER 0
+#define CONFIG_ADPCM_IMA_WS_DECODER 0
+#define CONFIG_ADPCM_MS_DECODER 0
+#define CONFIG_ADPCM_MTAF_DECODER 0
+#define CONFIG_ADPCM_PSX_DECODER 0
+#define CONFIG_ADPCM_SBPRO_2_DECODER 0
+#define CONFIG_ADPCM_SBPRO_3_DECODER 0
+#define CONFIG_ADPCM_SBPRO_4_DECODER 0
+#define CONFIG_ADPCM_SWF_DECODER 0
+#define CONFIG_ADPCM_THP_DECODER 0
+#define CONFIG_ADPCM_THP_LE_DECODER 0
+#define CONFIG_ADPCM_VIMA_DECODER 0
+#define CONFIG_ADPCM_XA_DECODER 0
+#define CONFIG_ADPCM_YAMAHA_DECODER 0
+#define CONFIG_ADPCM_ZORK_DECODER 0
+#define CONFIG_SSA_DECODER 0
+#define CONFIG_ASS_DECODER 0
+#define CONFIG_CCAPTION_DECODER 0
+#define CONFIG_DVBSUB_DECODER 0
+#define CONFIG_DVDSUB_DECODER 0
+#define CONFIG_JACOSUB_DECODER 0
+#define CONFIG_MICRODVD_DECODER 0
+#define CONFIG_MOVTEXT_DECODER 0
+#define CONFIG_MPL2_DECODER 0
+#define CONFIG_PGSSUB_DECODER 0
+#define CONFIG_PJS_DECODER 0
+#define CONFIG_REALTEXT_DECODER 0
+#define CONFIG_SAMI_DECODER 0
+#define CONFIG_SRT_DECODER 0
+#define CONFIG_STL_DECODER 0
+#define CONFIG_SUBRIP_DECODER 0
+#define CONFIG_SUBVIEWER_DECODER 0
+#define CONFIG_SUBVIEWER1_DECODER 0
+#define CONFIG_TEXT_DECODER 0
+#define CONFIG_VPLAYER_DECODER 0
+#define CONFIG_WEBVTT_DECODER 0
+#define CONFIG_XSUB_DECODER 0
+#define CONFIG_AAC_AT_DECODER 0
+#define CONFIG_AC3_AT_DECODER 0
+#define CONFIG_ADPCM_IMA_QT_AT_DECODER 0
+#define CONFIG_ALAC_AT_DECODER 0
+#define CONFIG_AMR_NB_AT_DECODER 0
+#define CONFIG_EAC3_AT_DECODER 0
+#define CONFIG_GSM_MS_AT_DECODER 0
+#define CONFIG_ILBC_AT_DECODER 0
+#define CONFIG_MP1_AT_DECODER 0
+#define CONFIG_MP2_AT_DECODER 0
+#define CONFIG_MP3_AT_DECODER 0
+#define CONFIG_PCM_ALAW_AT_DECODER 0
+#define CONFIG_PCM_MULAW_AT_DECODER 0
+#define CONFIG_QDMC_AT_DECODER 0
+#define CONFIG_QDM2_AT_DECODER 0
+#define CONFIG_LIBARIBB24_DECODER 0
+#define CONFIG_LIBCELT_DECODER 0
+#define CONFIG_LIBCODEC2_DECODER 0
+#define CONFIG_LIBDAV1D_DECODER 0
+#define CONFIG_LIBDAVS2_DECODER 0
+#define CONFIG_LIBFDK_AAC_DECODER 0
+#define CONFIG_LIBGSM_DECODER 0
+#define CONFIG_LIBGSM_MS_DECODER 0
+#define CONFIG_LIBILBC_DECODER 0
+#define CONFIG_LIBOPENCORE_AMRNB_DECODER 0
+#define CONFIG_LIBOPENCORE_AMRWB_DECODER 0
+#define CONFIG_LIBOPENJPEG_DECODER 0
+#define CONFIG_LIBOPUS_DECODER 1
+#define CONFIG_LIBRSVG_DECODER 0
+#define CONFIG_LIBSPEEX_DECODER 0
+#define CONFIG_LIBVORBIS_DECODER 0
+#define CONFIG_LIBVPX_VP8_DECODER 0
+#define CONFIG_LIBVPX_VP9_DECODER 0
+#define CONFIG_LIBZVBI_TELETEXT_DECODER 0
+#define CONFIG_BINTEXT_DECODER 0
+#define CONFIG_XBIN_DECODER 0
+#define CONFIG_IDF_DECODER 0
+#define CONFIG_LIBAOM_AV1_DECODER 0
+#define CONFIG_LIBOPENH264_DECODER 0
+#define CONFIG_H264_CUVID_DECODER 0
+#define CONFIG_HEVC_CUVID_DECODER 0
+#define CONFIG_HEVC_MEDIACODEC_DECODER 0
+#define CONFIG_MJPEG_CUVID_DECODER 0
+#define CONFIG_MJPEG_QSV_DECODER 0
+#define CONFIG_MPEG1_CUVID_DECODER 0
+#define CONFIG_MPEG2_CUVID_DECODER 0
+#define CONFIG_MPEG4_CUVID_DECODER 0
+#define CONFIG_MPEG4_MEDIACODEC_DECODER 0
+#define CONFIG_VC1_CUVID_DECODER 0
+#define CONFIG_VP8_CUVID_DECODER 0
+#define CONFIG_VP8_MEDIACODEC_DECODER 0
+#define CONFIG_VP8_QSV_DECODER 0
+#define CONFIG_VP9_CUVID_DECODER 0
+#define CONFIG_VP9_MEDIACODEC_DECODER 0
+#define CONFIG_VP9_QSV_DECODER 0
+#define CONFIG_A64MULTI_ENCODER 0
+#define CONFIG_A64MULTI5_ENCODER 0
+#define CONFIG_ALIAS_PIX_ENCODER 0
+#define CONFIG_AMV_ENCODER 0
+#define CONFIG_APNG_ENCODER 0
+#define CONFIG_ASV1_ENCODER 0
+#define CONFIG_ASV2_ENCODER 0
+#define CONFIG_AVRP_ENCODER 0
+#define CONFIG_AVUI_ENCODER 0
+#define CONFIG_AYUV_ENCODER 0
+#define CONFIG_BMP_ENCODER 0
+#define CONFIG_CINEPAK_ENCODER 0
+#define CONFIG_CLJR_ENCODER 0
+#define CONFIG_COMFORTNOISE_ENCODER 0
+#define CONFIG_DNXHD_ENCODER 0
+#define CONFIG_DPX_ENCODER 0
+#define CONFIG_DVVIDEO_ENCODER 0
+#define CONFIG_FFV1_ENCODER 0
+#define CONFIG_FFVHUFF_ENCODER 0
+#define CONFIG_FITS_ENCODER 0
+#define CONFIG_FLASHSV_ENCODER 0
+#define CONFIG_FLASHSV2_ENCODER 0
+#define CONFIG_FLV_ENCODER 0
+#define CONFIG_GIF_ENCODER 0
+#define CONFIG_H261_ENCODER 0
+#define CONFIG_H263_ENCODER 0
+#define CONFIG_H263P_ENCODER 0
+#define CONFIG_HAP_ENCODER 0
+#define CONFIG_HUFFYUV_ENCODER 0
+#define CONFIG_JPEG2000_ENCODER 0
+#define CONFIG_JPEGLS_ENCODER 0
+#define CONFIG_LJPEG_ENCODER 0
+#define CONFIG_MAGICYUV_ENCODER 0
+#define CONFIG_MJPEG_ENCODER 0
+#define CONFIG_MPEG1VIDEO_ENCODER 0
+#define CONFIG_MPEG2VIDEO_ENCODER 0
+#define CONFIG_MPEG4_ENCODER 0
+#define CONFIG_MSMPEG4V2_ENCODER 0
+#define CONFIG_MSMPEG4V3_ENCODER 0
+#define CONFIG_MSVIDEO1_ENCODER 0
+#define CONFIG_PAM_ENCODER 0
+#define CONFIG_PBM_ENCODER 0
+#define CONFIG_PCX_ENCODER 0
+#define CONFIG_PGM_ENCODER 0
+#define CONFIG_PGMYUV_ENCODER 0
+#define CONFIG_PNG_ENCODER 0
+#define CONFIG_PPM_ENCODER 0
+#define CONFIG_PRORES_ENCODER 0
+#define CONFIG_PRORES_AW_ENCODER 0
+#define CONFIG_PRORES_KS_ENCODER 0
+#define CONFIG_QTRLE_ENCODER 0
+#define CONFIG_R10K_ENCODER 0
+#define CONFIG_R210_ENCODER 0
+#define CONFIG_RAWVIDEO_ENCODER 0
+#define CONFIG_ROQ_ENCODER 0
+#define CONFIG_RV10_ENCODER 0
+#define CONFIG_RV20_ENCODER 0
+#define CONFIG_S302M_ENCODER 0
+#define CONFIG_SGI_ENCODER 0
+#define CONFIG_SNOW_ENCODER 0
+#define CONFIG_SUNRAST_ENCODER 0
+#define CONFIG_SVQ1_ENCODER 0
+#define CONFIG_TARGA_ENCODER 0
+#define CONFIG_TIFF_ENCODER 0
+#define CONFIG_UTVIDEO_ENCODER 0
+#define CONFIG_V210_ENCODER 0
+#define CONFIG_V308_ENCODER 0
+#define CONFIG_V408_ENCODER 0
+#define CONFIG_V410_ENCODER 0
+#define CONFIG_VC2_ENCODER 0
+#define CONFIG_WRAPPED_AVFRAME_ENCODER 0
+#define CONFIG_WMV1_ENCODER 0
+#define CONFIG_WMV2_ENCODER 0
+#define CONFIG_XBM_ENCODER 0
+#define CONFIG_XFACE_ENCODER 0
+#define CONFIG_XWD_ENCODER 0
+#define CONFIG_Y41P_ENCODER 0
+#define CONFIG_YUV4_ENCODER 0
+#define CONFIG_ZLIB_ENCODER 0
+#define CONFIG_ZMBV_ENCODER 0
+#define CONFIG_AAC_ENCODER 0
+#define CONFIG_AC3_ENCODER 0
+#define CONFIG_AC3_FIXED_ENCODER 0
+#define CONFIG_ALAC_ENCODER 0
+#define CONFIG_APTX_ENCODER 0
+#define CONFIG_APTX_HD_ENCODER 0
+#define CONFIG_DCA_ENCODER 0
+#define CONFIG_EAC3_ENCODER 0
+#define CONFIG_FLAC_ENCODER 0
+#define CONFIG_G723_1_ENCODER 0
+#define CONFIG_MLP_ENCODER 0
+#define CONFIG_MP2_ENCODER 0
+#define CONFIG_MP2FIXED_ENCODER 0
+#define CONFIG_NELLYMOSER_ENCODER 0
+#define CONFIG_OPUS_ENCODER 0
+#define CONFIG_RA_144_ENCODER 0
+#define CONFIG_SBC_ENCODER 0
+#define CONFIG_SONIC_ENCODER 0
+#define CONFIG_SONIC_LS_ENCODER 0
+#define CONFIG_TRUEHD_ENCODER 0
+#define CONFIG_TTA_ENCODER 0
+#define CONFIG_VORBIS_ENCODER 0
+#define CONFIG_WAVPACK_ENCODER 0
+#define CONFIG_WMAV1_ENCODER 0
+#define CONFIG_WMAV2_ENCODER 0
+#define CONFIG_PCM_ALAW_ENCODER 0
+#define CONFIG_PCM_DVD_ENCODER 0
+#define CONFIG_PCM_F32BE_ENCODER 0
+#define CONFIG_PCM_F32LE_ENCODER 0
+#define CONFIG_PCM_F64BE_ENCODER 0
+#define CONFIG_PCM_F64LE_ENCODER 0
+#define CONFIG_PCM_MULAW_ENCODER 0
+#define CONFIG_PCM_S8_ENCODER 0
+#define CONFIG_PCM_S8_PLANAR_ENCODER 0
+#define CONFIG_PCM_S16BE_ENCODER 0
+#define CONFIG_PCM_S16BE_PLANAR_ENCODER 0
+#define CONFIG_PCM_S16LE_ENCODER 0
+#define CONFIG_PCM_S16LE_PLANAR_ENCODER 0
+#define CONFIG_PCM_S24BE_ENCODER 0
+#define CONFIG_PCM_S24DAUD_ENCODER 0
+#define CONFIG_PCM_S24LE_ENCODER 0
+#define CONFIG_PCM_S24LE_PLANAR_ENCODER 0
+#define CONFIG_PCM_S32BE_ENCODER 0
+#define CONFIG_PCM_S32LE_ENCODER 0
+#define CONFIG_PCM_S32LE_PLANAR_ENCODER 0
+#define CONFIG_PCM_S64BE_ENCODER 0
+#define CONFIG_PCM_S64LE_ENCODER 0
+#define CONFIG_PCM_U8_ENCODER 0
+#define CONFIG_PCM_U16BE_ENCODER 0
+#define CONFIG_PCM_U16LE_ENCODER 0
+#define CONFIG_PCM_U24BE_ENCODER 0
+#define CONFIG_PCM_U24LE_ENCODER 0
+#define CONFIG_PCM_U32BE_ENCODER 0
+#define CONFIG_PCM_U32LE_ENCODER 0
+#define CONFIG_PCM_VIDC_ENCODER 0
+#define CONFIG_ROQ_DPCM_ENCODER 0
+#define CONFIG_ADPCM_ADX_ENCODER 0
+#define CONFIG_ADPCM_G722_ENCODER 0
+#define CONFIG_ADPCM_G726_ENCODER 0
+#define CONFIG_ADPCM_G726LE_ENCODER 0
+#define CONFIG_ADPCM_IMA_QT_ENCODER 0
+#define CONFIG_ADPCM_IMA_WAV_ENCODER 0
+#define CONFIG_ADPCM_MS_ENCODER 0
+#define CONFIG_ADPCM_SWF_ENCODER 0
+#define CONFIG_ADPCM_YAMAHA_ENCODER 0
+#define CONFIG_SSA_ENCODER 0
+#define CONFIG_ASS_ENCODER 0
+#define CONFIG_DVBSUB_ENCODER 0
+#define CONFIG_DVDSUB_ENCODER 0
+#define CONFIG_MOVTEXT_ENCODER 0
+#define CONFIG_SRT_ENCODER 0
+#define CONFIG_SUBRIP_ENCODER 0
+#define CONFIG_TEXT_ENCODER 0
+#define CONFIG_WEBVTT_ENCODER 0
+#define CONFIG_XSUB_ENCODER 0
+#define CONFIG_AAC_AT_ENCODER 0
+#define CONFIG_ALAC_AT_ENCODER 0
+#define CONFIG_ILBC_AT_ENCODER 0
+#define CONFIG_PCM_ALAW_AT_ENCODER 0
+#define CONFIG_PCM_MULAW_AT_ENCODER 0
+#define CONFIG_LIBAOM_AV1_ENCODER 0
+#define CONFIG_LIBCODEC2_ENCODER 0
+#define CONFIG_LIBFDK_AAC_ENCODER 0
+#define CONFIG_LIBGSM_ENCODER 0
+#define CONFIG_LIBGSM_MS_ENCODER 0
+#define CONFIG_LIBILBC_ENCODER 0
+#define CONFIG_LIBMP3LAME_ENCODER 0
+#define CONFIG_LIBOPENCORE_AMRNB_ENCODER 0
+#define CONFIG_LIBOPENJPEG_ENCODER 0
+#define CONFIG_LIBOPUS_ENCODER 0
+#define CONFIG_LIBRAV1E_ENCODER 0
+#define CONFIG_LIBSHINE_ENCODER 0
+#define CONFIG_LIBSPEEX_ENCODER 0
+#define CONFIG_LIBTHEORA_ENCODER 0
+#define CONFIG_LIBTWOLAME_ENCODER 0
+#define CONFIG_LIBVO_AMRWBENC_ENCODER 0
+#define CONFIG_LIBVORBIS_ENCODER 0
+#define CONFIG_LIBVPX_VP8_ENCODER 0
+#define CONFIG_LIBVPX_VP9_ENCODER 0
+#define CONFIG_LIBWAVPACK_ENCODER 0
+#define CONFIG_LIBWEBP_ANIM_ENCODER 0
+#define CONFIG_LIBWEBP_ENCODER 0
+#define CONFIG_LIBX262_ENCODER 0
+#define CONFIG_LIBX264_ENCODER 0
+#define CONFIG_LIBX264RGB_ENCODER 0
+#define CONFIG_LIBX265_ENCODER 0
+#define CONFIG_LIBXAVS_ENCODER 0
+#define CONFIG_LIBXAVS2_ENCODER 0
+#define CONFIG_LIBXVID_ENCODER 0
+#define CONFIG_H263_V4L2M2M_ENCODER 0
+#define CONFIG_LIBOPENH264_ENCODER 0
+#define CONFIG_H264_AMF_ENCODER 0
+#define CONFIG_H264_NVENC_ENCODER 0
+#define CONFIG_H264_OMX_ENCODER 0
+#define CONFIG_H264_QSV_ENCODER 0
+#define CONFIG_H264_V4L2M2M_ENCODER 0
+#define CONFIG_H264_VAAPI_ENCODER 0
+#define CONFIG_H264_VIDEOTOOLBOX_ENCODER 0
+#define CONFIG_NVENC_ENCODER 0
+#define CONFIG_NVENC_H264_ENCODER 0
+#define CONFIG_NVENC_HEVC_ENCODER 0
+#define CONFIG_HEVC_AMF_ENCODER 0
+#define CONFIG_HEVC_NVENC_ENCODER 0
+#define CONFIG_HEVC_QSV_ENCODER 0
+#define CONFIG_HEVC_V4L2M2M_ENCODER 0
+#define CONFIG_HEVC_VAAPI_ENCODER 0
+#define CONFIG_HEVC_VIDEOTOOLBOX_ENCODER 0
+#define CONFIG_LIBKVAZAAR_ENCODER 0
+#define CONFIG_MJPEG_QSV_ENCODER 0
+#define CONFIG_MJPEG_VAAPI_ENCODER 0
+#define CONFIG_MPEG2_QSV_ENCODER 0
+#define CONFIG_MPEG2_VAAPI_ENCODER 0
+#define CONFIG_MPEG4_OMX_ENCODER 0
+#define CONFIG_MPEG4_V4L2M2M_ENCODER 0
+#define CONFIG_VP8_V4L2M2M_ENCODER 0
+#define CONFIG_VP8_VAAPI_ENCODER 0
+#define CONFIG_VP9_VAAPI_ENCODER 0
+#define CONFIG_VP9_QSV_ENCODER 0
+#define CONFIG_H263_VAAPI_HWACCEL 0
+#define CONFIG_H263_VIDEOTOOLBOX_HWACCEL 0
+#define CONFIG_H264_D3D11VA_HWACCEL 0
+#define CONFIG_H264_D3D11VA2_HWACCEL 0
+#define CONFIG_H264_DXVA2_HWACCEL 0
+#define CONFIG_H264_NVDEC_HWACCEL 0
+#define CONFIG_H264_VAAPI_HWACCEL 0
+#define CONFIG_H264_VDPAU_HWACCEL 0
+#define CONFIG_H264_VIDEOTOOLBOX_HWACCEL 0
+#define CONFIG_HEVC_D3D11VA_HWACCEL 0
+#define CONFIG_HEVC_D3D11VA2_HWACCEL 0
+#define CONFIG_HEVC_DXVA2_HWACCEL 0
+#define CONFIG_HEVC_NVDEC_HWACCEL 0
+#define CONFIG_HEVC_VAAPI_HWACCEL 0
+#define CONFIG_HEVC_VDPAU_HWACCEL 0
+#define CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL 0
+#define CONFIG_MJPEG_NVDEC_HWACCEL 0
+#define CONFIG_MJPEG_VAAPI_HWACCEL 0
+#define CONFIG_MPEG1_NVDEC_HWACCEL 0
+#define CONFIG_MPEG1_VDPAU_HWACCEL 0
+#define CONFIG_MPEG1_VIDEOTOOLBOX_HWACCEL 0
+#define CONFIG_MPEG1_XVMC_HWACCEL 0
+#define CONFIG_MPEG2_D3D11VA_HWACCEL 0
+#define CONFIG_MPEG2_D3D11VA2_HWACCEL 0
+#define CONFIG_MPEG2_NVDEC_HWACCEL 0
+#define CONFIG_MPEG2_DXVA2_HWACCEL 0
+#define CONFIG_MPEG2_VAAPI_HWACCEL 0
+#define CONFIG_MPEG2_VDPAU_HWACCEL 0
+#define CONFIG_MPEG2_VIDEOTOOLBOX_HWACCEL 0
+#define CONFIG_MPEG2_XVMC_HWACCEL 0
+#define CONFIG_MPEG4_NVDEC_HWACCEL 0
+#define CONFIG_MPEG4_VAAPI_HWACCEL 0
+#define CONFIG_MPEG4_VDPAU_HWACCEL 0
+#define CONFIG_MPEG4_VIDEOTOOLBOX_HWACCEL 0
+#define CONFIG_VC1_D3D11VA_HWACCEL 0
+#define CONFIG_VC1_D3D11VA2_HWACCEL 0
+#define CONFIG_VC1_DXVA2_HWACCEL 0
+#define CONFIG_VC1_NVDEC_HWACCEL 0
+#define CONFIG_VC1_VAAPI_HWACCEL 0
+#define CONFIG_VC1_VDPAU_HWACCEL 0
+#define CONFIG_VP8_NVDEC_HWACCEL 0
+#define CONFIG_VP8_VAAPI_HWACCEL 0
+#define CONFIG_VP9_D3D11VA_HWACCEL 0
+#define CONFIG_VP9_D3D11VA2_HWACCEL 0
+#define CONFIG_VP9_DXVA2_HWACCEL 0
+#define CONFIG_VP9_NVDEC_HWACCEL 0
+#define CONFIG_VP9_VAAPI_HWACCEL 0
+#define CONFIG_VP9_VDPAU_HWACCEL 0
+#define CONFIG_WMV3_D3D11VA_HWACCEL 0
+#define CONFIG_WMV3_D3D11VA2_HWACCEL 0
+#define CONFIG_WMV3_DXVA2_HWACCEL 0
+#define CONFIG_WMV3_NVDEC_HWACCEL 0
+#define CONFIG_WMV3_VAAPI_HWACCEL 0
+#define CONFIG_WMV3_VDPAU_HWACCEL 0
+#define CONFIG_AAC_PARSER 1
+#define CONFIG_AAC_LATM_PARSER 1
+#define CONFIG_AC3_PARSER 0
+#define CONFIG_ADX_PARSER 0
+#define CONFIG_AV1_PARSER 0
+#define CONFIG_AVS2_PARSER 0
+#define CONFIG_BMP_PARSER 0
+#define CONFIG_CAVSVIDEO_PARSER 0
+#define CONFIG_COOK_PARSER 0
+#define CONFIG_DCA_PARSER 0
+#define CONFIG_DIRAC_PARSER 0
+#define CONFIG_DNXHD_PARSER 0
+#define CONFIG_DPX_PARSER 0
+#define CONFIG_DVAUDIO_PARSER 0
+#define CONFIG_DVBSUB_PARSER 0
+#define CONFIG_DVDSUB_PARSER 0
+#define CONFIG_DVD_NAV_PARSER 0
+#define CONFIG_FLAC_PARSER 1
+#define CONFIG_G723_1_PARSER 0
+#define CONFIG_G729_PARSER 0
+#define CONFIG_GIF_PARSER 0
+#define CONFIG_GSM_PARSER 1
+#define CONFIG_H261_PARSER 0
+#define CONFIG_H263_PARSER 1
+#define CONFIG_H264_PARSER 1
+#define CONFIG_HEVC_PARSER 0
+#define CONFIG_MJPEG_PARSER 0
+#define CONFIG_MLP_PARSER 0
+#define CONFIG_MPEG4VIDEO_PARSER 1
+#define CONFIG_MPEGAUDIO_PARSER 1
+#define CONFIG_MPEGVIDEO_PARSER 0
+#define CONFIG_OPUS_PARSER 1
+#define CONFIG_PNG_PARSER 0
+#define CONFIG_PNM_PARSER 0
+#define CONFIG_RV30_PARSER 0
+#define CONFIG_RV40_PARSER 0
+#define CONFIG_SBC_PARSER 0
+#define CONFIG_SIPR_PARSER 0
+#define CONFIG_TAK_PARSER 0
+#define CONFIG_VC1_PARSER 0
+#define CONFIG_VORBIS_PARSER 1
+#define CONFIG_VP3_PARSER 1
+#define CONFIG_VP8_PARSER 1
+#define CONFIG_VP9_PARSER 1
+#define CONFIG_WEBP_PARSER 0
+#define CONFIG_XMA_PARSER 0
+#define CONFIG_ALSA_INDEV 0
+#define CONFIG_ANDROID_CAMERA_INDEV 0
+#define CONFIG_AVFOUNDATION_INDEV 0
+#define CONFIG_BKTR_INDEV 0
+#define CONFIG_DECKLINK_INDEV 0
+#define CONFIG_DSHOW_INDEV 0
+#define CONFIG_FBDEV_INDEV 0
+#define CONFIG_GDIGRAB_INDEV 0
+#define CONFIG_IEC61883_INDEV 0
+#define CONFIG_JACK_INDEV 0
+#define CONFIG_KMSGRAB_INDEV 0
+#define CONFIG_LAVFI_INDEV 0
+#define CONFIG_OPENAL_INDEV 0
+#define CONFIG_OSS_INDEV 0
+#define CONFIG_PULSE_INDEV 0
+#define CONFIG_SNDIO_INDEV 0
+#define CONFIG_V4L2_INDEV 0
+#define CONFIG_VFWCAP_INDEV 0
+#define CONFIG_XCBGRAB_INDEV 0
+#define CONFIG_LIBCDIO_INDEV 0
+#define CONFIG_LIBDC1394_INDEV 0
+#define CONFIG_ALSA_OUTDEV 0
+#define CONFIG_CACA_OUTDEV 0
+#define CONFIG_DECKLINK_OUTDEV 0
+#define CONFIG_FBDEV_OUTDEV 0
+#define CONFIG_OPENGL_OUTDEV 0
+#define CONFIG_OSS_OUTDEV 0
+#define CONFIG_PULSE_OUTDEV 0
+#define CONFIG_SDL2_OUTDEV 0
+#define CONFIG_SNDIO_OUTDEV 0
+#define CONFIG_V4L2_OUTDEV 0
+#define CONFIG_XV_OUTDEV 0
+#define CONFIG_ABENCH_FILTER 0
+#define CONFIG_ACOMPRESSOR_FILTER 0
+#define CONFIG_ACONTRAST_FILTER 0
+#define CONFIG_ACOPY_FILTER 0
+#define CONFIG_ACUE_FILTER 0
+#define CONFIG_ACROSSFADE_FILTER 0
+#define CONFIG_ACROSSOVER_FILTER 0
+#define CONFIG_ACRUSHER_FILTER 0
+#define CONFIG_ADECLICK_FILTER 0
+#define CONFIG_ADECLIP_FILTER 0
+#define CONFIG_ADELAY_FILTER 0
+#define CONFIG_ADERIVATIVE_FILTER 0
+#define CONFIG_AECHO_FILTER 0
+#define CONFIG_AEMPHASIS_FILTER 0
+#define CONFIG_AEVAL_FILTER 0
+#define CONFIG_AFADE_FILTER 0
+#define CONFIG_AFFTDN_FILTER 0
+#define CONFIG_AFFTFILT_FILTER 0
+#define CONFIG_AFIR_FILTER 0
+#define CONFIG_AFORMAT_FILTER 0
+#define CONFIG_AGATE_FILTER 0
+#define CONFIG_AIIR_FILTER 0
+#define CONFIG_AINTEGRAL_FILTER 0
+#define CONFIG_AINTERLEAVE_FILTER 0
+#define CONFIG_ALIMITER_FILTER 0
+#define CONFIG_ALLPASS_FILTER 0
+#define CONFIG_ALOOP_FILTER 0
+#define CONFIG_AMERGE_FILTER 0
+#define CONFIG_AMETADATA_FILTER 0
+#define CONFIG_AMIX_FILTER 0
+#define CONFIG_AMULTIPLY_FILTER 0
+#define CONFIG_ANEQUALIZER_FILTER 0
+#define CONFIG_ANLMDN_FILTER 0
+#define CONFIG_ANLMS_FILTER 0
+#define CONFIG_ANULL_FILTER 0
+#define CONFIG_APAD_FILTER 0
+#define CONFIG_APERMS_FILTER 0
+#define CONFIG_APHASER_FILTER 0
+#define CONFIG_APULSATOR_FILTER 0
+#define CONFIG_AREALTIME_FILTER 0
+#define CONFIG_ARESAMPLE_FILTER 0
+#define CONFIG_AREVERSE_FILTER 0
+#define CONFIG_ARNNDN_FILTER 0
+#define CONFIG_ASELECT_FILTER 0
+#define CONFIG_ASENDCMD_FILTER 0
+#define CONFIG_ASETNSAMPLES_FILTER 0
+#define CONFIG_ASETPTS_FILTER 0
+#define CONFIG_ASETRATE_FILTER 0
+#define CONFIG_ASETTB_FILTER 0
+#define CONFIG_ASHOWINFO_FILTER 0
+#define CONFIG_ASIDEDATA_FILTER 0
+#define CONFIG_ASOFTCLIP_FILTER 0
+#define CONFIG_ASPLIT_FILTER 0
+#define CONFIG_ASR_FILTER 0
+#define CONFIG_ASTATS_FILTER 0
+#define CONFIG_ASTREAMSELECT_FILTER 0
+#define CONFIG_ATEMPO_FILTER 0
+#define CONFIG_ATRIM_FILTER 0
+#define CONFIG_AXCORRELATE_FILTER 0
+#define CONFIG_AZMQ_FILTER 0
+#define CONFIG_BANDPASS_FILTER 0
+#define CONFIG_BANDREJECT_FILTER 0
+#define CONFIG_BASS_FILTER 0
+#define CONFIG_BIQUAD_FILTER 0
+#define CONFIG_BS2B_FILTER 0
+#define CONFIG_CHROMABER_VULKAN_FILTER 0
+#define CONFIG_CHANNELMAP_FILTER 0
+#define CONFIG_CHANNELSPLIT_FILTER 0
+#define CONFIG_CHORUS_FILTER 0
+#define CONFIG_COMPAND_FILTER 0
+#define CONFIG_COMPENSATIONDELAY_FILTER 0
+#define CONFIG_CROSSFEED_FILTER 0
+#define CONFIG_CRYSTALIZER_FILTER 0
+#define CONFIG_DCSHIFT_FILTER 0
+#define CONFIG_DEESSER_FILTER 0
+#define CONFIG_DRMETER_FILTER 0
+#define CONFIG_DYNAUDNORM_FILTER 0
+#define CONFIG_EARWAX_FILTER 0
+#define CONFIG_EBUR128_FILTER 0
+#define CONFIG_EQUALIZER_FILTER 0
+#define CONFIG_EXTRASTEREO_FILTER 0
+#define CONFIG_FIREQUALIZER_FILTER 0
+#define CONFIG_FLANGER_FILTER 0
+#define CONFIG_HAAS_FILTER 0
+#define CONFIG_HDCD_FILTER 0
+#define CONFIG_HEADPHONE_FILTER 0
+#define CONFIG_HIGHPASS_FILTER 0
+#define CONFIG_HIGHSHELF_FILTER 0
+#define CONFIG_JOIN_FILTER 0
+#define CONFIG_LADSPA_FILTER 0
+#define CONFIG_LOUDNORM_FILTER 0
+#define CONFIG_LOWPASS_FILTER 0
+#define CONFIG_LOWSHELF_FILTER 0
+#define CONFIG_LV2_FILTER 0
+#define CONFIG_MCOMPAND_FILTER 0
+#define CONFIG_PAN_FILTER 0
+#define CONFIG_REPLAYGAIN_FILTER 0
+#define CONFIG_RESAMPLE_FILTER 0
+#define CONFIG_RUBBERBAND_FILTER 0
+#define CONFIG_SIDECHAINCOMPRESS_FILTER 0
+#define CONFIG_SIDECHAINGATE_FILTER 0
+#define CONFIG_SILENCEDETECT_FILTER 0
+#define CONFIG_SILENCEREMOVE_FILTER 0
+#define CONFIG_SOFALIZER_FILTER 0
+#define CONFIG_STEREOTOOLS_FILTER 0
+#define CONFIG_STEREOWIDEN_FILTER 0
+#define CONFIG_SUPEREQUALIZER_FILTER 0
+#define CONFIG_SURROUND_FILTER 0
+#define CONFIG_TREBLE_FILTER 0
+#define CONFIG_TREMOLO_FILTER 0
+#define CONFIG_VIBRATO_FILTER 0
+#define CONFIG_VOLUME_FILTER 0
+#define CONFIG_VOLUMEDETECT_FILTER 0
+#define CONFIG_AEVALSRC_FILTER 0
+#define CONFIG_AFIRSRC_FILTER 0
+#define CONFIG_ANOISESRC_FILTER 0
+#define CONFIG_ANULLSRC_FILTER 0
+#define CONFIG_FLITE_FILTER 0
+#define CONFIG_HILBERT_FILTER 0
+#define CONFIG_SINC_FILTER 0
+#define CONFIG_SINE_FILTER 0
+#define CONFIG_ANULLSINK_FILTER 0
+#define CONFIG_ADDROI_FILTER 0
+#define CONFIG_ALPHAEXTRACT_FILTER 0
+#define CONFIG_ALPHAMERGE_FILTER 0
+#define CONFIG_AMPLIFY_FILTER 0
+#define CONFIG_ASS_FILTER 0
+#define CONFIG_ATADENOISE_FILTER 0
+#define CONFIG_AVGBLUR_FILTER 0
+#define CONFIG_AVGBLUR_OPENCL_FILTER 0
+#define CONFIG_AVGBLUR_VULKAN_FILTER 0
+#define CONFIG_BBOX_FILTER 0
+#define CONFIG_BENCH_FILTER 0
+#define CONFIG_BILATERAL_FILTER 0
+#define CONFIG_BITPLANENOISE_FILTER 0
+#define CONFIG_BLACKDETECT_FILTER 0
+#define CONFIG_BLACKFRAME_FILTER 0
+#define CONFIG_BLEND_FILTER 0
+#define CONFIG_BM3D_FILTER 0
+#define CONFIG_BOXBLUR_FILTER 0
+#define CONFIG_BOXBLUR_OPENCL_FILTER 0
+#define CONFIG_BWDIF_FILTER 0
+#define CONFIG_CAS_FILTER 0
+#define CONFIG_CHROMAHOLD_FILTER 0
+#define CONFIG_CHROMAKEY_FILTER 0
+#define CONFIG_CHROMASHIFT_FILTER 0
+#define CONFIG_CIESCOPE_FILTER 0
+#define CONFIG_CODECVIEW_FILTER 0
+#define CONFIG_COLORBALANCE_FILTER 0
+#define CONFIG_COLORCHANNELMIXER_FILTER 0
+#define CONFIG_COLORKEY_FILTER 0
+#define CONFIG_COLORKEY_OPENCL_FILTER 0
+#define CONFIG_COLORHOLD_FILTER 0
+#define CONFIG_COLORLEVELS_FILTER 0
+#define CONFIG_COLORMATRIX_FILTER 0
+#define CONFIG_COLORSPACE_FILTER 0
+#define CONFIG_CONVOLUTION_FILTER 0
+#define CONFIG_CONVOLUTION_OPENCL_FILTER 0
+#define CONFIG_CONVOLVE_FILTER 0
+#define CONFIG_COPY_FILTER 0
+#define CONFIG_COREIMAGE_FILTER 0
+#define CONFIG_COVER_RECT_FILTER 0
+#define CONFIG_CROP_FILTER 0
+#define CONFIG_CROPDETECT_FILTER 0
+#define CONFIG_CUE_FILTER 0
+#define CONFIG_CURVES_FILTER 0
+#define CONFIG_DATASCOPE_FILTER 0
+#define CONFIG_DCTDNOIZ_FILTER 0
+#define CONFIG_DEBAND_FILTER 0
+#define CONFIG_DEBLOCK_FILTER 0
+#define CONFIG_DECIMATE_FILTER 0
+#define CONFIG_DECONVOLVE_FILTER 0
+#define CONFIG_DEDOT_FILTER 0
+#define CONFIG_DEFLATE_FILTER 0
+#define CONFIG_DEFLICKER_FILTER 0
+#define CONFIG_DEINTERLACE_QSV_FILTER 0
+#define CONFIG_DEINTERLACE_VAAPI_FILTER 0
+#define CONFIG_DEJUDDER_FILTER 0
+#define CONFIG_DELOGO_FILTER 0
+#define CONFIG_DENOISE_VAAPI_FILTER 0
+#define CONFIG_DERAIN_FILTER 0
+#define CONFIG_DESHAKE_FILTER 0
+#define CONFIG_DESHAKE_OPENCL_FILTER 0
+#define CONFIG_DESPILL_FILTER 0
+#define CONFIG_DETELECINE_FILTER 0
+#define CONFIG_DILATION_FILTER 0
+#define CONFIG_DILATION_OPENCL_FILTER 0
+#define CONFIG_DISPLACE_FILTER 0
+#define CONFIG_DNN_PROCESSING_FILTER 0
+#define CONFIG_DOUBLEWEAVE_FILTER 0
+#define CONFIG_DRAWBOX_FILTER 0
+#define CONFIG_DRAWGRAPH_FILTER 0
+#define CONFIG_DRAWGRID_FILTER 0
+#define CONFIG_DRAWTEXT_FILTER 0
+#define CONFIG_EDGEDETECT_FILTER 0
+#define CONFIG_ELBG_FILTER 0
+#define CONFIG_ENTROPY_FILTER 0
+#define CONFIG_EQ_FILTER 0
+#define CONFIG_EROSION_FILTER 0
+#define CONFIG_EROSION_OPENCL_FILTER 0
+#define CONFIG_EXTRACTPLANES_FILTER 0
+#define CONFIG_FADE_FILTER 0
+#define CONFIG_FFTDNOIZ_FILTER 0
+#define CONFIG_FFTFILT_FILTER 0
+#define CONFIG_FIELD_FILTER 0
+#define CONFIG_FIELDHINT_FILTER 0
+#define CONFIG_FIELDMATCH_FILTER 0
+#define CONFIG_FIELDORDER_FILTER 0
+#define CONFIG_FILLBORDERS_FILTER 0
+#define CONFIG_FIND_RECT_FILTER 0
+#define CONFIG_FLOODFILL_FILTER 0
+#define CONFIG_FORMAT_FILTER 0
+#define CONFIG_FPS_FILTER 0
+#define CONFIG_FRAMEPACK_FILTER 0
+#define CONFIG_FRAMERATE_FILTER 0
+#define CONFIG_FRAMESTEP_FILTER 0
+#define CONFIG_FREEZEDETECT_FILTER 0
+#define CONFIG_FREEZEFRAMES_FILTER 0
+#define CONFIG_FREI0R_FILTER 0
+#define CONFIG_FSPP_FILTER 0
+#define CONFIG_GBLUR_FILTER 0
+#define CONFIG_GEQ_FILTER 0
+#define CONFIG_GRADFUN_FILTER 0
+#define CONFIG_GRAPHMONITOR_FILTER 0
+#define CONFIG_GREYEDGE_FILTER 0
+#define CONFIG_HALDCLUT_FILTER 0
+#define CONFIG_HFLIP_FILTER 0
+#define CONFIG_HISTEQ_FILTER 0
+#define CONFIG_HISTOGRAM_FILTER 0
+#define CONFIG_HQDN3D_FILTER 0
+#define CONFIG_HQX_FILTER 0
+#define CONFIG_HSTACK_FILTER 0
+#define CONFIG_HUE_FILTER 0
+#define CONFIG_HWDOWNLOAD_FILTER 0
+#define CONFIG_HWMAP_FILTER 0
+#define CONFIG_HWUPLOAD_FILTER 0
+#define CONFIG_HWUPLOAD_CUDA_FILTER 0
+#define CONFIG_HYSTERESIS_FILTER 0
+#define CONFIG_IDET_FILTER 0
+#define CONFIG_IL_FILTER 0
+#define CONFIG_INFLATE_FILTER 0
+#define CONFIG_INTERLACE_FILTER 0
+#define CONFIG_INTERLEAVE_FILTER 0
+#define CONFIG_KERNDEINT_FILTER 0
+#define CONFIG_LAGFUN_FILTER 0
+#define CONFIG_LENSCORRECTION_FILTER 0
+#define CONFIG_LENSFUN_FILTER 0
+#define CONFIG_LIBVMAF_FILTER 0
+#define CONFIG_LIMITER_FILTER 0
+#define CONFIG_LOOP_FILTER 0
+#define CONFIG_LUMAKEY_FILTER 0
+#define CONFIG_LUT_FILTER 0
+#define CONFIG_LUT1D_FILTER 0
+#define CONFIG_LUT2_FILTER 0
+#define CONFIG_LUT3D_FILTER 0
+#define CONFIG_LUTRGB_FILTER 0
+#define CONFIG_LUTYUV_FILTER 0
+#define CONFIG_MASKEDCLAMP_FILTER 0
+#define CONFIG_MASKEDMAX_FILTER 0
+#define CONFIG_MASKEDMERGE_FILTER 0
+#define CONFIG_MASKEDMIN_FILTER 0
+#define CONFIG_MASKEDTHRESHOLD_FILTER 0
+#define CONFIG_MASKFUN_FILTER 0
+#define CONFIG_MCDEINT_FILTER 0
+#define CONFIG_MEDIAN_FILTER 0
+#define CONFIG_MERGEPLANES_FILTER 0
+#define CONFIG_MESTIMATE_FILTER 0
+#define CONFIG_METADATA_FILTER 0
+#define CONFIG_MIDEQUALIZER_FILTER 0
+#define CONFIG_MINTERPOLATE_FILTER 0
+#define CONFIG_MIX_FILTER 0
+#define CONFIG_MPDECIMATE_FILTER 0
+#define CONFIG_NEGATE_FILTER 0
+#define CONFIG_NLMEANS_FILTER 0
+#define CONFIG_NLMEANS_OPENCL_FILTER 0
+#define CONFIG_NNEDI_FILTER 0
+#define CONFIG_NOFORMAT_FILTER 0
+#define CONFIG_NOISE_FILTER 0
+#define CONFIG_NORMALIZE_FILTER 0
+#define CONFIG_NULL_FILTER 0
+#define CONFIG_OCR_FILTER 0
+#define CONFIG_OCV_FILTER 0
+#define CONFIG_OSCILLOSCOPE_FILTER 0
+#define CONFIG_OVERLAY_FILTER 0
+#define CONFIG_OVERLAY_OPENCL_FILTER 0
+#define CONFIG_OVERLAY_QSV_FILTER 0
+#define CONFIG_OVERLAY_VULKAN_FILTER 0
+#define CONFIG_OVERLAY_CUDA_FILTER 0
+#define CONFIG_OWDENOISE_FILTER 0
+#define CONFIG_PAD_FILTER 0
+#define CONFIG_PAD_OPENCL_FILTER 0
+#define CONFIG_PALETTEGEN_FILTER 0
+#define CONFIG_PALETTEUSE_FILTER 0
+#define CONFIG_PERMS_FILTER 0
+#define CONFIG_PERSPECTIVE_FILTER 0
+#define CONFIG_PHASE_FILTER 0
+#define CONFIG_PHOTOSENSITIVITY_FILTER 0
+#define CONFIG_PIXDESCTEST_FILTER 0
+#define CONFIG_PIXSCOPE_FILTER 0
+#define CONFIG_PP_FILTER 0
+#define CONFIG_PP7_FILTER 0
+#define CONFIG_PREMULTIPLY_FILTER 0
+#define CONFIG_PREWITT_FILTER 0
+#define CONFIG_PREWITT_OPENCL_FILTER 0
+#define CONFIG_PROCAMP_VAAPI_FILTER 0
+#define CONFIG_PROGRAM_OPENCL_FILTER 0
+#define CONFIG_PSEUDOCOLOR_FILTER 0
+#define CONFIG_PSNR_FILTER 0
+#define CONFIG_PULLUP_FILTER 0
+#define CONFIG_QP_FILTER 0
+#define CONFIG_RANDOM_FILTER 0
+#define CONFIG_READEIA608_FILTER 0
+#define CONFIG_READVITC_FILTER 0
+#define CONFIG_REALTIME_FILTER 0
+#define CONFIG_REMAP_FILTER 0
+#define CONFIG_REMOVEGRAIN_FILTER 0
+#define CONFIG_REMOVELOGO_FILTER 0
+#define CONFIG_REPEATFIELDS_FILTER 0
+#define CONFIG_REVERSE_FILTER 0
+#define CONFIG_RGBASHIFT_FILTER 0
+#define CONFIG_ROBERTS_FILTER 0
+#define CONFIG_ROBERTS_OPENCL_FILTER 0
+#define CONFIG_ROTATE_FILTER 0
+#define CONFIG_SAB_FILTER 0
+#define CONFIG_SCALE_FILTER 0
+#define CONFIG_SCALE_CUDA_FILTER 0
+#define CONFIG_SCALE_NPP_FILTER 0
+#define CONFIG_SCALE_QSV_FILTER 0
+#define CONFIG_SCALE_VAAPI_FILTER 0
+#define CONFIG_SCALE_VULKAN_FILTER 0
+#define CONFIG_SCALE2REF_FILTER 0
+#define CONFIG_SCROLL_FILTER 0
+#define CONFIG_SELECT_FILTER 0
+#define CONFIG_SELECTIVECOLOR_FILTER 0
+#define CONFIG_SENDCMD_FILTER 0
+#define CONFIG_SEPARATEFIELDS_FILTER 0
+#define CONFIG_SETDAR_FILTER 0
+#define CONFIG_SETFIELD_FILTER 0
+#define CONFIG_SETPARAMS_FILTER 0
+#define CONFIG_SETPTS_FILTER 0
+#define CONFIG_SETRANGE_FILTER 0
+#define CONFIG_SETSAR_FILTER 0
+#define CONFIG_SETTB_FILTER 0
+#define CONFIG_SHARPNESS_VAAPI_FILTER 0
+#define CONFIG_SHOWINFO_FILTER 0
+#define CONFIG_SHOWPALETTE_FILTER 0
+#define CONFIG_SHUFFLEFRAMES_FILTER 0
+#define CONFIG_SHUFFLEPLANES_FILTER 0
+#define CONFIG_SIDEDATA_FILTER 0
+#define CONFIG_SIGNALSTATS_FILTER 0
+#define CONFIG_SIGNATURE_FILTER 0
+#define CONFIG_SMARTBLUR_FILTER 0
+#define CONFIG_SOBEL_FILTER 0
+#define CONFIG_SOBEL_OPENCL_FILTER 0
+#define CONFIG_SPLIT_FILTER 0
+#define CONFIG_SPP_FILTER 0
+#define CONFIG_SR_FILTER 0
+#define CONFIG_SSIM_FILTER 0
+#define CONFIG_STEREO3D_FILTER 0
+#define CONFIG_STREAMSELECT_FILTER 0
+#define CONFIG_SUBTITLES_FILTER 0
+#define CONFIG_SUPER2XSAI_FILTER 0
+#define CONFIG_SWAPRECT_FILTER 0
+#define CONFIG_SWAPUV_FILTER 0
+#define CONFIG_TBLEND_FILTER 0
+#define CONFIG_TELECINE_FILTER 0
+#define CONFIG_THISTOGRAM_FILTER 0
+#define CONFIG_THRESHOLD_FILTER 0
+#define CONFIG_THUMBNAIL_FILTER 0
+#define CONFIG_THUMBNAIL_CUDA_FILTER 0
+#define CONFIG_TILE_FILTER 0
+#define CONFIG_TINTERLACE_FILTER 0
+#define CONFIG_TLUT2_FILTER 0
+#define CONFIG_TMEDIAN_FILTER 0
+#define CONFIG_TMIX_FILTER 0
+#define CONFIG_TONEMAP_FILTER 0
+#define CONFIG_TONEMAP_OPENCL_FILTER 0
+#define CONFIG_TONEMAP_VAAPI_FILTER 0
+#define CONFIG_TPAD_FILTER 0
+#define CONFIG_TRANSPOSE_FILTER 0
+#define CONFIG_TRANSPOSE_NPP_FILTER 0
+#define CONFIG_TRANSPOSE_OPENCL_FILTER 0
+#define CONFIG_TRANSPOSE_VAAPI_FILTER 0
+#define CONFIG_TRIM_FILTER 0
+#define CONFIG_UNPREMULTIPLY_FILTER 0
+#define CONFIG_UNSHARP_FILTER 0
+#define CONFIG_UNSHARP_OPENCL_FILTER 0
+#define CONFIG_USPP_FILTER 0
+#define CONFIG_V360_FILTER 0
+#define CONFIG_VAGUEDENOISER_FILTER 0
+#define CONFIG_VECTORSCOPE_FILTER 0
+#define CONFIG_VFLIP_FILTER 0
+#define CONFIG_VFRDET_FILTER 0
+#define CONFIG_VIBRANCE_FILTER 0
+#define CONFIG_VIDSTABDETECT_FILTER 0
+#define CONFIG_VIDSTABTRANSFORM_FILTER 0
+#define CONFIG_VIGNETTE_FILTER 0
+#define CONFIG_VMAFMOTION_FILTER 0
+#define CONFIG_VPP_QSV_FILTER 0
+#define CONFIG_VSTACK_FILTER 0
+#define CONFIG_W3FDIF_FILTER 0
+#define CONFIG_WAVEFORM_FILTER 0
+#define CONFIG_WEAVE_FILTER 0
+#define CONFIG_XBR_FILTER 0
+#define CONFIG_XFADE_FILTER 0
+#define CONFIG_XFADE_OPENCL_FILTER 0
+#define CONFIG_XMEDIAN_FILTER 0
+#define CONFIG_XSTACK_FILTER 0
+#define CONFIG_YADIF_FILTER 0
+#define CONFIG_YADIF_CUDA_FILTER 0
+#define CONFIG_YAEPBLUR_FILTER 0
+#define CONFIG_ZMQ_FILTER 0
+#define CONFIG_ZOOMPAN_FILTER 0
+#define CONFIG_ZSCALE_FILTER 0
+#define CONFIG_ALLRGB_FILTER 0
+#define CONFIG_ALLYUV_FILTER 0
+#define CONFIG_CELLAUTO_FILTER 0
+#define CONFIG_COLOR_FILTER 0
+#define CONFIG_COREIMAGESRC_FILTER 0
+#define CONFIG_FREI0R_SRC_FILTER 0
+#define CONFIG_HALDCLUTSRC_FILTER 0
+#define CONFIG_LIFE_FILTER 0
+#define CONFIG_MANDELBROT_FILTER 0
+#define CONFIG_MPTESTSRC_FILTER 0
+#define CONFIG_NULLSRC_FILTER 0
+#define CONFIG_OPENCLSRC_FILTER 0
+#define CONFIG_PAL75BARS_FILTER 0
+#define CONFIG_PAL100BARS_FILTER 0
+#define CONFIG_RGBTESTSRC_FILTER 0
+#define CONFIG_SIERPINSKI_FILTER 0
+#define CONFIG_SMPTEBARS_FILTER 0
+#define CONFIG_SMPTEHDBARS_FILTER 0
+#define CONFIG_TESTSRC_FILTER 0
+#define CONFIG_TESTSRC2_FILTER 0
+#define CONFIG_YUVTESTSRC_FILTER 0
+#define CONFIG_NULLSINK_FILTER 0
+#define CONFIG_ABITSCOPE_FILTER 0
+#define CONFIG_ADRAWGRAPH_FILTER 0
+#define CONFIG_AGRAPHMONITOR_FILTER 0
+#define CONFIG_AHISTOGRAM_FILTER 0
+#define CONFIG_APHASEMETER_FILTER 0
+#define CONFIG_AVECTORSCOPE_FILTER 0
+#define CONFIG_CONCAT_FILTER 0
+#define CONFIG_SHOWCQT_FILTER 0
+#define CONFIG_SHOWFREQS_FILTER 0
+#define CONFIG_SHOWSPATIAL_FILTER 0
+#define CONFIG_SHOWSPECTRUM_FILTER 0
+#define CONFIG_SHOWSPECTRUMPIC_FILTER 0
+#define CONFIG_SHOWVOLUME_FILTER 0
+#define CONFIG_SHOWWAVES_FILTER 0
+#define CONFIG_SHOWWAVESPIC_FILTER 0
+#define CONFIG_SPECTRUMSYNTH_FILTER 0
+#define CONFIG_AMOVIE_FILTER 0
+#define CONFIG_MOVIE_FILTER 0
+#define CONFIG_AFIFO_FILTER 0
+#define CONFIG_FIFO_FILTER 0
+#define CONFIG_AA_DEMUXER 0
+#define CONFIG_AAC_DEMUXER 1
+#define CONFIG_AC3_DEMUXER 0
+#define CONFIG_ACM_DEMUXER 0
+#define CONFIG_ACT_DEMUXER 0
+#define CONFIG_ADF_DEMUXER 0
+#define CONFIG_ADP_DEMUXER 0
+#define CONFIG_ADS_DEMUXER 0
+#define CONFIG_ADX_DEMUXER 0
+#define CONFIG_AEA_DEMUXER 0
+#define CONFIG_AFC_DEMUXER 0
+#define CONFIG_AIFF_DEMUXER 0
+#define CONFIG_AIX_DEMUXER 0
+#define CONFIG_ALP_DEMUXER 0
+#define CONFIG_AMR_DEMUXER 1
+#define CONFIG_AMRNB_DEMUXER 0
+#define CONFIG_AMRWB_DEMUXER 0
+#define CONFIG_ANM_DEMUXER 0
+#define CONFIG_APC_DEMUXER 0
+#define CONFIG_APE_DEMUXER 0
+#define CONFIG_APM_DEMUXER 0
+#define CONFIG_APNG_DEMUXER 0
+#define CONFIG_APTX_DEMUXER 0
+#define CONFIG_APTX_HD_DEMUXER 0
+#define CONFIG_AQTITLE_DEMUXER 0
+#define CONFIG_ARGO_ASF_DEMUXER 0
+#define CONFIG_ASF_DEMUXER 0
+#define CONFIG_ASF_O_DEMUXER 0
+#define CONFIG_ASS_DEMUXER 0
+#define CONFIG_AST_DEMUXER 0
+#define CONFIG_AU_DEMUXER 0
+#define CONFIG_AV1_DEMUXER 0
+#define CONFIG_AVI_DEMUXER 1
+#define CONFIG_AVISYNTH_DEMUXER 0
+#define CONFIG_AVR_DEMUXER 0
+#define CONFIG_AVS_DEMUXER 0
+#define CONFIG_AVS2_DEMUXER 0
+#define CONFIG_BETHSOFTVID_DEMUXER 0
+#define CONFIG_BFI_DEMUXER 0
+#define CONFIG_BINTEXT_DEMUXER 0
+#define CONFIG_BINK_DEMUXER 0
+#define CONFIG_BIT_DEMUXER 0
+#define CONFIG_BMV_DEMUXER 0
+#define CONFIG_BFSTM_DEMUXER 0
+#define CONFIG_BRSTM_DEMUXER 0
+#define CONFIG_BOA_DEMUXER 0
+#define CONFIG_C93_DEMUXER 0
+#define CONFIG_CAF_DEMUXER 0
+#define CONFIG_CAVSVIDEO_DEMUXER 0
+#define CONFIG_CDG_DEMUXER 0
+#define CONFIG_CDXL_DEMUXER 0
+#define CONFIG_CINE_DEMUXER 0
+#define CONFIG_CODEC2_DEMUXER 0
+#define CONFIG_CODEC2RAW_DEMUXER 0
+#define CONFIG_CONCAT_DEMUXER 0
+#define CONFIG_DASH_DEMUXER 0
+#define CONFIG_DATA_DEMUXER 0
+#define CONFIG_DAUD_DEMUXER 0
+#define CONFIG_DCSTR_DEMUXER 0
+#define CONFIG_DERF_DEMUXER 0
+#define CONFIG_DFA_DEMUXER 0
+#define CONFIG_DHAV_DEMUXER 0
+#define CONFIG_DIRAC_DEMUXER 0
+#define CONFIG_DNXHD_DEMUXER 0
+#define CONFIG_DSF_DEMUXER 0
+#define CONFIG_DSICIN_DEMUXER 0
+#define CONFIG_DSS_DEMUXER 0
+#define CONFIG_DTS_DEMUXER 0
+#define CONFIG_DTSHD_DEMUXER 0
+#define CONFIG_DV_DEMUXER 0
+#define CONFIG_DVBSUB_DEMUXER 0
+#define CONFIG_DVBTXT_DEMUXER 0
+#define CONFIG_DXA_DEMUXER 0
+#define CONFIG_EA_DEMUXER 0
+#define CONFIG_EA_CDATA_DEMUXER 0
+#define CONFIG_EAC3_DEMUXER 0
+#define CONFIG_EPAF_DEMUXER 0
+#define CONFIG_FFMETADATA_DEMUXER 0
+#define CONFIG_FILMSTRIP_DEMUXER 0
+#define CONFIG_FITS_DEMUXER 0
+#define CONFIG_FLAC_DEMUXER 1
+#define CONFIG_FLIC_DEMUXER 0
+#define CONFIG_FLV_DEMUXER 0
+#define CONFIG_LIVE_FLV_DEMUXER 0
+#define CONFIG_FOURXM_DEMUXER 0
+#define CONFIG_FRM_DEMUXER 0
+#define CONFIG_FSB_DEMUXER 0
+#define CONFIG_FWSE_DEMUXER 0
+#define CONFIG_G722_DEMUXER 0
+#define CONFIG_G723_1_DEMUXER 0
+#define CONFIG_G726_DEMUXER 0
+#define CONFIG_G726LE_DEMUXER 0
+#define CONFIG_G729_DEMUXER 0
+#define CONFIG_GDV_DEMUXER 0
+#define CONFIG_GENH_DEMUXER 0
+#define CONFIG_GIF_DEMUXER 0
+#define CONFIG_GSM_DEMUXER 1
+#define CONFIG_GXF_DEMUXER 0
+#define CONFIG_H261_DEMUXER 0
+#define CONFIG_H263_DEMUXER 0
+#define CONFIG_H264_DEMUXER 0
+#define CONFIG_HCA_DEMUXER 0
+#define CONFIG_HCOM_DEMUXER 0
+#define CONFIG_HEVC_DEMUXER 0
+#define CONFIG_HLS_DEMUXER 0
+#define CONFIG_HNM_DEMUXER 0
+#define CONFIG_ICO_DEMUXER 0
+#define CONFIG_IDCIN_DEMUXER 0
+#define CONFIG_IDF_DEMUXER 0
+#define CONFIG_IFF_DEMUXER 0
+#define CONFIG_IFV_DEMUXER 0
+#define CONFIG_ILBC_DEMUXER 0
+#define CONFIG_IMAGE2_DEMUXER 0
+#define CONFIG_IMAGE2PIPE_DEMUXER 0
+#define CONFIG_IMAGE2_ALIAS_PIX_DEMUXER 0
+#define CONFIG_IMAGE2_BRENDER_PIX_DEMUXER 0
+#define CONFIG_INGENIENT_DEMUXER 0
+#define CONFIG_IPMOVIE_DEMUXER 0
+#define CONFIG_IRCAM_DEMUXER 0
+#define CONFIG_ISS_DEMUXER 0
+#define CONFIG_IV8_DEMUXER 0
+#define CONFIG_IVF_DEMUXER 0
+#define CONFIG_IVR_DEMUXER 0
+#define CONFIG_JACOSUB_DEMUXER 0
+#define CONFIG_JV_DEMUXER 0
+#define CONFIG_KUX_DEMUXER 0
+#define CONFIG_KVAG_DEMUXER 0
+#define CONFIG_LMLM4_DEMUXER 0
+#define CONFIG_LOAS_DEMUXER 0
+#define CONFIG_LRC_DEMUXER 0
+#define CONFIG_LVF_DEMUXER 0
+#define CONFIG_LXF_DEMUXER 0
+#define CONFIG_M4V_DEMUXER 0
+#define CONFIG_MATROSKA_DEMUXER 1
+#define CONFIG_MGSTS_DEMUXER 0
+#define CONFIG_MICRODVD_DEMUXER 0
+#define CONFIG_MJPEG_DEMUXER 0
+#define CONFIG_MJPEG_2000_DEMUXER 0
+#define CONFIG_MLP_DEMUXER 0
+#define CONFIG_MLV_DEMUXER 0
+#define CONFIG_MM_DEMUXER 0
+#define CONFIG_MMF_DEMUXER 0
+#define CONFIG_MOV_DEMUXER 1
+#define CONFIG_MP3_DEMUXER 1
+#define CONFIG_MPC_DEMUXER 0
+#define CONFIG_MPC8_DEMUXER 0
+#define CONFIG_MPEGPS_DEMUXER 0
+#define CONFIG_MPEGTS_DEMUXER 0
+#define CONFIG_MPEGTSRAW_DEMUXER 0
+#define CONFIG_MPEGVIDEO_DEMUXER 0
+#define CONFIG_MPJPEG_DEMUXER 0
+#define CONFIG_MPL2_DEMUXER 0
+#define CONFIG_MPSUB_DEMUXER 0
+#define CONFIG_MSF_DEMUXER 0
+#define CONFIG_MSNWC_TCP_DEMUXER 0
+#define CONFIG_MTAF_DEMUXER 0
+#define CONFIG_MTV_DEMUXER 0
+#define CONFIG_MUSX_DEMUXER 0
+#define CONFIG_MV_DEMUXER 0
+#define CONFIG_MVI_DEMUXER 0
+#define CONFIG_MXF_DEMUXER 0
+#define CONFIG_MXG_DEMUXER 0
+#define CONFIG_NC_DEMUXER 0
+#define CONFIG_NISTSPHERE_DEMUXER 0
+#define CONFIG_NSP_DEMUXER 0
+#define CONFIG_NSV_DEMUXER 0
+#define CONFIG_NUT_DEMUXER 0
+#define CONFIG_NUV_DEMUXER 0
+#define CONFIG_OGG_DEMUXER 1
+#define CONFIG_OMA_DEMUXER 0
+#define CONFIG_PAF_DEMUXER 0
+#define CONFIG_PCM_ALAW_DEMUXER 0
+#define CONFIG_PCM_MULAW_DEMUXER 0
+#define CONFIG_PCM_VIDC_DEMUXER 0
+#define CONFIG_PCM_F64BE_DEMUXER 0
+#define CONFIG_PCM_F64LE_DEMUXER 0
+#define CONFIG_PCM_F32BE_DEMUXER 0
+#define CONFIG_PCM_F32LE_DEMUXER 0
+#define CONFIG_PCM_S32BE_DEMUXER 0
+#define CONFIG_PCM_S32LE_DEMUXER 0
+#define CONFIG_PCM_S24BE_DEMUXER 0
+#define CONFIG_PCM_S24LE_DEMUXER 0
+#define CONFIG_PCM_S16BE_DEMUXER 0
+#define CONFIG_PCM_S16LE_DEMUXER 0
+#define CONFIG_PCM_S8_DEMUXER 0
+#define CONFIG_PCM_U32BE_DEMUXER 0
+#define CONFIG_PCM_U32LE_DEMUXER 0
+#define CONFIG_PCM_U24BE_DEMUXER 0
+#define CONFIG_PCM_U24LE_DEMUXER 0
+#define CONFIG_PCM_U16BE_DEMUXER 0
+#define CONFIG_PCM_U16LE_DEMUXER 0
+#define CONFIG_PCM_U8_DEMUXER 0
+#define CONFIG_PJS_DEMUXER 0
+#define CONFIG_PMP_DEMUXER 0
+#define CONFIG_PVA_DEMUXER 0
+#define CONFIG_PVF_DEMUXER 0
+#define CONFIG_QCP_DEMUXER 0
+#define CONFIG_R3D_DEMUXER 0
+#define CONFIG_RAWVIDEO_DEMUXER 0
+#define CONFIG_REALTEXT_DEMUXER 0
+#define CONFIG_REDSPARK_DEMUXER 0
+#define CONFIG_RL2_DEMUXER 0
+#define CONFIG_RM_DEMUXER 0
+#define CONFIG_ROQ_DEMUXER 0
+#define CONFIG_RPL_DEMUXER 0
+#define CONFIG_RSD_DEMUXER 0
+#define CONFIG_RSO_DEMUXER 0
+#define CONFIG_RTP_DEMUXER 0
+#define CONFIG_RTSP_DEMUXER 0
+#define CONFIG_S337M_DEMUXER 0
+#define CONFIG_SAMI_DEMUXER 0
+#define CONFIG_SAP_DEMUXER 0
+#define CONFIG_SBC_DEMUXER 0
+#define CONFIG_SBG_DEMUXER 0
+#define CONFIG_SCC_DEMUXER 0
+#define CONFIG_SDP_DEMUXER 0
+#define CONFIG_SDR2_DEMUXER 0
+#define CONFIG_SDS_DEMUXER 0
+#define CONFIG_SDX_DEMUXER 0
+#define CONFIG_SEGAFILM_DEMUXER 0
+#define CONFIG_SER_DEMUXER 0
+#define CONFIG_SHORTEN_DEMUXER 0
+#define CONFIG_SIFF_DEMUXER 0
+#define CONFIG_SLN_DEMUXER 0
+#define CONFIG_SMACKER_DEMUXER 0
+#define CONFIG_SMJPEG_DEMUXER 0
+#define CONFIG_SMUSH_DEMUXER 0
+#define CONFIG_SOL_DEMUXER 0
+#define CONFIG_SOX_DEMUXER 0
+#define CONFIG_SPDIF_DEMUXER 0
+#define CONFIG_SRT_DEMUXER 0
+#define CONFIG_STR_DEMUXER 0
+#define CONFIG_STL_DEMUXER 0
+#define CONFIG_SUBVIEWER1_DEMUXER 0
+#define CONFIG_SUBVIEWER_DEMUXER 0
+#define CONFIG_SUP_DEMUXER 0
+#define CONFIG_SVAG_DEMUXER 0
+#define CONFIG_SWF_DEMUXER 0
+#define CONFIG_TAK_DEMUXER 0
+#define CONFIG_TEDCAPTIONS_DEMUXER 0
+#define CONFIG_THP_DEMUXER 0
+#define CONFIG_THREEDOSTR_DEMUXER 0
+#define CONFIG_TIERTEXSEQ_DEMUXER 0
+#define CONFIG_TMV_DEMUXER 0
+#define CONFIG_TRUEHD_DEMUXER 0
+#define CONFIG_TTA_DEMUXER 0
+#define CONFIG_TXD_DEMUXER 0
+#define CONFIG_TTY_DEMUXER 0
+#define CONFIG_TY_DEMUXER 0
+#define CONFIG_V210_DEMUXER 0
+#define CONFIG_V210X_DEMUXER 0
+#define CONFIG_VAG_DEMUXER 0
+#define CONFIG_VC1_DEMUXER 0
+#define CONFIG_VC1T_DEMUXER 0
+#define CONFIG_VIVIDAS_DEMUXER 0
+#define CONFIG_VIVO_DEMUXER 0
+#define CONFIG_VMD_DEMUXER 0
+#define CONFIG_VOBSUB_DEMUXER 0
+#define CONFIG_VOC_DEMUXER 0
+#define CONFIG_VPK_DEMUXER 0
+#define CONFIG_VPLAYER_DEMUXER 0
+#define CONFIG_VQF_DEMUXER 0
+#define CONFIG_W64_DEMUXER 0
+#define CONFIG_WAV_DEMUXER 1
+#define CONFIG_WC3_DEMUXER 0
+#define CONFIG_WEBM_DASH_MANIFEST_DEMUXER 0
+#define CONFIG_WEBVTT_DEMUXER 0
+#define CONFIG_WSAUD_DEMUXER 0
+#define CONFIG_WSD_DEMUXER 0
+#define CONFIG_WSVQA_DEMUXER 0
+#define CONFIG_WTV_DEMUXER 0
+#define CONFIG_WVE_DEMUXER 0
+#define CONFIG_WV_DEMUXER 0
+#define CONFIG_XA_DEMUXER 0
+#define CONFIG_XBIN_DEMUXER 0
+#define CONFIG_XMV_DEMUXER 0
+#define CONFIG_XVAG_DEMUXER 0
+#define CONFIG_XWMA_DEMUXER 0
+#define CONFIG_YOP_DEMUXER 0
+#define CONFIG_YUV4MPEGPIPE_DEMUXER 0
+#define CONFIG_IMAGE_BMP_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_DDS_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_DPX_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_EXR_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_GIF_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_J2K_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_JPEG_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_JPEGLS_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_PAM_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_PBM_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_PCX_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_PGMYUV_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_PGM_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_PICTOR_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_PNG_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_PPM_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_PSD_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_QDRAW_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_SGI_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_SVG_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_SUNRAST_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_TIFF_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_WEBP_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_XPM_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_XWD_PIPE_DEMUXER 0
+#define CONFIG_LIBGME_DEMUXER 0
+#define CONFIG_LIBMODPLUG_DEMUXER 0
+#define CONFIG_LIBOPENMPT_DEMUXER 0
+#define CONFIG_VAPOURSYNTH_DEMUXER 0
+#define CONFIG_A64_MUXER 0
+#define CONFIG_AC3_MUXER 0
+#define CONFIG_ADTS_MUXER 0
+#define CONFIG_ADX_MUXER 0
+#define CONFIG_AIFF_MUXER 0
+#define CONFIG_AMR_MUXER 0
+#define CONFIG_APNG_MUXER 0
+#define CONFIG_APTX_MUXER 0
+#define CONFIG_APTX_HD_MUXER 0
+#define CONFIG_ASF_MUXER 0
+#define CONFIG_ASS_MUXER 0
+#define CONFIG_AST_MUXER 0
+#define CONFIG_ASF_STREAM_MUXER 0
+#define CONFIG_AU_MUXER 0
+#define CONFIG_AVI_MUXER 0
+#define CONFIG_AVM2_MUXER 0
+#define CONFIG_AVS2_MUXER 0
+#define CONFIG_BIT_MUXER 0
+#define CONFIG_CAF_MUXER 0
+#define CONFIG_CAVSVIDEO_MUXER 0
+#define CONFIG_CODEC2_MUXER 0
+#define CONFIG_CODEC2RAW_MUXER 0
+#define CONFIG_CRC_MUXER 0
+#define CONFIG_DASH_MUXER 0
+#define CONFIG_DATA_MUXER 0
+#define CONFIG_DAUD_MUXER 0
+#define CONFIG_DIRAC_MUXER 0
+#define CONFIG_DNXHD_MUXER 0
+#define CONFIG_DTS_MUXER 0
+#define CONFIG_DV_MUXER 0
+#define CONFIG_EAC3_MUXER 0
+#define CONFIG_F4V_MUXER 0
+#define CONFIG_FFMETADATA_MUXER 0
+#define CONFIG_FIFO_MUXER 0
+#define CONFIG_FIFO_TEST_MUXER 0
+#define CONFIG_FILMSTRIP_MUXER 0
+#define CONFIG_FITS_MUXER 0
+#define CONFIG_FLAC_MUXER 0
+#define CONFIG_FLV_MUXER 0
+#define CONFIG_FRAMECRC_MUXER 0
+#define CONFIG_FRAMEHASH_MUXER 0
+#define CONFIG_FRAMEMD5_MUXER 0
+#define CONFIG_G722_MUXER 0
+#define CONFIG_G723_1_MUXER 0
+#define CONFIG_G726_MUXER 0
+#define CONFIG_G726LE_MUXER 0
+#define CONFIG_GIF_MUXER 0
+#define CONFIG_GSM_MUXER 0
+#define CONFIG_GXF_MUXER 0
+#define CONFIG_H261_MUXER 0
+#define CONFIG_H263_MUXER 0
+#define CONFIG_H264_MUXER 0
+#define CONFIG_HASH_MUXER 0
+#define CONFIG_HDS_MUXER 0
+#define CONFIG_HEVC_MUXER 0
+#define CONFIG_HLS_MUXER 0
+#define CONFIG_ICO_MUXER 0
+#define CONFIG_ILBC_MUXER 0
+#define CONFIG_IMAGE2_MUXER 0
+#define CONFIG_IMAGE2PIPE_MUXER 0
+#define CONFIG_IPOD_MUXER 0
+#define CONFIG_IRCAM_MUXER 0
+#define CONFIG_ISMV_MUXER 0
+#define CONFIG_IVF_MUXER 0
+#define CONFIG_JACOSUB_MUXER 0
+#define CONFIG_LATM_MUXER 0
+#define CONFIG_LRC_MUXER 0
+#define CONFIG_M4V_MUXER 0
+#define CONFIG_MD5_MUXER 0
+#define CONFIG_MATROSKA_MUXER 0
+#define CONFIG_MATROSKA_AUDIO_MUXER 0
+#define CONFIG_MICRODVD_MUXER 0
+#define CONFIG_MJPEG_MUXER 0
+#define CONFIG_MLP_MUXER 0
+#define CONFIG_MMF_MUXER 0
+#define CONFIG_MOV_MUXER 0
+#define CONFIG_MP2_MUXER 0
+#define CONFIG_MP3_MUXER 0
+#define CONFIG_MP4_MUXER 0
+#define CONFIG_MPEG1SYSTEM_MUXER 0
+#define CONFIG_MPEG1VCD_MUXER 0
+#define CONFIG_MPEG1VIDEO_MUXER 0
+#define CONFIG_MPEG2DVD_MUXER 0
+#define CONFIG_MPEG2SVCD_MUXER 0
+#define CONFIG_MPEG2VIDEO_MUXER 0
+#define CONFIG_MPEG2VOB_MUXER 0
+#define CONFIG_MPEGTS_MUXER 0
+#define CONFIG_MPJPEG_MUXER 0
+#define CONFIG_MXF_MUXER 0
+#define CONFIG_MXF_D10_MUXER 0
+#define CONFIG_MXF_OPATOM_MUXER 0
+#define CONFIG_NULL_MUXER 0
+#define CONFIG_NUT_MUXER 0
+#define CONFIG_OGA_MUXER 0
+#define CONFIG_OGG_MUXER 0
+#define CONFIG_OGV_MUXER 0
+#define CONFIG_OMA_MUXER 0
+#define CONFIG_OPUS_MUXER 0
+#define CONFIG_PCM_ALAW_MUXER 0
+#define CONFIG_PCM_MULAW_MUXER 0
+#define CONFIG_PCM_VIDC_MUXER 0
+#define CONFIG_PCM_F64BE_MUXER 0
+#define CONFIG_PCM_F64LE_MUXER 0
+#define CONFIG_PCM_F32BE_MUXER 0
+#define CONFIG_PCM_F32LE_MUXER 0
+#define CONFIG_PCM_S32BE_MUXER 0
+#define CONFIG_PCM_S32LE_MUXER 0
+#define CONFIG_PCM_S24BE_MUXER 0
+#define CONFIG_PCM_S24LE_MUXER 0
+#define CONFIG_PCM_S16BE_MUXER 0
+#define CONFIG_PCM_S16LE_MUXER 0
+#define CONFIG_PCM_S8_MUXER 0
+#define CONFIG_PCM_U32BE_MUXER 0
+#define CONFIG_PCM_U32LE_MUXER 0
+#define CONFIG_PCM_U24BE_MUXER 0
+#define CONFIG_PCM_U24LE_MUXER 0
+#define CONFIG_PCM_U16BE_MUXER 0
+#define CONFIG_PCM_U16LE_MUXER 0
+#define CONFIG_PCM_U8_MUXER 0
+#define CONFIG_PSP_MUXER 0
+#define CONFIG_RAWVIDEO_MUXER 0
+#define CONFIG_RM_MUXER 0
+#define CONFIG_ROQ_MUXER 0
+#define CONFIG_RSO_MUXER 0
+#define CONFIG_RTP_MUXER 0
+#define CONFIG_RTP_MPEGTS_MUXER 0
+#define CONFIG_RTSP_MUXER 0
+#define CONFIG_SAP_MUXER 0
+#define CONFIG_SBC_MUXER 0
+#define CONFIG_SCC_MUXER 0
+#define CONFIG_SEGAFILM_MUXER 0
+#define CONFIG_SEGMENT_MUXER 0
+#define CONFIG_STREAM_SEGMENT_MUXER 0
+#define CONFIG_SINGLEJPEG_MUXER 0
+#define CONFIG_SMJPEG_MUXER 0
+#define CONFIG_SMOOTHSTREAMING_MUXER 0
+#define CONFIG_SOX_MUXER 0
+#define CONFIG_SPX_MUXER 0
+#define CONFIG_SPDIF_MUXER 0
+#define CONFIG_SRT_MUXER 0
+#define CONFIG_STREAMHASH_MUXER 0
+#define CONFIG_SUP_MUXER 0
+#define CONFIG_SWF_MUXER 0
+#define CONFIG_TEE_MUXER 0
+#define CONFIG_TG2_MUXER 0
+#define CONFIG_TGP_MUXER 0
+#define CONFIG_MKVTIMESTAMP_V2_MUXER 0
+#define CONFIG_TRUEHD_MUXER 0
+#define CONFIG_TTA_MUXER 0
+#define CONFIG_UNCODEDFRAMECRC_MUXER 0
+#define CONFIG_VC1_MUXER 0
+#define CONFIG_VC1T_MUXER 0
+#define CONFIG_VOC_MUXER 0
+#define CONFIG_W64_MUXER 0
+#define CONFIG_WAV_MUXER 0
+#define CONFIG_WEBM_MUXER 0
+#define CONFIG_WEBM_DASH_MANIFEST_MUXER 0
+#define CONFIG_WEBM_CHUNK_MUXER 0
+#define CONFIG_WEBP_MUXER 0
+#define CONFIG_WEBVTT_MUXER 0
+#define CONFIG_WTV_MUXER 0
+#define CONFIG_WV_MUXER 0
+#define CONFIG_YUV4MPEGPIPE_MUXER 0
+#define CONFIG_CHROMAPRINT_MUXER 0
+#define CONFIG_ASYNC_PROTOCOL 0
+#define CONFIG_BLURAY_PROTOCOL 0
+#define CONFIG_CACHE_PROTOCOL 0
+#define CONFIG_CONCAT_PROTOCOL 0
+#define CONFIG_CRYPTO_PROTOCOL 0
+#define CONFIG_DATA_PROTOCOL 0
+#define CONFIG_FFRTMPCRYPT_PROTOCOL 0
+#define CONFIG_FFRTMPHTTP_PROTOCOL 0
+#define CONFIG_FILE_PROTOCOL 0
+#define CONFIG_FTP_PROTOCOL 0
+#define CONFIG_GOPHER_PROTOCOL 0
+#define CONFIG_HLS_PROTOCOL 0
+#define CONFIG_HTTP_PROTOCOL 0
+#define CONFIG_HTTPPROXY_PROTOCOL 0
+#define CONFIG_HTTPS_PROTOCOL 0
+#define CONFIG_ICECAST_PROTOCOL 0
+#define CONFIG_MMSH_PROTOCOL 0
+#define CONFIG_MMST_PROTOCOL 0
+#define CONFIG_MD5_PROTOCOL 0
+#define CONFIG_PIPE_PROTOCOL 0
+#define CONFIG_PROMPEG_PROTOCOL 0
+#define CONFIG_RTMP_PROTOCOL 0
+#define CONFIG_RTMPE_PROTOCOL 0
+#define CONFIG_RTMPS_PROTOCOL 0
+#define CONFIG_RTMPT_PROTOCOL 0
+#define CONFIG_RTMPTE_PROTOCOL 0
+#define CONFIG_RTMPTS_PROTOCOL 0
+#define CONFIG_RTP_PROTOCOL 0
+#define CONFIG_SCTP_PROTOCOL 0
+#define CONFIG_SRTP_PROTOCOL 0
+#define CONFIG_SUBFILE_PROTOCOL 0
+#define CONFIG_TEE_PROTOCOL 0
+#define CONFIG_TCP_PROTOCOL 0
+#define CONFIG_TLS_PROTOCOL 0
+#define CONFIG_UDP_PROTOCOL 0
+#define CONFIG_UDPLITE_PROTOCOL 0
+#define CONFIG_UNIX_PROTOCOL 0
+#define CONFIG_LIBAMQP_PROTOCOL 0
+#define CONFIG_LIBRTMP_PROTOCOL 0
+#define CONFIG_LIBRTMPE_PROTOCOL 0
+#define CONFIG_LIBRTMPS_PROTOCOL 0
+#define CONFIG_LIBRTMPT_PROTOCOL 0
+#define CONFIG_LIBRTMPTE_PROTOCOL 0
+#define CONFIG_LIBSRT_PROTOCOL 0
+#define CONFIG_LIBSSH_PROTOCOL 0
+#define CONFIG_LIBSMBCLIENT_PROTOCOL 0
+#define CONFIG_LIBZMQ_PROTOCOL 0
+#endif /* FFMPEG_CONFIG_H */
diff --git a/fuchsia/config/max/x64/libavcodec/bsf_list.c b/fuchsia/config/max/x64/libavcodec/bsf_list.c
new file mode 100644
index 0000000..ee5ac8a
--- /dev/null
+++ b/fuchsia/config/max/x64/libavcodec/bsf_list.c
@@ -0,0 +1,4 @@
+static const AVBitStreamFilter * const bitstream_filters[] = {
+ &ff_null_bsf,
+ &ff_vp9_superframe_split_bsf,
+ NULL };
diff --git a/fuchsia/config/max/x64/libavcodec/codec_list.c b/fuchsia/config/max/x64/libavcodec/codec_list.c
new file mode 100644
index 0000000..97fbca7
--- /dev/null
+++ b/fuchsia/config/max/x64/libavcodec/codec_list.c
@@ -0,0 +1,29 @@
+static const AVCodec * const codec_list[] = {
+ &ff_h263_decoder,
+ &ff_h264_decoder,
+ &ff_mpeg4_decoder,
+ &ff_theora_decoder,
+ &ff_vp3_decoder,
+ &ff_vp8_decoder,
+ &ff_vp9_decoder,
+ &ff_aac_decoder,
+ &ff_aac_latm_decoder,
+ &ff_amrnb_decoder,
+ &ff_amrwb_decoder,
+ &ff_aptx_decoder,
+ &ff_flac_decoder,
+ &ff_gsm_ms_decoder,
+ &ff_mp3_decoder,
+ &ff_sbc_decoder,
+ &ff_vorbis_decoder,
+ &ff_pcm_alaw_decoder,
+ &ff_pcm_f32le_decoder,
+ &ff_pcm_mulaw_decoder,
+ &ff_pcm_s16be_decoder,
+ &ff_pcm_s16le_decoder,
+ &ff_pcm_s24be_decoder,
+ &ff_pcm_s24le_decoder,
+ &ff_pcm_s32le_decoder,
+ &ff_pcm_u8_decoder,
+ &ff_libopus_decoder,
+ NULL };
diff --git a/fuchsia/config/max/x64/libavcodec/parser_list.c b/fuchsia/config/max/x64/libavcodec/parser_list.c
new file mode 100644
index 0000000..d1cd7e0
--- /dev/null
+++ b/fuchsia/config/max/x64/libavcodec/parser_list.c
@@ -0,0 +1,15 @@
+static const AVCodecParser * const parser_list[] = {
+ &ff_aac_parser,
+ &ff_aac_latm_parser,
+ &ff_flac_parser,
+ &ff_gsm_parser,
+ &ff_h263_parser,
+ &ff_h264_parser,
+ &ff_mpeg4video_parser,
+ &ff_mpegaudio_parser,
+ &ff_opus_parser,
+ &ff_vorbis_parser,
+ &ff_vp3_parser,
+ &ff_vp8_parser,
+ &ff_vp9_parser,
+ NULL };
diff --git a/fuchsia/config/max/x64/libavformat/demuxer_list.c b/fuchsia/config/max/x64/libavformat/demuxer_list.c
new file mode 100644
index 0000000..241417e
--- /dev/null
+++ b/fuchsia/config/max/x64/libavformat/demuxer_list.c
@@ -0,0 +1,12 @@
+static const AVInputFormat * const demuxer_list[] = {
+ &ff_aac_demuxer,
+ &ff_amr_demuxer,
+ &ff_avi_demuxer,
+ &ff_flac_demuxer,
+ &ff_gsm_demuxer,
+ &ff_matroska_demuxer,
+ &ff_mov_demuxer,
+ &ff_mp3_demuxer,
+ &ff_ogg_demuxer,
+ &ff_wav_demuxer,
+ NULL };
diff --git a/fuchsia/config/max/x64/libavformat/muxer_list.c b/fuchsia/config/max/x64/libavformat/muxer_list.c
new file mode 100644
index 0000000..f36d949
--- /dev/null
+++ b/fuchsia/config/max/x64/libavformat/muxer_list.c
@@ -0,0 +1,2 @@
+static const AVOutputFormat * const muxer_list[] = {
+ NULL };
diff --git a/fuchsia/config/max/x64/libavformat/protocol_list.c b/fuchsia/config/max/x64/libavformat/protocol_list.c
new file mode 100644
index 0000000..247e1e4
--- /dev/null
+++ b/fuchsia/config/max/x64/libavformat/protocol_list.c
@@ -0,0 +1,2 @@
+static const URLProtocol * const url_protocols[] = {
+ NULL };
diff --git a/fuchsia/config/max/x64/libavutil/avconfig.h b/fuchsia/config/max/x64/libavutil/avconfig.h
new file mode 100644
index 0000000..c289fbb
--- /dev/null
+++ b/fuchsia/config/max/x64/libavutil/avconfig.h
@@ -0,0 +1,6 @@
+/* Generated by ffmpeg configure */
+#ifndef AVUTIL_AVCONFIG_H
+#define AVUTIL_AVCONFIG_H
+#define AV_HAVE_BIGENDIAN 0
+#define AV_HAVE_FAST_UNALIGNED 1
+#endif /* AVUTIL_AVCONFIG_H */
diff --git a/fuchsia/config/max/x64/libavutil/ffversion.h b/fuchsia/config/max/x64/libavutil/ffversion.h
new file mode 100644
index 0000000..fc76199
--- /dev/null
+++ b/fuchsia/config/max/x64/libavutil/ffversion.h
@@ -0,0 +1,5 @@
+/* Automatically generated by version.sh, do not manually edit! */
+#ifndef AVUTIL_FFVERSION_H
+#define AVUTIL_FFVERSION_H
+#define FFMPEG_VERSION "N-97662-gaaac2c26d9"
+#endif /* AVUTIL_FFVERSION_H */
diff --git a/fuchsia/patches/README b/fuchsia/patches/README
new file mode 100644
index 0000000..0a1c860
--- /dev/null
+++ b/fuchsia/patches/README
@@ -0,0 +1,5 @@
+This file describes changes that have not been upstreamed.
+
+libavcodec/utils.c and libavformat/utils.c were modified to suppress
+deprecation warnings. TODOs were added to remove them when ffmpeg stops using
+its own deprecated functions or adds its own suppression.
diff --git a/fuchsia/scripts/build_ffmpeg.py b/fuchsia/scripts/build_ffmpeg.py
new file mode 100755
index 0000000..145f3f9
--- /dev/null
+++ b/fuchsia/scripts/build_ffmpeg.py
@@ -0,0 +1,272 @@
+#!/usr/bin/env python
+#
+# Copyright 2017 The Fuchsia Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+from __future__ import print_function
+
+import collections
+import multiprocessing
+import optparse
+import os
+import platform
+import re
+import shutil
+import subprocess
+import sys
+
+
+SCRIPTS_DIR = os.path.abspath(os.path.dirname(__file__))
+FFMPEG_DIR = os.path.abspath(os.path.join(SCRIPTS_DIR, '..', '..'))
+FUCHSIA_DIR = os.path.abspath(os.path.join(FFMPEG_DIR, '..', '..'))
+
+
+# These profiles select different levels of format support. The 'default'
+# profile includes only a few unencumbered formats, essentially those supported
+# by Chromium. The 'max' profile includes most of the formats that ffmpeg
+# supports. Some formats (e.g. Opus) aren't included, because more development
+# is required to support them.
+PROFILES = [
+ 'default',
+ 'max',
+]
+
+
+USAGE = """Usage: %prog [x64|arm64] [options] -- [configure_args]
+
+Resulting binaries will be placed in:
+ build.[x64|arm64]/default/out/
+ build.[x64|arm64]/max/out/
+ """
+
+
+def PrintAndCheckCall(argv, *args, **kwargs):
+ print('Running %s' % '\n '.join(argv))
+ subprocess.check_call(argv, *args, **kwargs)
+
+
+def GetDsoName(dso_name, dso_version):
+ return 'lib%s.so.%s' % (dso_name, dso_version)
+
+
+def RewriteFile(path, search, replace):
+ with open(path) as f:
+ contents = f.read()
+ with open(path, 'w') as f:
+ f.write(re.sub(search, replace, contents))
+
+
+def BuildFFmpeg(target_arch, parallel_jobs, config_only, profile,
+ configure_flags):
+ config_dir = 'build.%s/%s' % (target_arch, profile)
+ shutil.rmtree(config_dir, ignore_errors=True)
+ os.makedirs(os.path.join(config_dir, 'out'))
+
+ PrintAndCheckCall(
+ [os.path.join(FFMPEG_DIR, 'configure')] + configure_flags, cwd=config_dir)
+
+ RewriteFile(
+ os.path.join(config_dir, 'config.h'),
+ r'(#define HAVE_SYSCTL [01])',
+ (r'#define HAVE_SYSCTL 0'))
+
+ RewriteFile(
+ os.path.join(config_dir, 'config.h'),
+ r'(#define HAVE_AS_FUNC [01])',
+ (r'#define HAVE_AS_FUNC 0'))
+
+ RewriteFile(
+ os.path.join(config_dir, 'config.h'),
+ r'(#define HAVE_VALGRIND_VALGRIND_H [01])',
+ (r'#define HAVE_VALGRIND_VALGRIND_H 0'))
+
+ if config_only:
+ print('Skipping build step as requested.')
+ else:
+ libraries = [
+ os.path.join('libavcodec', GetDsoName('avcodec', 58)),
+ os.path.join('libavformat', GetDsoName('avformat', 58)),
+ os.path.join('libavutil', GetDsoName('avutil', 56)),
+ ]
+ PrintAndCheckCall(
+ ['make', '-j%d' % parallel_jobs] + libraries, cwd=config_dir)
+ for lib in libraries:
+ shutil.copy(os.path.join(config_dir, lib),
+ os.path.join(config_dir, 'out'))
+
+ if target_arch in ('arm64'):
+ RewriteFile(
+ os.path.join(config_dir, 'config.h'),
+ r'(#define HAVE_VFP_ARGS [01])',
+ (r'/* \1 -- softfp/hardfp selection is done by the fuchsia build */'))
+
+
+def main(argv):
+ parser = optparse.OptionParser(usage=USAGE)
+ parser.add_option('--profile', action='append', dest='profiles',
+ choices=PROFILES,
+ help='Profile to build; determines e.g. supported codecs')
+ parser.add_option('--config-only', action='store_true',
+ help='Skip the build step.')
+ options, args = parser.parse_args(argv)
+
+ if len(args) == 0:
+ parser.print_help()
+ return 1
+
+ target_arch = args[0]
+ configure_args = args[1:]
+
+ parallel_jobs = multiprocessing.cpu_count()
+
+ print('System information:\n'
+ 'Target arch : %s\n'
+ 'Parallel jobs : %d\n' % (target_arch, parallel_jobs))
+
+ configure_flags = collections.defaultdict(list)
+
+ # Common configuration. Note: --disable-everything does not in fact disable
+ # everything, just non-library components such as decoders and demuxers.
+ #TODO(dalesat): Consider --enable-libopus, --enable-decoder=libopus
+ configure_flags['Common'].extend([
+ '--disable-everything',
+ '--disable-all',
+ '--disable-doc',
+ '--disable-htmlpages',
+ '--disable-manpages',
+ '--disable-podpages',
+ '--disable-txtpages',
+ '--disable-static',
+ '--enable-avcodec',
+ '--enable-avformat',
+ '--enable-avutil',
+ '--enable-fft',
+ '--enable-rdft',
+ '--enable-static',
+ '--enable-libopus',
+ # Disable features.
+ '--disable-debug',
+ '--disable-bzlib',
+ '--disable-iconv',
+ '--disable-lzo',
+ '--disable-network',
+ '--disable-schannel',
+ '--disable-sdl2',
+ '--disable-symver',
+ '--disable-xlib',
+ '--disable-zlib',
+ '--disable-securetransport',
+ '--disable-faan',
+ '--disable-alsa',
+
+ # Disable automatically detected external libraries. This prevents
+ # automatic inclusion of things like hardware decoders. Each roll should
+ # audit new [autodetect] configure options and add any desired options to
+ # this file.
+ '--disable-autodetect',
+
+ # Common codecs.
+ '--enable-decoder=vorbis,libopus,flac',
+ '--enable-decoder=pcm_u8,pcm_s16le,pcm_s24le,pcm_s32le,pcm_f32le,mp3',
+ '--enable-decoder=pcm_s16be,pcm_s24be,pcm_mulaw,pcm_alaw',
+ '--enable-decoder=theora,vp8,sbc,aptx',
+ '--enable-demuxer=ogg,matroska,wav,flac,mp3,mov',
+ '--enable-parser=opus,vorbis,flac,mpegaudio',
+ # Setup include path so Fuchsia's libopus can be used.
+ '--extra-cflags=-I' + os.path.join(FUCHSIA_DIR,
+ 'third_party/opus/include'),
+ '--enable-parser=vp3,vp8',
+
+ '--optflags="-O2"',
+ '--enable-pic',
+
+ # Force usage of yasm
+ '--x86asmexe=yasm',
+ ])
+
+ configure_flags['Common'].extend([
+ '--enable-pic',
+ '--enable-lto',
+ '--cc=clang',
+ '--cxx=clang++',
+ '--ld=clang',
+ ])
+
+
+ # TODO(dalesat): determine if we can use --enable-lto in x64
+ # TODO(dalesat): enable vp9 on arm64
+
+ if target_arch == 'x64':
+ configure_flags['Common'].extend([
+ '--enable-decoder=vp9',
+ '--enable-parser=vp9',
+ '--sysroot=' + os.path.join(
+ FFMPEG_DIR, '..', '..', 'prebuilt', 'third_party', 'sysroot', 'linux'),
+ '--extra-ldflags=-fuse-ld=lld',
+ ])
+ elif target_arch == 'arm64':
+ configure_flags['Common'].extend([
+ '--enable-cross-compile',
+ '--cross-prefix=/usr/bin/x86_64-linux-gnu-',
+ '--target-os=linux',
+ '--arch=aarch64',
+ '--enable-armv8',
+ '--extra-cflags=-march=armv8-a',
+ '--sysroot=' + os.path.join(
+ FFMPEG_DIR, '..', '..', 'prebuilt', 'third_party', 'sysroot', 'linux'),
+ '--extra-cflags=--target=aarch64-linux-gnu',
+ '--extra-ldflags=--target=aarch64-linux-gnu',
+ '--disable-linux-perf',
+ ])
+ else:
+ print('Error: Unknown target arch %r!' % (target_arch), file=sys.stderr)
+ return 1
+
+ configure_flags['default'].extend([
+ # max enables MPEG4 which requires error resilience :(
+ '--disable-error-resilience',
+ ])
+
+ configure_flags['max'].extend([
+ '--enable-decoder=aac,aac_latm,h264,mp3',
+ '--enable-demuxer=aac,mp3,mov',
+ '--enable-parser=aac,aac_latm,h264,mpegaudio',
+ # Enable playing avi files.
+ '--enable-decoder=mpeg4',
+ '--enable-parser=h263,mpeg4video',
+ '--enable-demuxer=avi',
+ # Enable playing Android 3gp files.
+ '--enable-demuxer=amr',
+ '--enable-decoder=amrnb,amrwb',
+ # Wav files for playing phone messages.
+ '--enable-decoder=gsm_ms',
+ '--enable-demuxer=gsm',
+ '--enable-parser=gsm',
+ ])
+
+ def do_build_ffmpeg(profile, configure_flags):
+ if options.profiles and profile not in options.profiles:
+ print('%s skipped' % profile)
+ return
+
+ print('%s configure/build:' % profile)
+ BuildFFmpeg(target_arch, parallel_jobs,
+ options.config_only, profile, configure_flags)
+
+ do_build_ffmpeg('default',
+ configure_flags['Common'] +
+ configure_flags['default'] +
+ configure_args)
+ do_build_ffmpeg('max',
+ configure_flags['Common'] +
+ configure_flags['max'] +
+ configure_args)
+
+ print('Done. If desired you may copy config.h/config.asm into the '
+ 'source/config tree using copy_config.sh.')
+ return 0
+
+
+if __name__ == '__main__':
+ sys.exit(main(sys.argv[1:]))
diff --git a/fuchsia/scripts/copy_config.sh b/fuchsia/scripts/copy_config.sh
new file mode 100755
index 0000000..f8c01d3
--- /dev/null
+++ b/fuchsia/scripts/copy_config.sh
@@ -0,0 +1,24 @@
+#!/bin/bash -e
+
+# Copyright (c) 2017 The Fuchsia Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# Use this to copy all config files into the tree.
+for profile in default max; do
+ # Copy config files for the architectures:
+ # - x64 has config.asm, config.h
+ # - arm64 has config.h
+ for arch in x64 arm64; do
+ # Don't waste time on non-existent configs, if no config.h then skip.
+ [ ! -e "build.$arch/$profile/config.h" ] && continue
+ for f in config.h config.asm libavutil/avconfig.h libavutil/ffversion.h libavcodec/bsf_list.c libavcodec/codec_list.c libavcodec/parser_list.c libavformat/demuxer_list.c libavformat/muxer_list.c libavformat/protocol_list.c; do
+ FROM="build.$arch/$profile/$f"
+ TO="fuchsia/config/$profile/$arch/$f"
+ if [ "$(dirname $f)" != "" ]; then mkdir -p $(dirname $TO); fi
+ [ -e $FROM ] && cp -v $FROM $TO
+ done
+ done
+done
+
+echo "Copied all existing newer configs successfully."
diff --git a/fuchsia/scripts/credits_updater.py b/fuchsia/scripts/credits_updater.py
new file mode 100644
index 0000000..fc041e9
--- /dev/null
+++ b/fuchsia/scripts/credits_updater.py
@@ -0,0 +1,358 @@
+#!/usr/bin/python
+#
+# Copyright 2017 The Fuchsia Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Updates the CREDITS.fuchsia file for ffmpeg.
+
+The structure of the output credits file is:
+- FFmpeg LICENSE.md verbatim
+- A few verbatim license headers from files that didn't match typical FFmpeg
+- The entire text of the LGPL
+
+The vast majority of files are covered by the LGPL text, described by the
+common FFmpeg header ("This file is part of FFmpeg...").
+
+The few exceptions are cases where the FFmpeg header has been modified, or
+where the file has historically had another license (e.g MIPS, JPEG, BSD) and
+was pulled into FFmpeg from another project. In some cases there are many files
+that share the exact same non-LGPL license text. These are bucketed together
+(see KNOWN_FILE_BUCKETS) to de-dup their license in the output file.
+
+Change to the licensing text for bucketed files are automatically caught by
+comparing the md5 digest to a previously recorded digest in the
+KNOWN_FILE_BUCKETS table. Changes are generally not expected, but should
+prompt manual inspection of the difference and possibly an update to the
+license text for that bucket.
+"""
+
+import collections
+import difflib
+from enum import enum
+import hashlib
+import os
+import re
+
+# Name of the LICENSE.md file from upstream FFmpeg. This file should be kept in
+# perfect sync w/ upstream at each merge.
+UPSTREAM_LICENSEMD = 'LICENSE.md'
+
+# Default name of the output file generated by CreditsUpdater.WriteCredits. This
+# name must match the "License file: " in README.fuchsia.
+DEFAULT_OUTPUT_FILE = 'CREDITS.fuchsia'
+
+# Minimum similarity threshold to consider a comment header LGPL when compared
+# against FFMPEG_LGPL_REF.
+LGPL_MATCH_THRESHOLD = .9
+
+# Regular expressions for finding license header comments.
+C_COMMENT_BLOCK_START = re.compile('/\*+')
+C_COMMENT_BLOCK_MID = re.compile('^ *\* *')
+C_COMMENT_BLOCK_END = re.compile('\*/')
+ASM_COMMENT_PRE = re.compile('^(;\**|@)')
+ASM_NOT_COMMENT = re.compile('^[^;@]')
+FFMPEG_HEADER_START = re.compile(' *This file is part of FFmpeg')
+
+LICENSE_SEPARATOR = '\n\n' + ('*' * 80) + '\n\n'
+FFMPEG_LGPL_REF = '''
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */'''
+
+# Known licenses
+License = enum('LGPL', 'MIPS', 'JPEG', 'OGG_MA_MR_2005')
+
+# Tuple describing license and similarity to the FFmpeg LGPL reference for a
+# given file. See KNOWN_FILE_BUCKETS.
+FileInfo = collections.namedtuple('FileInfo', 'license, license_digest')
+
+# Most files in FFmpeg are LGPL, but there are a few exceptions that are worth
+# bucketing together to avoid redundant license texts. The hex values are
+# digests of the comment header, used to detect changes in the unlikely event
+# that their license texts are altered. Any changes will require manual review
+# to decide whether the to update the bucketing.
+KNOWN_FILE_BUCKETS = [
+ # Files that are LGPL but just miss the similarity cutoff.
+ ['libavcodec/codec_desc.c', License.LGPL, '091f9c6d1efc62038e516f5c67263962'],
+ # Files with MIPS license.
+ ['libavcodec/mdct_fixed_32.c', License.MIPS, '179c17c9dab77f95dc6540709b5fb8cd'],
+ ['libavcodec/fft_fixed_32.c', License.MIPS, '179c17c9dab77f95dc6540709b5fb8cd'],
+ ['libavcodec/fft_init_table.c', License.MIPS, '179c17c9dab77f95dc6540709b5fb8cd'],
+ ['libavcodec/mips/aacdec_mips.c', License.MIPS, 'a08afe43d908fe6625603d0cbc95da46'],
+ ['libavcodec/mips/sbrdsp_mips.c', License.MIPS, 'c34ece06ebe27e5a7611ef362962b048'],
+ ['libavcodec/mips/aacpsdsp_mips.c', License.MIPS, 'a08afe43d908fe6625603d0cbc95da46'],
+ ['libavutil/mips/float_dsp_mips.c', License.MIPS, 'fb9f51968ec8289768547144b920cf79'],
+ ['libavcodec/mips/aacsbr_mips.c', License.MIPS, '82c53533b2576fe5d2c04880a46595f2'],
+ ['libavutil/fixed_dsp.c', License.MIPS, '7a521412ac91287b3e1026885f6bd56f'],
+ ['libavcodec/mips/aacdec_mips.h', License.MIPS, 'c34ece06ebe27e5a7611ef362962b048'],
+ ['libavcodec/mips/lsp_mips.h', License.MIPS, 'eef419f576f738e66ca3bfc975a37996'],
+ ['libavcodec/mips/aacsbr_mips.h', License.MIPS, '82c53533b2576fe5d2c04880a46595f2'],
+ ['libavutil/mips/libm_mips.h', License.MIPS, '4b408982f2aa83fac9c020c61853bdae'],
+ ['libavcodec/mips/amrwbdec_mips.h', License.MIPS, '4b408982f2aa83fac9c020c61853bdae'],
+ ['libavcodec/fft_table.h', License.MIPS, '179c17c9dab77f95dc6540709b5fb8cd'],
+ ['libavcodec/mips/compute_antialias_float.h', License.MIPS, 'a7ff7e3157e3726cba79e022628d3b93'],
+ ['libavcodec/mips/compute_antialias_fixed.h', License.MIPS, '97e366b4c71ad5ceca991d89044c414d'],
+ ['libavutil/softfloat_tables.h', License.MIPS, 'de3e5c962caa5c8249bef3085ef36bc8'],
+ ['libavutil/fixed_dsp.h', License.MIPS, '4b408982f2aa83fac9c020c61853bdae'],
+ # Files with JPEG Group license.
+ ['libavcodec/jfdctint_template.c', License.JPEG, 'd80cfd2e439eb700aed0f5bc44fef9b5'],
+ ['libavcodec/jfdctfst.c', License.JPEG, '7dcfa68ad9c8fd940fb404ee3242e03f'],
+ ['libavcodec/jrevdct.c', License.JPEG, 'a9b8f5dcb74fa76a72069306b841b042'],
+ # Files written by Ahlberg and RullgAYrd for parsing Ogg (MIT/X11 license).
+ ['libavformat/oggparseogm.c', License.OGG_MA_MR_2005, 'ee65196bafec5d8e871e64bb739bdc79'],
+ ['libavformat/oggdec.c', License.OGG_MA_MR_2005, '43ed5da1268cb2f104095c79410fd394'],
+ ['libavformat/oggdec.h', License.OGG_MA_MR_2005, 'ee65196bafec5d8e871e64bb739bdc79'],
+ ['libavformat/oggparsevorbis.c', License.OGG_MA_MR_2005, '6c432580b4486564e43cd538370e3dbc'],
+]
+
+# Path describing 'license_texts' folder as a sibling of this script's location.
+LICENSE_FOLDER = os.path.join(
+ os.path.dirname(os.path.abspath(__file__)), 'license_texts')
+
+# Files containing license text to be used for the known license buckets. These
+# files should all live in LICENSE_FOLDER.
+LICENSE_TEXTS = {
+ License.MIPS: os.path.join(LICENSE_FOLDER, 'mips.txt'),
+ License.JPEG: os.path.join(LICENSE_FOLDER, 'jpeg.txt'),
+ License.LGPL: os.path.join(LICENSE_FOLDER, 'full_lgpl.txt'),
+ License.OGG_MA_MR_2005: os.path.join(LICENSE_FOLDER,
+ 'oggparse_ahlberg_rullgayrd_2005.txt'),
+}
+
+
+class CreditsUpdater(object):
+ """CreditsUpdater parses license headers for files supplied via ProcessFile.
+ The parsed headers are stored for generating the FFmpeg credits file
+ (LICENSE.md) upon calling OutputCredits."""
+
+ def __init__(self, source_dir, output_file=DEFAULT_OUTPUT_FILE):
+ """ Creates a CreditsUpdater
+ Args:
+ source_dir: Root of ffmpeg sources; where LICENSE.md is found and where
+ the generated DEFAULT_OUTPUT_FILE will be written.
+ output_file: (Optional) Name of the file to write the credits to. File
+ will live in source_dir.
+ """
+ self.source_dir = source_dir
+ self.output_file = output_file
+ # Files where we failed to find any license header. Any entry in this list
+ # will block updating credits until the parsing code is amended to work for
+ # the difficult files.
+ self.difficult_files = []
+ # Map storing processed files that belong to KNOWN_FILE_BUCKETS.
+ # Key: LICENSE, Value: List of files with the known license.
+ self.known_credits = collections.defaultdict(list)
+ # Map storing processed files that do not belong to any known bucket. These
+ # files will have their license printed verbatim.
+ # Key: file path, Value: license text
+ self.generated_credits = collections.defaultdict(list)
+ # Convert the "buckets" above into a map.
+ self.known_file_map = {}
+ for item in KNOWN_FILE_BUCKETS:
+ self.known_file_map[os.path.join(item[0])] = FileInfo(item[1], item[2])
+
+ def ProcessFile(self, file_path):
+ """ Process the file updating credits.
+ Args:
+ file_path: Path to file to process. Path can be absolute or relative, but
+ should be a descendant of source_dir provided to constructor.
+ """
+ if not os.path.isabs(file_path):
+ file_path = os.path.abspath(os.path.join(self.source_dir, file_path))
+
+ comment_lines = ExtractFirstCommentBlock(file_path)
+ if not comment_lines:
+ self.difficult_files.append(file_path)
+ return
+
+ # Try to pull out customizations in first few lines of license header before
+ # "This file is part of FFmpeg." Failing to normalize indicates either a
+ # totally different header or a header with significant alterations.
+ normalized_lines = NormalizeCommentLines(comment_lines)
+ if normalized_lines:
+ sim_ratio = (
+ difflib.SequenceMatcher(
+ None, ConcatLines(normalized_lines),
+ FFMPEG_LGPL_REF).ratio())
+
+ # File is a close match to typical LGPL case.
+ if sim_ratio >= LGPL_MATCH_THRESHOLD:
+ self.known_credits[License.LGPL].append(file_path)
+ # File matches some LGPL, but has significant differences.
+ else:
+ self.HandleNonLGPLFile(comment_lines, file_path)
+ # File does not contain FFmpeg LGPL header in any form.
+ else:
+ self.HandleNonLGPLFile(comment_lines, file_path)
+
+ def HandleNonLGPLFile(self, comment_lines, file_path):
+ # Make file_path relative to FFmpeg directory to lookup self.known_file_map.
+ rel_file_path = os.path.relpath(file_path, os.path.abspath(self.source_dir))
+
+ # Many non-LGPL files fall into known groups (e.g. MIPS). We bucket these
+ # together to avoid repeating the same license text in the credits.
+ if rel_file_path in self.known_file_map:
+ hasher = hashlib.md5()
+ hasher.update(ConcatLines(comment_lines))
+
+ # Detect changes to file's licensing header.
+ file_license_info = self.known_file_map[rel_file_path]
+ if hasher.hexdigest() != file_license_info.license_digest:
+ exit('File %(file_path)s header has changed (was: %(old_digest)s '
+ 'now: %(new_digest)s). Inspect the header and update the '
+ 'exceptions table to continue generating credits.'
+ % {'file_path': rel_file_path,
+ 'old_digest': file_license_info.license_digest,
+ 'new_digest': hasher.hexdigest()})
+ # Store known files in a list for printing.
+ self.known_credits[file_license_info.license].append(rel_file_path)
+ else:
+ # This file does have a known bucket. We'll print its license verbatim.
+ self.generated_credits[rel_file_path] = ConcatLines(comment_lines).strip()
+
+ def PrintStats(self):
+ num_known_credits = 0
+ for license_bucket in self.known_credits:
+ num_known_credits += len(self.known_credits[license_bucket])
+ print 'CreditsUpdater stats:'
+ print '\t%s files w/ known_credits' % num_known_credits
+ print '\t%s generated_credits' % len(self.generated_credits.keys())
+ print '\t%s difficult_files files' % len(self.difficult_files)
+
+ def WriteCredits(self):
+ if self.difficult_files:
+ # After taking a closer look, enhance this tool to work for these or
+ # add them to the white-list if they truly have no licensing header.
+ print 'Failed to find license header for these files:'
+ for filename in self.difficult_files:
+ print filename
+ exit('Update script to work for these to continue generating credits')
+
+ output_path = os.path.join(self.source_dir, self.output_file)
+ licence_md_path = os.path.join(self.source_dir, UPSTREAM_LICENSEMD)
+ with open(output_path, 'w') as open_output:
+ # Always write the FFmpeg overview (LICENSE.md) first.
+ with open(licence_md_path) as open_license_md:
+ open_output.writelines(open_license_md.readlines())
+
+ # Next write verbatim headers from the generated credits map.
+ for filename, file_license in self.generated_credits.iteritems():
+ open_output.writelines(LICENSE_SEPARATOR)
+ open_output.writelines('%s\n\n%s' % (filename, file_license))
+
+ # Write the known licenses, ending with LGPL.
+ for known_license in sorted(self.known_credits.keys()):
+ # Skip LGPL for now. We print it at the end.
+ if known_license is License.LGPL:
+ continue
+
+ file_list = sorted(self.known_credits[known_license])
+ with open(LICENSE_TEXTS[known_license]) as license_text:
+ open_output.writelines(LICENSE_SEPARATOR)
+ open_output.writelines('\n'.join(file_list) + '\n\n')
+ open_output.writelines(license_text.readlines())
+
+ # Finally, write full text of LGPL
+ with open(LICENSE_TEXTS[License.LGPL]) as lgpl_text:
+ open_output.writelines(LICENSE_SEPARATOR)
+ open_output.writelines(lgpl_text.readlines())
+
+
+def ConcatLines(lines):
+ return ''.join(lines)
+
+
+def NormalizeCommentLines(comment_lines):
+ # Copy to leave orig const.
+ comment_lines = list(comment_lines)
+
+ # Find start of ffmpeg lgpl header.
+ line_index = 0
+ for line in comment_lines:
+ if (FFMPEG_HEADER_START.search(line)):
+ break
+ line_index += 1
+
+ if line_index == len(comment_lines):
+ # print "Failed to find start of ffmpeg header"
+ return None
+
+ # Typically just a few lines for copyright and file description. More
+ # than 20 to the start hints that this may not be the typical lgpl header.
+ if line_index > 20:
+ # print "Header start too far from the top of comment"
+ return None
+
+ # Pull out stuff before header start.
+ comment_lines = comment_lines[line_index: len(comment_lines)]
+ return comment_lines
+
+
+def ExtractFirstCommentBlock(file_path):
+ lines = []
+ found_comment_start = False
+ found_comment_end = False
+ is_asm = file_path.endswith('.asm')
+
+ with open(file_path) as open_file:
+ # .S files generally have C style block comments, but a handful have a
+ # special single-line comment prefixed with '@'. Check a few lines to figure
+ # out which case we're dealing with.
+ if file_path.endswith('.S'):
+ first_line = open_file.readline()
+ if ASM_COMMENT_PRE.search(first_line):
+ is_asm = True
+ open_file.seek(0)
+
+ if is_asm:
+ comment_start_re = ASM_COMMENT_PRE
+ comment_end_re = ASM_NOT_COMMENT
+ else:
+ comment_start_re = C_COMMENT_BLOCK_START
+ comment_end_re = C_COMMENT_BLOCK_END
+
+ for _ in xrange(0, 100):
+ line = open_file.readline()
+ found_comment_start = (found_comment_start or
+ comment_start_re.search(line))
+ if not found_comment_start:
+ continue
+
+ lines.append(line)
+ if comment_end_re.search(line):
+ found_comment_end = True
+ break
+
+ if not (found_comment_start and found_comment_end):
+ return None
+
+ StripCommentChars(lines, is_asm)
+ return lines
+
+
+def StripCommentChars(comment_lines, is_asm=False):
+ if is_asm:
+ for i in xrange(len(comment_lines)):
+ comment_lines[i] = re.sub(ASM_COMMENT_PRE, '', comment_lines[i])
+ else:
+ # Strip off the start slash-star
+ comment_lines[0] = re.sub(C_COMMENT_BLOCK_START, '', comment_lines[0])
+ # Strip off the comment end star-slash
+ comment_lines[-1] = re.sub(C_COMMENT_BLOCK_END, '', comment_lines[-1])
+ # Strip off the comment star for middle lines
+ for i in xrange(1, len(comment_lines)):
+ comment_lines[i] = re.sub(C_COMMENT_BLOCK_MID, '', comment_lines[i])
diff --git a/fuchsia/scripts/credits_updater.pyc b/fuchsia/scripts/credits_updater.pyc
new file mode 100644
index 0000000..c0bbe80
--- /dev/null
+++ b/fuchsia/scripts/credits_updater.pyc
Binary files differ
diff --git a/fuchsia/scripts/enum.py b/fuchsia/scripts/enum.py
new file mode 100644
index 0000000..c803bb5
--- /dev/null
+++ b/fuchsia/scripts/enum.py
@@ -0,0 +1,6 @@
+import collections
+
+# Python has enums now, but Goobuntu machines seem to run very old python. From:
+# http://stackoverflow.com/questions/36932/how-can-i-represent-an-enum-in-python
+def enum(*keys):
+ return collections.namedtuple('Enum', keys)(*keys)
diff --git a/fuchsia/scripts/enum.pyc b/fuchsia/scripts/enum.pyc
new file mode 100644
index 0000000..ffb1bc9
--- /dev/null
+++ b/fuchsia/scripts/enum.pyc
Binary files differ
diff --git a/fuchsia/scripts/generate_gn.py b/fuchsia/scripts/generate_gn.py
new file mode 100755
index 0000000..27f474e
--- /dev/null
+++ b/fuchsia/scripts/generate_gn.py
@@ -0,0 +1,732 @@
+#!/usr/bin/python
+#
+# Copyright (c) 2017 The Fuchsia Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Creates a GN include file for building FFmpeg from source.
+
+The way this works is a bit silly but it's easier than reverse engineering
+FFmpeg's configure scripts and Makefiles and manually maintaining fuchsia
+build files. It scans through build directories for object files then does a
+reverse lookup against the FFmpeg source tree to find the corresponding C or
+assembly file.
+
+Running build_ffmpeg.py for all (both) architectures is required prior to
+running this script.
+
+Once you've built all architectures you may run this script.
+"""
+
+import collections
+import copy
+import datetime
+from enum import enum
+import fnmatch
+import credits_updater
+import itertools
+import optparse
+import os
+import re
+import shutil
+import string
+import subprocess
+import sys
+
+COPYRIGHT = """# Copyright %d The Fuchsia Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# NOTE: this file is autogenerated by ffmpeg/fuchsia/scripts/generate_gn.py
+
+""" % (datetime.datetime.now().year)
+
+GN_HEADER = """import("//build/config/arm.gni")
+import("ffmpeg_options.gni")
+
+# Declare empty versions of each variable for easier +=ing later.
+ffmpeg_c_sources = []
+ffmpeg_gas_sources = []
+ffmpeg_yasm_sources = []
+
+"""
+GN_CONDITION_BEGIN = """if (%s) {
+"""
+GN_CONDITION_END = """}
+
+"""
+GN_C_SOURCES_BEGIN = """ffmpeg_c_sources += [
+"""
+GN_GAS_SOURCES_BEGIN = """ffmpeg_gas_sources += [
+"""
+GN_YASM_SOURCES_BEGIN = """ffmpeg_yasm_sources += [
+"""
+GN_SOURCE_ITEM = """ "%s",
+"""
+GN_SOURCE_END = """]
+"""
+
+# Controls conditional stanza generation.
+Attr = enum('ARCHITECTURE', 'PROFILE')
+SUPPORT_MATRIX = {
+ Attr.ARCHITECTURE: set(['x64', 'arm64']),
+ Attr.PROFILE: set(['default', 'max']),
+}
+
+
+def NormalizeFilename(name):
+ """Removes leading path separators in an attempt to normalize paths."""
+ return string.lstrip(name, os.sep)
+
+
+def CleanObjectFiles(object_files):
+ """Removes unneeded object files due to linker errors, binary size, etc...
+
+ Args:
+ object_files: List of object files that needs cleaning.
+ """
+ blacklist = [
+ 'libavcodec/inverse.o', # Includes libavutil/inverse.c
+ 'libavcodec/file_open.o', # Includes libavutil/file_open.c
+ 'libavcodec/log2_tab.o', # Includes libavutil/log2_tab.c
+ 'libavformat/golomb_tab.o', # Includes libavcodec/golomb.c
+ 'libavformat/log2_tab.o', # Includes libavutil/log2_tab.c
+ 'libavformat/file_open.o', # Includes libavutil/file_open.c
+
+ # The following files are removed to trim down on binary size.
+ # TODO(ihf): Warning, it is *easy* right now to remove more files
+ # than is healthy and end up with a library that the linker does
+ # not complain about but that can't be loaded. Add some verification!
+ 'libavcodec/audioconvert.o',
+ 'libavcodec/resample.o',
+ 'libavcodec/resample2.o',
+ 'libavcodec/x86/dnxhd_mmx.o',
+ 'libavformat/sdp.o',
+ 'libavutil/adler32.o',
+ 'libavutil/audio_fifo.o',
+ 'libavutil/blowfish.o',
+ 'libavutil/cast5.o',
+ 'libavutil/des.o',
+ 'libavutil/file.o',
+ 'libavutil/hash.o',
+ 'libavutil/hmac.o',
+ 'libavutil/lls.o',
+ 'libavutil/murmur3.o',
+ 'libavutil/rc4.o',
+ 'libavutil/ripemd.o',
+ 'libavutil/sha512.o',
+ 'libavutil/tree.o',
+ 'libavutil/xtea.o',
+ 'libavutil/xga_font_data.o',
+ ]
+ for name in blacklist:
+ name = name.replace('/', os.sep)
+ if name in object_files:
+ object_files.remove(name)
+ return object_files
+
+
+def IsAssemblyFile(f):
+ _, ext = os.path.splitext(f)
+ return ext in ['.S', '.asm']
+
+
+def IsGasFile(f):
+ _, ext = os.path.splitext(f)
+ return ext in ['.S']
+
+
+def IsYasmFile(f):
+ _, ext = os.path.splitext(f)
+ return ext in ['.asm']
+
+
+def IsCFile(f):
+ _, ext = os.path.splitext(f)
+ return ext in ['.c']
+
+
+def IsSourceFile(f):
+ return IsAssemblyFile(f) or IsCFile(f)
+
+
+def GetSourceFiles(source_dir):
+ """Returns a list of source files for the given source directory.
+
+ Args:
+ source_dir: Path to build a source mapping for.
+
+ Returns:
+ A python list of source file paths.
+ """
+
+ def IsSourceDir(d):
+ return d != '.git'
+
+ source_files = []
+ for root, dirs, files in os.walk(source_dir):
+ dirs = filter(IsSourceDir, dirs)
+ files = filter(IsSourceFile, files)
+
+ # Strip leading source_dir from root.
+ root = root[len(source_dir):]
+ source_files.extend([NormalizeFilename(os.path.join(root, name)) for name in
+ files])
+ return source_files
+
+
+def GetObjectFiles(build_dir):
+ """Returns a list of object files for the given build directory.
+
+ Args:
+ build_dir: Path to build an object file list for.
+
+ Returns:
+ A python list of object files paths.
+ """
+ object_files = []
+ for root, _, files in os.walk(build_dir):
+ # Strip leading build_dir from root.
+ root = root[len(build_dir):]
+
+ for name in files:
+ _, ext = os.path.splitext(name)
+ if ext == '.o':
+ name = NormalizeFilename(os.path.join(root, name))
+ object_files.append(name)
+ CleanObjectFiles(object_files)
+ return object_files
+
+
+def GetObjectToSourceMapping(source_files):
+ """Returns a map of object file paths to source file paths.
+
+ Args:
+ source_files: List of source file paths.
+
+ Returns:
+ Map with object file paths as keys and source file paths as values.
+ """
+ object_to_sources = {}
+ for name in source_files:
+ basename, _ = os.path.splitext(name)
+ key = basename + '.o'
+ object_to_sources[key] = name
+ return object_to_sources
+
+
+def GetSourceFileSet(object_to_sources, object_files):
+ """Determines set of source files given object files.
+
+ Args:
+ object_to_sources: A dictionary of object to source file paths.
+ object_files: A list of object file paths.
+
+ Returns:
+ A python set of source files required to build said objects.
+ """
+ source_set = set()
+ for name in object_files:
+ # Intentially raise a KeyError if lookup fails since something is messed
+ # up with our source and object lists.
+ source_set.add(object_to_sources[name])
+ return source_set
+
+SourceListCondition = collections.namedtuple('SourceListCondition',
+ [Attr.ARCHITECTURE,
+ Attr.PROFILE])
+
+
+class SourceSet(object):
+ """A SourceSet represents a set of source files that are built on each of the
+ given set of SourceListConditions.
+ """
+
+ def __init__(self, sources, conditions):
+ """Creates a SourceSet.
+
+ Args:
+ sources: a python set of source files
+ conditions: a python set of SourceListConditions where the given sources
+ are to be used.
+ """
+ self.sources = sources
+ self.conditions = conditions
+
+ def __repr__(self):
+ return '{%s, %s}' % (self.sources, self.conditions)
+
+ def __eq__(self, other):
+ return (self.sources == other.sources and
+ self.conditions == other.conditions)
+
+ def __hash__(self):
+ return hash((frozenset(self.sources), frozenset(self.conditions)))
+
+ def Intersect(self, other):
+ """Return a new SourceSet containing the set of source files common to both
+ this and the other SourceSet.
+
+ The resulting SourceSet represents the union of the architectures and
+ profiles of this and the other SourceSet.
+ """
+ return SourceSet(self.sources & other.sources,
+ self.conditions | other.conditions)
+
+ def Difference(self, other):
+ """Return a new SourceSet containing the set of source files not present in
+ the other SourceSet.
+
+ The resulting SourceSet represents the intersection of the
+ SourceListConditions from this and the other SourceSet.
+ """
+ return SourceSet(self.sources - other.sources,
+ self.conditions & other.conditions)
+
+ def IsEmpty(self):
+ """An empty SourceSet is defined as containing no source files or no
+ conditions (i.e., a set of files that aren't built on anywhere).
+ """
+ return (len(self.sources) == 0 or len(self.conditions) == 0)
+
+ def GenerateGnStanza(self):
+ """Generates a gn conditional stanza representing this source set.
+ """
+
+ conjunctions = []
+ for condition in self.conditions:
+ if condition.ARCHITECTURE == '*':
+ arch_condition = None
+ else:
+ arch_condition = 'current_cpu == "%s"' % condition.ARCHITECTURE
+
+ # Profile conditions look like:
+ # profile == "default"
+ if condition.PROFILE == '*':
+ profile_condition = None
+ else:
+ profile_condition = 'ffmpeg_profile == "%s"' % condition.PROFILE
+
+ conjunction_parts = filter(
+ None, [arch_condition, profile_condition])
+ conjunctions.append(' && '.join(conjunction_parts))
+
+ # If there is more that one clause, wrap various conditions in parens
+ # before joining.
+ if len(conjunctions) > 1:
+ conjunctions = ['(%s)' % x for x in conjunctions]
+
+ # Sort conjunctions to make order deterministic.
+ joined_conjuctions = ' || '.join(sorted(conjunctions))
+
+ stanza = ''
+ # Output a conditional wrapper around stanzas if necessary.
+ if joined_conjuctions:
+ stanza += GN_CONDITION_BEGIN % joined_conjuctions
+
+ def indent(s):
+ return ' %s' % s
+ else:
+ def indent(s):
+ return s
+
+ sources = sorted(n.replace('\\', '/') for n in self.sources)
+
+ # Write out all C sources.
+ c_sources = filter(IsCFile, sources)
+ if c_sources:
+ stanza += indent(GN_C_SOURCES_BEGIN)
+ for name in c_sources:
+ stanza += indent(GN_SOURCE_ITEM % (name))
+ stanza += indent(GN_SOURCE_END)
+
+ # Write out all assembly sources.
+ gas_sources = filter(IsGasFile, sources)
+ if gas_sources:
+ stanza += indent(GN_GAS_SOURCES_BEGIN)
+ for name in gas_sources:
+ stanza += indent(GN_SOURCE_ITEM % (name))
+ stanza += indent(GN_SOURCE_END)
+
+ # Write out all assembly sources.
+ yasm_sources = filter(IsYasmFile, sources)
+ if yasm_sources:
+ stanza += indent(GN_YASM_SOURCES_BEGIN)
+ for name in yasm_sources:
+ stanza += indent(GN_SOURCE_ITEM % (name))
+ stanza += indent(GN_SOURCE_END)
+
+ # Close the conditional if necessary.
+ if joined_conjuctions:
+ stanza += GN_CONDITION_END
+ else:
+ stanza += '\n' # Makeup the spacing for the remove conditional.
+ return stanza
+
+
+def CreatePairwiseDisjointSets(sets):
+ """Given a list of SourceSet objects, returns the pairwise disjoint sets.
+
+ NOTE: This isn't the most efficient algorithm, but given how infrequent we
+ need to run this and how small the input size is we'll leave it as is.
+ """
+
+ disjoint_sets = list(sets)
+
+ new_sets = True
+ while new_sets:
+ new_sets = False
+ for pair in itertools.combinations(disjoint_sets, 2):
+ intersection = pair[0].Intersect(pair[1])
+
+ # Both pairs are already disjoint, nothing to do.
+ if intersection.IsEmpty():
+ continue
+
+ # Add the resulting intersection set.
+ new_sets = True
+ disjoint_sets.append(intersection)
+
+ # Calculate the resulting differences for this pair of sets.
+ #
+ # If the differences are an empty set, remove them from the list of sets,
+ # otherwise update the set itself.
+ for p in pair:
+ i = disjoint_sets.index(p)
+ difference = p.Difference(intersection)
+ if difference.IsEmpty():
+ del disjoint_sets[i]
+ else:
+ disjoint_sets[i] = difference
+
+ # Restart the calculation since the list of disjoint sets has changed.
+ break
+
+ return disjoint_sets
+
+
+def GetAllMatchingConditions(conditions, condition_to_match):
+ """Given a set of conditions, find those that match the condition_to_match.
+ Matches are found when all attributes of the condition have the same value as
+ the condition_to_match, or value is accepted for wildcard attributes within
+ condition_to_match.
+ """
+
+ found_matches = set()
+
+ # Check all attributes of condition for matching values.
+ def accepts_all_values(attribute):
+ return getattr(condition_to_match, attribute) == '*'
+ attributes_to_check = [a for a in Attr if not accepts_all_values(a)]
+
+ # If all attributes allow wildcard, all conditions are considered matching
+ if not attributes_to_check:
+ return conditions
+
+ # Check all conditions and accumulate matches.
+ for condition in conditions:
+ condition_matches = True
+ for attribute in attributes_to_check:
+ if (getattr(condition, attribute)
+ != getattr(condition_to_match, attribute)):
+ condition_matches = False
+ break
+ if condition_matches:
+ found_matches.add(condition)
+
+ return found_matches
+
+def GetAttributeValuesRange(attribute, condition):
+ """Get the range of values for the given attribute considering the values
+ of all attributes in the given condition."""
+ if getattr(condition, attribute) == '*':
+ values = copy.copy(SUPPORT_MATRIX[attribute])
+ else:
+ values = set([getattr(condition, attribute)])
+
+ return values
+
+def GenerateConditionExpansion(condition):
+ """Expand wildcard in condition into all possible matching conditions."""
+ architectures = GetAttributeValuesRange(Attr.ARCHITECTURE, condition)
+ profiles = GetAttributeValuesRange(Attr.PROFILE, condition)
+ return set(SourceListCondition(arch, profile)
+ for (arch, profile)
+ in itertools.product(architectures, profiles))
+
+def ReduceConditionalLogic(source_set):
+ """Reduces the conditions for the given SourceSet.
+
+ The reduction leverages what we know about the space of possible combinations,
+ finding cases where conditions span all values possible of a given attribute.
+ In such cases, these conditions can be flattened into a single condition with
+ the spanned attribute removed.
+
+ There is room for further reduction (e.g. Quine-McCluskey), not implemented
+ at this time."""
+
+ ConditionReduction = collections.namedtuple('ConditionReduction',
+ 'condition, matches')
+ reduced_conditions = set()
+
+ for condition in source_set.conditions:
+ condition_dict = condition._asdict()
+
+ for attribute in Attr:
+ # Set attribute value to wildcard and find matching attributes.
+ original_attribute_value = condition_dict[attribute]
+ condition_dict[attribute] = '*'
+ new_condition = SourceListCondition(**condition_dict)
+
+ # Conditions with wildcards can replace existing conditions iff the
+ # source set contains conditions covering all possible expansions
+ # of the wildcarded values.
+ matches = GetAllMatchingConditions(source_set.conditions, new_condition)
+ if matches == GenerateConditionExpansion(new_condition):
+ reduced_conditions.add(ConditionReduction(new_condition,
+ frozenset(matches)))
+ else:
+ # This wildcard won't work, restore the original value.
+ condition_dict[attribute] = original_attribute_value
+
+ # Finally, find the most efficient reductions. Do a pairwise comparison of all
+ # reductions to de-dup and remove those that are covered by more inclusive
+ # conditions.
+ did_work = True
+ while did_work:
+ did_work = False
+ for reduction_pair in itertools.combinations(reduced_conditions, 2):
+ if reduction_pair[0].matches.issubset(reduction_pair[1].matches):
+ reduced_conditions.remove(reduction_pair[0])
+ did_work = True
+ break
+ elif reduction_pair[1].matches.issubset(reduction_pair[0].matches):
+ reduced_conditions.remove(reduction_pair[1])
+ did_work = True
+ break
+
+ # Apply the reductions to the source_set.
+ for reduction in reduced_conditions:
+ source_set.conditions.difference_update(reduction.matches)
+ source_set.conditions.add(reduction.condition)
+
+
+def ParseOptions():
+ """Parses the options and terminates program if they are not sane.
+
+ Returns:
+ The pair (optparse.OptionValues, [string]), that is the output of
+ a successful call to parser.parse_args().
+ """
+ parser = optparse.OptionParser(
+ usage='usage: %prog [options] DIR')
+
+ parser.add_option('-s',
+ '--source_dir',
+ dest='source_dir',
+ default='.',
+ metavar='DIR',
+ help='FFmpeg source directory.')
+
+ parser.add_option('-b',
+ '--build_dir',
+ dest='build_dir',
+ default='.',
+ metavar='DIR',
+ help='Build root containing build.x64, etc...')
+
+ options, args = parser.parse_args()
+
+ if not options.source_dir:
+ parser.error('No FFmpeg source directory specified')
+ elif not os.path.exists(options.source_dir):
+ parser.error('FFmpeg source directory does not exist')
+
+ if not options.build_dir:
+ parser.error('No build root directory specified')
+ elif not os.path.exists(options.build_dir):
+ parser.error('FFmpeg build directory does not exist')
+
+ return options, args
+
+
+def WriteGn(fd, disjoint_sets):
+ fd.write(COPYRIGHT)
+ fd.write(GN_HEADER)
+
+ # Generate conditional stanza for each disjoint source set.
+ for s in reversed(disjoint_sets):
+ fd.write(s.GenerateGnStanza())
+
+
+# Lists of files that are exempt from searching in GetIncludedSources.
+IGNORED_INCLUDE_FILES = [
+ # Fuchsia generated files
+ 'config.h',
+ os.path.join('libavcodec', 'bsf_list.c'),
+ os.path.join('libavcodec', 'codec_list.c'),
+ os.path.join('libavcodec', 'parser_list.c'),
+ os.path.join('libavformat', 'demuxer_list.c'),
+ os.path.join('libavformat', 'muxer_list.c'),
+ os.path.join('libavformat', 'protocol_list.c'),
+ os.path.join('libavutil', 'avconfig.h'),
+ os.path.join('libavutil', 'ffversion.h'),
+
+ # Current configure values are set such that we don't include these (because
+ # of various defines) and we also don't generate them at all, so we will
+ # fail to find these because they don't exist in our repository.
+ os.path.join('libavcodec', 'aacps_tables.h'),
+ os.path.join('libavcodec', 'aacps_fixed_tables.h'),
+ os.path.join('libavcodec', 'aacsbr_tables.h'),
+ os.path.join('libavcodec', 'aac_tables.h'),
+ os.path.join('libavcodec', 'cabac_tables.h'),
+ os.path.join('libavcodec', 'cbrt_tables.h'),
+ os.path.join('libavcodec', 'cbrt_fixed_tables.h'),
+ os.path.join('libavcodec', 'mpegaudio_tables.h'),
+ os.path.join('libavcodec', 'pcm_tables.h'),
+ os.path.join('libavcodec', 'sinewin_tables.h'),
+ os.path.join('libavcodec', 'sinewin_fixed_tables.h'),
+]
+
+
+# Regex to find lines matching #include "some_dir\some_file.h".
+INCLUDE_REGEX = re.compile('#\s*include\s+"([^"]+)"')
+
+# Regex to find whacky includes that we might be overlooking (e.g. using macros
+# or defines).
+EXOTIC_INCLUDE_REGEX = re.compile('#\s*include\s+[^"<\s].+')
+
+
+def GetIncludedSources(file_path, source_dir, include_set):
+ """Recurse over include tree, accumulating absolute paths to all included
+ files (including the seed file) in include_set.
+
+ Pass in the set returned from previous calls to avoid re-walking parts of the
+ tree. Given file_path may be relative (to options.src_dir) or absolute.
+
+ NOTE: This algorithm is greedy. It does not know which includes may be
+ excluded due to compile-time defines, so it considers any mentioned include.
+
+ NOTE: This algorithm makes hard assumptions about the include search paths.
+ Paths are checked in the order:
+ 1. Directory of the file containing the #include directive
+ 2. Directory specified by source_dir
+
+ NOTE: Files listed in IGNORED_INCLUDE_FILES will be ignored if not found. See
+ reasons at definition for IGNORED_INCLUDE_FILES.
+ """
+ # Use options.source_dir to correctly resolve relative file path. Use only
+ # absolute paths in the set to avoid same-name-errors.
+ if not os.path.isabs(file_path):
+ file_path = os.path.abspath(os.path.join(source_dir, file_path))
+
+ current_dir = os.path.dirname(file_path)
+
+ # Already processed this file, bail out.
+ if file_path in include_set:
+ return include_set
+
+ include_set.add(file_path)
+
+ for line in open(file_path):
+ include_match = INCLUDE_REGEX.search(line)
+
+ if not include_match:
+ if EXOTIC_INCLUDE_REGEX.search(line):
+ print 'WARNING: Investigate whacky include line:', line
+ continue
+
+ include_file_path = include_match.group(1)
+
+ # These may or may not be where the file lives. Just storing temps here
+ # and we'll checking their validity below.
+ include_path_in_current_dir = os.path.join(current_dir, include_file_path)
+ include_path_in_source_dir = os.path.join(source_dir, include_file_path)
+ resolved_include_path = ''
+
+ # Check if file is in current directory.
+ if os.path.isfile(include_path_in_current_dir):
+ resolved_include_path = include_path_in_current_dir
+ # Else, check source_dir (should be FFmpeg root).
+ elif os.path.isfile(include_path_in_source_dir):
+ resolved_include_path = include_path_in_source_dir
+ # Else, we couldn't find it :(.
+ elif include_file_path in IGNORED_INCLUDE_FILES:
+ continue
+ else:
+ exit('Failed to find file ' + include_file_path)
+
+ # At this point we've found the file. Check if its in our ignore list which
+ # means that the list should be updated to no longer mention this file.
+ if include_file_path in IGNORED_INCLUDE_FILES:
+ print('Found %s in IGNORED_INCLUDE_FILES. Consider updating the list '
+ 'to remove this file.' % str(include_file_path))
+
+ GetIncludedSources(resolved_include_path, source_dir, include_set)
+
+
+def FixBasenameCollision(old_path, new_path, content):
+ with open(new_path, "w") as new_file:
+ new_file.write(content)
+
+
+def UpdateCredits(sources_to_check, source_dir):
+ print 'Updating ffmpeg credits...'
+ updater = credits_updater.CreditsUpdater(source_dir)
+ for source_name in sources_to_check:
+ updater.ProcessFile(source_name)
+ updater.PrintStats()
+ updater.WriteCredits()
+
+
+def main():
+ options, _ = ParseOptions()
+
+ # Generate map of FFmpeg source files.
+ source_dir = options.source_dir
+ source_files = GetSourceFiles(source_dir)
+ object_to_sources = GetObjectToSourceMapping(source_files)
+
+ sets = []
+
+ for arch in SUPPORT_MATRIX[Attr.ARCHITECTURE]:
+ for profile in SUPPORT_MATRIX[Attr.PROFILE]:
+ # Assume build directory is of the form build.$arch/$profile.
+ name = ''.join(['build.', arch])
+ build_dir = os.path.join(options.build_dir, name, profile)
+ if not os.path.exists(build_dir):
+ continue
+ print 'Processing build directory: %s' % name
+
+ object_files = GetObjectFiles(build_dir)
+
+ # Generate the set of source files to build said profile.
+ s = GetSourceFileSet(object_to_sources, object_files)
+ sets.append(SourceSet(s, set([SourceListCondition(arch, profile)])))
+
+ sets = CreatePairwiseDisjointSets(sets)
+
+ for source_set in sets:
+ ReduceConditionalLogic(source_set)
+
+ if not sets:
+ exit('ERROR: failed to find any source sets. ' +
+ 'Are build_dir (%s) and/or source_dir (%s) options correct?' %
+ (options.build_dir, options.source_dir))
+
+ # Build up set of all sources and includes.
+ sources_to_check = set()
+ for source_set in sets:
+ for source in source_set.sources:
+ GetIncludedSources(source, source_dir, sources_to_check)
+
+ UpdateCredits(sources_to_check, source_dir)
+
+ gn_file_name = os.path.join(options.source_dir, 'ffmpeg_generated.gni')
+ print 'Writing:', gn_file_name
+ with open(gn_file_name, 'w') as fd:
+ WriteGn(fd, sets)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/fuchsia/scripts/license_texts/full_lgpl.txt b/fuchsia/scripts/license_texts/full_lgpl.txt
new file mode 100644
index 0000000..dc6c92d
--- /dev/null
+++ b/fuchsia/scripts/license_texts/full_lgpl.txt
@@ -0,0 +1,502 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
\ No newline at end of file
diff --git a/fuchsia/scripts/license_texts/jpeg.txt b/fuchsia/scripts/license_texts/jpeg.txt
new file mode 100644
index 0000000..c41ecdb
--- /dev/null
+++ b/fuchsia/scripts/license_texts/jpeg.txt
@@ -0,0 +1,36 @@
+This file is part of the Independent JPEG Group's software.
+
+The authors make NO WARRANTY or representation, either express or implied,
+with respect to this software, its quality, accuracy, merchantability, or
+fitness for a particular purpose. This software is provided "AS IS", and
+you, its user, assume the entire risk as to its quality and accuracy.
+
+This software is copyright (C) 1994-1996, Thomas G. Lane.
+All Rights Reserved except as specified below.
+
+Permission is hereby granted to use, copy, modify, and distribute this
+software (or portions thereof) for any purpose, without fee, subject to
+these conditions:
+(1) If any part of the source code for this software is distributed, then
+this README file must be included, with this copyright and no-warranty
+notice unaltered; and any additions, deletions, or changes to the original
+files must be clearly indicated in accompanying documentation.
+(2) If only executable code is distributed, then the accompanying
+documentation must state that "this software is based in part on the work
+of the Independent JPEG Group".
+(3) Permission for use of this software is granted only if the user accepts
+full responsibility for any undesirable consequences; the authors accept
+NO LIABILITY for damages of any kind.
+
+These conditions apply to any software derived from or based on the IJG
+code, not just to the unmodified library. If you use our work, you ought
+to acknowledge us.
+
+Permission is NOT granted for the use of any IJG author's name or company
+name in advertising or publicity relating to this software or products
+derived from it. This software may be referred to only as "the Independent
+JPEG Group's software".
+
+We specifically permit and encourage the use of this software as the basis
+of commercial products, provided that all warranty or liability claims are
+assumed by the product vendor.
\ No newline at end of file
diff --git a/fuchsia/scripts/license_texts/mips.txt b/fuchsia/scripts/license_texts/mips.txt
new file mode 100644
index 0000000..3bbf9eb
--- /dev/null
+++ b/fuchsia/scripts/license_texts/mips.txt
@@ -0,0 +1,36 @@
+Copyright (c) 2012
+MIPS Technologies, Inc., California.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+2. 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.
+3. Neither the name of the MIPS Technologies, Inc., 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 MIPS TECHNOLOGIES, INC. ``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 MIPS TECHNOLOGIES, INC. 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.
+
+Authors:
+Branimir Vasic (bvasic@mips.com)
+Darko Laus (darko@mips.com)
+Djordje Pesut (djordje@mips.com)
+Goran Cordasic (goran@mips.com)
+Nedeljko Babic (nedeljko.babic imgtec com)
+Mirjana Vulin (mvulin@mips.com)
+Stanislav Ocovaj (socovaj@mips.com)
+Zoran Lukic (zoranl@mips.com)
\ No newline at end of file
diff --git a/fuchsia/scripts/license_texts/oggparse_ahlberg_rullgayrd_2005.txt b/fuchsia/scripts/license_texts/oggparse_ahlberg_rullgayrd_2005.txt
new file mode 100644
index 0000000..4af3d44
--- /dev/null
+++ b/fuchsia/scripts/license_texts/oggparse_ahlberg_rullgayrd_2005.txt
@@ -0,0 +1,21 @@
+Copyright (C) 2005 Michael Ahlberg, Måns Rullgård
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use, copy,
+modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
\ No newline at end of file
diff --git a/libavcodec/extract_extradata_bsf.c b/libavcodec/extract_extradata_bsf.c
index 46b76df..9fcaf6d 100644
--- a/libavcodec/extract_extradata_bsf.c
+++ b/libavcodec/extract_extradata_bsf.c
@@ -161,7 +161,7 @@
ret = ff_h2645_packet_split(&s->h2645_pkt, pkt->data, pkt->size,
ctx, 0, 0, ctx->par_in->codec_id, 1, 0);
if (ret < 0)
- return ret;
+ goto fail;
for (i = 0; i < s->h2645_pkt.nb_nals; i++) {
H2645NAL *nal = &s->h2645_pkt.nals[i];
diff --git a/libavcodec/libx264.c b/libavcodec/libx264.c
index a08fe0c..c3ae07b 100644
--- a/libavcodec/libx264.c
+++ b/libavcodec/libx264.c
@@ -293,6 +293,7 @@
int *got_packet)
{
X264Context *x4 = ctx->priv_data;
+ const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(ctx->pix_fmt);
x264_nal_t *nal;
int nnal, i, ret;
x264_picture_t pic_out = {0};
@@ -852,6 +853,9 @@
x4->params.i_width = avctx->width;
x4->params.i_height = avctx->height;
+#if X264_BUILD >= 153
+ x4->params.i_bitdepth = av_pix_fmt_desc_get(avctx->pix_fmt)->comp[0].depth;
+#endif
av_reduce(&sw, &sh, avctx->sample_aspect_ratio.num, avctx->sample_aspect_ratio.den, 4096);
x4->params.vui.i_sar_width = sw;
x4->params.vui.i_sar_height = sh;
@@ -973,6 +977,24 @@
return 0;
}
+static const enum AVPixelFormat pix_fmts[] = {
+ AV_PIX_FMT_YUV420P,
+ AV_PIX_FMT_YUVJ420P,
+ AV_PIX_FMT_YUV422P,
+ AV_PIX_FMT_YUVJ422P,
+ AV_PIX_FMT_YUV444P,
+ AV_PIX_FMT_YUVJ444P,
+ AV_PIX_FMT_YUV420P10,
+ AV_PIX_FMT_YUV422P10,
+ AV_PIX_FMT_YUV444P10,
+ AV_PIX_FMT_NV12,
+ AV_PIX_FMT_NV16,
+ AV_PIX_FMT_NV20,
+#ifdef X264_CSP_NV21
+ AV_PIX_FMT_NV21,
+#endif
+ AV_PIX_FMT_NONE
+};
static const enum AVPixelFormat pix_fmts_8bit[] = {
AV_PIX_FMT_YUV420P,
AV_PIX_FMT_YUVJ420P,
diff --git a/libavcodec/x86/flac_dsp_gpl.asm b/libavcodec/x86/flac_dsp_gpl.asm
deleted file mode 100644
index e285158..0000000
--- a/libavcodec/x86/flac_dsp_gpl.asm
+++ /dev/null
@@ -1,101 +0,0 @@
-;******************************************************************************
-;* FLAC DSP functions
-;*
-;* Copyright (c) 2014 James Darnley <james.darnley@gmail.com>
-;*
-;* This file is part of FFmpeg.
-;*
-;* FFmpeg is free software; you can redistribute it and/or modify
-;* it under the terms of the GNU General Public License as published by
-;* the Free Software Foundation; either version 2 of the License, or
-;* (at your option) any later version.
-;*
-;* FFmpeg is distributed in the hope that it will be useful,
-;* but WITHOUT ANY WARRANTY; without even the implied warranty of
-;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;* GNU General Public License for more details.
-;*
-;* You should have received a copy of the GNU General Public License along
-;* with FFmpeg; if not, write to the Free Software Foundation, Inc.,
-;* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-;******************************************************************************
-
-%include "libavutil/x86/x86util.asm"
-
-SECTION .text
-
-INIT_XMM sse4
-%if ARCH_X86_64
- cglobal flac_enc_lpc_16, 5, 7, 8, 0, res, smp, len, order, coefs
- DECLARE_REG_TMP 5, 6
- %define length r2d
-
- movsxd orderq, orderd
-%else
- cglobal flac_enc_lpc_16, 5, 6, 8, 0, res, smp, len, order, coefs
- DECLARE_REG_TMP 2, 5
- %define length r2mp
-%endif
-
-; Here we assume that the maximum order value is 32. This means that we only
-; need to copy a maximum of 32 samples. Therefore we let the preprocessor
-; unroll this loop and copy all 32.
-%assign iter 0
-%rep 32/(mmsize/4)
- movu m0, [smpq+iter]
- movu [resq+iter], m0
- %assign iter iter+mmsize
-%endrep
-
-lea resq, [resq+orderq*4]
-lea smpq, [smpq+orderq*4]
-lea coefsq, [coefsq+orderq*4]
-sub length, orderd
-movd m3, r5m
-neg orderq
-
-%define posj t0q
-%define negj t1q
-
-.looplen:
- pxor m0, m0
- pxor m4, m4
- pxor m6, m6
- mov posj, orderq
- xor negj, negj
-
- .looporder:
- movd m2, [coefsq+posj*4] ; c = coefs[j]
- SPLATD m2
- movu m1, [smpq+negj*4-4] ; s = smp[i-j-1]
- movu m5, [smpq+negj*4-4+mmsize]
- movu m7, [smpq+negj*4-4+mmsize*2]
- pmulld m1, m2
- pmulld m5, m2
- pmulld m7, m2
- paddd m0, m1 ; p += c * s
- paddd m4, m5
- paddd m6, m7
-
- dec negj
- inc posj
- jnz .looporder
-
- psrad m0, m3 ; p >>= shift
- psrad m4, m3
- psrad m6, m3
- movu m1, [smpq]
- movu m5, [smpq+mmsize]
- movu m7, [smpq+mmsize*2]
- psubd m1, m0 ; smp[i] - p
- psubd m5, m4
- psubd m7, m6
- movu [resq], m1 ; res[i] = smp[i] - (p >> shift)
- movu [resq+mmsize], m5
- movu [resq+mmsize*2], m7
-
- add resq, 3*mmsize
- add smpq, 3*mmsize
- sub length, (3*mmsize)/4
-jg .looplen
-RET
diff --git a/libavfilter/signature.h b/libavfilter/signature.h
deleted file mode 100644
index cc198db..0000000
--- a/libavfilter/signature.h
+++ /dev/null
@@ -1,569 +0,0 @@
-/*
- * Copyright (c) 2017 Gerion Entrup
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/**
- * @file
- * MPEG-7 video signature calculation and lookup filter
- */
-
-#ifndef AVFILTER_SIGNATURE_H
-#define AVFILTER_SIGNATURE_H
-
-#include <float.h>
-#include "libavutil/common.h"
-#include "libavutil/opt.h"
-#include "libavutil/timestamp.h"
-#include "avfilter.h"
-#include "internal.h"
-
-#define ELEMENT_COUNT 10
-#define SIGELEM_SIZE 380
-#define DIFFELEM_SIZE 348 /* SIGELEM_SIZE - elem_a1 - elem_a2 */
-#define COARSE_SIZE 90
-
-enum lookup_mode {
- MODE_OFF,
- MODE_FULL,
- MODE_FAST,
- NB_LOOKUP_MODE
-};
-
-enum formats {
- FORMAT_BINARY,
- FORMAT_XML,
- NB_FORMATS
-};
-
-typedef struct Point {
- uint8_t x;
- uint8_t y;
-} Point;
-
-typedef struct Block {
- Point up;
- Point to;
-} Block;
-
-typedef struct ElemCat {
- int av_elem; /* average element category */
- short left_count; /* count of blocks that will be added together */
- short block_count; /* count of blocks per element */
- short elem_count;
- const Block* blocks;
-} ElemCat;
-
-typedef struct FineSignature {
- struct FineSignature* next;
- struct FineSignature* prev;
- uint64_t pts;
- uint32_t index; /* needed for xmlexport */
- uint8_t confidence;
- uint8_t words[5];
- uint8_t framesig[SIGELEM_SIZE/5];
-} FineSignature;
-
-typedef struct CoarseSignature {
- uint8_t data[5][31]; /* 5 words with min. 243 bit */
- struct FineSignature* first; /* associated Finesignatures */
- struct FineSignature* last;
- struct CoarseSignature* next;
-} CoarseSignature;
-
-/* lookup types */
-typedef struct MatchingInfo {
- double meandist;
- double framerateratio; /* second/first */
- int score;
- int offset;
- int matchframes; /* number of matching frames */
- int whole;
- struct FineSignature* first;
- struct FineSignature* second;
- struct MatchingInfo* next;
-} MatchingInfo;
-
-typedef struct StreamContext {
- AVRational time_base;
- /* needed for xml_export */
- int w; /* height */
- int h; /* width */
-
- /* overflow protection */
- int divide;
-
- FineSignature* finesiglist;
- FineSignature* curfinesig;
-
- CoarseSignature* coarsesiglist;
- CoarseSignature* coarseend; /* needed for xml export */
- /* helpers to store the alternating signatures */
- CoarseSignature* curcoarsesig1;
- CoarseSignature* curcoarsesig2;
-
- int coarsecount; /* counter from 0 to 89 */
- int midcoarse; /* whether it is a coarsesignature beginning from 45 + i * 90 */
- uint32_t lastindex; /* helper to store amount of frames */
-
- int exported; /* boolean whether stream already exported */
-} StreamContext;
-
-typedef struct SignatureContext {
- const AVClass *class;
- /* input parameters */
- int mode;
- int nb_inputs;
- char *filename;
- int format;
- int thworddist;
- int thcomposdist;
- int thl1;
- int thdi;
- int thit;
- /* end input parameters */
-
- uint8_t l1distlut[243*242/2]; /* 243 + 242 + 241 ... */
- StreamContext* streamcontexts;
-} SignatureContext;
-
-
-static const Block elem_a1_data[] = {
- {{ 0, 0},{ 7, 7}},
- {{ 8, 0},{15, 7}},
- {{ 0, 8},{ 7,15}},
- {{ 8, 8},{15,15}},
- {{16, 0},{23, 7}},
- {{24, 0},{31, 7}},
- {{16, 8},{23,15}},
- {{24, 8},{31,15}},
- {{ 0,16},{ 7,23}},
- {{ 8,16},{15,23}},
- {{ 0,24},{ 7,31}},
- {{ 8,24},{15,31}},
- {{16,16},{23,23}},
- {{24,16},{31,23}},
- {{16,24},{23,31}},
- {{24,24},{31,31}},
- {{ 0, 0},{15,15}},
- {{16, 0},{31,15}},
- {{ 0,16},{15,31}},
- {{16,16},{31,31}}
-};
-static const ElemCat elem_a1 = { 1, 1, 1, 20, elem_a1_data };
-
-static const Block elem_a2_data[] = {
- {{ 2, 2},{ 9, 9}},
- {{12, 2},{19, 9}},
- {{22, 2},{29, 9}},
- {{ 2,12},{ 9,19}},
- {{12,12},{19,19}},
- {{22,12},{29,19}},
- {{ 2,22},{ 9,29}},
- {{12,22},{19,29}},
- {{22,22},{29,29}},
- {{ 9, 9},{22,22}},
- {{ 6, 6},{25,25}},
- {{ 3, 3},{28,28}}
-};
-static const ElemCat elem_a2 = { 1, 1, 1, 12, elem_a2_data };
-
-static const Block elem_d1_data[] = {
- {{ 0, 0},{ 1, 3}},{{ 2, 0},{ 3, 3}},
- {{ 4, 0},{ 7, 1}},{{ 4, 2},{ 7, 3}},
- {{ 0, 6},{ 3, 7}},{{ 0, 4},{ 3, 5}},
- {{ 6, 4},{ 7, 7}},{{ 4, 4},{ 5, 7}},
- {{ 8, 0},{ 9, 3}},{{10, 0},{11, 3}},
- {{12, 0},{15, 1}},{{12, 2},{15, 3}},
- {{ 8, 6},{11, 7}},{{ 8, 4},{11, 5}},
- {{14, 4},{15, 7}},{{12, 4},{13, 7}},
- {{ 0, 8},{ 1,11}},{{ 2, 8},{ 3,11}},
- {{ 4, 8},{ 7, 9}},{{ 4,10},{ 7,11}},
- {{ 0,14},{ 3,15}},{{ 0,12},{ 3,13}},
- {{ 6,12},{ 7,15}},{{ 4,12},{ 5,15}},
- {{ 8, 8},{ 9,11}},{{10, 8},{11,11}},
- {{12, 8},{15, 9}},{{12,10},{15,11}},
- {{ 8,14},{11,15}},{{ 8,12},{11,13}},
- {{14,12},{15,15}},{{12,12},{13,15}},
- {{16, 0},{19, 1}},{{16, 2},{19, 3}},
- {{22, 0},{23, 3}},{{20, 0},{21, 3}},
- {{16, 4},{17, 7}},{{18, 4},{19, 7}},
- {{20, 6},{23, 7}},{{20, 4},{23, 5}},
- {{24, 0},{27, 1}},{{24, 2},{27, 3}},
- {{30, 0},{31, 3}},{{28, 0},{29, 3}},
- {{24, 4},{25, 7}},{{26, 4},{27, 7}},
- {{28, 6},{31, 7}},{{28, 4},{31, 5}},
- {{16, 8},{19, 9}},{{16,10},{19,11}},
- {{22, 8},{23,11}},{{20, 8},{21,11}},
- {{16,12},{17,15}},{{18,12},{19,15}},
- {{20,14},{23,15}},{{20,12},{23,13}},
- {{24, 8},{27, 9}},{{24,10},{27,11}},
- {{30, 8},{31,11}},{{28, 8},{29,11}},
- {{24,12},{25,15}},{{26,12},{27,15}},
- {{28,14},{31,15}},{{28,12},{31,13}},
- {{ 0,16},{ 3,17}},{{ 0,18},{ 3,19}},
- {{ 6,16},{ 7,19}},{{ 4,16},{ 5,19}},
- {{ 0,20},{ 1,23}},{{ 2,20},{ 3,23}},
- {{ 4,22},{ 7,23}},{{ 4,20},{ 7,21}},
- {{ 8,16},{11,17}},{{ 8,18},{11,19}},
- {{14,16},{15,19}},{{12,16},{13,19}},
- {{ 8,20},{ 9,23}},{{10,20},{11,23}},
- {{12,22},{15,23}},{{12,20},{15,21}},
- {{ 0,24},{ 3,25}},{{ 0,26},{ 3,27}},
- {{ 6,24},{ 7,27}},{{ 4,24},{ 5,27}},
- {{ 0,28},{ 1,31}},{{ 2,28},{ 3,31}},
- {{ 4,30},{ 7,31}},{{ 4,28},{ 7,29}},
- {{ 8,24},{11,25}},{{ 8,26},{11,27}},
- {{14,24},{15,27}},{{12,24},{13,27}},
- {{ 8,28},{ 9,31}},{{10,28},{11,31}},
- {{12,30},{15,31}},{{12,28},{15,29}},
- {{16,16},{17,19}},{{18,16},{19,19}},
- {{20,16},{23,17}},{{20,18},{23,19}},
- {{16,22},{19,23}},{{16,20},{19,21}},
- {{22,20},{23,23}},{{20,20},{21,23}},
- {{24,16},{25,19}},{{26,16},{27,19}},
- {{28,16},{31,17}},{{28,18},{31,19}},
- {{24,22},{27,23}},{{24,20},{27,21}},
- {{30,20},{31,23}},{{28,20},{29,23}},
- {{16,24},{17,27}},{{18,24},{19,27}},
- {{20,24},{23,25}},{{20,26},{23,27}},
- {{16,30},{19,31}},{{16,28},{19,29}},
- {{22,28},{23,31}},{{20,28},{21,31}},
- {{24,24},{25,27}},{{26,24},{27,27}},
- {{28,24},{31,25}},{{28,26},{31,27}},
- {{24,30},{27,31}},{{24,28},{27,29}},
- {{30,28},{31,31}},{{28,28},{29,31}},
- {{ 2, 2},{ 3, 5}},{{ 4, 2},{ 5, 5}},
- {{ 6, 2},{ 9, 3}},{{ 6, 4},{ 9, 5}},
- {{ 2, 8},{ 5, 9}},{{ 2, 6},{ 5, 7}},
- {{ 8, 6},{ 9, 9}},{{ 6, 6},{ 7, 9}},
- {{12, 2},{13, 5}},{{14, 2},{15, 5}},
- {{16, 2},{19, 3}},{{16, 4},{19, 5}},
- {{12, 8},{15, 9}},{{12, 6},{15, 7}},
- {{18, 6},{19, 9}},{{16, 6},{17, 9}},
- {{22, 2},{23, 5}},{{24, 2},{25, 5}},
- {{26, 2},{29, 3}},{{26, 4},{29, 5}},
- {{22, 8},{25, 9}},{{22, 6},{25, 7}},
- {{28, 6},{29, 9}},{{26, 6},{27, 9}},
- {{ 2,12},{ 3,15}},{{ 4,12},{ 5,15}},
- {{ 6,12},{ 9,13}},{{ 6,14},{ 9,15}},
- {{ 2,18},{ 5,19}},{{ 2,16},{ 5,17}},
- {{ 8,16},{ 9,19}},{{ 6,16},{ 7,19}},
- {{12,12},{15,13}},{{12,14},{15,15}},
- {{16,12},{19,13}},{{16,14},{19,15}},
- {{12,18},{15,19}},{{12,16},{15,17}},
- {{16,18},{19,19}},{{16,16},{19,17}},
- {{22,12},{23,15}},{{24,12},{25,15}},
- {{26,12},{29,13}},{{26,14},{29,15}},
- {{22,18},{25,19}},{{22,16},{25,17}},
- {{28,16},{29,19}},{{26,16},{27,19}},
- {{ 2,22},{ 3,25}},{{ 4,22},{ 5,25}},
- {{ 6,22},{ 9,23}},{{ 6,24},{ 9,25}},
- {{ 2,28},{ 5,29}},{{ 2,26},{ 5,27}},
- {{ 8,26},{ 9,29}},{{ 6,26},{ 7,29}},
- {{12,22},{13,25}},{{14,22},{15,25}},
- {{16,22},{19,23}},{{16,24},{19,25}},
- {{12,28},{15,29}},{{12,26},{15,27}},
- {{18,26},{19,29}},{{16,26},{17,29}},
- {{22,22},{23,25}},{{24,22},{25,25}},
- {{26,22},{29,23}},{{26,24},{29,25}},
- {{22,28},{25,29}},{{22,26},{25,27}},
- {{28,26},{29,29}},{{26,26},{27,29}},
- {{ 7, 7},{10, 8}},{{ 7, 9},{10,10}},
- {{11, 7},{12,10}},{{13, 7},{14,10}},
- {{ 7,11},{ 8,14}},{{ 9,11},{10,14}},
- {{11,11},{14,12}},{{11,13},{14,14}},
- {{17, 7},{20, 8}},{{17, 9},{20,10}},
- {{21, 7},{22,10}},{{23, 7},{24,10}},
- {{17,11},{18,14}},{{19,11},{20,14}},
- {{21,11},{24,12}},{{21,13},{24,14}},
- {{ 7,17},{10,18}},{{ 7,19},{10,20}},
- {{11,17},{12,20}},{{13,17},{14,20}},
- {{ 7,21},{ 8,24}},{{ 9,21},{10,24}},
- {{11,21},{14,22}},{{11,23},{14,24}},
- {{17,17},{20,18}},{{17,19},{20,20}},
- {{21,17},{22,20}},{{23,17},{24,20}},
- {{17,21},{18,24}},{{19,21},{20,24}},
- {{21,21},{24,22}},{{21,23},{24,24}}
-};
-static const ElemCat elem_d1 = { 0, 1, 2, 116, elem_d1_data };
-
-static const Block elem_d2_data[] = {
- {{ 0, 0},{ 3, 3}},{{ 4, 4},{ 7, 7}},{{ 4, 0},{ 7, 3}},{{ 0, 4},{ 3, 7}},
- {{ 8, 0},{11, 3}},{{12, 4},{15, 7}},{{12, 0},{15, 3}},{{ 8, 4},{11, 7}},
- {{16, 0},{19, 3}},{{20, 4},{23, 7}},{{20, 0},{23, 3}},{{16, 4},{19, 7}},
- {{24, 0},{27, 3}},{{28, 4},{31, 7}},{{28, 0},{31, 3}},{{24, 4},{27, 7}},
- {{ 0, 8},{ 3,11}},{{ 4,12},{ 7,15}},{{ 4, 8},{ 7,11}},{{ 0,12},{ 3,15}},
- {{ 8, 8},{11,11}},{{12,12},{15,15}},{{12, 8},{15,11}},{{ 8,12},{11,15}},
- {{16, 8},{19,11}},{{20,12},{23,15}},{{20, 8},{23,11}},{{16,12},{19,15}},
- {{24, 8},{27,11}},{{28,12},{31,15}},{{28, 8},{31,11}},{{24,12},{27,15}},
- {{ 0,16},{ 3,19}},{{ 4,20},{ 7,23}},{{ 4,16},{ 7,19}},{{ 0,20},{ 3,23}},
- {{ 8,16},{11,19}},{{12,20},{15,23}},{{12,16},{15,19}},{{ 8,20},{11,23}},
- {{16,16},{19,19}},{{20,20},{23,23}},{{20,16},{23,19}},{{16,20},{19,23}},
- {{24,16},{27,19}},{{28,20},{31,23}},{{28,16},{31,19}},{{24,20},{27,23}},
- {{ 0,24},{ 3,27}},{{ 4,28},{ 7,31}},{{ 4,24},{ 7,27}},{{ 0,28},{ 3,31}},
- {{ 8,24},{11,27}},{{12,28},{15,31}},{{12,24},{15,27}},{{ 8,28},{11,31}},
- {{16,24},{19,27}},{{20,28},{23,31}},{{20,24},{23,27}},{{16,28},{19,31}},
- {{24,24},{27,27}},{{28,28},{31,31}},{{28,24},{31,27}},{{24,28},{27,31}},
- {{ 4, 4},{ 7, 7}},{{ 8, 8},{11,11}},{{ 8, 4},{11, 7}},{{ 4, 8},{ 7,11}},
- {{12, 4},{15, 7}},{{16, 8},{19,11}},{{16, 4},{19, 7}},{{12, 8},{15,11}},
- {{20, 4},{23, 7}},{{24, 8},{27,11}},{{24, 4},{27, 7}},{{20, 8},{23,11}},
- {{ 4,12},{ 7,15}},{{ 8,16},{11,19}},{{ 8,12},{11,15}},{{ 4,16},{ 7,19}},
- {{12,12},{15,15}},{{16,16},{19,19}},{{16,12},{19,15}},{{12,16},{15,19}},
- {{20,12},{23,15}},{{24,16},{27,19}},{{24,12},{27,15}},{{20,16},{23,19}},
- {{ 4,20},{ 7,23}},{{ 8,24},{11,27}},{{ 8,20},{11,23}},{{ 4,24},{ 7,27}},
- {{12,20},{15,23}},{{16,24},{19,27}},{{16,20},{19,23}},{{12,24},{15,27}},
- {{20,20},{23,23}},{{24,24},{27,27}},{{24,20},{27,23}},{{20,24},{23,27}}
-};
-static const ElemCat elem_d2 = { 0, 2, 4, 25, elem_d2_data };
-
-static const Block elem_d3_data[] = {
- {{ 1, 1},{10,10}},{{11, 1},{20,10}},
- {{ 1, 1},{10,10}},{{21, 1},{30,10}},
- {{ 1, 1},{10,10}},{{ 1,11},{10,20}},
- {{ 1, 1},{10,10}},{{11,11},{20,20}},
- {{ 1, 1},{10,10}},{{21,11},{30,20}},
- {{ 1, 1},{10,10}},{{ 1,21},{10,30}},
- {{ 1, 1},{10,10}},{{11,21},{20,30}},
- {{ 1, 1},{10,10}},{{21,21},{30,30}},
- {{11, 1},{20,10}},{{21, 1},{30,10}},
- {{11, 1},{20,10}},{{ 1,11},{10,20}},
- {{11, 1},{20,10}},{{11,11},{20,20}},
- {{11, 1},{20,10}},{{21,11},{30,20}},
- {{11, 1},{20,10}},{{ 1,21},{10,30}},
- {{11, 1},{20,10}},{{11,21},{20,30}},
- {{11, 1},{20,10}},{{21,21},{30,30}},
- {{21, 1},{30,10}},{{ 1,11},{10,20}},
- {{21, 1},{30,10}},{{11,11},{20,20}},
- {{21, 1},{30,10}},{{21,11},{30,20}},
- {{21, 1},{30,10}},{{ 1,21},{10,30}},
- {{21, 1},{30,10}},{{11,21},{20,30}},
- {{21, 1},{30,10}},{{21,21},{30,30}},
- {{ 1,11},{10,20}},{{11,11},{20,20}},
- {{ 1,11},{10,20}},{{21,11},{30,20}},
- {{ 1,11},{10,20}},{{ 1,21},{10,30}},
- {{ 1,11},{10,20}},{{11,21},{20,30}},
- {{ 1,11},{10,20}},{{21,21},{30,30}},
- {{11,11},{20,20}},{{21,11},{30,20}},
- {{11,11},{20,20}},{{ 1,21},{10,30}},
- {{11,11},{20,20}},{{11,21},{20,30}},
- {{11,11},{20,20}},{{21,21},{30,30}},
- {{21,11},{30,20}},{{ 1,21},{10,30}},
- {{21,11},{30,20}},{{11,21},{20,30}},
- {{21,11},{30,20}},{{21,21},{30,30}},
- {{ 1,21},{10,30}},{{11,21},{20,30}},
- {{ 1,21},{10,30}},{{21,21},{30,30}},
- {{11,21},{20,30}},{{21,21},{30,30}}
-};
-static const ElemCat elem_d3 = { 0, 1, 2, 36, elem_d3_data };
-
-static const Block elem_d4_data[] = {
- {{ 7,13},{12,18}},{{19,13},{24,18}},
- {{13, 7},{18,12}},{{13,19},{18,24}},
- {{ 7, 7},{12,12}},{{19,19},{24,24}},
- {{19, 7},{24,12}},{{ 7,19},{12,24}},
- {{13, 7},{18,12}},{{19,13},{24,18}},
- {{19,13},{24,18}},{{13,19},{18,24}},
- {{13,19},{18,24}},{{ 7,13},{12,18}},
- {{ 7,13},{12,18}},{{13, 7},{18,12}},
- {{ 7, 7},{12,12}},{{19, 7},{24,12}},
- {{19, 7},{24,12}},{{19,19},{24,24}},
- {{19,19},{24,24}},{{ 7,19},{12,24}},
- {{ 7,19},{12,24}},{{ 7, 7},{12,12}},
- {{13,13},{18,18}},{{13, 1},{18, 6}},
- {{13,13},{18,18}},{{25,13},{30,18}},
- {{13,13},{18,18}},{{13,25},{18,30}},
- {{13,13},{18,18}},{{ 1,13},{ 6,18}},
- {{13, 1},{18, 6}},{{13,25},{18,30}},
- {{ 1,13},{ 6,18}},{{25,13},{30,18}},
- {{ 7, 1},{12, 6}},{{19, 1},{24, 6}},
- {{ 7,25},{12,30}},{{19,25},{24,30}},
- {{ 1, 7},{ 6,12}},{{ 1,19},{ 6,24}},
- {{25, 7},{30,12}},{{25,19},{30,24}},
- {{ 7, 1},{12, 6}},{{ 1, 7},{ 6,12}},
- {{19, 1},{24, 6}},{{25, 7},{30,12}},
- {{25,19},{30,24}},{{19,25},{24,30}},
- {{ 1,19},{ 6,24}},{{ 7,25},{12,30}},
- {{ 1, 1},{ 6, 6}},{{25, 1},{30, 6}},
- {{25, 1},{30, 6}},{{25,25},{30,30}},
- {{25,25},{30,30}},{{ 1,25},{ 6,30}},
- {{ 1,25},{ 6,30}},{{ 1, 1},{ 6, 6}}
-};
-static const ElemCat elem_d4 = { 0, 1, 2, 30, elem_d4_data };
-
-static const Block elem_d5_data[] = {
- {{ 1, 1},{10, 3}},{{ 1, 4},{ 3, 7}},{{ 8, 4},{10, 7}},{{ 1, 8},{10,10}},{{ 4, 4},{ 7, 7}},
- {{11, 1},{20, 3}},{{11, 4},{13, 7}},{{18, 4},{20, 7}},{{11, 8},{20,10}},{{14, 4},{17, 7}},
- {{21, 1},{30, 3}},{{21, 4},{23, 7}},{{28, 4},{30, 7}},{{21, 8},{30,10}},{{24, 4},{27, 7}},
- {{ 1,11},{10,13}},{{ 1,14},{ 3,17}},{{ 8,14},{10,17}},{{ 1,18},{10,20}},{{ 4,14},{ 7,17}},
- {{11,11},{20,13}},{{11,14},{13,17}},{{18,14},{20,17}},{{11,18},{20,20}},{{14,14},{17,17}},
- {{21,11},{30,13}},{{21,14},{23,17}},{{28,14},{30,17}},{{21,18},{30,20}},{{24,14},{27,17}},
- {{ 1,21},{10,23}},{{ 1,24},{ 3,27}},{{ 8,24},{10,27}},{{ 1,28},{10,30}},{{ 4,24},{ 7,27}},
- {{11,21},{20,23}},{{11,24},{13,27}},{{18,24},{20,27}},{{11,28},{20,30}},{{14,24},{17,27}},
- {{21,21},{30,23}},{{21,24},{23,27}},{{28,24},{30,27}},{{21,28},{30,30}},{{24,24},{27,27}},
- {{ 6, 6},{15, 8}},{{ 6, 9},{ 8,12}},{{13, 9},{15,12}},{{ 6,13},{15,15}},{{ 9, 9},{12,12}},
- {{16, 6},{25, 8}},{{16, 9},{18,12}},{{23, 9},{25,12}},{{16,13},{25,15}},{{19, 9},{22,12}},
- {{ 6,16},{15,18}},{{ 6,19},{ 8,22}},{{13,19},{15,22}},{{ 6,23},{15,25}},{{ 9,19},{12,22}},
- {{16,16},{25,18}},{{16,19},{18,22}},{{23,19},{25,22}},{{16,23},{25,25}},{{19,19},{22,22}},
- {{ 6, 1},{15, 3}},{{ 6, 4},{ 8, 7}},{{13, 4},{15, 7}},{{ 6, 8},{15,10}},{{ 9, 4},{12, 7}},
- {{16, 1},{25, 3}},{{16, 4},{18, 7}},{{23, 4},{25, 7}},{{16, 8},{25,10}},{{19, 4},{22, 7}},
- {{ 1, 6},{10, 8}},{{ 1, 9},{ 3,12}},{{ 8, 9},{10,12}},{{ 1,13},{10,15}},{{ 4, 9},{ 7,12}},
- {{11, 6},{20, 8}},{{11, 9},{13,12}},{{18, 9},{20,12}},{{11,13},{20,15}},{{14, 9},{17,12}},
- {{21, 6},{30, 8}},{{21, 9},{23,12}},{{28, 9},{30,12}},{{21,13},{30,15}},{{24, 9},{27,12}},
- {{ 6,11},{15,13}},{{ 6,14},{ 8,17}},{{13,14},{15,17}},{{ 6,18},{15,20}},{{ 9,14},{12,17}},
- {{16,11},{25,13}},{{16,14},{18,17}},{{23,14},{25,17}},{{16,18},{25,20}},{{19,14},{22,17}},
- {{ 1,16},{10,18}},{{ 1,19},{ 3,22}},{{ 8,19},{10,22}},{{ 1,23},{10,25}},{{ 4,19},{ 7,22}},
- {{11,16},{20,18}},{{11,19},{13,22}},{{18,19},{20,22}},{{11,23},{20,25}},{{14,19},{17,22}},
- {{21,16},{30,18}},{{21,19},{23,22}},{{28,19},{30,22}},{{21,23},{30,25}},{{24,19},{27,22}},
- {{ 6,21},{15,23}},{{ 6,24},{ 8,27}},{{13,24},{15,27}},{{ 6,28},{15,30}},{{ 9,24},{12,27}},
- {{16,21},{25,23}},{{16,24},{18,27}},{{23,24},{25,27}},{{16,28},{25,30}},{{19,24},{22,27}},
- {{ 2, 2},{14, 6}},{{ 2, 7},{ 6, 9}},{{10, 7},{14, 9}},{{ 2,10},{14,14}},{{ 7, 7},{ 9, 9}},
- {{ 7, 2},{19, 6}},{{ 7, 7},{11, 9}},{{15, 7},{19, 9}},{{ 7,10},{19,14}},{{12, 7},{14, 9}},
- {{12, 2},{24, 6}},{{12, 7},{16, 9}},{{20, 7},{24, 9}},{{12,10},{24,14}},{{17, 7},{19, 9}},
- {{17, 2},{29, 6}},{{17, 7},{21, 9}},{{25, 7},{29, 9}},{{17,10},{29,14}},{{22, 7},{24, 9}},
- {{ 2, 7},{14,11}},{{ 2,12},{ 6,14}},{{10,12},{14,14}},{{ 2,15},{14,19}},{{ 7,12},{ 9,14}},
- {{ 7, 7},{19,11}},{{ 7,12},{11,14}},{{15,12},{19,14}},{{ 7,15},{19,19}},{{12,12},{14,14}},
- {{12, 7},{24,11}},{{12,12},{16,14}},{{20,12},{24,14}},{{12,15},{24,19}},{{17,12},{19,14}},
- {{17, 7},{29,11}},{{17,12},{21,14}},{{25,12},{29,14}},{{17,15},{29,19}},{{22,12},{24,14}},
- {{ 2,12},{14,16}},{{ 2,17},{ 6,19}},{{10,17},{14,19}},{{ 2,20},{14,24}},{{ 7,17},{ 9,19}},
- {{ 7,12},{19,16}},{{ 7,17},{11,19}},{{15,17},{19,19}},{{ 7,20},{19,24}},{{12,17},{14,19}},
- {{12,12},{24,16}},{{12,17},{16,19}},{{20,17},{24,19}},{{12,20},{24,24}},{{17,17},{19,19}},
- {{17,12},{29,16}},{{17,17},{21,19}},{{25,17},{29,19}},{{17,20},{29,24}},{{22,17},{24,19}},
- {{ 2,17},{14,21}},{{ 2,22},{ 6,24}},{{10,22},{14,24}},{{ 2,25},{14,29}},{{ 7,22},{ 9,24}},
- {{ 7,17},{19,21}},{{ 7,22},{11,24}},{{15,22},{19,24}},{{ 7,25},{19,29}},{{12,22},{14,24}},
- {{12,17},{24,21}},{{12,22},{16,24}},{{20,22},{24,24}},{{12,25},{24,29}},{{17,22},{19,24}},
- {{17,17},{29,21}},{{17,22},{21,24}},{{25,22},{29,24}},{{17,25},{29,29}},{{22,22},{24,24}},
- {{ 8, 3},{13, 4}},{{ 8, 5},{ 9, 6}},{{12, 5},{13, 6}},{{ 8, 7},{13, 8}},{{10, 5},{11, 6}},
- {{13, 3},{18, 4}},{{13, 5},{14, 6}},{{17, 5},{18, 6}},{{13, 7},{18, 8}},{{15, 5},{16, 6}},
- {{18, 3},{23, 4}},{{18, 5},{19, 6}},{{22, 5},{23, 6}},{{18, 7},{23, 8}},{{20, 5},{21, 6}},
- {{ 3, 8},{ 8, 9}},{{ 3,10},{ 4,11}},{{ 7,10},{ 8,11}},{{ 3,12},{ 8,13}},{{ 5,10},{ 6,11}},
- {{ 8, 8},{13, 9}},{{ 8,10},{ 9,11}},{{12,10},{13,11}},{{ 8,12},{13,13}},{{10,10},{11,11}},
- {{13, 8},{18, 9}},{{13,10},{14,11}},{{17,10},{18,11}},{{13,12},{18,13}},{{15,10},{16,11}},
- {{18, 8},{23, 9}},{{18,10},{19,11}},{{22,10},{23,11}},{{18,12},{23,13}},{{20,10},{21,11}},
- {{23, 8},{28, 9}},{{23,10},{24,11}},{{27,10},{28,11}},{{23,12},{28,13}},{{25,10},{26,11}},
- {{ 3,13},{ 8,14}},{{ 3,15},{ 4,16}},{{ 7,15},{ 8,16}},{{ 3,17},{ 8,18}},{{ 5,15},{ 6,16}},
- {{ 8,13},{13,14}},{{ 8,15},{ 9,16}},{{12,15},{13,16}},{{ 8,17},{13,18}},{{10,15},{11,16}},
- {{13,13},{18,14}},{{13,15},{14,16}},{{17,15},{18,16}},{{13,17},{18,18}},{{15,15},{16,16}},
- {{18,13},{23,14}},{{18,15},{19,16}},{{22,15},{23,16}},{{18,17},{23,18}},{{20,15},{21,16}},
- {{23,13},{28,14}},{{23,15},{24,16}},{{27,15},{28,16}},{{23,17},{28,18}},{{25,15},{26,16}},
- {{ 3,18},{ 8,19}},{{ 3,20},{ 4,21}},{{ 7,20},{ 8,21}},{{ 3,22},{ 8,23}},{{ 5,20},{ 6,21}},
- {{ 8,18},{13,19}},{{ 8,20},{ 9,21}},{{12,20},{13,21}},{{ 8,22},{13,23}},{{10,20},{11,21}},
- {{13,18},{18,19}},{{13,20},{14,21}},{{17,20},{18,21}},{{13,22},{18,23}},{{15,20},{16,21}},
- {{18,18},{23,19}},{{18,20},{19,21}},{{22,20},{23,21}},{{18,22},{23,23}},{{20,20},{21,21}},
- {{23,18},{28,19}},{{23,20},{24,21}},{{27,20},{28,21}},{{23,22},{28,23}},{{25,20},{26,21}},
- {{ 8,23},{13,24}},{{ 8,25},{ 9,26}},{{12,25},{13,26}},{{ 8,27},{13,28}},{{10,25},{11,26}},
- {{13,23},{18,24}},{{13,25},{14,26}},{{17,25},{18,26}},{{13,27},{18,28}},{{15,25},{16,26}},
- {{18,23},{23,24}},{{18,25},{19,26}},{{22,25},{23,26}},{{18,27},{23,28}},{{20,25},{21,26}}
-};
-static const ElemCat elem_d5 = { 0, 4, 5, 62, elem_d5_data };
-
-static const Block elem_d6_data[] = {
- {{ 3, 5},{12,10}},{{ 5, 3},{10,12}},
- {{11, 5},{20,10}},{{13, 3},{18,12}},
- {{19, 5},{28,10}},{{21, 3},{26,12}},
- {{ 3,13},{12,18}},{{ 5,11},{10,20}},
- {{11,13},{20,18}},{{13,11},{18,20}},
- {{19,13},{28,18}},{{21,11},{26,20}},
- {{ 3,21},{12,26}},{{ 5,19},{10,28}},
- {{11,21},{20,26}},{{13,19},{18,28}},
- {{19,21},{28,26}},{{21,19},{26,28}}
-};
-static const ElemCat elem_d6 = { 0, 1, 2, 9, elem_d6_data };
-
-static const Block elem_d7_data[] = {
- {{ 0, 4},{ 3, 7}},{{ 8, 4},{11, 7}},{{ 4, 4},{ 7, 7}},
- {{ 4, 0},{ 7, 3}},{{ 4, 8},{ 7,11}},{{ 4, 4},{ 7, 7}},
- {{ 5, 4},{ 8, 7}},{{13, 4},{16, 7}},{{ 9, 4},{12, 7}},
- {{ 9, 0},{12, 3}},{{ 9, 8},{12,11}},{{ 9, 4},{12, 7}},
- {{10, 4},{13, 7}},{{18, 4},{21, 7}},{{14, 4},{17, 7}},
- {{14, 0},{17, 3}},{{14, 8},{17,11}},{{14, 4},{17, 7}},
- {{15, 4},{18, 7}},{{23, 4},{26, 7}},{{19, 4},{22, 7}},
- {{19, 0},{22, 3}},{{19, 8},{22,11}},{{19, 4},{22, 7}},
- {{20, 4},{23, 7}},{{28, 4},{31, 7}},{{24, 4},{27, 7}},
- {{24, 0},{27, 3}},{{24, 8},{27,11}},{{24, 4},{27, 7}},
- {{ 0, 9},{ 3,12}},{{ 8, 9},{11,12}},{{ 4, 9},{ 7,12}},
- {{ 4, 5},{ 7, 8}},{{ 4,13},{ 7,16}},{{ 4, 9},{ 7,12}},
- {{ 5, 9},{ 8,12}},{{13, 9},{16,12}},{{ 9, 9},{12,12}},
- {{ 9, 5},{12, 8}},{{ 9,13},{12,16}},{{ 9, 9},{12,12}},
- {{10, 9},{13,12}},{{18, 9},{21,12}},{{14, 9},{17,12}},
- {{14, 5},{17, 8}},{{14,13},{17,16}},{{14, 9},{17,12}},
- {{15, 9},{18,12}},{{23, 9},{26,12}},{{19, 9},{22,12}},
- {{19, 5},{22, 8}},{{19,13},{22,16}},{{19, 9},{22,12}},
- {{20, 9},{23,12}},{{28, 9},{31,12}},{{24, 9},{27,12}},
- {{24, 5},{27, 8}},{{24,13},{27,16}},{{24, 9},{27,12}},
- {{ 0,14},{ 3,17}},{{ 8,14},{11,17}},{{ 4,14},{ 7,17}},
- {{ 4,10},{ 7,13}},{{ 4,18},{ 7,21}},{{ 4,14},{ 7,17}},
- {{ 5,14},{ 8,17}},{{13,14},{16,17}},{{ 9,14},{12,17}},
- {{ 9,10},{12,13}},{{ 9,18},{12,21}},{{ 9,14},{12,17}},
- {{10,14},{13,17}},{{18,14},{21,17}},{{14,14},{17,17}},
- {{14,10},{17,13}},{{14,18},{17,21}},{{14,14},{17,17}},
- {{15,14},{18,17}},{{23,14},{26,17}},{{19,14},{22,17}},
- {{19,10},{22,13}},{{19,18},{22,21}},{{19,14},{22,17}},
- {{20,14},{23,17}},{{28,14},{31,17}},{{24,14},{27,17}},
- {{24,10},{27,13}},{{24,18},{27,21}},{{24,14},{27,17}},
- {{ 0,19},{ 3,22}},{{ 8,19},{11,22}},{{ 4,19},{ 7,22}},
- {{ 4,15},{ 7,18}},{{ 4,23},{ 7,26}},{{ 4,19},{ 7,22}},
- {{ 5,19},{ 8,22}},{{13,19},{16,22}},{{ 9,19},{12,22}},
- {{ 9,15},{12,18}},{{ 9,23},{12,26}},{{ 9,19},{12,22}},
- {{10,19},{13,22}},{{18,19},{21,22}},{{14,19},{17,22}},
- {{14,15},{17,18}},{{14,23},{17,26}},{{14,19},{17,22}},
- {{15,19},{18,22}},{{23,19},{26,22}},{{19,19},{22,22}},
- {{19,15},{22,18}},{{19,23},{22,26}},{{19,19},{22,22}},
- {{20,19},{23,22}},{{28,19},{31,22}},{{24,19},{27,22}},
- {{24,15},{27,18}},{{24,23},{27,26}},{{24,19},{27,22}},
- {{ 0,24},{ 3,27}},{{ 8,24},{11,27}},{{ 4,24},{ 7,27}},
- {{ 4,20},{ 7,23}},{{ 4,28},{ 7,31}},{{ 4,24},{ 7,27}},
- {{ 5,24},{ 8,27}},{{13,24},{16,27}},{{ 9,24},{12,27}},
- {{ 9,20},{12,23}},{{ 9,28},{12,31}},{{ 9,24},{12,27}},
- {{10,24},{13,27}},{{18,24},{21,27}},{{14,24},{17,27}},
- {{14,20},{17,23}},{{14,28},{17,31}},{{14,24},{17,27}},
- {{15,24},{18,27}},{{23,24},{26,27}},{{19,24},{22,27}},
- {{19,20},{22,23}},{{19,28},{22,31}},{{19,24},{22,27}},
- {{20,24},{23,27}},{{28,24},{31,27}},{{24,24},{27,27}},
- {{24,20},{27,23}},{{24,28},{27,31}},{{24,24},{27,27}}
-};
-static const ElemCat elem_d7 = { 0, 2, 3, 50, elem_d7_data };
-
-static const Block elem_d8_data[] = {
- {{ 0, 0},{ 7, 3}},{{ 0, 4},{ 7, 7}},
- {{ 8, 0},{11, 7}},{{12, 0},{15, 7}},
- {{ 0, 8},{ 3,15}},{{ 4, 8},{ 7,15}},
- {{ 8, 8},{15,11}},{{ 8,12},{15,15}},
- {{16, 0},{19, 7}},{{20, 0},{23, 7}},
- {{24, 0},{31, 3}},{{24, 4},{31, 7}},
- {{16, 8},{23,11}},{{16,12},{23,15}},
- {{24, 8},{27,15}},{{28, 8},{31,15}},
- {{ 0,16},{ 3,23}},{{ 4,16},{ 7,23}},
- {{ 8,16},{15,19}},{{ 8,20},{15,23}},
- {{ 0,24},{ 7,27}},{{ 0,28},{ 7,31}},
- {{ 8,24},{11,31}},{{12,24},{15,31}},
- {{16,16},{23,19}},{{16,20},{23,23}},
- {{24,16},{27,23}},{{28,16},{31,23}},
- {{16,24},{19,31}},{{20,24},{23,31}},
- {{24,24},{31,27}},{{24,28},{31,31}},
- {{ 0, 0},{ 7,15}},{{ 8, 0},{15,15}},
- {{16, 0},{31, 7}},{{16, 8},{31,15}},
- {{ 0,16},{15,23}},{{ 0,24},{15,31}},
- {{16,16},{23,31}},{{24,16},{31,31}}
-};
-static const ElemCat elem_d8 = { 0, 1, 2, 20, elem_d8_data };
-
-static const ElemCat* elements[ELEMENT_COUNT] = { &elem_a1, &elem_a2,
- &elem_d1, &elem_d2, &elem_d3, &elem_d4,
- &elem_d5, &elem_d6, &elem_d7, &elem_d8 };
-#endif /* AVFILTER_SIGNATURE_H */
diff --git a/libavfilter/signature_lookup.c b/libavfilter/signature_lookup.c
deleted file mode 100644
index 272c717..0000000
--- a/libavfilter/signature_lookup.c
+++ /dev/null
@@ -1,580 +0,0 @@
-/*
- * Copyright (c) 2017 Gerion Entrup
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/**
- * @file
- * MPEG-7 video signature calculation and lookup filter
- */
-
-#include "signature.h"
-
-#define HOUGH_MAX_OFFSET 90
-#define MAX_FRAMERATE 60
-
-#define DIR_PREV 0
-#define DIR_NEXT 1
-#define DIR_PREV_END 2
-#define DIR_NEXT_END 3
-
-#define STATUS_NULL 0
-#define STATUS_END_REACHED 1
-#define STATUS_BEGIN_REACHED 2
-
-static void fill_l1distlut(uint8_t lut[])
-{
- int i, j, tmp_i, tmp_j,count;
- uint8_t dist;
-
- for (i = 0, count = 0; i < 242; i++) {
- for (j = i + 1; j < 243; j++, count++) {
- /* ternary distance between i and j */
- dist = 0;
- tmp_i = i; tmp_j = j;
- do {
- dist += FFABS((tmp_j % 3) - (tmp_i % 3));
- tmp_j /= 3;
- tmp_i /= 3;
- } while (tmp_i > 0 || tmp_j > 0);
- lut[count] = dist;
- }
- }
-}
-
-static unsigned int intersection_word(const uint8_t *first, const uint8_t *second)
-{
- unsigned int val=0,i;
- for (i = 0; i < 28; i += 4) {
- val += av_popcount( (first[i] & second[i] ) << 24 |
- (first[i+1] & second[i+1]) << 16 |
- (first[i+2] & second[i+2]) << 8 |
- (first[i+3] & second[i+3]) );
- }
- val += av_popcount( (first[28] & second[28]) << 16 |
- (first[29] & second[29]) << 8 |
- (first[30] & second[30]) );
- return val;
-}
-
-static unsigned int union_word(const uint8_t *first, const uint8_t *second)
-{
- unsigned int val=0,i;
- for (i = 0; i < 28; i += 4) {
- val += av_popcount( (first[i] | second[i] ) << 24 |
- (first[i+1] | second[i+1]) << 16 |
- (first[i+2] | second[i+2]) << 8 |
- (first[i+3] | second[i+3]) );
- }
- val += av_popcount( (first[28] | second[28]) << 16 |
- (first[29] | second[29]) << 8 |
- (first[30] | second[30]) );
- return val;
-}
-
-static unsigned int get_l1dist(AVFilterContext *ctx, SignatureContext *sc, const uint8_t *first, const uint8_t *second)
-{
- unsigned int i;
- unsigned int dist = 0;
- uint8_t f, s;
-
- for (i = 0; i < SIGELEM_SIZE/5; i++) {
- if (first[i] != second[i]) {
- f = first[i];
- s = second[i];
- if (f > s) {
- /* little variation of gauss sum formula */
- dist += sc->l1distlut[243*242/2 - (243-s)*(242-s)/2 + f - s - 1];
- } else {
- dist += sc->l1distlut[243*242/2 - (243-f)*(242-f)/2 + s - f - 1];
- }
- }
- }
- return dist;
-}
-
-/**
- * calculates the jaccard distance and evaluates a pair of coarse signatures as good
- * @return 0 if pair is bad, 1 otherwise
- */
-static int get_jaccarddist(SignatureContext *sc, CoarseSignature *first, CoarseSignature *second)
-{
- int jaccarddist, i, composdist = 0, cwthcount = 0;
- for (i = 0; i < 5; i++) {
- if ((jaccarddist = intersection_word(first->data[i], second->data[i])) > 0) {
- jaccarddist /= union_word(first->data[i], second->data[i]);
- }
- if (jaccarddist >= sc->thworddist) {
- if (++cwthcount > 2) {
- /* more than half (5/2) of distances are too wide */
- return 0;
- }
- }
- composdist += jaccarddist;
- if (composdist > sc->thcomposdist) {
- return 0;
- }
- }
- return 1;
-}
-
-/**
- * step through the coarsesignatures as long as a good candidate is found
- * @return 0 if no candidate is found, 1 otherwise
- */
-static int find_next_coarsecandidate(SignatureContext *sc, CoarseSignature *secondstart, CoarseSignature **first, CoarseSignature **second, int start)
-{
- /* go one coarsesignature foreword */
- if (!start) {
- if ((*second)->next) {
- *second = (*second)->next;
- } else if ((*first)->next) {
- *second = secondstart;
- *first = (*first)->next;
- } else {
- return 0;
- }
- }
-
- while (1) {
- if (get_jaccarddist(sc, *first, *second))
- return 1;
-
- /* next signature */
- if ((*second)->next) {
- *second = (*second)->next;
- } else if ((*first)->next) {
- *second = secondstart;
- *first = (*first)->next;
- } else {
- return 0;
- }
- }
-}
-
-/**
- * compares framesignatures and sorts out signatures with a l1 distance above a given threshold.
- * Then tries to find out offset and differences between framerates with a hough transformation
- */
-static MatchingInfo* get_matching_parameters(AVFilterContext *ctx, SignatureContext *sc, FineSignature *first, FineSignature *second)
-{
- FineSignature *f, *s;
- size_t i, j, k, l, hmax = 0, score;
- int framerate, offset, l1dist;
- double m;
- MatchingInfo *cands = NULL, *c = NULL;
-
- struct {
- uint8_t size;
- unsigned int dist;
- FineSignature *a;
- uint8_t b_pos[COARSE_SIZE];
- FineSignature *b[COARSE_SIZE];
- } pairs[COARSE_SIZE];
-
- typedef struct hspace_elem {
- int dist;
- size_t score;
- FineSignature *a;
- FineSignature *b;
- } hspace_elem;
-
- /* houghspace */
- hspace_elem** hspace = av_malloc_array(MAX_FRAMERATE, sizeof(hspace_elem *));
-
- /* initialize houghspace */
- for (i = 0; i < MAX_FRAMERATE; i++) {
- hspace[i] = av_malloc_array(2 * HOUGH_MAX_OFFSET + 1, sizeof(hspace_elem));
- for (j = 0; j < HOUGH_MAX_OFFSET; j++) {
- hspace[i][j].score = 0;
- hspace[i][j].dist = 99999;
- }
- }
-
- /* l1 distances */
- for (i = 0, f = first; i < COARSE_SIZE && f->next; i++, f = f->next) {
- pairs[i].size = 0;
- pairs[i].dist = 99999;
- pairs[i].a = f;
- for (j = 0, s = second; j < COARSE_SIZE && s->next; j++, s = s->next) {
- /* l1 distance of finesignature */
- l1dist = get_l1dist(ctx, sc, f->framesig, s->framesig);
- if (l1dist < sc->thl1) {
- if (l1dist < pairs[i].dist) {
- pairs[i].size = 1;
- pairs[i].dist = l1dist;
- pairs[i].b_pos[0] = j;
- pairs[i].b[0] = s;
- } else if (l1dist == pairs[i].dist) {
- pairs[i].b[pairs[i].size] = s;
- pairs[i].b_pos[pairs[i].size] = j;
- pairs[i].size++;
- }
- }
- }
- }
- /* last incomplete coarsesignature */
- if (f->next == NULL) {
- for (; i < COARSE_SIZE; i++) {
- pairs[i].size = 0;
- pairs[i].dist = 99999;
- }
- }
-
- /* hough transformation */
- for (i = 0; i < COARSE_SIZE; i++) {
- for (j = 0; j < pairs[i].size; j++) {
- for (k = i + 1; k < COARSE_SIZE; k++) {
- for (l = 0; l < pairs[k].size; l++) {
- if (pairs[i].b[j] != pairs[k].b[l]) {
- /* linear regression */
- m = (pairs[k].b_pos[l]-pairs[i].b_pos[j]) / (k-i); /* good value between 0.0 - 2.0 */
- framerate = (int) m*30 + 0.5; /* round up to 0 - 60 */
- if (framerate>0 && framerate <= MAX_FRAMERATE) {
- offset = pairs[i].b_pos[j] - ((int) m*i + 0.5); /* only second part has to be rounded up */
- if (offset > -HOUGH_MAX_OFFSET && offset < HOUGH_MAX_OFFSET) {
- if (pairs[i].dist < pairs[k].dist) {
- if (pairs[i].dist < hspace[framerate-1][offset+HOUGH_MAX_OFFSET].dist) {
- hspace[framerate-1][offset+HOUGH_MAX_OFFSET].dist = pairs[i].dist;
- hspace[framerate-1][offset+HOUGH_MAX_OFFSET].a = pairs[i].a;
- hspace[framerate-1][offset+HOUGH_MAX_OFFSET].b = pairs[i].b[j];
- }
- } else {
- if (pairs[k].dist < hspace[framerate-1][offset+HOUGH_MAX_OFFSET].dist) {
- hspace[framerate-1][offset+HOUGH_MAX_OFFSET].dist = pairs[k].dist;
- hspace[framerate-1][offset+HOUGH_MAX_OFFSET].a = pairs[k].a;
- hspace[framerate-1][offset+HOUGH_MAX_OFFSET].b = pairs[k].b[l];
- }
- }
-
- score = hspace[framerate-1][offset+HOUGH_MAX_OFFSET].score + 1;
- if (score > hmax )
- hmax = score;
- hspace[framerate-1][offset+HOUGH_MAX_OFFSET].score = score;
- }
- }
- }
- }
- }
- }
- }
-
- if (hmax > 0) {
- hmax = (int) (0.7*hmax);
- for (i = 0; i < MAX_FRAMERATE; i++) {
- for (j = 0; j < HOUGH_MAX_OFFSET; j++) {
- if (hmax < hspace[i][j].score) {
- if (c == NULL) {
- c = av_malloc(sizeof(MatchingInfo));
- if (!c)
- av_log(ctx, AV_LOG_FATAL, "Could not allocate memory");
- cands = c;
- } else {
- c->next = av_malloc(sizeof(MatchingInfo));
- if (!c->next)
- av_log(ctx, AV_LOG_FATAL, "Could not allocate memory");
- c = c->next;
- }
- c->framerateratio = (i+1.0) / 30;
- c->score = hspace[i][j].score;
- c->offset = j-90;
- c->first = hspace[i][j].a;
- c->second = hspace[i][j].b;
- c->next = NULL;
-
- /* not used */
- c->meandist = 0;
- c->matchframes = 0;
- c->whole = 0;
- }
- }
- }
- }
- for (i = 0; i < MAX_FRAMERATE; i++) {
- av_freep(&hspace[i]);
- }
- av_freep(&hspace);
- return cands;
-}
-
-static int iterate_frame(double frr, FineSignature **a, FineSignature **b, int fcount, int *bcount, int dir)
-{
- int step;
-
- /* between 1 and 2, because frr is between 1 and 2 */
- step = ((int) 0.5 + fcount * frr) /* current frame */
- -((int) 0.5 + (fcount-1) * frr);/* last frame */
-
- if (dir == DIR_NEXT) {
- if (frr >= 1.0) {
- if ((*a)->next) {
- *a = (*a)->next;
- } else {
- return DIR_NEXT_END;
- }
-
- if (step == 1) {
- if ((*b)->next) {
- *b = (*b)->next;
- (*bcount)++;
- } else {
- return DIR_NEXT_END;
- }
- } else {
- if ((*b)->next && (*b)->next->next) {
- *b = (*b)->next->next;
- (*bcount)++;
- } else {
- return DIR_NEXT_END;
- }
- }
- } else {
- if ((*b)->next) {
- *b = (*b)->next;
- (*bcount)++;
- } else {
- return DIR_NEXT_END;
- }
-
- if (step == 1) {
- if ((*a)->next) {
- *a = (*a)->next;
- } else {
- return DIR_NEXT_END;
- }
- } else {
- if ((*a)->next && (*a)->next->next) {
- *a = (*a)->next->next;
- } else {
- return DIR_NEXT_END;
- }
- }
- }
- return DIR_NEXT;
- } else {
- if (frr >= 1.0) {
- if ((*a)->prev) {
- *a = (*a)->prev;
- } else {
- return DIR_PREV_END;
- }
-
- if (step == 1) {
- if ((*b)->prev) {
- *b = (*b)->prev;
- (*bcount)++;
- } else {
- return DIR_PREV_END;
- }
- } else {
- if ((*b)->prev && (*b)->prev->prev) {
- *b = (*b)->prev->prev;
- (*bcount)++;
- } else {
- return DIR_PREV_END;
- }
- }
- } else {
- if ((*b)->prev) {
- *b = (*b)->prev;
- (*bcount)++;
- } else {
- return DIR_PREV_END;
- }
-
- if (step == 1) {
- if ((*a)->prev) {
- *a = (*a)->prev;
- } else {
- return DIR_PREV_END;
- }
- } else {
- if ((*a)->prev && (*a)->prev->prev) {
- *a = (*a)->prev->prev;
- } else {
- return DIR_PREV_END;
- }
- }
- }
- return DIR_PREV;
- }
-}
-
-static MatchingInfo evaluate_parameters(AVFilterContext *ctx, SignatureContext *sc, MatchingInfo *infos, MatchingInfo bestmatch, int mode)
-{
- int dist, distsum = 0, bcount = 1, dir = DIR_NEXT;
- int fcount = 0, goodfcount = 0, gooda = 0, goodb = 0;
- double meandist, minmeandist = bestmatch.meandist;
- int tolerancecount = 0;
- FineSignature *a, *b, *aprev, *bprev;
- int status = STATUS_NULL;
-
- for (; infos != NULL; infos = infos->next) {
- a = infos->first;
- b = infos->second;
- while (1) {
- dist = get_l1dist(ctx, sc, a->framesig, b->framesig);
-
- if (dist > sc->thl1) {
- if (a->confidence >= 1 || b->confidence >= 1) {
- /* bad frame (because high different information) */
- tolerancecount++;
- }
-
- if (tolerancecount > 2) {
- a = aprev;
- b = bprev;
- if (dir == DIR_NEXT) {
- /* turn around */
- a = infos->first;
- b = infos->second;
- dir = DIR_PREV;
- } else {
- break;
- }
- }
- } else {
- /* good frame */
- distsum += dist;
- goodfcount++;
- tolerancecount=0;
-
- aprev = a;
- bprev = b;
-
- if (a->confidence < 1) gooda++;
- if (b->confidence < 1) goodb++;
- }
-
- fcount++;
-
- dir = iterate_frame(infos->framerateratio, &a, &b, fcount, &bcount, dir);
- if (dir == DIR_NEXT_END) {
- status = STATUS_END_REACHED;
- a = infos->first;
- b = infos->second;
- dir = iterate_frame(infos->framerateratio, &a, &b, fcount, &bcount, DIR_PREV);
- }
-
- if (dir == DIR_PREV_END) {
- status |= STATUS_BEGIN_REACHED;
- break;
- }
-
- if (sc->thdi != 0 && bcount >= sc->thdi) {
- break; /* enough frames found */
- }
- }
-
- if (bcount < sc->thdi)
- continue; /* matching sequence is too short */
- if ((double) goodfcount / (double) fcount < sc->thit)
- continue;
- if ((double) goodfcount*0.5 < FFMAX(gooda, goodb))
- continue;
-
- meandist = (double) goodfcount / (double) distsum;
-
- if (meandist < minmeandist ||
- status == STATUS_END_REACHED | STATUS_BEGIN_REACHED ||
- mode == MODE_FAST){
- minmeandist = meandist;
- /* bestcandidate in this iteration */
- bestmatch.meandist = meandist;
- bestmatch.matchframes = bcount;
- bestmatch.framerateratio = infos->framerateratio;
- bestmatch.score = infos->score;
- bestmatch.offset = infos->offset;
- bestmatch.first = infos->first;
- bestmatch.second = infos->second;
- bestmatch.whole = 0; /* will be set to true later */
- bestmatch.next = NULL;
- }
-
- /* whole sequence is automatically best match */
- if (status == (STATUS_END_REACHED | STATUS_BEGIN_REACHED)) {
- bestmatch.whole = 1;
- break;
- }
-
- /* first matching sequence is enough, finding the best one is not necessary */
- if (mode == MODE_FAST) {
- break;
- }
- }
- return bestmatch;
-}
-
-static void sll_free(MatchingInfo *sll)
-{
- void *tmp;
- while (sll) {
- tmp = sll;
- sll = sll->next;
- av_freep(&tmp);
- }
-}
-
-static MatchingInfo lookup_signatures(AVFilterContext *ctx, SignatureContext *sc, StreamContext *first, StreamContext *second, int mode)
-{
- CoarseSignature *cs, *cs2;
- MatchingInfo *infos;
- MatchingInfo bestmatch;
- MatchingInfo *i;
-
- cs = first->coarsesiglist;
- cs2 = second->coarsesiglist;
-
- /* score of bestmatch is 0, if no match is found */
- bestmatch.score = 0;
- bestmatch.meandist = 99999;
- bestmatch.whole = 0;
-
- fill_l1distlut(sc->l1distlut);
-
- /* stage 1: coarsesignature matching */
- if (find_next_coarsecandidate(sc, second->coarsesiglist, &cs, &cs2, 1) == 0)
- return bestmatch; /* no candidate found */
- do {
- av_log(ctx, AV_LOG_DEBUG, "Stage 1: got coarsesignature pair. "
- "indices of first frame: %"PRIu32" and %"PRIu32"\n",
- cs->first->index, cs2->first->index);
- /* stage 2: l1-distance and hough-transform */
- av_log(ctx, AV_LOG_DEBUG, "Stage 2: calculate matching parameters\n");
- infos = get_matching_parameters(ctx, sc, cs->first, cs2->first);
- if (av_log_get_level() == AV_LOG_DEBUG) {
- for (i = infos; i != NULL; i = i->next) {
- av_log(ctx, AV_LOG_DEBUG, "Stage 2: matching pair at %"PRIu32" and %"PRIu32", "
- "ratio %f, offset %d\n", i->first->index, i->second->index,
- i->framerateratio, i->offset);
- }
- }
- /* stage 3: evaluation */
- av_log(ctx, AV_LOG_DEBUG, "Stage 3: evaluate\n");
- if (infos) {
- bestmatch = evaluate_parameters(ctx, sc, infos, bestmatch, mode);
- av_log(ctx, AV_LOG_DEBUG, "Stage 3: best matching pair at %"PRIu32" and %"PRIu32", "
- "ratio %f, offset %d, score %d, %d frames matching\n",
- bestmatch.first->index, bestmatch.second->index,
- bestmatch.framerateratio, bestmatch.offset, bestmatch.score, bestmatch.matchframes);
- sll_free(infos);
- }
- } while (find_next_coarsecandidate(sc, second->coarsesiglist, &cs, &cs2, 0) && !bestmatch.whole);
- return bestmatch;
-
-}
diff --git a/libavfilter/tinterlace.h b/libavfilter/tinterlace.h
deleted file mode 100644
index 020887f..0000000
--- a/libavfilter/tinterlace.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (c) 2011 Stefano Sabatini
- * Copyright (c) 2010 Baptiste Coudurier
- * Copyright (c) 2003 Michael Zucchi <notzed@ximian.com>
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/**
- * @file
- * temporal field interlace filter, ported from MPlayer/libmpcodecs
- */
-#ifndef AVFILTER_TINTERLACE_H
-#define AVFILTER_TINTERLACE_H
-
-#include "libavutil/bswap.h"
-#include "libavutil/opt.h"
-#include "libavutil/pixdesc.h"
-#include "drawutils.h"
-#include "avfilter.h"
-
-#define TINTERLACE_FLAG_VLPF 01
-#define TINTERLACE_FLAG_CVLPF 2
-#define TINTERLACE_FLAG_EXACT_TB 4
-#define TINTERLACE_FLAG_BYPASS_IL 8
-
-enum VLPFilter {
- VLPF_OFF = 0,
- VLPF_LIN = 1,
- VLPF_CMP = 2,
-};
-
-enum TInterlaceMode {
- MODE_MERGE = 0,
- MODE_DROP_EVEN,
- MODE_DROP_ODD,
- MODE_PAD,
- MODE_INTERLEAVE_TOP,
- MODE_INTERLEAVE_BOTTOM,
- MODE_INTERLACEX2,
- MODE_MERGEX2,
- MODE_NB,
-};
-
-enum InterlaceScanMode {
- MODE_TFF = 0,
- MODE_BFF,
-};
-
-typedef struct TInterlaceContext {
- const AVClass *class;
- int mode; ///< TInterlaceMode, interlace mode selected
- AVRational preout_time_base;
- int flags; ///< flags affecting interlacing algorithm
- int lowpass; ///< legacy interlace filter lowpass mode
- int frame; ///< number of the output frame
- int vsub; ///< chroma vertical subsampling
- AVFrame *cur;
- AVFrame *next;
- uint8_t *black_data[4]; ///< buffer used to fill padded lines
- int black_linesize[4];
- FFDrawContext draw;
- FFDrawColor color;
- const AVPixFmtDescriptor *csp;
- void (*lowpass_line)(uint8_t *dstp, ptrdiff_t width, const uint8_t *srcp,
- ptrdiff_t mref, ptrdiff_t pref, int clip_max);
-} TInterlaceContext;
-
-void ff_tinterlace_init_x86(TInterlaceContext *interlace);
-
-#endif /* AVFILTER_TINTERLACE_H */
diff --git a/libavfilter/vf_blackframe.c b/libavfilter/vf_blackframe.c
deleted file mode 100644
index 804965c..0000000
--- a/libavfilter/vf_blackframe.c
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright (c) 2010 Stefano Sabatini
- * Copyright (c) 2006 Ivo van Poorten
- * Copyright (c) 2006 Julian Hall
- * Copyright (c) 2002-2003 Brian J. Murrell
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/**
- * @file
- * Search for black frames to detect scene transitions.
- * Ported from MPlayer libmpcodecs/vf_blackframe.c.
- */
-
-#include <stdio.h>
-#include <inttypes.h>
-
-#include "libavutil/internal.h"
-#include "libavutil/opt.h"
-#include "avfilter.h"
-#include "formats.h"
-#include "internal.h"
-#include "video.h"
-
-typedef struct BlackFrameContext {
- const AVClass *class;
- int bamount; ///< black amount
- int bthresh; ///< black threshold
- unsigned int frame; ///< frame number
- unsigned int nblack; ///< number of black pixels counted so far
- unsigned int last_keyframe; ///< frame number of the last received key-frame
-} BlackFrameContext;
-
-static int query_formats(AVFilterContext *ctx)
-{
- static const enum AVPixelFormat pix_fmts[] = {
- AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV420P, AV_PIX_FMT_GRAY8, AV_PIX_FMT_NV12,
- AV_PIX_FMT_NV21, AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV411P,
- AV_PIX_FMT_NONE
- };
-
- AVFilterFormats *fmts_list = ff_make_format_list(pix_fmts);
- if (!fmts_list)
- return AVERROR(ENOMEM);
- return ff_set_common_formats(ctx, fmts_list);
-}
-
-#define SET_META(key, format, value) \
- snprintf(buf, sizeof(buf), format, value); \
- av_dict_set(metadata, key, buf, 0)
-
-static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
-{
- AVFilterContext *ctx = inlink->dst;
- BlackFrameContext *s = ctx->priv;
- int x, i;
- int pblack = 0;
- uint8_t *p = frame->data[0];
- AVDictionary **metadata;
- char buf[32];
-
- for (i = 0; i < frame->height; i++) {
- for (x = 0; x < inlink->w; x++)
- s->nblack += p[x] < s->bthresh;
- p += frame->linesize[0];
- }
-
- if (frame->key_frame)
- s->last_keyframe = s->frame;
-
- pblack = s->nblack * 100 / (inlink->w * inlink->h);
- if (pblack >= s->bamount) {
- metadata = &frame->metadata;
-
- av_log(ctx, AV_LOG_INFO, "frame:%u pblack:%u pts:%"PRId64" t:%f "
- "type:%c last_keyframe:%d\n",
- s->frame, pblack, frame->pts,
- frame->pts == AV_NOPTS_VALUE ? -1 : frame->pts * av_q2d(inlink->time_base),
- av_get_picture_type_char(frame->pict_type), s->last_keyframe);
-
- SET_META("lavfi.blackframe.pblack", "%u", pblack);
- }
-
- s->frame++;
- s->nblack = 0;
- return ff_filter_frame(inlink->dst->outputs[0], frame);
-}
-
-#define OFFSET(x) offsetof(BlackFrameContext, x)
-#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
-static const AVOption blackframe_options[] = {
- { "amount", "percentage of the pixels that have to be below the threshold "
- "for the frame to be considered black", OFFSET(bamount), AV_OPT_TYPE_INT, { .i64 = 98 }, 0, 100, FLAGS },
- { "threshold", "threshold below which a pixel value is considered black",
- OFFSET(bthresh), AV_OPT_TYPE_INT, { .i64 = 32 }, 0, 255, FLAGS },
- { "thresh", "threshold below which a pixel value is considered black",
- OFFSET(bthresh), AV_OPT_TYPE_INT, { .i64 = 32 }, 0, 255, FLAGS },
- { NULL }
-};
-
-AVFILTER_DEFINE_CLASS(blackframe);
-
-static const AVFilterPad avfilter_vf_blackframe_inputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- .filter_frame = filter_frame,
- },
- { NULL }
-};
-
-static const AVFilterPad avfilter_vf_blackframe_outputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO
- },
- { NULL }
-};
-
-AVFilter ff_vf_blackframe = {
- .name = "blackframe",
- .description = NULL_IF_CONFIG_SMALL("Detect frames that are (almost) black."),
- .priv_size = sizeof(BlackFrameContext),
- .priv_class = &blackframe_class,
- .query_formats = query_formats,
- .inputs = avfilter_vf_blackframe_inputs,
- .outputs = avfilter_vf_blackframe_outputs,
-};
diff --git a/libavfilter/vf_boxblur.c b/libavfilter/vf_boxblur.c
deleted file mode 100644
index bde7408..0000000
--- a/libavfilter/vf_boxblur.c
+++ /dev/null
@@ -1,317 +0,0 @@
-/*
- * Copyright (c) 2002 Michael Niedermayer <michaelni@gmx.at>
- * Copyright (c) 2011 Stefano Sabatini
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/**
- * @file
- * Apply a boxblur filter to the input video.
- * Ported from MPlayer libmpcodecs/vf_boxblur.c.
- */
-
-#include "libavutil/avstring.h"
-#include "libavutil/common.h"
-#include "libavutil/opt.h"
-#include "avfilter.h"
-#include "formats.h"
-#include "internal.h"
-#include "video.h"
-#include "boxblur.h"
-
-
-typedef struct BoxBlurContext {
- const AVClass *class;
- FilterParam luma_param;
- FilterParam chroma_param;
- FilterParam alpha_param;
-
- int hsub, vsub;
- int radius[4];
- int power[4];
- uint8_t *temp[2]; ///< temporary buffer used in blur_power()
-} BoxBlurContext;
-
-static av_cold void uninit(AVFilterContext *ctx)
-{
- BoxBlurContext *s = ctx->priv;
-
- av_freep(&s->temp[0]);
- av_freep(&s->temp[1]);
-}
-
-static int query_formats(AVFilterContext *ctx)
-{
- AVFilterFormats *formats = NULL;
- int fmt, ret;
-
- for (fmt = 0; av_pix_fmt_desc_get(fmt); fmt++) {
- const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(fmt);
- if (!(desc->flags & (AV_PIX_FMT_FLAG_HWACCEL | AV_PIX_FMT_FLAG_BITSTREAM | AV_PIX_FMT_FLAG_PAL)) &&
- (desc->flags & AV_PIX_FMT_FLAG_PLANAR || desc->nb_components == 1) &&
- (!(desc->flags & AV_PIX_FMT_FLAG_BE) == !HAVE_BIGENDIAN || desc->comp[0].depth == 8) &&
- (ret = ff_add_format(&formats, fmt)) < 0)
- return ret;
- }
-
- return ff_set_common_formats(ctx, formats);
-}
-
-static int config_input(AVFilterLink *inlink)
-{
- const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
- AVFilterContext *ctx = inlink->dst;
- BoxBlurContext *s = ctx->priv;
- int w = inlink->w, h = inlink->h;
- int ret;
-
- if (!(s->temp[0] = av_malloc(2*FFMAX(w, h))) ||
- !(s->temp[1] = av_malloc(2*FFMAX(w, h))))
- return AVERROR(ENOMEM);
-
- s->hsub = desc->log2_chroma_w;
- s->vsub = desc->log2_chroma_h;
-
- ret = ff_boxblur_eval_filter_params(inlink,
- &s->luma_param,
- &s->chroma_param,
- &s->alpha_param);
-
- if (ret != 0) {
- av_log(ctx, AV_LOG_ERROR, "Failed to evaluate "
- "filter params: %d.\n", ret);
- return ret;
- }
-
- s->radius[Y] = s->luma_param.radius;
- s->radius[U] = s->radius[V] = s->chroma_param.radius;
- s->radius[A] = s->alpha_param.radius;
-
- s->power[Y] = s->luma_param.power;
- s->power[U] = s->power[V] = s->chroma_param.power;
- s->power[A] = s->alpha_param.power;
-
- return 0;
-}
-
-/* Naive boxblur would sum source pixels from x-radius .. x+radius
- * for destination pixel x. That would be O(radius*width).
- * If you now look at what source pixels represent 2 consecutive
- * output pixels, then you see they are almost identical and only
- * differ by 2 pixels, like:
- * src0 111111111
- * dst0 1
- * src1 111111111
- * dst1 1
- * src0-src1 1 -1
- * so when you know one output pixel you can find the next by just adding
- * and subtracting 1 input pixel.
- * The following code adopts this faster variant.
- */
-#define BLUR(type, depth) \
-static inline void blur ## depth(type *dst, int dst_step, const type *src, \
- int src_step, int len, int radius) \
-{ \
- const int length = radius*2 + 1; \
- const int inv = ((1<<16) + length/2)/length; \
- int x, sum = src[radius*src_step]; \
- \
- for (x = 0; x < radius; x++) \
- sum += src[x*src_step]<<1; \
- \
- sum = sum*inv + (1<<15); \
- \
- for (x = 0; x <= radius; x++) { \
- sum += (src[(radius+x)*src_step] - src[(radius-x)*src_step])*inv; \
- dst[x*dst_step] = sum>>16; \
- } \
- \
- for (; x < len-radius; x++) { \
- sum += (src[(radius+x)*src_step] - src[(x-radius-1)*src_step])*inv; \
- dst[x*dst_step] = sum >>16; \
- } \
- \
- for (; x < len; x++) { \
- sum += (src[(2*len-radius-x-1)*src_step] - src[(x-radius-1)*src_step])*inv; \
- dst[x*dst_step] = sum>>16; \
- } \
-}
-
-BLUR(uint8_t, 8)
-BLUR(uint16_t, 16)
-
-#undef BLUR
-
-static inline void blur(uint8_t *dst, int dst_step, const uint8_t *src, int src_step,
- int len, int radius, int pixsize)
-{
- if (pixsize == 1) blur8 (dst, dst_step , src, src_step , len, radius);
- else blur16((uint16_t*)dst, dst_step>>1, (const uint16_t*)src, src_step>>1, len, radius);
-}
-
-static inline void blur_power(uint8_t *dst, int dst_step, const uint8_t *src, int src_step,
- int len, int radius, int power, uint8_t *temp[2], int pixsize)
-{
- uint8_t *a = temp[0], *b = temp[1];
-
- if (radius && power) {
- blur(a, pixsize, src, src_step, len, radius, pixsize);
- for (; power > 2; power--) {
- uint8_t *c;
- blur(b, pixsize, a, pixsize, len, radius, pixsize);
- c = a; a = b; b = c;
- }
- if (power > 1) {
- blur(dst, dst_step, a, pixsize, len, radius, pixsize);
- } else {
- int i;
- if (pixsize == 1) {
- for (i = 0; i < len; i++)
- dst[i*dst_step] = a[i];
- } else
- for (i = 0; i < len; i++)
- *(uint16_t*)(dst + i*dst_step) = ((uint16_t*)a)[i];
- }
- } else {
- int i;
- if (pixsize == 1) {
- for (i = 0; i < len; i++)
- dst[i*dst_step] = src[i*src_step];
- } else
- for (i = 0; i < len; i++)
- *(uint16_t*)(dst + i*dst_step) = *(uint16_t*)(src + i*src_step);
- }
-}
-
-static void hblur(uint8_t *dst, int dst_linesize, const uint8_t *src, int src_linesize,
- int w, int h, int radius, int power, uint8_t *temp[2], int pixsize)
-{
- int y;
-
- if (radius == 0 && dst == src)
- return;
-
- for (y = 0; y < h; y++)
- blur_power(dst + y*dst_linesize, pixsize, src + y*src_linesize, pixsize,
- w, radius, power, temp, pixsize);
-}
-
-static void vblur(uint8_t *dst, int dst_linesize, const uint8_t *src, int src_linesize,
- int w, int h, int radius, int power, uint8_t *temp[2], int pixsize)
-{
- int x;
-
- if (radius == 0 && dst == src)
- return;
-
- for (x = 0; x < w; x++)
- blur_power(dst + x*pixsize, dst_linesize, src + x*pixsize, src_linesize,
- h, radius, power, temp, pixsize);
-}
-
-static int filter_frame(AVFilterLink *inlink, AVFrame *in)
-{
- AVFilterContext *ctx = inlink->dst;
- BoxBlurContext *s = ctx->priv;
- AVFilterLink *outlink = inlink->dst->outputs[0];
- AVFrame *out;
- int plane;
- int cw = AV_CEIL_RSHIFT(inlink->w, s->hsub), ch = AV_CEIL_RSHIFT(in->height, s->vsub);
- int w[4] = { inlink->w, cw, cw, inlink->w };
- int h[4] = { in->height, ch, ch, in->height };
- const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
- const int depth = desc->comp[0].depth;
- const int pixsize = (depth+7)/8;
-
- out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
- if (!out) {
- av_frame_free(&in);
- return AVERROR(ENOMEM);
- }
- av_frame_copy_props(out, in);
-
- for (plane = 0; plane < 4 && in->data[plane] && in->linesize[plane]; plane++)
- hblur(out->data[plane], out->linesize[plane],
- in ->data[plane], in ->linesize[plane],
- w[plane], h[plane], s->radius[plane], s->power[plane],
- s->temp, pixsize);
-
- for (plane = 0; plane < 4 && in->data[plane] && in->linesize[plane]; plane++)
- vblur(out->data[plane], out->linesize[plane],
- out->data[plane], out->linesize[plane],
- w[plane], h[plane], s->radius[plane], s->power[plane],
- s->temp, pixsize);
-
- av_frame_free(&in);
-
- return ff_filter_frame(outlink, out);
-}
-
-#define OFFSET(x) offsetof(BoxBlurContext, x)
-#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
-
-static const AVOption boxblur_options[] = {
- { "luma_radius", "Radius of the luma blurring box", OFFSET(luma_param.radius_expr), AV_OPT_TYPE_STRING, {.str="2"}, .flags = FLAGS },
- { "lr", "Radius of the luma blurring box", OFFSET(luma_param.radius_expr), AV_OPT_TYPE_STRING, {.str="2"}, .flags = FLAGS },
- { "luma_power", "How many times should the boxblur be applied to luma", OFFSET(luma_param.power), AV_OPT_TYPE_INT, {.i64=2}, 0, INT_MAX, .flags = FLAGS },
- { "lp", "How many times should the boxblur be applied to luma", OFFSET(luma_param.power), AV_OPT_TYPE_INT, {.i64=2}, 0, INT_MAX, .flags = FLAGS },
-
- { "chroma_radius", "Radius of the chroma blurring box", OFFSET(chroma_param.radius_expr), AV_OPT_TYPE_STRING, {.str=NULL}, .flags = FLAGS },
- { "cr", "Radius of the chroma blurring box", OFFSET(chroma_param.radius_expr), AV_OPT_TYPE_STRING, {.str=NULL}, .flags = FLAGS },
- { "chroma_power", "How many times should the boxblur be applied to chroma", OFFSET(chroma_param.power), AV_OPT_TYPE_INT, {.i64=-1}, -1, INT_MAX, .flags = FLAGS },
- { "cp", "How many times should the boxblur be applied to chroma", OFFSET(chroma_param.power), AV_OPT_TYPE_INT, {.i64=-1}, -1, INT_MAX, .flags = FLAGS },
-
- { "alpha_radius", "Radius of the alpha blurring box", OFFSET(alpha_param.radius_expr), AV_OPT_TYPE_STRING, {.str=NULL}, .flags = FLAGS },
- { "ar", "Radius of the alpha blurring box", OFFSET(alpha_param.radius_expr), AV_OPT_TYPE_STRING, {.str=NULL}, .flags = FLAGS },
- { "alpha_power", "How many times should the boxblur be applied to alpha", OFFSET(alpha_param.power), AV_OPT_TYPE_INT, {.i64=-1}, -1, INT_MAX, .flags = FLAGS },
- { "ap", "How many times should the boxblur be applied to alpha", OFFSET(alpha_param.power), AV_OPT_TYPE_INT, {.i64=-1}, -1, INT_MAX, .flags = FLAGS },
-
- { NULL }
-};
-
-AVFILTER_DEFINE_CLASS(boxblur);
-
-static const AVFilterPad avfilter_vf_boxblur_inputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- .config_props = config_input,
- .filter_frame = filter_frame,
- },
- { NULL }
-};
-
-static const AVFilterPad avfilter_vf_boxblur_outputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- },
- { NULL }
-};
-
-AVFilter ff_vf_boxblur = {
- .name = "boxblur",
- .description = NULL_IF_CONFIG_SMALL("Blur the input."),
- .priv_size = sizeof(BoxBlurContext),
- .priv_class = &boxblur_class,
- .uninit = uninit,
- .query_formats = query_formats,
- .inputs = avfilter_vf_boxblur_inputs,
- .outputs = avfilter_vf_boxblur_outputs,
- .flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
-};
diff --git a/libavfilter/vf_colormatrix.c b/libavfilter/vf_colormatrix.c
deleted file mode 100644
index 3a02e2b..0000000
--- a/libavfilter/vf_colormatrix.c
+++ /dev/null
@@ -1,520 +0,0 @@
-/*
- * ColorMatrix v2.2 for Avisynth 2.5.x
- *
- * Copyright (C) 2006-2007 Kevin Stone
- *
- * ColorMatrix 1.x is Copyright (C) Wilbert Dijkhof
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
- * License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-/**
- * @file
- * ColorMatrix 2.0 is based on the original ColorMatrix filter by Wilbert
- * Dijkhof. It adds the ability to convert between any of: Rec.709, FCC,
- * Rec.601, and SMPTE 240M. It also makes pre and post clipping optional,
- * adds an option to use scaled or non-scaled coefficients, and more...
- */
-
-#include <float.h>
-#include "avfilter.h"
-#include "formats.h"
-#include "internal.h"
-#include "video.h"
-#include "libavutil/opt.h"
-#include "libavutil/pixdesc.h"
-#include "libavutil/avstring.h"
-
-#define NS(n) ((n) < 0 ? (int)((n)*65536.0-0.5+DBL_EPSILON) : (int)((n)*65536.0+0.5))
-#define CB(n) av_clip_uint8(n)
-
-static const double yuv_coeff_luma[5][3] = {
- { +0.7152, +0.0722, +0.2126 }, // Rec.709 (0)
- { +0.5900, +0.1100, +0.3000 }, // FCC (1)
- { +0.5870, +0.1140, +0.2990 }, // Rec.601 (ITU-R BT.470-2/SMPTE 170M) (2)
- { +0.7010, +0.0870, +0.2120 }, // SMPTE 240M (3)
- { +0.6780, +0.0593, +0.2627 }, // Rec.2020 (4)
-};
-
-enum ColorMode {
- COLOR_MODE_NONE = -1,
- COLOR_MODE_BT709,
- COLOR_MODE_FCC,
- COLOR_MODE_BT601,
- COLOR_MODE_SMPTE240M,
- COLOR_MODE_BT2020,
- COLOR_MODE_COUNT
-};
-
-typedef struct ColorMatrixContext {
- const AVClass *class;
- int yuv_convert[25][3][3];
- int interlaced;
- int source, dest; ///< ColorMode
- int mode;
- int hsub, vsub;
-} ColorMatrixContext;
-
-typedef struct ThreadData {
- AVFrame *dst;
- const AVFrame *src;
- int c2;
- int c3;
- int c4;
- int c5;
- int c6;
- int c7;
-} ThreadData;
-
-#define OFFSET(x) offsetof(ColorMatrixContext, x)
-#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
-
-static const AVOption colormatrix_options[] = {
- { "src", "set source color matrix", OFFSET(source), AV_OPT_TYPE_INT, {.i64=COLOR_MODE_NONE}, COLOR_MODE_NONE, COLOR_MODE_COUNT-1, .flags=FLAGS, .unit="color_mode" },
- { "dst", "set destination color matrix", OFFSET(dest), AV_OPT_TYPE_INT, {.i64=COLOR_MODE_NONE}, COLOR_MODE_NONE, COLOR_MODE_COUNT-1, .flags=FLAGS, .unit="color_mode" },
- { "bt709", "set BT.709 colorspace", 0, AV_OPT_TYPE_CONST, {.i64=COLOR_MODE_BT709}, .flags=FLAGS, .unit="color_mode" },
- { "fcc", "set FCC colorspace ", 0, AV_OPT_TYPE_CONST, {.i64=COLOR_MODE_FCC}, .flags=FLAGS, .unit="color_mode" },
- { "bt601", "set BT.601 colorspace", 0, AV_OPT_TYPE_CONST, {.i64=COLOR_MODE_BT601}, .flags=FLAGS, .unit="color_mode" },
- { "bt470", "set BT.470 colorspace", 0, AV_OPT_TYPE_CONST, {.i64=COLOR_MODE_BT601}, .flags=FLAGS, .unit="color_mode" },
- { "bt470bg", "set BT.470 colorspace", 0, AV_OPT_TYPE_CONST, {.i64=COLOR_MODE_BT601}, .flags=FLAGS, .unit="color_mode" },
- { "smpte170m", "set SMTPE-170M colorspace", 0, AV_OPT_TYPE_CONST, {.i64=COLOR_MODE_BT601}, .flags=FLAGS, .unit="color_mode" },
- { "smpte240m", "set SMPTE-240M colorspace", 0, AV_OPT_TYPE_CONST, {.i64=COLOR_MODE_SMPTE240M}, .flags=FLAGS, .unit="color_mode" },
- { "bt2020", "set BT.2020 colorspace", 0, AV_OPT_TYPE_CONST, {.i64=COLOR_MODE_BT2020}, .flags=FLAGS, .unit="color_mode" },
- { NULL }
-};
-
-AVFILTER_DEFINE_CLASS(colormatrix);
-
-#define ma m[0][0]
-#define mb m[0][1]
-#define mc m[0][2]
-#define md m[1][0]
-#define me m[1][1]
-#define mf m[1][2]
-#define mg m[2][0]
-#define mh m[2][1]
-#define mi m[2][2]
-
-#define ima im[0][0]
-#define imb im[0][1]
-#define imc im[0][2]
-#define imd im[1][0]
-#define ime im[1][1]
-#define imf im[1][2]
-#define img im[2][0]
-#define imh im[2][1]
-#define imi im[2][2]
-
-static void inverse3x3(double im[3][3], double m[3][3])
-{
- double det = ma * (me * mi - mf * mh) - mb * (md * mi - mf * mg) + mc * (md * mh - me * mg);
- det = 1.0 / det;
- ima = det * (me * mi - mf * mh);
- imb = det * (mc * mh - mb * mi);
- imc = det * (mb * mf - mc * me);
- imd = det * (mf * mg - md * mi);
- ime = det * (ma * mi - mc * mg);
- imf = det * (mc * md - ma * mf);
- img = det * (md * mh - me * mg);
- imh = det * (mb * mg - ma * mh);
- imi = det * (ma * me - mb * md);
-}
-
-static void solve_coefficients(double cm[3][3], double rgb[3][3], double yuv[3][3])
-{
- int i, j;
- for (i = 0; i < 3; i++)
- for (j = 0; j < 3; j++)
- cm[i][j] = yuv[i][0] * rgb[0][j] + yuv[i][1] * rgb[1][j] + yuv[i][2] * rgb[2][j];
-}
-
-static void calc_coefficients(AVFilterContext *ctx)
-{
- ColorMatrixContext *color = ctx->priv;
- double yuv_coeff[5][3][3];
- double rgb_coeffd[5][3][3];
- double yuv_convertd[25][3][3];
- double bscale, rscale;
- int v = 0;
- int i, j, k;
- for (i = 0; i < 5; i++) {
- yuv_coeff[i][0][0] = yuv_coeff_luma[i][0];
- yuv_coeff[i][0][1] = yuv_coeff_luma[i][1];
- yuv_coeff[i][0][2] = yuv_coeff_luma[i][2];
- bscale = 0.5 / (yuv_coeff[i][0][1] - 1.0);
- rscale = 0.5 / (yuv_coeff[i][0][2] - 1.0);
- yuv_coeff[i][1][0] = bscale * yuv_coeff[i][0][0];
- yuv_coeff[i][1][1] = 0.5;
- yuv_coeff[i][1][2] = bscale * yuv_coeff[i][0][2];
- yuv_coeff[i][2][0] = rscale * yuv_coeff[i][0][0];
- yuv_coeff[i][2][1] = rscale * yuv_coeff[i][0][1];
- yuv_coeff[i][2][2] = 0.5;
- }
- for (i = 0; i < 5; i++)
- inverse3x3(rgb_coeffd[i], yuv_coeff[i]);
- for (i = 0; i < 5; i++) {
- for (j = 0; j < 5; j++) {
- solve_coefficients(yuv_convertd[v], rgb_coeffd[i], yuv_coeff[j]);
- for (k = 0; k < 3; k++) {
- color->yuv_convert[v][k][0] = NS(yuv_convertd[v][k][0]);
- color->yuv_convert[v][k][1] = NS(yuv_convertd[v][k][1]);
- color->yuv_convert[v][k][2] = NS(yuv_convertd[v][k][2]);
- }
- if (color->yuv_convert[v][0][0] != 65536 || color->yuv_convert[v][1][0] != 0 ||
- color->yuv_convert[v][2][0] != 0) {
- av_log(ctx, AV_LOG_ERROR, "error calculating conversion coefficients\n");
- }
- v++;
- }
- }
-}
-
-static const char * const color_modes[] = {"bt709", "fcc", "bt601", "smpte240m", "bt2020"};
-
-static av_cold int init(AVFilterContext *ctx)
-{
- ColorMatrixContext *color = ctx->priv;
-
- if (color->dest == COLOR_MODE_NONE) {
- av_log(ctx, AV_LOG_ERROR, "Unspecified destination color space\n");
- return AVERROR(EINVAL);
- }
-
- if (color->source == color->dest) {
- av_log(ctx, AV_LOG_ERROR, "Source and destination color space must not be identical\n");
- return AVERROR(EINVAL);
- }
-
- calc_coefficients(ctx);
-
- return 0;
-}
-
-static int process_slice_uyvy422(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
-{
- const ThreadData *td = arg;
- const AVFrame *src = td->src;
- AVFrame *dst = td->dst;
- const int height = src->height;
- const int width = src->width*2;
- const int src_pitch = src->linesize[0];
- const int dst_pitch = dst->linesize[0];
- const int slice_start = (height * jobnr ) / nb_jobs;
- const int slice_end = (height * (jobnr+1)) / nb_jobs;
- const unsigned char *srcp = src->data[0] + slice_start * src_pitch;
- unsigned char *dstp = dst->data[0] + slice_start * dst_pitch;
- const int c2 = td->c2;
- const int c3 = td->c3;
- const int c4 = td->c4;
- const int c5 = td->c5;
- const int c6 = td->c6;
- const int c7 = td->c7;
- int x, y;
-
- for (y = slice_start; y < slice_end; y++) {
- for (x = 0; x < width; x += 4) {
- const int u = srcp[x + 0] - 128;
- const int v = srcp[x + 2] - 128;
- const int uvval = c2 * u + c3 * v + 1081344;
- dstp[x + 0] = CB((c4 * u + c5 * v + 8421376) >> 16);
- dstp[x + 1] = CB((65536 * (srcp[x + 1] - 16) + uvval) >> 16);
- dstp[x + 2] = CB((c6 * u + c7 * v + 8421376) >> 16);
- dstp[x + 3] = CB((65536 * (srcp[x + 3] - 16) + uvval) >> 16);
- }
- srcp += src_pitch;
- dstp += dst_pitch;
- }
-
- return 0;
-}
-
-static int process_slice_yuv444p(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
-{
- const ThreadData *td = arg;
- const AVFrame *src = td->src;
- AVFrame *dst = td->dst;
- const int height = src->height;
- const int width = src->width;
- const int slice_start = (height * jobnr ) / nb_jobs;
- const int slice_end = (height * (jobnr+1)) / nb_jobs;
- const int src_pitchY = src->linesize[0];
- const int src_pitchUV = src->linesize[1];
- const unsigned char *srcpU = src->data[1] + slice_start * src_pitchUV;
- const unsigned char *srcpV = src->data[2] + slice_start * src_pitchUV;
- const unsigned char *srcpY = src->data[0] + slice_start * src_pitchY;
- const int dst_pitchY = dst->linesize[0];
- const int dst_pitchUV = dst->linesize[1];
- unsigned char *dstpU = dst->data[1] + slice_start * dst_pitchUV;
- unsigned char *dstpV = dst->data[2] + slice_start * dst_pitchUV;
- unsigned char *dstpY = dst->data[0] + slice_start * dst_pitchY;
- const int c2 = td->c2;
- const int c3 = td->c3;
- const int c4 = td->c4;
- const int c5 = td->c5;
- const int c6 = td->c6;
- const int c7 = td->c7;
- int x, y;
-
- for (y = slice_start; y < slice_end; y++) {
- for (x = 0; x < width; x++) {
- const int u = srcpU[x] - 128;
- const int v = srcpV[x] - 128;
- const int uvval = c2 * u + c3 * v + 1081344;
- dstpY[x] = CB((65536 * (srcpY[x] - 16) + uvval) >> 16);
- dstpU[x] = CB((c4 * u + c5 * v + 8421376) >> 16);
- dstpV[x] = CB((c6 * u + c7 * v + 8421376) >> 16);
- }
- srcpY += src_pitchY;
- dstpY += dst_pitchY;
- srcpU += src_pitchUV;
- srcpV += src_pitchUV;
- dstpU += dst_pitchUV;
- dstpV += dst_pitchUV;
- }
-
- return 0;
-}
-
-static int process_slice_yuv422p(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
-{
- const ThreadData *td = arg;
- const AVFrame *src = td->src;
- AVFrame *dst = td->dst;
- const int height = src->height;
- const int width = src->width;
- const int slice_start = (height * jobnr ) / nb_jobs;
- const int slice_end = (height * (jobnr+1)) / nb_jobs;
- const int src_pitchY = src->linesize[0];
- const int src_pitchUV = src->linesize[1];
- const unsigned char *srcpU = src->data[1] + slice_start * src_pitchUV;
- const unsigned char *srcpV = src->data[2] + slice_start * src_pitchUV;
- const unsigned char *srcpY = src->data[0] + slice_start * src_pitchY;
- const int dst_pitchY = dst->linesize[0];
- const int dst_pitchUV = dst->linesize[1];
- unsigned char *dstpU = dst->data[1] + slice_start * dst_pitchUV;
- unsigned char *dstpV = dst->data[2] + slice_start * dst_pitchUV;
- unsigned char *dstpY = dst->data[0] + slice_start * dst_pitchY;
- const int c2 = td->c2;
- const int c3 = td->c3;
- const int c4 = td->c4;
- const int c5 = td->c5;
- const int c6 = td->c6;
- const int c7 = td->c7;
- int x, y;
-
- for (y = slice_start; y < slice_end; y++) {
- for (x = 0; x < width; x += 2) {
- const int u = srcpU[x >> 1] - 128;
- const int v = srcpV[x >> 1] - 128;
- const int uvval = c2 * u + c3 * v + 1081344;
- dstpY[x + 0] = CB((65536 * (srcpY[x + 0] - 16) + uvval) >> 16);
- dstpY[x + 1] = CB((65536 * (srcpY[x + 1] - 16) + uvval) >> 16);
- dstpU[x >> 1] = CB((c4 * u + c5 * v + 8421376) >> 16);
- dstpV[x >> 1] = CB((c6 * u + c7 * v + 8421376) >> 16);
- }
- srcpY += src_pitchY;
- dstpY += dst_pitchY;
- srcpU += src_pitchUV;
- srcpV += src_pitchUV;
- dstpU += dst_pitchUV;
- dstpV += dst_pitchUV;
- }
-
- return 0;
-}
-
-static int process_slice_yuv420p(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
-{
- const ThreadData *td = arg;
- const AVFrame *src = td->src;
- AVFrame *dst = td->dst;
- const int height = FFALIGN(src->height, 2) >> 1;
- const int width = src->width;
- const int slice_start = ((height * jobnr ) / nb_jobs) << 1;
- const int slice_end = ((height * (jobnr+1)) / nb_jobs) << 1;
- const int src_pitchY = src->linesize[0];
- const int src_pitchUV = src->linesize[1];
- const int dst_pitchY = dst->linesize[0];
- const int dst_pitchUV = dst->linesize[1];
- const unsigned char *srcpY = src->data[0] + src_pitchY * slice_start;
- const unsigned char *srcpU = src->data[1] + src_pitchUV * (slice_start >> 1);
- const unsigned char *srcpV = src->data[2] + src_pitchUV * (slice_start >> 1);
- const unsigned char *srcpN = src->data[0] + src_pitchY * (slice_start + 1);
- unsigned char *dstpU = dst->data[1] + dst_pitchUV * (slice_start >> 1);
- unsigned char *dstpV = dst->data[2] + dst_pitchUV * (slice_start >> 1);
- unsigned char *dstpY = dst->data[0] + dst_pitchY * slice_start;
- unsigned char *dstpN = dst->data[0] + dst_pitchY * (slice_start + 1);
- const int c2 = td->c2;
- const int c3 = td->c3;
- const int c4 = td->c4;
- const int c5 = td->c5;
- const int c6 = td->c6;
- const int c7 = td->c7;
- int x, y;
-
- for (y = slice_start; y < slice_end; y += 2) {
- for (x = 0; x < width; x += 2) {
- const int u = srcpU[x >> 1] - 128;
- const int v = srcpV[x >> 1] - 128;
- const int uvval = c2 * u + c3 * v + 1081344;
- dstpY[x + 0] = CB((65536 * (srcpY[x + 0] - 16) + uvval) >> 16);
- dstpY[x + 1] = CB((65536 * (srcpY[x + 1] - 16) + uvval) >> 16);
- dstpN[x + 0] = CB((65536 * (srcpN[x + 0] - 16) + uvval) >> 16);
- dstpN[x + 1] = CB((65536 * (srcpN[x + 1] - 16) + uvval) >> 16);
- dstpU[x >> 1] = CB((c4 * u + c5 * v + 8421376) >> 16);
- dstpV[x >> 1] = CB((c6 * u + c7 * v + 8421376) >> 16);
- }
- srcpY += src_pitchY << 1;
- dstpY += dst_pitchY << 1;
- srcpN += src_pitchY << 1;
- dstpN += dst_pitchY << 1;
- srcpU += src_pitchUV;
- srcpV += src_pitchUV;
- dstpU += dst_pitchUV;
- dstpV += dst_pitchUV;
- }
-
- return 0;
-}
-
-static int config_input(AVFilterLink *inlink)
-{
- AVFilterContext *ctx = inlink->dst;
- ColorMatrixContext *color = ctx->priv;
- const AVPixFmtDescriptor *pix_desc = av_pix_fmt_desc_get(inlink->format);
-
- color->hsub = pix_desc->log2_chroma_w;
- color->vsub = pix_desc->log2_chroma_h;
-
- av_log(ctx, AV_LOG_VERBOSE, "%s -> %s\n",
- color_modes[color->source], color_modes[color->dest]);
-
- return 0;
-}
-
-static int query_formats(AVFilterContext *ctx)
-{
- static const enum AVPixelFormat pix_fmts[] = {
- AV_PIX_FMT_YUV444P,
- AV_PIX_FMT_YUV422P,
- AV_PIX_FMT_YUV420P,
- AV_PIX_FMT_UYVY422,
- AV_PIX_FMT_NONE
- };
- AVFilterFormats *fmts_list = ff_make_format_list(pix_fmts);
- if (!fmts_list)
- return AVERROR(ENOMEM);
- return ff_set_common_formats(ctx, fmts_list);
-}
-
-static int filter_frame(AVFilterLink *link, AVFrame *in)
-{
- AVFilterContext *ctx = link->dst;
- ColorMatrixContext *color = ctx->priv;
- AVFilterLink *outlink = ctx->outputs[0];
- AVFrame *out;
- ThreadData td = {0};
-
- out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
- if (!out) {
- av_frame_free(&in);
- return AVERROR(ENOMEM);
- }
- av_frame_copy_props(out, in);
-
- if (color->source == COLOR_MODE_NONE) {
- enum AVColorSpace cs = in->colorspace;
- enum ColorMode source;
-
- switch(cs) {
- case AVCOL_SPC_BT709 : source = COLOR_MODE_BT709 ; break;
- case AVCOL_SPC_FCC : source = COLOR_MODE_FCC ; break;
- case AVCOL_SPC_SMPTE240M : source = COLOR_MODE_SMPTE240M ; break;
- case AVCOL_SPC_BT470BG : source = COLOR_MODE_BT601 ; break;
- case AVCOL_SPC_SMPTE170M : source = COLOR_MODE_BT601 ; break;
- case AVCOL_SPC_BT2020_NCL: source = COLOR_MODE_BT2020 ; break;
- case AVCOL_SPC_BT2020_CL : source = COLOR_MODE_BT2020 ; break;
- default :
- av_log(ctx, AV_LOG_ERROR, "Input frame does not specify a supported colorspace, and none has been specified as source either\n");
- av_frame_free(&out);
- return AVERROR(EINVAL);
- }
- color->mode = source * 5 + color->dest;
- } else
- color->mode = color->source * 5 + color->dest;
-
- switch(color->dest) {
- case COLOR_MODE_BT709 : out->colorspace = AVCOL_SPC_BT709 ; break;
- case COLOR_MODE_FCC : out->colorspace = AVCOL_SPC_FCC ; break;
- case COLOR_MODE_SMPTE240M: out->colorspace = AVCOL_SPC_SMPTE240M ; break;
- case COLOR_MODE_BT601 : out->colorspace = AVCOL_SPC_BT470BG ; break;
- case COLOR_MODE_BT2020 : out->colorspace = AVCOL_SPC_BT2020_NCL; break;
- }
-
- td.src = in;
- td.dst = out;
- td.c2 = color->yuv_convert[color->mode][0][1];
- td.c3 = color->yuv_convert[color->mode][0][2];
- td.c4 = color->yuv_convert[color->mode][1][1];
- td.c5 = color->yuv_convert[color->mode][1][2];
- td.c6 = color->yuv_convert[color->mode][2][1];
- td.c7 = color->yuv_convert[color->mode][2][2];
-
- if (in->format == AV_PIX_FMT_YUV444P)
- ctx->internal->execute(ctx, process_slice_yuv444p, &td, NULL,
- FFMIN(in->height, ff_filter_get_nb_threads(ctx)));
- else if (in->format == AV_PIX_FMT_YUV422P)
- ctx->internal->execute(ctx, process_slice_yuv422p, &td, NULL,
- FFMIN(in->height, ff_filter_get_nb_threads(ctx)));
- else if (in->format == AV_PIX_FMT_YUV420P)
- ctx->internal->execute(ctx, process_slice_yuv420p, &td, NULL,
- FFMIN(in->height / 2, ff_filter_get_nb_threads(ctx)));
- else
- ctx->internal->execute(ctx, process_slice_uyvy422, &td, NULL,
- FFMIN(in->height, ff_filter_get_nb_threads(ctx)));
-
- av_frame_free(&in);
- return ff_filter_frame(outlink, out);
-}
-
-static const AVFilterPad colormatrix_inputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- .config_props = config_input,
- .filter_frame = filter_frame,
- },
- { NULL }
-};
-
-static const AVFilterPad colormatrix_outputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- },
- { NULL }
-};
-
-AVFilter ff_vf_colormatrix = {
- .name = "colormatrix",
- .description = NULL_IF_CONFIG_SMALL("Convert color matrix."),
- .priv_size = sizeof(ColorMatrixContext),
- .init = init,
- .query_formats = query_formats,
- .inputs = colormatrix_inputs,
- .outputs = colormatrix_outputs,
- .priv_class = &colormatrix_class,
- .flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC | AVFILTER_FLAG_SLICE_THREADS,
-};
diff --git a/libavfilter/vf_cover_rect.c b/libavfilter/vf_cover_rect.c
deleted file mode 100644
index 898debf..0000000
--- a/libavfilter/vf_cover_rect.c
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * Copyright (c) 2014-2015 Michael Niedermayer <michaelni@gmx.at>
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/**
- * @todo switch to dualinput
- */
-
-#include "libavutil/avassert.h"
-#include "libavutil/imgutils.h"
-#include "libavutil/opt.h"
-#include "internal.h"
-
-#include "lavfutils.h"
-
-enum mode {
- MODE_COVER,
- MODE_BLUR,
- NB_MODES
-};
-
-typedef struct CoverContext {
- AVClass *class;
- int mode;
- char *cover_filename;
- AVFrame *cover_frame;
- int width, height;
-} CoverContext;
-
-#define OFFSET(x) offsetof(CoverContext, x)
-#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
-static const AVOption cover_rect_options[] = {
- { "cover", "cover bitmap filename", OFFSET(cover_filename), AV_OPT_TYPE_STRING, {.str = NULL}, .flags = FLAGS },
- { "mode", "set removal mode", OFFSET(mode), AV_OPT_TYPE_INT, {.i64 = MODE_BLUR}, 0, NB_MODES - 1, FLAGS, "mode" },
- { "cover", "cover area with bitmap", 0, AV_OPT_TYPE_CONST, {.i64 = MODE_COVER}, INT_MIN, INT_MAX, FLAGS, "mode" },
- { "blur", "blur area", 0, AV_OPT_TYPE_CONST, {.i64 = MODE_BLUR}, INT_MIN, INT_MAX, FLAGS, "mode" },
- { NULL }
-};
-
-AVFILTER_DEFINE_CLASS(cover_rect);
-
-static int query_formats(AVFilterContext *ctx)
-{
- static const enum AVPixelFormat pix_fmts[] = {
- AV_PIX_FMT_YUV420P,
- AV_PIX_FMT_YUVJ420P,
- AV_PIX_FMT_NONE
- };
-
- return ff_set_common_formats(ctx, ff_make_format_list(pix_fmts));
-}
-
-static int config_input(AVFilterLink *inlink)
-{
- return 0;
-}
-
-static void cover_rect(CoverContext *cover, AVFrame *in, int offx, int offy)
-{
- int x, y, p;
-
- for (p = 0; p < 3; p++) {
- uint8_t *data = in->data[p] + (offx>>!!p) + (offy>>!!p) * in->linesize[p];
- const uint8_t *src = cover->cover_frame->data[p];
- int w = AV_CEIL_RSHIFT(cover->cover_frame->width , !!p);
- int h = AV_CEIL_RSHIFT(cover->cover_frame->height, !!p);
- for (y = 0; y < h; y++) {
- for (x = 0; x < w; x++) {
- data[x] = src[x];
- }
- data += in->linesize[p];
- src += cover->cover_frame->linesize[p];
- }
- }
-}
-static void blur(CoverContext *cover, AVFrame *in, int offx, int offy)
-{
- int x, y, p;
-
- for (p=0; p<3; p++) {
- int ox = offx>>!!p;
- int oy = offy>>!!p;
- int stride = in->linesize[p];
- uint8_t *data = in->data[p] + ox + oy * stride;
- int w = AV_CEIL_RSHIFT(cover->width , !!p);
- int h = AV_CEIL_RSHIFT(cover->height, !!p);
- int iw = AV_CEIL_RSHIFT(in->width , !!p);
- int ih = AV_CEIL_RSHIFT(in->height, !!p);
- for (y = 0; y < h; y++) {
- for (x = 0; x < w; x++) {
- int c = 0;
- int s = 0;
- if (ox) {
- int scale = 65536 / (x + 1);
- s += data[-1 + y*stride] * scale;
- c += scale;
- }
- if (oy) {
- int scale = 65536 / (y + 1);
- s += data[x - stride] * scale;
- c += scale;
- }
- if (ox + w < iw) {
- int scale = 65536 / (w - x);
- s += data[w + y*stride] * scale;
- c += scale;
- }
- if (oy + h < ih) {
- int scale = 65536 / (h - y);
- s += data[x + h*stride] * scale;
- c += scale;
- }
- data[x + y*stride] = c ? (s + (c>>1)) / c : 0;
- }
- }
- }
-}
-
-static int filter_frame(AVFilterLink *inlink, AVFrame *in)
-{
- AVFilterContext *ctx = inlink->dst;
- CoverContext *cover = ctx->priv;
- AVDictionaryEntry *ex, *ey, *ew, *eh;
- int x = -1, y = -1, w = -1, h = -1;
- char *xendptr = NULL, *yendptr = NULL, *wendptr = NULL, *hendptr = NULL;
-
- ex = av_dict_get(in->metadata, "lavfi.rect.x", NULL, AV_DICT_MATCH_CASE);
- ey = av_dict_get(in->metadata, "lavfi.rect.y", NULL, AV_DICT_MATCH_CASE);
- ew = av_dict_get(in->metadata, "lavfi.rect.w", NULL, AV_DICT_MATCH_CASE);
- eh = av_dict_get(in->metadata, "lavfi.rect.h", NULL, AV_DICT_MATCH_CASE);
- if (ex && ey && ew && eh) {
- x = strtol(ex->value, &xendptr, 10);
- y = strtol(ey->value, ¥dptr, 10);
- w = strtol(ew->value, &wendptr, 10);
- h = strtol(eh->value, &hendptr, 10);
- }
-
- if (!xendptr || *xendptr || !yendptr || *yendptr ||
- !wendptr || *wendptr || !hendptr || *hendptr
- ) {
- return ff_filter_frame(ctx->outputs[0], in);
- }
-
- if (x < 0) {
- w += x;
- x = 0;
- }
- if (y < 0) {
- h += y;
- y = 0;
- }
- w = FFMIN(w, in->width - x);
- h = FFMIN(h, in->height - y);
-
- if (w > in->width || h > in->height || w <= 0 || h <= 0)
- return AVERROR(EINVAL);
-
- if (cover->cover_frame) {
- if (w != cover->cover_frame->width || h != cover->cover_frame->height)
- return AVERROR(EINVAL);
- }
-
- cover->width = w;
- cover->height = h;
-
- x = av_clip(x, 0, in->width - w);
- y = av_clip(y, 0, in->height - h);
-
- av_frame_make_writable(in);
-
- if (cover->mode == MODE_BLUR) {
- blur (cover, in, x, y);
- } else {
- cover_rect(cover, in, x, y);
- }
- return ff_filter_frame(ctx->outputs[0], in);
-}
-
-static av_cold void uninit(AVFilterContext *ctx)
-{
- CoverContext *cover = ctx->priv;
-
- if (cover->cover_frame)
- av_freep(&cover->cover_frame->data[0]);
- av_frame_free(&cover->cover_frame);
-}
-
-static av_cold int init(AVFilterContext *ctx)
-{
- CoverContext *cover = ctx->priv;
- int ret;
-
- if (cover->mode == MODE_COVER) {
- if (!cover->cover_filename) {
- av_log(ctx, AV_LOG_ERROR, "cover filename not set\n");
- return AVERROR(EINVAL);
- }
-
- cover->cover_frame = av_frame_alloc();
- if (!cover->cover_frame)
- return AVERROR(ENOMEM);
-
- if ((ret = ff_load_image(cover->cover_frame->data, cover->cover_frame->linesize,
- &cover->cover_frame->width, &cover->cover_frame->height,
- &cover->cover_frame->format, cover->cover_filename, ctx)) < 0)
- return ret;
-
- if (cover->cover_frame->format != AV_PIX_FMT_YUV420P && cover->cover_frame->format != AV_PIX_FMT_YUVJ420P) {
- av_log(ctx, AV_LOG_ERROR, "cover image is not a YUV420 image\n");
- return AVERROR(EINVAL);
- }
- }
-
- return 0;
-}
-
-static const AVFilterPad cover_rect_inputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- .config_props = config_input,
- .filter_frame = filter_frame,
- },
- { NULL }
-};
-
-static const AVFilterPad cover_rect_outputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- },
- { NULL }
-};
-
-AVFilter ff_vf_cover_rect = {
- .name = "cover_rect",
- .description = NULL_IF_CONFIG_SMALL("Find and cover a user specified object."),
- .priv_size = sizeof(CoverContext),
- .init = init,
- .uninit = uninit,
- .query_formats = query_formats,
- .inputs = cover_rect_inputs,
- .outputs = cover_rect_outputs,
- .priv_class = &cover_rect_class,
-};
diff --git a/libavfilter/vf_cropdetect.c b/libavfilter/vf_cropdetect.c
deleted file mode 100644
index 7c7d0b9..0000000
--- a/libavfilter/vf_cropdetect.c
+++ /dev/null
@@ -1,285 +0,0 @@
-/*
- * Copyright (c) 2002 A'rpi
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/**
- * @file
- * border detection filter
- * Ported from MPlayer libmpcodecs/vf_cropdetect.c.
- */
-
-#include "libavutil/imgutils.h"
-#include "libavutil/internal.h"
-#include "libavutil/opt.h"
-
-#include "avfilter.h"
-#include "formats.h"
-#include "internal.h"
-#include "video.h"
-
-typedef struct CropDetectContext {
- const AVClass *class;
- int x1, y1, x2, y2;
- float limit;
- int round;
- int reset_count;
- int frame_nb;
- int max_pixsteps[4];
- int max_outliers;
-} CropDetectContext;
-
-static int query_formats(AVFilterContext *ctx)
-{
- static const enum AVPixelFormat pix_fmts[] = {
- AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUVJ420P,
- AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUVJ422P,
- AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUVJ444P,
- AV_PIX_FMT_YUV411P, AV_PIX_FMT_GRAY8,
- AV_PIX_FMT_YUV440P, AV_PIX_FMT_YUV410P,
- AV_PIX_FMT_YUV420P9 , AV_PIX_FMT_YUV422P9 , AV_PIX_FMT_YUV444P9,
- AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10,
- AV_PIX_FMT_YUV420P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV444P12,
- AV_PIX_FMT_YUV420P14, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV444P14,
- AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16,
- AV_PIX_FMT_NV12, AV_PIX_FMT_NV21,
- AV_PIX_FMT_RGB24, AV_PIX_FMT_BGR24,
- AV_PIX_FMT_RGBA, AV_PIX_FMT_BGRA,
- AV_PIX_FMT_NONE
- };
-
- AVFilterFormats *fmts_list = ff_make_format_list(pix_fmts);
- if (!fmts_list)
- return AVERROR(ENOMEM);
- return ff_set_common_formats(ctx, fmts_list);
-}
-
-static int checkline(void *ctx, const unsigned char *src, int stride, int len, int bpp)
-{
- int total = 0;
- int div = len;
- const uint16_t *src16 = (const uint16_t *)src;
-
- switch (bpp) {
- case 1:
- while (len >= 8) {
- total += src[ 0] + src[ stride] + src[2*stride] + src[3*stride]
- + src[4*stride] + src[5*stride] + src[6*stride] + src[7*stride];
- src += 8*stride;
- len -= 8;
- }
- while (--len >= 0) {
- total += src[0];
- src += stride;
- }
- break;
- case 2:
- stride >>= 1;
- while (len >= 8) {
- total += src16[ 0] + src16[ stride] + src16[2*stride] + src16[3*stride]
- + src16[4*stride] + src16[5*stride] + src16[6*stride] + src16[7*stride];
- src16 += 8*stride;
- len -= 8;
- }
- while (--len >= 0) {
- total += src16[0];
- src16 += stride;
- }
- break;
- case 3:
- case 4:
- while (len >= 4) {
- total += src[0] + src[1 ] + src[2 ]
- + src[ stride] + src[1+ stride] + src[2+ stride]
- + src[2*stride] + src[1+2*stride] + src[2+2*stride]
- + src[3*stride] + src[1+3*stride] + src[2+3*stride];
- src += 4*stride;
- len -= 4;
- }
- while (--len >= 0) {
- total += src[0] + src[1] + src[2];
- src += stride;
- }
- div *= 3;
- break;
- }
- total /= div;
-
- av_log(ctx, AV_LOG_DEBUG, "total:%d\n", total);
- return total;
-}
-
-static av_cold int init(AVFilterContext *ctx)
-{
- CropDetectContext *s = ctx->priv;
-
- s->frame_nb = -2;
-
- av_log(ctx, AV_LOG_VERBOSE, "limit:%f round:%d reset_count:%d\n",
- s->limit, s->round, s->reset_count);
-
- return 0;
-}
-
-static int config_input(AVFilterLink *inlink)
-{
- AVFilterContext *ctx = inlink->dst;
- CropDetectContext *s = ctx->priv;
- const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
-
- av_image_fill_max_pixsteps(s->max_pixsteps, NULL, desc);
-
- if (s->limit < 1.0)
- s->limit *= (1 << desc->comp[0].depth) - 1;
-
- s->x1 = inlink->w - 1;
- s->y1 = inlink->h - 1;
- s->x2 = 0;
- s->y2 = 0;
-
- return 0;
-}
-
-#define SET_META(key, value) \
- av_dict_set_int(metadata, key, value, 0)
-
-static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
-{
- AVFilterContext *ctx = inlink->dst;
- CropDetectContext *s = ctx->priv;
- int bpp = s->max_pixsteps[0];
- int w, h, x, y, shrink_by;
- AVDictionary **metadata;
- int outliers, last_y;
- int limit = lrint(s->limit);
-
- // ignore first 2 frames - they may be empty
- if (++s->frame_nb > 0) {
- metadata = &frame->metadata;
-
- // Reset the crop area every reset_count frames, if reset_count is > 0
- if (s->reset_count > 0 && s->frame_nb > s->reset_count) {
- s->x1 = frame->width - 1;
- s->y1 = frame->height - 1;
- s->x2 = 0;
- s->y2 = 0;
- s->frame_nb = 1;
- }
-
-#define FIND(DST, FROM, NOEND, INC, STEP0, STEP1, LEN) \
- outliers = 0;\
- for (last_y = y = FROM; NOEND; y = y INC) {\
- if (checkline(ctx, frame->data[0] + STEP0 * y, STEP1, LEN, bpp) > limit) {\
- if (++outliers > s->max_outliers) { \
- DST = last_y;\
- break;\
- }\
- } else\
- last_y = y INC;\
- }
-
- FIND(s->y1, 0, y < s->y1, +1, frame->linesize[0], bpp, frame->width);
- FIND(s->y2, frame->height - 1, y > FFMAX(s->y2, s->y1), -1, frame->linesize[0], bpp, frame->width);
- FIND(s->x1, 0, y < s->x1, +1, bpp, frame->linesize[0], frame->height);
- FIND(s->x2, frame->width - 1, y > FFMAX(s->x2, s->x1), -1, bpp, frame->linesize[0], frame->height);
-
-
- // round x and y (up), important for yuv colorspaces
- // make sure they stay rounded!
- x = (s->x1+1) & ~1;
- y = (s->y1+1) & ~1;
-
- w = s->x2 - x + 1;
- h = s->y2 - y + 1;
-
- // w and h must be divisible by 2 as well because of yuv
- // colorspace problems.
- if (s->round <= 1)
- s->round = 16;
- if (s->round % 2)
- s->round *= 2;
-
- shrink_by = w % s->round;
- w -= shrink_by;
- x += (shrink_by/2 + 1) & ~1;
-
- shrink_by = h % s->round;
- h -= shrink_by;
- y += (shrink_by/2 + 1) & ~1;
-
- SET_META("lavfi.cropdetect.x1", s->x1);
- SET_META("lavfi.cropdetect.x2", s->x2);
- SET_META("lavfi.cropdetect.y1", s->y1);
- SET_META("lavfi.cropdetect.y2", s->y2);
- SET_META("lavfi.cropdetect.w", w);
- SET_META("lavfi.cropdetect.h", h);
- SET_META("lavfi.cropdetect.x", x);
- SET_META("lavfi.cropdetect.y", y);
-
- av_log(ctx, AV_LOG_INFO,
- "x1:%d x2:%d y1:%d y2:%d w:%d h:%d x:%d y:%d pts:%"PRId64" t:%f crop=%d:%d:%d:%d\n",
- s->x1, s->x2, s->y1, s->y2, w, h, x, y, frame->pts,
- frame->pts == AV_NOPTS_VALUE ? -1 : frame->pts * av_q2d(inlink->time_base),
- w, h, x, y);
- }
-
- return ff_filter_frame(inlink->dst->outputs[0], frame);
-}
-
-#define OFFSET(x) offsetof(CropDetectContext, x)
-#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
-
-static const AVOption cropdetect_options[] = {
- { "limit", "Threshold below which the pixel is considered black", OFFSET(limit), AV_OPT_TYPE_FLOAT, { .dbl = 24.0/255 }, 0, 65535, FLAGS },
- { "round", "Value by which the width/height should be divisible", OFFSET(round), AV_OPT_TYPE_INT, { .i64 = 16 }, 0, INT_MAX, FLAGS },
- { "reset", "Recalculate the crop area after this many frames", OFFSET(reset_count), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FLAGS },
- { "reset_count", "Recalculate the crop area after this many frames",OFFSET(reset_count),AV_OPT_TYPE_INT,{ .i64 = 0 }, 0, INT_MAX, FLAGS },
- { "max_outliers", "Threshold count of outliers", OFFSET(max_outliers),AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FLAGS },
- { NULL }
-};
-
-AVFILTER_DEFINE_CLASS(cropdetect);
-
-static const AVFilterPad avfilter_vf_cropdetect_inputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- .config_props = config_input,
- .filter_frame = filter_frame,
- },
- { NULL }
-};
-
-static const AVFilterPad avfilter_vf_cropdetect_outputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO
- },
- { NULL }
-};
-
-AVFilter ff_vf_cropdetect = {
- .name = "cropdetect",
- .description = NULL_IF_CONFIG_SMALL("Auto-detect crop size."),
- .priv_size = sizeof(CropDetectContext),
- .priv_class = &cropdetect_class,
- .init = init,
- .query_formats = query_formats,
- .inputs = avfilter_vf_cropdetect_inputs,
- .outputs = avfilter_vf_cropdetect_outputs,
- .flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
-};
diff --git a/libavfilter/vf_delogo.c b/libavfilter/vf_delogo.c
deleted file mode 100644
index e55673d..0000000
--- a/libavfilter/vf_delogo.c
+++ /dev/null
@@ -1,413 +0,0 @@
-/*
- * Copyright (c) 2002 Jindrich Makovicka <makovick@gmail.com>
- * Copyright (c) 2011 Stefano Sabatini
- * Copyright (c) 2013, 2015 Jean Delvare <jdelvare@suse.com>
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/**
- * @file
- * A very simple tv station logo remover
- * Originally imported from MPlayer libmpcodecs/vf_delogo.c,
- * the algorithm was later improved.
- */
-
-#include "libavutil/common.h"
-#include "libavutil/imgutils.h"
-#include "libavutil/opt.h"
-#include "libavutil/pixdesc.h"
-#include "libavutil/eval.h"
-#include "avfilter.h"
-#include "formats.h"
-#include "internal.h"
-#include "video.h"
-static const char * const var_names[] = {
- "x",
- "y",
- "w",
- "h",
- "n", ///< number of frame
- "t", ///< timestamp expressed in seconds
- NULL
-};
-
-enum var_name {
- VAR_X,
- VAR_Y,
- VAR_W,
- VAR_H,
- VAR_N,
- VAR_T,
- VAR_VARS_NB
-};
-#define TS2T(ts, tb) ((ts) == AV_NOPTS_VALUE ? NAN : (double)(ts) * av_q2d(tb))
-
-static int set_expr(AVExpr **pexpr, const char *expr, const char *option, void *log_ctx)
-{
- int ret;
- AVExpr *old = NULL;
-
- if (*pexpr)
- old = *pexpr;
- ret = av_expr_parse(pexpr, expr, var_names, NULL, NULL, NULL, NULL, 0, log_ctx);
- if (ret < 0) {
- av_log(log_ctx, AV_LOG_ERROR,
- "Error when parsing the expression '%s' for %s\n",
- expr, option);
- *pexpr = old;
- return ret;
- }
-
- av_expr_free(old);
- return 0;
-}
-
-
-/**
- * Apply a simple delogo algorithm to the image in src and put the
- * result in dst.
- *
- * The algorithm is only applied to the region specified by the logo
- * parameters.
- *
- * @param w width of the input image
- * @param h height of the input image
- * @param logo_x x coordinate of the top left corner of the logo region
- * @param logo_y y coordinate of the top left corner of the logo region
- * @param logo_w width of the logo
- * @param logo_h height of the logo
- * @param band the size of the band around the processed area
- * @param show show a rectangle around the processed area, useful for
- * parameters tweaking
- * @param direct if non-zero perform in-place processing
- */
-static void apply_delogo(uint8_t *dst, int dst_linesize,
- uint8_t *src, int src_linesize,
- int w, int h, AVRational sar,
- int logo_x, int logo_y, int logo_w, int logo_h,
- unsigned int band, int show, int direct)
-{
- int x, y;
- uint64_t interp, weightl, weightr, weightt, weightb, weight;
- uint8_t *xdst, *xsrc;
-
- uint8_t *topleft, *botleft, *topright;
- unsigned int left_sample, right_sample;
- int xclipl, xclipr, yclipt, yclipb;
- int logo_x1, logo_x2, logo_y1, logo_y2;
-
- xclipl = FFMAX(-logo_x, 0);
- xclipr = FFMAX(logo_x+logo_w-w, 0);
- yclipt = FFMAX(-logo_y, 0);
- yclipb = FFMAX(logo_y+logo_h-h, 0);
-
- logo_x1 = logo_x + xclipl;
- logo_x2 = logo_x + logo_w - xclipr - 1;
- logo_y1 = logo_y + yclipt;
- logo_y2 = logo_y + logo_h - yclipb - 1;
-
- topleft = src+logo_y1 * src_linesize+logo_x1;
- topright = src+logo_y1 * src_linesize+logo_x2;
- botleft = src+logo_y2 * src_linesize+logo_x1;
-
- if (!direct)
- av_image_copy_plane(dst, dst_linesize, src, src_linesize, w, h);
-
- dst += (logo_y1 + 1) * dst_linesize;
- src += (logo_y1 + 1) * src_linesize;
-
- for (y = logo_y1+1; y < logo_y2; y++) {
- left_sample = topleft[src_linesize*(y-logo_y1)] +
- topleft[src_linesize*(y-logo_y1-1)] +
- topleft[src_linesize*(y-logo_y1+1)];
- right_sample = topright[src_linesize*(y-logo_y1)] +
- topright[src_linesize*(y-logo_y1-1)] +
- topright[src_linesize*(y-logo_y1+1)];
-
- for (x = logo_x1+1,
- xdst = dst+logo_x1+1,
- xsrc = src+logo_x1+1; x < logo_x2; x++, xdst++, xsrc++) {
-
- if (show && (y == logo_y1+1 || y == logo_y2-1 ||
- x == logo_x1+1 || x == logo_x2-1)) {
- *xdst = 0;
- continue;
- }
-
- /* Weighted interpolation based on relative distances, taking SAR into account */
- weightl = (uint64_t) (logo_x2-x) * (y-logo_y1) * (logo_y2-y) * sar.den;
- weightr = (uint64_t)(x-logo_x1) * (y-logo_y1) * (logo_y2-y) * sar.den;
- weightt = (uint64_t)(x-logo_x1) * (logo_x2-x) * (logo_y2-y) * sar.num;
- weightb = (uint64_t)(x-logo_x1) * (logo_x2-x) * (y-logo_y1) * sar.num;
-
- interp =
- left_sample * weightl
- +
- right_sample * weightr
- +
- (topleft[x-logo_x1] +
- topleft[x-logo_x1-1] +
- topleft[x-logo_x1+1]) * weightt
- +
- (botleft[x-logo_x1] +
- botleft[x-logo_x1-1] +
- botleft[x-logo_x1+1]) * weightb;
- weight = (weightl + weightr + weightt + weightb) * 3U;
- interp = (interp + (weight >> 1)) / weight;
-
- if (y >= logo_y+band && y < logo_y+logo_h-band &&
- x >= logo_x+band && x < logo_x+logo_w-band) {
- *xdst = interp;
- } else {
- unsigned dist = 0;
-
- if (x < logo_x+band)
- dist = FFMAX(dist, logo_x-x+band);
- else if (x >= logo_x+logo_w-band)
- dist = FFMAX(dist, x-(logo_x+logo_w-1-band));
-
- if (y < logo_y+band)
- dist = FFMAX(dist, logo_y-y+band);
- else if (y >= logo_y+logo_h-band)
- dist = FFMAX(dist, y-(logo_y+logo_h-1-band));
-
- *xdst = (*xsrc*dist + interp*(band-dist))/band;
- }
- }
-
- dst += dst_linesize;
- src += src_linesize;
- }
-}
-
-typedef struct DelogoContext {
- const AVClass *class;
- int x, y, w, h, band, show;
- char *x_expr, *y_expr, *w_expr, *h_expr;
- AVExpr *x_pexpr, *y_pexpr, *w_pexpr, *h_pexpr;
- double var_values[VAR_VARS_NB];
-} DelogoContext;
-
-#define OFFSET(x) offsetof(DelogoContext, x)
-#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
-
-static const AVOption delogo_options[]= {
- { "x", "set logo x position", OFFSET(x_expr), AV_OPT_TYPE_STRING, { .str = "-1" }, 0, 0, FLAGS },
- { "y", "set logo y position", OFFSET(y_expr), AV_OPT_TYPE_STRING, { .str = "-1" }, 0, 0, FLAGS },
- { "w", "set logo width", OFFSET(w_expr), AV_OPT_TYPE_STRING, { .str = "-1" }, 0, 0, FLAGS },
- { "h", "set logo height", OFFSET(h_expr), AV_OPT_TYPE_STRING, { .str = "-1" }, 0, 0, FLAGS },
- { "show", "show delogo area", OFFSET(show), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS },
- { NULL }
-};
-
-AVFILTER_DEFINE_CLASS(delogo);
-static av_cold void uninit(AVFilterContext *ctx)
-{
- DelogoContext *s = ctx->priv;
-
- av_expr_free(s->x_pexpr); s->x_pexpr = NULL;
- av_expr_free(s->y_pexpr); s->y_pexpr = NULL;
- av_expr_free(s->w_pexpr); s->w_pexpr = NULL;
- av_expr_free(s->h_pexpr); s->h_pexpr = NULL;
-}
-
-
-static int query_formats(AVFilterContext *ctx)
-{
- static const enum AVPixelFormat pix_fmts[] = {
- AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV420P,
- AV_PIX_FMT_YUV411P, AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV440P,
- AV_PIX_FMT_YUVA420P, AV_PIX_FMT_GRAY8,
- AV_PIX_FMT_NONE
- };
- AVFilterFormats *fmts_list = ff_make_format_list(pix_fmts);
- if (!fmts_list)
- return AVERROR(ENOMEM);
- return ff_set_common_formats(ctx, fmts_list);
-}
-
-static av_cold int init(AVFilterContext *ctx)
-{
- DelogoContext *s = ctx->priv;
- int ret = 0;
-
- if ((ret = set_expr(&s->x_pexpr, s->x_expr, "x", ctx)) < 0 ||
- (ret = set_expr(&s->y_pexpr, s->y_expr, "y", ctx)) < 0 ||
- (ret = set_expr(&s->w_pexpr, s->w_expr, "w", ctx)) < 0 ||
- (ret = set_expr(&s->h_pexpr, s->h_expr, "h", ctx)) < 0 )
- return ret;
-
- s->x = av_expr_eval(s->x_pexpr, s->var_values, s);
- s->y = av_expr_eval(s->y_pexpr, s->var_values, s);
- s->w = av_expr_eval(s->w_pexpr, s->var_values, s);
- s->h = av_expr_eval(s->h_pexpr, s->var_values, s);
-
-#define CHECK_UNSET_OPT(opt) \
- if (s->opt == -1) { \
- av_log(s, AV_LOG_ERROR, "Option %s was not set.\n", #opt); \
- return AVERROR(EINVAL); \
- }
- CHECK_UNSET_OPT(x);
- CHECK_UNSET_OPT(y);
- CHECK_UNSET_OPT(w);
- CHECK_UNSET_OPT(h);
-
- s->band = 1;
-
- av_log(ctx, AV_LOG_VERBOSE, "x:%d y:%d, w:%d h:%d band:%d show:%d\n",
- s->x, s->y, s->w, s->h, s->band, s->show);
-
- s->w += s->band*2;
- s->h += s->band*2;
- s->x -= s->band;
- s->y -= s->band;
-
- return 0;
-}
-
-static int config_input(AVFilterLink *inlink)
-{
- DelogoContext *s = inlink->dst->priv;
-
- /* Check whether the logo area fits in the frame */
- if (s->x + (s->band - 1) < 0 || s->x + s->w - (s->band*2 - 2) > inlink->w ||
- s->y + (s->band - 1) < 0 || s->y + s->h - (s->band*2 - 2) > inlink->h) {
- av_log(s, AV_LOG_ERROR, "Logo area is outside of the frame.\n");
- return AVERROR(EINVAL);
- }
-
- return 0;
-}
-
-static int filter_frame(AVFilterLink *inlink, AVFrame *in)
-{
- DelogoContext *s = inlink->dst->priv;
- AVFilterLink *outlink = inlink->dst->outputs[0];
- const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
- AVFrame *out;
- int hsub0 = desc->log2_chroma_w;
- int vsub0 = desc->log2_chroma_h;
- int direct = 0;
- int plane;
- AVRational sar;
- int ret;
-
- s->var_values[VAR_N] = inlink->frame_count_out;
- s->var_values[VAR_T] = TS2T(in->pts, inlink->time_base);
- s->x = av_expr_eval(s->x_pexpr, s->var_values, s);
- s->y = av_expr_eval(s->y_pexpr, s->var_values, s);
- s->w = av_expr_eval(s->w_pexpr, s->var_values, s);
- s->h = av_expr_eval(s->h_pexpr, s->var_values, s);
-
- if (s->x + (s->band - 1) <= 0 || s->x + s->w - (s->band*2 - 2) > inlink->w ||
- s->y + (s->band - 1) <= 0 || s->y + s->h - (s->band*2 - 2) > inlink->h) {
- av_log(s, AV_LOG_WARNING, "Logo area is outside of the frame,"
- " auto set the area inside of the frame\n");
- }
-
- if (s->x + (s->band - 1) <= 0)
- s->x = 1 + s->band;
- if (s->y + (s->band - 1) <= 0)
- s->y = 1 + s->band;
- if (s->x + s->w - (s->band*2 - 2) > inlink->w)
- s->w = inlink->w - s->x - (s->band*2 - 2);
- if (s->y + s->h - (s->band*2 - 2) > inlink->h)
- s->h = inlink->h - s->y - (s->band*2 - 2);
-
- ret = config_input(inlink);
- if (ret < 0) {
- av_frame_free(&in);
- return ret;
- }
-
- s->w += s->band*2;
- s->h += s->band*2;
- s->x -= s->band;
- s->y -= s->band;
-
- if (av_frame_is_writable(in)) {
- direct = 1;
- out = in;
- } else {
- out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
- if (!out) {
- av_frame_free(&in);
- return AVERROR(ENOMEM);
- }
-
- av_frame_copy_props(out, in);
- }
-
- sar = in->sample_aspect_ratio;
- /* Assume square pixels if SAR is unknown */
- if (!sar.num)
- sar.num = sar.den = 1;
-
- for (plane = 0; plane < desc->nb_components; plane++) {
- int hsub = plane == 1 || plane == 2 ? hsub0 : 0;
- int vsub = plane == 1 || plane == 2 ? vsub0 : 0;
-
- apply_delogo(out->data[plane], out->linesize[plane],
- in ->data[plane], in ->linesize[plane],
- AV_CEIL_RSHIFT(inlink->w, hsub),
- AV_CEIL_RSHIFT(inlink->h, vsub),
- sar, s->x>>hsub, s->y>>vsub,
- /* Up and left borders were rounded down, inject lost bits
- * into width and height to avoid error accumulation */
- AV_CEIL_RSHIFT(s->w + (s->x & ((1<<hsub)-1)), hsub),
- AV_CEIL_RSHIFT(s->h + (s->y & ((1<<vsub)-1)), vsub),
- s->band>>FFMIN(hsub, vsub),
- s->show, direct);
- }
-
- if (!direct)
- av_frame_free(&in);
-
- return ff_filter_frame(outlink, out);
-}
-
-static const AVFilterPad avfilter_vf_delogo_inputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- .filter_frame = filter_frame,
- .config_props = config_input,
- },
- { NULL }
-};
-
-static const AVFilterPad avfilter_vf_delogo_outputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- },
- { NULL }
-};
-
-AVFilter ff_vf_delogo = {
- .name = "delogo",
- .description = NULL_IF_CONFIG_SMALL("Remove logo from input video."),
- .priv_size = sizeof(DelogoContext),
- .priv_class = &delogo_class,
- .init = init,
- .uninit = uninit,
- .query_formats = query_formats,
- .inputs = avfilter_vf_delogo_inputs,
- .outputs = avfilter_vf_delogo_outputs,
- .flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
-};
diff --git a/libavfilter/vf_eq.c b/libavfilter/vf_eq.c
deleted file mode 100644
index c8c3d5b..0000000
--- a/libavfilter/vf_eq.c
+++ /dev/null
@@ -1,394 +0,0 @@
-/*
- * Original MPlayer filters by Richard Felker, Hampa Hug, Daniel Moreno,
- * and Michael Niedermeyer.
- *
- * Copyright (c) 2014 James Darnley <james.darnley@gmail.com>
- * Copyright (c) 2015 Arwa Arif <arwaarif1994@gmail.com>
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/**
- * @file
- * very simple video equalizer
- */
-
-#include "libavfilter/internal.h"
-#include "libavutil/common.h"
-#include "libavutil/imgutils.h"
-#include "libavutil/opt.h"
-#include "libavutil/pixdesc.h"
-#include "vf_eq.h"
-
-static void create_lut(EQParameters *param)
-{
- int i;
- double g = 1.0 / param->gamma;
- double lw = 1.0 - param->gamma_weight;
-
- for (i = 0; i < 256; i++) {
- double v = i / 255.0;
- v = param->contrast * (v - 0.5) + 0.5 + param->brightness;
-
- if (v <= 0.0) {
- param->lut[i] = 0;
- } else {
- v = v * lw + pow(v, g) * param->gamma_weight;
-
- if (v >= 1.0)
- param->lut[i] = 255;
- else
- param->lut[i] = 256.0 * v;
- }
- }
-
- param->lut_clean = 1;
-}
-
-static void apply_lut(EQParameters *param, uint8_t *dst, int dst_stride,
- const uint8_t *src, int src_stride, int w, int h)
-{
- int x, y;
-
- if (!param->lut_clean)
- create_lut(param);
-
- for (y = 0; y < h; y++) {
- for (x = 0; x < w; x++) {
- dst[y * dst_stride + x] = param->lut[src[y * src_stride + x]];
- }
- }
-}
-
-static void process_c(EQParameters *param, uint8_t *dst, int dst_stride,
- const uint8_t *src, int src_stride, int w, int h)
-{
- int x, y, pel;
-
- int contrast = (int) (param->contrast * 256 * 16);
- int brightness = ((int) (100.0 * param->brightness + 100.0) * 511) / 200 - 128 - contrast / 32;
-
- for (y = 0; y < h; y++) {
- for (x = 0; x < w; x++) {
- pel = ((src[y * src_stride + x] * contrast) >> 12) + brightness;
-
- if (pel & ~255)
- pel = (-pel) >> 31;
-
- dst[y * dst_stride + x] = pel;
- }
- }
-}
-
-static void check_values(EQParameters *param, EQContext *eq)
-{
- if (param->contrast == 1.0 && param->brightness == 0.0 && param->gamma == 1.0)
- param->adjust = NULL;
- else if (param->gamma == 1.0 && fabs(param->contrast) < 7.9)
- param->adjust = eq->process;
- else
- param->adjust = apply_lut;
-}
-
-static void set_contrast(EQContext *eq)
-{
- eq->contrast = av_clipf(av_expr_eval(eq->contrast_pexpr, eq->var_values, eq), -1000.0, 1000.0);
- eq->param[0].contrast = eq->contrast;
- eq->param[0].lut_clean = 0;
- check_values(&eq->param[0], eq);
-}
-
-static void set_brightness(EQContext *eq)
-{
- eq->brightness = av_clipf(av_expr_eval(eq->brightness_pexpr, eq->var_values, eq), -1.0, 1.0);
- eq->param[0].brightness = eq->brightness;
- eq->param[0].lut_clean = 0;
- check_values(&eq->param[0], eq);
-}
-
-static void set_gamma(EQContext *eq)
-{
- int i;
-
- eq->gamma = av_clipf(av_expr_eval(eq->gamma_pexpr, eq->var_values, eq), 0.1, 10.0);
- eq->gamma_r = av_clipf(av_expr_eval(eq->gamma_r_pexpr, eq->var_values, eq), 0.1, 10.0);
- eq->gamma_g = av_clipf(av_expr_eval(eq->gamma_g_pexpr, eq->var_values, eq), 0.1, 10.0);
- eq->gamma_b = av_clipf(av_expr_eval(eq->gamma_b_pexpr, eq->var_values, eq), 0.1, 10.0);
- eq->gamma_weight = av_clipf(av_expr_eval(eq->gamma_weight_pexpr, eq->var_values, eq), 0.0, 1.0);
-
- eq->param[0].gamma = eq->gamma * eq->gamma_g;
- eq->param[1].gamma = sqrt(eq->gamma_b / eq->gamma_g);
- eq->param[2].gamma = sqrt(eq->gamma_r / eq->gamma_g);
-
- for (i = 0; i < 3; i++) {
- eq->param[i].gamma_weight = eq->gamma_weight;
- eq->param[i].lut_clean = 0;
- check_values(&eq->param[i], eq);
- }
-}
-
-static void set_saturation(EQContext *eq)
-{
- int i;
-
- eq->saturation = av_clipf(av_expr_eval(eq->saturation_pexpr, eq->var_values, eq), 0.0, 3.0);
-
- for (i = 1; i < 3; i++) {
- eq->param[i].contrast = eq->saturation;
- eq->param[i].lut_clean = 0;
- check_values(&eq->param[i], eq);
- }
-}
-
-static int set_expr(AVExpr **pexpr, const char *expr, const char *option, void *log_ctx)
-{
- int ret;
- AVExpr *old = NULL;
-
- if (*pexpr)
- old = *pexpr;
- ret = av_expr_parse(pexpr, expr, var_names, NULL, NULL, NULL, NULL, 0, log_ctx);
- if (ret < 0) {
- av_log(log_ctx, AV_LOG_ERROR,
- "Error when parsing the expression '%s' for %s\n",
- expr, option);
- *pexpr = old;
- return ret;
- }
-
- av_expr_free(old);
- return 0;
-}
-
-void ff_eq_init(EQContext *eq)
-{
- eq->process = process_c;
- if (ARCH_X86)
- ff_eq_init_x86(eq);
-}
-
-static int initialize(AVFilterContext *ctx)
-{
- EQContext *eq = ctx->priv;
- int ret;
- ff_eq_init(eq);
-
- if ((ret = set_expr(&eq->contrast_pexpr, eq->contrast_expr, "contrast", ctx)) < 0 ||
- (ret = set_expr(&eq->brightness_pexpr, eq->brightness_expr, "brightness", ctx)) < 0 ||
- (ret = set_expr(&eq->saturation_pexpr, eq->saturation_expr, "saturation", ctx)) < 0 ||
- (ret = set_expr(&eq->gamma_pexpr, eq->gamma_expr, "gamma", ctx)) < 0 ||
- (ret = set_expr(&eq->gamma_r_pexpr, eq->gamma_r_expr, "gamma_r", ctx)) < 0 ||
- (ret = set_expr(&eq->gamma_g_pexpr, eq->gamma_g_expr, "gamma_g", ctx)) < 0 ||
- (ret = set_expr(&eq->gamma_b_pexpr, eq->gamma_b_expr, "gamma_b", ctx)) < 0 ||
- (ret = set_expr(&eq->gamma_weight_pexpr, eq->gamma_weight_expr, "gamma_weight", ctx)) < 0 )
- return ret;
-
- if (eq->eval_mode == EVAL_MODE_INIT) {
- set_gamma(eq);
- set_contrast(eq);
- set_brightness(eq);
- set_saturation(eq);
- }
-
- return 0;
-}
-
-static av_cold void uninit(AVFilterContext *ctx)
-{
- EQContext *eq = ctx->priv;
-
- av_expr_free(eq->contrast_pexpr); eq->contrast_pexpr = NULL;
- av_expr_free(eq->brightness_pexpr); eq->brightness_pexpr = NULL;
- av_expr_free(eq->saturation_pexpr); eq->saturation_pexpr = NULL;
- av_expr_free(eq->gamma_pexpr); eq->gamma_pexpr = NULL;
- av_expr_free(eq->gamma_weight_pexpr); eq->gamma_weight_pexpr = NULL;
- av_expr_free(eq->gamma_r_pexpr); eq->gamma_r_pexpr = NULL;
- av_expr_free(eq->gamma_g_pexpr); eq->gamma_g_pexpr = NULL;
- av_expr_free(eq->gamma_b_pexpr); eq->gamma_b_pexpr = NULL;
-}
-
-static int config_props(AVFilterLink *inlink)
-{
- EQContext *eq = inlink->dst->priv;
-
- eq->var_values[VAR_N] = 0;
- eq->var_values[VAR_R] = inlink->frame_rate.num == 0 || inlink->frame_rate.den == 0 ?
- NAN : av_q2d(inlink->frame_rate);
-
- return 0;
-}
-
-static int query_formats(AVFilterContext *ctx)
-{
- static const enum AVPixelFormat pixel_fmts_eq[] = {
- AV_PIX_FMT_GRAY8,
- AV_PIX_FMT_YUV410P,
- AV_PIX_FMT_YUV411P,
- AV_PIX_FMT_YUV420P,
- AV_PIX_FMT_YUV422P,
- AV_PIX_FMT_YUV444P,
- AV_PIX_FMT_NONE
- };
- AVFilterFormats *fmts_list = ff_make_format_list(pixel_fmts_eq);
- if (!fmts_list)
- return AVERROR(ENOMEM);
- return ff_set_common_formats(ctx, fmts_list);
-}
-
-#define TS2T(ts, tb) ((ts) == AV_NOPTS_VALUE ? NAN : (double)(ts) * av_q2d(tb))
-
-static int filter_frame(AVFilterLink *inlink, AVFrame *in)
-{
- AVFilterContext *ctx = inlink->dst;
- AVFilterLink *outlink = inlink->dst->outputs[0];
- EQContext *eq = ctx->priv;
- AVFrame *out;
- int64_t pos = in->pkt_pos;
- const AVPixFmtDescriptor *desc;
- int i;
-
- out = ff_get_video_buffer(outlink, inlink->w, inlink->h);
- if (!out) {
- av_frame_free(&in);
- return AVERROR(ENOMEM);
- }
-
- av_frame_copy_props(out, in);
- desc = av_pix_fmt_desc_get(inlink->format);
-
- eq->var_values[VAR_N] = inlink->frame_count_out;
- eq->var_values[VAR_POS] = pos == -1 ? NAN : pos;
- eq->var_values[VAR_T] = TS2T(in->pts, inlink->time_base);
-
- if (eq->eval_mode == EVAL_MODE_FRAME) {
- set_gamma(eq);
- set_contrast(eq);
- set_brightness(eq);
- set_saturation(eq);
- }
-
- for (i = 0; i < desc->nb_components; i++) {
- int w = inlink->w;
- int h = inlink->h;
-
- if (i == 1 || i == 2) {
- w = AV_CEIL_RSHIFT(w, desc->log2_chroma_w);
- h = AV_CEIL_RSHIFT(h, desc->log2_chroma_h);
- }
-
- if (eq->param[i].adjust)
- eq->param[i].adjust(&eq->param[i], out->data[i], out->linesize[i],
- in->data[i], in->linesize[i], w, h);
- else
- av_image_copy_plane(out->data[i], out->linesize[i],
- in->data[i], in->linesize[i], w, h);
- }
-
- av_frame_free(&in);
- return ff_filter_frame(outlink, out);
-}
-
-static inline int set_param(AVExpr **pexpr, const char *args, const char *cmd,
- void (*set_fn)(EQContext *eq), AVFilterContext *ctx)
-{
- EQContext *eq = ctx->priv;
- int ret;
- if ((ret = set_expr(pexpr, args, cmd, ctx)) < 0)
- return ret;
- if (eq->eval_mode == EVAL_MODE_INIT)
- set_fn(eq);
- return 0;
-}
-
-static int process_command(AVFilterContext *ctx, const char *cmd, const char *args,
- char *res, int res_len, int flags)
-{
- EQContext *eq = ctx->priv;
-
-#define SET_PARAM(param_name, set_fn_name) \
- if (!strcmp(cmd, #param_name)) return set_param(&eq->param_name##_pexpr, args, cmd, set_##set_fn_name, ctx);
-
- SET_PARAM(contrast, contrast)
- else SET_PARAM(brightness, brightness)
- else SET_PARAM(saturation, saturation)
- else SET_PARAM(gamma, gamma)
- else SET_PARAM(gamma_r, gamma)
- else SET_PARAM(gamma_g, gamma)
- else SET_PARAM(gamma_b, gamma)
- else SET_PARAM(gamma_weight, gamma)
- else return AVERROR(ENOSYS);
-}
-
-static const AVFilterPad eq_inputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- .filter_frame = filter_frame,
- .config_props = config_props,
- },
- { NULL }
-};
-
-static const AVFilterPad eq_outputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- },
- { NULL }
-};
-
-#define OFFSET(x) offsetof(EQContext, x)
-#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
-#define TFLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
-static const AVOption eq_options[] = {
- { "contrast", "set the contrast adjustment, negative values give a negative image",
- OFFSET(contrast_expr), AV_OPT_TYPE_STRING, {.str = "1.0"}, 0, 0, TFLAGS },
- { "brightness", "set the brightness adjustment",
- OFFSET(brightness_expr), AV_OPT_TYPE_STRING, {.str = "0.0"}, 0, 0, TFLAGS },
- { "saturation", "set the saturation adjustment",
- OFFSET(saturation_expr), AV_OPT_TYPE_STRING, {.str = "1.0"}, 0, 0, TFLAGS },
- { "gamma", "set the initial gamma value",
- OFFSET(gamma_expr), AV_OPT_TYPE_STRING, {.str = "1.0"}, 0, 0, TFLAGS },
- { "gamma_r", "gamma value for red",
- OFFSET(gamma_r_expr), AV_OPT_TYPE_STRING, {.str = "1.0"}, 0, 0, TFLAGS },
- { "gamma_g", "gamma value for green",
- OFFSET(gamma_g_expr), AV_OPT_TYPE_STRING, {.str = "1.0"}, 0, 0, TFLAGS },
- { "gamma_b", "gamma value for blue",
- OFFSET(gamma_b_expr), AV_OPT_TYPE_STRING, {.str = "1.0"}, 0, 0, TFLAGS },
- { "gamma_weight", "set the gamma weight which reduces the effect of gamma on bright areas",
- OFFSET(gamma_weight_expr), AV_OPT_TYPE_STRING, {.str = "1.0"}, 0, 0, TFLAGS },
- { "eval", "specify when to evaluate expressions", OFFSET(eval_mode), AV_OPT_TYPE_INT, {.i64 = EVAL_MODE_INIT}, 0, EVAL_MODE_NB-1, FLAGS, "eval" },
- { "init", "eval expressions once during initialization", 0, AV_OPT_TYPE_CONST, {.i64=EVAL_MODE_INIT}, .flags = FLAGS, .unit = "eval" },
- { "frame", "eval expressions per-frame", 0, AV_OPT_TYPE_CONST, {.i64=EVAL_MODE_FRAME}, .flags = FLAGS, .unit = "eval" },
- { NULL }
-};
-
-AVFILTER_DEFINE_CLASS(eq);
-
-AVFilter ff_vf_eq = {
- .name = "eq",
- .description = NULL_IF_CONFIG_SMALL("Adjust brightness, contrast, gamma, and saturation."),
- .priv_size = sizeof(EQContext),
- .priv_class = &eq_class,
- .inputs = eq_inputs,
- .outputs = eq_outputs,
- .process_command = process_command,
- .query_formats = query_formats,
- .init = initialize,
- .uninit = uninit,
- .flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
-};
diff --git a/libavfilter/vf_eq.h b/libavfilter/vf_eq.h
deleted file mode 100644
index cd0cd75..0000000
--- a/libavfilter/vf_eq.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Original MPlayer filters by Richard Felker, Hampa Hug, Daniel Moreno,
- * and Michael Niedermeyer.
- *
- * Copyright (c) 2014 James Darnley <james.darnley@gmail.com>
- * Copyright (c) 2015 Arwa Arif <arwaarif1994@gmail.com>
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef AVFILTER_EQ_H
-#define AVFILTER_EQ_H
-
-#include "avfilter.h"
-#include "libavutil/eval.h"
-
-static const char *const var_names[] = {
- "n", // frame count
- "pos", // frame position
- "r", // frame rate
- "t", // timestamp expressed in seconds
- NULL
-};
-
-enum var_name {
- VAR_N,
- VAR_POS,
- VAR_R,
- VAR_T,
- VAR_NB
-};
-
-typedef struct EQParameters {
- void (*adjust)(struct EQParameters *eq, uint8_t *dst, int dst_stride,
- const uint8_t *src, int src_stride, int w, int h);
-
- uint8_t lut[256];
-
- double brightness, contrast, gamma, gamma_weight;
- int lut_clean;
-
-} EQParameters;
-
-typedef struct EQContext {
- const AVClass *class;
-
- EQParameters param[3];
-
- char *contrast_expr;
- AVExpr *contrast_pexpr;
- double contrast;
-
- char *brightness_expr;
- AVExpr *brightness_pexpr;
- double brightness;
-
- char *saturation_expr;
- AVExpr *saturation_pexpr;
- double saturation;
-
- char *gamma_expr;
- AVExpr *gamma_pexpr;
- double gamma;
-
- char *gamma_weight_expr;
- AVExpr *gamma_weight_pexpr;
- double gamma_weight;
-
- char *gamma_r_expr;
- AVExpr *gamma_r_pexpr;
- double gamma_r;
-
- char *gamma_g_expr;
- AVExpr *gamma_g_pexpr;
- double gamma_g;
-
- char *gamma_b_expr;
- AVExpr *gamma_b_pexpr;
- double gamma_b;
-
- double var_values[VAR_NB];
-
- void (*process)(struct EQParameters *par, uint8_t *dst, int dst_stride,
- const uint8_t *src, int src_stride, int w, int h);
-
- enum EvalMode { EVAL_MODE_INIT, EVAL_MODE_FRAME, EVAL_MODE_NB } eval_mode;
-} EQContext;
-
-void ff_eq_init(EQContext *eq);
-void ff_eq_init_x86(EQContext *eq);
-
-#endif /* AVFILTER_EQ_H */
diff --git a/libavfilter/vf_find_rect.c b/libavfilter/vf_find_rect.c
deleted file mode 100644
index 706e59c..0000000
--- a/libavfilter/vf_find_rect.c
+++ /dev/null
@@ -1,303 +0,0 @@
-/*
- * Copyright (c) 2014-2015 Michael Niedermayer <michaelni@gmx.at>
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/**
- * @todo switch to dualinput
- */
-
-#include "libavutil/imgutils.h"
-#include "libavutil/opt.h"
-#include "internal.h"
-
-#include "lavfutils.h"
-
-#define MAX_MIPMAPS 5
-
-typedef struct FOCContext {
- AVClass *class;
- float threshold;
- int mipmaps;
- int xmin, ymin, xmax, ymax;
- char *obj_filename;
- int last_x, last_y;
- AVFrame *obj_frame;
- AVFrame *needle_frame[MAX_MIPMAPS];
- AVFrame *haystack_frame[MAX_MIPMAPS];
-} FOCContext;
-
-#define OFFSET(x) offsetof(FOCContext, x)
-#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
-static const AVOption find_rect_options[] = {
- { "object", "object bitmap filename", OFFSET(obj_filename), AV_OPT_TYPE_STRING, {.str = NULL}, .flags = FLAGS },
- { "threshold", "set threshold", OFFSET(threshold), AV_OPT_TYPE_FLOAT, {.dbl = 0.5}, 0, 1.0, FLAGS },
- { "mipmaps", "set mipmaps", OFFSET(mipmaps), AV_OPT_TYPE_INT, {.i64 = 3}, 1, MAX_MIPMAPS, FLAGS },
- { "xmin", "", OFFSET(xmin), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, FLAGS },
- { "ymin", "", OFFSET(ymin), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, FLAGS },
- { "xmax", "", OFFSET(xmax), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, FLAGS },
- { "ymax", "", OFFSET(ymax), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, FLAGS },
- { NULL }
-};
-
-AVFILTER_DEFINE_CLASS(find_rect);
-
-static int query_formats(AVFilterContext *ctx)
-{
- static const enum AVPixelFormat pix_fmts[] = {
- AV_PIX_FMT_YUV420P,
- AV_PIX_FMT_YUVJ420P,
- AV_PIX_FMT_NONE
- };
-
- return ff_set_common_formats(ctx, ff_make_format_list(pix_fmts));
-}
-
-static AVFrame *downscale(AVFrame *in)
-{
- int x, y;
- AVFrame *frame = av_frame_alloc();
- uint8_t *src, *dst;
- if (!frame)
- return NULL;
-
- frame->format = in->format;
- frame->width = (in->width + 1) / 2;
- frame->height = (in->height+ 1) / 2;
-
- if (av_frame_get_buffer(frame, 32) < 0) {
- av_frame_free(&frame);
- return NULL;
- }
- src = in ->data[0];
- dst = frame->data[0];
-
- for(y = 0; y < frame->height; y++) {
- for(x = 0; x < frame->width; x++) {
- dst[x] = ( src[2*x+0]
- + src[2*x+1]
- + src[2*x+0 + in->linesize[0]]
- + src[2*x+1 + in->linesize[0]]
- + 2) >> 2;
- }
- src += 2*in->linesize[0];
- dst += frame->linesize[0];
- }
- return frame;
-}
-
-static float compare(const AVFrame *haystack, const AVFrame *obj, int offx, int offy)
-{
- int x,y;
- int o_sum_v = 0;
- int h_sum_v = 0;
- int64_t oo_sum_v = 0;
- int64_t hh_sum_v = 0;
- int64_t oh_sum_v = 0;
- float c;
- int n = obj->height * obj->width;
- const uint8_t *odat = obj ->data[0];
- const uint8_t *hdat = haystack->data[0] + offx + offy * haystack->linesize[0];
- int64_t o_sigma, h_sigma;
-
- for(y = 0; y < obj->height; y++) {
- for(x = 0; x < obj->width; x++) {
- int o_v = odat[x];
- int h_v = hdat[x];
- o_sum_v += o_v;
- h_sum_v += h_v;
- oo_sum_v += o_v * o_v;
- hh_sum_v += h_v * h_v;
- oh_sum_v += o_v * h_v;
- }
- odat += obj->linesize[0];
- hdat += haystack->linesize[0];
- }
- o_sigma = n*oo_sum_v - o_sum_v*(int64_t)o_sum_v;
- h_sigma = n*hh_sum_v - h_sum_v*(int64_t)h_sum_v;
-
- if (o_sigma == 0 || h_sigma == 0)
- return 1.0;
-
- c = (n*oh_sum_v - o_sum_v*(int64_t)h_sum_v) / (sqrt(o_sigma)*sqrt(h_sigma));
-
- return 1 - fabs(c);
-}
-
-static int config_input(AVFilterLink *inlink)
-{
- AVFilterContext *ctx = inlink->dst;
- FOCContext *foc = ctx->priv;
-
- if (foc->xmax <= 0)
- foc->xmax = inlink->w - foc->obj_frame->width;
- if (foc->ymax <= 0)
- foc->ymax = inlink->h - foc->obj_frame->height;
-
- return 0;
-}
-
-static float search(FOCContext *foc, int pass, int maxpass, int xmin, int xmax, int ymin, int ymax, int *best_x, int *best_y, float best_score)
-{
- int x, y;
-
- if (pass + 1 <= maxpass) {
- int sub_x, sub_y;
- search(foc, pass+1, maxpass, xmin>>1, (xmax+1)>>1, ymin>>1, (ymax+1)>>1, &sub_x, &sub_y, 2.0);
- xmin = FFMAX(xmin, 2*sub_x - 4);
- xmax = FFMIN(xmax, 2*sub_x + 4);
- ymin = FFMAX(ymin, 2*sub_y - 4);
- ymax = FFMIN(ymax, 2*sub_y + 4);
- }
-
- for (y = ymin; y <= ymax; y++) {
- for (x = xmin; x <= xmax; x++) {
- float score = compare(foc->haystack_frame[pass], foc->needle_frame[pass], x, y);
- if (score < best_score) {
- best_score = score;
- *best_x = x;
- *best_y = y;
- }
- }
- }
- return best_score;
-}
-
-static int filter_frame(AVFilterLink *inlink, AVFrame *in)
-{
- AVFilterContext *ctx = inlink->dst;
- FOCContext *foc = ctx->priv;
- float best_score;
- int best_x, best_y;
- int i;
-
- foc->haystack_frame[0] = av_frame_clone(in);
- for (i=1; i<foc->mipmaps; i++) {
- foc->haystack_frame[i] = downscale(foc->haystack_frame[i-1]);
- }
-
- best_score = search(foc, 0, 0,
- FFMAX(foc->xmin, foc->last_x - 8),
- FFMIN(foc->xmax, foc->last_x + 8),
- FFMAX(foc->ymin, foc->last_y - 8),
- FFMIN(foc->ymax, foc->last_y + 8),
- &best_x, &best_y, 2.0);
-
- best_score = search(foc, 0, foc->mipmaps - 1, foc->xmin, foc->xmax, foc->ymin, foc->ymax,
- &best_x, &best_y, best_score);
-
- for (i=0; i<MAX_MIPMAPS; i++) {
- av_frame_free(&foc->haystack_frame[i]);
- }
-
- if (best_score > foc->threshold) {
- return ff_filter_frame(ctx->outputs[0], in);
- }
-
- av_log(ctx, AV_LOG_DEBUG, "Found at %d %d score %f\n", best_x, best_y, best_score);
- foc->last_x = best_x;
- foc->last_y = best_y;
-
- av_frame_make_writable(in);
-
- av_dict_set_int(&in->metadata, "lavfi.rect.w", foc->obj_frame->width, 0);
- av_dict_set_int(&in->metadata, "lavfi.rect.h", foc->obj_frame->height, 0);
- av_dict_set_int(&in->metadata, "lavfi.rect.x", best_x, 0);
- av_dict_set_int(&in->metadata, "lavfi.rect.y", best_y, 0);
-
- return ff_filter_frame(ctx->outputs[0], in);
-}
-
-static av_cold void uninit(AVFilterContext *ctx)
-{
- FOCContext *foc = ctx->priv;
- int i;
-
- for (i = 0; i < MAX_MIPMAPS; i++) {
- av_frame_free(&foc->needle_frame[i]);
- av_frame_free(&foc->haystack_frame[i]);
- }
-
- if (foc->obj_frame)
- av_freep(&foc->obj_frame->data[0]);
- av_frame_free(&foc->obj_frame);
-}
-
-static av_cold int init(AVFilterContext *ctx)
-{
- FOCContext *foc = ctx->priv;
- int ret, i;
-
- if (!foc->obj_filename) {
- av_log(ctx, AV_LOG_ERROR, "object filename not set\n");
- return AVERROR(EINVAL);
- }
-
- foc->obj_frame = av_frame_alloc();
- if (!foc->obj_frame)
- return AVERROR(ENOMEM);
-
- if ((ret = ff_load_image(foc->obj_frame->data, foc->obj_frame->linesize,
- &foc->obj_frame->width, &foc->obj_frame->height,
- &foc->obj_frame->format, foc->obj_filename, ctx)) < 0)
- return ret;
-
- if (foc->obj_frame->format != AV_PIX_FMT_GRAY8) {
- av_log(ctx, AV_LOG_ERROR, "object image is not a grayscale image\n");
- return AVERROR(EINVAL);
- }
-
- foc->needle_frame[0] = av_frame_clone(foc->obj_frame);
- for (i = 1; i < foc->mipmaps; i++) {
- foc->needle_frame[i] = downscale(foc->needle_frame[i-1]);
- if (!foc->needle_frame[i])
- return AVERROR(ENOMEM);
- }
-
- return 0;
-}
-
-static const AVFilterPad foc_inputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- .config_props = config_input,
- .filter_frame = filter_frame,
- },
- { NULL }
-};
-
-static const AVFilterPad foc_outputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- },
- { NULL }
-};
-
-AVFilter ff_vf_find_rect = {
- .name = "find_rect",
- .description = NULL_IF_CONFIG_SMALL("Find a user specified object."),
- .priv_size = sizeof(FOCContext),
- .init = init,
- .uninit = uninit,
- .query_formats = query_formats,
- .inputs = foc_inputs,
- .outputs = foc_outputs,
- .priv_class = &find_rect_class,
-};
diff --git a/libavfilter/vf_fspp.c b/libavfilter/vf_fspp.c
deleted file mode 100644
index c698904..0000000
--- a/libavfilter/vf_fspp.c
+++ /dev/null
@@ -1,693 +0,0 @@
-/*
- * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
- * Copyright (C) 2005 Nikolaj Poroshin <porosh3@psu.ru>
- * Copyright (c) 2014 Arwa Arif <arwaarif1994@gmail.com>
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/**
- * @file
- * Fast Simple Post-processing filter
- * This implementation is based on an algorithm described in
- * "Aria Nosratinia Embedded Post-Processing for
- * Enhancement of Compressed Images (1999)"
- * (http://www.utdallas.edu/~aria/papers/vlsisp99.pdf)
- * Further, with splitting (I)DCT into horizontal/vertical passes, one of
- * them can be performed once per block, not per pixel. This allows for much
- * higher speed.
- *
- * Originally written by Michael Niedermayer and Nikolaj for the MPlayer
- * project, and ported by Arwa Arif for FFmpeg.
- */
-
-#include "libavutil/avassert.h"
-#include "libavutil/imgutils.h"
-#include "libavutil/opt.h"
-#include "libavutil/pixdesc.h"
-#include "internal.h"
-#include "vf_fspp.h"
-
-#define OFFSET(x) offsetof(FSPPContext, x)
-#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
-static const AVOption fspp_options[] = {
- { "quality", "set quality", OFFSET(log2_count), AV_OPT_TYPE_INT, {.i64 = 4}, 4, MAX_LEVEL, FLAGS },
- { "qp", "force a constant quantizer parameter", OFFSET(qp), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 64, FLAGS },
- { "strength", "set filter strength", OFFSET(strength), AV_OPT_TYPE_INT, {.i64 = 0}, -15, 32, FLAGS },
- { "use_bframe_qp", "use B-frames' QP", OFFSET(use_bframe_qp), AV_OPT_TYPE_BOOL,{.i64 = 0}, 0, 1, FLAGS },
- { NULL }
-};
-
-AVFILTER_DEFINE_CLASS(fspp);
-
-DECLARE_ALIGNED(32, static const uint8_t, dither)[8][8] = {
- { 0, 48, 12, 60, 3, 51, 15, 63, },
- { 32, 16, 44, 28, 35, 19, 47, 31, },
- { 8, 56, 4, 52, 11, 59, 7, 55, },
- { 40, 24, 36, 20, 43, 27, 39, 23, },
- { 2, 50, 14, 62, 1, 49, 13, 61, },
- { 34, 18, 46, 30, 33, 17, 45, 29, },
- { 10, 58, 6, 54, 9, 57, 5, 53, },
- { 42, 26, 38, 22, 41, 25, 37, 21, },
-};
-
-static const short custom_threshold[64] = {
-// values (296) can't be too high
-// -it causes too big quant dependence
-// or maybe overflow(check), which results in some flashing
- 71, 296, 295, 237, 71, 40, 38, 19,
- 245, 193, 185, 121, 102, 73, 53, 27,
- 158, 129, 141, 107, 97, 73, 50, 26,
- 102, 116, 109, 98, 82, 66, 45, 23,
- 71, 94, 95, 81, 70, 56, 38, 20,
- 56, 77, 74, 66, 56, 44, 30, 15,
- 38, 53, 50, 45, 38, 30, 21, 11,
- 20, 27, 26, 23, 20, 15, 11, 5
-};
-
-//This func reads from 1 slice, 1 and clears 0 & 1
-static void store_slice_c(uint8_t *dst, int16_t *src,
- ptrdiff_t dst_stride, ptrdiff_t src_stride,
- ptrdiff_t width, ptrdiff_t height, ptrdiff_t log2_scale)
-{
- int y, x;
-#define STORE(pos) \
- temp = (src[x + pos] + (d[pos] >> log2_scale)) >> (6 - log2_scale); \
- src[x + pos] = src[x + pos - 8 * src_stride] = 0; \
- if (temp & 0x100) temp = ~(temp >> 31); \
- dst[x + pos] = temp;
-
- for (y = 0; y < height; y++) {
- const uint8_t *d = dither[y];
- for (x = 0; x < width; x += 8) {
- int temp;
- STORE(0);
- STORE(1);
- STORE(2);
- STORE(3);
- STORE(4);
- STORE(5);
- STORE(6);
- STORE(7);
- }
- src += src_stride;
- dst += dst_stride;
- }
-}
-
-//This func reads from 2 slices, 0 & 2 and clears 2-nd
-static void store_slice2_c(uint8_t *dst, int16_t *src,
- ptrdiff_t dst_stride, ptrdiff_t src_stride,
- ptrdiff_t width, ptrdiff_t height, ptrdiff_t log2_scale)
-{
- int y, x;
-#define STORE2(pos) \
- temp = (src[x + pos] + src[x + pos + 16 * src_stride] + (d[pos] >> log2_scale)) >> (6 - log2_scale); \
- src[x + pos + 16 * src_stride] = 0; \
- if (temp & 0x100) temp = ~(temp >> 31); \
- dst[x + pos] = temp;
-
- for (y = 0; y < height; y++) {
- const uint8_t *d = dither[y];
- for (x = 0; x < width; x += 8) {
- int temp;
- STORE2(0);
- STORE2(1);
- STORE2(2);
- STORE2(3);
- STORE2(4);
- STORE2(5);
- STORE2(6);
- STORE2(7);
- }
- src += src_stride;
- dst += dst_stride;
- }
-}
-
-static void mul_thrmat_c(int16_t *thr_adr_noq, int16_t *thr_adr, int q)
-{
- int a;
- for (a = 0; a < 64; a++)
- thr_adr[a] = q * thr_adr_noq[a];
-}
-
-static void filter(FSPPContext *p, uint8_t *dst, uint8_t *src,
- int dst_stride, int src_stride,
- int width, int height,
- uint8_t *qp_store, int qp_stride, int is_luma)
-{
- int x, x0, y, es, qy, t;
-
- const int stride = is_luma ? p->temp_stride : (width + 16);
- const int step = 6 - p->log2_count;
- const int qpsh = 4 - p->hsub * !is_luma;
- const int qpsv = 4 - p->vsub * !is_luma;
-
- DECLARE_ALIGNED(32, int32_t, block_align)[4 * 8 * BLOCKSZ + 4 * 8 * BLOCKSZ];
- int16_t *block = (int16_t *)block_align;
- int16_t *block3 = (int16_t *)(block_align + 4 * 8 * BLOCKSZ);
-
- memset(block3, 0, 4 * 8 * BLOCKSZ);
-
- if (!src || !dst) return;
-
- for (y = 0; y < height; y++) {
- int index = 8 + 8 * stride + y * stride;
- memcpy(p->src + index, src + y * src_stride, width);
- for (x = 0; x < 8; x++) {
- p->src[index - x - 1] = p->src[index + x ];
- p->src[index + width + x ] = p->src[index + width - x - 1];
- }
- }
-
- for (y = 0; y < 8; y++) {
- memcpy(p->src + ( 7 - y ) * stride, p->src + ( y + 8 ) * stride, stride);
- memcpy(p->src + (height + 8 + y) * stride, p->src + (height - y + 7) * stride, stride);
- }
- //FIXME (try edge emu)
-
- for (y = 8; y < 24; y++)
- memset(p->temp + 8 + y * stride, 0, width * sizeof(int16_t));
-
- for (y = step; y < height + 8; y += step) { //step= 1,2
- const int y1 = y - 8 + step; //l5-7 l4-6;
- qy = y - 4;
-
- if (qy > height - 1) qy = height - 1;
- if (qy < 0) qy = 0;
-
- qy = (qy >> qpsv) * qp_stride;
- p->row_fdct(block, p->src + y * stride + 2 - (y&1), stride, 2);
-
- for (x0 = 0; x0 < width + 8 - 8 * (BLOCKSZ - 1); x0 += 8 * (BLOCKSZ - 1)) {
- p->row_fdct(block + 8 * 8, p->src + y * stride + 8 + x0 + 2 - (y&1), stride, 2 * (BLOCKSZ - 1));
-
- if (p->qp)
- p->column_fidct((int16_t *)(&p->threshold_mtx[0]), block + 0 * 8, block3 + 0 * 8, 8 * (BLOCKSZ - 1)); //yes, this is a HOTSPOT
- else
- for (x = 0; x < 8 * (BLOCKSZ - 1); x += 8) {
- t = x + x0 - 2; //correct t=x+x0-2-(y&1), but its the same
-
- if (t < 0) t = 0; //t always < width-2
-
- t = qp_store[qy + (t >> qpsh)];
- t = ff_norm_qscale(t, p->qscale_type);
-
- if (t != p->prev_q) p->prev_q = t, p->mul_thrmat((int16_t *)(&p->threshold_mtx_noq[0]), (int16_t *)(&p->threshold_mtx[0]), t);
- p->column_fidct((int16_t *)(&p->threshold_mtx[0]), block + x * 8, block3 + x * 8, 8); //yes, this is a HOTSPOT
- }
- p->row_idct(block3 + 0 * 8, p->temp + (y & 15) * stride + x0 + 2 - (y & 1), stride, 2 * (BLOCKSZ - 1));
- memmove(block, block + (BLOCKSZ - 1) * 64, 8 * 8 * sizeof(int16_t)); //cycling
- memmove(block3, block3 + (BLOCKSZ - 1) * 64, 6 * 8 * sizeof(int16_t));
- }
-
- es = width + 8 - x0; // 8, ...
- if (es > 8)
- p->row_fdct(block + 8 * 8, p->src + y * stride + 8 + x0 + 2 - (y & 1), stride, (es - 4) >> 2);
-
- p->column_fidct((int16_t *)(&p->threshold_mtx[0]), block, block3, es&(~1));
- if (es > 3)
- p->row_idct(block3 + 0 * 8, p->temp + (y & 15) * stride + x0 + 2 - (y & 1), stride, es >> 2);
-
- if (!(y1 & 7) && y1) {
- if (y1 & 8)
- p->store_slice(dst + (y1 - 8) * dst_stride, p->temp + 8 + 8 * stride,
- dst_stride, stride, width, 8, 5 - p->log2_count);
- else
- p->store_slice2(dst + (y1 - 8) * dst_stride, p->temp + 8 + 0 * stride,
- dst_stride, stride, width, 8, 5 - p->log2_count);
- }
- }
-
- if (y & 7) { // height % 8 != 0
- if (y & 8)
- p->store_slice(dst + ((y - 8) & ~7) * dst_stride, p->temp + 8 + 8 * stride,
- dst_stride, stride, width, y&7, 5 - p->log2_count);
- else
- p->store_slice2(dst + ((y - 8) & ~7) * dst_stride, p->temp + 8 + 0 * stride,
- dst_stride, stride, width, y&7, 5 - p->log2_count);
- }
-}
-
-static void column_fidct_c(int16_t *thr_adr, int16_t *data, int16_t *output, int cnt)
-{
- int_simd16_t tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
- int_simd16_t tmp10, tmp11, tmp12, tmp13;
- int_simd16_t z1,z2,z3,z4,z5, z10, z11, z12, z13;
- int_simd16_t d0, d1, d2, d3, d4, d5, d6, d7;
-
- int16_t *dataptr;
- int16_t *wsptr;
- int16_t *threshold;
- int ctr;
-
- dataptr = data;
- wsptr = output;
-
- for (; cnt > 0; cnt -= 2) { //start positions
- threshold = (int16_t *)thr_adr;//threshold_mtx
- for (ctr = DCTSIZE; ctr > 0; ctr--) {
- // Process columns from input, add to output.
- tmp0 = dataptr[DCTSIZE * 0] + dataptr[DCTSIZE * 7];
- tmp7 = dataptr[DCTSIZE * 0] - dataptr[DCTSIZE * 7];
-
- tmp1 = dataptr[DCTSIZE * 1] + dataptr[DCTSIZE * 6];
- tmp6 = dataptr[DCTSIZE * 1] - dataptr[DCTSIZE * 6];
-
- tmp2 = dataptr[DCTSIZE * 2] + dataptr[DCTSIZE * 5];
- tmp5 = dataptr[DCTSIZE * 2] - dataptr[DCTSIZE * 5];
-
- tmp3 = dataptr[DCTSIZE * 3] + dataptr[DCTSIZE * 4];
- tmp4 = dataptr[DCTSIZE * 3] - dataptr[DCTSIZE * 4];
-
- // Even part of FDCT
-
- tmp10 = tmp0 + tmp3;
- tmp13 = tmp0 - tmp3;
- tmp11 = tmp1 + tmp2;
- tmp12 = tmp1 - tmp2;
-
- d0 = tmp10 + tmp11;
- d4 = tmp10 - tmp11;
-
- z1 = MULTIPLY16H((tmp12 + tmp13) << 2, FIX_0_707106781);
- d2 = tmp13 + z1;
- d6 = tmp13 - z1;
-
- // Even part of IDCT
-
- THRESHOLD(tmp0, d0, threshold[0 * 8]);
- THRESHOLD(tmp1, d2, threshold[2 * 8]);
- THRESHOLD(tmp2, d4, threshold[4 * 8]);
- THRESHOLD(tmp3, d6, threshold[6 * 8]);
- tmp0 += 2;
- tmp10 = (tmp0 + tmp2) >> 2;
- tmp11 = (tmp0 - tmp2) >> 2;
-
- tmp13 = (tmp1 + tmp3) >>2; //+2 ! (psnr decides)
- tmp12 = MULTIPLY16H((tmp1 - tmp3), FIX_1_414213562_A) - tmp13; //<<2
-
- tmp0 = tmp10 + tmp13; //->temps
- tmp3 = tmp10 - tmp13; //->temps
- tmp1 = tmp11 + tmp12; //->temps
- tmp2 = tmp11 - tmp12; //->temps
-
- // Odd part of FDCT
-
- tmp10 = tmp4 + tmp5;
- tmp11 = tmp5 + tmp6;
- tmp12 = tmp6 + tmp7;
-
- z5 = MULTIPLY16H((tmp10 - tmp12) << 2, FIX_0_382683433);
- z2 = MULTIPLY16H(tmp10 << 2, FIX_0_541196100) + z5;
- z4 = MULTIPLY16H(tmp12 << 2, FIX_1_306562965) + z5;
- z3 = MULTIPLY16H(tmp11 << 2, FIX_0_707106781);
-
- z11 = tmp7 + z3;
- z13 = tmp7 - z3;
-
- d5 = z13 + z2;
- d3 = z13 - z2;
- d1 = z11 + z4;
- d7 = z11 - z4;
-
- // Odd part of IDCT
-
- THRESHOLD(tmp4, d1, threshold[1 * 8]);
- THRESHOLD(tmp5, d3, threshold[3 * 8]);
- THRESHOLD(tmp6, d5, threshold[5 * 8]);
- THRESHOLD(tmp7, d7, threshold[7 * 8]);
-
- //Simd version uses here a shortcut for the tmp5,tmp6,tmp7 == 0
- z13 = tmp6 + tmp5;
- z10 = (tmp6 - tmp5) << 1;
- z11 = tmp4 + tmp7;
- z12 = (tmp4 - tmp7) << 1;
-
- tmp7 = (z11 + z13) >> 2; //+2 !
- tmp11 = MULTIPLY16H((z11 - z13) << 1, FIX_1_414213562);
- z5 = MULTIPLY16H(z10 + z12, FIX_1_847759065);
- tmp10 = MULTIPLY16H(z12, FIX_1_082392200) - z5;
- tmp12 = MULTIPLY16H(z10, FIX_2_613125930) + z5; // - !!
-
- tmp6 = tmp12 - tmp7;
- tmp5 = tmp11 - tmp6;
- tmp4 = tmp10 + tmp5;
-
- wsptr[DCTSIZE * 0] += (tmp0 + tmp7);
- wsptr[DCTSIZE * 1] += (tmp1 + tmp6);
- wsptr[DCTSIZE * 2] += (tmp2 + tmp5);
- wsptr[DCTSIZE * 3] += (tmp3 - tmp4);
- wsptr[DCTSIZE * 4] += (tmp3 + tmp4);
- wsptr[DCTSIZE * 5] += (tmp2 - tmp5);
- wsptr[DCTSIZE * 6] = (tmp1 - tmp6);
- wsptr[DCTSIZE * 7] = (tmp0 - tmp7);
- //
- dataptr++; //next column
- wsptr++;
- threshold++;
- }
- dataptr += 8; //skip each second start pos
- wsptr += 8;
- }
-}
-
-static void row_idct_c(int16_t *workspace, int16_t *output_adr, ptrdiff_t output_stride, int cnt)
-{
- int_simd16_t tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
- int_simd16_t tmp10, tmp11, tmp12, tmp13;
- int_simd16_t z5, z10, z11, z12, z13;
- int16_t *outptr;
- int16_t *wsptr;
-
- cnt *= 4;
- wsptr = workspace;
- outptr = output_adr;
- for (; cnt > 0; cnt--) {
- // Even part
- //Simd version reads 4x4 block and transposes it
- tmp10 = wsptr[2] + wsptr[3];
- tmp11 = wsptr[2] - wsptr[3];
-
- tmp13 = wsptr[0] + wsptr[1];
- tmp12 = (MULTIPLY16H(wsptr[0] - wsptr[1], FIX_1_414213562_A) << 2) - tmp13;//this shift order to avoid overflow
-
- tmp0 = tmp10 + tmp13; //->temps
- tmp3 = tmp10 - tmp13; //->temps
- tmp1 = tmp11 + tmp12;
- tmp2 = tmp11 - tmp12;
-
- // Odd part
- //Also transpose, with previous:
- // ---- ---- ||||
- // ---- ---- idct ||||
- // ---- ---- ---> ||||
- // ---- ---- ||||
- z13 = wsptr[4] + wsptr[5];
- z10 = wsptr[4] - wsptr[5];
- z11 = wsptr[6] + wsptr[7];
- z12 = wsptr[6] - wsptr[7];
-
- tmp7 = z11 + z13;
- tmp11 = MULTIPLY16H(z11 - z13, FIX_1_414213562);
-
- z5 = MULTIPLY16H(z10 + z12, FIX_1_847759065);
- tmp10 = MULTIPLY16H(z12, FIX_1_082392200) - z5;
- tmp12 = MULTIPLY16H(z10, FIX_2_613125930) + z5; // - FIX_
-
- tmp6 = (tmp12 << 3) - tmp7;
- tmp5 = (tmp11 << 3) - tmp6;
- tmp4 = (tmp10 << 3) + tmp5;
-
- // Final output stage: descale and write column
- outptr[0 * output_stride] += DESCALE(tmp0 + tmp7, 3);
- outptr[1 * output_stride] += DESCALE(tmp1 + tmp6, 3);
- outptr[2 * output_stride] += DESCALE(tmp2 + tmp5, 3);
- outptr[3 * output_stride] += DESCALE(tmp3 - tmp4, 3);
- outptr[4 * output_stride] += DESCALE(tmp3 + tmp4, 3);
- outptr[5 * output_stride] += DESCALE(tmp2 - tmp5, 3);
- outptr[6 * output_stride] += DESCALE(tmp1 - tmp6, 3); //no += ?
- outptr[7 * output_stride] += DESCALE(tmp0 - tmp7, 3); //no += ?
- outptr++;
-
- wsptr += DCTSIZE; // advance pointer to next row
- }
-}
-
-static void row_fdct_c(int16_t *data, const uint8_t *pixels, ptrdiff_t line_size, int cnt)
-{
- int_simd16_t tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
- int_simd16_t tmp10, tmp11, tmp12, tmp13;
- int_simd16_t z1, z2, z3, z4, z5, z11, z13;
- int16_t *dataptr;
-
- cnt *= 4;
- // Pass 1: process rows.
-
- dataptr = data;
- for (; cnt > 0; cnt--) {
- tmp0 = pixels[line_size * 0] + pixels[line_size * 7];
- tmp7 = pixels[line_size * 0] - pixels[line_size * 7];
- tmp1 = pixels[line_size * 1] + pixels[line_size * 6];
- tmp6 = pixels[line_size * 1] - pixels[line_size * 6];
- tmp2 = pixels[line_size * 2] + pixels[line_size * 5];
- tmp5 = pixels[line_size * 2] - pixels[line_size * 5];
- tmp3 = pixels[line_size * 3] + pixels[line_size * 4];
- tmp4 = pixels[line_size * 3] - pixels[line_size * 4];
-
- // Even part
-
- tmp10 = tmp0 + tmp3;
- tmp13 = tmp0 - tmp3;
- tmp11 = tmp1 + tmp2;
- tmp12 = tmp1 - tmp2;
- //Even columns are written first, this leads to different order of columns
- //in column_fidct(), but they are processed independently, so all ok.
- //Later in the row_idct() columns readed at the same order.
- dataptr[2] = tmp10 + tmp11;
- dataptr[3] = tmp10 - tmp11;
-
- z1 = MULTIPLY16H((tmp12 + tmp13) << 2, FIX_0_707106781);
- dataptr[0] = tmp13 + z1;
- dataptr[1] = tmp13 - z1;
-
- // Odd part
-
- tmp10 = (tmp4 + tmp5) << 2;
- tmp11 = (tmp5 + tmp6) << 2;
- tmp12 = (tmp6 + tmp7) << 2;
-
- z5 = MULTIPLY16H(tmp10 - tmp12, FIX_0_382683433);
- z2 = MULTIPLY16H(tmp10, FIX_0_541196100) + z5;
- z4 = MULTIPLY16H(tmp12, FIX_1_306562965) + z5;
- z3 = MULTIPLY16H(tmp11, FIX_0_707106781);
-
- z11 = tmp7 + z3;
- z13 = tmp7 - z3;
-
- dataptr[4] = z13 + z2;
- dataptr[5] = z13 - z2;
- dataptr[6] = z11 + z4;
- dataptr[7] = z11 - z4;
-
- pixels++; // advance pointer to next column
- dataptr += DCTSIZE;
- }
-}
-
-static int query_formats(AVFilterContext *ctx)
-{
- static const enum AVPixelFormat pix_fmts[] = {
- AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV422P,
- AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV411P,
- AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV440P,
- AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUVJ422P,
- AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ440P,
- AV_PIX_FMT_GBRP, AV_PIX_FMT_GRAY8,
- AV_PIX_FMT_NONE
- };
-
- AVFilterFormats *fmts_list = ff_make_format_list(pix_fmts);
- if (!fmts_list)
- return AVERROR(ENOMEM);
- return ff_set_common_formats(ctx, fmts_list);
-}
-
-static int config_input(AVFilterLink *inlink)
-{
- AVFilterContext *ctx = inlink->dst;
- FSPPContext *fspp = ctx->priv;
- const int h = FFALIGN(inlink->h + 16, 16);
- const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
-
- fspp->hsub = desc->log2_chroma_w;
- fspp->vsub = desc->log2_chroma_h;
-
- fspp->temp_stride = FFALIGN(inlink->w + 16, 16);
- fspp->temp = av_malloc_array(fspp->temp_stride, h * sizeof(*fspp->temp));
- fspp->src = av_malloc_array(fspp->temp_stride, h * sizeof(*fspp->src));
-
- if (!fspp->temp || !fspp->src)
- return AVERROR(ENOMEM);
-
- if (!fspp->use_bframe_qp && !fspp->qp) {
- fspp->non_b_qp_alloc_size = AV_CEIL_RSHIFT(inlink->w, 4) * AV_CEIL_RSHIFT(inlink->h, 4);
- fspp->non_b_qp_table = av_calloc(fspp->non_b_qp_alloc_size, sizeof(*fspp->non_b_qp_table));
- if (!fspp->non_b_qp_table)
- return AVERROR(ENOMEM);
- }
-
- fspp->store_slice = store_slice_c;
- fspp->store_slice2 = store_slice2_c;
- fspp->mul_thrmat = mul_thrmat_c;
- fspp->column_fidct = column_fidct_c;
- fspp->row_idct = row_idct_c;
- fspp->row_fdct = row_fdct_c;
-
- if (ARCH_X86)
- ff_fspp_init_x86(fspp);
-
- return 0;
-}
-
-static int filter_frame(AVFilterLink *inlink, AVFrame *in)
-{
- AVFilterContext *ctx = inlink->dst;
- FSPPContext *fspp = ctx->priv;
- AVFilterLink *outlink = ctx->outputs[0];
- AVFrame *out = in;
-
- int qp_stride = 0;
- uint8_t *qp_table = NULL;
- int i, bias;
- int custom_threshold_m[64];
-
- bias = (1 << 4) + fspp->strength;
-
- for (i = 0; i < 64; i++) //FIXME: tune custom_threshold[] and remove this !
- custom_threshold_m[i] = (int)(custom_threshold[i] * (bias / 71.0) + 0.5);
-
- for (i = 0; i < 8; i++) {
- fspp->threshold_mtx_noq[2 * i] = (uint64_t)custom_threshold_m[i * 8 + 2]
- |(((uint64_t)custom_threshold_m[i * 8 + 6]) << 16)
- |(((uint64_t)custom_threshold_m[i * 8 + 0]) << 32)
- |(((uint64_t)custom_threshold_m[i * 8 + 4]) << 48);
-
- fspp->threshold_mtx_noq[2 * i + 1] = (uint64_t)custom_threshold_m[i * 8 + 5]
- |(((uint64_t)custom_threshold_m[i * 8 + 3]) << 16)
- |(((uint64_t)custom_threshold_m[i * 8 + 1]) << 32)
- |(((uint64_t)custom_threshold_m[i * 8 + 7]) << 48);
- }
-
- if (fspp->qp)
- fspp->prev_q = fspp->qp, fspp->mul_thrmat((int16_t *)(&fspp->threshold_mtx_noq[0]), (int16_t *)(&fspp->threshold_mtx[0]), fspp->qp);
-
- /* if we are not in a constant user quantizer mode and we don't want to use
- * the quantizers from the B-frames (B-frames often have a higher QP), we
- * need to save the qp table from the last non B-frame; this is what the
- * following code block does */
- if (!fspp->qp) {
- qp_table = av_frame_get_qp_table(in, &qp_stride, &fspp->qscale_type);
-
- if (qp_table && !fspp->use_bframe_qp && in->pict_type != AV_PICTURE_TYPE_B) {
- int w, h;
-
- /* if the qp stride is not set, it means the QP are only defined on
- * a line basis */
- if (!qp_stride) {
- w = AV_CEIL_RSHIFT(inlink->w, 4);
- h = 1;
- } else {
- w = qp_stride;
- h = AV_CEIL_RSHIFT(inlink->h, 4);
- }
- if (w * h > fspp->non_b_qp_alloc_size) {
- int ret = av_reallocp_array(&fspp->non_b_qp_table, w, h);
- if (ret < 0) {
- fspp->non_b_qp_alloc_size = 0;
- return ret;
- }
- fspp->non_b_qp_alloc_size = w * h;
- }
-
- av_assert0(w * h <= fspp->non_b_qp_alloc_size);
- memcpy(fspp->non_b_qp_table, qp_table, w * h);
- }
- }
-
- if (fspp->log2_count && !ctx->is_disabled) {
- if (!fspp->use_bframe_qp && fspp->non_b_qp_table)
- qp_table = fspp->non_b_qp_table;
-
- if (qp_table || fspp->qp) {
- const int cw = AV_CEIL_RSHIFT(inlink->w, fspp->hsub);
- const int ch = AV_CEIL_RSHIFT(inlink->h, fspp->vsub);
-
- /* get a new frame if in-place is not possible or if the dimensions
- * are not multiple of 8 */
- if (!av_frame_is_writable(in) || (inlink->w & 7) || (inlink->h & 7)) {
- const int aligned_w = FFALIGN(inlink->w, 8);
- const int aligned_h = FFALIGN(inlink->h, 8);
-
- out = ff_get_video_buffer(outlink, aligned_w, aligned_h);
- if (!out) {
- av_frame_free(&in);
- return AVERROR(ENOMEM);
- }
- av_frame_copy_props(out, in);
- out->width = in->width;
- out->height = in->height;
- }
-
- filter(fspp, out->data[0], in->data[0], out->linesize[0], in->linesize[0],
- inlink->w, inlink->h, qp_table, qp_stride, 1);
- filter(fspp, out->data[1], in->data[1], out->linesize[1], in->linesize[1],
- cw, ch, qp_table, qp_stride, 0);
- filter(fspp, out->data[2], in->data[2], out->linesize[2], in->linesize[2],
- cw, ch, qp_table, qp_stride, 0);
- emms_c();
- }
- }
-
- if (in != out) {
- if (in->data[3])
- av_image_copy_plane(out->data[3], out->linesize[3],
- in ->data[3], in ->linesize[3],
- inlink->w, inlink->h);
- av_frame_free(&in);
- }
- return ff_filter_frame(outlink, out);
-}
-
-static av_cold void uninit(AVFilterContext *ctx)
-{
- FSPPContext *fspp = ctx->priv;
- av_freep(&fspp->temp);
- av_freep(&fspp->src);
- av_freep(&fspp->non_b_qp_table);
-}
-
-static const AVFilterPad fspp_inputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- .config_props = config_input,
- .filter_frame = filter_frame,
- },
- { NULL }
-};
-
-static const AVFilterPad fspp_outputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- },
- { NULL }
-};
-
-AVFilter ff_vf_fspp = {
- .name = "fspp",
- .description = NULL_IF_CONFIG_SMALL("Apply Fast Simple Post-processing filter."),
- .priv_size = sizeof(FSPPContext),
- .uninit = uninit,
- .query_formats = query_formats,
- .inputs = fspp_inputs,
- .outputs = fspp_outputs,
- .priv_class = &fspp_class,
- .flags = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL,
-};
diff --git a/libavfilter/vf_fspp.h b/libavfilter/vf_fspp.h
deleted file mode 100644
index 73d8c7c..0000000
--- a/libavfilter/vf_fspp.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
- * Copyright (C) 2005 Nikolaj Poroshin <porosh3@psu.ru>
- * Copyright (c) 2014 Arwa Arif <arwaarif1994@gmail.com>
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef AVFILTER_FSPP_H
-#define AVFILTER_FSPP_H
-
-#include "avfilter.h"
-
-#define BLOCKSZ 12
-#define MAX_LEVEL 5
-
-#define DCTSIZE 8
-#define DCTSIZE_S "8"
-
-#define FIX(x,s) ((x) * (1 << s) + 0.5)
-
-#define MULTIPLY16H(x,k) (((x) * (k)) >> 16)
-#define THRESHOLD(r,x,t) \
- if(((unsigned)((x) + t)) > t * 2) r = (x); \
- else r = 0;
-#define DESCALE(x,n) (((x) + (1 << ((n) - 1))) >> n)
-
-typedef int32_t int_simd16_t;
-static const int16_t FIX_0_382683433 = FIX(0.382683433, 14);
-static const int16_t FIX_0_541196100 = FIX(0.541196100, 14);
-static const int16_t FIX_0_707106781 = FIX(M_SQRT1_2 , 14);
-static const int16_t FIX_1_306562965 = FIX(1.306562965, 14);
-static const int16_t FIX_1_414213562_A = FIX(M_SQRT2 , 14);
-static const int16_t FIX_1_847759065 = FIX(1.847759065, 13);
-static const int16_t FIX_2_613125930 = FIX(-2.613125930, 13);
-static const int16_t FIX_1_414213562 = FIX(M_SQRT2 , 13);
-static const int16_t FIX_1_082392200 = FIX(1.082392200, 13);
-
-typedef struct FSPPContext {
- AVClass *class;
- uint64_t threshold_mtx_noq[8 * 2];
- uint64_t threshold_mtx[8 * 2]; //used in both C & MMX (& later SSE2) versions
-
- int log2_count;
- int strength;
- int hsub;
- int vsub;
- int temp_stride;
- int qp;
- int qscale_type;
- int prev_q;
- uint8_t *src;
- int16_t *temp;
- uint8_t *non_b_qp_table;
- int non_b_qp_alloc_size;
- int use_bframe_qp;
-
- void (*store_slice)(uint8_t *dst, int16_t *src,
- ptrdiff_t dst_stride, ptrdiff_t src_stride,
- ptrdiff_t width, ptrdiff_t height, ptrdiff_t log2_scale);
-
- void (*store_slice2)(uint8_t *dst, int16_t *src,
- ptrdiff_t dst_stride, ptrdiff_t src_stride,
- ptrdiff_t width, ptrdiff_t height, ptrdiff_t log2_scale);
-
- void (*mul_thrmat)(int16_t *thr_adr_noq, int16_t *thr_adr, int q);
-
- void (*column_fidct)(int16_t *thr_adr, int16_t *data,
- int16_t *output, int cnt);
-
- void (*row_idct)(int16_t *workspace, int16_t *output_adr,
- ptrdiff_t output_stride, int cnt);
-
- void (*row_fdct)(int16_t *data, const uint8_t *pixels,
- ptrdiff_t line_size, int cnt);
-
-} FSPPContext;
-
-void ff_fspp_init_x86(FSPPContext *fspp);
-
-#endif /* AVFILTER_FSPP_H */
diff --git a/libavfilter/vf_geq.c b/libavfilter/vf_geq.c
deleted file mode 100644
index d7abf96..0000000
--- a/libavfilter/vf_geq.c
+++ /dev/null
@@ -1,506 +0,0 @@
-/*
- * Copyright (C) 2006 Michael Niedermayer <michaelni@gmx.at>
- * Copyright (C) 2012 Clément Bœsch <u pkh me>
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with FFmpeg; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-/**
- * @file
- * Generic equation change filter
- * Originally written by Michael Niedermayer for the MPlayer project, and
- * ported by Clément Bœsch for FFmpeg.
- */
-
-#include "libavutil/avassert.h"
-#include "libavutil/avstring.h"
-#include "libavutil/eval.h"
-#include "libavutil/opt.h"
-#include "libavutil/pixdesc.h"
-#include "internal.h"
-
-#define MAX_NB_THREADS 32
-#define NB_PLANES 4
-
-enum InterpolationMethods {
- INTERP_NEAREST,
- INTERP_BILINEAR,
- NB_INTERP
-};
-
-static const char *const var_names[] = { "X", "Y", "W", "H", "N", "SW", "SH", "T", NULL };
-enum { VAR_X, VAR_Y, VAR_W, VAR_H, VAR_N, VAR_SW, VAR_SH, VAR_T, VAR_VARS_NB };
-
-typedef struct GEQContext {
- const AVClass *class;
- AVExpr *e[NB_PLANES][MAX_NB_THREADS]; ///< expressions for each plane and thread
- char *expr_str[4+3]; ///< expression strings for each plane
- AVFrame *picref; ///< current input buffer
- uint8_t *dst; ///< reference pointer to the 8bits output
- uint16_t *dst16; ///< reference pointer to the 16bits output
- double values[VAR_VARS_NB]; ///< expression values
- int hsub, vsub; ///< chroma subsampling
- int planes; ///< number of planes
- int interpolation;
- int is_rgb;
- int bps;
-
- double *pixel_sums[NB_PLANES];
- int needs_sum[NB_PLANES];
-} GEQContext;
-
-enum { Y = 0, U, V, A, G, B, R };
-
-#define OFFSET(x) offsetof(GEQContext, x)
-#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
-
-static const AVOption geq_options[] = {
- { "lum_expr", "set luminance expression", OFFSET(expr_str[Y]), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, FLAGS },
- { "lum", "set luminance expression", OFFSET(expr_str[Y]), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, FLAGS },
- { "cb_expr", "set chroma blue expression", OFFSET(expr_str[U]), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, FLAGS },
- { "cb", "set chroma blue expression", OFFSET(expr_str[U]), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, FLAGS },
- { "cr_expr", "set chroma red expression", OFFSET(expr_str[V]), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, FLAGS },
- { "cr", "set chroma red expression", OFFSET(expr_str[V]), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, FLAGS },
- { "alpha_expr", "set alpha expression", OFFSET(expr_str[A]), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, FLAGS },
- { "a", "set alpha expression", OFFSET(expr_str[A]), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, FLAGS },
- { "red_expr", "set red expression", OFFSET(expr_str[R]), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, FLAGS },
- { "r", "set red expression", OFFSET(expr_str[R]), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, FLAGS },
- { "green_expr", "set green expression", OFFSET(expr_str[G]), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, FLAGS },
- { "g", "set green expression", OFFSET(expr_str[G]), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, FLAGS },
- { "blue_expr", "set blue expression", OFFSET(expr_str[B]), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, FLAGS },
- { "b", "set blue expression", OFFSET(expr_str[B]), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, FLAGS },
- { "interpolation","set interpolation method", OFFSET(interpolation), AV_OPT_TYPE_INT, {.i64=INTERP_BILINEAR}, 0, NB_INTERP-1, FLAGS, "interp" },
- { "i", "set interpolation method", OFFSET(interpolation), AV_OPT_TYPE_INT, {.i64=INTERP_BILINEAR}, 0, NB_INTERP-1, FLAGS, "interp" },
- { "nearest", "nearest interpolation", 0, AV_OPT_TYPE_CONST, {.i64=INTERP_NEAREST}, 0, 0, FLAGS, "interp" },
- { "n", "nearest interpolation", 0, AV_OPT_TYPE_CONST, {.i64=INTERP_NEAREST}, 0, 0, FLAGS, "interp" },
- { "bilinear", "bilinear interpolation", 0, AV_OPT_TYPE_CONST, {.i64=INTERP_BILINEAR}, 0, 0, FLAGS, "interp" },
- { "b", "bilinear interpolation", 0, AV_OPT_TYPE_CONST, {.i64=INTERP_BILINEAR}, 0, 0, FLAGS, "interp" },
- {NULL},
-};
-
-AVFILTER_DEFINE_CLASS(geq);
-
-static inline double getpix(void *priv, double x, double y, int plane)
-{
- int xi, yi;
- GEQContext *geq = priv;
- AVFrame *picref = geq->picref;
- const uint8_t *src = picref->data[plane];
- int linesize = picref->linesize[plane];
- const int w = (plane == 1 || plane == 2) ? AV_CEIL_RSHIFT(picref->width, geq->hsub) : picref->width;
- const int h = (plane == 1 || plane == 2) ? AV_CEIL_RSHIFT(picref->height, geq->vsub) : picref->height;
-
- if (!src)
- return 0;
-
- if (geq->interpolation == INTERP_BILINEAR) {
- xi = x = av_clipd(x, 0, w - 2);
- yi = y = av_clipd(y, 0, h - 2);
-
- x -= xi;
- y -= yi;
-
- if (geq->bps > 8) {
- const uint16_t *src16 = (const uint16_t*)src;
- linesize /= 2;
-
- return (1-y)*((1-x)*src16[xi + yi * linesize] + x*src16[xi + 1 + yi * linesize])
- + y *((1-x)*src16[xi + (yi+1) * linesize] + x*src16[xi + 1 + (yi+1) * linesize]);
- } else {
- return (1-y)*((1-x)*src[xi + yi * linesize] + x*src[xi + 1 + yi * linesize])
- + y *((1-x)*src[xi + (yi+1) * linesize] + x*src[xi + 1 + (yi+1) * linesize]);
- }
- } else {
- xi = av_clipd(x, 0, w - 1);
- yi = av_clipd(y, 0, h - 1);
-
- if (geq->bps > 8) {
- const uint16_t *src16 = (const uint16_t*)src;
- linesize /= 2;
-
- return src16[xi + yi * linesize];
- } else {
- return src[xi + yi * linesize];
- }
- }
-}
-
-static int calculate_sums(GEQContext *geq, int plane, int w, int h)
-{
- int xi, yi;
- AVFrame *picref = geq->picref;
- const uint8_t *src = picref->data[plane];
- int linesize = picref->linesize[plane];
-
- if (!geq->pixel_sums[plane])
- geq->pixel_sums[plane] = av_malloc_array(w, h * sizeof (*geq->pixel_sums[plane]));
- if (!geq->pixel_sums[plane])
- return AVERROR(ENOMEM);
- if (geq->bps > 8)
- linesize /= 2;
- for (yi = 0; yi < h; yi ++) {
- if (geq->bps > 8) {
- const uint16_t *src16 = (const uint16_t*)src;
- double linesum = 0;
-
- for (xi = 0; xi < w; xi ++) {
- linesum += src16[xi + yi * linesize];
- geq->pixel_sums[plane][xi + yi * w] = linesum;
- }
- } else {
- double linesum = 0;
-
- for (xi = 0; xi < w; xi ++) {
- linesum += src[xi + yi * linesize];
- geq->pixel_sums[plane][xi + yi * w] = linesum;
- }
- }
- if (yi)
- for (xi = 0; xi < w; xi ++) {
- geq->pixel_sums[plane][xi + yi * w] += geq->pixel_sums[plane][xi + yi * w - w];
- }
- }
- return 0;
-}
-
-static inline double getpix_integrate_internal(GEQContext *geq, int x, int y, int plane, int w, int h)
-{
- if (x > w - 1) {
- double boundary = getpix_integrate_internal(geq, w - 1, y, plane, w, h);
- return 2*boundary - getpix_integrate_internal(geq, 2*(w - 1) - x, y, plane, w, h);
- } else if (y > h - 1) {
- double boundary = getpix_integrate_internal(geq, x, h - 1, plane, w, h);
- return 2*boundary - getpix_integrate_internal(geq, x, 2*(h - 1) - y, plane, w, h);
- } else if (x < 0) {
- if (x == -1) return 0;
- return - getpix_integrate_internal(geq, -x-2, y, plane, w, h);
- } else if (y < 0) {
- if (y == -1) return 0;
- return - getpix_integrate_internal(geq, x, -y-2, plane, w, h);
- }
-
- return geq->pixel_sums[plane][x + y * w];
-}
-
-static inline double getpix_integrate(void *priv, double x, double y, int plane) {
- GEQContext *geq = priv;
- AVFrame *picref = geq->picref;
- const uint8_t *src = picref->data[plane];
- const int w = (plane == 1 || plane == 2) ? AV_CEIL_RSHIFT(picref->width, geq->hsub) : picref->width;
- const int h = (plane == 1 || plane == 2) ? AV_CEIL_RSHIFT(picref->height, geq->vsub) : picref->height;
-
- if (!src)
- return 0;
-
- return getpix_integrate_internal(geq, lrint(av_clipd(x, -w, 2*w)), lrint(av_clipd(y, -h, 2*h)), plane, w, h);
-}
-
-//TODO: cubic interpolate
-//TODO: keep the last few frames
-static double lum(void *priv, double x, double y) { return getpix(priv, x, y, 0); }
-static double cb(void *priv, double x, double y) { return getpix(priv, x, y, 1); }
-static double cr(void *priv, double x, double y) { return getpix(priv, x, y, 2); }
-static double alpha(void *priv, double x, double y) { return getpix(priv, x, y, 3); }
-
-static double lumsum(void *priv, double x, double y) { return getpix_integrate(priv, x, y, 0); }
-static double cbsum(void *priv, double x, double y) { return getpix_integrate(priv, x, y, 1); }
-static double crsub(void *priv, double x, double y) { return getpix_integrate(priv, x, y, 2); }
-static double alphasum(void *priv, double x, double y) { return getpix_integrate(priv, x, y, 3); }
-
-static av_cold int geq_init(AVFilterContext *ctx)
-{
- GEQContext *geq = ctx->priv;
- int plane, ret = 0;
-
- if (!geq->expr_str[Y] && !geq->expr_str[G] && !geq->expr_str[B] && !geq->expr_str[R]) {
- av_log(ctx, AV_LOG_ERROR, "A luminance or RGB expression is mandatory\n");
- ret = AVERROR(EINVAL);
- goto end;
- }
- geq->is_rgb = !geq->expr_str[Y];
-
- if ((geq->expr_str[Y] || geq->expr_str[U] || geq->expr_str[V]) && (geq->expr_str[G] || geq->expr_str[B] || geq->expr_str[R])) {
- av_log(ctx, AV_LOG_ERROR, "Either YCbCr or RGB but not both must be specified\n");
- ret = AVERROR(EINVAL);
- goto end;
- }
-
- if (!geq->expr_str[U] && !geq->expr_str[V]) {
- /* No chroma at all: fallback on luma */
- geq->expr_str[U] = av_strdup(geq->expr_str[Y]);
- geq->expr_str[V] = av_strdup(geq->expr_str[Y]);
- } else {
- /* One chroma unspecified, fallback on the other */
- if (!geq->expr_str[U]) geq->expr_str[U] = av_strdup(geq->expr_str[V]);
- if (!geq->expr_str[V]) geq->expr_str[V] = av_strdup(geq->expr_str[U]);
- }
-
- if (!geq->expr_str[A]) {
- char bps_string[8];
- snprintf(bps_string, sizeof(bps_string), "%d", (1<<geq->bps) - 1);
- geq->expr_str[A] = av_strdup(bps_string);
- }
- if (!geq->expr_str[G])
- geq->expr_str[G] = av_strdup("g(X,Y)");
- if (!geq->expr_str[B])
- geq->expr_str[B] = av_strdup("b(X,Y)");
- if (!geq->expr_str[R])
- geq->expr_str[R] = av_strdup("r(X,Y)");
-
- if (geq->is_rgb ?
- (!geq->expr_str[G] || !geq->expr_str[B] || !geq->expr_str[R])
- :
- (!geq->expr_str[U] || !geq->expr_str[V] || !geq->expr_str[A])) {
- ret = AVERROR(ENOMEM);
- goto end;
- }
-
- for (plane = 0; plane < NB_PLANES; plane++) {
- static double (*p[])(void *, double, double) = {
- lum , cb , cr , alpha ,
- lumsum, cbsum, crsub, alphasum,
- };
- static const char *const func2_yuv_names[] = {
- "lum" , "cb" , "cr" , "alpha" , "p",
- "lumsum", "cbsum", "crsum", "alphasum", "psum",
- NULL };
- static const char *const func2_rgb_names[] = {
- "g" , "b" , "r" , "alpha" , "p",
- "gsum", "bsum", "rsum", "alphasum", "psum",
- NULL };
- const char *const *func2_names = geq->is_rgb ? func2_rgb_names : func2_yuv_names;
- double (*func2[])(void *, double, double) = {
- lum , cb , cr , alpha , p[plane],
- lumsum, cbsum, crsub, alphasum, p[plane + 4],
- NULL };
- int counter[10] = {0};
-
- for (int i = 0; i < MAX_NB_THREADS; i++) {
- ret = av_expr_parse(&geq->e[plane][i], geq->expr_str[plane < 3 && geq->is_rgb ? plane+4 : plane], var_names,
- NULL, NULL, func2_names, func2, 0, ctx);
- if (ret < 0)
- goto end;
- }
-
- av_expr_count_func(geq->e[plane][0], counter, FF_ARRAY_ELEMS(counter), 2);
- geq->needs_sum[plane] = counter[5] + counter[6] + counter[7] + counter[8] + counter[9];
- }
-
-end:
- return ret;
-}
-
-static int geq_query_formats(AVFilterContext *ctx)
-{
- GEQContext *geq = ctx->priv;
- static const enum AVPixelFormat yuv_pix_fmts[] = {
- AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV420P,
- AV_PIX_FMT_YUV411P, AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV440P,
- AV_PIX_FMT_YUVA444P, AV_PIX_FMT_YUVA422P, AV_PIX_FMT_YUVA420P,
- AV_PIX_FMT_GRAY8,
- AV_PIX_FMT_YUV444P9, AV_PIX_FMT_YUV422P9, AV_PIX_FMT_YUV420P9,
- AV_PIX_FMT_YUVA444P9, AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA420P9,
- AV_PIX_FMT_YUV444P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV420P10,
- AV_PIX_FMT_YUV440P10,
- AV_PIX_FMT_YUVA444P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA420P10,
- AV_PIX_FMT_GRAY9, AV_PIX_FMT_GRAY10,
- AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV420P12,
- AV_PIX_FMT_GRAY12, AV_PIX_FMT_GRAY14,
- AV_PIX_FMT_YUV444P14, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV420P14,
- AV_PIX_FMT_YUV444P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV420P16,
- AV_PIX_FMT_YUVA444P16, AV_PIX_FMT_YUVA422P16, AV_PIX_FMT_YUVA420P16,
- AV_PIX_FMT_GRAY16,
- AV_PIX_FMT_NONE
- };
- static const enum AVPixelFormat rgb_pix_fmts[] = {
- AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRAP,
- AV_PIX_FMT_GBRP9,
- AV_PIX_FMT_GBRP10, AV_PIX_FMT_GBRAP10,
- AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRAP12,
- AV_PIX_FMT_GBRP14,
- AV_PIX_FMT_GBRP16, AV_PIX_FMT_GBRAP16,
- AV_PIX_FMT_NONE
- };
- AVFilterFormats *fmts_list;
-
- if (geq->is_rgb) {
- fmts_list = ff_make_format_list(rgb_pix_fmts);
- } else
- fmts_list = ff_make_format_list(yuv_pix_fmts);
- if (!fmts_list)
- return AVERROR(ENOMEM);
- return ff_set_common_formats(ctx, fmts_list);
-}
-
-static int geq_config_props(AVFilterLink *inlink)
-{
- GEQContext *geq = inlink->dst->priv;
- const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
-
- av_assert0(desc);
-
- geq->hsub = desc->log2_chroma_w;
- geq->vsub = desc->log2_chroma_h;
- geq->bps = desc->comp[0].depth;
- geq->planes = desc->nb_components;
- return 0;
-}
-
-typedef struct ThreadData {
- int height;
- int width;
- int plane;
- int linesize;
-} ThreadData;
-
-static int slice_geq_filter(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
-{
- GEQContext *geq = ctx->priv;
- ThreadData *td = arg;
- const int height = td->height;
- const int width = td->width;
- const int plane = td->plane;
- const int linesize = td->linesize;
- const int slice_start = (height * jobnr) / nb_jobs;
- const int slice_end = (height * (jobnr+1)) / nb_jobs;
- int x, y;
-
- double values[VAR_VARS_NB];
- values[VAR_W] = geq->values[VAR_W];
- values[VAR_H] = geq->values[VAR_H];
- values[VAR_N] = geq->values[VAR_N];
- values[VAR_SW] = geq->values[VAR_SW];
- values[VAR_SH] = geq->values[VAR_SH];
- values[VAR_T] = geq->values[VAR_T];
-
- if (geq->bps == 8) {
- uint8_t *ptr = geq->dst + linesize * slice_start;
- for (y = slice_start; y < slice_end; y++) {
- values[VAR_Y] = y;
-
- for (x = 0; x < width; x++) {
- values[VAR_X] = x;
- ptr[x] = av_expr_eval(geq->e[plane][jobnr], values, geq);
- }
- ptr += linesize;
- }
- } else {
- uint16_t *ptr16 = geq->dst16 + (linesize/2) * slice_start;
- for (y = slice_start; y < slice_end; y++) {
- values[VAR_Y] = y;
- for (x = 0; x < width; x++) {
- values[VAR_X] = x;
- ptr16[x] = av_expr_eval(geq->e[plane][jobnr], values, geq);
- }
- ptr16 += linesize/2;
- }
- }
-
- return 0;
-}
-
-static int geq_filter_frame(AVFilterLink *inlink, AVFrame *in)
-{
- int plane;
- AVFilterContext *ctx = inlink->dst;
- const int nb_threads = FFMIN(MAX_NB_THREADS, ff_filter_get_nb_threads(ctx));
- GEQContext *geq = ctx->priv;
- AVFilterLink *outlink = inlink->dst->outputs[0];
- AVFrame *out;
-
- geq->values[VAR_N] = inlink->frame_count_out,
- geq->values[VAR_T] = in->pts == AV_NOPTS_VALUE ? NAN : in->pts * av_q2d(inlink->time_base),
-
- geq->picref = in;
- out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
- if (!out) {
- av_frame_free(&in);
- return AVERROR(ENOMEM);
- }
- av_frame_copy_props(out, in);
-
- for (plane = 0; plane < geq->planes && out->data[plane]; plane++) {
- const int width = (plane == 1 || plane == 2) ? AV_CEIL_RSHIFT(inlink->w, geq->hsub) : inlink->w;
- const int height = (plane == 1 || plane == 2) ? AV_CEIL_RSHIFT(inlink->h, geq->vsub) : inlink->h;
- const int linesize = out->linesize[plane];
- ThreadData td;
-
- geq->dst = out->data[plane];
- geq->dst16 = (uint16_t*)out->data[plane];
-
- geq->values[VAR_W] = width;
- geq->values[VAR_H] = height;
- geq->values[VAR_SW] = width / (double)inlink->w;
- geq->values[VAR_SH] = height / (double)inlink->h;
-
- td.width = width;
- td.height = height;
- td.plane = plane;
- td.linesize = linesize;
-
- if (geq->needs_sum[plane])
- calculate_sums(geq, plane, width, height);
-
- ctx->internal->execute(ctx, slice_geq_filter, &td, NULL, FFMIN(height, nb_threads));
- }
-
- av_frame_free(&geq->picref);
- return ff_filter_frame(outlink, out);
-}
-
-static av_cold void geq_uninit(AVFilterContext *ctx)
-{
- int i;
- GEQContext *geq = ctx->priv;
-
- for (i = 0; i < NB_PLANES; i++)
- for (int j = 0; j < MAX_NB_THREADS; j++)
- av_expr_free(geq->e[i][j]);
- for (i = 0; i < NB_PLANES; i++)
- av_freep(&geq->pixel_sums);
-}
-
-static const AVFilterPad geq_inputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- .config_props = geq_config_props,
- .filter_frame = geq_filter_frame,
- },
- { NULL }
-};
-
-static const AVFilterPad geq_outputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- },
- { NULL }
-};
-
-AVFilter ff_vf_geq = {
- .name = "geq",
- .description = NULL_IF_CONFIG_SMALL("Apply generic equation to each pixel."),
- .priv_size = sizeof(GEQContext),
- .init = geq_init,
- .uninit = geq_uninit,
- .query_formats = geq_query_formats,
- .inputs = geq_inputs,
- .outputs = geq_outputs,
- .priv_class = &geq_class,
- .flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC | AVFILTER_FLAG_SLICE_THREADS,
-};
diff --git a/libavfilter/vf_histeq.c b/libavfilter/vf_histeq.c
deleted file mode 100644
index 2449e10..0000000
--- a/libavfilter/vf_histeq.c
+++ /dev/null
@@ -1,283 +0,0 @@
-/*
- * Copyright (c) 2012 Jeremy Tran
- * Copyright (c) 2001 Donald A. Graft
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/**
- * @file
- * Histogram equalization filter, based on the VirtualDub filter by
- * Donald A. Graft <neuron2 AT home DOT com>.
- * Implements global automatic contrast adjustment by means of
- * histogram equalization.
- */
-
-#include "libavutil/common.h"
-#include "libavutil/internal.h"
-#include "libavutil/opt.h"
-#include "libavutil/pixdesc.h"
-
-#include "avfilter.h"
-#include "drawutils.h"
-#include "formats.h"
-#include "internal.h"
-#include "video.h"
-
-// #define DEBUG
-
-// Linear Congruential Generator, see "Numerical Recipes"
-#define LCG_A 4096
-#define LCG_C 150889
-#define LCG_M 714025
-#define LCG(x) (((x) * LCG_A + LCG_C) % LCG_M)
-#define LCG_SEED 739187
-
-enum HisteqAntibanding {
- HISTEQ_ANTIBANDING_NONE = 0,
- HISTEQ_ANTIBANDING_WEAK = 1,
- HISTEQ_ANTIBANDING_STRONG = 2,
- HISTEQ_ANTIBANDING_NB,
-};
-
-typedef struct HisteqContext {
- const AVClass *class;
- float strength;
- float intensity;
- int antibanding; ///< HisteqAntibanding
- int in_histogram [256]; ///< input histogram
- int out_histogram[256]; ///< output histogram
- int LUT[256]; ///< lookup table derived from histogram[]
- uint8_t rgba_map[4]; ///< components position
- int bpp; ///< bytes per pixel
-} HisteqContext;
-
-#define OFFSET(x) offsetof(HisteqContext, x)
-#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
-#define CONST(name, help, val, unit) { name, help, 0, AV_OPT_TYPE_CONST, {.i64=val}, INT_MIN, INT_MAX, FLAGS, unit }
-
-static const AVOption histeq_options[] = {
- { "strength", "set the strength", OFFSET(strength), AV_OPT_TYPE_FLOAT, {.dbl=0.2}, 0, 1, FLAGS },
- { "intensity", "set the intensity", OFFSET(intensity), AV_OPT_TYPE_FLOAT, {.dbl=0.21}, 0, 1, FLAGS },
- { "antibanding", "set the antibanding level", OFFSET(antibanding), AV_OPT_TYPE_INT, {.i64=HISTEQ_ANTIBANDING_NONE}, 0, HISTEQ_ANTIBANDING_NB-1, FLAGS, "antibanding" },
- CONST("none", "apply no antibanding", HISTEQ_ANTIBANDING_NONE, "antibanding"),
- CONST("weak", "apply weak antibanding", HISTEQ_ANTIBANDING_WEAK, "antibanding"),
- CONST("strong", "apply strong antibanding", HISTEQ_ANTIBANDING_STRONG, "antibanding"),
- { NULL }
-};
-
-AVFILTER_DEFINE_CLASS(histeq);
-
-static av_cold int init(AVFilterContext *ctx)
-{
- HisteqContext *histeq = ctx->priv;
-
- av_log(ctx, AV_LOG_VERBOSE,
- "strength:%0.3f intensity:%0.3f antibanding:%d\n",
- histeq->strength, histeq->intensity, histeq->antibanding);
-
- return 0;
-}
-
-static int query_formats(AVFilterContext *ctx)
-{
- static const enum AVPixelFormat pix_fmts[] = {
- AV_PIX_FMT_ARGB, AV_PIX_FMT_RGBA, AV_PIX_FMT_ABGR, AV_PIX_FMT_BGRA,
- AV_PIX_FMT_RGB24, AV_PIX_FMT_BGR24,
- AV_PIX_FMT_NONE
- };
- AVFilterFormats *fmts_list = ff_make_format_list(pix_fmts);
- if (!fmts_list)
- return AVERROR(ENOMEM);
- return ff_set_common_formats(ctx, fmts_list);
-}
-
-static int config_input(AVFilterLink *inlink)
-{
- AVFilterContext *ctx = inlink->dst;
- HisteqContext *histeq = ctx->priv;
- const AVPixFmtDescriptor *pix_desc = av_pix_fmt_desc_get(inlink->format);
-
- histeq->bpp = av_get_bits_per_pixel(pix_desc) / 8;
- ff_fill_rgba_map(histeq->rgba_map, inlink->format);
-
- return 0;
-}
-
-#define R 0
-#define G 1
-#define B 2
-#define A 3
-
-#define GET_RGB_VALUES(r, g, b, src, map) do { \
- r = src[x + map[R]]; \
- g = src[x + map[G]]; \
- b = src[x + map[B]]; \
-} while (0)
-
-static int filter_frame(AVFilterLink *inlink, AVFrame *inpic)
-{
- AVFilterContext *ctx = inlink->dst;
- HisteqContext *histeq = ctx->priv;
- AVFilterLink *outlink = ctx->outputs[0];
- int strength = histeq->strength * 1000;
- int intensity = histeq->intensity * 1000;
- int x, y, i, luthi, lutlo, lut, luma, oluma, m;
- AVFrame *outpic;
- unsigned int r, g, b, jran;
- uint8_t *src, *dst;
-
- outpic = ff_get_video_buffer(outlink, outlink->w, outlink->h);
- if (!outpic) {
- av_frame_free(&inpic);
- return AVERROR(ENOMEM);
- }
- av_frame_copy_props(outpic, inpic);
-
- /* Seed random generator for antibanding. */
- jran = LCG_SEED;
-
- /* Calculate and store the luminance and calculate the global histogram
- based on the luminance. */
- memset(histeq->in_histogram, 0, sizeof(histeq->in_histogram));
- src = inpic->data[0];
- dst = outpic->data[0];
- for (y = 0; y < inlink->h; y++) {
- for (x = 0; x < inlink->w * histeq->bpp; x += histeq->bpp) {
- GET_RGB_VALUES(r, g, b, src, histeq->rgba_map);
- luma = (55 * r + 182 * g + 19 * b) >> 8;
- dst[x + histeq->rgba_map[A]] = luma;
- histeq->in_histogram[luma]++;
- }
- src += inpic->linesize[0];
- dst += outpic->linesize[0];
- }
-
-#ifdef DEBUG
- for (x = 0; x < 256; x++)
- ff_dlog(ctx, "in[%d]: %u\n", x, histeq->in_histogram[x]);
-#endif
-
- /* Calculate the lookup table. */
- histeq->LUT[0] = histeq->in_histogram[0];
- /* Accumulate */
- for (x = 1; x < 256; x++)
- histeq->LUT[x] = histeq->LUT[x-1] + histeq->in_histogram[x];
-
- /* Normalize */
- for (x = 0; x < 256; x++)
- histeq->LUT[x] = (histeq->LUT[x] * intensity) / (inlink->h * inlink->w);
-
- /* Adjust the LUT based on the selected strength. This is an alpha
- mix of the calculated LUT and a linear LUT with gain 1. */
- for (x = 0; x < 256; x++)
- histeq->LUT[x] = (strength * histeq->LUT[x]) / 255 +
- ((255 - strength) * x) / 255;
-
- /* Output the equalized frame. */
- memset(histeq->out_histogram, 0, sizeof(histeq->out_histogram));
-
- src = inpic->data[0];
- dst = outpic->data[0];
- for (y = 0; y < inlink->h; y++) {
- for (x = 0; x < inlink->w * histeq->bpp; x += histeq->bpp) {
- luma = dst[x + histeq->rgba_map[A]];
- if (luma == 0) {
- for (i = 0; i < histeq->bpp; ++i)
- dst[x + i] = 0;
- histeq->out_histogram[0]++;
- } else {
- lut = histeq->LUT[luma];
- if (histeq->antibanding != HISTEQ_ANTIBANDING_NONE) {
- if (luma > 0) {
- lutlo = histeq->antibanding == HISTEQ_ANTIBANDING_WEAK ?
- (histeq->LUT[luma] + histeq->LUT[luma - 1]) / 2 :
- histeq->LUT[luma - 1];
- } else
- lutlo = lut;
-
- if (luma < 255) {
- luthi = (histeq->antibanding == HISTEQ_ANTIBANDING_WEAK) ?
- (histeq->LUT[luma] + histeq->LUT[luma + 1]) / 2 :
- histeq->LUT[luma + 1];
- } else
- luthi = lut;
-
- if (lutlo != luthi) {
- jran = LCG(jran);
- lut = lutlo + ((luthi - lutlo + 1) * jran) / LCG_M;
- }
- }
-
- GET_RGB_VALUES(r, g, b, src, histeq->rgba_map);
- if (((m = FFMAX3(r, g, b)) * lut) / luma > 255) {
- r = (r * 255) / m;
- g = (g * 255) / m;
- b = (b * 255) / m;
- } else {
- r = (r * lut) / luma;
- g = (g * lut) / luma;
- b = (b * lut) / luma;
- }
- dst[x + histeq->rgba_map[R]] = r;
- dst[x + histeq->rgba_map[G]] = g;
- dst[x + histeq->rgba_map[B]] = b;
- oluma = av_clip_uint8((55 * r + 182 * g + 19 * b) >> 8);
- histeq->out_histogram[oluma]++;
- }
- }
- src += inpic->linesize[0];
- dst += outpic->linesize[0];
- }
-#ifdef DEBUG
- for (x = 0; x < 256; x++)
- ff_dlog(ctx, "out[%d]: %u\n", x, histeq->out_histogram[x]);
-#endif
-
- av_frame_free(&inpic);
- return ff_filter_frame(outlink, outpic);
-}
-
-static const AVFilterPad histeq_inputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- .config_props = config_input,
- .filter_frame = filter_frame,
- },
- { NULL }
-};
-
-static const AVFilterPad histeq_outputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- },
- { NULL }
-};
-
-AVFilter ff_vf_histeq = {
- .name = "histeq",
- .description = NULL_IF_CONFIG_SMALL("Apply global color histogram equalization."),
- .priv_size = sizeof(HisteqContext),
- .init = init,
- .query_formats = query_formats,
- .inputs = histeq_inputs,
- .outputs = histeq_outputs,
- .priv_class = &histeq_class,
- .flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
-};
diff --git a/libavfilter/vf_hqdn3d.c b/libavfilter/vf_hqdn3d.c
deleted file mode 100644
index 803f90c..0000000
--- a/libavfilter/vf_hqdn3d.c
+++ /dev/null
@@ -1,413 +0,0 @@
-/*
- * Copyright (c) 2003 Daniel Moreno <comac AT comac DOT darktech DOT org>
- * Copyright (c) 2010 Baptiste Coudurier
- * Copyright (c) 2012 Loren Merritt
- *
- * This file is part of FFmpeg, ported from MPlayer.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/**
- * @file
- * high quality 3d video denoiser, ported from MPlayer
- * libmpcodecs/vf_hqdn3d.c.
- */
-
-#include <float.h>
-
-#include "config.h"
-#include "libavutil/attributes.h"
-#include "libavutil/common.h"
-#include "libavutil/pixdesc.h"
-#include "libavutil/intreadwrite.h"
-#include "libavutil/opt.h"
-
-#include "avfilter.h"
-#include "formats.h"
-#include "internal.h"
-#include "video.h"
-#include "vf_hqdn3d.h"
-
-#define LUT_BITS (depth==16 ? 8 : 4)
-#define LOAD(x) (((depth == 8 ? src[x] : AV_RN16A(src + (x) * 2)) << (16 - depth))\
- + (((1 << (16 - depth)) - 1) >> 1))
-#define STORE(x,val) (depth == 8 ? dst[x] = (val) >> (16 - depth) : \
- AV_WN16A(dst + (x) * 2, (val) >> (16 - depth)))
-
-av_always_inline
-static uint32_t lowpass(int prev, int cur, int16_t *coef, int depth)
-{
- int d = (prev - cur) >> (8 - LUT_BITS);
- return cur + coef[d];
-}
-
-av_always_inline
-static void denoise_temporal(uint8_t *src, uint8_t *dst,
- uint16_t *frame_ant,
- int w, int h, int sstride, int dstride,
- int16_t *temporal, int depth)
-{
- long x, y;
- uint32_t tmp;
-
- temporal += 256 << LUT_BITS;
-
- for (y = 0; y < h; y++) {
- for (x = 0; x < w; x++) {
- frame_ant[x] = tmp = lowpass(frame_ant[x], LOAD(x), temporal, depth);
- STORE(x, tmp);
- }
- src += sstride;
- dst += dstride;
- frame_ant += w;
- }
-}
-
-av_always_inline
-static void denoise_spatial(HQDN3DContext *s,
- uint8_t *src, uint8_t *dst,
- uint16_t *line_ant, uint16_t *frame_ant,
- int w, int h, int sstride, int dstride,
- int16_t *spatial, int16_t *temporal, int depth)
-{
- long x, y;
- uint32_t pixel_ant;
- uint32_t tmp;
-
- spatial += 256 << LUT_BITS;
- temporal += 256 << LUT_BITS;
-
- /* First line has no top neighbor. Only left one for each tmp and
- * last frame */
- pixel_ant = LOAD(0);
- for (x = 0; x < w; x++) {
- line_ant[x] = tmp = pixel_ant = lowpass(pixel_ant, LOAD(x), spatial, depth);
- frame_ant[x] = tmp = lowpass(frame_ant[x], tmp, temporal, depth);
- STORE(x, tmp);
- }
-
- for (y = 1; y < h; y++) {
- src += sstride;
- dst += dstride;
- frame_ant += w;
- if (s->denoise_row[depth]) {
- s->denoise_row[depth](src, dst, line_ant, frame_ant, w, spatial, temporal);
- continue;
- }
- pixel_ant = LOAD(0);
- for (x = 0; x < w-1; x++) {
- line_ant[x] = tmp = lowpass(line_ant[x], pixel_ant, spatial, depth);
- pixel_ant = lowpass(pixel_ant, LOAD(x+1), spatial, depth);
- frame_ant[x] = tmp = lowpass(frame_ant[x], tmp, temporal, depth);
- STORE(x, tmp);
- }
- line_ant[x] = tmp = lowpass(line_ant[x], pixel_ant, spatial, depth);
- frame_ant[x] = tmp = lowpass(frame_ant[x], tmp, temporal, depth);
- STORE(x, tmp);
- }
-}
-
-av_always_inline
-static int denoise_depth(HQDN3DContext *s,
- uint8_t *src, uint8_t *dst,
- uint16_t *line_ant, uint16_t **frame_ant_ptr,
- int w, int h, int sstride, int dstride,
- int16_t *spatial, int16_t *temporal, int depth)
-{
- // FIXME: For 16-bit depth, frame_ant could be a pointer to the previous
- // filtered frame rather than a separate buffer.
- long x, y;
- uint16_t *frame_ant = *frame_ant_ptr;
- if (!frame_ant) {
- uint8_t *frame_src = src;
- *frame_ant_ptr = frame_ant = av_malloc_array(w, h*sizeof(uint16_t));
- if (!frame_ant)
- return AVERROR(ENOMEM);
- for (y = 0; y < h; y++, src += sstride, frame_ant += w)
- for (x = 0; x < w; x++)
- frame_ant[x] = LOAD(x);
- src = frame_src;
- frame_ant = *frame_ant_ptr;
- }
-
- if (spatial[0])
- denoise_spatial(s, src, dst, line_ant, frame_ant,
- w, h, sstride, dstride, spatial, temporal, depth);
- else
- denoise_temporal(src, dst, frame_ant,
- w, h, sstride, dstride, temporal, depth);
- emms_c();
- return 0;
-}
-
-#define denoise(...) \
- do { \
- int ret = AVERROR_BUG; \
- switch (s->depth) { \
- case 8: ret = denoise_depth(__VA_ARGS__, 8); break; \
- case 9: ret = denoise_depth(__VA_ARGS__, 9); break; \
- case 10: ret = denoise_depth(__VA_ARGS__, 10); break; \
- case 12: ret = denoise_depth(__VA_ARGS__, 12); break; \
- case 14: ret = denoise_depth(__VA_ARGS__, 14); break; \
- case 16: ret = denoise_depth(__VA_ARGS__, 16); break; \
- } \
- if (ret < 0) { \
- av_frame_free(&out); \
- if (!direct) \
- av_frame_free(&in); \
- return ret; \
- } \
- } while (0)
-
-static void precalc_coefs(double dist25, int depth, int16_t *ct)
-{
- int i;
- double gamma, simil, C;
-
- gamma = log(0.25) / log(1.0 - FFMIN(dist25,252.0)/255.0 - 0.00001);
-
- for (i = -256<<LUT_BITS; i < 256<<LUT_BITS; i++) {
- double f = ((i<<(9-LUT_BITS)) + (1<<(8-LUT_BITS)) - 1) / 512.0; // midpoint of the bin
- simil = FFMAX(0, 1.0 - fabs(f) / 255.0);
- C = pow(simil, gamma) * 256.0 * f;
- ct[(256<<LUT_BITS)+i] = lrint(C);
- }
-
- ct[0] = !!dist25;
-}
-
-#define PARAM1_DEFAULT 4.0
-#define PARAM2_DEFAULT 3.0
-#define PARAM3_DEFAULT 6.0
-
-static av_cold int init(AVFilterContext *ctx)
-{
- HQDN3DContext *s = ctx->priv;
-
- if (!s->strength[LUMA_SPATIAL])
- s->strength[LUMA_SPATIAL] = PARAM1_DEFAULT;
- if (!s->strength[CHROMA_SPATIAL])
- s->strength[CHROMA_SPATIAL] = PARAM2_DEFAULT * s->strength[LUMA_SPATIAL] / PARAM1_DEFAULT;
- if (!s->strength[LUMA_TMP])
- s->strength[LUMA_TMP] = PARAM3_DEFAULT * s->strength[LUMA_SPATIAL] / PARAM1_DEFAULT;
- if (!s->strength[CHROMA_TMP])
- s->strength[CHROMA_TMP] = s->strength[LUMA_TMP] * s->strength[CHROMA_SPATIAL] / s->strength[LUMA_SPATIAL];
-
- av_log(ctx, AV_LOG_VERBOSE, "ls:%f cs:%f lt:%f ct:%f\n",
- s->strength[LUMA_SPATIAL], s->strength[CHROMA_SPATIAL],
- s->strength[LUMA_TMP], s->strength[CHROMA_TMP]);
-
- return 0;
-}
-
-static av_cold void uninit(AVFilterContext *ctx)
-{
- HQDN3DContext *s = ctx->priv;
-
- av_freep(&s->coefs[0]);
- av_freep(&s->coefs[1]);
- av_freep(&s->coefs[2]);
- av_freep(&s->coefs[3]);
- av_freep(&s->line[0]);
- av_freep(&s->line[1]);
- av_freep(&s->line[2]);
- av_freep(&s->frame_prev[0]);
- av_freep(&s->frame_prev[1]);
- av_freep(&s->frame_prev[2]);
-}
-
-static int query_formats(AVFilterContext *ctx)
-{
- static const enum AVPixelFormat pix_fmts[] = {
- AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV444P,
- AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV411P, AV_PIX_FMT_YUV440P,
- AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUVJ440P,
- AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV422P9, AV_PIX_FMT_YUV444P9,
- AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10,
- AV_PIX_FMT_YUV440P10,
- AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV420P12,
- AV_PIX_FMT_YUV440P12,
- AV_PIX_FMT_YUV444P14, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV420P14,
- AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16,
- AV_PIX_FMT_NONE
- };
- AVFilterFormats *fmts_list = ff_make_format_list(pix_fmts);
- if (!fmts_list)
- return AVERROR(ENOMEM);
- return ff_set_common_formats(ctx, fmts_list);
-}
-
-static void calc_coefs(AVFilterContext *ctx)
-{
- HQDN3DContext *s = ctx->priv;
-
- for (int i = 0; i < 4; i++)
- precalc_coefs(s->strength[i], s->depth, s->coefs[i]);
-}
-
-static int config_input(AVFilterLink *inlink)
-{
- AVFilterContext *ctx = inlink->dst;
- HQDN3DContext *s = inlink->dst->priv;
- const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
- int i, depth;
-
- uninit(inlink->dst);
-
- s->hsub = desc->log2_chroma_w;
- s->vsub = desc->log2_chroma_h;
- s->depth = depth = desc->comp[0].depth;
-
- for (i = 0; i < 3; i++) {
- s->line[i] = av_malloc_array(inlink->w, sizeof(*s->line[i]));
- if (!s->line[i])
- return AVERROR(ENOMEM);
- }
-
- for (i = 0; i < 4; i++) {
- s->coefs[i] = av_malloc((512<<LUT_BITS) * sizeof(int16_t));
- if (!s->coefs[i])
- return AVERROR(ENOMEM);
- }
-
- calc_coefs(ctx);
-
- if (ARCH_X86)
- ff_hqdn3d_init_x86(s);
-
- return 0;
-}
-
-typedef struct ThreadData {
- AVFrame *in, *out;
- int direct;
-} ThreadData;
-
-static int do_denoise(AVFilterContext *ctx, void *data, int job_nr, int n_jobs)
-{
- HQDN3DContext *s = ctx->priv;
- const ThreadData *td = data;
- AVFrame *out = td->out;
- AVFrame *in = td->in;
- int direct = td->direct;
-
- denoise(s, in->data[job_nr], out->data[job_nr],
- s->line[job_nr], &s->frame_prev[job_nr],
- AV_CEIL_RSHIFT(in->width, (!!job_nr * s->hsub)),
- AV_CEIL_RSHIFT(in->height, (!!job_nr * s->vsub)),
- in->linesize[job_nr], out->linesize[job_nr],
- s->coefs[job_nr ? CHROMA_SPATIAL : LUMA_SPATIAL],
- s->coefs[job_nr ? CHROMA_TMP : LUMA_TMP]);
-
- return 0;
-}
-
-static int filter_frame(AVFilterLink *inlink, AVFrame *in)
-{
- AVFilterContext *ctx = inlink->dst;
- AVFilterLink *outlink = ctx->outputs[0];
-
- AVFrame *out;
- int direct = av_frame_is_writable(in) && !ctx->is_disabled;
- ThreadData td;
-
- if (direct) {
- out = in;
- } else {
- out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
- if (!out) {
- av_frame_free(&in);
- return AVERROR(ENOMEM);
- }
-
- av_frame_copy_props(out, in);
- }
-
- td.in = in;
- td.out = out;
- td.direct = direct;
- /* one thread per plane */
- ctx->internal->execute(ctx, do_denoise, &td, NULL, 3);
-
- if (ctx->is_disabled) {
- av_frame_free(&out);
- return ff_filter_frame(outlink, in);
- }
-
- if (!direct)
- av_frame_free(&in);
-
- return ff_filter_frame(outlink, out);
-}
-
-static int process_command(AVFilterContext *ctx, const char *cmd, const char *args,
- char *res, int res_len, int flags)
-{
- int ret;
-
- ret = ff_filter_process_command(ctx, cmd, args, res, res_len, flags);
- if (ret < 0)
- return ret;
-
- calc_coefs(ctx);
-
- return 0;
-}
-
-#define OFFSET(x) offsetof(HQDN3DContext, x)
-#define FLAGS AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_FILTERING_PARAM | AV_OPT_FLAG_RUNTIME_PARAM
-static const AVOption hqdn3d_options[] = {
- { "luma_spatial", "spatial luma strength", OFFSET(strength[LUMA_SPATIAL]), AV_OPT_TYPE_DOUBLE, { .dbl = 0.0 }, 0, DBL_MAX, FLAGS },
- { "chroma_spatial", "spatial chroma strength", OFFSET(strength[CHROMA_SPATIAL]), AV_OPT_TYPE_DOUBLE, { .dbl = 0.0 }, 0, DBL_MAX, FLAGS },
- { "luma_tmp", "temporal luma strength", OFFSET(strength[LUMA_TMP]), AV_OPT_TYPE_DOUBLE, { .dbl = 0.0 }, 0, DBL_MAX, FLAGS },
- { "chroma_tmp", "temporal chroma strength", OFFSET(strength[CHROMA_TMP]), AV_OPT_TYPE_DOUBLE, { .dbl = 0.0 }, 0, DBL_MAX, FLAGS },
- { NULL }
-};
-
-AVFILTER_DEFINE_CLASS(hqdn3d);
-
-static const AVFilterPad avfilter_vf_hqdn3d_inputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- .config_props = config_input,
- .filter_frame = filter_frame,
- },
- { NULL }
-};
-
-
-static const AVFilterPad avfilter_vf_hqdn3d_outputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO
- },
- { NULL }
-};
-
-AVFilter ff_vf_hqdn3d = {
- .name = "hqdn3d",
- .description = NULL_IF_CONFIG_SMALL("Apply a High Quality 3D Denoiser."),
- .priv_size = sizeof(HQDN3DContext),
- .priv_class = &hqdn3d_class,
- .init = init,
- .uninit = uninit,
- .query_formats = query_formats,
- .inputs = avfilter_vf_hqdn3d_inputs,
- .outputs = avfilter_vf_hqdn3d_outputs,
- .flags = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL | AVFILTER_FLAG_SLICE_THREADS,
- .process_command = process_command,
-};
diff --git a/libavfilter/vf_hqdn3d.h b/libavfilter/vf_hqdn3d.h
deleted file mode 100644
index 3279bbc..0000000
--- a/libavfilter/vf_hqdn3d.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (c) 2003 Daniel Moreno <comac AT comac DOT darktech DOT org>
- * Copyright (c) 2010 Baptiste Coudurier
- * Copyright (c) 2012 Loren Merritt
- *
- * This file is part of FFmpeg, ported from MPlayer.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef AVFILTER_HQDN3D_H
-#define AVFILTER_HQDN3D_H
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "libavutil/opt.h"
-
-typedef struct HQDN3DContext {
- const AVClass *class;
- int16_t *coefs[4];
- uint16_t *line[3];
- uint16_t *frame_prev[3];
- double strength[4];
- int hsub, vsub;
- int depth;
- void (*denoise_row[17])(uint8_t *src, uint8_t *dst, uint16_t *line_ant, uint16_t *frame_ant, ptrdiff_t w, int16_t *spatial, int16_t *temporal);
-} HQDN3DContext;
-
-#define LUMA_SPATIAL 0
-#define LUMA_TMP 1
-#define CHROMA_SPATIAL 2
-#define CHROMA_TMP 3
-
-void ff_hqdn3d_init_x86(HQDN3DContext *hqdn3d);
-
-#endif /* AVFILTER_HQDN3D_H */
diff --git a/libavfilter/vf_kerndeint.c b/libavfilter/vf_kerndeint.c
deleted file mode 100644
index 057d15f..0000000
--- a/libavfilter/vf_kerndeint.c
+++ /dev/null
@@ -1,319 +0,0 @@
-/*
- * Copyright (c) 2012 Jeremy Tran
- * Copyright (c) 2004 Tobias Diedrich
- * Copyright (c) 2003 Donald A. Graft
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/**
- * @file
- * Kernel Deinterlacer
- * Ported from MPlayer libmpcodecs/vf_kerndeint.c.
- */
-
-#include "libavutil/imgutils.h"
-#include "libavutil/intreadwrite.h"
-#include "libavutil/opt.h"
-#include "libavutil/pixdesc.h"
-
-#include "avfilter.h"
-#include "formats.h"
-#include "internal.h"
-
-typedef struct KerndeintContext {
- const AVClass *class;
- int frame; ///< frame count, starting from 0
- int thresh, map, order, sharp, twoway;
- int vsub;
- int is_packed_rgb;
- uint8_t *tmp_data [4]; ///< temporary plane data buffer
- int tmp_linesize[4]; ///< temporary plane byte linesize
- int tmp_bwidth [4]; ///< temporary plane byte width
-} KerndeintContext;
-
-#define OFFSET(x) offsetof(KerndeintContext, x)
-#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
-static const AVOption kerndeint_options[] = {
- { "thresh", "set the threshold", OFFSET(thresh), AV_OPT_TYPE_INT, {.i64=10}, 0, 255, FLAGS },
- { "map", "set the map", OFFSET(map), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS },
- { "order", "set the order", OFFSET(order), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS },
- { "sharp", "set sharpening", OFFSET(sharp), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS },
- { "twoway", "set twoway", OFFSET(twoway), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS },
- { NULL }
-};
-
-AVFILTER_DEFINE_CLASS(kerndeint);
-
-static av_cold void uninit(AVFilterContext *ctx)
-{
- KerndeintContext *kerndeint = ctx->priv;
-
- av_freep(&kerndeint->tmp_data[0]);
-}
-
-static int query_formats(AVFilterContext *ctx)
-{
- static const enum AVPixelFormat pix_fmts[] = {
- AV_PIX_FMT_YUV420P,
- AV_PIX_FMT_YUYV422,
- AV_PIX_FMT_ARGB, AV_PIX_FMT_0RGB,
- AV_PIX_FMT_ABGR, AV_PIX_FMT_0BGR,
- AV_PIX_FMT_RGBA, AV_PIX_FMT_RGB0,
- AV_PIX_FMT_BGRA, AV_PIX_FMT_BGR0,
- AV_PIX_FMT_NONE
- };
-
- AVFilterFormats *fmts_list = ff_make_format_list(pix_fmts);
- if (!fmts_list)
- return AVERROR(ENOMEM);
- return ff_set_common_formats(ctx, fmts_list);
-}
-
-static int config_props(AVFilterLink *inlink)
-{
- KerndeintContext *kerndeint = inlink->dst->priv;
- const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
- int ret;
-
- kerndeint->is_packed_rgb = av_pix_fmt_desc_get(inlink->format)->flags & AV_PIX_FMT_FLAG_RGB;
- kerndeint->vsub = desc->log2_chroma_h;
-
- ret = av_image_alloc(kerndeint->tmp_data, kerndeint->tmp_linesize,
- inlink->w, inlink->h, inlink->format, 16);
- if (ret < 0)
- return ret;
- memset(kerndeint->tmp_data[0], 0, ret);
-
- if ((ret = av_image_fill_linesizes(kerndeint->tmp_bwidth, inlink->format, inlink->w)) < 0)
- return ret;
-
- return 0;
-}
-
-static int filter_frame(AVFilterLink *inlink, AVFrame *inpic)
-{
- KerndeintContext *kerndeint = inlink->dst->priv;
- AVFilterLink *outlink = inlink->dst->outputs[0];
- AVFrame *outpic;
- const uint8_t *prvp; ///< Previous field's pixel line number n
- const uint8_t *prvpp; ///< Previous field's pixel line number (n - 1)
- const uint8_t *prvpn; ///< Previous field's pixel line number (n + 1)
- const uint8_t *prvppp; ///< Previous field's pixel line number (n - 2)
- const uint8_t *prvpnn; ///< Previous field's pixel line number (n + 2)
- const uint8_t *prvp4p; ///< Previous field's pixel line number (n - 4)
- const uint8_t *prvp4n; ///< Previous field's pixel line number (n + 4)
-
- const uint8_t *srcp; ///< Current field's pixel line number n
- const uint8_t *srcpp; ///< Current field's pixel line number (n - 1)
- const uint8_t *srcpn; ///< Current field's pixel line number (n + 1)
- const uint8_t *srcppp; ///< Current field's pixel line number (n - 2)
- const uint8_t *srcpnn; ///< Current field's pixel line number (n + 2)
- const uint8_t *srcp3p; ///< Current field's pixel line number (n - 3)
- const uint8_t *srcp3n; ///< Current field's pixel line number (n + 3)
- const uint8_t *srcp4p; ///< Current field's pixel line number (n - 4)
- const uint8_t *srcp4n; ///< Current field's pixel line number (n + 4)
-
- uint8_t *dstp, *dstp_saved;
- const uint8_t *srcp_saved;
-
- int src_linesize, psrc_linesize, dst_linesize, bwidth;
- int x, y, plane, val, hi, lo, g, h, n = kerndeint->frame++;
- double valf;
-
- const int thresh = kerndeint->thresh;
- const int order = kerndeint->order;
- const int map = kerndeint->map;
- const int sharp = kerndeint->sharp;
- const int twoway = kerndeint->twoway;
-
- const int is_packed_rgb = kerndeint->is_packed_rgb;
-
- outpic = ff_get_video_buffer(outlink, outlink->w, outlink->h);
- if (!outpic) {
- av_frame_free(&inpic);
- return AVERROR(ENOMEM);
- }
- av_frame_copy_props(outpic, inpic);
- outpic->interlaced_frame = 0;
-
- for (plane = 0; plane < 4 && inpic->data[plane] && inpic->linesize[plane]; plane++) {
- h = plane == 0 ? inlink->h : AV_CEIL_RSHIFT(inlink->h, kerndeint->vsub);
- bwidth = kerndeint->tmp_bwidth[plane];
-
- srcp_saved = inpic->data[plane];
- src_linesize = inpic->linesize[plane];
- psrc_linesize = kerndeint->tmp_linesize[plane];
- dstp_saved = outpic->data[plane];
- dst_linesize = outpic->linesize[plane];
- srcp = srcp_saved + (1 - order) * src_linesize;
- dstp = dstp_saved + (1 - order) * dst_linesize;
-
- for (y = 0; y < h; y += 2) {
- memcpy(dstp, srcp, bwidth);
- srcp += 2 * src_linesize;
- dstp += 2 * dst_linesize;
- }
-
- // Copy through the lines that will be missed below.
- memcpy(dstp_saved + order * dst_linesize, srcp_saved + (1 - order) * src_linesize, bwidth);
- memcpy(dstp_saved + (2 + order ) * dst_linesize, srcp_saved + (3 - order) * src_linesize, bwidth);
- memcpy(dstp_saved + (h - 2 + order) * dst_linesize, srcp_saved + (h - 1 - order) * src_linesize, bwidth);
- memcpy(dstp_saved + (h - 4 + order) * dst_linesize, srcp_saved + (h - 3 - order) * src_linesize, bwidth);
-
- /* For the other field choose adaptively between using the previous field
- or the interpolant from the current field. */
- prvp = kerndeint->tmp_data[plane] + 5 * psrc_linesize - (1 - order) * psrc_linesize;
- prvpp = prvp - psrc_linesize;
- prvppp = prvp - 2 * psrc_linesize;
- prvp4p = prvp - 4 * psrc_linesize;
- prvpn = prvp + psrc_linesize;
- prvpnn = prvp + 2 * psrc_linesize;
- prvp4n = prvp + 4 * psrc_linesize;
-
- srcp = srcp_saved + 5 * src_linesize - (1 - order) * src_linesize;
- srcpp = srcp - src_linesize;
- srcppp = srcp - 2 * src_linesize;
- srcp3p = srcp - 3 * src_linesize;
- srcp4p = srcp - 4 * src_linesize;
-
- srcpn = srcp + src_linesize;
- srcpnn = srcp + 2 * src_linesize;
- srcp3n = srcp + 3 * src_linesize;
- srcp4n = srcp + 4 * src_linesize;
-
- dstp = dstp_saved + 5 * dst_linesize - (1 - order) * dst_linesize;
-
- for (y = 5 - (1 - order); y <= h - 5 - (1 - order); y += 2) {
- for (x = 0; x < bwidth; x++) {
- if (thresh == 0 || n == 0 ||
- (abs((int)prvp[x] - (int)srcp[x]) > thresh) ||
- (abs((int)prvpp[x] - (int)srcpp[x]) > thresh) ||
- (abs((int)prvpn[x] - (int)srcpn[x]) > thresh)) {
- if (map) {
- g = x & ~3;
-
- if (is_packed_rgb) {
- AV_WB32(dstp + g, 0xffffffff);
- x = g + 3;
- } else if (inlink->format == AV_PIX_FMT_YUYV422) {
- // y <- 235, u <- 128, y <- 235, v <- 128
- AV_WB32(dstp + g, 0xeb80eb80);
- x = g + 3;
- } else {
- dstp[x] = plane == 0 ? 235 : 128;
- }
- } else {
- if (is_packed_rgb) {
- hi = 255;
- lo = 0;
- } else if (inlink->format == AV_PIX_FMT_YUYV422) {
- hi = x & 1 ? 240 : 235;
- lo = 16;
- } else {
- hi = plane == 0 ? 235 : 240;
- lo = 16;
- }
-
- if (sharp) {
- if (twoway) {
- valf = + 0.526 * ((int)srcpp[x] + (int)srcpn[x])
- + 0.170 * ((int)srcp[x] + (int)prvp[x])
- - 0.116 * ((int)srcppp[x] + (int)srcpnn[x] + (int)prvppp[x] + (int)prvpnn[x])
- - 0.026 * ((int)srcp3p[x] + (int)srcp3n[x])
- + 0.031 * ((int)srcp4p[x] + (int)srcp4n[x] + (int)prvp4p[x] + (int)prvp4n[x]);
- } else {
- valf = + 0.526 * ((int)srcpp[x] + (int)srcpn[x])
- + 0.170 * ((int)prvp[x])
- - 0.116 * ((int)prvppp[x] + (int)prvpnn[x])
- - 0.026 * ((int)srcp3p[x] + (int)srcp3n[x])
- + 0.031 * ((int)prvp4p[x] + (int)prvp4p[x]);
- }
- dstp[x] = av_clip(valf, lo, hi);
- } else {
- if (twoway) {
- val = (8 * ((int)srcpp[x] + (int)srcpn[x]) + 2 * ((int)srcp[x] + (int)prvp[x])
- - (int)(srcppp[x]) - (int)(srcpnn[x])
- - (int)(prvppp[x]) - (int)(prvpnn[x])) >> 4;
- } else {
- val = (8 * ((int)srcpp[x] + (int)srcpn[x]) + 2 * ((int)prvp[x])
- - (int)(prvppp[x]) - (int)(prvpnn[x])) >> 4;
- }
- dstp[x] = av_clip(val, lo, hi);
- }
- }
- } else {
- dstp[x] = srcp[x];
- }
- }
- prvp += 2 * psrc_linesize;
- prvpp += 2 * psrc_linesize;
- prvppp += 2 * psrc_linesize;
- prvpn += 2 * psrc_linesize;
- prvpnn += 2 * psrc_linesize;
- prvp4p += 2 * psrc_linesize;
- prvp4n += 2 * psrc_linesize;
- srcp += 2 * src_linesize;
- srcpp += 2 * src_linesize;
- srcppp += 2 * src_linesize;
- srcp3p += 2 * src_linesize;
- srcp4p += 2 * src_linesize;
- srcpn += 2 * src_linesize;
- srcpnn += 2 * src_linesize;
- srcp3n += 2 * src_linesize;
- srcp4n += 2 * src_linesize;
- dstp += 2 * dst_linesize;
- }
-
- srcp = inpic->data[plane];
- dstp = kerndeint->tmp_data[plane];
- av_image_copy_plane(dstp, psrc_linesize, srcp, src_linesize, bwidth, h);
- }
-
- av_frame_free(&inpic);
- return ff_filter_frame(outlink, outpic);
-}
-
-static const AVFilterPad kerndeint_inputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- .filter_frame = filter_frame,
- .config_props = config_props,
- },
- { NULL }
-};
-
-static const AVFilterPad kerndeint_outputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- },
- { NULL }
-};
-
-
-AVFilter ff_vf_kerndeint = {
- .name = "kerndeint",
- .description = NULL_IF_CONFIG_SMALL("Apply kernel deinterlacing to the input."),
- .priv_size = sizeof(KerndeintContext),
- .priv_class = &kerndeint_class,
- .uninit = uninit,
- .query_formats = query_formats,
- .inputs = kerndeint_inputs,
- .outputs = kerndeint_outputs,
-};
diff --git a/libavfilter/vf_mcdeint.c b/libavfilter/vf_mcdeint.c
deleted file mode 100644
index 9cdec63..0000000
--- a/libavfilter/vf_mcdeint.c
+++ /dev/null
@@ -1,313 +0,0 @@
-/*
- * Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/**
- * @file
- * Motion Compensation Deinterlacer
- * Ported from MPlayer libmpcodecs/vf_mcdeint.c.
- *
- * Known Issues:
- *
- * The motion estimation is somewhat at the mercy of the input, if the
- * input frames are created purely based on spatial interpolation then
- * for example a thin black line or another random and not
- * interpolateable pattern will cause problems.
- * Note: completely ignoring the "unavailable" lines during motion
- * estimation did not look any better, so the most obvious solution
- * would be to improve tfields or penalize problematic motion vectors.
- *
- * If non iterative ME is used then snow currently ignores the OBMC
- * window and as a result sometimes creates artifacts.
- *
- * Only past frames are used, we should ideally use future frames too,
- * something like filtering the whole movie in forward and then
- * backward direction seems like an interesting idea but the current
- * filter framework is FAR from supporting such things.
- *
- * Combining the motion compensated image with the input image also is
- * not as trivial as it seems, simple blindly taking even lines from
- * one and odd ones from the other does not work at all as ME/MC
- * sometimes has nothing in the previous frames which matches the
- * current. The current algorithm has been found by trial and error
- * and almost certainly can be improved...
- */
-
-#include "libavutil/opt.h"
-#include "libavutil/pixdesc.h"
-#include "libavcodec/avcodec.h"
-#include "avfilter.h"
-#include "formats.h"
-#include "internal.h"
-
-enum MCDeintMode {
- MODE_FAST = 0,
- MODE_MEDIUM,
- MODE_SLOW,
- MODE_EXTRA_SLOW,
- MODE_NB,
-};
-
-enum MCDeintParity {
- PARITY_TFF = 0, ///< top field first
- PARITY_BFF = 1, ///< bottom field first
-};
-
-typedef struct MCDeintContext {
- const AVClass *class;
- int mode; ///< MCDeintMode
- int parity; ///< MCDeintParity
- int qp;
- AVCodecContext *enc_ctx;
-} MCDeintContext;
-
-#define OFFSET(x) offsetof(MCDeintContext, x)
-#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
-#define CONST(name, help, val, unit) { name, help, 0, AV_OPT_TYPE_CONST, {.i64=val}, INT_MIN, INT_MAX, FLAGS, unit }
-
-static const AVOption mcdeint_options[] = {
- { "mode", "set mode", OFFSET(mode), AV_OPT_TYPE_INT, {.i64=MODE_FAST}, 0, MODE_NB-1, FLAGS, .unit="mode" },
- CONST("fast", NULL, MODE_FAST, "mode"),
- CONST("medium", NULL, MODE_MEDIUM, "mode"),
- CONST("slow", NULL, MODE_SLOW, "mode"),
- CONST("extra_slow", NULL, MODE_EXTRA_SLOW, "mode"),
-
- { "parity", "set the assumed picture field parity", OFFSET(parity), AV_OPT_TYPE_INT, {.i64=PARITY_BFF}, -1, 1, FLAGS, "parity" },
- CONST("tff", "assume top field first", PARITY_TFF, "parity"),
- CONST("bff", "assume bottom field first", PARITY_BFF, "parity"),
-
- { "qp", "set qp", OFFSET(qp), AV_OPT_TYPE_INT, {.i64=1}, INT_MIN, INT_MAX, FLAGS },
- { NULL }
-};
-
-AVFILTER_DEFINE_CLASS(mcdeint);
-
-static int config_props(AVFilterLink *inlink)
-{
- AVFilterContext *ctx = inlink->dst;
- MCDeintContext *mcdeint = ctx->priv;
- AVCodec *enc;
- AVCodecContext *enc_ctx;
- AVDictionary *opts = NULL;
- int ret;
-
- if (!(enc = avcodec_find_encoder(AV_CODEC_ID_SNOW))) {
- av_log(ctx, AV_LOG_ERROR, "Snow encoder is not enabled in libavcodec\n");
- return AVERROR(EINVAL);
- }
-
- mcdeint->enc_ctx = avcodec_alloc_context3(enc);
- if (!mcdeint->enc_ctx)
- return AVERROR(ENOMEM);
- enc_ctx = mcdeint->enc_ctx;
- enc_ctx->width = inlink->w;
- enc_ctx->height = inlink->h;
- enc_ctx->time_base = (AVRational){1,25}; // meaningless
- enc_ctx->gop_size = INT_MAX;
- enc_ctx->max_b_frames = 0;
- enc_ctx->pix_fmt = AV_PIX_FMT_YUV420P;
- enc_ctx->flags = AV_CODEC_FLAG_QSCALE | AV_CODEC_FLAG_LOW_DELAY;
- enc_ctx->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL;
- enc_ctx->global_quality = 1;
- enc_ctx->me_cmp = enc_ctx->me_sub_cmp = FF_CMP_SAD;
- enc_ctx->mb_cmp = FF_CMP_SSE;
- av_dict_set(&opts, "memc_only", "1", 0);
- av_dict_set(&opts, "no_bitstream", "1", 0);
-
- switch (mcdeint->mode) {
- case MODE_EXTRA_SLOW:
- enc_ctx->refs = 3;
- case MODE_SLOW:
- av_dict_set(&opts, "motion_est", "iter", 0);
- case MODE_MEDIUM:
- enc_ctx->flags |= AV_CODEC_FLAG_4MV;
- enc_ctx->dia_size = 2;
- case MODE_FAST:
- enc_ctx->flags |= AV_CODEC_FLAG_QPEL;
- }
-
- ret = avcodec_open2(enc_ctx, enc, &opts);
- av_dict_free(&opts);
- if (ret < 0)
- return ret;
-
- return 0;
-}
-
-static av_cold void uninit(AVFilterContext *ctx)
-{
- MCDeintContext *mcdeint = ctx->priv;
-
- avcodec_free_context(&mcdeint->enc_ctx);
-}
-
-static int query_formats(AVFilterContext *ctx)
-{
- static const enum AVPixelFormat pix_fmts[] = {
- AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE
- };
- AVFilterFormats *fmts_list = ff_make_format_list(pix_fmts);
- if (!fmts_list)
- return AVERROR(ENOMEM);
- return ff_set_common_formats(ctx, fmts_list);
-}
-
-static int filter_frame(AVFilterLink *inlink, AVFrame *inpic)
-{
- MCDeintContext *mcdeint = inlink->dst->priv;
- AVFilterLink *outlink = inlink->dst->outputs[0];
- AVFrame *outpic, *frame_dec;
- AVPacket pkt = {0};
- int x, y, i, ret, got_frame = 0;
-
- outpic = ff_get_video_buffer(outlink, outlink->w, outlink->h);
- if (!outpic) {
- av_frame_free(&inpic);
- return AVERROR(ENOMEM);
- }
- av_frame_copy_props(outpic, inpic);
- inpic->quality = mcdeint->qp * FF_QP2LAMBDA;
-
- av_init_packet(&pkt);
-
- ret = avcodec_encode_video2(mcdeint->enc_ctx, &pkt, inpic, &got_frame);
- if (ret < 0)
- goto end;
-
- frame_dec = mcdeint->enc_ctx->coded_frame;
-
- for (i = 0; i < 3; i++) {
- int is_chroma = !!i;
- int w = AV_CEIL_RSHIFT(inlink->w, is_chroma);
- int h = AV_CEIL_RSHIFT(inlink->h, is_chroma);
- int fils = frame_dec->linesize[i];
- int srcs = inpic ->linesize[i];
- int dsts = outpic ->linesize[i];
-
- for (y = 0; y < h; y++) {
- if ((y ^ mcdeint->parity) & 1) {
- for (x = 0; x < w; x++) {
- uint8_t *filp = &frame_dec->data[i][x + y*fils];
- uint8_t *srcp = &inpic ->data[i][x + y*srcs];
- uint8_t *dstp = &outpic ->data[i][x + y*dsts];
-
- if (y > 0 && y < h-1){
- int is_edge = x < 3 || x > w-4;
- int diff0 = filp[-fils] - srcp[-srcs];
- int diff1 = filp[+fils] - srcp[+srcs];
- int temp = filp[0];
-
-#define DELTA(j) av_clip(j, -x, w-1-x)
-
-#define GET_SCORE_EDGE(j)\
- FFABS(srcp[-srcs+DELTA(-1+(j))] - srcp[+srcs+DELTA(-1-(j))])+\
- FFABS(srcp[-srcs+DELTA(j) ] - srcp[+srcs+DELTA( -(j))])+\
- FFABS(srcp[-srcs+DELTA(1+(j)) ] - srcp[+srcs+DELTA( 1-(j))])
-
-#define GET_SCORE(j)\
- FFABS(srcp[-srcs-1+(j)] - srcp[+srcs-1-(j)])+\
- FFABS(srcp[-srcs +(j)] - srcp[+srcs -(j)])+\
- FFABS(srcp[-srcs+1+(j)] - srcp[+srcs+1-(j)])
-
-#define CHECK_EDGE(j)\
- { int score = GET_SCORE_EDGE(j);\
- if (score < spatial_score){\
- spatial_score = score;\
- diff0 = filp[-fils+DELTA(j)] - srcp[-srcs+DELTA(j)];\
- diff1 = filp[+fils+DELTA(-(j))] - srcp[+srcs+DELTA(-(j))];\
-
-#define CHECK(j)\
- { int score = GET_SCORE(j);\
- if (score < spatial_score){\
- spatial_score= score;\
- diff0 = filp[-fils+(j)] - srcp[-srcs+(j)];\
- diff1 = filp[+fils-(j)] - srcp[+srcs-(j)];\
-
- if (is_edge) {
- int spatial_score = GET_SCORE_EDGE(0) - 1;
- CHECK_EDGE(-1) CHECK_EDGE(-2) }} }}
- CHECK_EDGE( 1) CHECK_EDGE( 2) }} }}
- } else {
- int spatial_score = GET_SCORE(0) - 1;
- CHECK(-1) CHECK(-2) }} }}
- CHECK( 1) CHECK( 2) }} }}
- }
-
-
- if (diff0 + diff1 > 0)
- temp -= (diff0 + diff1 - FFABS(FFABS(diff0) - FFABS(diff1)) / 2) / 2;
- else
- temp -= (diff0 + diff1 + FFABS(FFABS(diff0) - FFABS(diff1)) / 2) / 2;
- *filp = *dstp = temp > 255U ? ~(temp>>31) : temp;
- } else {
- *dstp = *filp;
- }
- }
- }
- }
-
- for (y = 0; y < h; y++) {
- if (!((y ^ mcdeint->parity) & 1)) {
- for (x = 0; x < w; x++) {
- frame_dec->data[i][x + y*fils] =
- outpic ->data[i][x + y*dsts] = inpic->data[i][x + y*srcs];
- }
- }
- }
- }
- mcdeint->parity ^= 1;
-
-end:
- av_packet_unref(&pkt);
- av_frame_free(&inpic);
- if (ret < 0) {
- av_frame_free(&outpic);
- return ret;
- }
- return ff_filter_frame(outlink, outpic);
-}
-
-static const AVFilterPad mcdeint_inputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- .filter_frame = filter_frame,
- .config_props = config_props,
- },
- { NULL }
-};
-
-static const AVFilterPad mcdeint_outputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- },
- { NULL }
-};
-
-AVFilter ff_vf_mcdeint = {
- .name = "mcdeint",
- .description = NULL_IF_CONFIG_SMALL("Apply motion compensating deinterlacing."),
- .priv_size = sizeof(MCDeintContext),
- .uninit = uninit,
- .query_formats = query_formats,
- .inputs = mcdeint_inputs,
- .outputs = mcdeint_outputs,
- .priv_class = &mcdeint_class,
-};
diff --git a/libavfilter/vf_mpdecimate.c b/libavfilter/vf_mpdecimate.c
deleted file mode 100644
index c9a9cb3..0000000
--- a/libavfilter/vf_mpdecimate.c
+++ /dev/null
@@ -1,255 +0,0 @@
-/*
- * Copyright (c) 2003 Rich Felker
- * Copyright (c) 2012 Stefano Sabatini
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/**
- * @file mpdecimate filter, ported from libmpcodecs/vf_decimate.c by
- * Rich Felker.
- */
-
-#include "libavutil/opt.h"
-#include "libavutil/pixdesc.h"
-#include "libavutil/pixelutils.h"
-#include "libavutil/timestamp.h"
-#include "avfilter.h"
-#include "internal.h"
-#include "formats.h"
-#include "video.h"
-
-typedef struct DecimateContext {
- const AVClass *class;
- int lo, hi; ///< lower and higher threshold number of differences
- ///< values for 8x8 blocks
-
- float frac; ///< threshold of changed pixels over the total fraction
-
- int max_drop_count; ///< if positive: maximum number of sequential frames to drop
- ///< if negative: minimum number of frames between two drops
-
- int drop_count; ///< if positive: number of frames sequentially dropped
- ///< if negative: number of sequential frames which were not dropped
-
- int hsub, vsub; ///< chroma subsampling values
- AVFrame *ref; ///< reference picture
- av_pixelutils_sad_fn sad; ///< sum of absolute difference function
-} DecimateContext;
-
-#define OFFSET(x) offsetof(DecimateContext, x)
-#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
-
-static const AVOption mpdecimate_options[] = {
- { "max", "set the maximum number of consecutive dropped frames (positive), or the minimum interval between dropped frames (negative)",
- OFFSET(max_drop_count), AV_OPT_TYPE_INT, {.i64=0}, INT_MIN, INT_MAX, FLAGS },
- { "hi", "set high dropping threshold", OFFSET(hi), AV_OPT_TYPE_INT, {.i64=64*12}, INT_MIN, INT_MAX, FLAGS },
- { "lo", "set low dropping threshold", OFFSET(lo), AV_OPT_TYPE_INT, {.i64=64*5}, INT_MIN, INT_MAX, FLAGS },
- { "frac", "set fraction dropping threshold", OFFSET(frac), AV_OPT_TYPE_FLOAT, {.dbl=0.33}, 0, 1, FLAGS },
- { NULL }
-};
-
-AVFILTER_DEFINE_CLASS(mpdecimate);
-
-/**
- * Return 1 if the two planes are different, 0 otherwise.
- */
-static int diff_planes(AVFilterContext *ctx,
- uint8_t *cur, int cur_linesize,
- uint8_t *ref, int ref_linesize,
- int w, int h)
-{
- DecimateContext *decimate = ctx->priv;
-
- int x, y;
- int d, c = 0;
- int t = (w/16)*(h/16)*decimate->frac;
-
- /* compute difference for blocks of 8x8 bytes */
- for (y = 0; y < h-7; y += 4) {
- for (x = 8; x < w-7; x += 4) {
- d = decimate->sad(cur + y*cur_linesize + x, cur_linesize,
- ref + y*ref_linesize + x, ref_linesize);
- if (d > decimate->hi) {
- av_log(ctx, AV_LOG_DEBUG, "%d>=hi ", d);
- return 1;
- }
- if (d > decimate->lo) {
- c++;
- if (c > t) {
- av_log(ctx, AV_LOG_DEBUG, "lo:%d>=%d ", c, t);
- return 1;
- }
- }
- }
- }
-
- av_log(ctx, AV_LOG_DEBUG, "lo:%d<%d ", c, t);
- return 0;
-}
-
-/**
- * Tell if the frame should be decimated, for example if it is no much
- * different with respect to the reference frame ref.
- */
-static int decimate_frame(AVFilterContext *ctx,
- AVFrame *cur, AVFrame *ref)
-{
- DecimateContext *decimate = ctx->priv;
- int plane;
-
- if (decimate->max_drop_count > 0 &&
- decimate->drop_count >= decimate->max_drop_count)
- return 0;
- if (decimate->max_drop_count < 0 &&
- (decimate->drop_count-1) > decimate->max_drop_count)
- return 0;
-
- for (plane = 0; ref->data[plane] && ref->linesize[plane]; plane++) {
- /* use 8x8 SAD even on subsampled planes. The blocks won't match up with
- * luma blocks, but hopefully nobody is depending on this to catch
- * localized chroma changes that wouldn't exceed the thresholds when
- * diluted by using what's effectively a larger block size.
- */
- int vsub = plane == 1 || plane == 2 ? decimate->vsub : 0;
- int hsub = plane == 1 || plane == 2 ? decimate->hsub : 0;
- if (diff_planes(ctx,
- cur->data[plane], cur->linesize[plane],
- ref->data[plane], ref->linesize[plane],
- AV_CEIL_RSHIFT(ref->width, hsub),
- AV_CEIL_RSHIFT(ref->height, vsub))) {
- emms_c();
- return 0;
- }
- }
-
- emms_c();
- return 1;
-}
-
-static av_cold int init(AVFilterContext *ctx)
-{
- DecimateContext *decimate = ctx->priv;
-
- decimate->sad = av_pixelutils_get_sad_fn(3, 3, 0, ctx); // 8x8, not aligned on blocksize
- if (!decimate->sad)
- return AVERROR(EINVAL);
-
- av_log(ctx, AV_LOG_VERBOSE, "max_drop_count:%d hi:%d lo:%d frac:%f\n",
- decimate->max_drop_count, decimate->hi, decimate->lo, decimate->frac);
-
- return 0;
-}
-
-static av_cold void uninit(AVFilterContext *ctx)
-{
- DecimateContext *decimate = ctx->priv;
- av_frame_free(&decimate->ref);
-}
-
-static int query_formats(AVFilterContext *ctx)
-{
- static const enum AVPixelFormat pix_fmts[] = {
- AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV422P,
- AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV411P,
- AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV440P,
- AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUVJ422P,
- AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ440P,
- AV_PIX_FMT_YUVA420P,
-
- AV_PIX_FMT_GBRP,
-
- AV_PIX_FMT_YUVA444P,
- AV_PIX_FMT_YUVA422P,
-
- AV_PIX_FMT_NONE
- };
- AVFilterFormats *fmts_list = ff_make_format_list(pix_fmts);
- if (!fmts_list)
- return AVERROR(ENOMEM);
- return ff_set_common_formats(ctx, fmts_list);
-}
-
-static int config_input(AVFilterLink *inlink)
-{
- AVFilterContext *ctx = inlink->dst;
- DecimateContext *decimate = ctx->priv;
- const AVPixFmtDescriptor *pix_desc = av_pix_fmt_desc_get(inlink->format);
- decimate->hsub = pix_desc->log2_chroma_w;
- decimate->vsub = pix_desc->log2_chroma_h;
-
- return 0;
-}
-
-static int filter_frame(AVFilterLink *inlink, AVFrame *cur)
-{
- DecimateContext *decimate = inlink->dst->priv;
- AVFilterLink *outlink = inlink->dst->outputs[0];
- int ret;
-
- if (decimate->ref && decimate_frame(inlink->dst, cur, decimate->ref)) {
- decimate->drop_count = FFMAX(1, decimate->drop_count+1);
- } else {
- av_frame_free(&decimate->ref);
- decimate->ref = cur;
- decimate->drop_count = FFMIN(-1, decimate->drop_count-1);
-
- if ((ret = ff_filter_frame(outlink, av_frame_clone(cur))) < 0)
- return ret;
- }
-
- av_log(inlink->dst, AV_LOG_DEBUG,
- "%s pts:%s pts_time:%s drop_count:%d\n",
- decimate->drop_count > 0 ? "drop" : "keep",
- av_ts2str(cur->pts), av_ts2timestr(cur->pts, &inlink->time_base),
- decimate->drop_count);
-
- if (decimate->drop_count > 0)
- av_frame_free(&cur);
-
- return 0;
-}
-
-static const AVFilterPad mpdecimate_inputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- .config_props = config_input,
- .filter_frame = filter_frame,
- },
- { NULL }
-};
-
-static const AVFilterPad mpdecimate_outputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- },
- { NULL }
-};
-
-AVFilter ff_vf_mpdecimate = {
- .name = "mpdecimate",
- .description = NULL_IF_CONFIG_SMALL("Remove near-duplicate frames."),
- .init = init,
- .uninit = uninit,
- .priv_size = sizeof(DecimateContext),
- .priv_class = &mpdecimate_class,
- .query_formats = query_formats,
- .inputs = mpdecimate_inputs,
- .outputs = mpdecimate_outputs,
-};
diff --git a/libavfilter/vf_nnedi.c b/libavfilter/vf_nnedi.c
deleted file mode 100644
index 9bad99e9..0000000
--- a/libavfilter/vf_nnedi.c
+++ /dev/null
@@ -1,1211 +0,0 @@
-/*
- * Copyright (C) 2010-2011 Kevin Stone
- * Copyright (C) 2016 Paul B Mahol
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include <float.h>
-
-#include "libavutil/common.h"
-#include "libavutil/float_dsp.h"
-#include "libavutil/imgutils.h"
-#include "libavutil/opt.h"
-#include "libavutil/pixdesc.h"
-#include "avfilter.h"
-#include "formats.h"
-#include "internal.h"
-#include "video.h"
-
-typedef struct FrameData {
- uint8_t *paddedp[3];
- int padded_stride[3];
- int padded_width[3];
- int padded_height[3];
-
- uint8_t *dstp[3];
- int dst_stride[3];
-
- int field[3];
-
- int32_t *lcount[3];
- float *input;
- float *temp;
-} FrameData;
-
-typedef struct NNEDIContext {
- const AVClass *class;
-
- char *weights_file;
-
- AVFrame *src;
- AVFrame *second;
- AVFrame *dst;
- int eof;
- int64_t cur_pts;
-
- AVFloatDSPContext *fdsp;
- int nb_planes;
- int linesize[4];
- int planeheight[4];
-
- float *weights0;
- float *weights1[2];
- int asize;
- int nns;
- int xdia;
- int ydia;
-
- // Parameters
- int deint;
- int field;
- int process_plane;
- int nsize;
- int nnsparam;
- int qual;
- int etype;
- int pscrn;
- int fapprox;
-
- int max_value;
-
- void (*copy_pad)(const AVFrame *, FrameData *, struct NNEDIContext *, int);
- void (*evalfunc_0)(struct NNEDIContext *, FrameData *);
- void (*evalfunc_1)(struct NNEDIContext *, FrameData *);
-
- // Functions used in evalfunc_0
- void (*readpixels)(const uint8_t *, const int, float *);
- void (*compute_network0)(struct NNEDIContext *s, const float *, const float *, uint8_t *);
- int32_t (*process_line0)(const uint8_t *, int, uint8_t *, const uint8_t *, const int, const int, const int);
-
- // Functions used in evalfunc_1
- void (*extract)(const uint8_t *, const int, const int, const int, float *, float *);
- void (*dot_prod)(struct NNEDIContext *, const float *, const float *, float *, const int, const int, const float *);
- void (*expfunc)(float *, const int);
- void (*wae5)(const float *, const int, float *);
-
- FrameData frame_data;
-} NNEDIContext;
-
-#define OFFSET(x) offsetof(NNEDIContext, x)
-#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
-
-static const AVOption nnedi_options[] = {
- {"weights", "set weights file", OFFSET(weights_file), AV_OPT_TYPE_STRING, {.str="nnedi3_weights.bin"}, 0, 0, FLAGS },
- {"deint", "set which frames to deinterlace", OFFSET(deint), AV_OPT_TYPE_INT, {.i64=0}, 0, 1, FLAGS, "deint" },
- {"all", "deinterlace all frames", 0, AV_OPT_TYPE_CONST, {.i64=0}, 0, 0, FLAGS, "deint" },
- {"interlaced", "only deinterlace frames marked as interlaced", 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, FLAGS, "deint" },
- {"field", "set mode of operation", OFFSET(field), AV_OPT_TYPE_INT, {.i64=-1}, -2, 3, FLAGS, "field" },
- {"af", "use frame flags, both fields", 0, AV_OPT_TYPE_CONST, {.i64=-2}, 0, 0, FLAGS, "field" },
- {"a", "use frame flags, single field", 0, AV_OPT_TYPE_CONST, {.i64=-1}, 0, 0, FLAGS, "field" },
- {"t", "use top field only", 0, AV_OPT_TYPE_CONST, {.i64=0}, 0, 0, FLAGS, "field" },
- {"b", "use bottom field only", 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, FLAGS, "field" },
- {"tf", "use both fields, top first", 0, AV_OPT_TYPE_CONST, {.i64=2}, 0, 0, FLAGS, "field" },
- {"bf", "use both fields, bottom first", 0, AV_OPT_TYPE_CONST, {.i64=3}, 0, 0, FLAGS, "field" },
- {"planes", "set which planes to process", OFFSET(process_plane), AV_OPT_TYPE_INT, {.i64=7}, 0, 7, FLAGS },
- {"nsize", "set size of local neighborhood around each pixel, used by the predictor neural network", OFFSET(nsize), AV_OPT_TYPE_INT, {.i64=6}, 0, 6, FLAGS, "nsize" },
- {"s8x6", NULL, 0, AV_OPT_TYPE_CONST, {.i64=0}, 0, 0, FLAGS, "nsize" },
- {"s16x6", NULL, 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, FLAGS, "nsize" },
- {"s32x6", NULL, 0, AV_OPT_TYPE_CONST, {.i64=2}, 0, 0, FLAGS, "nsize" },
- {"s48x6", NULL, 0, AV_OPT_TYPE_CONST, {.i64=3}, 0, 0, FLAGS, "nsize" },
- {"s8x4", NULL, 0, AV_OPT_TYPE_CONST, {.i64=4}, 0, 0, FLAGS, "nsize" },
- {"s16x4", NULL, 0, AV_OPT_TYPE_CONST, {.i64=5}, 0, 0, FLAGS, "nsize" },
- {"s32x4", NULL, 0, AV_OPT_TYPE_CONST, {.i64=6}, 0, 0, FLAGS, "nsize" },
- {"nns", "set number of neurons in predictor neural network", OFFSET(nnsparam), AV_OPT_TYPE_INT, {.i64=1}, 0, 4, FLAGS, "nns" },
- {"n16", NULL, 0, AV_OPT_TYPE_CONST, {.i64=0}, 0, 0, FLAGS, "nns" },
- {"n32", NULL, 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, FLAGS, "nns" },
- {"n64", NULL, 0, AV_OPT_TYPE_CONST, {.i64=2}, 0, 0, FLAGS, "nns" },
- {"n128", NULL, 0, AV_OPT_TYPE_CONST, {.i64=3}, 0, 0, FLAGS, "nns" },
- {"n256", NULL, 0, AV_OPT_TYPE_CONST, {.i64=4}, 0, 0, FLAGS, "nns" },
- {"qual", "set quality", OFFSET(qual), AV_OPT_TYPE_INT, {.i64=1}, 1, 2, FLAGS, "qual" },
- {"fast", NULL, 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, FLAGS, "qual" },
- {"slow", NULL, 0, AV_OPT_TYPE_CONST, {.i64=2}, 0, 0, FLAGS, "qual" },
- {"etype", "set which set of weights to use in the predictor", OFFSET(etype), AV_OPT_TYPE_INT, {.i64=0}, 0, 1, FLAGS, "etype" },
- {"a", "weights trained to minimize absolute error", 0, AV_OPT_TYPE_CONST, {.i64=0}, 0, 0, FLAGS, "etype" },
- {"s", "weights trained to minimize squared error", 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, FLAGS, "etype" },
- {"pscrn", "set prescreening", OFFSET(pscrn), AV_OPT_TYPE_INT, {.i64=2}, 0, 2, FLAGS, "pscrn" },
- {"none", NULL, 0, AV_OPT_TYPE_CONST, {.i64=0}, 0, 0, FLAGS, "pscrn" },
- {"original", NULL, 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, FLAGS, "pscrn" },
- {"new", NULL, 0, AV_OPT_TYPE_CONST, {.i64=2}, 0, 0, FLAGS, "pscrn" },
- {"fapprox", NULL, OFFSET(fapprox), AV_OPT_TYPE_INT, {.i64=0}, 0, 3, FLAGS },
- { NULL }
-};
-
-AVFILTER_DEFINE_CLASS(nnedi);
-
-static int config_input(AVFilterLink *inlink)
-{
- AVFilterContext *ctx = inlink->dst;
- NNEDIContext *s = ctx->priv;
- const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
- int ret;
-
- s->nb_planes = av_pix_fmt_count_planes(inlink->format);
- if ((ret = av_image_fill_linesizes(s->linesize, inlink->format, inlink->w)) < 0)
- return ret;
-
- s->planeheight[1] = s->planeheight[2] = AV_CEIL_RSHIFT(inlink->h, desc->log2_chroma_h);
- s->planeheight[0] = s->planeheight[3] = inlink->h;
-
- return 0;
-}
-
-static int config_output(AVFilterLink *outlink)
-{
- AVFilterContext *ctx = outlink->src;
- NNEDIContext *s = ctx->priv;
-
- outlink->time_base.num = ctx->inputs[0]->time_base.num;
- outlink->time_base.den = ctx->inputs[0]->time_base.den * 2;
- outlink->w = ctx->inputs[0]->w;
- outlink->h = ctx->inputs[0]->h;
-
- if (s->field > 1 || s->field == -2)
- outlink->frame_rate = av_mul_q(ctx->inputs[0]->frame_rate,
- (AVRational){2, 1});
-
- return 0;
-}
-
-static int query_formats(AVFilterContext *ctx)
-{
- static const enum AVPixelFormat pix_fmts[] = {
- AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV411P,
- AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P,
- AV_PIX_FMT_YUV440P, AV_PIX_FMT_YUV444P,
- AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUVJ440P,
- AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ420P,
- AV_PIX_FMT_YUVJ411P,
- AV_PIX_FMT_GBRP,
- AV_PIX_FMT_GRAY8,
- AV_PIX_FMT_NONE
- };
-
- AVFilterFormats *fmts_list = ff_make_format_list(pix_fmts);
- if (!fmts_list)
- return AVERROR(ENOMEM);
- return ff_set_common_formats(ctx, fmts_list);
-}
-
-static void copy_pad(const AVFrame *src, FrameData *frame_data, NNEDIContext *s, int fn)
-{
- const int off = 1 - fn;
- int plane, y, x;
-
- for (plane = 0; plane < s->nb_planes; plane++) {
- const uint8_t *srcp = (const uint8_t *)src->data[plane];
- uint8_t *dstp = (uint8_t *)frame_data->paddedp[plane];
-
- const int src_stride = src->linesize[plane];
- const int dst_stride = frame_data->padded_stride[plane];
-
- const int src_height = s->planeheight[plane];
- const int dst_height = frame_data->padded_height[plane];
-
- const int src_width = s->linesize[plane];
- const int dst_width = frame_data->padded_width[plane];
-
- int c = 4;
-
- if (!(s->process_plane & (1 << plane)))
- continue;
-
- // Copy.
- for (y = off; y < src_height; y += 2)
- memcpy(dstp + 32 + (6 + y) * dst_stride,
- srcp + y * src_stride,
- src_width * sizeof(uint8_t));
-
- // And pad.
- dstp += (6 + off) * dst_stride;
- for (y = 6 + off; y < dst_height - 6; y += 2) {
- int c = 2;
-
- for (x = 0; x < 32; x++)
- dstp[x] = dstp[64 - x];
-
- for (x = dst_width - 32; x < dst_width; x++, c += 2)
- dstp[x] = dstp[x - c];
-
- dstp += dst_stride * 2;
- }
-
- dstp = (uint8_t *)frame_data->paddedp[plane];
- for (y = off; y < 6; y += 2)
- memcpy(dstp + y * dst_stride,
- dstp + (12 + 2 * off - y) * dst_stride,
- dst_width * sizeof(uint8_t));
-
- for (y = dst_height - 6 + off; y < dst_height; y += 2, c += 4)
- memcpy(dstp + y * dst_stride,
- dstp + (y - c) * dst_stride,
- dst_width * sizeof(uint8_t));
- }
-}
-
-static void elliott(float *data, const int n)
-{
- int i;
-
- for (i = 0; i < n; i++)
- data[i] = data[i] / (1.0f + FFABS(data[i]));
-}
-
-static void dot_prod(NNEDIContext *s, const float *data, const float *weights, float *vals, const int n, const int len, const float *scale)
-{
- int i;
-
- for (i = 0; i < n; i++) {
- float sum;
-
- sum = s->fdsp->scalarproduct_float(data, &weights[i * len], len);
-
- vals[i] = sum * scale[0] + weights[n * len + i];
- }
-}
-
-static void dot_prods(NNEDIContext *s, const float *dataf, const float *weightsf, float *vals, const int n, const int len, const float *scale)
-{
- const int16_t *data = (int16_t *)dataf;
- const int16_t *weights = (int16_t *)weightsf;
- const float *wf = (float *)&weights[n * len];
- int i, j;
-
- for (i = 0; i < n; i++) {
- int sum = 0, off = ((i >> 2) << 3) + (i & 3);
- for (j = 0; j < len; j++)
- sum += data[j] * weights[i * len + j];
-
- vals[i] = sum * wf[off] * scale[0] + wf[off + 4];
- }
-}
-
-static void compute_network0(NNEDIContext *s, const float *input, const float *weights, uint8_t *d)
-{
- float t, temp[12], scale = 1.0f;
-
- dot_prod(s, input, weights, temp, 4, 48, &scale);
- t = temp[0];
- elliott(temp, 4);
- temp[0] = t;
- dot_prod(s, temp, weights + 4 * 49, temp + 4, 4, 4, &scale);
- elliott(temp + 4, 4);
- dot_prod(s, temp, weights + 4 * 49 + 4 * 5, temp + 8, 4, 8, &scale);
- if (FFMAX(temp[10], temp[11]) <= FFMAX(temp[8], temp[9]))
- d[0] = 1;
- else
- d[0] = 0;
-}
-
-static void compute_network0_i16(NNEDIContext *s, const float *inputf, const float *weightsf, uint8_t *d)
-{
- const float *wf = weightsf + 2 * 48;
- float t, temp[12], scale = 1.0f;
-
- dot_prods(s, inputf, weightsf, temp, 4, 48, &scale);
- t = temp[0];
- elliott(temp, 4);
- temp[0] = t;
- dot_prod(s, temp, wf + 8, temp + 4, 4, 4, &scale);
- elliott(temp + 4, 4);
- dot_prod(s, temp, wf + 8 + 4 * 5, temp + 8, 4, 8, &scale);
- if (FFMAX(temp[10], temp[11]) <= FFMAX(temp[8], temp[9]))
- d[0] = 1;
- else
- d[0] = 0;
-}
-
-static void pixel2float48(const uint8_t *t8, const int pitch, float *p)
-{
- const uint8_t *t = (const uint8_t *)t8;
- int y, x;
-
- for (y = 0; y < 4; y++)
- for (x = 0; x < 12; x++)
- p[y * 12 + x] = t[y * pitch * 2 + x];
-}
-
-static void byte2word48(const uint8_t *t, const int pitch, float *pf)
-{
- int16_t *p = (int16_t *)pf;
- int y, x;
-
- for (y = 0; y < 4; y++)
- for (x = 0; x < 12; x++)
- p[y * 12 + x] = t[y * pitch * 2 + x];
-}
-
-static int32_t process_line0(const uint8_t *tempu, int width, uint8_t *dstp8, const uint8_t *src3p8, const int src_pitch, const int max_value, const int chroma)
-{
- uint8_t *dstp = (uint8_t *)dstp8;
- const uint8_t *src3p = (const uint8_t *)src3p8;
- int minimum = 0;
- int maximum = max_value - 1; // Technically the -1 is only needed for 8 and 16 bit input.
- int count = 0, x;
- for (x = 0; x < width; x++) {
- if (tempu[x]) {
- int tmp = 19 * (src3p[x + src_pitch * 2] + src3p[x + src_pitch * 4]) - 3 * (src3p[x] + src3p[x + src_pitch * 6]);
- tmp /= 32;
- dstp[x] = FFMAX(FFMIN(tmp, maximum), minimum);
- } else {
- dstp[x] = 255;
- count++;
- }
- }
- return count;
-}
-
-// new prescreener functions
-static void byte2word64(const uint8_t *t, const int pitch, float *p)
-{
- int16_t *ps = (int16_t *)p;
- int y, x;
-
- for (y = 0; y < 4; y++)
- for (x = 0; x < 16; x++)
- ps[y * 16 + x] = t[y * pitch * 2 + x];
-}
-
-static void compute_network0new(NNEDIContext *s, const float *datai, const float *weights, uint8_t *d)
-{
- int16_t *data = (int16_t *)datai;
- int16_t *ws = (int16_t *)weights;
- float *wf = (float *)&ws[4 * 64];
- float vals[8];
- int mask, i, j;
-
- for (i = 0; i < 4; i++) {
- int sum = 0;
- float t;
-
- for (j = 0; j < 64; j++)
- sum += data[j] * ws[(i << 3) + ((j >> 3) << 5) + (j & 7)];
- t = sum * wf[i] + wf[4 + i];
- vals[i] = t / (1.0f + FFABS(t));
- }
-
- for (i = 0; i < 4; i++) {
- float sum = 0.0f;
-
- for (j = 0; j < 4; j++)
- sum += vals[j] * wf[8 + i + (j << 2)];
- vals[4 + i] = sum + wf[8 + 16 + i];
- }
-
- mask = 0;
- for (i = 0; i < 4; i++) {
- if (vals[4 + i] > 0.0f)
- mask |= (0x1 << (i << 3));
- }
-
- ((int *)d)[0] = mask;
-}
-
-static void evalfunc_0(NNEDIContext *s, FrameData *frame_data)
-{
- float *input = frame_data->input;
- const float *weights0 = s->weights0;
- float *temp = frame_data->temp;
- uint8_t *tempu = (uint8_t *)temp;
- int plane, x, y;
-
- // And now the actual work.
- for (plane = 0; plane < s->nb_planes; plane++) {
- const uint8_t *srcp = (const uint8_t *)frame_data->paddedp[plane];
- const int src_stride = frame_data->padded_stride[plane] / sizeof(uint8_t);
-
- const int width = frame_data->padded_width[plane];
- const int height = frame_data->padded_height[plane];
-
- uint8_t *dstp = (uint8_t *)frame_data->dstp[plane];
- const int dst_stride = frame_data->dst_stride[plane] / sizeof(uint8_t);
- const uint8_t *src3p;
- int ystart, ystop;
- int32_t *lcount;
-
- if (!(s->process_plane & (1 << plane)))
- continue;
-
- for (y = 1 - frame_data->field[plane]; y < height - 12; y += 2) {
- memcpy(dstp + y * dst_stride,
- srcp + 32 + (6 + y) * src_stride,
- (width - 64) * sizeof(uint8_t));
-
- }
-
- ystart = 6 + frame_data->field[plane];
- ystop = height - 6;
- srcp += ystart * src_stride;
- dstp += (ystart - 6) * dst_stride - 32;
- src3p = srcp - src_stride * 3;
- lcount = frame_data->lcount[plane] - 6;
-
- if (s->pscrn == 1) { // original
- for (y = ystart; y < ystop; y += 2) {
- for (x = 32; x < width - 32; x++) {
- s->readpixels((const uint8_t *)(src3p + x - 5), src_stride, input);
- s->compute_network0(s, input, weights0, tempu+x);
- }
- lcount[y] += s->process_line0(tempu + 32, width - 64, (uint8_t *)(dstp + 32), (const uint8_t *)(src3p + 32), src_stride, s->max_value, plane);
- src3p += src_stride * 2;
- dstp += dst_stride * 2;
- }
- } else if (s->pscrn > 1) { // new
- for (y = ystart; y < ystop; y += 2) {
- for (x = 32; x < width - 32; x += 4) {
- s->readpixels((const uint8_t *)(src3p + x - 6), src_stride, input);
- s->compute_network0(s, input, weights0, tempu + x);
- }
- lcount[y] += s->process_line0(tempu + 32, width - 64, (uint8_t *)(dstp + 32), (const uint8_t *)(src3p + 32), src_stride, s->max_value, plane);
- src3p += src_stride * 2;
- dstp += dst_stride * 2;
- }
- } else { // no prescreening
- for (y = ystart; y < ystop; y += 2) {
- memset(dstp + 32, 255, (width - 64) * sizeof(uint8_t));
- lcount[y] += width - 64;
- dstp += dst_stride * 2;
- }
- }
- }
-}
-
-static void extract_m8(const uint8_t *srcp8, const int stride, const int xdia, const int ydia, float *mstd, float *input)
-{
- // uint8_t or uint16_t or float
- const uint8_t *srcp = (const uint8_t *)srcp8;
- float scale;
- double tmp;
-
- // int32_t or int64_t or double
- int64_t sum = 0, sumsq = 0;
- int y, x;
-
- for (y = 0; y < ydia; y++) {
- const uint8_t *srcpT = srcp + y * stride * 2;
-
- for (x = 0; x < xdia; x++) {
- sum += srcpT[x];
- sumsq += (uint32_t)srcpT[x] * (uint32_t)srcpT[x];
- input[x] = srcpT[x];
- }
- input += xdia;
- }
- scale = 1.0f / (xdia * ydia);
- mstd[0] = sum * scale;
- tmp = (double)sumsq * scale - (double)mstd[0] * mstd[0];
- mstd[3] = 0.0f;
- if (tmp <= FLT_EPSILON)
- mstd[1] = mstd[2] = 0.0f;
- else {
- mstd[1] = sqrt(tmp);
- mstd[2] = 1.0f / mstd[1];
- }
-}
-
-static void extract_m8_i16(const uint8_t *srcp, const int stride, const int xdia, const int ydia, float *mstd, float *inputf)
-{
- int16_t *input = (int16_t *)inputf;
- float scale;
- int sum = 0, sumsq = 0;
- int y, x;
-
- for (y = 0; y < ydia; y++) {
- const uint8_t *srcpT = srcp + y * stride * 2;
- for (x = 0; x < xdia; x++) {
- sum += srcpT[x];
- sumsq += srcpT[x] * srcpT[x];
- input[x] = srcpT[x];
- }
- input += xdia;
- }
- scale = 1.0f / (float)(xdia * ydia);
- mstd[0] = sum * scale;
- mstd[1] = sumsq * scale - mstd[0] * mstd[0];
- mstd[3] = 0.0f;
- if (mstd[1] <= FLT_EPSILON)
- mstd[1] = mstd[2] = 0.0f;
- else {
- mstd[1] = sqrt(mstd[1]);
- mstd[2] = 1.0f / mstd[1];
- }
-}
-
-
-static const float exp_lo = -80.0f;
-static const float exp_hi = +80.0f;
-
-static void e2_m16(float *s, const int n)
-{
- int i;
-
- for (i = 0; i < n; i++)
- s[i] = exp(av_clipf(s[i], exp_lo, exp_hi));
-}
-
-const float min_weight_sum = 1e-10f;
-
-static void weighted_avg_elliott_mul5_m16(const float *w, const int n, float *mstd)
-{
- float vsum = 0.0f, wsum = 0.0f;
- int i;
-
- for (i = 0; i < n; i++) {
- vsum += w[i] * (w[n + i] / (1.0f + FFABS(w[n + i])));
- wsum += w[i];
- }
- if (wsum > min_weight_sum)
- mstd[3] += ((5.0f * vsum) / wsum) * mstd[1] + mstd[0];
- else
- mstd[3] += mstd[0];
-}
-
-
-static void evalfunc_1(NNEDIContext *s, FrameData *frame_data)
-{
- float *input = frame_data->input;
- float *temp = frame_data->temp;
- float **weights1 = s->weights1;
- const int qual = s->qual;
- const int asize = s->asize;
- const int nns = s->nns;
- const int xdia = s->xdia;
- const int xdiad2m1 = (xdia / 2) - 1;
- const int ydia = s->ydia;
- const float scale = 1.0f / (float)qual;
- int plane, y, x, i;
-
- for (plane = 0; plane < s->nb_planes; plane++) {
- const uint8_t *srcp = (const uint8_t *)frame_data->paddedp[plane];
- const int src_stride = frame_data->padded_stride[plane] / sizeof(uint8_t);
-
- const int width = frame_data->padded_width[plane];
- const int height = frame_data->padded_height[plane];
-
- uint8_t *dstp = (uint8_t *)frame_data->dstp[plane];
- const int dst_stride = frame_data->dst_stride[plane] / sizeof(uint8_t);
-
- const int ystart = frame_data->field[plane];
- const int ystop = height - 12;
- const uint8_t *srcpp;
-
- if (!(s->process_plane & (1 << plane)))
- continue;
-
- srcp += (ystart + 6) * src_stride;
- dstp += ystart * dst_stride - 32;
- srcpp = srcp - (ydia - 1) * src_stride - xdiad2m1;
-
- for (y = ystart; y < ystop; y += 2) {
- for (x = 32; x < width - 32; x++) {
- float mstd[4];
-
- if (dstp[x] != 255)
- continue;
-
- s->extract((const uint8_t *)(srcpp + x), src_stride, xdia, ydia, mstd, input);
- for (i = 0; i < qual; i++) {
- s->dot_prod(s, input, weights1[i], temp, nns * 2, asize, mstd + 2);
- s->expfunc(temp, nns);
- s->wae5(temp, nns, mstd);
- }
-
- dstp[x] = FFMIN(FFMAX((int)(mstd[3] * scale + 0.5f), 0), s->max_value);
- }
- srcpp += src_stride * 2;
- dstp += dst_stride * 2;
- }
- }
-}
-
-#define NUM_NSIZE 7
-#define NUM_NNS 5
-
-static int roundds(const double f)
-{
- if (f - floor(f) >= 0.5)
- return FFMIN((int)ceil(f), 32767);
- return FFMAX((int)floor(f), -32768);
-}
-
-static void select_functions(NNEDIContext *s)
-{
- s->copy_pad = copy_pad;
- s->evalfunc_0 = evalfunc_0;
- s->evalfunc_1 = evalfunc_1;
-
- // evalfunc_0
- s->process_line0 = process_line0;
-
- if (s->pscrn < 2) { // original prescreener
- if (s->fapprox & 1) { // int16 dot products
- s->readpixels = byte2word48;
- s->compute_network0 = compute_network0_i16;
- } else {
- s->readpixels = pixel2float48;
- s->compute_network0 = compute_network0;
- }
- } else { // new prescreener
- // only int16 dot products
- s->readpixels = byte2word64;
- s->compute_network0 = compute_network0new;
- }
-
- // evalfunc_1
- s->wae5 = weighted_avg_elliott_mul5_m16;
-
- if (s->fapprox & 2) { // use int16 dot products
- s->extract = extract_m8_i16;
- s->dot_prod = dot_prods;
- } else { // use float dot products
- s->extract = extract_m8;
- s->dot_prod = dot_prod;
- }
-
- s->expfunc = e2_m16;
-}
-
-static int modnpf(const int m, const int n)
-{
- if ((m % n) == 0)
- return m;
- return m + n - (m % n);
-}
-
-static int get_frame(AVFilterContext *ctx, int is_second)
-{
- NNEDIContext *s = ctx->priv;
- AVFilterLink *outlink = ctx->outputs[0];
- AVFrame *src = s->src;
- FrameData *frame_data;
- int effective_field = s->field;
- size_t temp_size;
- int field_n;
- int plane;
-
- if (effective_field > 1)
- effective_field -= 2;
- else if (effective_field < 0)
- effective_field += 2;
-
- if (s->field < 0 && src->interlaced_frame && src->top_field_first == 0)
- effective_field = 0;
- else if (s->field < 0 && src->interlaced_frame && src->top_field_first == 1)
- effective_field = 1;
- else
- effective_field = !effective_field;
-
- if (s->field > 1 || s->field == -2) {
- if (is_second) {
- field_n = (effective_field == 0);
- } else {
- field_n = (effective_field == 1);
- }
- } else {
- field_n = effective_field;
- }
-
- s->dst = ff_get_video_buffer(outlink, outlink->w, outlink->h);
- if (!s->dst)
- return AVERROR(ENOMEM);
- av_frame_copy_props(s->dst, src);
- s->dst->interlaced_frame = 0;
-
- frame_data = &s->frame_data;
-
- for (plane = 0; plane < s->nb_planes; plane++) {
- int dst_height = s->planeheight[plane];
- int dst_width = s->linesize[plane];
-
- const int min_alignment = 16;
- const int min_pad = 10;
-
- if (!(s->process_plane & (1 << plane))) {
- av_image_copy_plane(s->dst->data[plane], s->dst->linesize[plane],
- src->data[plane], src->linesize[plane],
- s->linesize[plane],
- s->planeheight[plane]);
- continue;
- }
-
- frame_data->padded_width[plane] = dst_width + 64;
- frame_data->padded_height[plane] = dst_height + 12;
- frame_data->padded_stride[plane] = modnpf(frame_data->padded_width[plane] + min_pad, min_alignment); // TODO: maybe min_pad is in pixels too?
- if (!frame_data->paddedp[plane]) {
- frame_data->paddedp[plane] = av_malloc_array(frame_data->padded_stride[plane], frame_data->padded_height[plane]);
- if (!frame_data->paddedp[plane])
- return AVERROR(ENOMEM);
- }
-
- frame_data->dstp[plane] = s->dst->data[plane];
- frame_data->dst_stride[plane] = s->dst->linesize[plane];
-
- if (!frame_data->lcount[plane]) {
- frame_data->lcount[plane] = av_calloc(dst_height, sizeof(int32_t) * 16);
- if (!frame_data->lcount[plane])
- return AVERROR(ENOMEM);
- } else {
- memset(frame_data->lcount[plane], 0, dst_height * sizeof(int32_t) * 16);
- }
-
- frame_data->field[plane] = field_n;
- }
-
- if (!frame_data->input) {
- frame_data->input = av_malloc(512 * sizeof(float));
- if (!frame_data->input)
- return AVERROR(ENOMEM);
- }
- // evalfunc_0 requires at least padded_width[0] bytes.
- // evalfunc_1 requires at least 512 floats.
- if (!frame_data->temp) {
- temp_size = FFMAX(frame_data->padded_width[0], 512 * sizeof(float));
- frame_data->temp = av_malloc(temp_size);
- if (!frame_data->temp)
- return AVERROR(ENOMEM);
- }
-
- // Copy src to a padded "frame" in frame_data and mirror the edges.
- s->copy_pad(src, frame_data, s, field_n);
-
- // Handles prescreening and the cubic interpolation.
- s->evalfunc_0(s, frame_data);
-
- // The rest.
- s->evalfunc_1(s, frame_data);
-
- return 0;
-}
-
-static int filter_frame(AVFilterLink *inlink, AVFrame *src)
-{
- AVFilterContext *ctx = inlink->dst;
- AVFilterLink *outlink = ctx->outputs[0];
- NNEDIContext *s = ctx->priv;
- int ret;
-
- if ((s->field > 1 ||
- s->field == -2) && !s->second) {
- goto second;
- } else if (s->field > 1 ||
- s->field == -2) {
- AVFrame *dst;
-
- s->src = s->second;
- ret = get_frame(ctx, 1);
- if (ret < 0) {
- av_frame_free(&s->dst);
- av_frame_free(&s->second);
- s->src = NULL;
- return ret;
- }
- dst = s->dst;
-
- if (src->pts != AV_NOPTS_VALUE &&
- dst->pts != AV_NOPTS_VALUE)
- dst->pts += src->pts;
- else
- dst->pts = AV_NOPTS_VALUE;
-
- ret = ff_filter_frame(outlink, dst);
- if (ret < 0)
- return ret;
- if (s->eof)
- return 0;
- s->cur_pts = s->second->pts;
- av_frame_free(&s->second);
-second:
- if ((s->deint && src->interlaced_frame &&
- !ctx->is_disabled) ||
- (!s->deint && !ctx->is_disabled)) {
- s->second = src;
- }
- }
-
- if ((s->deint && !src->interlaced_frame) || ctx->is_disabled) {
- AVFrame *dst = av_frame_clone(src);
- if (!dst) {
- av_frame_free(&src);
- av_frame_free(&s->second);
- return AVERROR(ENOMEM);
- }
-
- if (s->field > 1 || s->field == -2) {
- av_frame_free(&s->second);
- if ((s->deint && src->interlaced_frame) ||
- (!s->deint))
- s->second = src;
- } else {
- av_frame_free(&src);
- }
- if (dst->pts != AV_NOPTS_VALUE)
- dst->pts *= 2;
- return ff_filter_frame(outlink, dst);
- }
-
- s->src = src;
- ret = get_frame(ctx, 0);
- if (ret < 0) {
- av_frame_free(&s->dst);
- av_frame_free(&s->src);
- av_frame_free(&s->second);
- return ret;
- }
-
- if (src->pts != AV_NOPTS_VALUE)
- s->dst->pts = src->pts * 2;
- if (s->field <= 1 && s->field > -2) {
- av_frame_free(&src);
- s->src = NULL;
- }
-
- return ff_filter_frame(outlink, s->dst);
-}
-
-static int request_frame(AVFilterLink *link)
-{
- AVFilterContext *ctx = link->src;
- NNEDIContext *s = ctx->priv;
- int ret;
-
- if (s->eof)
- return AVERROR_EOF;
-
- ret = ff_request_frame(ctx->inputs[0]);
-
- if (ret == AVERROR_EOF && s->second) {
- AVFrame *next = av_frame_clone(s->second);
-
- if (!next)
- return AVERROR(ENOMEM);
-
- next->pts = s->second->pts * 2 - s->cur_pts;
- s->eof = 1;
-
- filter_frame(ctx->inputs[0], next);
- } else if (ret < 0) {
- return ret;
- }
-
- return 0;
-}
-
-static av_cold int init(AVFilterContext *ctx)
-{
- NNEDIContext *s = ctx->priv;
- FILE *weights_file = NULL;
- int64_t expected_size = 13574928;
- int64_t weights_size;
- float *bdata;
- size_t bytes_read;
- const int xdia_table[NUM_NSIZE] = { 8, 16, 32, 48, 8, 16, 32 };
- const int ydia_table[NUM_NSIZE] = { 6, 6, 6, 6, 4, 4, 4 };
- const int nns_table[NUM_NNS] = { 16, 32, 64, 128, 256 };
- const int dims0 = 49 * 4 + 5 * 4 + 9 * 4;
- const int dims0new = 4 * 65 + 4 * 5;
- const int dims1 = nns_table[s->nnsparam] * 2 * (xdia_table[s->nsize] * ydia_table[s->nsize] + 1);
- int dims1tsize = 0;
- int dims1offset = 0;
- int ret = 0, i, j, k;
-
- weights_file = fopen(s->weights_file, "rb");
- if (!weights_file) {
- av_log(ctx, AV_LOG_ERROR, "No weights file provided, aborting!\n");
- return AVERROR(EINVAL);
- }
-
- if (fseek(weights_file, 0, SEEK_END)) {
- av_log(ctx, AV_LOG_ERROR, "Couldn't seek to the end of weights file.\n");
- fclose(weights_file);
- return AVERROR(EINVAL);
- }
-
- weights_size = ftell(weights_file);
-
- if (weights_size == -1) {
- fclose(weights_file);
- av_log(ctx, AV_LOG_ERROR, "Couldn't get size of weights file.\n");
- return AVERROR(EINVAL);
- } else if (weights_size != expected_size) {
- fclose(weights_file);
- av_log(ctx, AV_LOG_ERROR, "Unexpected weights file size.\n");
- return AVERROR(EINVAL);
- }
-
- if (fseek(weights_file, 0, SEEK_SET)) {
- fclose(weights_file);
- av_log(ctx, AV_LOG_ERROR, "Couldn't seek to the start of weights file.\n");
- return AVERROR(EINVAL);
- }
-
- bdata = (float *)av_malloc(expected_size);
- if (!bdata) {
- fclose(weights_file);
- return AVERROR(ENOMEM);
- }
-
- bytes_read = fread(bdata, 1, expected_size, weights_file);
-
- if (bytes_read != (size_t)expected_size) {
- fclose(weights_file);
- ret = AVERROR_INVALIDDATA;
- av_log(ctx, AV_LOG_ERROR, "Couldn't read weights file.\n");
- goto fail;
- }
-
- fclose(weights_file);
-
- for (j = 0; j < NUM_NNS; j++) {
- for (i = 0; i < NUM_NSIZE; i++) {
- if (i == s->nsize && j == s->nnsparam)
- dims1offset = dims1tsize;
- dims1tsize += nns_table[j] * 2 * (xdia_table[i] * ydia_table[i] + 1) * 2;
- }
- }
-
- s->weights0 = av_malloc_array(FFMAX(dims0, dims0new), sizeof(float));
- if (!s->weights0) {
- ret = AVERROR(ENOMEM);
- goto fail;
- }
-
- for (i = 0; i < 2; i++) {
- s->weights1[i] = av_malloc_array(dims1, sizeof(float));
- if (!s->weights1[i]) {
- ret = AVERROR(ENOMEM);
- goto fail;
- }
- }
-
- // Adjust prescreener weights
- if (s->pscrn >= 2) {// using new prescreener
- const float *bdw;
- int16_t *ws;
- float *wf;
- double mean[4] = { 0.0, 0.0, 0.0, 0.0 };
- int *offt = av_calloc(4 * 64, sizeof(int));
-
- if (!offt) {
- ret = AVERROR(ENOMEM);
- goto fail;
- }
-
- for (j = 0; j < 4; j++)
- for (k = 0; k < 64; k++)
- offt[j * 64 + k] = ((k >> 3) << 5) + ((j & 3) << 3) + (k & 7);
-
- bdw = bdata + dims0 + dims0new * (s->pscrn - 2);
- ws = (int16_t *)s->weights0;
- wf = (float *)&ws[4 * 64];
- // Calculate mean weight of each first layer neuron
- for (j = 0; j < 4; j++) {
- double cmean = 0.0;
- for (k = 0; k < 64; k++)
- cmean += bdw[offt[j * 64 + k]];
- mean[j] = cmean / 64.0;
- }
- // Factor mean removal and 1.0/127.5 scaling
- // into first layer weights. scale to int16 range
- for (j = 0; j < 4; j++) {
- double scale, mval = 0.0;
-
- for (k = 0; k < 64; k++)
- mval = FFMAX(mval, FFABS((bdw[offt[j * 64 + k]] - mean[j]) / 127.5));
- scale = 32767.0 / mval;
- for (k = 0; k < 64; k++)
- ws[offt[j * 64 + k]] = roundds(((bdw[offt[j * 64 + k]] - mean[j]) / 127.5) * scale);
- wf[j] = (float)(mval / 32767.0);
- }
- memcpy(wf + 4, bdw + 4 * 64, (dims0new - 4 * 64) * sizeof(float));
- av_free(offt);
- } else { // using old prescreener
- double mean[4] = { 0.0, 0.0, 0.0, 0.0 };
- // Calculate mean weight of each first layer neuron
- for (j = 0; j < 4; j++) {
- double cmean = 0.0;
- for (k = 0; k < 48; k++)
- cmean += bdata[j * 48 + k];
- mean[j] = cmean / 48.0;
- }
- if (s->fapprox & 1) {// use int16 dot products in first layer
- int16_t *ws = (int16_t *)s->weights0;
- float *wf = (float *)&ws[4 * 48];
- // Factor mean removal and 1.0/127.5 scaling
- // into first layer weights. scale to int16 range
- for (j = 0; j < 4; j++) {
- double scale, mval = 0.0;
- for (k = 0; k < 48; k++)
- mval = FFMAX(mval, FFABS((bdata[j * 48 + k] - mean[j]) / 127.5));
- scale = 32767.0 / mval;
- for (k = 0; k < 48; k++)
- ws[j * 48 + k] = roundds(((bdata[j * 48 + k] - mean[j]) / 127.5) * scale);
- wf[j] = (float)(mval / 32767.0);
- }
- memcpy(wf + 4, bdata + 4 * 48, (dims0 - 4 * 48) * sizeof(float));
- } else {// use float dot products in first layer
- double half = (1 << 8) - 1;
-
- half /= 2;
-
- // Factor mean removal and 1.0/half scaling
- // into first layer weights.
- for (j = 0; j < 4; j++)
- for (k = 0; k < 48; k++)
- s->weights0[j * 48 + k] = (float)((bdata[j * 48 + k] - mean[j]) / half);
- memcpy(s->weights0 + 4 * 48, bdata + 4 * 48, (dims0 - 4 * 48) * sizeof(float));
- }
- }
-
- // Adjust prediction weights
- for (i = 0; i < 2; i++) {
- const float *bdataT = bdata + dims0 + dims0new * 3 + dims1tsize * s->etype + dims1offset + i * dims1;
- const int nnst = nns_table[s->nnsparam];
- const int asize = xdia_table[s->nsize] * ydia_table[s->nsize];
- const int boff = nnst * 2 * asize;
- double *mean = (double *)av_calloc(asize + 1 + nnst * 2, sizeof(double));
-
- if (!mean) {
- ret = AVERROR(ENOMEM);
- goto fail;
- }
-
- // Calculate mean weight of each neuron (ignore bias)
- for (j = 0; j < nnst * 2; j++) {
- double cmean = 0.0;
- for (k = 0; k < asize; k++)
- cmean += bdataT[j * asize + k];
- mean[asize + 1 + j] = cmean / (double)asize;
- }
- // Calculate mean softmax neuron
- for (j = 0; j < nnst; j++) {
- for (k = 0; k < asize; k++)
- mean[k] += bdataT[j * asize + k] - mean[asize + 1 + j];
- mean[asize] += bdataT[boff + j];
- }
- for (j = 0; j < asize + 1; j++)
- mean[j] /= (double)(nnst);
-
- if (s->fapprox & 2) { // use int16 dot products
- int16_t *ws = (int16_t *)s->weights1[i];
- float *wf = (float *)&ws[nnst * 2 * asize];
- // Factor mean removal into weights, remove global offset from
- // softmax neurons, and scale weights to int16 range.
- for (j = 0; j < nnst; j++) { // softmax neurons
- double scale, mval = 0.0;
- for (k = 0; k < asize; k++)
- mval = FFMAX(mval, FFABS(bdataT[j * asize + k] - mean[asize + 1 + j] - mean[k]));
- scale = 32767.0 / mval;
- for (k = 0; k < asize; k++)
- ws[j * asize + k] = roundds((bdataT[j * asize + k] - mean[asize + 1 + j] - mean[k]) * scale);
- wf[(j >> 2) * 8 + (j & 3)] = (float)(mval / 32767.0);
- wf[(j >> 2) * 8 + (j & 3) + 4] = (float)(bdataT[boff + j] - mean[asize]);
- }
- for (j = nnst; j < nnst * 2; j++) { // elliott neurons
- double scale, mval = 0.0;
- for (k = 0; k < asize; k++)
- mval = FFMAX(mval, FFABS(bdataT[j * asize + k] - mean[asize + 1 + j]));
- scale = 32767.0 / mval;
- for (k = 0; k < asize; k++)
- ws[j * asize + k] = roundds((bdataT[j * asize + k] - mean[asize + 1 + j]) * scale);
- wf[(j >> 2) * 8 + (j & 3)] = (float)(mval / 32767.0);
- wf[(j >> 2) * 8 + (j & 3) + 4] = bdataT[boff + j];
- }
- } else { // use float dot products
- // Factor mean removal into weights, and remove global
- // offset from softmax neurons.
- for (j = 0; j < nnst * 2; j++) {
- for (k = 0; k < asize; k++) {
- const double q = j < nnst ? mean[k] : 0.0;
- s->weights1[i][j * asize + k] = (float)(bdataT[j * asize + k] - mean[asize + 1 + j] - q);
- }
- s->weights1[i][boff + j] = (float)(bdataT[boff + j] - (j < nnst ? mean[asize] : 0.0));
- }
- }
- av_free(mean);
- }
-
- s->nns = nns_table[s->nnsparam];
- s->xdia = xdia_table[s->nsize];
- s->ydia = ydia_table[s->nsize];
- s->asize = xdia_table[s->nsize] * ydia_table[s->nsize];
-
- s->max_value = 65535 >> 8;
-
- select_functions(s);
-
- s->fdsp = avpriv_float_dsp_alloc(0);
- if (!s->fdsp)
- ret = AVERROR(ENOMEM);
-
-fail:
- av_free(bdata);
- return ret;
-}
-
-static av_cold void uninit(AVFilterContext *ctx)
-{
- NNEDIContext *s = ctx->priv;
- int i;
-
- av_freep(&s->weights0);
-
- for (i = 0; i < 2; i++)
- av_freep(&s->weights1[i]);
-
- for (i = 0; i < s->nb_planes; i++) {
- av_freep(&s->frame_data.paddedp[i]);
- av_freep(&s->frame_data.lcount[i]);
- }
-
- av_freep(&s->frame_data.input);
- av_freep(&s->frame_data.temp);
- av_freep(&s->fdsp);
- av_frame_free(&s->second);
-}
-
-static const AVFilterPad inputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- .filter_frame = filter_frame,
- .config_props = config_input,
- },
- { NULL }
-};
-
-static const AVFilterPad outputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- .config_props = config_output,
- .request_frame = request_frame,
- },
- { NULL }
-};
-
-AVFilter ff_vf_nnedi = {
- .name = "nnedi",
- .description = NULL_IF_CONFIG_SMALL("Apply neural network edge directed interpolation intra-only deinterlacer."),
- .priv_size = sizeof(NNEDIContext),
- .priv_class = &nnedi_class,
- .init = init,
- .uninit = uninit,
- .query_formats = query_formats,
- .inputs = inputs,
- .outputs = outputs,
- .flags = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL,
-};
diff --git a/libavfilter/vf_owdenoise.c b/libavfilter/vf_owdenoise.c
deleted file mode 100644
index 6d6c2a3..0000000
--- a/libavfilter/vf_owdenoise.c
+++ /dev/null
@@ -1,377 +0,0 @@
-/*
- * Copyright (c) 2007 Michael Niedermayer <michaelni@gmx.at>
- * Copyright (c) 2013 Clément Bœsch <u pkh me>
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/**
- * @todo try to change to int
- * @todo try lifting based implementation
- * @todo optimize optimize optimize
- * @todo hard thresholding
- * @todo use QP to decide filter strength
- * @todo wavelet normalization / least squares optimal signal vs. noise thresholds
- */
-
-#include "libavutil/imgutils.h"
-#include "libavutil/opt.h"
-#include "libavutil/pixdesc.h"
-#include "avfilter.h"
-#include "internal.h"
-
-typedef struct OWDenoiseContext {
- const AVClass *class;
- double luma_strength;
- double chroma_strength;
- int depth;
- float *plane[16+1][4];
- int linesize;
- int hsub, vsub;
- int pixel_depth;
-} OWDenoiseContext;
-
-#define OFFSET(x) offsetof(OWDenoiseContext, x)
-#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
-static const AVOption owdenoise_options[] = {
- { "depth", "set depth", OFFSET(depth), AV_OPT_TYPE_INT, {.i64 = 8}, 8, 16, FLAGS },
- { "luma_strength", "set luma strength", OFFSET(luma_strength), AV_OPT_TYPE_DOUBLE, {.dbl = 1.0}, 0, 1000, FLAGS },
- { "ls", "set luma strength", OFFSET(luma_strength), AV_OPT_TYPE_DOUBLE, {.dbl = 1.0}, 0, 1000, FLAGS },
- { "chroma_strength", "set chroma strength", OFFSET(chroma_strength), AV_OPT_TYPE_DOUBLE, {.dbl = 1.0}, 0, 1000, FLAGS },
- { "cs", "set chroma strength", OFFSET(chroma_strength), AV_OPT_TYPE_DOUBLE, {.dbl = 1.0}, 0, 1000, FLAGS },
- { NULL }
-};
-
-AVFILTER_DEFINE_CLASS(owdenoise);
-
-DECLARE_ALIGNED(8, static const uint8_t, dither)[8][8] = {
- { 0, 48, 12, 60, 3, 51, 15, 63 },
- { 32, 16, 44, 28, 35, 19, 47, 31 },
- { 8, 56, 4, 52, 11, 59, 7, 55 },
- { 40, 24, 36, 20, 43, 27, 39, 23 },
- { 2, 50, 14, 62, 1, 49, 13, 61 },
- { 34, 18, 46, 30, 33, 17, 45, 29 },
- { 10, 58, 6, 54, 9, 57, 5, 53 },
- { 42, 26, 38, 22, 41, 25, 37, 21 },
-};
-
-static const double coeff[2][5] = {
- {
- 0.6029490182363579 * M_SQRT2,
- 0.2668641184428723 * M_SQRT2,
- -0.07822326652898785 * M_SQRT2,
- -0.01686411844287495 * M_SQRT2,
- 0.02674875741080976 * M_SQRT2,
- },{
- 1.115087052456994 / M_SQRT2,
- -0.5912717631142470 / M_SQRT2,
- -0.05754352622849957 / M_SQRT2,
- 0.09127176311424948 / M_SQRT2,
- }
-};
-
-static const double icoeff[2][5] = {
- {
- 1.115087052456994 / M_SQRT2,
- 0.5912717631142470 / M_SQRT2,
- -0.05754352622849957 / M_SQRT2,
- -0.09127176311424948 / M_SQRT2,
- },{
- 0.6029490182363579 * M_SQRT2,
- -0.2668641184428723 * M_SQRT2,
- -0.07822326652898785 * M_SQRT2,
- 0.01686411844287495 * M_SQRT2,
- 0.02674875741080976 * M_SQRT2,
- }
-};
-
-
-static inline void decompose(float *dst_l, float *dst_h, const float *src,
- int linesize, int w)
-{
- int x, i;
- for (x = 0; x < w; x++) {
- double sum_l = src[x * linesize] * coeff[0][0];
- double sum_h = src[x * linesize] * coeff[1][0];
- for (i = 1; i <= 4; i++) {
- const double s = src[avpriv_mirror(x - i, w - 1) * linesize]
- + src[avpriv_mirror(x + i, w - 1) * linesize];
-
- sum_l += coeff[0][i] * s;
- sum_h += coeff[1][i] * s;
- }
- dst_l[x * linesize] = sum_l;
- dst_h[x * linesize] = sum_h;
- }
-}
-
-static inline void compose(float *dst, const float *src_l, const float *src_h,
- int linesize, int w)
-{
- int x, i;
- for (x = 0; x < w; x++) {
- double sum_l = src_l[x * linesize] * icoeff[0][0];
- double sum_h = src_h[x * linesize] * icoeff[1][0];
- for (i = 1; i <= 4; i++) {
- const int x0 = avpriv_mirror(x - i, w - 1) * linesize;
- const int x1 = avpriv_mirror(x + i, w - 1) * linesize;
-
- sum_l += icoeff[0][i] * (src_l[x0] + src_l[x1]);
- sum_h += icoeff[1][i] * (src_h[x0] + src_h[x1]);
- }
- dst[x * linesize] = (sum_l + sum_h) * 0.5;
- }
-}
-
-static inline void decompose2D(float *dst_l, float *dst_h, const float *src,
- int xlinesize, int ylinesize,
- int step, int w, int h)
-{
- int y, x;
- for (y = 0; y < h; y++)
- for (x = 0; x < step; x++)
- decompose(dst_l + ylinesize*y + xlinesize*x,
- dst_h + ylinesize*y + xlinesize*x,
- src + ylinesize*y + xlinesize*x,
- step * xlinesize, (w - x + step - 1) / step);
-}
-
-static inline void compose2D(float *dst, const float *src_l, const float *src_h,
- int xlinesize, int ylinesize,
- int step, int w, int h)
-{
- int y, x;
- for (y = 0; y < h; y++)
- for (x = 0; x < step; x++)
- compose(dst + ylinesize*y + xlinesize*x,
- src_l + ylinesize*y + xlinesize*x,
- src_h + ylinesize*y + xlinesize*x,
- step * xlinesize, (w - x + step - 1) / step);
-}
-
-static void decompose2D2(float *dst[4], float *src, float *temp[2],
- int linesize, int step, int w, int h)
-{
- decompose2D(temp[0], temp[1], src, 1, linesize, step, w, h);
- decompose2D( dst[0], dst[1], temp[0], linesize, 1, step, h, w);
- decompose2D( dst[2], dst[3], temp[1], linesize, 1, step, h, w);
-}
-
-static void compose2D2(float *dst, float *src[4], float *temp[2],
- int linesize, int step, int w, int h)
-{
- compose2D(temp[0], src[0], src[1], linesize, 1, step, h, w);
- compose2D(temp[1], src[2], src[3], linesize, 1, step, h, w);
- compose2D(dst, temp[0], temp[1], 1, linesize, step, w, h);
-}
-
-static void filter(OWDenoiseContext *s,
- uint8_t *dst, int dst_linesize,
- const uint8_t *src, int src_linesize,
- int width, int height, double strength)
-{
- int x, y, i, j, depth = s->depth;
-
- while (1<<depth > width || 1<<depth > height)
- depth--;
-
- if (s->pixel_depth <= 8) {
- for (y = 0; y < height; y++)
- for(x = 0; x < width; x++)
- s->plane[0][0][y*s->linesize + x] = src[y*src_linesize + x];
- } else {
- const uint16_t *src16 = (const uint16_t *)src;
-
- src_linesize /= 2;
- for (y = 0; y < height; y++)
- for(x = 0; x < width; x++)
- s->plane[0][0][y*s->linesize + x] = src16[y*src_linesize + x];
- }
-
- for (i = 0; i < depth; i++)
- decompose2D2(s->plane[i + 1], s->plane[i][0], s->plane[0] + 1, s->linesize, 1<<i, width, height);
-
- for (i = 0; i < depth; i++) {
- for (j = 1; j < 4; j++) {
- for (y = 0; y < height; y++) {
- for (x = 0; x < width; x++) {
- double v = s->plane[i + 1][j][y*s->linesize + x];
- if (v > strength) v -= strength;
- else if (v < -strength) v += strength;
- else v = 0;
- s->plane[i + 1][j][x + y*s->linesize] = v;
- }
- }
- }
- }
- for (i = depth-1; i >= 0; i--)
- compose2D2(s->plane[i][0], s->plane[i + 1], s->plane[0] + 1, s->linesize, 1<<i, width, height);
-
- if (s->pixel_depth <= 8) {
- for (y = 0; y < height; y++) {
- for (x = 0; x < width; x++) {
- i = s->plane[0][0][y*s->linesize + x] + dither[x&7][y&7]*(1.0/64) + 1.0/128; // yes the rounding is insane but optimal :)
- if ((unsigned)i > 255U) i = ~(i >> 31);
- dst[y*dst_linesize + x] = i;
- }
- }
- } else {
- uint16_t *dst16 = (uint16_t *)dst;
-
- dst_linesize /= 2;
- for (y = 0; y < height; y++) {
- for (x = 0; x < width; x++) {
- i = s->plane[0][0][y*s->linesize + x];
- dst16[y*dst_linesize + x] = i;
- }
- }
- }
-}
-
-static int filter_frame(AVFilterLink *inlink, AVFrame *in)
-{
- AVFilterContext *ctx = inlink->dst;
- OWDenoiseContext *s = ctx->priv;
- AVFilterLink *outlink = ctx->outputs[0];
- AVFrame *out;
- const int cw = AV_CEIL_RSHIFT(inlink->w, s->hsub);
- const int ch = AV_CEIL_RSHIFT(inlink->h, s->vsub);
-
- if (av_frame_is_writable(in)) {
- out = in;
-
- if (s->luma_strength > 0)
- filter(s, out->data[0], out->linesize[0], in->data[0], in->linesize[0], inlink->w, inlink->h, s->luma_strength);
- if (s->chroma_strength > 0) {
- filter(s, out->data[1], out->linesize[1], in->data[1], in->linesize[1], cw, ch, s->chroma_strength);
- filter(s, out->data[2], out->linesize[2], in->data[2], in->linesize[2], cw, ch, s->chroma_strength);
- }
- } else {
- out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
- if (!out) {
- av_frame_free(&in);
- return AVERROR(ENOMEM);
- }
- av_frame_copy_props(out, in);
-
- if (s->luma_strength > 0) {
- filter(s, out->data[0], out->linesize[0], in->data[0], in->linesize[0], inlink->w, inlink->h, s->luma_strength);
- } else {
- av_image_copy_plane(out->data[0], out->linesize[0], in ->data[0], in ->linesize[0], inlink->w, inlink->h);
- }
- if (s->chroma_strength > 0) {
- filter(s, out->data[1], out->linesize[1], in->data[1], in->linesize[1], cw, ch, s->chroma_strength);
- filter(s, out->data[2], out->linesize[2], in->data[2], in->linesize[2], cw, ch, s->chroma_strength);
- } else {
- av_image_copy_plane(out->data[1], out->linesize[1], in ->data[1], in ->linesize[1], inlink->w, inlink->h);
- av_image_copy_plane(out->data[2], out->linesize[2], in ->data[2], in ->linesize[2], inlink->w, inlink->h);
- }
-
- if (in->data[3])
- av_image_copy_plane(out->data[3], out->linesize[3],
- in ->data[3], in ->linesize[3],
- inlink->w, inlink->h);
- av_frame_free(&in);
- }
-
- return ff_filter_frame(outlink, out);
-}
-
-static int query_formats(AVFilterContext *ctx)
-{
- static const enum AVPixelFormat pix_fmts[] = {
- AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV422P,
- AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV411P,
- AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV440P,
- AV_PIX_FMT_YUVA444P, AV_PIX_FMT_YUVA422P,
- AV_PIX_FMT_YUVA420P,
- AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV422P9, AV_PIX_FMT_YUV444P9,
- AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10,
- AV_PIX_FMT_YUV440P10,
- AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV420P12,
- AV_PIX_FMT_YUV440P12,
- AV_PIX_FMT_YUV444P14, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV420P14,
- AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16,
- AV_PIX_FMT_NONE
- };
- AVFilterFormats *fmts_list = ff_make_format_list(pix_fmts);
- if (!fmts_list)
- return AVERROR(ENOMEM);
- return ff_set_common_formats(ctx, fmts_list);
-}
-
-static int config_input(AVFilterLink *inlink)
-{
- int i, j;
- OWDenoiseContext *s = inlink->dst->priv;
- const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
- const int h = FFALIGN(inlink->h, 16);
-
- s->hsub = desc->log2_chroma_w;
- s->vsub = desc->log2_chroma_h;
- s->pixel_depth = desc->comp[0].depth;
-
- s->linesize = FFALIGN(inlink->w, 16);
- for (j = 0; j < 4; j++) {
- for (i = 0; i <= s->depth; i++) {
- s->plane[i][j] = av_malloc_array(s->linesize, h * sizeof(s->plane[0][0][0]));
- if (!s->plane[i][j])
- return AVERROR(ENOMEM);
- }
- }
- return 0;
-}
-
-static av_cold void uninit(AVFilterContext *ctx)
-{
- int i, j;
- OWDenoiseContext *s = ctx->priv;
-
- for (j = 0; j < 4; j++)
- for (i = 0; i <= s->depth; i++)
- av_freep(&s->plane[i][j]);
-}
-
-static const AVFilterPad owdenoise_inputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- .filter_frame = filter_frame,
- .config_props = config_input,
- },
- { NULL }
-};
-
-static const AVFilterPad owdenoise_outputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- },
- { NULL }
-};
-
-AVFilter ff_vf_owdenoise = {
- .name = "owdenoise",
- .description = NULL_IF_CONFIG_SMALL("Denoise using wavelets."),
- .priv_size = sizeof(OWDenoiseContext),
- .uninit = uninit,
- .query_formats = query_formats,
- .inputs = owdenoise_inputs,
- .outputs = owdenoise_outputs,
- .priv_class = &owdenoise_class,
- .flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
-};
diff --git a/libavfilter/vf_perspective.c b/libavfilter/vf_perspective.c
deleted file mode 100644
index 9249509..0000000
--- a/libavfilter/vf_perspective.c
+++ /dev/null
@@ -1,525 +0,0 @@
-/*
- * Copyright (c) 2002 Michael Niedermayer <michaelni@gmx.at>
- * Copyright (c) 2013 Paul B Mahol
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#include "libavutil/avassert.h"
-#include "libavutil/eval.h"
-#include "libavutil/imgutils.h"
-#include "libavutil/pixdesc.h"
-#include "libavutil/opt.h"
-#include "avfilter.h"
-#include "formats.h"
-#include "internal.h"
-#include "video.h"
-
-#define SUB_PIXEL_BITS 8
-#define SUB_PIXELS (1 << SUB_PIXEL_BITS)
-#define COEFF_BITS 11
-
-#define LINEAR 0
-#define CUBIC 1
-
-typedef struct PerspectiveContext {
- const AVClass *class;
- char *expr_str[4][2];
- double ref[4][2];
- int32_t (*pv)[2];
- int32_t coeff[SUB_PIXELS][4];
- int interpolation;
- int linesize[4];
- int height[4];
- int hsub, vsub;
- int nb_planes;
- int sense;
- int eval_mode;
-
- int (*perspective)(AVFilterContext *ctx,
- void *arg, int job, int nb_jobs);
-} PerspectiveContext;
-
-#define OFFSET(x) offsetof(PerspectiveContext, x)
-#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
-
-enum PERSPECTIVESense {
- PERSPECTIVE_SENSE_SOURCE = 0, ///< coordinates give locations in source of corners of destination.
- PERSPECTIVE_SENSE_DESTINATION = 1, ///< coordinates give locations in destination of corners of source.
-};
-
-enum EvalMode {
- EVAL_MODE_INIT,
- EVAL_MODE_FRAME,
- EVAL_MODE_NB
-};
-
-static const AVOption perspective_options[] = {
- { "x0", "set top left x coordinate", OFFSET(expr_str[0][0]), AV_OPT_TYPE_STRING, {.str="0"}, 0, 0, FLAGS },
- { "y0", "set top left y coordinate", OFFSET(expr_str[0][1]), AV_OPT_TYPE_STRING, {.str="0"}, 0, 0, FLAGS },
- { "x1", "set top right x coordinate", OFFSET(expr_str[1][0]), AV_OPT_TYPE_STRING, {.str="W"}, 0, 0, FLAGS },
- { "y1", "set top right y coordinate", OFFSET(expr_str[1][1]), AV_OPT_TYPE_STRING, {.str="0"}, 0, 0, FLAGS },
- { "x2", "set bottom left x coordinate", OFFSET(expr_str[2][0]), AV_OPT_TYPE_STRING, {.str="0"}, 0, 0, FLAGS },
- { "y2", "set bottom left y coordinate", OFFSET(expr_str[2][1]), AV_OPT_TYPE_STRING, {.str="H"}, 0, 0, FLAGS },
- { "x3", "set bottom right x coordinate", OFFSET(expr_str[3][0]), AV_OPT_TYPE_STRING, {.str="W"}, 0, 0, FLAGS },
- { "y3", "set bottom right y coordinate", OFFSET(expr_str[3][1]), AV_OPT_TYPE_STRING, {.str="H"}, 0, 0, FLAGS },
- { "interpolation", "set interpolation", OFFSET(interpolation), AV_OPT_TYPE_INT, {.i64=LINEAR}, 0, 1, FLAGS, "interpolation" },
- { "linear", "", 0, AV_OPT_TYPE_CONST, {.i64=LINEAR}, 0, 0, FLAGS, "interpolation" },
- { "cubic", "", 0, AV_OPT_TYPE_CONST, {.i64=CUBIC}, 0, 0, FLAGS, "interpolation" },
- { "sense", "specify the sense of the coordinates", OFFSET(sense), AV_OPT_TYPE_INT, {.i64=PERSPECTIVE_SENSE_SOURCE}, 0, 1, FLAGS, "sense"},
- { "source", "specify locations in source to send to corners in destination",
- 0, AV_OPT_TYPE_CONST, {.i64=PERSPECTIVE_SENSE_SOURCE}, 0, 0, FLAGS, "sense"},
- { "destination", "specify locations in destination to send corners of source",
- 0, AV_OPT_TYPE_CONST, {.i64=PERSPECTIVE_SENSE_DESTINATION}, 0, 0, FLAGS, "sense"},
- { "eval", "specify when to evaluate expressions", OFFSET(eval_mode), AV_OPT_TYPE_INT, {.i64 = EVAL_MODE_INIT}, 0, EVAL_MODE_NB-1, FLAGS, "eval" },
- { "init", "eval expressions once during initialization", 0, AV_OPT_TYPE_CONST, {.i64=EVAL_MODE_INIT}, .flags = FLAGS, .unit = "eval" },
- { "frame", "eval expressions per-frame", 0, AV_OPT_TYPE_CONST, {.i64=EVAL_MODE_FRAME}, .flags = FLAGS, .unit = "eval" },
-
- { NULL }
-};
-
-AVFILTER_DEFINE_CLASS(perspective);
-
-static int query_formats(AVFilterContext *ctx)
-{
- static const enum AVPixelFormat pix_fmts[] = {
- AV_PIX_FMT_YUVA444P, AV_PIX_FMT_YUVA422P, AV_PIX_FMT_YUVA420P,
- AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUVJ440P, AV_PIX_FMT_YUVJ422P,AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ411P,
- AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV440P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV411P, AV_PIX_FMT_YUV410P,
- AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRAP, AV_PIX_FMT_GRAY8, AV_PIX_FMT_NONE
- };
-
- AVFilterFormats *fmts_list = ff_make_format_list(pix_fmts);
- if (!fmts_list)
- return AVERROR(ENOMEM);
- return ff_set_common_formats(ctx, fmts_list);
-}
-
-static inline double get_coeff(double d)
-{
- double coeff, A = -0.60;
-
- d = fabs(d);
-
- if (d < 1.0)
- coeff = (1.0 - (A + 3.0) * d * d + (A + 2.0) * d * d * d);
- else if (d < 2.0)
- coeff = (-4.0 * A + 8.0 * A * d - 5.0 * A * d * d + A * d * d * d);
- else
- coeff = 0.0;
-
- return coeff;
-}
-
-static const char *const var_names[] = { "W", "H", "in", "on", NULL };
-enum { VAR_W, VAR_H, VAR_IN, VAR_ON, VAR_VARS_NB };
-
-static int calc_persp_luts(AVFilterContext *ctx, AVFilterLink *inlink)
-{
- PerspectiveContext *s = ctx->priv;
- AVFilterLink *outlink = ctx->outputs[0];
- double (*ref)[2] = s->ref;
-
- double values[VAR_VARS_NB] = { [VAR_W] = inlink->w, [VAR_H] = inlink->h,
- [VAR_IN] = inlink->frame_count_out + 1,
- [VAR_ON] = outlink->frame_count_in + 1 };
- const int h = values[VAR_H];
- const int w = values[VAR_W];
- double x0, x1, x2, x3, x4, x5, x6, x7, x8, q;
- double t0, t1, t2, t3;
- int x, y, i, j, ret;
-
- for (i = 0; i < 4; i++) {
- for (j = 0; j < 2; j++) {
- if (!s->expr_str[i][j])
- return AVERROR(EINVAL);
- ret = av_expr_parse_and_eval(&s->ref[i][j], s->expr_str[i][j],
- var_names, &values[0],
- NULL, NULL, NULL, NULL,
- 0, 0, ctx);
- if (ret < 0)
- return ret;
- }
- }
-
- switch (s->sense) {
- case PERSPECTIVE_SENSE_SOURCE:
- x6 = ((ref[0][0] - ref[1][0] - ref[2][0] + ref[3][0]) *
- (ref[2][1] - ref[3][1]) -
- ( ref[0][1] - ref[1][1] - ref[2][1] + ref[3][1]) *
- (ref[2][0] - ref[3][0])) * h;
- x7 = ((ref[0][1] - ref[1][1] - ref[2][1] + ref[3][1]) *
- (ref[1][0] - ref[3][0]) -
- ( ref[0][0] - ref[1][0] - ref[2][0] + ref[3][0]) *
- (ref[1][1] - ref[3][1])) * w;
- q = ( ref[1][0] - ref[3][0]) * (ref[2][1] - ref[3][1]) -
- ( ref[2][0] - ref[3][0]) * (ref[1][1] - ref[3][1]);
-
- x0 = q * (ref[1][0] - ref[0][0]) * h + x6 * ref[1][0];
- x1 = q * (ref[2][0] - ref[0][0]) * w + x7 * ref[2][0];
- x2 = q * ref[0][0] * w * h;
- x3 = q * (ref[1][1] - ref[0][1]) * h + x6 * ref[1][1];
- x4 = q * (ref[2][1] - ref[0][1]) * w + x7 * ref[2][1];
- x5 = q * ref[0][1] * w * h;
- x8 = q * w * h;
- break;
- case PERSPECTIVE_SENSE_DESTINATION:
- t0 = ref[0][0] * (ref[3][1] - ref[1][1]) +
- ref[1][0] * (ref[0][1] - ref[3][1]) +
- ref[3][0] * (ref[1][1] - ref[0][1]);
- t1 = ref[1][0] * (ref[2][1] - ref[3][1]) +
- ref[2][0] * (ref[3][1] - ref[1][1]) +
- ref[3][0] * (ref[1][1] - ref[2][1]);
- t2 = ref[0][0] * (ref[3][1] - ref[2][1]) +
- ref[2][0] * (ref[0][1] - ref[3][1]) +
- ref[3][0] * (ref[2][1] - ref[0][1]);
- t3 = ref[0][0] * (ref[1][1] - ref[2][1]) +
- ref[1][0] * (ref[2][1] - ref[0][1]) +
- ref[2][0] * (ref[0][1] - ref[1][1]);
-
- x0 = t0 * t1 * w * (ref[2][1] - ref[0][1]);
- x1 = t0 * t1 * w * (ref[0][0] - ref[2][0]);
- x2 = t0 * t1 * w * (ref[0][1] * ref[2][0] - ref[0][0] * ref[2][1]);
- x3 = t1 * t2 * h * (ref[1][1] - ref[0][1]);
- x4 = t1 * t2 * h * (ref[0][0] - ref[1][0]);
- x5 = t1 * t2 * h * (ref[0][1] * ref[1][0] - ref[0][0] * ref[1][1]);
- x6 = t1 * t2 * (ref[1][1] - ref[0][1]) +
- t0 * t3 * (ref[2][1] - ref[3][1]);
- x7 = t1 * t2 * (ref[0][0] - ref[1][0]) +
- t0 * t3 * (ref[3][0] - ref[2][0]);
- x8 = t1 * t2 * (ref[0][1] * ref[1][0] - ref[0][0] * ref[1][1]) +
- t0 * t3 * (ref[2][0] * ref[3][1] - ref[2][1] * ref[3][0]);
- break;
- default:
- av_assert0(0);
- }
-
- for (y = 0; y < h; y++){
- for (x = 0; x < w; x++){
- int u, v;
-
- u = lrint(SUB_PIXELS * (x0 * x + x1 * y + x2) /
- (x6 * x + x7 * y + x8));
- v = lrint(SUB_PIXELS * (x3 * x + x4 * y + x5) /
- (x6 * x + x7 * y + x8));
-
- s->pv[x + y * w][0] = u;
- s->pv[x + y * w][1] = v;
- }
- }
-
- return 0;
-}
-
-static int config_input(AVFilterLink *inlink)
-{
- AVFilterContext *ctx = inlink->dst;
- PerspectiveContext *s = ctx->priv;
- const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
- int h = inlink->h;
- int w = inlink->w;
- int i, j, ret;
- s->hsub = desc->log2_chroma_w;
- s->vsub = desc->log2_chroma_h;
- s->nb_planes = av_pix_fmt_count_planes(inlink->format);
- if ((ret = av_image_fill_linesizes(s->linesize, inlink->format, inlink->w)) < 0)
- return ret;
-
- s->height[1] = s->height[2] = AV_CEIL_RSHIFT(inlink->h, desc->log2_chroma_h);
- s->height[0] = s->height[3] = inlink->h;
-
- s->pv = av_realloc_f(s->pv, w * h, 2 * sizeof(*s->pv));
- if (!s->pv)
- return AVERROR(ENOMEM);
-
- if (s->eval_mode == EVAL_MODE_INIT) {
- if ((ret = calc_persp_luts(ctx, inlink)) < 0) {
- return ret;
- }
- }
-
- for (i = 0; i < SUB_PIXELS; i++){
- double d = i / (double)SUB_PIXELS;
- double temp[4];
- double sum = 0;
-
- for (j = 0; j < 4; j++)
- temp[j] = get_coeff(j - d - 1);
-
- for (j = 0; j < 4; j++)
- sum += temp[j];
-
- for (j = 0; j < 4; j++)
- s->coeff[i][j] = lrint((1 << COEFF_BITS) * temp[j] / sum);
- }
-
- return 0;
-}
-
-typedef struct ThreadData {
- uint8_t *dst;
- int dst_linesize;
- uint8_t *src;
- int src_linesize;
- int w, h;
- int hsub, vsub;
-} ThreadData;
-
-static int resample_cubic(AVFilterContext *ctx, void *arg,
- int job, int nb_jobs)
-{
- PerspectiveContext *s = ctx->priv;
- ThreadData *td = arg;
- uint8_t *dst = td->dst;
- int dst_linesize = td->dst_linesize;
- uint8_t *src = td->src;
- int src_linesize = td->src_linesize;
- int w = td->w;
- int h = td->h;
- int hsub = td->hsub;
- int vsub = td->vsub;
- int start = (h * job) / nb_jobs;
- int end = (h * (job+1)) / nb_jobs;
- const int linesize = s->linesize[0];
- int x, y;
-
- for (y = start; y < end; y++) {
- int sy = y << vsub;
- for (x = 0; x < w; x++) {
- int u, v, subU, subV, sum, sx;
-
- sx = x << hsub;
- u = s->pv[sx + sy * linesize][0] >> hsub;
- v = s->pv[sx + sy * linesize][1] >> vsub;
- subU = u & (SUB_PIXELS - 1);
- subV = v & (SUB_PIXELS - 1);
- u >>= SUB_PIXEL_BITS;
- v >>= SUB_PIXEL_BITS;
-
- if (u > 0 && v > 0 && u < w - 2 && v < h - 2){
- const int index = u + v*src_linesize;
- const int a = s->coeff[subU][0];
- const int b = s->coeff[subU][1];
- const int c = s->coeff[subU][2];
- const int d = s->coeff[subU][3];
-
- sum = s->coeff[subV][0] * (a * src[index - 1 - src_linesize] + b * src[index - 0 - src_linesize] +
- c * src[index + 1 - src_linesize] + d * src[index + 2 - src_linesize]) +
- s->coeff[subV][1] * (a * src[index - 1 ] + b * src[index - 0 ] +
- c * src[index + 1 ] + d * src[index + 2 ]) +
- s->coeff[subV][2] * (a * src[index - 1 + src_linesize] + b * src[index - 0 + src_linesize] +
- c * src[index + 1 + src_linesize] + d * src[index + 2 + src_linesize]) +
- s->coeff[subV][3] * (a * src[index - 1 + 2 * src_linesize] + b * src[index - 0 + 2 * src_linesize] +
- c * src[index + 1 + 2 * src_linesize] + d * src[index + 2 + 2 * src_linesize]);
- } else {
- int dx, dy;
-
- sum = 0;
-
- for (dy = 0; dy < 4; dy++) {
- int iy = v + dy - 1;
-
- if (iy < 0)
- iy = 0;
- else if (iy >= h)
- iy = h-1;
- for (dx = 0; dx < 4; dx++) {
- int ix = u + dx - 1;
-
- if (ix < 0)
- ix = 0;
- else if (ix >= w)
- ix = w - 1;
-
- sum += s->coeff[subU][dx] * s->coeff[subV][dy] * src[ ix + iy * src_linesize];
- }
- }
- }
-
- sum = (sum + (1<<(COEFF_BITS * 2 - 1))) >> (COEFF_BITS * 2);
- sum = av_clip_uint8(sum);
- dst[x + y * dst_linesize] = sum;
- }
- }
- return 0;
-}
-
-static int resample_linear(AVFilterContext *ctx, void *arg,
- int job, int nb_jobs)
-{
- PerspectiveContext *s = ctx->priv;
- ThreadData *td = arg;
- uint8_t *dst = td->dst;
- int dst_linesize = td->dst_linesize;
- uint8_t *src = td->src;
- int src_linesize = td->src_linesize;
- int w = td->w;
- int h = td->h;
- int hsub = td->hsub;
- int vsub = td->vsub;
- int start = (h * job) / nb_jobs;
- int end = (h * (job+1)) / nb_jobs;
- const int linesize = s->linesize[0];
- int x, y;
-
- for (y = start; y < end; y++){
- int sy = y << vsub;
- for (x = 0; x < w; x++){
- int u, v, subU, subV, sum, sx, index, subUI, subVI;
-
- sx = x << hsub;
- u = s->pv[sx + sy * linesize][0] >> hsub;
- v = s->pv[sx + sy * linesize][1] >> vsub;
- subU = u & (SUB_PIXELS - 1);
- subV = v & (SUB_PIXELS - 1);
- u >>= SUB_PIXEL_BITS;
- v >>= SUB_PIXEL_BITS;
-
- index = u + v * src_linesize;
- subUI = SUB_PIXELS - subU;
- subVI = SUB_PIXELS - subV;
-
- if ((unsigned)u < (unsigned)(w - 1)){
- if((unsigned)v < (unsigned)(h - 1)){
- sum = subVI * (subUI * src[index] + subU * src[index + 1]) +
- subV * (subUI * src[index + src_linesize] + subU * src[index + src_linesize + 1]);
- sum = (sum + (1 << (SUB_PIXEL_BITS * 2 - 1)))>> (SUB_PIXEL_BITS * 2);
- } else {
- if (v < 0)
- v = 0;
- else
- v = h - 1;
- index = u + v * src_linesize;
- sum = subUI * src[index] + subU * src[index + 1];
- sum = (sum + (1 << (SUB_PIXEL_BITS - 1))) >> SUB_PIXEL_BITS;
- }
- } else {
- if (u < 0)
- u = 0;
- else
- u = w - 1;
- if ((unsigned)v < (unsigned)(h - 1)){
- index = u + v * src_linesize;
- sum = subVI * src[index] + subV * src[index + src_linesize];
- sum = (sum + (1 << (SUB_PIXEL_BITS - 1))) >> SUB_PIXEL_BITS;
- } else {
- if (v < 0)
- v = 0;
- else
- v = h - 1;
- index = u + v * src_linesize;
- sum = src[index];
- }
- }
-
- sum = av_clip_uint8(sum);
- dst[x + y * dst_linesize] = sum;
- }
- }
- return 0;
-}
-
-static av_cold int init(AVFilterContext *ctx)
-{
- PerspectiveContext *s = ctx->priv;
-
- switch (s->interpolation) {
- case LINEAR: s->perspective = resample_linear; break;
- case CUBIC: s->perspective = resample_cubic; break;
- }
-
- return 0;
-}
-
-static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
-{
- AVFilterContext *ctx = inlink->dst;
- AVFilterLink *outlink = ctx->outputs[0];
- PerspectiveContext *s = ctx->priv;
- AVFrame *out;
- int plane;
- int ret;
-
- out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
- if (!out) {
- av_frame_free(&frame);
- return AVERROR(ENOMEM);
- }
- av_frame_copy_props(out, frame);
-
- if (s->eval_mode == EVAL_MODE_FRAME) {
- if ((ret = calc_persp_luts(ctx, inlink)) < 0) {
- av_frame_free(&out);
- return ret;
- }
- }
-
- for (plane = 0; plane < s->nb_planes; plane++) {
- int hsub = plane == 1 || plane == 2 ? s->hsub : 0;
- int vsub = plane == 1 || plane == 2 ? s->vsub : 0;
- ThreadData td = {.dst = out->data[plane],
- .dst_linesize = out->linesize[plane],
- .src = frame->data[plane],
- .src_linesize = frame->linesize[plane],
- .w = s->linesize[plane],
- .h = s->height[plane],
- .hsub = hsub,
- .vsub = vsub };
- ctx->internal->execute(ctx, s->perspective, &td, NULL, FFMIN(td.h, ff_filter_get_nb_threads(ctx)));
- }
-
- av_frame_free(&frame);
- return ff_filter_frame(outlink, out);
-}
-
-static av_cold void uninit(AVFilterContext *ctx)
-{
- PerspectiveContext *s = ctx->priv;
-
- av_freep(&s->pv);
-}
-
-static const AVFilterPad perspective_inputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- .filter_frame = filter_frame,
- .config_props = config_input,
- },
- { NULL }
-};
-
-static const AVFilterPad perspective_outputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- },
- { NULL }
-};
-
-AVFilter ff_vf_perspective = {
- .name = "perspective",
- .description = NULL_IF_CONFIG_SMALL("Correct the perspective of video."),
- .priv_size = sizeof(PerspectiveContext),
- .init = init,
- .uninit = uninit,
- .query_formats = query_formats,
- .inputs = perspective_inputs,
- .outputs = perspective_outputs,
- .priv_class = &perspective_class,
- .flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC | AVFILTER_FLAG_SLICE_THREADS,
-};
diff --git a/libavfilter/vf_phase.c b/libavfilter/vf_phase.c
deleted file mode 100644
index 8536444..0000000
--- a/libavfilter/vf_phase.c
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- * Copyright (c) 2004 Ville Saari
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#include "libavutil/avassert.h"
-#include "libavutil/imgutils.h"
-#include "libavutil/pixdesc.h"
-#include "libavutil/opt.h"
-#include "avfilter.h"
-#include "formats.h"
-#include "internal.h"
-#include "video.h"
-
-enum PhaseMode {
- PROGRESSIVE,
- TOP_FIRST,
- BOTTOM_FIRST,
- TOP_FIRST_ANALYZE,
- BOTTOM_FIRST_ANALYZE,
- ANALYZE,
- FULL_ANALYZE,
- AUTO,
- AUTO_ANALYZE
-};
-
-#define DEPTH 8
-#include "phase_template.c"
-
-#undef DEPTH
-#define DEPTH 9
-#include "phase_template.c"
-
-#undef DEPTH
-#define DEPTH 10
-#include "phase_template.c"
-
-#undef DEPTH
-#define DEPTH 12
-#include "phase_template.c"
-
-#undef DEPTH
-#define DEPTH 14
-#include "phase_template.c"
-
-#undef DEPTH
-#define DEPTH 16
-#include "phase_template.c"
-
-typedef struct PhaseContext {
- const AVClass *class;
- int mode; ///<PhaseMode
- AVFrame *frame; /* previous frame */
- int nb_planes;
- int planeheight[4];
- int linesize[4];
-
- enum PhaseMode (*analyze_plane)(void *ctx, enum PhaseMode mode, AVFrame *old, AVFrame *new);
-} PhaseContext;
-
-#define OFFSET(x) offsetof(PhaseContext, x)
-#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
-#define CONST(name, help, val, unit) { name, help, 0, AV_OPT_TYPE_CONST, {.i64=val}, 0, 0, FLAGS, unit }
-
-static const AVOption phase_options[] = {
- { "mode", "set phase mode", OFFSET(mode), AV_OPT_TYPE_INT, {.i64=AUTO_ANALYZE}, PROGRESSIVE, AUTO_ANALYZE, FLAGS, "mode" },
- CONST("p", "progressive", PROGRESSIVE, "mode"),
- CONST("t", "top first", TOP_FIRST, "mode"),
- CONST("b", "bottom first", BOTTOM_FIRST, "mode"),
- CONST("T", "top first analyze", TOP_FIRST_ANALYZE, "mode"),
- CONST("B", "bottom first analyze", BOTTOM_FIRST_ANALYZE, "mode"),
- CONST("u", "analyze", ANALYZE, "mode"),
- CONST("U", "full analyze", FULL_ANALYZE, "mode"),
- CONST("a", "auto", AUTO, "mode"),
- CONST("A", "auto analyze", AUTO_ANALYZE, "mode"),
- { NULL }
-};
-
-AVFILTER_DEFINE_CLASS(phase);
-
-static int query_formats(AVFilterContext *ctx)
-{
- static const enum AVPixelFormat pix_fmts[] = {
- AV_PIX_FMT_GRAY8,
- AV_PIX_FMT_GRAY9,
- AV_PIX_FMT_GRAY10,
- AV_PIX_FMT_GRAY12,
- AV_PIX_FMT_GRAY14,
- AV_PIX_FMT_GRAY16,
- AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV411P,
- AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P,
- AV_PIX_FMT_YUV440P, AV_PIX_FMT_YUV444P,
- AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ422P,
- AV_PIX_FMT_YUVJ440P, AV_PIX_FMT_YUVJ444P,
- AV_PIX_FMT_YUVJ411P,
- AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV422P9, AV_PIX_FMT_YUV444P9,
- AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10,
- AV_PIX_FMT_YUV440P10,
- AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV420P12,
- AV_PIX_FMT_YUV440P12,
- AV_PIX_FMT_YUV444P14, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV420P14,
- AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16,
- AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10,
- AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP16,
- AV_PIX_FMT_YUVA420P, AV_PIX_FMT_YUVA422P, AV_PIX_FMT_YUVA444P,
- AV_PIX_FMT_YUVA444P9, AV_PIX_FMT_YUVA444P10, AV_PIX_FMT_YUVA444P12, AV_PIX_FMT_YUVA444P16,
- AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA422P12, AV_PIX_FMT_YUVA422P16,
- AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA420P16,
- AV_PIX_FMT_GBRAP, AV_PIX_FMT_GBRAP10, AV_PIX_FMT_GBRAP12, AV_PIX_FMT_GBRAP16,
- AV_PIX_FMT_NONE
- };
-
- AVFilterFormats *fmts_list = ff_make_format_list(pix_fmts);
- if (!fmts_list)
- return AVERROR(ENOMEM);
- return ff_set_common_formats(ctx, fmts_list);
-}
-
-static int config_input(AVFilterLink *inlink)
-{
- PhaseContext *s = inlink->dst->priv;
- const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
- int ret;
-
- switch (desc->comp[0].depth) {
- case 8: s->analyze_plane = analyze_plane_8; break;
- case 9: s->analyze_plane = analyze_plane_9; break;
- case 10: s->analyze_plane = analyze_plane_10; break;
- case 12: s->analyze_plane = analyze_plane_12; break;
- case 14: s->analyze_plane = analyze_plane_14; break;
- case 16: s->analyze_plane = analyze_plane_16; break;
- default: av_assert0(0);
- };
-
- if ((ret = av_image_fill_linesizes(s->linesize, inlink->format, inlink->w)) < 0)
- return ret;
-
- s->planeheight[1] = s->planeheight[2] = AV_CEIL_RSHIFT(inlink->h, desc->log2_chroma_h);
- s->planeheight[0] = s->planeheight[3] = inlink->h;
-
- s->nb_planes = av_pix_fmt_count_planes(inlink->format);
-
- return 0;
-}
-
-static int filter_frame(AVFilterLink *inlink, AVFrame *in)
-{
- AVFilterContext *ctx = inlink->dst;
- AVFilterLink *outlink = ctx->outputs[0];
- PhaseContext *s = ctx->priv;
- enum PhaseMode mode;
- int plane, top, y;
- AVFrame *out;
-
- if (ctx->is_disabled) {
- av_frame_free(&s->frame);
- /* we keep a reference to the previous frame so the filter can start
- * being useful as soon as it's not disabled, avoiding the 1-frame
- * delay. */
- s->frame = av_frame_clone(in);
- return ff_filter_frame(outlink, in);
- }
-
- out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
- if (!out) {
- av_frame_free(&in);
- return AVERROR(ENOMEM);
- }
- av_frame_copy_props(out, in);
-
- if (!s->frame) {
- s->frame = in;
- mode = PROGRESSIVE;
- } else {
- mode = s->analyze_plane(ctx, s->mode, s->frame, in);
- }
-
- for (plane = 0; plane < s->nb_planes; plane++) {
- const uint8_t *buf = s->frame->data[plane];
- const uint8_t *from = in->data[plane];
- uint8_t *to = out->data[plane];
-
- for (y = 0, top = 1; y < s->planeheight[plane]; y++, top ^= 1) {
- memcpy(to, mode == (top ? BOTTOM_FIRST : TOP_FIRST) ? buf : from, s->linesize[plane]);
-
- buf += s->frame->linesize[plane];
- from += in->linesize[plane];
- to += out->linesize[plane];
- }
- }
-
- if (in != s->frame)
- av_frame_free(&s->frame);
- s->frame = in;
- return ff_filter_frame(outlink, out);
-}
-
-static av_cold void uninit(AVFilterContext *ctx)
-{
- PhaseContext *s = ctx->priv;
-
- av_frame_free(&s->frame);
-}
-
-static const AVFilterPad phase_inputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- .filter_frame = filter_frame,
- .config_props = config_input,
- },
- { NULL }
-};
-
-static const AVFilterPad phase_outputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- },
- { NULL }
-};
-
-AVFilter ff_vf_phase = {
- .name = "phase",
- .description = NULL_IF_CONFIG_SMALL("Phase shift fields."),
- .priv_size = sizeof(PhaseContext),
- .priv_class = &phase_class,
- .uninit = uninit,
- .query_formats = query_formats,
- .inputs = phase_inputs,
- .outputs = phase_outputs,
- .flags = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL,
-};
diff --git a/libavfilter/vf_pp.c b/libavfilter/vf_pp.c
deleted file mode 100644
index 524ef1b..0000000
--- a/libavfilter/vf_pp.c
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * Copyright (c) 2002 A'rpi
- * Copyright (C) 2012 Clément Bœsch
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/**
- * @file
- * libpostproc filter, ported from MPlayer.
- */
-
-#include "libavutil/avassert.h"
-#include "libavutil/opt.h"
-#include "internal.h"
-
-#include "libpostproc/postprocess.h"
-
-typedef struct PPFilterContext {
- const AVClass *class;
- char *subfilters;
- int mode_id;
- pp_mode *modes[PP_QUALITY_MAX + 1];
- void *pp_ctx;
-} PPFilterContext;
-
-#define OFFSET(x) offsetof(PPFilterContext, x)
-#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
-static const AVOption pp_options[] = {
- { "subfilters", "set postprocess subfilters", OFFSET(subfilters), AV_OPT_TYPE_STRING, {.str="de"}, .flags = FLAGS },
- { NULL }
-};
-
-AVFILTER_DEFINE_CLASS(pp);
-
-static av_cold int pp_init(AVFilterContext *ctx)
-{
- int i;
- PPFilterContext *pp = ctx->priv;
-
- for (i = 0; i <= PP_QUALITY_MAX; i++) {
- pp->modes[i] = pp_get_mode_by_name_and_quality(pp->subfilters, i);
- if (!pp->modes[i])
- return AVERROR_EXTERNAL;
- }
- pp->mode_id = PP_QUALITY_MAX;
- return 0;
-}
-
-static int pp_process_command(AVFilterContext *ctx, const char *cmd, const char *args,
- char *res, int res_len, int flags)
-{
- PPFilterContext *pp = ctx->priv;
-
- if (!strcmp(cmd, "quality")) {
- pp->mode_id = av_clip(strtol(args, NULL, 10), 0, PP_QUALITY_MAX);
- return 0;
- }
- return AVERROR(ENOSYS);
-}
-
-static int pp_query_formats(AVFilterContext *ctx)
-{
- static const enum AVPixelFormat pix_fmts[] = {
- AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUVJ420P,
- AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUVJ422P,
- AV_PIX_FMT_YUV411P,
- AV_PIX_FMT_GBRP,
- AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUVJ444P,
- AV_PIX_FMT_YUV440P, AV_PIX_FMT_YUVJ440P,
- AV_PIX_FMT_GRAY8,
- AV_PIX_FMT_NONE
- };
-
- AVFilterFormats *fmts_list = ff_make_format_list(pix_fmts);
- if (!fmts_list)
- return AVERROR(ENOMEM);
- return ff_set_common_formats(ctx, fmts_list);
-}
-
-static int pp_config_props(AVFilterLink *inlink)
-{
- int flags = PP_CPU_CAPS_AUTO;
- PPFilterContext *pp = inlink->dst->priv;
-
- switch (inlink->format) {
- case AV_PIX_FMT_GRAY8:
- case AV_PIX_FMT_YUVJ420P:
- case AV_PIX_FMT_YUV420P: flags |= PP_FORMAT_420; break;
- case AV_PIX_FMT_YUVJ422P:
- case AV_PIX_FMT_YUV422P: flags |= PP_FORMAT_422; break;
- case AV_PIX_FMT_YUV411P: flags |= PP_FORMAT_411; break;
- case AV_PIX_FMT_GBRP:
- case AV_PIX_FMT_YUVJ444P:
- case AV_PIX_FMT_YUV444P: flags |= PP_FORMAT_444; break;
- case AV_PIX_FMT_YUVJ440P:
- case AV_PIX_FMT_YUV440P: flags |= PP_FORMAT_440; break;
- default: av_assert0(0);
- }
-
- pp->pp_ctx = pp_get_context(inlink->w, inlink->h, flags);
- if (!pp->pp_ctx)
- return AVERROR(ENOMEM);
- return 0;
-}
-
-static int pp_filter_frame(AVFilterLink *inlink, AVFrame *inbuf)
-{
- AVFilterContext *ctx = inlink->dst;
- PPFilterContext *pp = ctx->priv;
- AVFilterLink *outlink = ctx->outputs[0];
- const int aligned_w = FFALIGN(outlink->w, 8);
- const int aligned_h = FFALIGN(outlink->h, 8);
- AVFrame *outbuf;
- int qstride, qp_type;
- int8_t *qp_table ;
-
- outbuf = ff_get_video_buffer(outlink, aligned_w, aligned_h);
- if (!outbuf) {
- av_frame_free(&inbuf);
- return AVERROR(ENOMEM);
- }
- av_frame_copy_props(outbuf, inbuf);
- outbuf->width = inbuf->width;
- outbuf->height = inbuf->height;
- qp_table = av_frame_get_qp_table(inbuf, &qstride, &qp_type);
-
- pp_postprocess((const uint8_t **)inbuf->data, inbuf->linesize,
- outbuf->data, outbuf->linesize,
- aligned_w, outlink->h,
- qp_table,
- qstride,
- pp->modes[pp->mode_id],
- pp->pp_ctx,
- outbuf->pict_type | (qp_type ? PP_PICT_TYPE_QP2 : 0));
-
- av_frame_free(&inbuf);
- return ff_filter_frame(outlink, outbuf);
-}
-
-static av_cold void pp_uninit(AVFilterContext *ctx)
-{
- int i;
- PPFilterContext *pp = ctx->priv;
-
- for (i = 0; i <= PP_QUALITY_MAX; i++)
- pp_free_mode(pp->modes[i]);
- if (pp->pp_ctx)
- pp_free_context(pp->pp_ctx);
-}
-
-static const AVFilterPad pp_inputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- .config_props = pp_config_props,
- .filter_frame = pp_filter_frame,
- },
- { NULL }
-};
-
-static const AVFilterPad pp_outputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- },
- { NULL }
-};
-
-AVFilter ff_vf_pp = {
- .name = "pp",
- .description = NULL_IF_CONFIG_SMALL("Filter video using libpostproc."),
- .priv_size = sizeof(PPFilterContext),
- .init = pp_init,
- .uninit = pp_uninit,
- .query_formats = pp_query_formats,
- .inputs = pp_inputs,
- .outputs = pp_outputs,
- .process_command = pp_process_command,
- .priv_class = &pp_class,
- .flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
-};
diff --git a/libavfilter/vf_pp7.c b/libavfilter/vf_pp7.c
deleted file mode 100644
index 570a1c9..0000000
--- a/libavfilter/vf_pp7.c
+++ /dev/null
@@ -1,406 +0,0 @@
-/*
- * Copyright (c) 2005 Michael Niedermayer <michaelni@gmx.at>
- * Copyright (c) 2014 Arwa Arif <arwaarif1994@gmail.com>
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/**
- * @file
- * Postprocessing filter - 7
- *
- * Originally written by Michael Niedermayer for the MPlayer
- * project, and ported by Arwa Arif for FFmpeg.
- */
-
-#include "libavutil/avassert.h"
-#include "libavutil/imgutils.h"
-#include "libavutil/opt.h"
-#include "libavutil/pixdesc.h"
-#include "internal.h"
-#include "vf_pp7.h"
-
-enum mode {
- MODE_HARD,
- MODE_SOFT,
- MODE_MEDIUM
-};
-
-#define OFFSET(x) offsetof(PP7Context, x)
-#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
-static const AVOption pp7_options[] = {
- { "qp", "force a constant quantizer parameter", OFFSET(qp), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 64, FLAGS },
- { "mode", "set thresholding mode", OFFSET(mode), AV_OPT_TYPE_INT, {.i64 = MODE_MEDIUM}, 0, 2, FLAGS, "mode" },
- { "hard", "hard thresholding", 0, AV_OPT_TYPE_CONST, {.i64 = MODE_HARD}, INT_MIN, INT_MAX, FLAGS, "mode" },
- { "soft", "soft thresholding", 0, AV_OPT_TYPE_CONST, {.i64 = MODE_SOFT}, INT_MIN, INT_MAX, FLAGS, "mode" },
- { "medium", "medium thresholding", 0, AV_OPT_TYPE_CONST, {.i64 = MODE_MEDIUM}, INT_MIN, INT_MAX, FLAGS, "mode" },
- { NULL }
-};
-
-AVFILTER_DEFINE_CLASS(pp7);
-
-DECLARE_ALIGNED(8, static const uint8_t, dither)[8][8] = {
- { 0, 48, 12, 60, 3, 51, 15, 63, },
- { 32, 16, 44, 28, 35, 19, 47, 31, },
- { 8, 56, 4, 52, 11, 59, 7, 55, },
- { 40, 24, 36, 20, 43, 27, 39, 23, },
- { 2, 50, 14, 62, 1, 49, 13, 61, },
- { 34, 18, 46, 30, 33, 17, 45, 29, },
- { 10, 58, 6, 54, 9, 57, 5, 53, },
- { 42, 26, 38, 22, 41, 25, 37, 21, },
-};
-
-#define N0 4
-#define N1 5
-#define N2 10
-#define SN0 2
-#define SN1 2.2360679775
-#define SN2 3.16227766017
-#define N (1 << 16)
-
-static const int factor[16] = {
- N / (N0 * N0), N / (N0 * N1), N / (N0 * N0), N / (N0 * N2),
- N / (N1 * N0), N / (N1 * N1), N / (N1 * N0), N / (N1 * N2),
- N / (N0 * N0), N / (N0 * N1), N / (N0 * N0), N / (N0 * N2),
- N / (N2 * N0), N / (N2 * N1), N / (N2 * N0), N / (N2 * N2),
-};
-
-static void init_thres2(PP7Context *p)
-{
- int qp, i;
- int bias = 0; //FIXME
-
- for (qp = 0; qp < 99; qp++) {
- for (i = 0; i < 16; i++) {
- p->thres2[qp][i] = ((i&1) ? SN2 : SN0) * ((i&4) ? SN2 : SN0) * FFMAX(1, qp) * (1<<2) - 1 - bias;
- }
- }
-}
-
-static inline void dctA_c(int16_t *dst, uint8_t *src, int stride)
-{
- int i;
-
- for (i = 0; i < 4; i++) {
- int s0 = src[0 * stride] + src[6 * stride];
- int s1 = src[1 * stride] + src[5 * stride];
- int s2 = src[2 * stride] + src[4 * stride];
- int s3 = src[3 * stride];
- int s = s3 + s3;
- s3 = s - s0;
- s0 = s + s0;
- s = s2 + s1;
- s2 = s2 - s1;
- dst[0] = s0 + s;
- dst[2] = s0 - s;
- dst[1] = 2 * s3 + s2;
- dst[3] = s3 - 2 * s2;
- src++;
- dst += 4;
- }
-}
-
-static void dctB_c(int16_t *dst, int16_t *src)
-{
- int i;
-
- for (i = 0; i < 4; i++) {
- int s0 = src[0 * 4] + src[6 * 4];
- int s1 = src[1 * 4] + src[5 * 4];
- int s2 = src[2 * 4] + src[4 * 4];
- int s3 = src[3 * 4];
- int s = s3 + s3;
- s3 = s - s0;
- s0 = s + s0;
- s = s2 + s1;
- s2 = s2 - s1;
- dst[0 * 4] = s0 + s;
- dst[2 * 4] = s0 - s;
- dst[1 * 4] = 2 * s3 + s2;
- dst[3 * 4] = s3 - 2 * s2;
- src++;
- dst++;
- }
-}
-
-static int hardthresh_c(PP7Context *p, int16_t *src, int qp)
-{
- int i;
- int a;
-
- a = src[0] * factor[0];
- for (i = 1; i < 16; i++) {
- unsigned int threshold1 = p->thres2[qp][i];
- unsigned int threshold2 = threshold1 << 1;
- int level = src[i];
- if (((unsigned)(level + threshold1)) > threshold2)
- a += level * factor[i];
- }
- return (a + (1 << 11)) >> 12;
-}
-
-static int mediumthresh_c(PP7Context *p, int16_t *src, int qp)
-{
- int i;
- int a;
-
- a = src[0] * factor[0];
- for (i = 1; i < 16; i++) {
- unsigned int threshold1 = p->thres2[qp][i];
- unsigned int threshold2 = threshold1 << 1;
- int level = src[i];
- if (((unsigned)(level + threshold1)) > threshold2) {
- if (((unsigned)(level + 2 * threshold1)) > 2 * threshold2)
- a += level * factor[i];
- else {
- if (level > 0)
- a += 2 * (level - (int)threshold1) * factor[i];
- else
- a += 2 * (level + (int)threshold1) * factor[i];
- }
- }
- }
- return (a + (1 << 11)) >> 12;
-}
-
-static int softthresh_c(PP7Context *p, int16_t *src, int qp)
-{
- int i;
- int a;
-
- a = src[0] * factor[0];
- for (i = 1; i < 16; i++) {
- unsigned int threshold1 = p->thres2[qp][i];
- unsigned int threshold2 = threshold1 << 1;
- int level = src[i];
- if (((unsigned)(level + threshold1)) > threshold2) {
- if (level > 0)
- a += (level - (int)threshold1) * factor[i];
- else
- a += (level + (int)threshold1) * factor[i];
- }
- }
- return (a + (1 << 11)) >> 12;
-}
-
-static void filter(PP7Context *p, uint8_t *dst, uint8_t *src,
- int dst_stride, int src_stride,
- int width, int height,
- uint8_t *qp_store, int qp_stride, int is_luma)
-{
- int x, y;
- const int stride = is_luma ? p->temp_stride : ((width + 16 + 15) & (~15));
- uint8_t *p_src = p->src + 8 * stride;
- int16_t *block = (int16_t *)p->src;
- int16_t *temp = (int16_t *)(p->src + 32);
-
- if (!src || !dst) return;
- for (y = 0; y < height; y++) {
- int index = 8 + 8 * stride + y * stride;
- memcpy(p_src + index, src + y * src_stride, width);
- for (x = 0; x < 8; x++) {
- p_src[index - x - 1]= p_src[index + x ];
- p_src[index + width + x ]= p_src[index + width - x - 1];
- }
- }
- for (y = 0; y < 8; y++) {
- memcpy(p_src + ( 7 - y ) * stride, p_src + ( y + 8 ) * stride, stride);
- memcpy(p_src + (height + 8 + y) * stride, p_src + (height - y + 7) * stride, stride);
- }
- //FIXME (try edge emu)
-
- for (y = 0; y < height; y++) {
- for (x = -8; x < 0; x += 4) {
- const int index = x + y * stride + (8 - 3) * (1 + stride) + 8; //FIXME silly offset
- uint8_t *src = p_src + index;
- int16_t *tp = temp + 4 * x;
-
- dctA_c(tp + 4 * 8, src, stride);
- }
- for (x = 0; x < width; ) {
- const int qps = 3 + is_luma;
- int qp;
- int end = FFMIN(x + 8, width);
-
- if (p->qp)
- qp = p->qp;
- else {
- qp = qp_store[ (FFMIN(x, width - 1) >> qps) + (FFMIN(y, height - 1) >> qps) * qp_stride];
- qp = ff_norm_qscale(qp, p->qscale_type);
- }
- for (; x < end; x++) {
- const int index = x + y * stride + (8 - 3) * (1 + stride) + 8; //FIXME silly offset
- uint8_t *src = p_src + index;
- int16_t *tp = temp + 4 * x;
- int v;
-
- if ((x & 3) == 0)
- dctA_c(tp + 4 * 8, src, stride);
-
- p->dctB(block, tp);
-
- v = p->requantize(p, block, qp);
- v = (v + dither[y & 7][x & 7]) >> 6;
- if ((unsigned)v > 255)
- v = (-v) >> 31;
- dst[x + y * dst_stride] = v;
- }
- }
- }
-}
-
-static int query_formats(AVFilterContext *ctx)
-{
- static const enum AVPixelFormat pix_fmts[] = {
- AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV422P,
- AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV411P,
- AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV440P,
- AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUVJ422P,
- AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ440P,
- AV_PIX_FMT_GBRP,
- AV_PIX_FMT_GRAY8, AV_PIX_FMT_NONE
- };
-
- AVFilterFormats *fmts_list = ff_make_format_list(pix_fmts);
- if (!fmts_list)
- return AVERROR(ENOMEM);
- return ff_set_common_formats(ctx, fmts_list);
-}
-
-static int config_input(AVFilterLink *inlink)
-{
- AVFilterContext *ctx = inlink->dst;
- PP7Context *pp7 = ctx->priv;
- const int h = FFALIGN(inlink->h + 16, 16);
- const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
-
- pp7->hsub = desc->log2_chroma_w;
- pp7->vsub = desc->log2_chroma_h;
-
- pp7->temp_stride = FFALIGN(inlink->w + 16, 16);
- pp7->src = av_malloc_array(pp7->temp_stride, (h + 8) * sizeof(uint8_t));
-
- if (!pp7->src)
- return AVERROR(ENOMEM);
-
- init_thres2(pp7);
-
- switch (pp7->mode) {
- case 0: pp7->requantize = hardthresh_c; break;
- case 1: pp7->requantize = softthresh_c; break;
- default:
- case 2: pp7->requantize = mediumthresh_c; break;
- }
-
- pp7->dctB = dctB_c;
-
- if (ARCH_X86)
- ff_pp7_init_x86(pp7);
-
- return 0;
-}
-
-static int filter_frame(AVFilterLink *inlink, AVFrame *in)
-{
- AVFilterContext *ctx = inlink->dst;
- PP7Context *pp7 = ctx->priv;
- AVFilterLink *outlink = ctx->outputs[0];
- AVFrame *out = in;
-
- int qp_stride = 0;
- uint8_t *qp_table = NULL;
-
- if (!pp7->qp)
- qp_table = av_frame_get_qp_table(in, &qp_stride, &pp7->qscale_type);
-
- if (!ctx->is_disabled) {
- const int cw = AV_CEIL_RSHIFT(inlink->w, pp7->hsub);
- const int ch = AV_CEIL_RSHIFT(inlink->h, pp7->vsub);
-
- /* get a new frame if in-place is not possible or if the dimensions
- * are not multiple of 8 */
- if (!av_frame_is_writable(in) || (inlink->w & 7) || (inlink->h & 7)) {
- const int aligned_w = FFALIGN(inlink->w, 8);
- const int aligned_h = FFALIGN(inlink->h, 8);
-
- out = ff_get_video_buffer(outlink, aligned_w, aligned_h);
- if (!out) {
- av_frame_free(&in);
- return AVERROR(ENOMEM);
- }
- av_frame_copy_props(out, in);
- out->width = in->width;
- out->height = in->height;
- }
-
- if (qp_table || pp7->qp) {
-
- filter(pp7, out->data[0], in->data[0], out->linesize[0], in->linesize[0],
- inlink->w, inlink->h, qp_table, qp_stride, 1);
- filter(pp7, out->data[1], in->data[1], out->linesize[1], in->linesize[1],
- cw, ch, qp_table, qp_stride, 0);
- filter(pp7, out->data[2], in->data[2], out->linesize[2], in->linesize[2],
- cw, ch, qp_table, qp_stride, 0);
- emms_c();
- }
- }
-
- if (in != out) {
- if (in->data[3])
- av_image_copy_plane(out->data[3], out->linesize[3],
- in ->data[3], in ->linesize[3],
- inlink->w, inlink->h);
- av_frame_free(&in);
- }
- return ff_filter_frame(outlink, out);
-}
-
-static av_cold void uninit(AVFilterContext *ctx)
-{
- PP7Context *pp7 = ctx->priv;
- av_freep(&pp7->src);
-}
-
-static const AVFilterPad pp7_inputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- .config_props = config_input,
- .filter_frame = filter_frame,
- },
- { NULL }
-};
-
-static const AVFilterPad pp7_outputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- },
- { NULL }
-};
-
-AVFilter ff_vf_pp7 = {
- .name = "pp7",
- .description = NULL_IF_CONFIG_SMALL("Apply Postprocessing 7 filter."),
- .priv_size = sizeof(PP7Context),
- .uninit = uninit,
- .query_formats = query_formats,
- .inputs = pp7_inputs,
- .outputs = pp7_outputs,
- .priv_class = &pp7_class,
- .flags = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL,
-};
diff --git a/libavfilter/vf_pp7.h b/libavfilter/vf_pp7.h
deleted file mode 100644
index 9aa8d73..0000000
--- a/libavfilter/vf_pp7.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (c) 2005 Michael Niedermayer <michaelni@gmx.at>
- * Copyright (c) 2014 Arwa Arif <arwaarif1994@gmail.com>
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef AVFILTER_PP7_H
-#define AVFILTER_PP7_H
-
-#include "avfilter.h"
-
-typedef struct PP7Context {
- AVClass *class;
- int thres2[99][16];
-
- int qp;
- int mode;
- int qscale_type;
- int hsub;
- int vsub;
- int temp_stride;
- uint8_t *src;
-
- int (*requantize)(struct PP7Context *p, int16_t *src, int qp);
- void (*dctB)(int16_t *dst, int16_t *src);
-
-} PP7Context;
-
-void ff_pp7_init_x86(PP7Context *pp7);
-
-#endif /* AVFILTER_PP7_H */
diff --git a/libavfilter/vf_pullup.c b/libavfilter/vf_pullup.c
deleted file mode 100644
index fa76caa..0000000
--- a/libavfilter/vf_pullup.c
+++ /dev/null
@@ -1,776 +0,0 @@
-/*
- * Copyright (c) 2003 Rich Felker
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#include "libavutil/avassert.h"
-#include "libavutil/imgutils.h"
-#include "libavutil/opt.h"
-#include "libavutil/pixdesc.h"
-#include "avfilter.h"
-#include "formats.h"
-#include "internal.h"
-#include "video.h"
-#include "vf_pullup.h"
-
-#define F_HAVE_BREAKS 1
-#define F_HAVE_AFFINITY 2
-
-#define BREAK_LEFT 1
-#define BREAK_RIGHT 2
-
-#define OFFSET(x) offsetof(PullupContext, x)
-#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
-
-static const AVOption pullup_options[] = {
- { "jl", "set left junk size", OFFSET(junk_left), AV_OPT_TYPE_INT, {.i64=1}, 0, INT_MAX, FLAGS },
- { "jr", "set right junk size", OFFSET(junk_right), AV_OPT_TYPE_INT, {.i64=1}, 0, INT_MAX, FLAGS },
- { "jt", "set top junk size", OFFSET(junk_top), AV_OPT_TYPE_INT, {.i64=4}, 1, INT_MAX, FLAGS },
- { "jb", "set bottom junk size", OFFSET(junk_bottom), AV_OPT_TYPE_INT, {.i64=4}, 1, INT_MAX, FLAGS },
- { "sb", "set strict breaks", OFFSET(strict_breaks), AV_OPT_TYPE_BOOL,{.i64=0},-1, 1, FLAGS },
- { "mp", "set metric plane", OFFSET(metric_plane), AV_OPT_TYPE_INT, {.i64=0}, 0, 2, FLAGS, "mp" },
- { "y", "luma", 0, AV_OPT_TYPE_CONST, {.i64=0}, 0, 0, FLAGS, "mp" },
- { "u", "chroma blue", 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, FLAGS, "mp" },
- { "v", "chroma red", 0, AV_OPT_TYPE_CONST, {.i64=2}, 0, 0, FLAGS, "mp" },
- { NULL }
-};
-
-AVFILTER_DEFINE_CLASS(pullup);
-
-static int query_formats(AVFilterContext *ctx)
-{
- static const enum AVPixelFormat pix_fmts[] = {
- AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUVJ440P,
- AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ420P,
- AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV440P,
- AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV420P,
- AV_PIX_FMT_YUV411P, AV_PIX_FMT_YUV410P,
- AV_PIX_FMT_YUVJ411P, AV_PIX_FMT_GRAY8,
- AV_PIX_FMT_NONE
- };
-
- AVFilterFormats *fmts_list = ff_make_format_list(pix_fmts);
- if (!fmts_list)
- return AVERROR(ENOMEM);
- return ff_set_common_formats(ctx, fmts_list);
-}
-
-#define ABS(a) (((a) ^ ((a) >> 31)) - ((a) >> 31))
-
-static int diff_c(const uint8_t *a, const uint8_t *b, ptrdiff_t s)
-{
- int i, j, diff = 0;
-
- for (i = 0; i < 4; i++) {
- for (j = 0; j < 8; j++)
- diff += ABS(a[j] - b[j]);
- a += s;
- b += s;
- }
-
- return diff;
-}
-
-static int comb_c(const uint8_t *a, const uint8_t *b, ptrdiff_t s)
-{
- int i, j, comb = 0;
-
- for (i = 0; i < 4; i++) {
- for (j = 0; j < 8; j++)
- comb += ABS((a[j] << 1) - b[j - s] - b[j ]) +
- ABS((b[j] << 1) - a[j ] - a[j + s]);
- a += s;
- b += s;
- }
-
- return comb;
-}
-
-static int var_c(const uint8_t *a, const uint8_t *b, ptrdiff_t s)
-{
- int i, j, var = 0;
-
- for (i = 0; i < 3; i++) {
- for (j = 0; j < 8; j++)
- var += ABS(a[j] - a[j + s]);
- a += s;
- }
-
- return 4 * var; /* match comb scaling */
-}
-
-static int alloc_metrics(PullupContext *s, PullupField *f)
-{
- f->diffs = av_calloc(FFALIGN(s->metric_length, 16), sizeof(*f->diffs));
- f->combs = av_calloc(FFALIGN(s->metric_length, 16), sizeof(*f->combs));
- f->vars = av_calloc(FFALIGN(s->metric_length, 16), sizeof(*f->vars));
-
- if (!f->diffs || !f->combs || !f->vars) {
- av_freep(&f->diffs);
- av_freep(&f->combs);
- av_freep(&f->vars);
- return AVERROR(ENOMEM);
- }
- return 0;
-}
-
-static void free_field_queue(PullupField *head)
-{
- PullupField *f = head;
- do {
- PullupField *next;
- if (!f)
- break;
- av_free(f->diffs);
- av_free(f->combs);
- av_free(f->vars);
- next = f->next;
- memset(f, 0, sizeof(*f)); // clear all pointers to avoid stale ones
- av_free(f);
- f = next;
- } while (f != head);
-}
-
-static PullupField *make_field_queue(PullupContext *s, int len)
-{
- PullupField *head, *f;
-
- f = head = av_mallocz(sizeof(*head));
- if (!f)
- return NULL;
-
- if (alloc_metrics(s, f) < 0) {
- av_free(f);
- return NULL;
- }
-
- for (; len > 0; len--) {
- f->next = av_mallocz(sizeof(*f->next));
- if (!f->next) {
- free_field_queue(head);
- return NULL;
- }
-
- f->next->prev = f;
- f = f->next;
- if (alloc_metrics(s, f) < 0) {
- free_field_queue(head);
- return NULL;
- }
- }
-
- f->next = head;
- head->prev = f;
-
- return head;
-}
-
-static int config_input(AVFilterLink *inlink)
-{
- AVFilterContext *ctx = inlink->dst;
- PullupContext *s = ctx->priv;
- const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
- int mp = s->metric_plane;
-
- s->nb_planes = av_pix_fmt_count_planes(inlink->format);
-
- if (mp + 1 > s->nb_planes) {
- av_log(ctx, AV_LOG_ERROR, "input format does not have such plane\n");
- return AVERROR(EINVAL);
- }
-
- s->planeheight[1] = s->planeheight[2] = AV_CEIL_RSHIFT(inlink->h, desc->log2_chroma_h);
- s->planeheight[0] = s->planeheight[3] = inlink->h;
- s->planewidth[1] = s->planewidth[2] = AV_CEIL_RSHIFT(inlink->w, desc->log2_chroma_w);
- s->planewidth[0] = s->planewidth[3] = inlink->w;
-
- s->metric_w = (s->planewidth[mp] - ((s->junk_left + s->junk_right) << 3)) >> 3;
- s->metric_h = (s->planeheight[mp] - ((s->junk_top + s->junk_bottom) << 1)) >> 3;
- s->metric_offset = (s->junk_left << 3) + (s->junk_top << 1) * s->planewidth[mp];
- s->metric_length = s->metric_w * s->metric_h;
-
- av_log(ctx, AV_LOG_DEBUG, "w: %d h: %d\n", s->metric_w, s->metric_h);
- av_log(ctx, AV_LOG_DEBUG, "offset: %d length: %d\n", s->metric_offset, s->metric_length);
-
- s->head = make_field_queue(s, 8);
- if (!s->head)
- return AVERROR(ENOMEM);
-
- s->diff = diff_c;
- s->comb = comb_c;
- s->var = var_c;
-
- if (ARCH_X86)
- ff_pullup_init_x86(s);
- return 0;
-}
-
-static PullupBuffer *pullup_lock_buffer(PullupBuffer *b, int parity)
-{
- if (!b)
- return NULL;
-
- if ((parity + 1) & 1)
- b->lock[0]++;
- if ((parity + 1) & 2)
- b->lock[1]++;
-
- return b;
-}
-
-static void pullup_release_buffer(PullupBuffer *b, int parity)
-{
- if (!b)
- return;
-
- if ((parity + 1) & 1)
- b->lock[0]--;
- if ((parity + 1) & 2)
- b->lock[1]--;
-}
-
-static int alloc_buffer(PullupContext *s, PullupBuffer *b)
-{
- int i;
-
- if (b->planes[0])
- return 0;
- for (i = 0; i < s->nb_planes; i++) {
- b->planes[i] = av_malloc(s->planeheight[i] * s->planewidth[i]);
- }
- if (s->nb_planes == 1)
- b->planes[1] = av_malloc(4*256);
-
- return 0;
-}
-
-static PullupBuffer *pullup_get_buffer(PullupContext *s, int parity)
-{
- int i;
-
- /* Try first to get the sister buffer for the previous field */
- if (parity < 2 && s->last && parity != s->last->parity
- && !s->last->buffer->lock[parity]) {
- alloc_buffer(s, s->last->buffer);
- return pullup_lock_buffer(s->last->buffer, parity);
- }
-
- /* Prefer a buffer with both fields open */
- for (i = 0; i < FF_ARRAY_ELEMS(s->buffers); i++) {
- if (s->buffers[i].lock[0])
- continue;
- if (s->buffers[i].lock[1])
- continue;
- alloc_buffer(s, &s->buffers[i]);
- return pullup_lock_buffer(&s->buffers[i], parity);
- }
-
- if (parity == 2)
- return 0;
-
- /* Search for any half-free buffer */
- for (i = 0; i < FF_ARRAY_ELEMS(s->buffers); i++) {
- if (((parity + 1) & 1) && s->buffers[i].lock[0])
- continue;
- if (((parity + 1) & 2) && s->buffers[i].lock[1])
- continue;
- alloc_buffer(s, &s->buffers[i]);
- return pullup_lock_buffer(&s->buffers[i], parity);
- }
-
- return NULL;
-}
-
-static int queue_length(PullupField *begin, PullupField *end)
-{
- PullupField *f;
- int count = 1;
-
- if (!begin || !end)
- return 0;
-
- for (f = begin; f != end; f = f->next)
- count++;
-
- return count;
-}
-
-static int find_first_break(PullupField *f, int max)
-{
- int i;
-
- for (i = 0; i < max; i++) {
- if (f->breaks & BREAK_RIGHT || f->next->breaks & BREAK_LEFT)
- return i + 1;
- f = f->next;
- }
-
- return 0;
-}
-
-static void compute_breaks(PullupContext *s, PullupField *f0)
-{
- PullupField *f1 = f0->next;
- PullupField *f2 = f1->next;
- PullupField *f3 = f2->next;
- int i, l, max_l = 0, max_r = 0;
-
- if (f0->flags & F_HAVE_BREAKS)
- return;
-
- f0->flags |= F_HAVE_BREAKS;
-
- /* Special case when fields are 100% identical */
- if (f0->buffer == f2->buffer && f1->buffer != f3->buffer) {
- f2->breaks |= BREAK_RIGHT;
- return;
- }
-
- if (f0->buffer != f2->buffer && f1->buffer == f3->buffer) {
- f1->breaks |= BREAK_LEFT;
- return;
- }
-
- for (i = 0; i < s->metric_length; i++) {
- l = f2->diffs[i] - f3->diffs[i];
-
- if ( l > max_l)
- max_l = l;
- if (-l > max_r)
- max_r = -l;
- }
-
- /* Don't get tripped up when differences are mostly quant error */
- if (max_l + max_r < 128)
- return;
- if (max_l > 4 * max_r)
- f1->breaks |= BREAK_LEFT;
- if (max_r > 4 * max_l)
- f2->breaks |= BREAK_RIGHT;
-}
-
-static void compute_affinity(PullupContext *s, PullupField *f)
-{
- int i, max_l = 0, max_r = 0, l;
-
- if (f->flags & F_HAVE_AFFINITY)
- return;
-
- f->flags |= F_HAVE_AFFINITY;
-
- if (f->buffer == f->next->next->buffer) {
- f->affinity = 1;
- f->next->affinity = 0;
- f->next->next->affinity = -1;
- f->next->flags |= F_HAVE_AFFINITY;
- f->next->next->flags |= F_HAVE_AFFINITY;
- return;
- }
-
- for (i = 0; i < s->metric_length; i++) {
- int v = f->vars[i];
- int lv = f->prev->vars[i];
- int rv = f->next->vars[i];
- int lc = f-> combs[i] - 2*(v < lv ? v : lv);
- int rc = f->next->combs[i] - 2*(v < rv ? v : rv);
-
- lc = FFMAX(lc, 0);
- rc = FFMAX(rc, 0);
- l = lc - rc;
-
- if ( l > max_l)
- max_l = l;
- if (-l > max_r)
- max_r = -l;
- }
-
- if (max_l + max_r < 64)
- return;
-
- if (max_r > 6 * max_l)
- f->affinity = -1;
- else if (max_l > 6 * max_r)
- f->affinity = 1;
-}
-
-static int decide_frame_length(PullupContext *s)
-{
- PullupField *f0 = s->first;
- PullupField *f1 = f0->next;
- PullupField *f2 = f1->next;
- PullupField *f;
- int i, l, n;
-
- if (queue_length(s->first, s->last) < 4)
- return 0;
-
- f = s->first;
- n = queue_length(f, s->last);
- for (i = 0; i < n - 1; i++) {
- if (i < n - 3)
- compute_breaks(s, f);
-
- compute_affinity(s, f);
-
- f = f->next;
- }
-
- if (f0->affinity == -1)
- return 1;
-
- l = find_first_break(f0, 3);
-
- if (l == 1 && s->strict_breaks < 0)
- l = 0;
-
- switch (l) {
- case 1:
- return 1 + (s->strict_breaks < 1 && f0->affinity == 1 && f1->affinity == -1);
- case 2:
- /* FIXME: strictly speaking, f0->prev is no longer valid... :) */
- if (s->strict_pairs
- && (f0->prev->breaks & BREAK_RIGHT) && (f2->breaks & BREAK_LEFT)
- && (f0->affinity != 1 || f1->affinity != -1) )
- return 1;
- return 1 + (f1->affinity != 1);
- case 3:
- return 2 + (f2->affinity != 1);
- default:
- /* 9 possibilities covered before switch */
- if (f1->affinity == 1)
- return 1; /* covers 6 */
- else if (f1->affinity == -1)
- return 2; /* covers 6 */
- else if (f2->affinity == -1) { /* covers 2 */
- return (f0->affinity == 1) ? 3 : 1;
- } else {
- return 2; /* the remaining 6 */
- }
- }
-}
-
-static PullupFrame *pullup_get_frame(PullupContext *s)
-{
- PullupFrame *fr = &s->frame;
- int i, n = decide_frame_length(s);
- int aff = s->first->next->affinity;
-
- av_assert1(n < FF_ARRAY_ELEMS(fr->ifields));
- if (!n || fr->lock)
- return NULL;
-
- fr->lock++;
- fr->length = n;
- fr->parity = s->first->parity;
- fr->buffer = 0;
-
- for (i = 0; i < n; i++) {
- /* We cheat and steal the buffer without release+relock */
- fr->ifields[i] = s->first->buffer;
- s->first->buffer = 0;
- s->first = s->first->next;
- }
-
- if (n == 1) {
- fr->ofields[fr->parity ] = fr->ifields[0];
- fr->ofields[fr->parity ^ 1] = 0;
- } else if (n == 2) {
- fr->ofields[fr->parity ] = fr->ifields[0];
- fr->ofields[fr->parity ^ 1] = fr->ifields[1];
- } else if (n == 3) {
- if (!aff)
- aff = (fr->ifields[0] == fr->ifields[1]) ? -1 : 1;
- fr->ofields[fr->parity ] = fr->ifields[1 + aff];
- fr->ofields[fr->parity ^ 1] = fr->ifields[1 ];
- }
-
- pullup_lock_buffer(fr->ofields[0], 0);
- pullup_lock_buffer(fr->ofields[1], 1);
-
- if (fr->ofields[0] == fr->ofields[1]) {
- fr->buffer = fr->ofields[0];
- pullup_lock_buffer(fr->buffer, 2);
- return fr;
- }
-
- return fr;
-}
-
-static void pullup_release_frame(PullupFrame *f)
-{
- int i;
-
- for (i = 0; i < f->length; i++)
- pullup_release_buffer(f->ifields[i], f->parity ^ (i & 1));
-
- pullup_release_buffer(f->ofields[0], 0);
- pullup_release_buffer(f->ofields[1], 1);
-
- if (f->buffer)
- pullup_release_buffer(f->buffer, 2);
- f->lock--;
-}
-
-static void compute_metric(PullupContext *s, int *dest,
- PullupField *fa, int pa, PullupField *fb, int pb,
- int (*func)(const uint8_t *, const uint8_t *, ptrdiff_t))
-{
- int mp = s->metric_plane;
- int xstep = 8;
- int ystep = s->planewidth[mp] << 3;
- int stride = s->planewidth[mp] << 1; /* field stride */
- int w = s->metric_w * xstep;
- uint8_t *a, *b;
- int x, y;
-
- if (!fa->buffer || !fb->buffer)
- return;
-
- /* Shortcut for duplicate fields (e.g. from RFF flag) */
- if (fa->buffer == fb->buffer && pa == pb) {
- memset(dest, 0, s->metric_length * sizeof(*dest));
- return;
- }
-
- a = fa->buffer->planes[mp] + pa * s->planewidth[mp] + s->metric_offset;
- b = fb->buffer->planes[mp] + pb * s->planewidth[mp] + s->metric_offset;
-
- for (y = 0; y < s->metric_h; y++) {
- for (x = 0; x < w; x += xstep)
- *dest++ = func(a + x, b + x, stride);
- a += ystep; b += ystep;
- }
-}
-
-static int check_field_queue(PullupContext *s)
-{
- int ret;
-
- if (s->head->next == s->first) {
- PullupField *f = av_mallocz(sizeof(*f));
-
- if (!f)
- return AVERROR(ENOMEM);
-
- if ((ret = alloc_metrics(s, f)) < 0) {
- av_free(f);
- return ret;
- }
-
- f->prev = s->head;
- f->next = s->first;
- s->head->next = f;
- s->first->prev = f;
- }
-
- return 0;
-}
-
-static void pullup_submit_field(PullupContext *s, PullupBuffer *b, int parity)
-{
- PullupField *f;
-
- /* Grow the circular list if needed */
- if (check_field_queue(s) < 0)
- return;
-
- /* Cannot have two fields of same parity in a row; drop the new one */
- if (s->last && s->last->parity == parity)
- return;
-
- f = s->head;
- f->parity = parity;
- f->buffer = pullup_lock_buffer(b, parity);
- f->flags = 0;
- f->breaks = 0;
- f->affinity = 0;
-
- compute_metric(s, f->diffs, f, parity, f->prev->prev, parity, s->diff);
- compute_metric(s, f->combs, parity ? f->prev : f, 0, parity ? f : f->prev, 1, s->comb);
- compute_metric(s, f->vars, f, parity, f, -1, s->var);
- emms_c();
-
- /* Advance the circular list */
- if (!s->first)
- s->first = s->head;
-
- s->last = s->head;
- s->head = s->head->next;
-}
-
-static void copy_field(PullupContext *s,
- PullupBuffer *dst, PullupBuffer *src, int parity)
-{
- uint8_t *dd, *ss;
- int i;
-
- for (i = 0; i < s->nb_planes; i++) {
- ss = src->planes[i] + parity * s->planewidth[i];
- dd = dst->planes[i] + parity * s->planewidth[i];
-
- av_image_copy_plane(dd, s->planewidth[i] << 1,
- ss, s->planewidth[i] << 1,
- s->planewidth[i], s->planeheight[i] >> 1);
- }
-}
-
-static void pullup_pack_frame(PullupContext *s, PullupFrame *fr)
-{
- int i;
-
- if (fr->buffer)
- return;
-
- if (fr->length < 2)
- return; /* FIXME: deal with this */
-
- for (i = 0; i < 2; i++) {
- if (fr->ofields[i]->lock[i^1])
- continue;
-
- fr->buffer = fr->ofields[i];
- pullup_lock_buffer(fr->buffer, 2);
- copy_field(s, fr->buffer, fr->ofields[i^1], i^1);
- return;
- }
-
- fr->buffer = pullup_get_buffer(s, 2);
-
- copy_field(s, fr->buffer, fr->ofields[0], 0);
- copy_field(s, fr->buffer, fr->ofields[1], 1);
-}
-
-static int filter_frame(AVFilterLink *inlink, AVFrame *in)
-{
- AVFilterContext *ctx = inlink->dst;
- AVFilterLink *outlink = ctx->outputs[0];
- PullupContext *s = ctx->priv;
- PullupBuffer *b;
- PullupFrame *f;
- AVFrame *out;
- int p, ret = 0;
-
- b = pullup_get_buffer(s, 2);
- if (!b) {
- av_log(ctx, AV_LOG_WARNING, "Could not get buffer!\n");
- f = pullup_get_frame(s);
- pullup_release_frame(f);
- goto end;
- }
-
- av_image_copy(b->planes, s->planewidth,
- (const uint8_t**)in->data, in->linesize,
- inlink->format, inlink->w, inlink->h);
-
- p = in->interlaced_frame ? !in->top_field_first : 0;
- pullup_submit_field(s, b, p );
- pullup_submit_field(s, b, p^1);
-
- if (in->repeat_pict)
- pullup_submit_field(s, b, p);
-
- pullup_release_buffer(b, 2);
-
- f = pullup_get_frame(s);
- if (!f)
- goto end;
-
- if (f->length < 2) {
- pullup_release_frame(f);
- f = pullup_get_frame(s);
- if (!f)
- goto end;
- if (f->length < 2) {
- pullup_release_frame(f);
- if (!in->repeat_pict)
- goto end;
- f = pullup_get_frame(s);
- if (!f)
- goto end;
- if (f->length < 2) {
- pullup_release_frame(f);
- goto end;
- }
- }
- }
-
- /* If the frame isn't already exportable... */
- if (!f->buffer)
- pullup_pack_frame(s, f);
-
- out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
- if (!out) {
- ret = AVERROR(ENOMEM);
- goto end;
- }
- av_frame_copy_props(out, in);
-
- av_image_copy(out->data, out->linesize,
- (const uint8_t**)f->buffer->planes, s->planewidth,
- inlink->format, inlink->w, inlink->h);
-
- ret = ff_filter_frame(outlink, out);
- pullup_release_frame(f);
-end:
- av_frame_free(&in);
- return ret;
-}
-
-static av_cold void uninit(AVFilterContext *ctx)
-{
- PullupContext *s = ctx->priv;
- int i;
-
- free_field_queue(s->head);
- s->last = NULL;
-
- for (i = 0; i < FF_ARRAY_ELEMS(s->buffers); i++) {
- av_freep(&s->buffers[i].planes[0]);
- av_freep(&s->buffers[i].planes[1]);
- av_freep(&s->buffers[i].planes[2]);
- }
-}
-
-static const AVFilterPad pullup_inputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- .filter_frame = filter_frame,
- .config_props = config_input,
- },
- { NULL }
-};
-
-static const AVFilterPad pullup_outputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- },
- { NULL }
-};
-
-AVFilter ff_vf_pullup = {
- .name = "pullup",
- .description = NULL_IF_CONFIG_SMALL("Pullup from field sequence to frames."),
- .priv_size = sizeof(PullupContext),
- .priv_class = &pullup_class,
- .uninit = uninit,
- .query_formats = query_formats,
- .inputs = pullup_inputs,
- .outputs = pullup_outputs,
-};
diff --git a/libavfilter/vf_pullup.h b/libavfilter/vf_pullup.h
deleted file mode 100644
index 8f59335..0000000
--- a/libavfilter/vf_pullup.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#ifndef AVFILTER_PULLUP_H
-#define AVFILTER_PULLUP_H
-
-#include "avfilter.h"
-
-typedef struct PullupBuffer {
- int lock[2];
- uint8_t *planes[4];
-} PullupBuffer;
-
-typedef struct PullupField {
- int parity;
- PullupBuffer *buffer;
- unsigned flags;
- int breaks;
- int affinity;
- int *diffs;
- int *combs;
- int *vars;
- struct PullupField *prev, *next;
-} PullupField;
-
-typedef struct PullupFrame {
- int lock;
- int length;
- int parity;
- PullupBuffer *ifields[4], *ofields[2];
- PullupBuffer *buffer;
-} PullupFrame;
-
-typedef struct PullupContext {
- const AVClass *class;
- int junk_left, junk_right, junk_top, junk_bottom;
- int metric_plane;
- int strict_breaks;
- int strict_pairs;
- int metric_w, metric_h, metric_length;
- int metric_offset;
- int nb_planes;
- int planewidth[4];
- int planeheight[4];
- PullupField *first, *last, *head;
- PullupBuffer buffers[10];
- PullupFrame frame;
-
- int (*diff)(const uint8_t *a, const uint8_t *b, ptrdiff_t s);
- int (*comb)(const uint8_t *a, const uint8_t *b, ptrdiff_t s);
- int (*var )(const uint8_t *a, const uint8_t *b, ptrdiff_t s);
-} PullupContext;
-
-void ff_pullup_init_x86(PullupContext *s);
-
-#endif /* AVFILTER_PULLUP_H */
diff --git a/libavfilter/vf_repeatfields.c b/libavfilter/vf_repeatfields.c
deleted file mode 100644
index 3ac432b..0000000
--- a/libavfilter/vf_repeatfields.c
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * Copyright (c) 2003 Tobias Diedrich
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "libavutil/imgutils.h"
-#include "avfilter.h"
-#include "internal.h"
-
-typedef struct RepeatFieldsContext {
- const AVClass *class;
- int state;
- int nb_planes;
- int linesize[4];
- int planeheight[4];
- AVFrame *frame;
-} RepeatFieldsContext;
-
-static av_cold void uninit(AVFilterContext *ctx)
-{
- RepeatFieldsContext *s = ctx->priv;
-
- av_frame_free(&s->frame);
-}
-
-static int query_formats(AVFilterContext *ctx)
-{
- static const enum AVPixelFormat pixel_fmts_eq[] = {
- AV_PIX_FMT_GRAY8,
- AV_PIX_FMT_YUV410P,
- AV_PIX_FMT_YUV411P,
- AV_PIX_FMT_YUV420P,
- AV_PIX_FMT_YUV422P,
- AV_PIX_FMT_YUV444P,
- AV_PIX_FMT_NONE
- };
-
- AVFilterFormats *fmts_list = ff_make_format_list(pixel_fmts_eq);
- if (!fmts_list)
- return AVERROR(ENOMEM);
- return ff_set_common_formats(ctx, fmts_list);
-}
-
-static int config_input(AVFilterLink *inlink)
-{
- RepeatFieldsContext *s = inlink->dst->priv;
- const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
- int ret;
-
- if ((ret = av_image_fill_linesizes(s->linesize, inlink->format, inlink->w)) < 0)
- return ret;
-
- s->planeheight[1] = s->planeheight[2] = AV_CEIL_RSHIFT(inlink->h, desc->log2_chroma_h);
- s->planeheight[0] = s->planeheight[3] = inlink->h;
-
- s->nb_planes = av_pix_fmt_count_planes(inlink->format);
-
- return 0;
-}
-
-static void update_pts(AVFilterLink *link, AVFrame *f, int64_t pts, int fields)
-{
- if (av_cmp_q(link->frame_rate, (AVRational){30000, 1001}) == 0 &&
- av_cmp_q(link->time_base, (AVRational){1001, 60000}) <= 0
- ) {
- f->pts = pts + av_rescale_q(fields, (AVRational){1001, 60000}, link->time_base);
- } else
- f->pts = AV_NOPTS_VALUE;
-}
-
-static int filter_frame(AVFilterLink *inlink, AVFrame *in) {
- AVFilterContext *ctx = inlink->dst;
- AVFilterLink *outlink = inlink->dst->outputs[0];
- RepeatFieldsContext *s = ctx->priv;
- AVFrame *out;
- int ret, i;
- int state = s->state;
-
- if (!s->frame) {
- s->frame = av_frame_clone(in);
- if (!s->frame)
- return AVERROR(ENOMEM);
- s->frame->pts = AV_NOPTS_VALUE;
- }
-
- out = s->frame;
-
- if ((state == 0 && !in->top_field_first) ||
- (state == 1 && in->top_field_first)) {
- av_log(ctx, AV_LOG_WARNING, "Unexpected field flags: "
- "state=%d top_field_first=%d repeat_first_field=%d\n",
- state, in->top_field_first, in->repeat_pict);
- state ^= 1;
- }
-
- if (state == 0) {
- AVFrame *new;
-
- new = av_frame_clone(in);
- if (!new)
- return AVERROR(ENOMEM);
-
- ret = ff_filter_frame(outlink, new);
-
- if (in->repeat_pict) {
- av_frame_make_writable(out);
- update_pts(outlink, out, in->pts, 2);
- for (i = 0; i < s->nb_planes; i++) {
- av_image_copy_plane(out->data[i], out->linesize[i] * 2,
- in->data[i], in->linesize[i] * 2,
- s->linesize[i], s->planeheight[i] / 2);
- }
- state = 1;
- }
- } else {
- for (i = 0; i < s->nb_planes; i++) {
- av_frame_make_writable(out);
- av_image_copy_plane(out->data[i] + out->linesize[i], out->linesize[i] * 2,
- in->data[i] + in->linesize[i], in->linesize[i] * 2,
- s->linesize[i], s->planeheight[i] / 2);
- }
-
- ret = ff_filter_frame(outlink, av_frame_clone(out));
-
- if (in->repeat_pict) {
- AVFrame *new;
-
- new = av_frame_clone(in);
- if (!new)
- return AVERROR(ENOMEM);
-
- ret = ff_filter_frame(outlink, new);
- state = 0;
- } else {
- av_frame_make_writable(out);
- update_pts(outlink, out, in->pts, 1);
- for (i = 0; i < s->nb_planes; i++) {
- av_image_copy_plane(out->data[i], out->linesize[i] * 2,
- in->data[i], in->linesize[i] * 2,
- s->linesize[i], s->planeheight[i] / 2);
- }
- }
- }
-
- s->state = state;
-
- av_frame_free(&in);
- return ret;
-}
-
-static const AVFilterPad repeatfields_inputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- .filter_frame = filter_frame,
- .config_props = config_input,
- },
- { NULL }
-};
-
-static const AVFilterPad repeatfields_outputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- },
- { NULL }
-};
-
-AVFilter ff_vf_repeatfields = {
- .name = "repeatfields",
- .description = NULL_IF_CONFIG_SMALL("Hard repeat fields based on MPEG repeat field flag."),
- .priv_size = sizeof(RepeatFieldsContext),
- .uninit = uninit,
- .inputs = repeatfields_inputs,
- .outputs = repeatfields_outputs,
- .query_formats = query_formats,
-};
diff --git a/libavfilter/vf_sab.c b/libavfilter/vf_sab.c
deleted file mode 100644
index 6f63654..0000000
--- a/libavfilter/vf_sab.c
+++ /dev/null
@@ -1,337 +0,0 @@
-/*
- * Copyright (c) 2002 Michael Niedermayer <michaelni@gmx.at>
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/**
- * @file
- * Shape Adaptive Blur filter, ported from MPlayer libmpcodecs/vf_sab.c
- */
-
-#include "libavutil/opt.h"
-#include "libavutil/pixdesc.h"
-#include "libswscale/swscale.h"
-
-#include "avfilter.h"
-#include "formats.h"
-#include "internal.h"
-
-typedef struct FilterParam {
- float radius;
- float pre_filter_radius;
- float strength;
- float quality;
- struct SwsContext *pre_filter_context;
- uint8_t *pre_filter_buf;
- int pre_filter_linesize;
- int dist_width;
- int dist_linesize;
- int *dist_coeff;
-#define COLOR_DIFF_COEFF_SIZE 512
- int color_diff_coeff[COLOR_DIFF_COEFF_SIZE];
-} FilterParam;
-
-typedef struct SabContext {
- const AVClass *class;
- FilterParam luma;
- FilterParam chroma;
- int hsub;
- int vsub;
- unsigned int sws_flags;
-} SabContext;
-
-static int query_formats(AVFilterContext *ctx)
-{
- static const enum AVPixelFormat pix_fmts[] = {
- AV_PIX_FMT_YUV420P,
- AV_PIX_FMT_YUV410P,
- AV_PIX_FMT_YUV444P,
- AV_PIX_FMT_YUV422P,
- AV_PIX_FMT_YUV411P,
- AV_PIX_FMT_NONE
- };
- AVFilterFormats *fmts_list = ff_make_format_list(pix_fmts);
- if (!fmts_list)
- return AVERROR(ENOMEM);
- return ff_set_common_formats(ctx, fmts_list);
-}
-
-#define RADIUS_MIN 0.1
-#define RADIUS_MAX 4.0
-
-#define PRE_FILTER_RADIUS_MIN 0.1
-#define PRE_FILTER_RADIUS_MAX 2.0
-
-#define STRENGTH_MIN 0.1
-#define STRENGTH_MAX 100.0
-
-#define OFFSET(x) offsetof(SabContext, x)
-#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
-
-static const AVOption sab_options[] = {
- { "luma_radius", "set luma radius", OFFSET(luma.radius), AV_OPT_TYPE_FLOAT, {.dbl=1.0}, RADIUS_MIN, RADIUS_MAX, .flags=FLAGS },
- { "lr" , "set luma radius", OFFSET(luma.radius), AV_OPT_TYPE_FLOAT, {.dbl=1.0}, RADIUS_MIN, RADIUS_MAX, .flags=FLAGS },
- { "luma_pre_filter_radius", "set luma pre-filter radius", OFFSET(luma.pre_filter_radius), AV_OPT_TYPE_FLOAT, {.dbl=1.0}, PRE_FILTER_RADIUS_MIN, PRE_FILTER_RADIUS_MAX, .flags=FLAGS },
- { "lpfr", "set luma pre-filter radius", OFFSET(luma.pre_filter_radius), AV_OPT_TYPE_FLOAT, {.dbl=1.0}, PRE_FILTER_RADIUS_MIN, PRE_FILTER_RADIUS_MAX, .flags=FLAGS },
- { "luma_strength", "set luma strength", OFFSET(luma.strength), AV_OPT_TYPE_FLOAT, {.dbl=1.0}, STRENGTH_MIN, STRENGTH_MAX, .flags=FLAGS },
- { "ls", "set luma strength", OFFSET(luma.strength), AV_OPT_TYPE_FLOAT, {.dbl=1.0}, STRENGTH_MIN, STRENGTH_MAX, .flags=FLAGS },
-
- { "chroma_radius", "set chroma radius", OFFSET(chroma.radius), AV_OPT_TYPE_FLOAT, {.dbl=RADIUS_MIN-1}, RADIUS_MIN-1, RADIUS_MAX, .flags=FLAGS },
- { "cr", "set chroma radius", OFFSET(chroma.radius), AV_OPT_TYPE_FLOAT, {.dbl=RADIUS_MIN-1}, RADIUS_MIN-1, RADIUS_MAX, .flags=FLAGS },
- { "chroma_pre_filter_radius", "set chroma pre-filter radius", OFFSET(chroma.pre_filter_radius), AV_OPT_TYPE_FLOAT, {.dbl=PRE_FILTER_RADIUS_MIN-1},
- PRE_FILTER_RADIUS_MIN-1, PRE_FILTER_RADIUS_MAX, .flags=FLAGS },
- { "cpfr", "set chroma pre-filter radius", OFFSET(chroma.pre_filter_radius), AV_OPT_TYPE_FLOAT, {.dbl=PRE_FILTER_RADIUS_MIN-1},
- PRE_FILTER_RADIUS_MIN-1, PRE_FILTER_RADIUS_MAX, .flags=FLAGS },
- { "chroma_strength", "set chroma strength", OFFSET(chroma.strength), AV_OPT_TYPE_FLOAT, {.dbl=STRENGTH_MIN-1}, STRENGTH_MIN-1, STRENGTH_MAX, .flags=FLAGS },
- { "cs", "set chroma strength", OFFSET(chroma.strength), AV_OPT_TYPE_FLOAT, {.dbl=STRENGTH_MIN-1}, STRENGTH_MIN-1, STRENGTH_MAX, .flags=FLAGS },
-
- { NULL }
-};
-
-AVFILTER_DEFINE_CLASS(sab);
-
-static av_cold int init(AVFilterContext *ctx)
-{
- SabContext *s = ctx->priv;
-
- /* make chroma default to luma values, if not explicitly set */
- if (s->chroma.radius < RADIUS_MIN)
- s->chroma.radius = s->luma.radius;
- if (s->chroma.pre_filter_radius < PRE_FILTER_RADIUS_MIN)
- s->chroma.pre_filter_radius = s->luma.pre_filter_radius;
- if (s->chroma.strength < STRENGTH_MIN)
- s->chroma.strength = s->luma.strength;
-
- s->luma.quality = s->chroma.quality = 3.0;
- s->sws_flags = SWS_POINT;
-
- av_log(ctx, AV_LOG_VERBOSE,
- "luma_radius:%f luma_pre_filter_radius::%f luma_strength:%f "
- "chroma_radius:%f chroma_pre_filter_radius:%f chroma_strength:%f\n",
- s->luma .radius, s->luma .pre_filter_radius, s->luma .strength,
- s->chroma.radius, s->chroma.pre_filter_radius, s->chroma.strength);
- return 0;
-}
-
-static void close_filter_param(FilterParam *f)
-{
- if (f->pre_filter_context) {
- sws_freeContext(f->pre_filter_context);
- f->pre_filter_context = NULL;
- }
- av_freep(&f->pre_filter_buf);
- av_freep(&f->dist_coeff);
-}
-
-static av_cold void uninit(AVFilterContext *ctx)
-{
- SabContext *s = ctx->priv;
-
- close_filter_param(&s->luma);
- close_filter_param(&s->chroma);
-}
-
-static int open_filter_param(FilterParam *f, int width, int height, unsigned int sws_flags)
-{
- SwsVector *vec;
- SwsFilter sws_f;
- int i, x, y;
- int linesize = FFALIGN(width, 8);
-
- f->pre_filter_buf = av_malloc(linesize * height);
- if (!f->pre_filter_buf)
- return AVERROR(ENOMEM);
-
- f->pre_filter_linesize = linesize;
- vec = sws_getGaussianVec(f->pre_filter_radius, f->quality);
- sws_f.lumH = sws_f.lumV = vec;
- sws_f.chrH = sws_f.chrV = NULL;
- f->pre_filter_context = sws_getContext(width, height, AV_PIX_FMT_GRAY8,
- width, height, AV_PIX_FMT_GRAY8,
- sws_flags, &sws_f, NULL, NULL);
- sws_freeVec(vec);
-
- vec = sws_getGaussianVec(f->strength, 5.0);
- for (i = 0; i < COLOR_DIFF_COEFF_SIZE; i++) {
- double d;
- int index = i-COLOR_DIFF_COEFF_SIZE/2 + vec->length/2;
-
- if (index < 0 || index >= vec->length) d = 0.0;
- else d = vec->coeff[index];
-
- f->color_diff_coeff[i] = (int)(d/vec->coeff[vec->length/2]*(1<<12) + 0.5);
- }
- sws_freeVec(vec);
-
- vec = sws_getGaussianVec(f->radius, f->quality);
- f->dist_width = vec->length;
- f->dist_linesize = FFALIGN(vec->length, 8);
- f->dist_coeff = av_malloc_array(f->dist_width, f->dist_linesize * sizeof(*f->dist_coeff));
- if (!f->dist_coeff) {
- sws_freeVec(vec);
- return AVERROR(ENOMEM);
- }
-
- for (y = 0; y < vec->length; y++) {
- for (x = 0; x < vec->length; x++) {
- double d = vec->coeff[x] * vec->coeff[y];
- f->dist_coeff[x + y*f->dist_linesize] = (int)(d*(1<<10) + 0.5);
- }
- }
- sws_freeVec(vec);
-
- return 0;
-}
-
-static int config_props(AVFilterLink *inlink)
-{
- SabContext *s = inlink->dst->priv;
- const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
- int ret;
-
- s->hsub = desc->log2_chroma_w;
- s->vsub = desc->log2_chroma_h;
-
- close_filter_param(&s->luma);
- ret = open_filter_param(&s->luma, inlink->w, inlink->h, s->sws_flags);
- if (ret < 0)
- return ret;
-
- close_filter_param(&s->chroma);
- ret = open_filter_param(&s->chroma,
- AV_CEIL_RSHIFT(inlink->w, s->hsub),
- AV_CEIL_RSHIFT(inlink->h, s->vsub), s->sws_flags);
- return ret;
-}
-
-#define NB_PLANES 4
-
-static void blur(uint8_t *dst, const int dst_linesize,
- const uint8_t *src, const int src_linesize,
- const int w, const int h, FilterParam *fp)
-{
- int x, y;
- FilterParam f = *fp;
- const int radius = f.dist_width/2;
-
- const uint8_t * const src2[NB_PLANES] = { src };
- int src2_linesize[NB_PLANES] = { src_linesize };
- uint8_t *dst2[NB_PLANES] = { f.pre_filter_buf };
- int dst2_linesize[NB_PLANES] = { f.pre_filter_linesize };
-
- sws_scale(f.pre_filter_context, src2, src2_linesize, 0, h, dst2, dst2_linesize);
-
-#define UPDATE_FACTOR do { \
- int factor; \
- factor = f.color_diff_coeff[COLOR_DIFF_COEFF_SIZE/2 + pre_val - \
- f.pre_filter_buf[ix + iy*f.pre_filter_linesize]] * f.dist_coeff[dx + dy*f.dist_linesize]; \
- sum += src[ix + iy*src_linesize] * factor; \
- div += factor; \
- } while (0)
-
- for (y = 0; y < h; y++) {
- for (x = 0; x < w; x++) {
- int sum = 0;
- int div = 0;
- int dy;
- const int pre_val = f.pre_filter_buf[x + y*f.pre_filter_linesize];
- if (x >= radius && x < w - radius) {
- for (dy = 0; dy < radius*2 + 1; dy++) {
- int dx;
- int iy = y+dy - radius;
- iy = avpriv_mirror(iy, h-1);
-
- for (dx = 0; dx < radius*2 + 1; dx++) {
- const int ix = x+dx - radius;
- UPDATE_FACTOR;
- }
- }
- } else {
- for (dy = 0; dy < radius*2+1; dy++) {
- int dx;
- int iy = y+dy - radius;
- iy = avpriv_mirror(iy, h-1);
-
- for (dx = 0; dx < radius*2 + 1; dx++) {
- int ix = x+dx - radius;
- ix = avpriv_mirror(ix, w-1);
- UPDATE_FACTOR;
- }
- }
- }
- dst[x + y*dst_linesize] = (sum + div/2) / div;
- }
- }
-}
-
-static int filter_frame(AVFilterLink *inlink, AVFrame *inpic)
-{
- SabContext *s = inlink->dst->priv;
- AVFilterLink *outlink = inlink->dst->outputs[0];
- AVFrame *outpic;
-
- outpic = ff_get_video_buffer(outlink, outlink->w, outlink->h);
- if (!outpic) {
- av_frame_free(&inpic);
- return AVERROR(ENOMEM);
- }
- av_frame_copy_props(outpic, inpic);
-
- blur(outpic->data[0], outpic->linesize[0], inpic->data[0], inpic->linesize[0],
- inlink->w, inlink->h, &s->luma);
- if (inpic->data[2]) {
- int cw = AV_CEIL_RSHIFT(inlink->w, s->hsub);
- int ch = AV_CEIL_RSHIFT(inlink->h, s->vsub);
- blur(outpic->data[1], outpic->linesize[1], inpic->data[1], inpic->linesize[1], cw, ch, &s->chroma);
- blur(outpic->data[2], outpic->linesize[2], inpic->data[2], inpic->linesize[2], cw, ch, &s->chroma);
- }
-
- av_frame_free(&inpic);
- return ff_filter_frame(outlink, outpic);
-}
-
-static const AVFilterPad sab_inputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- .filter_frame = filter_frame,
- .config_props = config_props,
- },
- { NULL }
-};
-
-static const AVFilterPad sab_outputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- },
- { NULL }
-};
-
-AVFilter ff_vf_sab = {
- .name = "sab",
- .description = NULL_IF_CONFIG_SMALL("Apply shape adaptive blur."),
- .priv_size = sizeof(SabContext),
- .init = init,
- .uninit = uninit,
- .query_formats = query_formats,
- .inputs = sab_inputs,
- .outputs = sab_outputs,
- .priv_class = &sab_class,
- .flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
-};
diff --git a/libavfilter/vf_signature.c b/libavfilter/vf_signature.c
deleted file mode 100644
index d07b213..0000000
--- a/libavfilter/vf_signature.c
+++ /dev/null
@@ -1,771 +0,0 @@
-/*
- * Copyright (c) 2017 Gerion Entrup
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/**
- * @file
- * MPEG-7 video signature calculation and lookup filter
- * @see http://epubs.surrey.ac.uk/531590/1/MPEG-7%20Video%20Signature%20Author%27s%20Copy.pdf
- */
-
-#include <float.h>
-#include "libavcodec/put_bits.h"
-#include "libavformat/avformat.h"
-#include "libavutil/opt.h"
-#include "libavutil/avstring.h"
-#include "libavutil/intreadwrite.h"
-#include "libavutil/timestamp.h"
-#include "avfilter.h"
-#include "internal.h"
-#include "signature.h"
-#include "signature_lookup.c"
-
-#define OFFSET(x) offsetof(SignatureContext, x)
-#define FLAGS AV_OPT_FLAG_FILTERING_PARAM | AV_OPT_FLAG_VIDEO_PARAM
-#define BLOCK_LCM (int64_t) 476985600
-
-static const AVOption signature_options[] = {
- { "detectmode", "set the detectmode",
- OFFSET(mode), AV_OPT_TYPE_INT, {.i64 = MODE_OFF}, 0, NB_LOOKUP_MODE-1, FLAGS, "mode" },
- { "off", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = MODE_OFF}, 0, 0, .flags = FLAGS, "mode" },
- { "full", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = MODE_FULL}, 0, 0, .flags = FLAGS, "mode" },
- { "fast", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = MODE_FAST}, 0, 0, .flags = FLAGS, "mode" },
- { "nb_inputs", "number of inputs",
- OFFSET(nb_inputs), AV_OPT_TYPE_INT, {.i64 = 1}, 1, INT_MAX, FLAGS },
- { "filename", "filename for output files",
- OFFSET(filename), AV_OPT_TYPE_STRING, {.str = ""}, 0, NB_FORMATS-1, FLAGS },
- { "format", "set output format",
- OFFSET(format), AV_OPT_TYPE_INT, {.i64 = FORMAT_BINARY}, 0, 1, FLAGS , "format" },
- { "binary", 0, 0, AV_OPT_TYPE_CONST, {.i64=FORMAT_BINARY}, 0, 0, FLAGS, "format" },
- { "xml", 0, 0, AV_OPT_TYPE_CONST, {.i64=FORMAT_XML}, 0, 0, FLAGS, "format" },
- { "th_d", "threshold to detect one word as similar",
- OFFSET(thworddist), AV_OPT_TYPE_INT, {.i64 = 9000}, 1, INT_MAX, FLAGS },
- { "th_dc", "threshold to detect all words as similar",
- OFFSET(thcomposdist), AV_OPT_TYPE_INT, {.i64 = 60000}, 1, INT_MAX, FLAGS },
- { "th_xh", "threshold to detect frames as similar",
- OFFSET(thl1), AV_OPT_TYPE_INT, {.i64 = 116}, 1, INT_MAX, FLAGS },
- { "th_di", "minimum length of matching sequence in frames",
- OFFSET(thdi), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, FLAGS },
- { "th_it", "threshold for relation of good to all frames",
- OFFSET(thit), AV_OPT_TYPE_DOUBLE, {.dbl = 0.5}, 0.0, 1.0, FLAGS },
- { NULL }
-};
-
-AVFILTER_DEFINE_CLASS(signature);
-
-static int query_formats(AVFilterContext *ctx)
-{
- /* all formats with a separate gray value */
- static const enum AVPixelFormat pix_fmts[] = {
- AV_PIX_FMT_GRAY8,
- AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV411P,
- AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P,
- AV_PIX_FMT_YUV440P, AV_PIX_FMT_YUV444P,
- AV_PIX_FMT_YUVJ411P, AV_PIX_FMT_YUVJ420P,
- AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ444P,
- AV_PIX_FMT_YUVJ440P,
- AV_PIX_FMT_NV12, AV_PIX_FMT_NV21,
- AV_PIX_FMT_NONE
- };
-
- return ff_set_common_formats(ctx, ff_make_format_list(pix_fmts));
-}
-
-static int config_input(AVFilterLink *inlink)
-{
- AVFilterContext *ctx = inlink->dst;
- SignatureContext *sic = ctx->priv;
- StreamContext *sc = &(sic->streamcontexts[FF_INLINK_IDX(inlink)]);
-
- sc->time_base = inlink->time_base;
- /* test for overflow */
- sc->divide = (((uint64_t) inlink->w/32) * (inlink->w/32 + 1) * (inlink->h/32 * inlink->h/32 + 1) > INT64_MAX / (BLOCK_LCM * 255));
- if (sc->divide) {
- av_log(ctx, AV_LOG_WARNING, "Input dimension too high for precise calculation, numbers will be rounded.\n");
- }
- sc->w = inlink->w;
- sc->h = inlink->h;
- return 0;
-}
-
-static int get_block_size(const Block *b)
-{
- return (b->to.y - b->up.y + 1) * (b->to.x - b->up.x + 1);
-}
-
-static uint64_t get_block_sum(StreamContext *sc, uint64_t intpic[32][32], const Block *b)
-{
- uint64_t sum = 0;
-
- int x0, y0, x1, y1;
-
- x0 = b->up.x;
- y0 = b->up.y;
- x1 = b->to.x;
- y1 = b->to.y;
-
- if (x0-1 >= 0 && y0-1 >= 0) {
- sum = intpic[y1][x1] + intpic[y0-1][x0-1] - intpic[y1][x0-1] - intpic[y0-1][x1];
- } else if (x0-1 >= 0) {
- sum = intpic[y1][x1] - intpic[y1][x0-1];
- } else if (y0-1 >= 0) {
- sum = intpic[y1][x1] - intpic[y0-1][x1];
- } else {
- sum = intpic[y1][x1];
- }
- return sum;
-}
-
-static int cmp(const uint64_t *a, const uint64_t *b)
-{
- return *a < *b ? -1 : ( *a > *b ? 1 : 0 );
-}
-
-/**
- * sets the bit at position pos to 1 in data
- */
-static void set_bit(uint8_t* data, size_t pos)
-{
- uint8_t mask = 1 << 7-(pos%8);
- data[pos/8] |= mask;
-}
-
-static int filter_frame(AVFilterLink *inlink, AVFrame *picref)
-{
- AVFilterContext *ctx = inlink->dst;
- SignatureContext *sic = ctx->priv;
- StreamContext *sc = &(sic->streamcontexts[FF_INLINK_IDX(inlink)]);
- FineSignature* fs;
-
- static const uint8_t pot3[5] = { 3*3*3*3, 3*3*3, 3*3, 3, 1 };
- /* indexes of words : 210,217,219,274,334 44,175,233,270,273 57,70,103,237,269 100,285,295,337,354 101,102,111,275,296
- s2usw = sorted to unsorted wordvec: 44 is at index 5, 57 at index 10...
- */
- static const unsigned int wordvec[25] = {44,57,70,100,101,102,103,111,175,210,217,219,233,237,269,270,273,274,275,285,295,296,334,337,354};
- static const uint8_t s2usw[25] = { 5,10,11, 15, 20, 21, 12, 22, 6, 0, 1, 2, 7, 13, 14, 8, 9, 3, 23, 16, 17, 24, 4, 18, 19};
-
- uint8_t wordt2b[5] = { 0, 0, 0, 0, 0 }; /* word ternary to binary */
- uint64_t intpic[32][32];
- uint64_t rowcount;
- uint8_t *p = picref->data[0];
- int inti, intj;
- int *intjlut;
-
- uint64_t conflist[DIFFELEM_SIZE];
- int f = 0, g = 0, w = 0;
- int32_t dh1 = 1, dh2 = 1, dw1 = 1, dw2 = 1, a, b;
- int64_t denom;
- int i, j, k, ternary;
- uint64_t blocksum;
- int blocksize;
- int64_t th; /* threshold */
- int64_t sum;
-
- int64_t precfactor = (sc->divide) ? 65536 : BLOCK_LCM;
-
- /* initialize fs */
- if (sc->curfinesig) {
- fs = av_mallocz(sizeof(FineSignature));
- if (!fs)
- return AVERROR(ENOMEM);
- sc->curfinesig->next = fs;
- fs->prev = sc->curfinesig;
- sc->curfinesig = fs;
- } else {
- fs = sc->curfinesig = sc->finesiglist;
- sc->curcoarsesig1->first = fs;
- }
-
- fs->pts = picref->pts;
- fs->index = sc->lastindex++;
-
- memset(intpic, 0, sizeof(uint64_t)*32*32);
- intjlut = av_malloc_array(inlink->w, sizeof(int));
- if (!intjlut)
- return AVERROR(ENOMEM);
- for (i = 0; i < inlink->w; i++) {
- intjlut[i] = (i*32)/inlink->w;
- }
-
- for (i = 0; i < inlink->h; i++) {
- inti = (i*32)/inlink->h;
- for (j = 0; j < inlink->w; j++) {
- intj = intjlut[j];
- intpic[inti][intj] += p[j];
- }
- p += picref->linesize[0];
- }
- av_freep(&intjlut);
-
- /* The following calculates a summed area table (intpic) and brings the numbers
- * in intpic to the same denominator.
- * So you only have to handle the numinator in the following sections.
- */
- dh1 = inlink->h / 32;
- if (inlink->h % 32)
- dh2 = dh1 + 1;
- dw1 = inlink->w / 32;
- if (inlink->w % 32)
- dw2 = dw1 + 1;
- denom = (sc->divide) ? dh1 * dh2 * dw1 * dw2 : 1;
-
- for (i = 0; i < 32; i++) {
- rowcount = 0;
- a = 1;
- if (dh2 > 1) {
- a = ((inlink->h*(i+1))%32 == 0) ? (inlink->h*(i+1))/32 - 1 : (inlink->h*(i+1))/32;
- a -= ((inlink->h*i)%32 == 0) ? (inlink->h*i)/32 - 1 : (inlink->h*i)/32;
- a = (a == dh1)? dh2 : dh1;
- }
- for (j = 0; j < 32; j++) {
- b = 1;
- if (dw2 > 1) {
- b = ((inlink->w*(j+1))%32 == 0) ? (inlink->w*(j+1))/32 - 1 : (inlink->w*(j+1))/32;
- b -= ((inlink->w*j)%32 == 0) ? (inlink->w*j)/32 - 1 : (inlink->w*j)/32;
- b = (b == dw1)? dw2 : dw1;
- }
- rowcount += intpic[i][j] * a * b * precfactor / denom;
- if (i > 0) {
- intpic[i][j] = intpic[i-1][j] + rowcount;
- } else {
- intpic[i][j] = rowcount;
- }
- }
- }
-
- denom = (sc->divide) ? 1 : dh1 * dh2 * dw1 * dw2;
-
- for (i = 0; i < ELEMENT_COUNT; i++) {
- const ElemCat* elemcat = elements[i];
- int64_t* elemsignature;
- uint64_t* sortsignature;
-
- elemsignature = av_malloc_array(elemcat->elem_count, sizeof(int64_t));
- if (!elemsignature)
- return AVERROR(ENOMEM);
- sortsignature = av_malloc_array(elemcat->elem_count, sizeof(int64_t));
- if (!sortsignature) {
- av_freep(&elemsignature);
- return AVERROR(ENOMEM);
- }
-
- for (j = 0; j < elemcat->elem_count; j++) {
- blocksum = 0;
- blocksize = 0;
- for (k = 0; k < elemcat->left_count; k++) {
- blocksum += get_block_sum(sc, intpic, &elemcat->blocks[j*elemcat->block_count+k]);
- blocksize += get_block_size(&elemcat->blocks[j*elemcat->block_count+k]);
- }
- sum = blocksum / blocksize;
- if (elemcat->av_elem) {
- sum -= 128 * precfactor * denom;
- } else {
- blocksum = 0;
- blocksize = 0;
- for (; k < elemcat->block_count; k++) {
- blocksum += get_block_sum(sc, intpic, &elemcat->blocks[j*elemcat->block_count+k]);
- blocksize += get_block_size(&elemcat->blocks[j*elemcat->block_count+k]);
- }
- sum -= blocksum / blocksize;
- conflist[g++] = FFABS(sum * 8 / (precfactor * denom));
- }
-
- elemsignature[j] = sum;
- sortsignature[j] = FFABS(sum);
- }
-
- /* get threshold */
- qsort(sortsignature, elemcat->elem_count, sizeof(uint64_t), (void*) cmp);
- th = sortsignature[(int) (elemcat->elem_count*0.333)];
-
- /* ternarize */
- for (j = 0; j < elemcat->elem_count; j++) {
- if (elemsignature[j] < -th) {
- ternary = 0;
- } else if (elemsignature[j] <= th) {
- ternary = 1;
- } else {
- ternary = 2;
- }
- fs->framesig[f/5] += ternary * pot3[f%5];
-
- if (f == wordvec[w]) {
- fs->words[s2usw[w]/5] += ternary * pot3[wordt2b[s2usw[w]/5]++];
- if (w < 24)
- w++;
- }
- f++;
- }
- av_freep(&elemsignature);
- av_freep(&sortsignature);
- }
-
- /* confidence */
- qsort(conflist, DIFFELEM_SIZE, sizeof(uint64_t), (void*) cmp);
- fs->confidence = FFMIN(conflist[DIFFELEM_SIZE/2], 255);
-
- /* coarsesignature */
- if (sc->coarsecount == 0) {
- if (sc->curcoarsesig2) {
- sc->curcoarsesig1 = av_mallocz(sizeof(CoarseSignature));
- if (!sc->curcoarsesig1)
- return AVERROR(ENOMEM);
- sc->curcoarsesig1->first = fs;
- sc->curcoarsesig2->next = sc->curcoarsesig1;
- sc->coarseend = sc->curcoarsesig1;
- }
- }
- if (sc->coarsecount == 45) {
- sc->midcoarse = 1;
- sc->curcoarsesig2 = av_mallocz(sizeof(CoarseSignature));
- if (!sc->curcoarsesig2)
- return AVERROR(ENOMEM);
- sc->curcoarsesig2->first = fs;
- sc->curcoarsesig1->next = sc->curcoarsesig2;
- sc->coarseend = sc->curcoarsesig2;
- }
- for (i = 0; i < 5; i++) {
- set_bit(sc->curcoarsesig1->data[i], fs->words[i]);
- }
- /* assuming the actual frame is the last */
- sc->curcoarsesig1->last = fs;
- if (sc->midcoarse) {
- for (i = 0; i < 5; i++) {
- set_bit(sc->curcoarsesig2->data[i], fs->words[i]);
- }
- sc->curcoarsesig2->last = fs;
- }
-
- sc->coarsecount = (sc->coarsecount+1)%90;
-
- /* debug printing finesignature */
- if (av_log_get_level() == AV_LOG_DEBUG) {
- av_log(ctx, AV_LOG_DEBUG, "input %d, confidence: %d\n", FF_INLINK_IDX(inlink), fs->confidence);
-
- av_log(ctx, AV_LOG_DEBUG, "words:");
- for (i = 0; i < 5; i++) {
- av_log(ctx, AV_LOG_DEBUG, " %d:", fs->words[i] );
- av_log(ctx, AV_LOG_DEBUG, " %d", fs->words[i] / pot3[0] );
- for (j = 1; j < 5; j++)
- av_log(ctx, AV_LOG_DEBUG, ",%d", fs->words[i] % pot3[j-1] / pot3[j] );
- av_log(ctx, AV_LOG_DEBUG, ";");
- }
- av_log(ctx, AV_LOG_DEBUG, "\n");
-
- av_log(ctx, AV_LOG_DEBUG, "framesignature:");
- for (i = 0; i < SIGELEM_SIZE/5; i++) {
- av_log(ctx, AV_LOG_DEBUG, " %d", fs->framesig[i] / pot3[0] );
- for (j = 1; j < 5; j++)
- av_log(ctx, AV_LOG_DEBUG, ",%d", fs->framesig[i] % pot3[j-1] / pot3[j] );
- }
- av_log(ctx, AV_LOG_DEBUG, "\n");
- }
-
- if (FF_INLINK_IDX(inlink) == 0)
- return ff_filter_frame(inlink->dst->outputs[0], picref);
- return 1;
-}
-
-static int xml_export(AVFilterContext *ctx, StreamContext *sc, const char* filename)
-{
- FineSignature* fs;
- CoarseSignature* cs;
- int i, j;
- FILE* f;
- unsigned int pot3[5] = { 3*3*3*3, 3*3*3, 3*3, 3, 1 };
-
- f = fopen(filename, "w");
- if (!f) {
- int err = AVERROR(EINVAL);
- char buf[128];
- av_strerror(err, buf, sizeof(buf));
- av_log(ctx, AV_LOG_ERROR, "cannot open xml file %s: %s\n", filename, buf);
- return err;
- }
-
- /* header */
- fprintf(f, "<?xml version='1.0' encoding='ASCII' ?>\n");
- fprintf(f, "<Mpeg7 xmlns=\"urn:mpeg:mpeg7:schema:2001\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"urn:mpeg:mpeg7:schema:2001 schema/Mpeg7-2001.xsd\">\n");
- fprintf(f, " <DescriptionUnit xsi:type=\"DescriptorCollectionType\">\n");
- fprintf(f, " <Descriptor xsi:type=\"VideoSignatureType\">\n");
- fprintf(f, " <VideoSignatureRegion>\n");
- fprintf(f, " <VideoSignatureSpatialRegion>\n");
- fprintf(f, " <Pixel>0 0 </Pixel>\n");
- fprintf(f, " <Pixel>%d %d </Pixel>\n", sc->w - 1, sc->h - 1);
- fprintf(f, " </VideoSignatureSpatialRegion>\n");
- fprintf(f, " <StartFrameOfSpatialRegion>0</StartFrameOfSpatialRegion>\n");
- /* hoping num is 1, other values are vague */
- fprintf(f, " <MediaTimeUnit>%d</MediaTimeUnit>\n", sc->time_base.den / sc->time_base.num);
- fprintf(f, " <MediaTimeOfSpatialRegion>\n");
- fprintf(f, " <StartMediaTimeOfSpatialRegion>0</StartMediaTimeOfSpatialRegion>\n");
- fprintf(f, " <EndMediaTimeOfSpatialRegion>%" PRIu64 "</EndMediaTimeOfSpatialRegion>\n", sc->coarseend->last->pts);
- fprintf(f, " </MediaTimeOfSpatialRegion>\n");
-
- /* coarsesignatures */
- for (cs = sc->coarsesiglist; cs; cs = cs->next) {
- fprintf(f, " <VSVideoSegment>\n");
- fprintf(f, " <StartFrameOfSegment>%" PRIu32 "</StartFrameOfSegment>\n", cs->first->index);
- fprintf(f, " <EndFrameOfSegment>%" PRIu32 "</EndFrameOfSegment>\n", cs->last->index);
- fprintf(f, " <MediaTimeOfSegment>\n");
- fprintf(f, " <StartMediaTimeOfSegment>%" PRIu64 "</StartMediaTimeOfSegment>\n", cs->first->pts);
- fprintf(f, " <EndMediaTimeOfSegment>%" PRIu64 "</EndMediaTimeOfSegment>\n", cs->last->pts);
- fprintf(f, " </MediaTimeOfSegment>\n");
- for (i = 0; i < 5; i++) {
- fprintf(f, " <BagOfWords>");
- for (j = 0; j < 31; j++) {
- uint8_t n = cs->data[i][j];
- if (j < 30) {
- fprintf(f, "%d %d %d %d %d %d %d %d ", (n & 0x80) >> 7,
- (n & 0x40) >> 6,
- (n & 0x20) >> 5,
- (n & 0x10) >> 4,
- (n & 0x08) >> 3,
- (n & 0x04) >> 2,
- (n & 0x02) >> 1,
- (n & 0x01));
- } else {
- /* print only 3 bit in last byte */
- fprintf(f, "%d %d %d ", (n & 0x80) >> 7,
- (n & 0x40) >> 6,
- (n & 0x20) >> 5);
- }
- }
- fprintf(f, "</BagOfWords>\n");
- }
- fprintf(f, " </VSVideoSegment>\n");
- }
-
- /* finesignatures */
- for (fs = sc->finesiglist; fs; fs = fs->next) {
- fprintf(f, " <VideoFrame>\n");
- fprintf(f, " <MediaTimeOfFrame>%" PRIu64 "</MediaTimeOfFrame>\n", fs->pts);
- /* confidence */
- fprintf(f, " <FrameConfidence>%d</FrameConfidence>\n", fs->confidence);
- /* words */
- fprintf(f, " <Word>");
- for (i = 0; i < 5; i++) {
- fprintf(f, "%d ", fs->words[i]);
- if (i < 4) {
- fprintf(f, " ");
- }
- }
- fprintf(f, "</Word>\n");
- /* framesignature */
- fprintf(f, " <FrameSignature>");
- for (i = 0; i< SIGELEM_SIZE/5; i++) {
- if (i > 0) {
- fprintf(f, " ");
- }
- fprintf(f, "%d ", fs->framesig[i] / pot3[0]);
- for (j = 1; j < 5; j++)
- fprintf(f, " %d ", fs->framesig[i] % pot3[j-1] / pot3[j] );
- }
- fprintf(f, "</FrameSignature>\n");
- fprintf(f, " </VideoFrame>\n");
- }
- fprintf(f, " </VideoSignatureRegion>\n");
- fprintf(f, " </Descriptor>\n");
- fprintf(f, " </DescriptionUnit>\n");
- fprintf(f, "</Mpeg7>\n");
-
- fclose(f);
- return 0;
-}
-
-static int binary_export(AVFilterContext *ctx, StreamContext *sc, const char* filename)
-{
- FILE* f;
- FineSignature* fs;
- CoarseSignature* cs;
- uint32_t numofsegments = (sc->lastindex + 44)/45;
- int i, j;
- PutBitContext buf;
- /* buffer + header + coarsesignatures + finesignature */
- int len = (512 + 6 * 32 + 3*16 + 2 +
- numofsegments * (4*32 + 1 + 5*243) +
- sc->lastindex * (2 + 32 + 6*8 + 608)) / 8;
- uint8_t* buffer = av_malloc_array(len, sizeof(uint8_t));
- if (!buffer)
- return AVERROR(ENOMEM);
-
- f = fopen(filename, "wb");
- if (!f) {
- int err = AVERROR(EINVAL);
- char buf[128];
- av_strerror(err, buf, sizeof(buf));
- av_log(ctx, AV_LOG_ERROR, "cannot open file %s: %s\n", filename, buf);
- av_freep(&buffer);
- return err;
- }
- init_put_bits(&buf, buffer, len);
-
- put_bits32(&buf, 1); /* NumOfSpatial Regions, only 1 supported */
- put_bits(&buf, 1, 1); /* SpatialLocationFlag, always the whole image */
- put_bits32(&buf, 0); /* PixelX,1 PixelY,1, 0,0 */
- put_bits(&buf, 16, sc->w-1 & 0xFFFF); /* PixelX,2 */
- put_bits(&buf, 16, sc->h-1 & 0xFFFF); /* PixelY,2 */
- put_bits32(&buf, 0); /* StartFrameOfSpatialRegion */
- put_bits32(&buf, sc->lastindex); /* NumOfFrames */
- /* hoping num is 1, other values are vague */
- /* den/num might be greater than 16 bit, so cutting it */
- put_bits(&buf, 16, 0xFFFF & (sc->time_base.den / sc->time_base.num)); /* MediaTimeUnit */
- put_bits(&buf, 1, 1); /* MediaTimeFlagOfSpatialRegion */
- put_bits32(&buf, 0); /* StartMediaTimeOfSpatialRegion */
- put_bits32(&buf, 0xFFFFFFFF & sc->coarseend->last->pts); /* EndMediaTimeOfSpatialRegion */
- put_bits32(&buf, numofsegments); /* NumOfSegments */
- /* coarsesignatures */
- for (cs = sc->coarsesiglist; cs; cs = cs->next) {
- put_bits32(&buf, cs->first->index); /* StartFrameOfSegment */
- put_bits32(&buf, cs->last->index); /* EndFrameOfSegment */
- put_bits(&buf, 1, 1); /* MediaTimeFlagOfSegment */
- put_bits32(&buf, 0xFFFFFFFF & cs->first->pts); /* StartMediaTimeOfSegment */
- put_bits32(&buf, 0xFFFFFFFF & cs->last->pts); /* EndMediaTimeOfSegment */
- for (i = 0; i < 5; i++) {
- /* put 243 bits ( = 7 * 32 + 19 = 8 * 28 + 19) into buffer */
- for (j = 0; j < 30; j++) {
- put_bits(&buf, 8, cs->data[i][j]);
- }
- put_bits(&buf, 3, cs->data[i][30] >> 5);
- }
- }
- /* finesignatures */
- put_bits(&buf, 1, 0); /* CompressionFlag, only 0 supported */
- for (fs = sc->finesiglist; fs; fs = fs->next) {
- put_bits(&buf, 1, 1); /* MediaTimeFlagOfFrame */
- put_bits32(&buf, 0xFFFFFFFF & fs->pts); /* MediaTimeOfFrame */
- put_bits(&buf, 8, fs->confidence); /* FrameConfidence */
- for (i = 0; i < 5; i++) {
- put_bits(&buf, 8, fs->words[i]); /* Words */
- }
- /* framesignature */
- for (i = 0; i < SIGELEM_SIZE/5; i++) {
- put_bits(&buf, 8, fs->framesig[i]);
- }
- }
-
- avpriv_align_put_bits(&buf);
- flush_put_bits(&buf);
- fwrite(buffer, 1, put_bits_count(&buf)/8, f);
- fclose(f);
- av_freep(&buffer);
- return 0;
-}
-
-static int export(AVFilterContext *ctx, StreamContext *sc, int input)
-{
- SignatureContext* sic = ctx->priv;
- char filename[1024];
-
- if (sic->nb_inputs > 1) {
- /* error already handled */
- av_assert0(av_get_frame_filename(filename, sizeof(filename), sic->filename, input) == 0);
- } else {
- if (av_strlcpy(filename, sic->filename, sizeof(filename)) >= sizeof(filename))
- return AVERROR(EINVAL);
- }
- if (sic->format == FORMAT_XML) {
- return xml_export(ctx, sc, filename);
- } else {
- return binary_export(ctx, sc, filename);
- }
-}
-
-static int request_frame(AVFilterLink *outlink)
-{
- AVFilterContext *ctx = outlink->src;
- SignatureContext *sic = ctx->priv;
- StreamContext *sc, *sc2;
- MatchingInfo match;
- int i, j, ret;
- int lookup = 1; /* indicates wheather EOF of all files is reached */
-
- /* process all inputs */
- for (i = 0; i < sic->nb_inputs; i++){
- sc = &(sic->streamcontexts[i]);
-
- ret = ff_request_frame(ctx->inputs[i]);
-
- /* return if unexpected error occurs in input stream */
- if (ret < 0 && ret != AVERROR_EOF)
- return ret;
-
- /* export signature at EOF */
- if (ret == AVERROR_EOF && !sc->exported) {
- /* export if wanted */
- if (strlen(sic->filename) > 0) {
- if (export(ctx, sc, i) < 0)
- return ret;
- }
- sc->exported = 1;
- }
- lookup &= sc->exported;
- }
-
- /* signature lookup */
- if (lookup && sic->mode != MODE_OFF) {
- /* iterate over every pair */
- for (i = 0; i < sic->nb_inputs; i++) {
- sc = &(sic->streamcontexts[i]);
- for (j = i+1; j < sic->nb_inputs; j++) {
- sc2 = &(sic->streamcontexts[j]);
- match = lookup_signatures(ctx, sic, sc, sc2, sic->mode);
- if (match.score != 0) {
- av_log(ctx, AV_LOG_INFO, "matching of video %d at %f and %d at %f, %d frames matching\n",
- i, ((double) match.first->pts * sc->time_base.num) / sc->time_base.den,
- j, ((double) match.second->pts * sc2->time_base.num) / sc2->time_base.den,
- match.matchframes);
- if (match.whole)
- av_log(ctx, AV_LOG_INFO, "whole video matching\n");
- } else {
- av_log(ctx, AV_LOG_INFO, "no matching of video %d and %d\n", i, j);
- }
- }
- }
- }
-
- return ret;
-}
-
-static av_cold int init(AVFilterContext *ctx)
-{
-
- SignatureContext *sic = ctx->priv;
- StreamContext *sc;
- int i, ret;
- char tmp[1024];
-
- sic->streamcontexts = av_mallocz(sic->nb_inputs * sizeof(StreamContext));
- if (!sic->streamcontexts)
- return AVERROR(ENOMEM);
-
- for (i = 0; i < sic->nb_inputs; i++) {
- AVFilterPad pad = {
- .type = AVMEDIA_TYPE_VIDEO,
- .name = av_asprintf("in%d", i),
- .config_props = config_input,
- .filter_frame = filter_frame,
- };
-
- if (!pad.name)
- return AVERROR(ENOMEM);
-
- sc = &(sic->streamcontexts[i]);
-
- sc->lastindex = 0;
- sc->finesiglist = av_mallocz(sizeof(FineSignature));
- if (!sc->finesiglist)
- return AVERROR(ENOMEM);
- sc->curfinesig = NULL;
-
- sc->coarsesiglist = av_mallocz(sizeof(CoarseSignature));
- if (!sc->coarsesiglist)
- return AVERROR(ENOMEM);
- sc->curcoarsesig1 = sc->coarsesiglist;
- sc->coarseend = sc->coarsesiglist;
- sc->coarsecount = 0;
- sc->midcoarse = 0;
-
- if ((ret = ff_insert_inpad(ctx, i, &pad)) < 0) {
- av_freep(&pad.name);
- return ret;
- }
- }
-
- /* check filename */
- if (sic->nb_inputs > 1 && strlen(sic->filename) > 0 && av_get_frame_filename(tmp, sizeof(tmp), sic->filename, 0) == -1) {
- av_log(ctx, AV_LOG_ERROR, "The filename must contain %%d or %%0nd, if you have more than one input.\n");
- return AVERROR(EINVAL);
- }
-
- return 0;
-}
-
-
-
-static av_cold void uninit(AVFilterContext *ctx)
-{
- SignatureContext *sic = ctx->priv;
- StreamContext *sc;
- void* tmp;
- FineSignature* finsig;
- CoarseSignature* cousig;
- int i;
-
-
- /* free the lists */
- if (sic->streamcontexts != NULL) {
- for (i = 0; i < sic->nb_inputs; i++) {
- sc = &(sic->streamcontexts[i]);
- finsig = sc->finesiglist;
- cousig = sc->coarsesiglist;
-
- while (finsig) {
- tmp = finsig;
- finsig = finsig->next;
- av_freep(&tmp);
- }
- sc->finesiglist = NULL;
-
- while (cousig) {
- tmp = cousig;
- cousig = cousig->next;
- av_freep(&tmp);
- }
- sc->coarsesiglist = NULL;
- }
- av_freep(&sic->streamcontexts);
- }
-}
-
-static int config_output(AVFilterLink *outlink)
-{
- AVFilterContext *ctx = outlink->src;
- AVFilterLink *inlink = ctx->inputs[0];
-
- outlink->time_base = inlink->time_base;
- outlink->frame_rate = inlink->frame_rate;
- outlink->sample_aspect_ratio = inlink->sample_aspect_ratio;
- outlink->w = inlink->w;
- outlink->h = inlink->h;
-
- return 0;
-}
-
-static const AVFilterPad signature_outputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- .request_frame = request_frame,
- .config_props = config_output,
- },
- { NULL }
-};
-
-AVFilter ff_vf_signature = {
- .name = "signature",
- .description = NULL_IF_CONFIG_SMALL("Calculate the MPEG-7 video signature"),
- .priv_size = sizeof(SignatureContext),
- .priv_class = &signature_class,
- .init = init,
- .uninit = uninit,
- .query_formats = query_formats,
- .outputs = signature_outputs,
- .inputs = NULL,
- .flags = AVFILTER_FLAG_DYNAMIC_INPUTS,
-};
diff --git a/libavfilter/vf_smartblur.c b/libavfilter/vf_smartblur.c
deleted file mode 100644
index 1955ac4..0000000
--- a/libavfilter/vf_smartblur.c
+++ /dev/null
@@ -1,305 +0,0 @@
-/*
- * Copyright (c) 2002 Michael Niedermayer <michaelni@gmx.at>
- * Copyright (c) 2012 Jeremy Tran
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/**
- * @file
- * Apply a smartblur filter to the input video
- * Ported from MPlayer libmpcodecs/vf_smartblur.c by Michael Niedermayer.
- */
-
-#include "libavutil/opt.h"
-#include "libavutil/pixdesc.h"
-#include "libswscale/swscale.h"
-
-#include "avfilter.h"
-#include "formats.h"
-#include "internal.h"
-
-#define RADIUS_MIN 0.1
-#define RADIUS_MAX 5.0
-
-#define STRENGTH_MIN -1.0
-#define STRENGTH_MAX 1.0
-
-#define THRESHOLD_MIN -30
-#define THRESHOLD_MAX 30
-
-typedef struct FilterParam {
- float radius;
- float strength;
- int threshold;
- float quality;
- struct SwsContext *filter_context;
-} FilterParam;
-
-typedef struct SmartblurContext {
- const AVClass *class;
- FilterParam luma;
- FilterParam chroma;
- int hsub;
- int vsub;
- unsigned int sws_flags;
-} SmartblurContext;
-
-#define OFFSET(x) offsetof(SmartblurContext, x)
-#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
-
-static const AVOption smartblur_options[] = {
- { "luma_radius", "set luma radius", OFFSET(luma.radius), AV_OPT_TYPE_FLOAT, {.dbl=1.0}, RADIUS_MIN, RADIUS_MAX, .flags=FLAGS },
- { "lr" , "set luma radius", OFFSET(luma.radius), AV_OPT_TYPE_FLOAT, {.dbl=1.0}, RADIUS_MIN, RADIUS_MAX, .flags=FLAGS },
- { "luma_strength", "set luma strength", OFFSET(luma.strength), AV_OPT_TYPE_FLOAT, {.dbl=1.0}, STRENGTH_MIN, STRENGTH_MAX, .flags=FLAGS },
- { "ls", "set luma strength", OFFSET(luma.strength), AV_OPT_TYPE_FLOAT, {.dbl=1.0}, STRENGTH_MIN, STRENGTH_MAX, .flags=FLAGS },
- { "luma_threshold", "set luma threshold", OFFSET(luma.threshold), AV_OPT_TYPE_INT, {.i64=0}, THRESHOLD_MIN, THRESHOLD_MAX, .flags=FLAGS },
- { "lt", "set luma threshold", OFFSET(luma.threshold), AV_OPT_TYPE_INT, {.i64=0}, THRESHOLD_MIN, THRESHOLD_MAX, .flags=FLAGS },
-
- { "chroma_radius", "set chroma radius", OFFSET(chroma.radius), AV_OPT_TYPE_FLOAT, {.dbl=RADIUS_MIN-1}, RADIUS_MIN-1, RADIUS_MAX, .flags=FLAGS },
- { "cr", "set chroma radius", OFFSET(chroma.radius), AV_OPT_TYPE_FLOAT, {.dbl=RADIUS_MIN-1}, RADIUS_MIN-1, RADIUS_MAX, .flags=FLAGS },
- { "chroma_strength", "set chroma strength", OFFSET(chroma.strength), AV_OPT_TYPE_FLOAT, {.dbl=STRENGTH_MIN-1}, STRENGTH_MIN-1, STRENGTH_MAX, .flags=FLAGS },
- { "cs", "set chroma strength", OFFSET(chroma.strength), AV_OPT_TYPE_FLOAT, {.dbl=STRENGTH_MIN-1}, STRENGTH_MIN-1, STRENGTH_MAX, .flags=FLAGS },
- { "chroma_threshold", "set chroma threshold", OFFSET(chroma.threshold), AV_OPT_TYPE_INT, {.i64=THRESHOLD_MIN-1}, THRESHOLD_MIN-1, THRESHOLD_MAX, .flags=FLAGS },
- { "ct", "set chroma threshold", OFFSET(chroma.threshold), AV_OPT_TYPE_INT, {.i64=THRESHOLD_MIN-1}, THRESHOLD_MIN-1, THRESHOLD_MAX, .flags=FLAGS },
-
- { NULL }
-};
-
-AVFILTER_DEFINE_CLASS(smartblur);
-
-static av_cold int init(AVFilterContext *ctx)
-{
- SmartblurContext *s = ctx->priv;
-
- /* make chroma default to luma values, if not explicitly set */
- if (s->chroma.radius < RADIUS_MIN)
- s->chroma.radius = s->luma.radius;
- if (s->chroma.strength < STRENGTH_MIN)
- s->chroma.strength = s->luma.strength;
- if (s->chroma.threshold < THRESHOLD_MIN)
- s->chroma.threshold = s->luma.threshold;
-
- s->luma.quality = s->chroma.quality = 3.0;
- s->sws_flags = SWS_BICUBIC;
-
- av_log(ctx, AV_LOG_VERBOSE,
- "luma_radius:%f luma_strength:%f luma_threshold:%d "
- "chroma_radius:%f chroma_strength:%f chroma_threshold:%d\n",
- s->luma.radius, s->luma.strength, s->luma.threshold,
- s->chroma.radius, s->chroma.strength, s->chroma.threshold);
-
- return 0;
-}
-
-static av_cold void uninit(AVFilterContext *ctx)
-{
- SmartblurContext *s = ctx->priv;
-
- sws_freeContext(s->luma.filter_context);
- sws_freeContext(s->chroma.filter_context);
-}
-
-static int query_formats(AVFilterContext *ctx)
-{
- static const enum AVPixelFormat pix_fmts[] = {
- AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV422P,
- AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV411P,
- AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV440P,
- AV_PIX_FMT_GRAY8,
- AV_PIX_FMT_NONE
- };
-
- AVFilterFormats *fmts_list = ff_make_format_list(pix_fmts);
- if (!fmts_list)
- return AVERROR(ENOMEM);
- return ff_set_common_formats(ctx, fmts_list);
-}
-
-static int alloc_sws_context(FilterParam *f, int width, int height, unsigned int flags)
-{
- SwsVector *vec;
- SwsFilter sws_filter;
-
- vec = sws_getGaussianVec(f->radius, f->quality);
-
- if (!vec)
- return AVERROR(EINVAL);
-
- sws_scaleVec(vec, f->strength);
- vec->coeff[vec->length / 2] += 1.0 - f->strength;
- sws_filter.lumH = sws_filter.lumV = vec;
- sws_filter.chrH = sws_filter.chrV = NULL;
- f->filter_context = sws_getCachedContext(NULL,
- width, height, AV_PIX_FMT_GRAY8,
- width, height, AV_PIX_FMT_GRAY8,
- flags, &sws_filter, NULL, NULL);
-
- sws_freeVec(vec);
-
- if (!f->filter_context)
- return AVERROR(EINVAL);
-
- return 0;
-}
-
-static int config_props(AVFilterLink *inlink)
-{
- SmartblurContext *s = inlink->dst->priv;
- const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
-
- s->hsub = desc->log2_chroma_w;
- s->vsub = desc->log2_chroma_h;
-
- alloc_sws_context(&s->luma, inlink->w, inlink->h, s->sws_flags);
- alloc_sws_context(&s->chroma,
- AV_CEIL_RSHIFT(inlink->w, s->hsub),
- AV_CEIL_RSHIFT(inlink->h, s->vsub),
- s->sws_flags);
-
- return 0;
-}
-
-static void blur(uint8_t *dst, const int dst_linesize,
- const uint8_t *src, const int src_linesize,
- const int w, const int h, const int threshold,
- struct SwsContext *filter_context)
-{
- int x, y;
- int orig, filtered;
- int diff;
- /* Declare arrays of 4 to get aligned data */
- const uint8_t* const src_array[4] = {src};
- uint8_t *dst_array[4] = {dst};
- int src_linesize_array[4] = {src_linesize};
- int dst_linesize_array[4] = {dst_linesize};
-
- sws_scale(filter_context, src_array, src_linesize_array,
- 0, h, dst_array, dst_linesize_array);
-
- if (threshold > 0) {
- for (y = 0; y < h; ++y) {
- for (x = 0; x < w; ++x) {
- orig = src[x + y * src_linesize];
- filtered = dst[x + y * dst_linesize];
- diff = orig - filtered;
-
- if (diff > 0) {
- if (diff > 2 * threshold)
- dst[x + y * dst_linesize] = orig;
- else if (diff > threshold)
- /* add 'diff' and subtract 'threshold' from 'filtered' */
- dst[x + y * dst_linesize] = orig - threshold;
- } else {
- if (-diff > 2 * threshold)
- dst[x + y * dst_linesize] = orig;
- else if (-diff > threshold)
- /* add 'diff' and 'threshold' to 'filtered' */
- dst[x + y * dst_linesize] = orig + threshold;
- }
- }
- }
- } else if (threshold < 0) {
- for (y = 0; y < h; ++y) {
- for (x = 0; x < w; ++x) {
- orig = src[x + y * src_linesize];
- filtered = dst[x + y * dst_linesize];
- diff = orig - filtered;
-
- if (diff > 0) {
- if (diff <= -threshold)
- dst[x + y * dst_linesize] = orig;
- else if (diff <= -2 * threshold)
- /* subtract 'diff' and 'threshold' from 'orig' */
- dst[x + y * dst_linesize] = filtered - threshold;
- } else {
- if (diff >= threshold)
- dst[x + y * dst_linesize] = orig;
- else if (diff >= 2 * threshold)
- /* add 'threshold' and subtract 'diff' from 'orig' */
- dst[x + y * dst_linesize] = filtered + threshold;
- }
- }
- }
- }
-}
-
-static int filter_frame(AVFilterLink *inlink, AVFrame *inpic)
-{
- SmartblurContext *s = inlink->dst->priv;
- AVFilterLink *outlink = inlink->dst->outputs[0];
- AVFrame *outpic;
- int cw = AV_CEIL_RSHIFT(inlink->w, s->hsub);
- int ch = AV_CEIL_RSHIFT(inlink->h, s->vsub);
-
- outpic = ff_get_video_buffer(outlink, outlink->w, outlink->h);
- if (!outpic) {
- av_frame_free(&inpic);
- return AVERROR(ENOMEM);
- }
- av_frame_copy_props(outpic, inpic);
-
- blur(outpic->data[0], outpic->linesize[0],
- inpic->data[0], inpic->linesize[0],
- inlink->w, inlink->h, s->luma.threshold,
- s->luma.filter_context);
-
- if (inpic->data[2]) {
- blur(outpic->data[1], outpic->linesize[1],
- inpic->data[1], inpic->linesize[1],
- cw, ch, s->chroma.threshold,
- s->chroma.filter_context);
- blur(outpic->data[2], outpic->linesize[2],
- inpic->data[2], inpic->linesize[2],
- cw, ch, s->chroma.threshold,
- s->chroma.filter_context);
- }
-
- av_frame_free(&inpic);
- return ff_filter_frame(outlink, outpic);
-}
-
-static const AVFilterPad smartblur_inputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- .filter_frame = filter_frame,
- .config_props = config_props,
- },
- { NULL }
-};
-
-static const AVFilterPad smartblur_outputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- },
- { NULL }
-};
-
-AVFilter ff_vf_smartblur = {
- .name = "smartblur",
- .description = NULL_IF_CONFIG_SMALL("Blur the input video without impacting the outlines."),
- .priv_size = sizeof(SmartblurContext),
- .init = init,
- .uninit = uninit,
- .query_formats = query_formats,
- .inputs = smartblur_inputs,
- .outputs = smartblur_outputs,
- .priv_class = &smartblur_class,
- .flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
-};
diff --git a/libavfilter/vf_spp.c b/libavfilter/vf_spp.c
deleted file mode 100644
index 7381938..0000000
--- a/libavfilter/vf_spp.c
+++ /dev/null
@@ -1,530 +0,0 @@
-/*
- * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
- * Copyright (c) 2013 Clément Bœsch <u pkh me>
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/**
- * @file
- * Simple post processing filter
- *
- * This implementation is based on an algorithm described in
- * "Aria Nosratinia Embedded Post-Processing for
- * Enhancement of Compressed Images (1999)"
- *
- * Originally written by Michael Niedermayer for the MPlayer project, and
- * ported by Clément Bœsch for FFmpeg.
- */
-
-#include "libavutil/avassert.h"
-#include "libavutil/imgutils.h"
-#include "libavutil/opt.h"
-#include "libavutil/pixdesc.h"
-#include "internal.h"
-#include "vf_spp.h"
-
-enum mode {
- MODE_HARD,
- MODE_SOFT,
- NB_MODES
-};
-
-static const AVClass *child_class_next(const AVClass *prev)
-{
- return prev ? NULL : avcodec_dct_get_class();
-}
-
-static void *child_next(void *obj, void *prev)
-{
- SPPContext *s = obj;
- return prev ? NULL : s->dct;
-}
-
-#define OFFSET(x) offsetof(SPPContext, x)
-#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
-#define TFLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
-static const AVOption spp_options[] = {
- { "quality", "set quality", OFFSET(log2_count), AV_OPT_TYPE_INT, {.i64 = 3}, 0, MAX_LEVEL, TFLAGS },
- { "qp", "force a constant quantizer parameter", OFFSET(qp), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 63, FLAGS },
- { "mode", "set thresholding mode", OFFSET(mode), AV_OPT_TYPE_INT, {.i64 = MODE_HARD}, 0, NB_MODES - 1, FLAGS, "mode" },
- { "hard", "hard thresholding", 0, AV_OPT_TYPE_CONST, {.i64 = MODE_HARD}, INT_MIN, INT_MAX, FLAGS, "mode" },
- { "soft", "soft thresholding", 0, AV_OPT_TYPE_CONST, {.i64 = MODE_SOFT}, INT_MIN, INT_MAX, FLAGS, "mode" },
- { "use_bframe_qp", "use B-frames' QP", OFFSET(use_bframe_qp), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, FLAGS },
- { NULL }
-};
-
-static const AVClass spp_class = {
- .class_name = "spp",
- .item_name = av_default_item_name,
- .option = spp_options,
- .version = LIBAVUTIL_VERSION_INT,
- .category = AV_CLASS_CATEGORY_FILTER,
- .child_class_next = child_class_next,
- .child_next = child_next,
-};
-
-// XXX: share between filters?
-DECLARE_ALIGNED(8, static const uint8_t, ldither)[8][8] = {
- { 0, 48, 12, 60, 3, 51, 15, 63 },
- { 32, 16, 44, 28, 35, 19, 47, 31 },
- { 8, 56, 4, 52, 11, 59, 7, 55 },
- { 40, 24, 36, 20, 43, 27, 39, 23 },
- { 2, 50, 14, 62, 1, 49, 13, 61 },
- { 34, 18, 46, 30, 33, 17, 45, 29 },
- { 10, 58, 6, 54, 9, 57, 5, 53 },
- { 42, 26, 38, 22, 41, 25, 37, 21 },
-};
-
-static const uint8_t offset[127][2] = {
- {0,0},
- {0,0}, {4,4}, // quality = 1
- {0,0}, {2,2}, {6,4}, {4,6}, // quality = 2
- {0,0}, {5,1}, {2,2}, {7,3}, {4,4}, {1,5}, {6,6}, {3,7}, // quality = 3
-
- {0,0}, {4,0}, {1,1}, {5,1}, {3,2}, {7,2}, {2,3}, {6,3}, // quality = 4
- {0,4}, {4,4}, {1,5}, {5,5}, {3,6}, {7,6}, {2,7}, {6,7},
-
- {0,0}, {0,2}, {0,4}, {0,6}, {1,1}, {1,3}, {1,5}, {1,7}, // quality = 5
- {2,0}, {2,2}, {2,4}, {2,6}, {3,1}, {3,3}, {3,5}, {3,7},
- {4,0}, {4,2}, {4,4}, {4,6}, {5,1}, {5,3}, {5,5}, {5,7},
- {6,0}, {6,2}, {6,4}, {6,6}, {7,1}, {7,3}, {7,5}, {7,7},
-
- {0,0}, {4,4}, {0,4}, {4,0}, {2,2}, {6,6}, {2,6}, {6,2}, // quality = 6
- {0,2}, {4,6}, {0,6}, {4,2}, {2,0}, {6,4}, {2,4}, {6,0},
- {1,1}, {5,5}, {1,5}, {5,1}, {3,3}, {7,7}, {3,7}, {7,3},
- {1,3}, {5,7}, {1,7}, {5,3}, {3,1}, {7,5}, {3,5}, {7,1},
- {0,1}, {4,5}, {0,5}, {4,1}, {2,3}, {6,7}, {2,7}, {6,3},
- {0,3}, {4,7}, {0,7}, {4,3}, {2,1}, {6,5}, {2,5}, {6,1},
- {1,0}, {5,4}, {1,4}, {5,0}, {3,2}, {7,6}, {3,6}, {7,2},
- {1,2}, {5,6}, {1,6}, {5,2}, {3,0}, {7,4}, {3,4}, {7,0},
-};
-
-static void hardthresh_c(int16_t dst[64], const int16_t src[64],
- int qp, const uint8_t *permutation)
-{
- int i;
- int bias = 0; // FIXME
-
- unsigned threshold1 = qp * ((1<<4) - bias) - 1;
- unsigned threshold2 = threshold1 << 1;
-
- memset(dst, 0, 64 * sizeof(dst[0]));
- dst[0] = (src[0] + 4) >> 3;
-
- for (i = 1; i < 64; i++) {
- int level = src[i];
- if (((unsigned)(level + threshold1)) > threshold2) {
- const int j = permutation[i];
- dst[j] = (level + 4) >> 3;
- }
- }
-}
-
-static void softthresh_c(int16_t dst[64], const int16_t src[64],
- int qp, const uint8_t *permutation)
-{
- int i;
- int bias = 0; //FIXME
-
- unsigned threshold1 = qp * ((1<<4) - bias) - 1;
- unsigned threshold2 = threshold1 << 1;
-
- memset(dst, 0, 64 * sizeof(dst[0]));
- dst[0] = (src[0] + 4) >> 3;
-
- for (i = 1; i < 64; i++) {
- int level = src[i];
- if (((unsigned)(level + threshold1)) > threshold2) {
- const int j = permutation[i];
- if (level > 0) dst[j] = (level - threshold1 + 4) >> 3;
- else dst[j] = (level + threshold1 + 4) >> 3;
- }
- }
-}
-
-static void store_slice_c(uint8_t *dst, const int16_t *src,
- int dst_linesize, int src_linesize,
- int width, int height, int log2_scale,
- const uint8_t dither[8][8])
-{
- int y, x;
-
-#define STORE(pos) do { \
- temp = ((src[x + y*src_linesize + pos] << log2_scale) + d[pos]) >> 6; \
- if (temp & 0x100) \
- temp = ~(temp >> 31); \
- dst[x + y*dst_linesize + pos] = temp; \
-} while (0)
-
- for (y = 0; y < height; y++) {
- const uint8_t *d = dither[y];
- for (x = 0; x < width; x += 8) {
- int temp;
- STORE(0);
- STORE(1);
- STORE(2);
- STORE(3);
- STORE(4);
- STORE(5);
- STORE(6);
- STORE(7);
- }
- }
-}
-
-static void store_slice16_c(uint16_t *dst, const int16_t *src,
- int dst_linesize, int src_linesize,
- int width, int height, int log2_scale,
- const uint8_t dither[8][8], int depth)
-{
- int y, x;
- unsigned int mask = -1<<depth;
-
-#define STORE16(pos) do { \
- temp = ((src[x + y*src_linesize + pos] << log2_scale) + (d[pos]>>1)) >> 5; \
- if (temp & mask ) \
- temp = ~(temp >> 31); \
- dst[x + y*dst_linesize + pos] = temp; \
-} while (0)
-
- for (y = 0; y < height; y++) {
- const uint8_t *d = dither[y];
- for (x = 0; x < width; x += 8) {
- int temp;
- STORE16(0);
- STORE16(1);
- STORE16(2);
- STORE16(3);
- STORE16(4);
- STORE16(5);
- STORE16(6);
- STORE16(7);
- }
- }
-}
-
-static inline void add_block(uint16_t *dst, int linesize, const int16_t block[64])
-{
- int y;
-
- for (y = 0; y < 8; y++) {
- *(uint32_t *)&dst[0 + y*linesize] += *(uint32_t *)&block[0 + y*8];
- *(uint32_t *)&dst[2 + y*linesize] += *(uint32_t *)&block[2 + y*8];
- *(uint32_t *)&dst[4 + y*linesize] += *(uint32_t *)&block[4 + y*8];
- *(uint32_t *)&dst[6 + y*linesize] += *(uint32_t *)&block[6 + y*8];
- }
-}
-
-static void filter(SPPContext *p, uint8_t *dst, uint8_t *src,
- int dst_linesize, int src_linesize, int width, int height,
- const uint8_t *qp_table, int qp_stride, int is_luma, int depth)
-{
- int x, y, i;
- const int count = 1 << p->log2_count;
- const int linesize = is_luma ? p->temp_linesize : FFALIGN(width+16, 16);
- DECLARE_ALIGNED(16, uint64_t, block_align)[32];
- int16_t *block = (int16_t *)block_align;
- int16_t *block2 = (int16_t *)(block_align + 16);
- uint16_t *psrc16 = (uint16_t*)p->src;
- const int sample_bytes = (depth+7) / 8;
-
- for (y = 0; y < height; y++) {
- int index = 8 + 8*linesize + y*linesize;
- memcpy(p->src + index*sample_bytes, src + y*src_linesize, width*sample_bytes);
- if (sample_bytes == 1) {
- for (x = 0; x < 8; x++) {
- p->src[index - x - 1] = p->src[index + x ];
- p->src[index + width + x ] = p->src[index + width - x - 1];
- }
- } else {
- for (x = 0; x < 8; x++) {
- psrc16[index - x - 1] = psrc16[index + x ];
- psrc16[index + width + x ] = psrc16[index + width - x - 1];
- }
- }
- }
- for (y = 0; y < 8; y++) {
- memcpy(p->src + ( 7-y)*linesize * sample_bytes, p->src + ( y+8)*linesize * sample_bytes, linesize * sample_bytes);
- memcpy(p->src + (height+8+y)*linesize * sample_bytes, p->src + (height-y+7)*linesize * sample_bytes, linesize * sample_bytes);
- }
-
- for (y = 0; y < height + 8; y += 8) {
- memset(p->temp + (8 + y) * linesize, 0, 8 * linesize * sizeof(*p->temp));
- for (x = 0; x < width + 8; x += 8) {
- int qp;
-
- if (p->qp) {
- qp = p->qp;
- } else{
- const int qps = 3 + is_luma;
- qp = qp_table[(FFMIN(x, width - 1) >> qps) + (FFMIN(y, height - 1) >> qps) * qp_stride];
- qp = FFMAX(1, ff_norm_qscale(qp, p->qscale_type));
- }
- for (i = 0; i < count; i++) {
- const int x1 = x + offset[i + count - 1][0];
- const int y1 = y + offset[i + count - 1][1];
- const int index = x1 + y1*linesize;
- p->dct->get_pixels(block, p->src + sample_bytes*index, sample_bytes*linesize);
- p->dct->fdct(block);
- p->requantize(block2, block, qp, p->dct->idct_permutation);
- p->dct->idct(block2);
- add_block(p->temp + index, linesize, block2);
- }
- }
- if (y) {
- if (sample_bytes == 1) {
- p->store_slice(dst + (y - 8) * dst_linesize, p->temp + 8 + y*linesize,
- dst_linesize, linesize, width,
- FFMIN(8, height + 8 - y), MAX_LEVEL - p->log2_count,
- ldither);
- } else {
- store_slice16_c((uint16_t*)(dst + (y - 8) * dst_linesize), p->temp + 8 + y*linesize,
- dst_linesize/2, linesize, width,
- FFMIN(8, height + 8 - y), MAX_LEVEL - p->log2_count,
- ldither, depth);
- }
- }
- }
-}
-
-static int query_formats(AVFilterContext *ctx)
-{
- static const enum AVPixelFormat pix_fmts[] = {
- AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV422P,
- AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV411P,
- AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV440P,
- AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUVJ422P,
- AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ440P,
- AV_PIX_FMT_YUV444P10, AV_PIX_FMT_YUV422P10,
- AV_PIX_FMT_YUV420P10,
- AV_PIX_FMT_YUV444P9, AV_PIX_FMT_YUV422P9,
- AV_PIX_FMT_YUV420P9,
- AV_PIX_FMT_GRAY8,
- AV_PIX_FMT_GBRP,
- AV_PIX_FMT_GBRP9,
- AV_PIX_FMT_GBRP10,
- AV_PIX_FMT_NONE
- };
-
- AVFilterFormats *fmts_list = ff_make_format_list(pix_fmts);
- if (!fmts_list)
- return AVERROR(ENOMEM);
- return ff_set_common_formats(ctx, fmts_list);
-}
-
-static int config_input(AVFilterLink *inlink)
-{
- SPPContext *s = inlink->dst->priv;
- const int h = FFALIGN(inlink->h + 16, 16);
- const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
- const int bps = desc->comp[0].depth;
-
- av_opt_set_int(s->dct, "bits_per_sample", bps, 0);
- avcodec_dct_init(s->dct);
-
- if (ARCH_X86)
- ff_spp_init_x86(s);
-
- s->hsub = desc->log2_chroma_w;
- s->vsub = desc->log2_chroma_h;
- s->temp_linesize = FFALIGN(inlink->w + 16, 16);
- s->temp = av_malloc_array(s->temp_linesize, h * sizeof(*s->temp));
- s->src = av_malloc_array(s->temp_linesize, h * sizeof(*s->src) * 2);
-
- if (!s->temp || !s->src)
- return AVERROR(ENOMEM);
- return 0;
-}
-
-static int filter_frame(AVFilterLink *inlink, AVFrame *in)
-{
- AVFilterContext *ctx = inlink->dst;
- SPPContext *s = ctx->priv;
- AVFilterLink *outlink = ctx->outputs[0];
- AVFrame *out = in;
- int qp_stride = 0;
- const int8_t *qp_table = NULL;
- const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
- const int depth = desc->comp[0].depth;
-
- /* if we are not in a constant user quantizer mode and we don't want to use
- * the quantizers from the B-frames (B-frames often have a higher QP), we
- * need to save the qp table from the last non B-frame; this is what the
- * following code block does */
- if (!s->qp) {
- qp_table = av_frame_get_qp_table(in, &qp_stride, &s->qscale_type);
-
- if (qp_table && !s->use_bframe_qp && in->pict_type != AV_PICTURE_TYPE_B) {
- int w, h;
-
- /* if the qp stride is not set, it means the QP are only defined on
- * a line basis */
- if (!qp_stride) {
- w = AV_CEIL_RSHIFT(inlink->w, 4);
- h = 1;
- } else {
- w = qp_stride;
- h = AV_CEIL_RSHIFT(inlink->h, 4);
- }
-
- if (w * h > s->non_b_qp_alloc_size) {
- int ret = av_reallocp_array(&s->non_b_qp_table, w, h);
- if (ret < 0) {
- s->non_b_qp_alloc_size = 0;
- return ret;
- }
- s->non_b_qp_alloc_size = w * h;
- }
-
- av_assert0(w * h <= s->non_b_qp_alloc_size);
- memcpy(s->non_b_qp_table, qp_table, w * h);
- }
- }
-
- if (s->log2_count && !ctx->is_disabled) {
- if (!s->use_bframe_qp && s->non_b_qp_table)
- qp_table = s->non_b_qp_table;
-
- if (qp_table || s->qp) {
- const int cw = AV_CEIL_RSHIFT(inlink->w, s->hsub);
- const int ch = AV_CEIL_RSHIFT(inlink->h, s->vsub);
-
- /* get a new frame if in-place is not possible or if the dimensions
- * are not multiple of 8 */
- if (!av_frame_is_writable(in) || (inlink->w & 7) || (inlink->h & 7)) {
- const int aligned_w = FFALIGN(inlink->w, 8);
- const int aligned_h = FFALIGN(inlink->h, 8);
-
- out = ff_get_video_buffer(outlink, aligned_w, aligned_h);
- if (!out) {
- av_frame_free(&in);
- return AVERROR(ENOMEM);
- }
- av_frame_copy_props(out, in);
- out->width = in->width;
- out->height = in->height;
- }
-
- filter(s, out->data[0], in->data[0], out->linesize[0], in->linesize[0], inlink->w, inlink->h, qp_table, qp_stride, 1, depth);
-
- if (out->data[2]) {
- filter(s, out->data[1], in->data[1], out->linesize[1], in->linesize[1], cw, ch, qp_table, qp_stride, 0, depth);
- filter(s, out->data[2], in->data[2], out->linesize[2], in->linesize[2], cw, ch, qp_table, qp_stride, 0, depth);
- }
- emms_c();
- }
- }
-
- if (in != out) {
- if (in->data[3])
- av_image_copy_plane(out->data[3], out->linesize[3],
- in ->data[3], in ->linesize[3],
- inlink->w, inlink->h);
- av_frame_free(&in);
- }
- return ff_filter_frame(outlink, out);
-}
-
-static int process_command(AVFilterContext *ctx, const char *cmd, const char *args,
- char *res, int res_len, int flags)
-{
- SPPContext *s = ctx->priv;
-
- if (!strcmp(cmd, "level") || !strcmp(cmd, "quality")) {
- if (!strcmp(args, "max"))
- s->log2_count = MAX_LEVEL;
- else
- s->log2_count = av_clip(strtol(args, NULL, 10), 0, MAX_LEVEL);
- return 0;
- }
- return AVERROR(ENOSYS);
-}
-
-static av_cold int init_dict(AVFilterContext *ctx, AVDictionary **opts)
-{
- SPPContext *s = ctx->priv;
- int ret;
-
- s->avctx = avcodec_alloc_context3(NULL);
- s->dct = avcodec_dct_alloc();
- if (!s->avctx || !s->dct)
- return AVERROR(ENOMEM);
-
- if (opts) {
- AVDictionaryEntry *e = NULL;
-
- while ((e = av_dict_get(*opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
- if ((ret = av_opt_set(s->dct, e->key, e->value, 0)) < 0)
- return ret;
- }
- av_dict_free(opts);
- }
-
- s->store_slice = store_slice_c;
- switch (s->mode) {
- case MODE_HARD: s->requantize = hardthresh_c; break;
- case MODE_SOFT: s->requantize = softthresh_c; break;
- }
- return 0;
-}
-
-static av_cold void uninit(AVFilterContext *ctx)
-{
- SPPContext *s = ctx->priv;
-
- av_freep(&s->temp);
- av_freep(&s->src);
- if (s->avctx) {
- avcodec_close(s->avctx);
- av_freep(&s->avctx);
- }
- av_freep(&s->dct);
- av_freep(&s->non_b_qp_table);
-}
-
-static const AVFilterPad spp_inputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- .config_props = config_input,
- .filter_frame = filter_frame,
- },
- { NULL }
-};
-
-static const AVFilterPad spp_outputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- },
- { NULL }
-};
-
-AVFilter ff_vf_spp = {
- .name = "spp",
- .description = NULL_IF_CONFIG_SMALL("Apply a simple post processing filter."),
- .priv_size = sizeof(SPPContext),
- .init_dict = init_dict,
- .uninit = uninit,
- .query_formats = query_formats,
- .inputs = spp_inputs,
- .outputs = spp_outputs,
- .process_command = process_command,
- .priv_class = &spp_class,
- .flags = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL,
-};
diff --git a/libavfilter/vf_spp.h b/libavfilter/vf_spp.h
deleted file mode 100644
index c03073a..0000000
--- a/libavfilter/vf_spp.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
- * Copyright (c) 2013 Clément Bœsch
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef AVFILTER_SPP_H
-#define AVFILTER_SPP_H
-
-#include "libavcodec/avcodec.h"
-#include "libavcodec/avdct.h"
-#include "avfilter.h"
-
-#define MAX_LEVEL 6 /* quality levels */
-
-typedef struct SPPContext {
- const AVClass *av_class;
-
- int log2_count;
- int qp;
- int mode;
- int qscale_type;
- int temp_linesize;
- uint8_t *src;
- uint16_t *temp;
- AVCodecContext *avctx;
- AVDCT *dct;
- int8_t *non_b_qp_table;
- int non_b_qp_alloc_size;
- int use_bframe_qp;
- int hsub, vsub;
-
- void (*store_slice)(uint8_t *dst, const int16_t *src,
- int dst_stride, int src_stride,
- int width, int height, int log2_scale,
- const uint8_t dither[8][8]);
-
- void (*requantize)(int16_t dst[64], const int16_t src[64],
- int qp, const uint8_t *permutation);
-} SPPContext;
-
-void ff_spp_init_x86(SPPContext *s);
-
-#endif /* AVFILTER_SPP_H */
diff --git a/libavfilter/vf_stereo3d.c b/libavfilter/vf_stereo3d.c
deleted file mode 100644
index ff17b07..0000000
--- a/libavfilter/vf_stereo3d.c
+++ /dev/null
@@ -1,1125 +0,0 @@
-/*
- * Copyright (c) 2010 Gordon Schmidt <gordon.schmidt <at> s2000.tu-chemnitz.de>
- * Copyright (c) 2013-2015 Paul B Mahol
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#include "libavutil/avassert.h"
-#include "libavutil/imgutils.h"
-#include "libavutil/intreadwrite.h"
-#include "libavutil/opt.h"
-#include "libavutil/parseutils.h"
-#include "libavutil/pixdesc.h"
-#include "avfilter.h"
-#include "drawutils.h"
-#include "formats.h"
-#include "internal.h"
-#include "video.h"
-#include "stereo3d.h"
-
-enum StereoCode {
- ANAGLYPH_RC_GRAY, // anaglyph red/cyan gray
- ANAGLYPH_RC_HALF, // anaglyph red/cyan half colored
- ANAGLYPH_RC_COLOR, // anaglyph red/cyan colored
- ANAGLYPH_RC_DUBOIS, // anaglyph red/cyan dubois
- ANAGLYPH_GM_GRAY, // anaglyph green/magenta gray
- ANAGLYPH_GM_HALF, // anaglyph green/magenta half colored
- ANAGLYPH_GM_COLOR, // anaglyph green/magenta colored
- ANAGLYPH_GM_DUBOIS, // anaglyph green/magenta dubois
- ANAGLYPH_YB_GRAY, // anaglyph yellow/blue gray
- ANAGLYPH_YB_HALF, // anaglyph yellow/blue half colored
- ANAGLYPH_YB_COLOR, // anaglyph yellow/blue colored
- ANAGLYPH_YB_DUBOIS, // anaglyph yellow/blue dubois
- ANAGLYPH_RB_GRAY, // anaglyph red/blue gray
- ANAGLYPH_RG_GRAY, // anaglyph red/green gray
- MONO_L, // mono output for debugging (left eye only)
- MONO_R, // mono output for debugging (right eye only)
- INTERLEAVE_ROWS_LR, // row-interleave (left eye has top row)
- INTERLEAVE_ROWS_RL, // row-interleave (right eye has top row)
- SIDE_BY_SIDE_LR, // side by side parallel (left eye left, right eye right)
- SIDE_BY_SIDE_RL, // side by side crosseye (right eye left, left eye right)
- SIDE_BY_SIDE_2_LR, // side by side parallel with half width resolution
- SIDE_BY_SIDE_2_RL, // side by side crosseye with half width resolution
- ABOVE_BELOW_LR, // above-below (left eye above, right eye below)
- ABOVE_BELOW_RL, // above-below (right eye above, left eye below)
- ABOVE_BELOW_2_LR, // above-below with half height resolution
- ABOVE_BELOW_2_RL, // above-below with half height resolution
- ALTERNATING_LR, // alternating frames (left eye first, right eye second)
- ALTERNATING_RL, // alternating frames (right eye first, left eye second)
- CHECKERBOARD_LR, // checkerboard pattern (left eye first, right eye second)
- CHECKERBOARD_RL, // checkerboard pattern (right eye first, left eye second)
- INTERLEAVE_COLS_LR, // column-interleave (left eye first, right eye second)
- INTERLEAVE_COLS_RL, // column-interleave (right eye first, left eye second)
- HDMI, // HDMI frame pack (left eye first, right eye second)
- STEREO_CODE_COUNT // TODO: needs autodetection
-};
-
-typedef struct StereoComponent {
- int format; ///< StereoCode
- int width, height;
- int off_left, off_right;
- int off_lstep, off_rstep;
- int row_left, row_right;
- int row_step;
-} StereoComponent;
-
-static const int ana_coeff[][3][6] = {
- [ANAGLYPH_RB_GRAY] =
- {{19595, 38470, 7471, 0, 0, 0},
- { 0, 0, 0, 0, 0, 0},
- { 0, 0, 0, 19595, 38470, 7471}},
- [ANAGLYPH_RG_GRAY] =
- {{19595, 38470, 7471, 0, 0, 0},
- { 0, 0, 0, 19595, 38470, 7471},
- { 0, 0, 0, 0, 0, 0}},
- [ANAGLYPH_RC_GRAY] =
- {{19595, 38470, 7471, 0, 0, 0},
- { 0, 0, 0, 19595, 38470, 7471},
- { 0, 0, 0, 19595, 38470, 7471}},
- [ANAGLYPH_RC_HALF] =
- {{19595, 38470, 7471, 0, 0, 0},
- { 0, 0, 0, 0, 65536, 0},
- { 0, 0, 0, 0, 0, 65536}},
- [ANAGLYPH_RC_COLOR] =
- {{65536, 0, 0, 0, 0, 0},
- { 0, 0, 0, 0, 65536, 0},
- { 0, 0, 0, 0, 0, 65536}},
- [ANAGLYPH_RC_DUBOIS] =
- {{29884, 32768, 11534, -2818, -5767, -131},
- {-2621, -2490, -1049, 24773, 48103, -1180},
- { -983, -1376, -328, -4719, -7406, 80347}},
- [ANAGLYPH_GM_GRAY] =
- {{ 0, 0, 0, 19595, 38470, 7471},
- {19595, 38470, 7471, 0, 0, 0},
- { 0, 0, 0, 19595, 38470, 7471}},
- [ANAGLYPH_GM_HALF] =
- {{ 0, 0, 0, 65536, 0, 0},
- {19595, 38470, 7471, 0, 0, 0},
- { 0, 0, 0, 0, 0, 65536}},
- [ANAGLYPH_GM_COLOR] =
- {{ 0, 0, 0, 65536, 0, 0},
- { 0, 65536, 0, 0, 0, 0},
- { 0, 0, 0, 0, 0, 65536}},
- [ANAGLYPH_GM_DUBOIS] =
- {{-4063,-10354, -2556, 34669, 46203, 1573},
- {18612, 43778, 9372, -1049, -983, -4260},
- { -983, -1769, 1376, 590, 4915, 61407}},
- [ANAGLYPH_YB_GRAY] =
- {{ 0, 0, 0, 19595, 38470, 7471},
- { 0, 0, 0, 19595, 38470, 7471},
- {19595, 38470, 7471, 0, 0, 0}},
- [ANAGLYPH_YB_HALF] =
- {{ 0, 0, 0, 65536, 0, 0},
- { 0, 0, 0, 0, 65536, 0},
- {19595, 38470, 7471, 0, 0, 0}},
- [ANAGLYPH_YB_COLOR] =
- {{ 0, 0, 0, 65536, 0, 0},
- { 0, 0, 0, 0, 65536, 0},
- { 0, 0, 65536, 0, 0, 0}},
- [ANAGLYPH_YB_DUBOIS] =
- {{69599,-13435,19595, -1048, -8061, -1114},
- {-1704, 59507, 4456, 393, 4063, -1114},
- {-2490,-11338, 1442, 6160, 12124, 59703}},
-};
-
-typedef struct Stereo3DContext {
- const AVClass *class;
- StereoComponent in, out;
- int width, height;
- const int *ana_matrix[3];
- int nb_planes;
- int linesize[4];
- int pheight[4];
- int hsub, vsub;
- int pixstep[4];
- AVFrame *prev;
- int blanks;
- int in_off_left[4], in_off_right[4];
- AVRational aspect;
- Stereo3DDSPContext dsp;
-} Stereo3DContext;
-
-#define OFFSET(x) offsetof(Stereo3DContext, x)
-#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
-
-static const AVOption stereo3d_options[] = {
- { "in", "set input format", OFFSET(in.format), AV_OPT_TYPE_INT, {.i64=SIDE_BY_SIDE_LR}, INTERLEAVE_ROWS_LR, STEREO_CODE_COUNT-1, FLAGS, "in"},
- { "ab2l", "above below half height left first", 0, AV_OPT_TYPE_CONST, {.i64=ABOVE_BELOW_2_LR}, 0, 0, FLAGS, "in" },
- { "tb2l", "above below half height left first", 0, AV_OPT_TYPE_CONST, {.i64=ABOVE_BELOW_2_LR}, 0, 0, FLAGS, "in" },
- { "ab2r", "above below half height right first", 0, AV_OPT_TYPE_CONST, {.i64=ABOVE_BELOW_2_RL}, 0, 0, FLAGS, "in" },
- { "tb2r", "above below half height right first", 0, AV_OPT_TYPE_CONST, {.i64=ABOVE_BELOW_2_RL}, 0, 0, FLAGS, "in" },
- { "abl", "above below left first", 0, AV_OPT_TYPE_CONST, {.i64=ABOVE_BELOW_LR}, 0, 0, FLAGS, "in" },
- { "tbl", "above below left first", 0, AV_OPT_TYPE_CONST, {.i64=ABOVE_BELOW_LR}, 0, 0, FLAGS, "in" },
- { "abr", "above below right first", 0, AV_OPT_TYPE_CONST, {.i64=ABOVE_BELOW_RL}, 0, 0, FLAGS, "in" },
- { "tbr", "above below right first", 0, AV_OPT_TYPE_CONST, {.i64=ABOVE_BELOW_RL}, 0, 0, FLAGS, "in" },
- { "al", "alternating frames left first", 0, AV_OPT_TYPE_CONST, {.i64=ALTERNATING_LR}, 0, 0, FLAGS, "in" },
- { "ar", "alternating frames right first", 0, AV_OPT_TYPE_CONST, {.i64=ALTERNATING_RL}, 0, 0, FLAGS, "in" },
- { "sbs2l", "side by side half width left first", 0, AV_OPT_TYPE_CONST, {.i64=SIDE_BY_SIDE_2_LR}, 0, 0, FLAGS, "in" },
- { "sbs2r", "side by side half width right first", 0, AV_OPT_TYPE_CONST, {.i64=SIDE_BY_SIDE_2_RL}, 0, 0, FLAGS, "in" },
- { "sbsl", "side by side left first", 0, AV_OPT_TYPE_CONST, {.i64=SIDE_BY_SIDE_LR}, 0, 0, FLAGS, "in" },
- { "sbsr", "side by side right first", 0, AV_OPT_TYPE_CONST, {.i64=SIDE_BY_SIDE_RL}, 0, 0, FLAGS, "in" },
- { "irl", "interleave rows left first", 0, AV_OPT_TYPE_CONST, {.i64=INTERLEAVE_ROWS_LR}, 0, 0, FLAGS, "in" },
- { "irr", "interleave rows right first", 0, AV_OPT_TYPE_CONST, {.i64=INTERLEAVE_ROWS_RL}, 0, 0, FLAGS, "in" },
- { "icl", "interleave columns left first", 0, AV_OPT_TYPE_CONST, {.i64=INTERLEAVE_COLS_LR}, 0, 0, FLAGS, "in" },
- { "icr", "interleave columns right first", 0, AV_OPT_TYPE_CONST, {.i64=INTERLEAVE_COLS_RL}, 0, 0, FLAGS, "in" },
- { "out", "set output format", OFFSET(out.format), AV_OPT_TYPE_INT, {.i64=ANAGLYPH_RC_DUBOIS}, 0, STEREO_CODE_COUNT-1, FLAGS, "out"},
- { "ab2l", "above below half height left first", 0, AV_OPT_TYPE_CONST, {.i64=ABOVE_BELOW_2_LR}, 0, 0, FLAGS, "out" },
- { "tb2l", "above below half height left first", 0, AV_OPT_TYPE_CONST, {.i64=ABOVE_BELOW_2_LR}, 0, 0, FLAGS, "out" },
- { "ab2r", "above below half height right first", 0, AV_OPT_TYPE_CONST, {.i64=ABOVE_BELOW_2_RL}, 0, 0, FLAGS, "out" },
- { "tb2r", "above below half height right first", 0, AV_OPT_TYPE_CONST, {.i64=ABOVE_BELOW_2_RL}, 0, 0, FLAGS, "out" },
- { "abl", "above below left first", 0, AV_OPT_TYPE_CONST, {.i64=ABOVE_BELOW_LR}, 0, 0, FLAGS, "out" },
- { "tbl", "above below left first", 0, AV_OPT_TYPE_CONST, {.i64=ABOVE_BELOW_LR}, 0, 0, FLAGS, "out" },
- { "abr", "above below right first", 0, AV_OPT_TYPE_CONST, {.i64=ABOVE_BELOW_RL}, 0, 0, FLAGS, "out" },
- { "tbr", "above below right first", 0, AV_OPT_TYPE_CONST, {.i64=ABOVE_BELOW_RL}, 0, 0, FLAGS, "out" },
- { "agmc", "anaglyph green magenta color", 0, AV_OPT_TYPE_CONST, {.i64=ANAGLYPH_GM_COLOR}, 0, 0, FLAGS, "out" },
- { "agmd", "anaglyph green magenta dubois", 0, AV_OPT_TYPE_CONST, {.i64=ANAGLYPH_GM_DUBOIS}, 0, 0, FLAGS, "out" },
- { "agmg", "anaglyph green magenta gray", 0, AV_OPT_TYPE_CONST, {.i64=ANAGLYPH_GM_GRAY}, 0, 0, FLAGS, "out" },
- { "agmh", "anaglyph green magenta half color", 0, AV_OPT_TYPE_CONST, {.i64=ANAGLYPH_GM_HALF}, 0, 0, FLAGS, "out" },
- { "al", "alternating frames left first", 0, AV_OPT_TYPE_CONST, {.i64=ALTERNATING_LR}, 0, 0, FLAGS, "out" },
- { "ar", "alternating frames right first", 0, AV_OPT_TYPE_CONST, {.i64=ALTERNATING_RL}, 0, 0, FLAGS, "out" },
- { "arbg", "anaglyph red blue gray", 0, AV_OPT_TYPE_CONST, {.i64=ANAGLYPH_RB_GRAY}, 0, 0, FLAGS, "out" },
- { "arcc", "anaglyph red cyan color", 0, AV_OPT_TYPE_CONST, {.i64=ANAGLYPH_RC_COLOR}, 0, 0, FLAGS, "out" },
- { "arcd", "anaglyph red cyan dubois", 0, AV_OPT_TYPE_CONST, {.i64=ANAGLYPH_RC_DUBOIS}, 0, 0, FLAGS, "out" },
- { "arcg", "anaglyph red cyan gray", 0, AV_OPT_TYPE_CONST, {.i64=ANAGLYPH_RC_GRAY}, 0, 0, FLAGS, "out" },
- { "arch", "anaglyph red cyan half color", 0, AV_OPT_TYPE_CONST, {.i64=ANAGLYPH_RC_HALF}, 0, 0, FLAGS, "out" },
- { "argg", "anaglyph red green gray", 0, AV_OPT_TYPE_CONST, {.i64=ANAGLYPH_RG_GRAY}, 0, 0, FLAGS, "out" },
- { "aybc", "anaglyph yellow blue color", 0, AV_OPT_TYPE_CONST, {.i64=ANAGLYPH_YB_COLOR}, 0, 0, FLAGS, "out" },
- { "aybd", "anaglyph yellow blue dubois", 0, AV_OPT_TYPE_CONST, {.i64=ANAGLYPH_YB_DUBOIS}, 0, 0, FLAGS, "out" },
- { "aybg", "anaglyph yellow blue gray", 0, AV_OPT_TYPE_CONST, {.i64=ANAGLYPH_YB_GRAY}, 0, 0, FLAGS, "out" },
- { "aybh", "anaglyph yellow blue half color", 0, AV_OPT_TYPE_CONST, {.i64=ANAGLYPH_YB_HALF}, 0, 0, FLAGS, "out" },
- { "irl", "interleave rows left first", 0, AV_OPT_TYPE_CONST, {.i64=INTERLEAVE_ROWS_LR}, 0, 0, FLAGS, "out" },
- { "irr", "interleave rows right first", 0, AV_OPT_TYPE_CONST, {.i64=INTERLEAVE_ROWS_RL}, 0, 0, FLAGS, "out" },
- { "ml", "mono left", 0, AV_OPT_TYPE_CONST, {.i64=MONO_L}, 0, 0, FLAGS, "out" },
- { "mr", "mono right", 0, AV_OPT_TYPE_CONST, {.i64=MONO_R}, 0, 0, FLAGS, "out" },
- { "sbs2l", "side by side half width left first", 0, AV_OPT_TYPE_CONST, {.i64=SIDE_BY_SIDE_2_LR}, 0, 0, FLAGS, "out" },
- { "sbs2r", "side by side half width right first", 0, AV_OPT_TYPE_CONST, {.i64=SIDE_BY_SIDE_2_RL}, 0, 0, FLAGS, "out" },
- { "sbsl", "side by side left first", 0, AV_OPT_TYPE_CONST, {.i64=SIDE_BY_SIDE_LR}, 0, 0, FLAGS, "out" },
- { "sbsr", "side by side right first", 0, AV_OPT_TYPE_CONST, {.i64=SIDE_BY_SIDE_RL}, 0, 0, FLAGS, "out" },
- { "chl", "checkerboard left first", 0, AV_OPT_TYPE_CONST, {.i64=CHECKERBOARD_LR}, 0, 0, FLAGS, "out" },
- { "chr", "checkerboard right first", 0, AV_OPT_TYPE_CONST, {.i64=CHECKERBOARD_RL}, 0, 0, FLAGS, "out" },
- { "icl", "interleave columns left first", 0, AV_OPT_TYPE_CONST, {.i64=INTERLEAVE_COLS_LR}, 0, 0, FLAGS, "out" },
- { "icr", "interleave columns right first", 0, AV_OPT_TYPE_CONST, {.i64=INTERLEAVE_COLS_RL}, 0, 0, FLAGS, "out" },
- { "hdmi", "HDMI frame pack", 0, AV_OPT_TYPE_CONST, {.i64=HDMI}, 0, 0, FLAGS, "out" },
- { NULL }
-};
-
-AVFILTER_DEFINE_CLASS(stereo3d);
-
-static const enum AVPixelFormat anaglyph_pix_fmts[] = {
- AV_PIX_FMT_RGB24, AV_PIX_FMT_BGR24,
- AV_PIX_FMT_NONE
-};
-
-static const enum AVPixelFormat other_pix_fmts[] = {
- AV_PIX_FMT_RGB24, AV_PIX_FMT_BGR24,
- AV_PIX_FMT_RGB48BE, AV_PIX_FMT_BGR48BE,
- AV_PIX_FMT_RGB48LE, AV_PIX_FMT_BGR48LE,
- AV_PIX_FMT_RGBA64BE, AV_PIX_FMT_BGRA64BE,
- AV_PIX_FMT_RGBA64LE, AV_PIX_FMT_BGRA64LE,
- AV_PIX_FMT_RGBA, AV_PIX_FMT_BGRA,
- AV_PIX_FMT_ARGB, AV_PIX_FMT_ABGR,
- AV_PIX_FMT_RGB0, AV_PIX_FMT_BGR0,
- AV_PIX_FMT_0RGB, AV_PIX_FMT_0BGR,
- AV_PIX_FMT_GBRP,
- AV_PIX_FMT_GBRP9BE, AV_PIX_FMT_GBRP9LE,
- AV_PIX_FMT_GBRP10BE, AV_PIX_FMT_GBRP10LE,
- AV_PIX_FMT_GBRP12BE, AV_PIX_FMT_GBRP12LE,
- AV_PIX_FMT_GBRP14BE, AV_PIX_FMT_GBRP14LE,
- AV_PIX_FMT_GBRP16BE, AV_PIX_FMT_GBRP16LE,
- AV_PIX_FMT_YUV410P,
- AV_PIX_FMT_YUV411P,
- AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUVA420P,
- AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUVA422P,
- AV_PIX_FMT_YUV440P,
- AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUVA444P,
- AV_PIX_FMT_YUVJ411P,
- AV_PIX_FMT_YUVJ420P,
- AV_PIX_FMT_YUVJ422P,
- AV_PIX_FMT_YUVJ440P,
- AV_PIX_FMT_YUVJ444P,
- AV_PIX_FMT_YUV420P9LE, AV_PIX_FMT_YUVA420P9LE,
- AV_PIX_FMT_YUV420P9BE, AV_PIX_FMT_YUVA420P9BE,
- AV_PIX_FMT_YUV422P9LE, AV_PIX_FMT_YUVA422P9LE,
- AV_PIX_FMT_YUV422P9BE, AV_PIX_FMT_YUVA422P9BE,
- AV_PIX_FMT_YUV444P9LE, AV_PIX_FMT_YUVA444P9LE,
- AV_PIX_FMT_YUV444P9BE, AV_PIX_FMT_YUVA444P9BE,
- AV_PIX_FMT_YUV420P10LE, AV_PIX_FMT_YUVA420P10LE,
- AV_PIX_FMT_YUV420P10BE, AV_PIX_FMT_YUVA420P10BE,
- AV_PIX_FMT_YUV422P10LE, AV_PIX_FMT_YUVA422P10LE,
- AV_PIX_FMT_YUV422P10BE, AV_PIX_FMT_YUVA422P10BE,
- AV_PIX_FMT_YUV444P10LE, AV_PIX_FMT_YUVA444P10LE,
- AV_PIX_FMT_YUV444P10BE, AV_PIX_FMT_YUVA444P10BE,
- AV_PIX_FMT_YUV420P12BE, AV_PIX_FMT_YUV420P12LE,
- AV_PIX_FMT_YUV422P12BE, AV_PIX_FMT_YUV422P12LE,
- AV_PIX_FMT_YUV444P12BE, AV_PIX_FMT_YUV444P12LE,
- AV_PIX_FMT_YUV420P14BE, AV_PIX_FMT_YUV420P14LE,
- AV_PIX_FMT_YUV422P14BE, AV_PIX_FMT_YUV422P14LE,
- AV_PIX_FMT_YUV444P14BE, AV_PIX_FMT_YUV444P14LE,
- AV_PIX_FMT_YUV420P16LE, AV_PIX_FMT_YUVA420P16LE,
- AV_PIX_FMT_YUV420P16BE, AV_PIX_FMT_YUVA420P16BE,
- AV_PIX_FMT_YUV422P16LE, AV_PIX_FMT_YUVA422P16LE,
- AV_PIX_FMT_YUV422P16BE, AV_PIX_FMT_YUVA422P16BE,
- AV_PIX_FMT_YUV444P16LE, AV_PIX_FMT_YUVA444P16LE,
- AV_PIX_FMT_YUV444P16BE, AV_PIX_FMT_YUVA444P16BE,
- AV_PIX_FMT_NONE
-};
-
-static int query_formats(AVFilterContext *ctx)
-{
- Stereo3DContext *s = ctx->priv;
- const enum AVPixelFormat *pix_fmts;
- AVFilterFormats *fmts_list;
-
- switch (s->out.format) {
- case ANAGLYPH_GM_COLOR:
- case ANAGLYPH_GM_DUBOIS:
- case ANAGLYPH_GM_GRAY:
- case ANAGLYPH_GM_HALF:
- case ANAGLYPH_RB_GRAY:
- case ANAGLYPH_RC_COLOR:
- case ANAGLYPH_RC_DUBOIS:
- case ANAGLYPH_RC_GRAY:
- case ANAGLYPH_RC_HALF:
- case ANAGLYPH_RG_GRAY:
- case ANAGLYPH_YB_COLOR:
- case ANAGLYPH_YB_DUBOIS:
- case ANAGLYPH_YB_GRAY:
- case ANAGLYPH_YB_HALF:
- pix_fmts = anaglyph_pix_fmts;
- break;
- default:
- pix_fmts = other_pix_fmts;
- }
-
- fmts_list = ff_make_format_list(pix_fmts);
- if (!fmts_list)
- return AVERROR(ENOMEM);
- return ff_set_common_formats(ctx, fmts_list);
-}
-
-static inline uint8_t ana_convert(const int *coeff, const uint8_t *left, const uint8_t *right)
-{
- int sum;
-
- sum = coeff[0] * left[0] + coeff[3] * right[0]; //red in
- sum += coeff[1] * left[1] + coeff[4] * right[1]; //green in
- sum += coeff[2] * left[2] + coeff[5] * right[2]; //blue in
-
- return av_clip_uint8(sum >> 16);
-}
-
-static void anaglyph_ic(uint8_t *dst, uint8_t *lsrc, uint8_t *rsrc,
- ptrdiff_t dst_linesize, ptrdiff_t l_linesize, ptrdiff_t r_linesize,
- int width, int height,
- const int *ana_matrix_r, const int *ana_matrix_g, const int *ana_matrix_b)
-{
- int x, y, o;
-
- for (y = 0; y < height; y++) {
- for (o = 0, x = 0; x < width; x++, o+= 3) {
- dst[o ] = ana_convert(ana_matrix_r, lsrc + o * 2, rsrc + o * 2);
- dst[o + 1] = ana_convert(ana_matrix_g, lsrc + o * 2, rsrc + o * 2);
- dst[o + 2] = ana_convert(ana_matrix_b, lsrc + o * 2, rsrc + o * 2);
- }
-
- dst += dst_linesize;
- lsrc += l_linesize;
- rsrc += r_linesize;
- }
-}
-
-static void anaglyph(uint8_t *dst, uint8_t *lsrc, uint8_t *rsrc,
- ptrdiff_t dst_linesize, ptrdiff_t l_linesize, ptrdiff_t r_linesize,
- int width, int height,
- const int *ana_matrix_r, const int *ana_matrix_g, const int *ana_matrix_b)
-{
- int x, y, o;
-
- for (y = 0; y < height; y++) {
- for (o = 0, x = 0; x < width; x++, o+= 3) {
- dst[o ] = ana_convert(ana_matrix_r, lsrc + o, rsrc + o);
- dst[o + 1] = ana_convert(ana_matrix_g, lsrc + o, rsrc + o);
- dst[o + 2] = ana_convert(ana_matrix_b, lsrc + o, rsrc + o);
- }
-
- dst += dst_linesize;
- lsrc += l_linesize;
- rsrc += r_linesize;
- }
-}
-
-static int config_output(AVFilterLink *outlink)
-{
- AVFilterContext *ctx = outlink->src;
- AVFilterLink *inlink = ctx->inputs[0];
- Stereo3DContext *s = ctx->priv;
- AVRational fps = inlink->frame_rate;
- AVRational tb = inlink->time_base;
- const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(outlink->format);
- int ret;
- s->aspect = inlink->sample_aspect_ratio;
-
- switch (s->in.format) {
- case INTERLEAVE_COLS_LR:
- case INTERLEAVE_COLS_RL:
- case SIDE_BY_SIDE_2_LR:
- case SIDE_BY_SIDE_LR:
- case SIDE_BY_SIDE_2_RL:
- case SIDE_BY_SIDE_RL:
- if (inlink->w & 1) {
- av_log(ctx, AV_LOG_ERROR, "width must be even\n");
- return AVERROR_INVALIDDATA;
- }
- break;
- case INTERLEAVE_ROWS_LR:
- case INTERLEAVE_ROWS_RL:
- case ABOVE_BELOW_2_LR:
- case ABOVE_BELOW_LR:
- case ABOVE_BELOW_2_RL:
- case ABOVE_BELOW_RL:
- if (inlink->h & 1) {
- av_log(ctx, AV_LOG_ERROR, "height must be even\n");
- return AVERROR_INVALIDDATA;
- }
- break;
- }
-
- s->in.width =
- s->width = inlink->w;
- s->in.height =
- s->height = inlink->h;
- s->in.off_lstep =
- s->in.off_rstep =
- s->in.off_left =
- s->in.off_right =
- s->in.row_left =
- s->in.row_right = 0;
- s->in.row_step = 1;
-
- switch (s->in.format) {
- case SIDE_BY_SIDE_2_LR:
- s->aspect.num *= 2;
- case SIDE_BY_SIDE_LR:
- s->width = inlink->w / 2;
- s->in.off_right = s->width;
- break;
- case SIDE_BY_SIDE_2_RL:
- s->aspect.num *= 2;
- case SIDE_BY_SIDE_RL:
- s->width = inlink->w / 2;
- s->in.off_left = s->width;
- break;
- case ABOVE_BELOW_2_LR:
- s->aspect.den *= 2;
- case ABOVE_BELOW_LR:
- s->in.row_right =
- s->height = inlink->h / 2;
- break;
- case ABOVE_BELOW_2_RL:
- s->aspect.den *= 2;
- case ABOVE_BELOW_RL:
- s->in.row_left =
- s->height = inlink->h / 2;
- break;
- case ALTERNATING_RL:
- case ALTERNATING_LR:
- fps.den *= 2;
- tb.num *= 2;
- break;
- case INTERLEAVE_COLS_RL:
- case INTERLEAVE_COLS_LR:
- s->width = inlink->w / 2;
- break;
- case INTERLEAVE_ROWS_LR:
- case INTERLEAVE_ROWS_RL:
- s->in.row_step = 2;
- if (s->in.format == INTERLEAVE_ROWS_RL)
- s->in.off_lstep = 1;
- else
- s->in.off_rstep = 1;
- if (s->out.format != CHECKERBOARD_LR &&
- s->out.format != CHECKERBOARD_RL)
- s->height = inlink->h / 2;
- break;
- default:
- av_log(ctx, AV_LOG_ERROR, "input format %d is not supported\n", s->in.format);
- return AVERROR(EINVAL);
- }
-
- s->out.width = s->width;
- s->out.height = s->height;
- s->out.off_lstep =
- s->out.off_rstep =
- s->out.off_left =
- s->out.off_right =
- s->out.row_left =
- s->out.row_right = 0;
- s->out.row_step = 1;
-
- switch (s->out.format) {
- case ANAGLYPH_RB_GRAY:
- case ANAGLYPH_RG_GRAY:
- case ANAGLYPH_RC_GRAY:
- case ANAGLYPH_RC_HALF:
- case ANAGLYPH_RC_COLOR:
- case ANAGLYPH_RC_DUBOIS:
- case ANAGLYPH_GM_GRAY:
- case ANAGLYPH_GM_HALF:
- case ANAGLYPH_GM_COLOR:
- case ANAGLYPH_GM_DUBOIS:
- case ANAGLYPH_YB_GRAY:
- case ANAGLYPH_YB_HALF:
- case ANAGLYPH_YB_COLOR:
- case ANAGLYPH_YB_DUBOIS: {
- uint8_t rgba_map[4];
-
- ff_fill_rgba_map(rgba_map, outlink->format);
- s->ana_matrix[rgba_map[0]] = &ana_coeff[s->out.format][0][0];
- s->ana_matrix[rgba_map[1]] = &ana_coeff[s->out.format][1][0];
- s->ana_matrix[rgba_map[2]] = &ana_coeff[s->out.format][2][0];
- break;
- }
- case SIDE_BY_SIDE_2_LR:
- s->aspect.den *= 2;
- case SIDE_BY_SIDE_LR:
- s->out.width = s->width * 2;
- s->out.off_right = s->width;
- break;
- case SIDE_BY_SIDE_2_RL:
- s->aspect.den *= 2;
- case SIDE_BY_SIDE_RL:
- s->out.width = s->width * 2;
- s->out.off_left = s->width;
- break;
- case ABOVE_BELOW_2_LR:
- s->aspect.num *= 2;
- case ABOVE_BELOW_LR:
- s->out.height = s->height * 2;
- s->out.row_right = s->height;
- break;
- case HDMI:
- if (s->height != 720 && s->height != 1080) {
- av_log(ctx, AV_LOG_ERROR, "Only 720 and 1080 height supported\n");
- return AVERROR(EINVAL);
- }
-
- s->blanks = s->height / 24;
- s->out.height = s->height * 2 + s->blanks;
- s->out.row_right = s->height + s->blanks;
- break;
- case ABOVE_BELOW_2_RL:
- s->aspect.num *= 2;
- case ABOVE_BELOW_RL:
- s->out.height = s->height * 2;
- s->out.row_left = s->height;
- break;
- case INTERLEAVE_ROWS_LR:
- s->in.row_step = 1 + (s->in.format == INTERLEAVE_ROWS_RL);
- s->out.row_step = 2;
- s->out.height = s->height * 2;
- s->out.off_rstep = 1;
- break;
- case INTERLEAVE_ROWS_RL:
- s->in.row_step = 1 + (s->in.format == INTERLEAVE_ROWS_LR);
- s->out.row_step = 2;
- s->out.height = s->height * 2;
- s->out.off_lstep = 1;
- break;
- case MONO_R:
- if (s->in.format != INTERLEAVE_COLS_LR) {
- s->in.off_left = s->in.off_right;
- s->in.row_left = s->in.row_right;
- }
- if (s->in.format == INTERLEAVE_ROWS_LR)
- FFSWAP(int, s->in.off_lstep, s->in.off_rstep);
- break;
- case MONO_L:
- if (s->in.format == INTERLEAVE_ROWS_RL)
- FFSWAP(int, s->in.off_lstep, s->in.off_rstep);
- break;
- case ALTERNATING_RL:
- case ALTERNATING_LR:
- fps.num *= 2;
- tb.den *= 2;
- break;
- case CHECKERBOARD_LR:
- case CHECKERBOARD_RL:
- case INTERLEAVE_COLS_LR:
- case INTERLEAVE_COLS_RL:
- s->out.width = s->width * 2;
- break;
- default:
- av_log(ctx, AV_LOG_ERROR, "output format %d is not supported\n", s->out.format);
- return AVERROR(EINVAL);
- }
-
- if (s->in.format == INTERLEAVE_COLS_LR || s->in.format == INTERLEAVE_COLS_RL) {
- if ((s->in.format & 1) != (s->out.format & 1)) {
- FFSWAP(int, s->in.row_left, s->in.row_right);
- FFSWAP(int, s->in.off_lstep, s->in.off_rstep);
- FFSWAP(int, s->in.off_left, s->in.off_right);
- FFSWAP(int, s->out.row_left, s->out.row_right);
- FFSWAP(int, s->out.off_lstep, s->out.off_rstep);
- FFSWAP(int, s->out.off_left, s->out.off_right);
- }
- }
-
- outlink->w = s->out.width;
- outlink->h = s->out.height;
- outlink->frame_rate = fps;
- outlink->time_base = tb;
- outlink->sample_aspect_ratio = s->aspect;
-
- if ((ret = av_image_fill_linesizes(s->linesize, outlink->format, s->width)) < 0)
- return ret;
- s->nb_planes = av_pix_fmt_count_planes(outlink->format);
- av_image_fill_max_pixsteps(s->pixstep, NULL, desc);
- s->pheight[1] = s->pheight[2] = AV_CEIL_RSHIFT(s->height, desc->log2_chroma_h);
- s->pheight[0] = s->pheight[3] = s->height;
- s->hsub = desc->log2_chroma_w;
- s->vsub = desc->log2_chroma_h;
-
- s->dsp.anaglyph = anaglyph;
- if (ARCH_X86)
- ff_stereo3d_init_x86(&s->dsp);
-
- return 0;
-}
-
-typedef struct ThreadData {
- AVFrame *ileft, *iright;
- AVFrame *out;
-} ThreadData;
-
-static int filter_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
-{
- Stereo3DContext *s = ctx->priv;
- ThreadData *td = arg;
- AVFrame *ileft = td->ileft;
- AVFrame *iright = td->iright;
- AVFrame *out = td->out;
- int height = s->out.height;
- int start = (height * jobnr ) / nb_jobs;
- int end = (height * (jobnr+1)) / nb_jobs;
- const int **ana_matrix = s->ana_matrix;
-
- s->dsp.anaglyph(out->data[0] + out->linesize[0] * start,
- ileft ->data[0] + s->in_off_left [0] + ileft->linesize[0] * start * s->in.row_step,
- iright->data[0] + s->in_off_right[0] + iright->linesize[0] * start * s->in.row_step,
- out->linesize[0],
- ileft->linesize[0] * s->in.row_step,
- iright->linesize[0] * s->in.row_step,
- s->out.width, end - start,
- ana_matrix[0], ana_matrix[1], ana_matrix[2]);
-
- return 0;
-}
-
-static void interleave_cols_to_any(Stereo3DContext *s, int *out_off, int p, AVFrame *in, AVFrame *out, int d)
-{
- int y, x;
-
- for (y = 0; y < s->pheight[p]; y++) {
- const uint8_t *src = (const uint8_t*)in->data[p] + y * in->linesize[p] + d * s->pixstep[p];
- uint8_t *dst = out->data[p] + out_off[p] + y * out->linesize[p] * s->out.row_step;
-
- switch (s->pixstep[p]) {
- case 1:
- for (x = 0; x < s->linesize[p]; x++)
- dst[x] = src[x * 2];
- break;
- case 2:
- for (x = 0; x < s->linesize[p]; x+=2)
- AV_WN16(&dst[x], AV_RN16(&src[x * 2]));
- break;
- case 3:
- for (x = 0; x < s->linesize[p]; x+=3)
- AV_WB24(&dst[x], AV_RB24(&src[x * 2]));
- break;
- case 4:
- for (x = 0; x < s->linesize[p]; x+=4)
- AV_WN32(&dst[x], AV_RN32(&src[x * 2]));
- break;
- case 6:
- for (x = 0; x < s->linesize[p]; x+=6)
- AV_WB48(&dst[x], AV_RB48(&src[x * 2]));
- break;
- case 8:
- for (x = 0; x < s->linesize[p]; x+=8)
- AV_WN64(&dst[x], AV_RN64(&src[x * 2]));
- break;
- }
- }
-}
-
-static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref)
-{
- AVFilterContext *ctx = inlink->dst;
- Stereo3DContext *s = ctx->priv;
- AVFilterLink *outlink = ctx->outputs[0];
- AVFrame *out = NULL, *oleft, *oright, *ileft, *iright;
- int out_off_left[4], out_off_right[4];
- int i, ret;
-
- if (s->in.format == s->out.format)
- return ff_filter_frame(outlink, inpicref);
-
- switch (s->out.format) {
- case ALTERNATING_LR:
- case ALTERNATING_RL:
- if (!s->prev) {
- s->prev = inpicref;
- return 0;
- }
- break;
- };
-
- switch (s->in.format) {
- case ALTERNATING_LR:
- case ALTERNATING_RL:
- if (!s->prev) {
- s->prev = inpicref;
- return 0;
- }
- ileft = s->prev;
- iright = inpicref;
- if (s->in.format == ALTERNATING_RL)
- FFSWAP(AVFrame *, ileft, iright);
- break;
- default:
- ileft = iright = inpicref;
- };
-
- if ((s->out.format == ALTERNATING_LR ||
- s->out.format == ALTERNATING_RL) &&
- (s->in.format == SIDE_BY_SIDE_LR ||
- s->in.format == SIDE_BY_SIDE_RL ||
- s->in.format == SIDE_BY_SIDE_2_LR ||
- s->in.format == SIDE_BY_SIDE_2_RL ||
- s->in.format == ABOVE_BELOW_LR ||
- s->in.format == ABOVE_BELOW_RL ||
- s->in.format == ABOVE_BELOW_2_LR ||
- s->in.format == ABOVE_BELOW_2_RL ||
- s->in.format == INTERLEAVE_ROWS_LR ||
- s->in.format == INTERLEAVE_ROWS_RL)) {
- oright = av_frame_clone(s->prev);
- oleft = av_frame_clone(s->prev);
- if (!oright || !oleft) {
- av_frame_free(&oright);
- av_frame_free(&oleft);
- av_frame_free(&s->prev);
- av_frame_free(&inpicref);
- return AVERROR(ENOMEM);
- }
- } else if ((s->out.format == MONO_L ||
- s->out.format == MONO_R) &&
- (s->in.format == SIDE_BY_SIDE_LR ||
- s->in.format == SIDE_BY_SIDE_RL ||
- s->in.format == SIDE_BY_SIDE_2_LR ||
- s->in.format == SIDE_BY_SIDE_2_RL ||
- s->in.format == ABOVE_BELOW_LR ||
- s->in.format == ABOVE_BELOW_RL ||
- s->in.format == ABOVE_BELOW_2_LR ||
- s->in.format == ABOVE_BELOW_2_RL ||
- s->in.format == INTERLEAVE_ROWS_LR ||
- s->in.format == INTERLEAVE_ROWS_RL)) {
- out = oleft = oright = av_frame_clone(inpicref);
- if (!out) {
- av_frame_free(&s->prev);
- av_frame_free(&inpicref);
- return AVERROR(ENOMEM);
- }
- } else if ((s->out.format == MONO_L && s->in.format == ALTERNATING_LR) ||
- (s->out.format == MONO_R && s->in.format == ALTERNATING_RL)) {
- s->prev->pts /= 2;
- ret = ff_filter_frame(outlink, s->prev);
- av_frame_free(&inpicref);
- s->prev = NULL;
- return ret;
- } else if ((s->out.format == MONO_L && s->in.format == ALTERNATING_RL) ||
- (s->out.format == MONO_R && s->in.format == ALTERNATING_LR)) {
- av_frame_free(&s->prev);
- inpicref->pts /= 2;
- return ff_filter_frame(outlink, inpicref);
- } else if ((s->out.format == ALTERNATING_LR && s->in.format == ALTERNATING_RL) ||
- (s->out.format == ALTERNATING_RL && s->in.format == ALTERNATING_LR)) {
- FFSWAP(int64_t, s->prev->pts, inpicref->pts);
- ff_filter_frame(outlink, inpicref);
- ret = ff_filter_frame(outlink, s->prev);
- s->prev = NULL;
- return ret;
- } else {
- out = oleft = oright = ff_get_video_buffer(outlink, outlink->w, outlink->h);
- if (!out) {
- av_frame_free(&s->prev);
- av_frame_free(&inpicref);
- return AVERROR(ENOMEM);
- }
- av_frame_copy_props(out, inpicref);
-
- if (s->out.format == ALTERNATING_LR ||
- s->out.format == ALTERNATING_RL) {
- oright = ff_get_video_buffer(outlink, outlink->w, outlink->h);
- if (!oright) {
- av_frame_free(&oleft);
- av_frame_free(&s->prev);
- av_frame_free(&inpicref);
- return AVERROR(ENOMEM);
- }
- av_frame_copy_props(oright, s->prev);
- }
- }
-
- for (i = 0; i < 4; i++) {
- int hsub = i == 1 || i == 2 ? s->hsub : 0;
- int vsub = i == 1 || i == 2 ? s->vsub : 0;
- s->in_off_left[i] = (AV_CEIL_RSHIFT(s->in.row_left, vsub) + s->in.off_lstep) * ileft->linesize[i] + AV_CEIL_RSHIFT(s->in.off_left * s->pixstep[i], hsub);
- s->in_off_right[i] = (AV_CEIL_RSHIFT(s->in.row_right, vsub) + s->in.off_rstep) * iright->linesize[i] + AV_CEIL_RSHIFT(s->in.off_right * s->pixstep[i], hsub);
- out_off_left[i] = (AV_CEIL_RSHIFT(s->out.row_left, vsub) + s->out.off_lstep) * oleft->linesize[i] + AV_CEIL_RSHIFT(s->out.off_left * s->pixstep[i], hsub);
- out_off_right[i] = (AV_CEIL_RSHIFT(s->out.row_right, vsub) + s->out.off_rstep) * oright->linesize[i] + AV_CEIL_RSHIFT(s->out.off_right * s->pixstep[i], hsub);
- }
-
- switch (s->out.format) {
- case ALTERNATING_LR:
- case ALTERNATING_RL:
- switch (s->in.format) {
- case INTERLEAVE_ROWS_LR:
- case INTERLEAVE_ROWS_RL:
- for (i = 0; i < s->nb_planes; i++) {
- oleft->linesize[i] *= 2;
- oright->linesize[i] *= 2;
- }
- case ABOVE_BELOW_LR:
- case ABOVE_BELOW_RL:
- case ABOVE_BELOW_2_LR:
- case ABOVE_BELOW_2_RL:
- case SIDE_BY_SIDE_LR:
- case SIDE_BY_SIDE_RL:
- case SIDE_BY_SIDE_2_LR:
- case SIDE_BY_SIDE_2_RL:
- oleft->width = outlink->w;
- oright->width = outlink->w;
- oleft->height = outlink->h;
- oright->height = outlink->h;
-
- for (i = 0; i < s->nb_planes; i++) {
- oleft->data[i] += s->in_off_left[i];
- oright->data[i] += s->in_off_right[i];
- }
- break;
- default:
- goto copy;
- break;
- }
- break;
- case HDMI:
- for (i = 0; i < s->nb_planes; i++) {
- int j, h = s->height >> ((i == 1 || i == 2) ? s->vsub : 0);
- int b = (s->blanks) >> ((i == 1 || i == 2) ? s->vsub : 0);
-
- for (j = h; j < h + b; j++)
- memset(oleft->data[i] + j * s->linesize[i], 0, s->linesize[i]);
- }
- case SIDE_BY_SIDE_LR:
- case SIDE_BY_SIDE_RL:
- case SIDE_BY_SIDE_2_LR:
- case SIDE_BY_SIDE_2_RL:
- case ABOVE_BELOW_LR:
- case ABOVE_BELOW_RL:
- case ABOVE_BELOW_2_LR:
- case ABOVE_BELOW_2_RL:
- case INTERLEAVE_ROWS_LR:
- case INTERLEAVE_ROWS_RL:
-copy:
- if (s->in.format == INTERLEAVE_COLS_LR ||
- s->in.format == INTERLEAVE_COLS_RL) {
- for (i = 0; i < s->nb_planes; i++) {
- int d = (s->in.format & 1) != (s->out.format & 1);
-
- interleave_cols_to_any(s, out_off_left, i, ileft, oleft, d);
- interleave_cols_to_any(s, out_off_right, i, iright, oright, !d);
- }
- } else {
- for (i = 0; i < s->nb_planes; i++) {
- av_image_copy_plane(oleft->data[i] + out_off_left[i],
- oleft->linesize[i] * s->out.row_step,
- ileft->data[i] + s->in_off_left[i],
- ileft->linesize[i] * s->in.row_step,
- s->linesize[i], s->pheight[i]);
- av_image_copy_plane(oright->data[i] + out_off_right[i],
- oright->linesize[i] * s->out.row_step,
- iright->data[i] + s->in_off_right[i],
- iright->linesize[i] * s->in.row_step,
- s->linesize[i], s->pheight[i]);
- }
- }
- break;
- case MONO_L:
- iright = ileft;
- case MONO_R:
- switch (s->in.format) {
- case INTERLEAVE_ROWS_LR:
- case INTERLEAVE_ROWS_RL:
- for (i = 0; i < s->nb_planes; i++) {
- out->linesize[i] *= 2;
- }
- case ABOVE_BELOW_LR:
- case ABOVE_BELOW_RL:
- case ABOVE_BELOW_2_LR:
- case ABOVE_BELOW_2_RL:
- case SIDE_BY_SIDE_LR:
- case SIDE_BY_SIDE_RL:
- case SIDE_BY_SIDE_2_LR:
- case SIDE_BY_SIDE_2_RL:
- out->width = outlink->w;
- out->height = outlink->h;
-
- for (i = 0; i < s->nb_planes; i++) {
- out->data[i] += s->in_off_left[i];
- }
- break;
- case INTERLEAVE_COLS_LR:
- case INTERLEAVE_COLS_RL:
- for (i = 0; i < s->nb_planes; i++) {
- const int d = (s->in.format & 1) != (s->out.format & 1);
-
- interleave_cols_to_any(s, out_off_right, i, iright, out, d);
- }
- break;
- default:
- for (i = 0; i < s->nb_planes; i++) {
- av_image_copy_plane(out->data[i], out->linesize[i],
- iright->data[i] + s->in_off_left[i],
- iright->linesize[i] * s->in.row_step,
- s->linesize[i], s->pheight[i]);
- }
- break;
- }
- break;
- case ANAGLYPH_RB_GRAY:
- case ANAGLYPH_RG_GRAY:
- case ANAGLYPH_RC_GRAY:
- case ANAGLYPH_RC_HALF:
- case ANAGLYPH_RC_COLOR:
- case ANAGLYPH_RC_DUBOIS:
- case ANAGLYPH_GM_GRAY:
- case ANAGLYPH_GM_HALF:
- case ANAGLYPH_GM_COLOR:
- case ANAGLYPH_GM_DUBOIS:
- case ANAGLYPH_YB_GRAY:
- case ANAGLYPH_YB_HALF:
- case ANAGLYPH_YB_COLOR:
- case ANAGLYPH_YB_DUBOIS: {
- if (s->in.format == INTERLEAVE_COLS_LR ||
- s->in.format == INTERLEAVE_COLS_RL) {
- const int d = (s->in.format & 1);
-
- anaglyph_ic(out->data[0],
- ileft ->data[0] + s->in_off_left [0] + d * 3,
- iright->data[0] + s->in_off_right[0] + (!d) * 3,
- out->linesize[0],
- ileft->linesize[0] * s->in.row_step,
- iright->linesize[0] * s->in.row_step,
- s->out.width, s->out.height,
- s->ana_matrix[0], s->ana_matrix[1], s->ana_matrix[2]);
- } else {
- ThreadData td;
-
- td.ileft = ileft; td.iright = iright; td.out = out;
- ctx->internal->execute(ctx, filter_slice, &td, NULL,
- FFMIN(s->out.height, ff_filter_get_nb_threads(ctx)));
- }
- break;
- }
- case CHECKERBOARD_RL:
- case CHECKERBOARD_LR:
- for (i = 0; i < s->nb_planes; i++) {
- int x, y;
-
- for (y = 0; y < s->pheight[i]; y++) {
- uint8_t *dst = out->data[i] + out->linesize[i] * y;
- const int d1 = (s->in.format == INTERLEAVE_COLS_LR || s->in.format == INTERLEAVE_COLS_RL) && (s->in.format & 1) != (s->out.format & 1);
- const int d2 = (s->in.format == INTERLEAVE_COLS_LR || s->in.format == INTERLEAVE_COLS_RL) ? !d1 : 0;
- const int m = 1 + (s->in.format == INTERLEAVE_COLS_LR || s->in.format == INTERLEAVE_COLS_RL);
- uint8_t *left = ileft->data[i] + ileft->linesize[i] * y + s->in_off_left[i] + d1 * s->pixstep[i];
- uint8_t *right = iright->data[i] + iright->linesize[i] * y + s->in_off_right[i] + d2 * s->pixstep[i];
- int p, b;
-
- if (s->out.format == CHECKERBOARD_RL && s->in.format != INTERLEAVE_COLS_LR && s->in.format != INTERLEAVE_COLS_RL)
- FFSWAP(uint8_t*, left, right);
- switch (s->pixstep[i]) {
- case 1:
- for (x = 0, b = 0, p = 0; x < s->linesize[i] * 2; x+=2, p++, b+=2) {
- dst[x ] = (b&1) == (y&1) ? left[p*m] : right[p*m];
- dst[x+1] = (b&1) != (y&1) ? left[p*m] : right[p*m];
- }
- break;
- case 2:
- for (x = 0, b = 0, p = 0; x < s->linesize[i] * 2; x+=4, p+=2, b+=2) {
- AV_WN16(&dst[x ], (b&1) == (y&1) ? AV_RN16(&left[p*m]) : AV_RN16(&right[p*m]));
- AV_WN16(&dst[x+2], (b&1) != (y&1) ? AV_RN16(&left[p*m]) : AV_RN16(&right[p*m]));
- }
- break;
- case 3:
- for (x = 0, b = 0, p = 0; x < s->linesize[i] * 2; x+=6, p+=3, b+=2) {
- AV_WB24(&dst[x ], (b&1) == (y&1) ? AV_RB24(&left[p*m]) : AV_RB24(&right[p*m]));
- AV_WB24(&dst[x+3], (b&1) != (y&1) ? AV_RB24(&left[p*m]) : AV_RB24(&right[p*m]));
- }
- break;
- case 4:
- for (x = 0, b = 0, p = 0; x < s->linesize[i] * 2; x+=8, p+=4, b+=2) {
- AV_WN32(&dst[x ], (b&1) == (y&1) ? AV_RN32(&left[p*m]) : AV_RN32(&right[p*m]));
- AV_WN32(&dst[x+4], (b&1) != (y&1) ? AV_RN32(&left[p*m]) : AV_RN32(&right[p*m]));
- }
- break;
- case 6:
- for (x = 0, b = 0, p = 0; x < s->linesize[i] * 2; x+=12, p+=6, b+=2) {
- AV_WB48(&dst[x ], (b&1) == (y&1) ? AV_RB48(&left[p*m]) : AV_RB48(&right[p*m]));
- AV_WB48(&dst[x+6], (b&1) != (y&1) ? AV_RB48(&left[p*m]) : AV_RB48(&right[p*m]));
- }
- break;
- case 8:
- for (x = 0, b = 0, p = 0; x < s->linesize[i] * 2; x+=16, p+=8, b+=2) {
- AV_WN64(&dst[x ], (b&1) == (y&1) ? AV_RN64(&left[p*m]) : AV_RN64(&right[p*m]));
- AV_WN64(&dst[x+8], (b&1) != (y&1) ? AV_RN64(&left[p*m]) : AV_RN64(&right[p*m]));
- }
- break;
- }
- }
- }
- break;
- case INTERLEAVE_COLS_LR:
- case INTERLEAVE_COLS_RL:
- for (i = 0; i < s->nb_planes; i++) {
- const int d = (s->in.format == INTERLEAVE_COLS_LR || s->in.format == INTERLEAVE_COLS_RL);
- const int m = 1 + d;
- int x, y;
-
- for (y = 0; y < s->pheight[i]; y++) {
- uint8_t *dst = out->data[i] + out->linesize[i] * y;
- uint8_t *left = ileft->data[i] + ileft->linesize[i] * y * s->in.row_step + s->in_off_left[i] + d * s->pixstep[i];
- uint8_t *right = iright->data[i] + iright->linesize[i] * y * s->in.row_step + s->in_off_right[i];
- int p, b;
-
- if (s->out.format == INTERLEAVE_COLS_LR)
- FFSWAP(uint8_t*, left, right);
-
- switch (s->pixstep[i]) {
- case 1:
- for (x = 0, b = 0, p = 0; x < s->linesize[i] * 2; x+=2, p++, b+=2) {
- dst[x ] = b&1 ? left[p*m] : right[p*m];
- dst[x+1] = !(b&1) ? left[p*m] : right[p*m];
- }
- break;
- case 2:
- for (x = 0, b = 0, p = 0; x < s->linesize[i] * 2; x+=4, p+=2, b+=2) {
- AV_WN16(&dst[x ], b&1 ? AV_RN16(&left[p*m]) : AV_RN16(&right[p*m]));
- AV_WN16(&dst[x+2], !(b&1) ? AV_RN16(&left[p*m]) : AV_RN16(&right[p*m]));
- }
- break;
- case 3:
- for (x = 0, b = 0, p = 0; x < s->linesize[i] * 2; x+=6, p+=3, b+=2) {
- AV_WB24(&dst[x ], b&1 ? AV_RB24(&left[p*m]) : AV_RB24(&right[p*m]));
- AV_WB24(&dst[x+3], !(b&1) ? AV_RB24(&left[p*m]) : AV_RB24(&right[p*m]));
- }
- break;
- case 4:
- for (x = 0, b = 0, p = 0; x < s->linesize[i] * 2; x+=8, p+=4, b+=2) {
- AV_WN32(&dst[x ], b&1 ? AV_RN32(&left[p*m]) : AV_RN32(&right[p*m]));
- AV_WN32(&dst[x+4], !(b&1) ? AV_RN32(&left[p*m]) : AV_RN32(&right[p*m]));
- }
- break;
- case 6:
- for (x = 0, b = 0, p = 0; x < s->linesize[i] * 2; x+=12, p+=6, b+=2) {
- AV_WB48(&dst[x ], b&1 ? AV_RB48(&left[p*m]) : AV_RB48(&right[p*m]));
- AV_WB48(&dst[x+6], !(b&1) ? AV_RB48(&left[p*m]) : AV_RB48(&right[p*m]));
- }
- break;
- case 8:
- for (x = 0, b = 0, p = 0; x < s->linesize[i] * 2; x+=16, p+=8, b+=2) {
- AV_WN64(&dst[x ], b&1 ? AV_RN64(&left[p*m]) : AV_RN64(&right[p*m]));
- AV_WN64(&dst[x+8], !(b&1) ? AV_RN64(&left[p*m]) : AV_RN64(&right[p*m]));
- }
- break;
- }
- }
- }
- break;
- default:
- av_assert0(0);
- }
-
- if (oright != oleft) {
- if (s->out.format == ALTERNATING_LR)
- FFSWAP(AVFrame *, oleft, oright);
- oright->pts = s->prev->pts * 2;
- ff_filter_frame(outlink, oright);
- out = oleft;
- oleft->pts = s->prev->pts + inpicref->pts;
- av_frame_free(&s->prev);
- s->prev = inpicref;
- } else if (s->in.format == ALTERNATING_LR ||
- s->in.format == ALTERNATING_RL) {
- out->pts = s->prev->pts / 2;
- av_frame_free(&s->prev);
- av_frame_free(&inpicref);
- } else {
- av_frame_free(&s->prev);
- av_frame_free(&inpicref);
- }
- av_assert0(out);
- out->sample_aspect_ratio = s->aspect;
- return ff_filter_frame(outlink, out);
-}
-
-static av_cold void uninit(AVFilterContext *ctx)
-{
- Stereo3DContext *s = ctx->priv;
-
- av_frame_free(&s->prev);
-}
-
-static const AVFilterPad stereo3d_inputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- .filter_frame = filter_frame,
- },
- { NULL }
-};
-
-static const AVFilterPad stereo3d_outputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- .config_props = config_output,
- },
- { NULL }
-};
-
-AVFilter ff_vf_stereo3d = {
- .name = "stereo3d",
- .description = NULL_IF_CONFIG_SMALL("Convert video stereoscopic 3D view."),
- .priv_size = sizeof(Stereo3DContext),
- .uninit = uninit,
- .query_formats = query_formats,
- .inputs = stereo3d_inputs,
- .outputs = stereo3d_outputs,
- .priv_class = &stereo3d_class,
- .flags = AVFILTER_FLAG_SLICE_THREADS,
-};
diff --git a/libavfilter/vf_super2xsai.c b/libavfilter/vf_super2xsai.c
deleted file mode 100644
index 87eec04..0000000
--- a/libavfilter/vf_super2xsai.c
+++ /dev/null
@@ -1,354 +0,0 @@
-/*
- * Copyright (c) 2010 Niel van der Westhuizen <nielkie@gmail.com>
- * Copyright (c) 2002 A'rpi
- * Copyright (c) 1997-2001 ZSNES Team ( zsknight@zsnes.com / _demo_@zsnes.com )
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/**
- * @file
- * Super 2xSaI video filter
- * Ported from MPlayer libmpcodecs/vf_2xsai.c.
- */
-
-#include "libavutil/pixdesc.h"
-#include "libavutil/intreadwrite.h"
-#include "avfilter.h"
-#include "formats.h"
-#include "internal.h"
-#include "video.h"
-
-typedef struct Super2xSaIContext {
- /* masks used for two pixels interpolation */
- uint32_t hi_pixel_mask;
- uint32_t lo_pixel_mask;
-
- /* masks used for four pixels interpolation */
- uint32_t q_hi_pixel_mask;
- uint32_t q_lo_pixel_mask;
-
- int bpp; ///< bytes per pixel, pixel stride for each (packed) pixel
- int is_be;
-} Super2xSaIContext;
-
-#define GET_RESULT(A, B, C, D) ((A != C || A != D) - (B != C || B != D))
-
-#define INTERPOLATE(A, B) (((A & hi_pixel_mask) >> 1) + ((B & hi_pixel_mask) >> 1) + (A & B & lo_pixel_mask))
-
-#define Q_INTERPOLATE(A, B, C, D) ((A & q_hi_pixel_mask) >> 2) + ((B & q_hi_pixel_mask) >> 2) + ((C & q_hi_pixel_mask) >> 2) + ((D & q_hi_pixel_mask) >> 2) \
- + ((((A & q_lo_pixel_mask) + (B & q_lo_pixel_mask) + (C & q_lo_pixel_mask) + (D & q_lo_pixel_mask)) >> 2) & q_lo_pixel_mask)
-
-static void super2xsai(AVFilterContext *ctx,
- uint8_t *src, int src_linesize,
- uint8_t *dst, int dst_linesize,
- int width, int height)
-{
- Super2xSaIContext *s = ctx->priv;
- unsigned int x, y;
- uint32_t color[4][4];
- unsigned char *src_line[4];
- const int bpp = s->bpp;
- const uint32_t hi_pixel_mask = s->hi_pixel_mask;
- const uint32_t lo_pixel_mask = s->lo_pixel_mask;
- const uint32_t q_hi_pixel_mask = s->q_hi_pixel_mask;
- const uint32_t q_lo_pixel_mask = s->q_lo_pixel_mask;
-
- /* Point to the first 4 lines, first line is duplicated */
- src_line[0] = src;
- src_line[1] = src;
- src_line[2] = src + src_linesize*FFMIN(1, height-1);
- src_line[3] = src + src_linesize*FFMIN(2, height-1);
-
-#define READ_COLOR4(dst, src_line, off) dst = *((const uint32_t *)src_line + off)
-#define READ_COLOR3(dst, src_line, off) dst = AV_RL24 (src_line + 3*off)
-#define READ_COLOR2(dst, src_line, off) dst = s->is_be ? AV_RB16(src_line + 2 * off) : AV_RL16(src_line + 2 * off)
-
- for (y = 0; y < height; y++) {
- uint8_t *dst_line[2];
-
- dst_line[0] = dst + dst_linesize*2*y;
- dst_line[1] = dst + dst_linesize*(2*y+1);
-
- switch (bpp) {
- case 4:
- READ_COLOR4(color[0][0], src_line[0], 0); color[0][1] = color[0][0]; READ_COLOR4(color[0][2], src_line[0], 1); READ_COLOR4(color[0][3], src_line[0], 2);
- READ_COLOR4(color[1][0], src_line[1], 0); color[1][1] = color[1][0]; READ_COLOR4(color[1][2], src_line[1], 1); READ_COLOR4(color[1][3], src_line[1], 2);
- READ_COLOR4(color[2][0], src_line[2], 0); color[2][1] = color[2][0]; READ_COLOR4(color[2][2], src_line[2], 1); READ_COLOR4(color[2][3], src_line[2], 2);
- READ_COLOR4(color[3][0], src_line[3], 0); color[3][1] = color[3][0]; READ_COLOR4(color[3][2], src_line[3], 1); READ_COLOR4(color[3][3], src_line[3], 2);
- break;
- case 3:
- READ_COLOR3(color[0][0], src_line[0], 0); color[0][1] = color[0][0]; READ_COLOR3(color[0][2], src_line[0], 1); READ_COLOR3(color[0][3], src_line[0], 2);
- READ_COLOR3(color[1][0], src_line[1], 0); color[1][1] = color[1][0]; READ_COLOR3(color[1][2], src_line[1], 1); READ_COLOR3(color[1][3], src_line[1], 2);
- READ_COLOR3(color[2][0], src_line[2], 0); color[2][1] = color[2][0]; READ_COLOR3(color[2][2], src_line[2], 1); READ_COLOR3(color[2][3], src_line[2], 2);
- READ_COLOR3(color[3][0], src_line[3], 0); color[3][1] = color[3][0]; READ_COLOR3(color[3][2], src_line[3], 1); READ_COLOR3(color[3][3], src_line[3], 2);
- break;
- default:
- READ_COLOR2(color[0][0], src_line[0], 0); color[0][1] = color[0][0]; READ_COLOR2(color[0][2], src_line[0], 1); READ_COLOR2(color[0][3], src_line[0], 2);
- READ_COLOR2(color[1][0], src_line[1], 0); color[1][1] = color[1][0]; READ_COLOR2(color[1][2], src_line[1], 1); READ_COLOR2(color[1][3], src_line[1], 2);
- READ_COLOR2(color[2][0], src_line[2], 0); color[2][1] = color[2][0]; READ_COLOR2(color[2][2], src_line[2], 1); READ_COLOR2(color[2][3], src_line[2], 2);
- READ_COLOR2(color[3][0], src_line[3], 0); color[3][1] = color[3][0]; READ_COLOR2(color[3][2], src_line[3], 1); READ_COLOR2(color[3][3], src_line[3], 2);
- }
-
- for (x = 0; x < width; x++) {
- uint32_t product1a, product1b, product2a, product2b;
-
-//--------------------------------------- B0 B1 B2 B3 0 1 2 3
-// 4 5* 6 S2 -> 4 5* 6 7
-// 1 2 3 S1 8 9 10 11
-// A0 A1 A2 A3 12 13 14 15
-//--------------------------------------
- if (color[2][1] == color[1][2] && color[1][1] != color[2][2]) {
- product2b = color[2][1];
- product1b = product2b;
- } else if (color[1][1] == color[2][2] && color[2][1] != color[1][2]) {
- product2b = color[1][1];
- product1b = product2b;
- } else if (color[1][1] == color[2][2] && color[2][1] == color[1][2]) {
- int r = 0;
-
- r += GET_RESULT(color[1][2], color[1][1], color[1][0], color[3][1]);
- r += GET_RESULT(color[1][2], color[1][1], color[2][0], color[0][1]);
- r += GET_RESULT(color[1][2], color[1][1], color[3][2], color[2][3]);
- r += GET_RESULT(color[1][2], color[1][1], color[0][2], color[1][3]);
-
- if (r > 0)
- product1b = color[1][2];
- else if (r < 0)
- product1b = color[1][1];
- else
- product1b = INTERPOLATE(color[1][1], color[1][2]);
-
- product2b = product1b;
- } else {
- if (color[1][2] == color[2][2] && color[2][2] == color[3][1] && color[2][1] != color[3][2] && color[2][2] != color[3][0])
- product2b = Q_INTERPOLATE(color[2][2], color[2][2], color[2][2], color[2][1]);
- else if (color[1][1] == color[2][1] && color[2][1] == color[3][2] && color[3][1] != color[2][2] && color[2][1] != color[3][3])
- product2b = Q_INTERPOLATE(color[2][1], color[2][1], color[2][1], color[2][2]);
- else
- product2b = INTERPOLATE(color[2][1], color[2][2]);
-
- if (color[1][2] == color[2][2] && color[1][2] == color[0][1] && color[1][1] != color[0][2] && color[1][2] != color[0][0])
- product1b = Q_INTERPOLATE(color[1][2], color[1][2], color[1][2], color[1][1]);
- else if (color[1][1] == color[2][1] && color[1][1] == color[0][2] && color[0][1] != color[1][2] && color[1][1] != color[0][3])
- product1b = Q_INTERPOLATE(color[1][2], color[1][1], color[1][1], color[1][1]);
- else
- product1b = INTERPOLATE(color[1][1], color[1][2]);
- }
-
- if (color[1][1] == color[2][2] && color[2][1] != color[1][2] && color[1][0] == color[1][1] && color[1][1] != color[3][2])
- product2a = INTERPOLATE(color[2][1], color[1][1]);
- else if (color[1][1] == color[2][0] && color[1][2] == color[1][1] && color[1][0] != color[2][1] && color[1][1] != color[3][0])
- product2a = INTERPOLATE(color[2][1], color[1][1]);
- else
- product2a = color[2][1];
-
- if (color[2][1] == color[1][2] && color[1][1] != color[2][2] && color[2][0] == color[2][1] && color[2][1] != color[0][2])
- product1a = INTERPOLATE(color[2][1], color[1][1]);
- else if (color[1][0] == color[2][1] && color[2][2] == color[2][1] && color[2][0] != color[1][1] && color[2][1] != color[0][0])
- product1a = INTERPOLATE(color[2][1], color[1][1]);
- else
- product1a = color[1][1];
-
- /* Set the calculated pixels */
- switch (bpp) {
- case 4:
- AV_WN32A(dst_line[0] + x * 8, product1a);
- AV_WN32A(dst_line[0] + x * 8 + 4, product1b);
- AV_WN32A(dst_line[1] + x * 8, product2a);
- AV_WN32A(dst_line[1] + x * 8 + 4, product2b);
- break;
- case 3:
- AV_WL24(dst_line[0] + x * 6, product1a);
- AV_WL24(dst_line[0] + x * 6 + 3, product1b);
- AV_WL24(dst_line[1] + x * 6, product2a);
- AV_WL24(dst_line[1] + x * 6 + 3, product2b);
- break;
- default: // bpp = 2
- if (s->is_be) {
- AV_WB32(dst_line[0] + x * 4, product1a | (product1b << 16));
- AV_WB32(dst_line[1] + x * 4, product2a | (product2b << 16));
- } else {
- AV_WL32(dst_line[0] + x * 4, product1a | (product1b << 16));
- AV_WL32(dst_line[1] + x * 4, product2a | (product2b << 16));
- }
- }
-
- /* Move color matrix forward */
- color[0][0] = color[0][1]; color[0][1] = color[0][2]; color[0][2] = color[0][3];
- color[1][0] = color[1][1]; color[1][1] = color[1][2]; color[1][2] = color[1][3];
- color[2][0] = color[2][1]; color[2][1] = color[2][2]; color[2][2] = color[2][3];
- color[3][0] = color[3][1]; color[3][1] = color[3][2]; color[3][2] = color[3][3];
-
- if (x < width - 3) {
- x += 3;
- switch (bpp) {
- case 4:
- READ_COLOR4(color[0][3], src_line[0], x);
- READ_COLOR4(color[1][3], src_line[1], x);
- READ_COLOR4(color[2][3], src_line[2], x);
- READ_COLOR4(color[3][3], src_line[3], x);
- break;
- case 3:
- READ_COLOR3(color[0][3], src_line[0], x);
- READ_COLOR3(color[1][3], src_line[1], x);
- READ_COLOR3(color[2][3], src_line[2], x);
- READ_COLOR3(color[3][3], src_line[3], x);
- break;
- default: /* case 2 */
- READ_COLOR2(color[0][3], src_line[0], x);
- READ_COLOR2(color[1][3], src_line[1], x);
- READ_COLOR2(color[2][3], src_line[2], x);
- READ_COLOR2(color[3][3], src_line[3], x);
- }
- x -= 3;
- }
- }
-
- /* We're done with one line, so we shift the source lines up */
- src_line[0] = src_line[1];
- src_line[1] = src_line[2];
- src_line[2] = src_line[3];
-
- /* Read next line */
- src_line[3] = src_line[2];
- if (y < height - 3)
- src_line[3] += src_linesize;
- } // y loop
-}
-
-static int query_formats(AVFilterContext *ctx)
-{
- static const enum AVPixelFormat pix_fmts[] = {
- AV_PIX_FMT_RGBA, AV_PIX_FMT_BGRA, AV_PIX_FMT_ARGB, AV_PIX_FMT_ABGR,
- AV_PIX_FMT_RGB24, AV_PIX_FMT_BGR24,
- AV_PIX_FMT_RGB565BE, AV_PIX_FMT_BGR565BE, AV_PIX_FMT_RGB555BE, AV_PIX_FMT_BGR555BE,
- AV_PIX_FMT_RGB565LE, AV_PIX_FMT_BGR565LE, AV_PIX_FMT_RGB555LE, AV_PIX_FMT_BGR555LE,
- AV_PIX_FMT_NONE
- };
-
- AVFilterFormats *fmts_list = ff_make_format_list(pix_fmts);
- if (!fmts_list)
- return AVERROR(ENOMEM);
- return ff_set_common_formats(ctx, fmts_list);
-}
-
-static int config_input(AVFilterLink *inlink)
-{
- Super2xSaIContext *s = inlink->dst->priv;
-
- s->hi_pixel_mask = 0xFEFEFEFE;
- s->lo_pixel_mask = 0x01010101;
- s->q_hi_pixel_mask = 0xFCFCFCFC;
- s->q_lo_pixel_mask = 0x03030303;
- s->bpp = 4;
-
- switch (inlink->format) {
- case AV_PIX_FMT_RGB24:
- case AV_PIX_FMT_BGR24:
- s->bpp = 3;
- break;
-
- case AV_PIX_FMT_RGB565BE:
- case AV_PIX_FMT_BGR565BE:
- s->is_be = 1;
- case AV_PIX_FMT_RGB565LE:
- case AV_PIX_FMT_BGR565LE:
- s->hi_pixel_mask = 0xF7DEF7DE;
- s->lo_pixel_mask = 0x08210821;
- s->q_hi_pixel_mask = 0xE79CE79C;
- s->q_lo_pixel_mask = 0x18631863;
- s->bpp = 2;
- break;
-
- case AV_PIX_FMT_BGR555BE:
- case AV_PIX_FMT_RGB555BE:
- s->is_be = 1;
- case AV_PIX_FMT_BGR555LE:
- case AV_PIX_FMT_RGB555LE:
- s->hi_pixel_mask = 0x7BDE7BDE;
- s->lo_pixel_mask = 0x04210421;
- s->q_hi_pixel_mask = 0x739C739C;
- s->q_lo_pixel_mask = 0x0C630C63;
- s->bpp = 2;
- break;
- }
-
- return 0;
-}
-
-static int config_output(AVFilterLink *outlink)
-{
- AVFilterLink *inlink = outlink->src->inputs[0];
-
- outlink->w = inlink->w*2;
- outlink->h = inlink->h*2;
-
- av_log(inlink->dst, AV_LOG_VERBOSE, "fmt:%s size:%dx%d -> size:%dx%d\n",
- av_get_pix_fmt_name(inlink->format),
- inlink->w, inlink->h, outlink->w, outlink->h);
-
- return 0;
-}
-
-static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref)
-{
- AVFilterLink *outlink = inlink->dst->outputs[0];
- AVFrame *outpicref = ff_get_video_buffer(outlink, outlink->w, outlink->h);
- if (!outpicref) {
- av_frame_free(&inpicref);
- return AVERROR(ENOMEM);
- }
- av_frame_copy_props(outpicref, inpicref);
- outpicref->width = outlink->w;
- outpicref->height = outlink->h;
-
- super2xsai(inlink->dst, inpicref->data[0], inpicref->linesize[0],
- outpicref->data[0], outpicref->linesize[0],
- inlink->w, inlink->h);
-
- av_frame_free(&inpicref);
- return ff_filter_frame(outlink, outpicref);
-}
-
-static const AVFilterPad super2xsai_inputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- .config_props = config_input,
- .filter_frame = filter_frame,
- },
- { NULL }
-};
-
-static const AVFilterPad super2xsai_outputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- .config_props = config_output,
- },
- { NULL }
-};
-
-AVFilter ff_vf_super2xsai = {
- .name = "super2xsai",
- .description = NULL_IF_CONFIG_SMALL("Scale the input by 2x using the Super2xSaI pixel art algorithm."),
- .priv_size = sizeof(Super2xSaIContext),
- .query_formats = query_formats,
- .inputs = super2xsai_inputs,
- .outputs = super2xsai_outputs,
-};
diff --git a/libavfilter/vf_tinterlace.c b/libavfilter/vf_tinterlace.c
deleted file mode 100644
index a777537..0000000
--- a/libavfilter/vf_tinterlace.c
+++ /dev/null
@@ -1,581 +0,0 @@
-/*
- * Copyright (c) 2017 Thomas Mundt <tmundt75@gmail.com>
- * Copyright (c) 2011 Stefano Sabatini
- * Copyright (c) 2010 Baptiste Coudurier
- * Copyright (c) 2003 Michael Zucchi <notzed@ximian.com>
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/**
- * @file
- * temporal field interlace filter, ported from MPlayer/libmpcodecs
- */
-
-#include "libavutil/opt.h"
-#include "libavutil/imgutils.h"
-#include "libavutil/avassert.h"
-#include "avfilter.h"
-#include "internal.h"
-#include "tinterlace.h"
-
-#define OFFSET(x) offsetof(TInterlaceContext, x)
-#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
-
-static const AVOption tinterlace_options[] = {
- {"mode", "select interlace mode", OFFSET(mode), AV_OPT_TYPE_INT, {.i64=MODE_MERGE}, 0, MODE_NB-1, FLAGS, "mode"},
- {"merge", "merge fields", 0, AV_OPT_TYPE_CONST, {.i64=MODE_MERGE}, INT_MIN, INT_MAX, FLAGS, "mode"},
- {"drop_even", "drop even fields", 0, AV_OPT_TYPE_CONST, {.i64=MODE_DROP_EVEN}, INT_MIN, INT_MAX, FLAGS, "mode"},
- {"drop_odd", "drop odd fields", 0, AV_OPT_TYPE_CONST, {.i64=MODE_DROP_ODD}, INT_MIN, INT_MAX, FLAGS, "mode"},
- {"pad", "pad alternate lines with black", 0, AV_OPT_TYPE_CONST, {.i64=MODE_PAD}, INT_MIN, INT_MAX, FLAGS, "mode"},
- {"interleave_top", "interleave top and bottom fields", 0, AV_OPT_TYPE_CONST, {.i64=MODE_INTERLEAVE_TOP}, INT_MIN, INT_MAX, FLAGS, "mode"},
- {"interleave_bottom", "interleave bottom and top fields", 0, AV_OPT_TYPE_CONST, {.i64=MODE_INTERLEAVE_BOTTOM}, INT_MIN, INT_MAX, FLAGS, "mode"},
- {"interlacex2", "interlace fields from two consecutive frames", 0, AV_OPT_TYPE_CONST, {.i64=MODE_INTERLACEX2}, INT_MIN, INT_MAX, FLAGS, "mode"},
- {"mergex2", "merge fields keeping same frame rate", 0, AV_OPT_TYPE_CONST, {.i64=MODE_MERGEX2}, INT_MIN, INT_MAX, FLAGS, "mode"},
-
- {"flags", "set flags", OFFSET(flags), AV_OPT_TYPE_FLAGS, {.i64 = 0}, 0, INT_MAX, 0, "flags" },
- {"low_pass_filter", "enable vertical low-pass filter", 0, AV_OPT_TYPE_CONST, {.i64 = TINTERLACE_FLAG_VLPF}, INT_MIN, INT_MAX, FLAGS, "flags" },
- {"vlpf", "enable vertical low-pass filter", 0, AV_OPT_TYPE_CONST, {.i64 = TINTERLACE_FLAG_VLPF}, INT_MIN, INT_MAX, FLAGS, "flags" },
- {"complex_filter", "enable complex vertical low-pass filter", 0, AV_OPT_TYPE_CONST, {.i64 = TINTERLACE_FLAG_CVLPF},INT_MIN, INT_MAX, FLAGS, "flags" },
- {"cvlpf", "enable complex vertical low-pass filter", 0, AV_OPT_TYPE_CONST, {.i64 = TINTERLACE_FLAG_CVLPF},INT_MIN, INT_MAX, FLAGS, "flags" },
- {"exact_tb", "force a timebase which can represent timestamps exactly", 0, AV_OPT_TYPE_CONST, {.i64 = TINTERLACE_FLAG_EXACT_TB}, INT_MIN, INT_MAX, FLAGS, "flags" },
- {"bypass_il", "bypass already interlaced frames", 0, AV_OPT_TYPE_CONST, {.i64 = TINTERLACE_FLAG_BYPASS_IL}, INT_MIN, INT_MAX, FLAGS, "flags" },
-
- {NULL}
-};
-
-AVFILTER_DEFINE_CLASS(tinterlace);
-
-static const AVOption interlace_options[] = {
- { "scan", "scanning mode", OFFSET(mode), AV_OPT_TYPE_INT, {.i64 = MODE_TFF}, 0, 1, FLAGS, "mode"},
- { "tff", "top field first", 0, AV_OPT_TYPE_CONST, {.i64 = MODE_TFF}, INT_MIN, INT_MAX, FLAGS, .unit = "mode"},
- { "bff", "bottom field first", 0, AV_OPT_TYPE_CONST, {.i64 = MODE_BFF}, INT_MIN, INT_MAX, FLAGS, .unit = "mode"},
- { "lowpass", "set vertical low-pass filter", OFFSET(lowpass), AV_OPT_TYPE_INT, {.i64 = VLPF_LIN}, 0, 2, FLAGS, "lowpass" },
- { "off", "disable vertical low-pass filter", 0, AV_OPT_TYPE_CONST, {.i64 = VLPF_OFF}, INT_MIN, INT_MAX, FLAGS, "lowpass" },
- { "linear", "linear vertical low-pass filter", 0, AV_OPT_TYPE_CONST, {.i64 = VLPF_LIN}, INT_MIN, INT_MAX, FLAGS, "lowpass" },
- { "complex", "complex vertical low-pass filter", 0, AV_OPT_TYPE_CONST, {.i64 = VLPF_CMP}, INT_MIN, INT_MAX, FLAGS, "lowpass" },
-
- { NULL }
-};
-
-AVFILTER_DEFINE_CLASS(interlace);
-
-#define FULL_SCALE_YUVJ_FORMATS \
- AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUVJ440P
-
-static const enum AVPixelFormat full_scale_yuvj_pix_fmts[] = {
- FULL_SCALE_YUVJ_FORMATS, AV_PIX_FMT_NONE
-};
-
-static const AVRational standard_tbs[] = {
- {1, 25},
- {1, 30},
- {1001, 30000},
-};
-
-static int query_formats(AVFilterContext *ctx)
-{
- static const enum AVPixelFormat pix_fmts[] = {
- AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV411P,
- AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P,
- AV_PIX_FMT_YUV440P, AV_PIX_FMT_YUV444P,
- AV_PIX_FMT_YUV420P10LE, AV_PIX_FMT_YUV422P10LE,
- AV_PIX_FMT_YUV440P10LE, AV_PIX_FMT_YUV444P10LE,
- AV_PIX_FMT_YUV420P12LE, AV_PIX_FMT_YUV422P12LE,
- AV_PIX_FMT_YUV440P12LE, AV_PIX_FMT_YUV444P12LE,
- AV_PIX_FMT_YUVA420P, AV_PIX_FMT_YUVA422P, AV_PIX_FMT_YUVA444P,
- AV_PIX_FMT_YUVA420P10LE, AV_PIX_FMT_YUVA422P10LE, AV_PIX_FMT_YUVA444P10LE,
- AV_PIX_FMT_GRAY8, FULL_SCALE_YUVJ_FORMATS,
- AV_PIX_FMT_NONE
- };
-
- AVFilterFormats *fmts_list = ff_make_format_list(pix_fmts);
- if (!fmts_list)
- return AVERROR(ENOMEM);
- return ff_set_common_formats(ctx, fmts_list);
-}
-
-static void lowpass_line_c(uint8_t *dstp, ptrdiff_t width, const uint8_t *srcp,
- ptrdiff_t mref, ptrdiff_t pref, int clip_max)
-{
- const uint8_t *srcp_above = srcp + mref;
- const uint8_t *srcp_below = srcp + pref;
- int i;
- for (i = 0; i < width; i++) {
- // this calculation is an integer representation of
- // '0.5 * current + 0.25 * above + 0.25 * below'
- // '1 +' is for rounding.
- dstp[i] = (1 + srcp[i] + srcp[i] + srcp_above[i] + srcp_below[i]) >> 2;
- }
-}
-
-static void lowpass_line_c_16(uint8_t *dst8, ptrdiff_t width, const uint8_t *src8,
- ptrdiff_t mref, ptrdiff_t pref, int clip_max)
-{
- uint16_t *dstp = (uint16_t *)dst8;
- const uint16_t *srcp = (const uint16_t *)src8;
- const uint16_t *srcp_above = srcp + mref / 2;
- const uint16_t *srcp_below = srcp + pref / 2;
- int i, src_x;
- for (i = 0; i < width; i++) {
- // this calculation is an integer representation of
- // '0.5 * current + 0.25 * above + 0.25 * below'
- // '1 +' is for rounding.
- src_x = av_le2ne16(srcp[i]) << 1;
- dstp[i] = av_le2ne16((1 + src_x + av_le2ne16(srcp_above[i])
- + av_le2ne16(srcp_below[i])) >> 2);
- }
-}
-
-static void lowpass_line_complex_c(uint8_t *dstp, ptrdiff_t width, const uint8_t *srcp,
- ptrdiff_t mref, ptrdiff_t pref, int clip_max)
-{
- const uint8_t *srcp_above = srcp + mref;
- const uint8_t *srcp_below = srcp + pref;
- const uint8_t *srcp_above2 = srcp + mref * 2;
- const uint8_t *srcp_below2 = srcp + pref * 2;
- int i, src_x, src_ab;
- for (i = 0; i < width; i++) {
- // this calculation is an integer representation of
- // '0.75 * current + 0.25 * above + 0.25 * below - 0.125 * above2 - 0.125 * below2'
- // '4 +' is for rounding.
- src_x = srcp[i] << 1;
- src_ab = srcp_above[i] + srcp_below[i];
- dstp[i] = av_clip_uint8((4 + ((srcp[i] + src_x + src_ab) << 1)
- - srcp_above2[i] - srcp_below2[i]) >> 3);
- // Prevent over-sharpening:
- // dst must not exceed src when the average of above and below
- // is less than src. And the other way around.
- if (src_ab > src_x) {
- if (dstp[i] < srcp[i])
- dstp[i] = srcp[i];
- } else if (dstp[i] > srcp[i])
- dstp[i] = srcp[i];
- }
-}
-
-static void lowpass_line_complex_c_16(uint8_t *dst8, ptrdiff_t width, const uint8_t *src8,
- ptrdiff_t mref, ptrdiff_t pref, int clip_max)
-{
- uint16_t *dstp = (uint16_t *)dst8;
- const uint16_t *srcp = (const uint16_t *)src8;
- const uint16_t *srcp_above = srcp + mref / 2;
- const uint16_t *srcp_below = srcp + pref / 2;
- const uint16_t *srcp_above2 = srcp + mref;
- const uint16_t *srcp_below2 = srcp + pref;
- int i, dst_le, src_le, src_x, src_ab;
- for (i = 0; i < width; i++) {
- // this calculation is an integer representation of
- // '0.75 * current + 0.25 * above + 0.25 * below - 0.125 * above2 - 0.125 * below2'
- // '4 +' is for rounding.
- src_le = av_le2ne16(srcp[i]);
- src_x = src_le << 1;
- src_ab = av_le2ne16(srcp_above[i]) + av_le2ne16(srcp_below[i]);
- dst_le = av_clip((4 + ((src_le + src_x + src_ab) << 1)
- - av_le2ne16(srcp_above2[i])
- - av_le2ne16(srcp_below2[i])) >> 3, 0, clip_max);
- // Prevent over-sharpening:
- // dst must not exceed src when the average of above and below
- // is less than src. And the other way around.
- if (src_ab > src_x) {
- if (dst_le < src_le)
- dstp[i] = av_le2ne16(src_le);
- else
- dstp[i] = av_le2ne16(dst_le);
- } else if (dst_le > src_le) {
- dstp[i] = av_le2ne16(src_le);
- } else
- dstp[i] = av_le2ne16(dst_le);
- }
-}
-
-static av_cold void uninit(AVFilterContext *ctx)
-{
- TInterlaceContext *tinterlace = ctx->priv;
-
- av_frame_free(&tinterlace->cur );
- av_frame_free(&tinterlace->next);
- av_freep(&tinterlace->black_data[0]);
-}
-
-static int config_out_props(AVFilterLink *outlink)
-{
- AVFilterContext *ctx = outlink->src;
- AVFilterLink *inlink = outlink->src->inputs[0];
- const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(outlink->format);
- TInterlaceContext *tinterlace = ctx->priv;
- int i;
-
- tinterlace->vsub = desc->log2_chroma_h;
- outlink->w = inlink->w;
- outlink->h = tinterlace->mode == MODE_MERGE || tinterlace->mode == MODE_PAD || tinterlace->mode == MODE_MERGEX2?
- inlink->h*2 : inlink->h;
- if (tinterlace->mode == MODE_MERGE || tinterlace->mode == MODE_PAD || tinterlace->mode == MODE_MERGEX2)
- outlink->sample_aspect_ratio = av_mul_q(inlink->sample_aspect_ratio,
- av_make_q(2, 1));
-
- if (tinterlace->mode == MODE_PAD) {
- uint8_t black[4] = { 0, 0, 0, 16 };
- int ret;
- ff_draw_init(&tinterlace->draw, outlink->format, 0);
- ff_draw_color(&tinterlace->draw, &tinterlace->color, black);
- if (ff_fmt_is_in(outlink->format, full_scale_yuvj_pix_fmts))
- tinterlace->color.comp[0].u8[0] = 0;
- ret = av_image_alloc(tinterlace->black_data, tinterlace->black_linesize,
- outlink->w, outlink->h, outlink->format, 16);
- if (ret < 0)
- return ret;
-
- ff_fill_rectangle(&tinterlace->draw, &tinterlace->color, tinterlace->black_data,
- tinterlace->black_linesize, 0, 0, outlink->w, outlink->h);
- }
- if (tinterlace->flags & (TINTERLACE_FLAG_VLPF | TINTERLACE_FLAG_CVLPF)
- && !(tinterlace->mode == MODE_INTERLEAVE_TOP
- || tinterlace->mode == MODE_INTERLEAVE_BOTTOM)) {
- av_log(ctx, AV_LOG_WARNING, "low_pass_filter flags ignored with mode %d\n",
- tinterlace->mode);
- tinterlace->flags &= ~(TINTERLACE_FLAG_VLPF | TINTERLACE_FLAG_CVLPF);
- }
- tinterlace->preout_time_base = inlink->time_base;
- if (tinterlace->mode == MODE_INTERLACEX2) {
- tinterlace->preout_time_base.den *= 2;
- outlink->frame_rate = av_mul_q(inlink->frame_rate, (AVRational){2,1});
- outlink->time_base = av_mul_q(inlink->time_base , (AVRational){1,2});
- } else if (tinterlace->mode == MODE_MERGEX2) {
- outlink->frame_rate = inlink->frame_rate;
- outlink->time_base = inlink->time_base;
- } else if (tinterlace->mode != MODE_PAD) {
- outlink->frame_rate = av_mul_q(inlink->frame_rate, (AVRational){1,2});
- outlink->time_base = av_mul_q(inlink->time_base , (AVRational){2,1});
- }
-
- for (i = 0; i<FF_ARRAY_ELEMS(standard_tbs); i++){
- if (!av_cmp_q(standard_tbs[i], outlink->time_base))
- break;
- }
- if (i == FF_ARRAY_ELEMS(standard_tbs) ||
- (tinterlace->flags & TINTERLACE_FLAG_EXACT_TB))
- outlink->time_base = tinterlace->preout_time_base;
-
- tinterlace->csp = av_pix_fmt_desc_get(outlink->format);
- if (tinterlace->flags & TINTERLACE_FLAG_CVLPF) {
- if (tinterlace->csp->comp[0].depth > 8)
- tinterlace->lowpass_line = lowpass_line_complex_c_16;
- else
- tinterlace->lowpass_line = lowpass_line_complex_c;
- if (ARCH_X86)
- ff_tinterlace_init_x86(tinterlace);
- } else if (tinterlace->flags & TINTERLACE_FLAG_VLPF) {
- if (tinterlace->csp->comp[0].depth > 8)
- tinterlace->lowpass_line = lowpass_line_c_16;
- else
- tinterlace->lowpass_line = lowpass_line_c;
- if (ARCH_X86)
- ff_tinterlace_init_x86(tinterlace);
- }
-
- av_log(ctx, AV_LOG_VERBOSE, "mode:%d filter:%s h:%d -> h:%d\n", tinterlace->mode,
- (tinterlace->flags & TINTERLACE_FLAG_CVLPF) ? "complex" :
- (tinterlace->flags & TINTERLACE_FLAG_VLPF) ? "linear" : "off",
- inlink->h, outlink->h);
-
- return 0;
-}
-
-#define FIELD_UPPER 0
-#define FIELD_LOWER 1
-#define FIELD_UPPER_AND_LOWER 2
-
-/**
- * Copy picture field from src to dst.
- *
- * @param src_field copy from upper, lower field or both
- * @param interleave leave a padding line between each copied line
- * @param dst_field copy to upper or lower field,
- * only meaningful when interleave is selected
- * @param flags context flags
- */
-static inline
-void copy_picture_field(TInterlaceContext *tinterlace,
- uint8_t *dst[4], int dst_linesize[4],
- const uint8_t *src[4], int src_linesize[4],
- enum AVPixelFormat format, int w, int src_h,
- int src_field, int interleave, int dst_field,
- int flags)
-{
- const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(format);
- int hsub = desc->log2_chroma_w;
- int plane, vsub = desc->log2_chroma_h;
- int k = src_field == FIELD_UPPER_AND_LOWER ? 1 : 2;
- int h;
-
- for (plane = 0; plane < desc->nb_components; plane++) {
- int lines = plane == 1 || plane == 2 ? AV_CEIL_RSHIFT(src_h, vsub) : src_h;
- int cols = plane == 1 || plane == 2 ? AV_CEIL_RSHIFT( w, hsub) : w;
- uint8_t *dstp = dst[plane];
- const uint8_t *srcp = src[plane];
- int srcp_linesize = src_linesize[plane] * k;
- int dstp_linesize = dst_linesize[plane] * (interleave ? 2 : 1);
- int clip_max = (1 << tinterlace->csp->comp[plane].depth) - 1;
-
- lines = (lines + (src_field == FIELD_UPPER)) / k;
- if (src_field == FIELD_LOWER)
- srcp += src_linesize[plane];
- if (interleave && dst_field == FIELD_LOWER)
- dstp += dst_linesize[plane];
- // Low-pass filtering is required when creating an interlaced destination from
- // a progressive source which contains high-frequency vertical detail.
- // Filtering will reduce interlace 'twitter' and Moire patterning.
- if (flags & (TINTERLACE_FLAG_VLPF | TINTERLACE_FLAG_CVLPF)) {
- int x = !!(flags & TINTERLACE_FLAG_CVLPF);
- for (h = lines; h > 0; h--) {
- ptrdiff_t pref = src_linesize[plane];
- ptrdiff_t mref = -pref;
- if (h >= (lines - x)) mref = 0; // there is no line above
- else if (h <= (1 + x)) pref = 0; // there is no line below
-
- tinterlace->lowpass_line(dstp, cols, srcp, mref, pref, clip_max);
- dstp += dstp_linesize;
- srcp += srcp_linesize;
- }
- } else {
- if (tinterlace->csp->comp[plane].depth > 8)
- cols *= 2;
- av_image_copy_plane(dstp, dstp_linesize, srcp, srcp_linesize, cols, lines);
- }
- }
-}
-
-static int filter_frame(AVFilterLink *inlink, AVFrame *picref)
-{
- AVFilterContext *ctx = inlink->dst;
- AVFilterLink *outlink = ctx->outputs[0];
- TInterlaceContext *tinterlace = ctx->priv;
- AVFrame *cur, *next, *out;
- int field, tff, ret;
-
- av_frame_free(&tinterlace->cur);
- tinterlace->cur = tinterlace->next;
- tinterlace->next = picref;
-
- cur = tinterlace->cur;
- next = tinterlace->next;
- /* we need at least two frames */
- if (!tinterlace->cur)
- return 0;
-
- switch (tinterlace->mode) {
- case MODE_MERGEX2: /* move the odd frame into the upper field of the new image, even into
- * the lower field, generating a double-height video at same framerate */
- case MODE_MERGE: /* move the odd frame into the upper field of the new image, even into
- * the lower field, generating a double-height video at half framerate */
- out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
- if (!out)
- return AVERROR(ENOMEM);
- av_frame_copy_props(out, cur);
- out->height = outlink->h;
- out->interlaced_frame = 1;
- out->top_field_first = 1;
- out->sample_aspect_ratio = av_mul_q(cur->sample_aspect_ratio, av_make_q(2, 1));
-
- /* write odd frame lines into the upper field of the new frame */
- copy_picture_field(tinterlace, out->data, out->linesize,
- (const uint8_t **)cur->data, cur->linesize,
- inlink->format, inlink->w, inlink->h,
- FIELD_UPPER_AND_LOWER, 1, tinterlace->mode == MODE_MERGEX2 ? inlink->frame_count_out & 1 ? FIELD_LOWER : FIELD_UPPER : FIELD_UPPER, tinterlace->flags);
- /* write even frame lines into the lower field of the new frame */
- copy_picture_field(tinterlace, out->data, out->linesize,
- (const uint8_t **)next->data, next->linesize,
- inlink->format, inlink->w, inlink->h,
- FIELD_UPPER_AND_LOWER, 1, tinterlace->mode == MODE_MERGEX2 ? inlink->frame_count_out & 1 ? FIELD_UPPER : FIELD_LOWER : FIELD_LOWER, tinterlace->flags);
- if (tinterlace->mode != MODE_MERGEX2)
- av_frame_free(&tinterlace->next);
- break;
-
- case MODE_DROP_ODD: /* only output even frames, odd frames are dropped; height unchanged, half framerate */
- case MODE_DROP_EVEN: /* only output odd frames, even frames are dropped; height unchanged, half framerate */
- out = av_frame_clone(tinterlace->mode == MODE_DROP_EVEN ? cur : next);
- if (!out)
- return AVERROR(ENOMEM);
- av_frame_free(&tinterlace->next);
- break;
-
- case MODE_PAD: /* expand each frame to double height, but pad alternate
- * lines with black; framerate unchanged */
- out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
- if (!out)
- return AVERROR(ENOMEM);
- av_frame_copy_props(out, cur);
- out->height = outlink->h;
- out->sample_aspect_ratio = av_mul_q(cur->sample_aspect_ratio, av_make_q(2, 1));
-
- field = (1 + tinterlace->frame) & 1 ? FIELD_UPPER : FIELD_LOWER;
- /* copy upper and lower fields */
- copy_picture_field(tinterlace, out->data, out->linesize,
- (const uint8_t **)cur->data, cur->linesize,
- inlink->format, inlink->w, inlink->h,
- FIELD_UPPER_AND_LOWER, 1, field, tinterlace->flags);
- /* pad with black the other field */
- copy_picture_field(tinterlace, out->data, out->linesize,
- (const uint8_t **)tinterlace->black_data, tinterlace->black_linesize,
- inlink->format, inlink->w, inlink->h,
- FIELD_UPPER_AND_LOWER, 1, !field, tinterlace->flags);
- break;
-
- /* interleave upper/lower lines from odd frames with lower/upper lines from even frames,
- * halving the frame rate and preserving image height */
- case MODE_INTERLEAVE_TOP: /* top field first */
- case MODE_INTERLEAVE_BOTTOM: /* bottom field first */
- if ((tinterlace->flags & TINTERLACE_FLAG_BYPASS_IL) && cur->interlaced_frame) {
- av_log(ctx, AV_LOG_WARNING,
- "video is already interlaced, adjusting framerate only\n");
- out = av_frame_clone(cur);
- if (!out)
- return AVERROR(ENOMEM);
- out->pts /= 2; // adjust pts to new framerate
- ret = ff_filter_frame(outlink, out);
- return ret;
- }
- tff = tinterlace->mode == MODE_INTERLEAVE_TOP;
- out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
- if (!out)
- return AVERROR(ENOMEM);
- av_frame_copy_props(out, cur);
- out->interlaced_frame = 1;
- out->top_field_first = tff;
-
- /* copy upper/lower field from cur */
- copy_picture_field(tinterlace, out->data, out->linesize,
- (const uint8_t **)cur->data, cur->linesize,
- inlink->format, inlink->w, inlink->h,
- tff ? FIELD_UPPER : FIELD_LOWER, 1, tff ? FIELD_UPPER : FIELD_LOWER,
- tinterlace->flags);
- /* copy lower/upper field from next */
- copy_picture_field(tinterlace, out->data, out->linesize,
- (const uint8_t **)next->data, next->linesize,
- inlink->format, inlink->w, inlink->h,
- tff ? FIELD_LOWER : FIELD_UPPER, 1, tff ? FIELD_LOWER : FIELD_UPPER,
- tinterlace->flags);
- av_frame_free(&tinterlace->next);
- break;
- case MODE_INTERLACEX2: /* re-interlace preserving image height, double frame rate */
- /* output current frame first */
- out = av_frame_clone(cur);
- if (!out)
- return AVERROR(ENOMEM);
- out->interlaced_frame = 1;
- if (cur->pts != AV_NOPTS_VALUE)
- out->pts = cur->pts*2;
-
- out->pts = av_rescale_q(out->pts, tinterlace->preout_time_base, outlink->time_base);
- if ((ret = ff_filter_frame(outlink, out)) < 0)
- return ret;
-
- /* output mix of current and next frame */
- tff = next->top_field_first;
- out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
- if (!out)
- return AVERROR(ENOMEM);
- av_frame_copy_props(out, next);
- out->interlaced_frame = 1;
- out->top_field_first = !tff;
-
- if (next->pts != AV_NOPTS_VALUE && cur->pts != AV_NOPTS_VALUE)
- out->pts = cur->pts + next->pts;
- else
- out->pts = AV_NOPTS_VALUE;
- /* write current frame second field lines into the second field of the new frame */
- copy_picture_field(tinterlace, out->data, out->linesize,
- (const uint8_t **)cur->data, cur->linesize,
- inlink->format, inlink->w, inlink->h,
- tff ? FIELD_LOWER : FIELD_UPPER, 1, tff ? FIELD_LOWER : FIELD_UPPER,
- tinterlace->flags);
- /* write next frame first field lines into the first field of the new frame */
- copy_picture_field(tinterlace, out->data, out->linesize,
- (const uint8_t **)next->data, next->linesize,
- inlink->format, inlink->w, inlink->h,
- tff ? FIELD_UPPER : FIELD_LOWER, 1, tff ? FIELD_UPPER : FIELD_LOWER,
- tinterlace->flags);
- break;
- default:
- av_assert0(0);
- }
-
- out->pts = av_rescale_q(out->pts, tinterlace->preout_time_base, outlink->time_base);
- ret = ff_filter_frame(outlink, out);
- tinterlace->frame++;
-
- return ret;
-}
-
-static int init_interlace(AVFilterContext *ctx)
-{
- TInterlaceContext *tinterlace = ctx->priv;
-
- if (tinterlace->mode <= MODE_BFF)
- tinterlace->mode += MODE_INTERLEAVE_TOP;
-
- tinterlace->flags |= TINTERLACE_FLAG_BYPASS_IL;
- if (tinterlace->lowpass == VLPF_LIN)
- tinterlace->flags |= TINTERLACE_FLAG_VLPF;
- if (tinterlace->lowpass == VLPF_CMP)
- tinterlace->flags |= TINTERLACE_FLAG_CVLPF;
-
- return 0;
-}
-
-static const AVFilterPad tinterlace_inputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- .filter_frame = filter_frame,
- },
- { NULL }
-};
-
-static const AVFilterPad tinterlace_outputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- .config_props = config_out_props,
- },
- { NULL }
-};
-
-AVFilter ff_vf_tinterlace = {
- .name = "tinterlace",
- .description = NULL_IF_CONFIG_SMALL("Perform temporal field interlacing."),
- .priv_size = sizeof(TInterlaceContext),
- .uninit = uninit,
- .query_formats = query_formats,
- .inputs = tinterlace_inputs,
- .outputs = tinterlace_outputs,
- .priv_class = &tinterlace_class,
-};
-
-
-AVFilter ff_vf_interlace = {
- .name = "interlace",
- .description = NULL_IF_CONFIG_SMALL("Convert progressive video into interlaced."),
- .priv_size = sizeof(TInterlaceContext),
- .init = init_interlace,
- .uninit = uninit,
- .query_formats = query_formats,
- .inputs = tinterlace_inputs,
- .outputs = tinterlace_outputs,
- .priv_class = &interlace_class,
-};
diff --git a/libavfilter/vf_uspp.c b/libavfilter/vf_uspp.c
deleted file mode 100644
index da4029f..0000000
--- a/libavfilter/vf_uspp.c
+++ /dev/null
@@ -1,509 +0,0 @@
-/*
- * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
- * Copyright (c) 2014 Arwa Arif <arwaarif1994@gmail.com>
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/**
- * @file
- * Ultra Slow/Simple Post-processing filter.
- *
- * Originally written by Michael Niedermayer for the MPlayer project, and
- * ported by Arwa Arif for FFmpeg.
- */
-
-#include "libavutil/avassert.h"
-#include "libavutil/imgutils.h"
-#include "libavutil/opt.h"
-#include "libavutil/pixdesc.h"
-#include "internal.h"
-#include "avfilter.h"
-
-#define MAX_LEVEL 8 /* quality levels */
-#define BLOCK 16
-
-typedef struct USPPContext {
- const AVClass *av_class;
- int log2_count;
- int hsub, vsub;
- int qp;
- int qscale_type;
- int temp_stride[3];
- uint8_t *src[3];
- uint16_t *temp[3];
- int outbuf_size;
- uint8_t *outbuf;
- AVCodecContext *avctx_enc[BLOCK*BLOCK];
- AVFrame *frame;
- AVFrame *frame_dec;
- uint8_t *non_b_qp_table;
- int non_b_qp_alloc_size;
- int use_bframe_qp;
-} USPPContext;
-
-#define OFFSET(x) offsetof(USPPContext, x)
-#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
-static const AVOption uspp_options[] = {
- { "quality", "set quality", OFFSET(log2_count), AV_OPT_TYPE_INT, {.i64 = 3}, 0, MAX_LEVEL, FLAGS },
- { "qp", "force a constant quantizer parameter", OFFSET(qp), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 63, FLAGS },
- { "use_bframe_qp", "use B-frames' QP", OFFSET(use_bframe_qp), AV_OPT_TYPE_BOOL,{.i64 = 0}, 0, 1, FLAGS },
- { NULL }
-};
-
-AVFILTER_DEFINE_CLASS(uspp);
-
-DECLARE_ALIGNED(8, static const uint8_t, dither)[8][8] = {
- { 0*4, 48*4, 12*4, 60*4, 3*4, 51*4, 15*4, 63*4, },
- { 32*4, 16*4, 44*4, 28*4, 35*4, 19*4, 47*4, 31*4, },
- { 8*4, 56*4, 4*4, 52*4, 11*4, 59*4, 7*4, 55*4, },
- { 40*4, 24*4, 36*4, 20*4, 43*4, 27*4, 39*4, 23*4, },
- { 2*4, 50*4, 14*4, 62*4, 1*4, 49*4, 13*4, 61*4, },
- { 34*4, 18*4, 46*4, 30*4, 33*4, 17*4, 45*4, 29*4, },
- { 10*4, 58*4, 6*4, 54*4, 9*4, 57*4, 5*4, 53*4, },
- { 42*4, 26*4, 38*4, 22*4, 41*4, 25*4, 37*4, 21*4, },
-};
-
-static const uint8_t offset[511][2] = {
- { 0, 0},
- { 0, 0}, { 8, 8}, // quality 1
- { 0, 0}, { 4, 4}, {12, 8}, { 8,12}, // quality 2
- { 0, 0}, {10, 2}, { 4, 4}, {14, 6}, { 8, 8}, { 2,10}, {12,12}, { 6,14}, // quality 3
-
- { 0, 0}, {10, 2}, { 4, 4}, {14, 6}, { 8, 8}, { 2,10}, {12,12}, { 6,14},
- { 5, 1}, {15, 3}, { 9, 5}, { 3, 7}, {13, 9}, { 7,11}, { 1,13}, {11,15}, // quality 4
-
- { 0, 0}, { 8, 0}, { 0, 8}, { 8, 8}, { 5, 1}, {13, 1}, { 5, 9}, {13, 9},
- { 2, 2}, {10, 2}, { 2,10}, {10,10}, { 7, 3}, {15, 3}, { 7,11}, {15,11},
- { 4, 4}, {12, 4}, { 4,12}, {12,12}, { 1, 5}, { 9, 5}, { 1,13}, { 9,13},
- { 6, 6}, {14, 6}, { 6,14}, {14,14}, { 3, 7}, {11, 7}, { 3,15}, {11,15}, // quality 5
-
- { 0, 0}, { 8, 0}, { 0, 8}, { 8, 8}, { 4, 0}, {12, 0}, { 4, 8}, {12, 8},
- { 1, 1}, { 9, 1}, { 1, 9}, { 9, 9}, { 5, 1}, {13, 1}, { 5, 9}, {13, 9},
- { 3, 2}, {11, 2}, { 3,10}, {11,10}, { 7, 2}, {15, 2}, { 7,10}, {15,10},
- { 2, 3}, {10, 3}, { 2,11}, {10,11}, { 6, 3}, {14, 3}, { 6,11}, {14,11},
- { 0, 4}, { 8, 4}, { 0,12}, { 8,12}, { 4, 4}, {12, 4}, { 4,12}, {12,12},
- { 1, 5}, { 9, 5}, { 1,13}, { 9,13}, { 5, 5}, {13, 5}, { 5,13}, {13,13},
- { 3, 6}, {11, 6}, { 3,14}, {11,14}, { 7, 6}, {15, 6}, { 7,14}, {15,14},
- { 2, 7}, {10, 7}, { 2,15}, {10,15}, { 6, 7}, {14, 7}, { 6,15}, {14,15}, // quality 6
-
- { 0, 0}, { 8, 0}, { 0, 8}, { 8, 8}, { 0, 2}, { 8, 2}, { 0,10}, { 8,10},
- { 0, 4}, { 8, 4}, { 0,12}, { 8,12}, { 0, 6}, { 8, 6}, { 0,14}, { 8,14},
- { 1, 1}, { 9, 1}, { 1, 9}, { 9, 9}, { 1, 3}, { 9, 3}, { 1,11}, { 9,11},
- { 1, 5}, { 9, 5}, { 1,13}, { 9,13}, { 1, 7}, { 9, 7}, { 1,15}, { 9,15},
- { 2, 0}, {10, 0}, { 2, 8}, {10, 8}, { 2, 2}, {10, 2}, { 2,10}, {10,10},
- { 2, 4}, {10, 4}, { 2,12}, {10,12}, { 2, 6}, {10, 6}, { 2,14}, {10,14},
- { 3, 1}, {11, 1}, { 3, 9}, {11, 9}, { 3, 3}, {11, 3}, { 3,11}, {11,11},
- { 3, 5}, {11, 5}, { 3,13}, {11,13}, { 3, 7}, {11, 7}, { 3,15}, {11,15},
- { 4, 0}, {12, 0}, { 4, 8}, {12, 8}, { 4, 2}, {12, 2}, { 4,10}, {12,10},
- { 4, 4}, {12, 4}, { 4,12}, {12,12}, { 4, 6}, {12, 6}, { 4,14}, {12,14},
- { 5, 1}, {13, 1}, { 5, 9}, {13, 9}, { 5, 3}, {13, 3}, { 5,11}, {13,11},
- { 5, 5}, {13, 5}, { 5,13}, {13,13}, { 5, 7}, {13, 7}, { 5,15}, {13,15},
- { 6, 0}, {14, 0}, { 6, 8}, {14, 8}, { 6, 2}, {14, 2}, { 6,10}, {14,10},
- { 6, 4}, {14, 4}, { 6,12}, {14,12}, { 6, 6}, {14, 6}, { 6,14}, {14,14},
- { 7, 1}, {15, 1}, { 7, 9}, {15, 9}, { 7, 3}, {15, 3}, { 7,11}, {15,11},
- { 7, 5}, {15, 5}, { 7,13}, {15,13}, { 7, 7}, {15, 7}, { 7,15}, {15,15}, // quality 7
-
- { 0, 0}, { 8, 0}, { 0, 8}, { 8, 8}, { 4, 4}, {12, 4}, { 4,12}, {12,12},
- { 0, 4}, { 8, 4}, { 0,12}, { 8,12}, { 4, 0}, {12, 0}, { 4, 8}, {12, 8},
- { 2, 2}, {10, 2}, { 2,10}, {10,10}, { 6, 6}, {14, 6}, { 6,14}, {14,14},
- { 2, 6}, {10, 6}, { 2,14}, {10,14}, { 6, 2}, {14, 2}, { 6,10}, {14,10},
- { 0, 2}, { 8, 2}, { 0,10}, { 8,10}, { 4, 6}, {12, 6}, { 4,14}, {12,14},
- { 0, 6}, { 8, 6}, { 0,14}, { 8,14}, { 4, 2}, {12, 2}, { 4,10}, {12,10},
- { 2, 0}, {10, 0}, { 2, 8}, {10, 8}, { 6, 4}, {14, 4}, { 6,12}, {14,12},
- { 2, 4}, {10, 4}, { 2,12}, {10,12}, { 6, 0}, {14, 0}, { 6, 8}, {14, 8},
- { 1, 1}, { 9, 1}, { 1, 9}, { 9, 9}, { 5, 5}, {13, 5}, { 5,13}, {13,13},
- { 1, 5}, { 9, 5}, { 1,13}, { 9,13}, { 5, 1}, {13, 1}, { 5, 9}, {13, 9},
- { 3, 3}, {11, 3}, { 3,11}, {11,11}, { 7, 7}, {15, 7}, { 7,15}, {15,15},
- { 3, 7}, {11, 7}, { 3,15}, {11,15}, { 7, 3}, {15, 3}, { 7,11}, {15,11},
- { 1, 3}, { 9, 3}, { 1,11}, { 9,11}, { 5, 7}, {13, 7}, { 5,15}, {13,15},
- { 1, 7}, { 9, 7}, { 1,15}, { 9,15}, { 5, 3}, {13, 3}, { 5,11}, {13,11}, // quality 8
- { 3, 1}, {11, 1}, { 3, 9}, {11, 9}, { 7, 5}, {15, 5}, { 7,13}, {15,13},
- { 3, 5}, {11, 5}, { 3,13}, {11,13}, { 7, 1}, {15, 1}, { 7, 9}, {15, 9},
- { 0, 1}, { 8, 1}, { 0, 9}, { 8, 9}, { 4, 5}, {12, 5}, { 4,13}, {12,13},
- { 0, 5}, { 8, 5}, { 0,13}, { 8,13}, { 4, 1}, {12, 1}, { 4, 9}, {12, 9},
- { 2, 3}, {10, 3}, { 2,11}, {10,11}, { 6, 7}, {14, 7}, { 6,15}, {14,15},
- { 2, 7}, {10, 7}, { 2,15}, {10,15}, { 6, 3}, {14, 3}, { 6,11}, {14,11},
- { 0, 3}, { 8, 3}, { 0,11}, { 8,11}, { 4, 7}, {12, 7}, { 4,15}, {12,15},
- { 0, 7}, { 8, 7}, { 0,15}, { 8,15}, { 4, 3}, {12, 3}, { 4,11}, {12,11},
- { 2, 1}, {10, 1}, { 2, 9}, {10, 9}, { 6, 5}, {14, 5}, { 6,13}, {14,13},
- { 2, 5}, {10, 5}, { 2,13}, {10,13}, { 6, 1}, {14, 1}, { 6, 9}, {14, 9},
- { 1, 0}, { 9, 0}, { 1, 8}, { 9, 8}, { 5, 4}, {13, 4}, { 5,12}, {13,12},
- { 1, 4}, { 9, 4}, { 1,12}, { 9,12}, { 5, 0}, {13, 0}, { 5, 8}, {13, 8},
- { 3, 2}, {11, 2}, { 3,10}, {11,10}, { 7, 6}, {15, 6}, { 7,14}, {15,14},
- { 3, 6}, {11, 6}, { 3,14}, {11,14}, { 7, 2}, {15, 2}, { 7,10}, {15,10},
- { 1, 2}, { 9, 2}, { 1,10}, { 9,10}, { 5, 6}, {13, 6}, { 5,14}, {13,14},
- { 1, 6}, { 9, 6}, { 1,14}, { 9,14}, { 5, 2}, {13, 2}, { 5,10}, {13,10},
- { 3, 0}, {11, 0}, { 3, 8}, {11, 8}, { 7, 4}, {15, 4}, { 7,12}, {15,12},
- { 3, 4}, {11, 4}, { 3,12}, {11,12}, { 7, 0}, {15, 0}, { 7, 8}, {15, 8},
-};
-
-static void store_slice_c(uint8_t *dst, const uint16_t *src,
- int dst_stride, int src_stride,
- int width, int height, int log2_scale)
-{
- int y, x;
-
-#define STORE(pos) do { \
- temp = ((src[x + y * src_stride + pos] << log2_scale) + d[pos]) >> 8; \
- if (temp & 0x100) temp = ~(temp >> 31); \
- dst[x + y * dst_stride + pos] = temp; \
-} while (0)
-
- for (y = 0; y < height; y++) {
- const uint8_t *d = dither[y&7];
- for (x = 0; x < width; x += 8) {
- int temp;
- STORE(0);
- STORE(1);
- STORE(2);
- STORE(3);
- STORE(4);
- STORE(5);
- STORE(6);
- STORE(7);
- }
- }
-}
-
-static void filter(USPPContext *p, uint8_t *dst[3], uint8_t *src[3],
- int dst_stride[3], int src_stride[3], int width,
- int height, uint8_t *qp_store, int qp_stride)
-{
- int x, y, i, j;
- const int count = 1<<p->log2_count;
- int ret;
-
- for (i = 0; i < 3; i++) {
- int is_chroma = !!i;
- int w = AV_CEIL_RSHIFT(width, is_chroma ? p->hsub : 0);
- int h = AV_CEIL_RSHIFT(height, is_chroma ? p->vsub : 0);
- int stride = p->temp_stride[i];
- int block = BLOCK >> (is_chroma ? p->hsub : 0);
-
- if (!src[i] || !dst[i])
- continue;
- for (y = 0; y < h; y++) {
- int index = block + block * stride + y * stride;
-
- memcpy(p->src[i] + index, src[i] + y * src_stride[i], w );
- for (x = 0; x < block; x++) {
- p->src[i][index - x - 1] = p->src[i][index + x ];
- p->src[i][index + w + x ] = p->src[i][index + w - x - 1];
- }
- }
- for (y = 0; y < block; y++) {
- memcpy(p->src[i] + ( block-1-y) * stride, p->src[i] + ( y+block ) * stride, stride);
- memcpy(p->src[i] + (h+block +y) * stride, p->src[i] + (h-y+block-1) * stride, stride);
- }
-
- p->frame->linesize[i] = stride;
- memset(p->temp[i], 0, (h + 2 * block) * stride * sizeof(int16_t));
- }
-
- if (p->qp)
- p->frame->quality = p->qp * FF_QP2LAMBDA;
- else {
- int qpsum=0;
- int qpcount = (height>>4) * (height>>4);
-
- for (y = 0; y < (height>>4); y++) {
- for (x = 0; x < (width>>4); x++)
- qpsum += qp_store[x + y * qp_stride];
- }
- p->frame->quality = ff_norm_qscale((qpsum + qpcount/2) / qpcount, p->qscale_type) * FF_QP2LAMBDA;
- }
-// init per MB qscale stuff FIXME
- p->frame->height = height + BLOCK;
- p->frame->width = width + BLOCK;
-
- for (i = 0; i < count; i++) {
- const int x1 = offset[i+count-1][0];
- const int y1 = offset[i+count-1][1];
- const int x1c = x1 >> p->hsub;
- const int y1c = y1 >> p->vsub;
- const int BLOCKc = BLOCK >> p->hsub;
- int offset;
- AVPacket pkt = {0};
- int got_pkt_ptr;
-
- av_init_packet(&pkt);
- pkt.data = p->outbuf;
- pkt.size = p->outbuf_size;
-
- p->frame->data[0] = p->src[0] + x1 + y1 * p->frame->linesize[0];
- p->frame->data[1] = p->src[1] + x1c + y1c * p->frame->linesize[1];
- p->frame->data[2] = p->src[2] + x1c + y1c * p->frame->linesize[2];
- p->frame->format = p->avctx_enc[i]->pix_fmt;
-
- ret = avcodec_encode_video2(p->avctx_enc[i], &pkt, p->frame, &got_pkt_ptr);
- if (ret < 0) {
- av_log(p->avctx_enc[i], AV_LOG_ERROR, "Encoding failed\n");
- continue;
- }
-
- p->frame_dec = p->avctx_enc[i]->coded_frame;
-
- offset = (BLOCK-x1) + (BLOCK-y1) * p->frame_dec->linesize[0];
-
- for (y = 0; y < height; y++)
- for (x = 0; x < width; x++)
- p->temp[0][x + y * p->temp_stride[0]] += p->frame_dec->data[0][x + y * p->frame_dec->linesize[0] + offset];
-
- if (!src[2] || !dst[2])
- continue;
-
- offset = (BLOCKc-x1c) + (BLOCKc-y1c) * p->frame_dec->linesize[1];
-
- for (y = 0; y < AV_CEIL_RSHIFT(height, p->vsub); y++) {
- for (x = 0; x < AV_CEIL_RSHIFT(width, p->hsub); x++) {
- p->temp[1][x + y * p->temp_stride[1]] += p->frame_dec->data[1][x + y * p->frame_dec->linesize[1] + offset];
- p->temp[2][x + y * p->temp_stride[2]] += p->frame_dec->data[2][x + y * p->frame_dec->linesize[2] + offset];
- }
- }
- }
-
- for (j = 0; j < 3; j++) {
- int is_chroma = !!j;
- if (!dst[j])
- continue;
- store_slice_c(dst[j], p->temp[j], dst_stride[j], p->temp_stride[j],
- AV_CEIL_RSHIFT(width, is_chroma ? p->hsub : 0),
- AV_CEIL_RSHIFT(height, is_chroma ? p->vsub : 0),
- 8-p->log2_count);
- }
-}
-
-static int query_formats(AVFilterContext *ctx)
-{
- static const enum AVPixelFormat pix_fmts[] = {
- AV_PIX_FMT_YUV444P,
- AV_PIX_FMT_YUV420P,
- AV_PIX_FMT_YUV410P,
- AV_PIX_FMT_YUVJ444P,
- AV_PIX_FMT_YUVJ420P,
- AV_PIX_FMT_GRAY8,
- AV_PIX_FMT_NONE
- };
-
- AVFilterFormats *fmts_list = ff_make_format_list(pix_fmts);
- if (!fmts_list)
- return AVERROR(ENOMEM);
- return ff_set_common_formats(ctx, fmts_list);
-}
-
-static int config_input(AVFilterLink *inlink)
-{
-
- AVFilterContext *ctx = inlink->dst;
- USPPContext *uspp = ctx->priv;
- const int height = inlink->h;
- const int width = inlink->w;
- const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
- int i;
-
- AVCodec *enc = avcodec_find_encoder(AV_CODEC_ID_SNOW);
- if (!enc) {
- av_log(ctx, AV_LOG_ERROR, "SNOW encoder not found.\n");
- return AVERROR(EINVAL);
- }
-
- uspp->hsub = desc->log2_chroma_w;
- uspp->vsub = desc->log2_chroma_h;
-
- for (i = 0; i < 3; i++) {
- int is_chroma = !!i;
- int w = (width + 4 * BLOCK-1) & (~(2 * BLOCK-1));
- int h = (height + 4 * BLOCK-1) & (~(2 * BLOCK-1));
-
- if (is_chroma) {
- w = AV_CEIL_RSHIFT(w, uspp->hsub);
- h = AV_CEIL_RSHIFT(h, uspp->vsub);
- }
-
- uspp->temp_stride[i] = w;
- if (!(uspp->temp[i] = av_malloc_array(uspp->temp_stride[i], h * sizeof(int16_t))))
- return AVERROR(ENOMEM);
- if (!(uspp->src [i] = av_malloc_array(uspp->temp_stride[i], h * sizeof(uint8_t))))
- return AVERROR(ENOMEM);
- }
-
- for (i = 0; i < (1<<uspp->log2_count); i++) {
- AVCodecContext *avctx_enc;
- AVDictionary *opts = NULL;
- int ret;
-
- if (!(uspp->avctx_enc[i] = avcodec_alloc_context3(NULL)))
- return AVERROR(ENOMEM);
-
- avctx_enc = uspp->avctx_enc[i];
- avctx_enc->width = width + BLOCK;
- avctx_enc->height = height + BLOCK;
- avctx_enc->time_base = (AVRational){1,25}; // meaningless
- avctx_enc->gop_size = INT_MAX;
- avctx_enc->max_b_frames = 0;
- avctx_enc->pix_fmt = inlink->format;
- avctx_enc->flags = AV_CODEC_FLAG_QSCALE | AV_CODEC_FLAG_LOW_DELAY;
- avctx_enc->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL;
- avctx_enc->global_quality = 123;
- av_dict_set(&opts, "no_bitstream", "1", 0);
- ret = avcodec_open2(avctx_enc, enc, &opts);
- if (ret < 0)
- return ret;
- av_dict_free(&opts);
- av_assert0(avctx_enc->codec);
- }
-
- uspp->outbuf_size = (width + BLOCK) * (height + BLOCK) * 10;
- if (!(uspp->frame = av_frame_alloc()))
- return AVERROR(ENOMEM);
- if (!(uspp->outbuf = av_malloc(uspp->outbuf_size)))
- return AVERROR(ENOMEM);
-
- return 0;
-}
-
-static int filter_frame(AVFilterLink *inlink, AVFrame *in)
-{
- AVFilterContext *ctx = inlink->dst;
- USPPContext *uspp = ctx->priv;
- AVFilterLink *outlink = ctx->outputs[0];
- AVFrame *out = in;
-
- int qp_stride = 0;
- uint8_t *qp_table = NULL;
-
- /* if we are not in a constant user quantizer mode and we don't want to use
- * the quantizers from the B-frames (B-frames often have a higher QP), we
- * need to save the qp table from the last non B-frame; this is what the
- * following code block does */
- if (!uspp->qp) {
- qp_table = av_frame_get_qp_table(in, &qp_stride, &uspp->qscale_type);
-
- if (qp_table && !uspp->use_bframe_qp && in->pict_type != AV_PICTURE_TYPE_B) {
- int w, h;
-
- /* if the qp stride is not set, it means the QP are only defined on
- * a line basis */
- if (!qp_stride) {
- w = AV_CEIL_RSHIFT(inlink->w, 4);
- h = 1;
- } else {
- w = qp_stride;
- h = AV_CEIL_RSHIFT(inlink->h, 4);
- }
-
- if (w * h > uspp->non_b_qp_alloc_size) {
- int ret = av_reallocp_array(&uspp->non_b_qp_table, w, h);
- if (ret < 0) {
- uspp->non_b_qp_alloc_size = 0;
- return ret;
- }
- uspp->non_b_qp_alloc_size = w * h;
- }
-
- av_assert0(w * h <= uspp->non_b_qp_alloc_size);
- memcpy(uspp->non_b_qp_table, qp_table, w * h);
- }
- }
-
- if (uspp->log2_count && !ctx->is_disabled) {
- if (!uspp->use_bframe_qp && uspp->non_b_qp_table)
- qp_table = uspp->non_b_qp_table;
-
- if (qp_table || uspp->qp) {
-
- /* get a new frame if in-place is not possible or if the dimensions
- * are not multiple of 8 */
- if (!av_frame_is_writable(in) || (inlink->w & 7) || (inlink->h & 7)) {
- const int aligned_w = FFALIGN(inlink->w, 8);
- const int aligned_h = FFALIGN(inlink->h, 8);
-
- out = ff_get_video_buffer(outlink, aligned_w, aligned_h);
- if (!out) {
- av_frame_free(&in);
- return AVERROR(ENOMEM);
- }
- av_frame_copy_props(out, in);
- out->width = in->width;
- out->height = in->height;
- }
-
- filter(uspp, out->data, in->data, out->linesize, in->linesize,
- inlink->w, inlink->h, qp_table, qp_stride);
- }
- }
-
- if (in != out) {
- if (in->data[3])
- av_image_copy_plane(out->data[3], out->linesize[3],
- in ->data[3], in ->linesize[3],
- inlink->w, inlink->h);
- av_frame_free(&in);
- }
- return ff_filter_frame(outlink, out);
-}
-
-static av_cold void uninit(AVFilterContext *ctx)
-{
- USPPContext *uspp = ctx->priv;
- int i;
-
- for (i = 0; i < 3; i++) {
- av_freep(&uspp->temp[i]);
- av_freep(&uspp->src[i]);
- }
-
- for (i = 0; i < (1 << uspp->log2_count); i++) {
- avcodec_close(uspp->avctx_enc[i]);
- av_freep(&uspp->avctx_enc[i]);
- }
-
- av_freep(&uspp->non_b_qp_table);
- av_freep(&uspp->outbuf);
- av_frame_free(&uspp->frame);
-}
-
-static const AVFilterPad uspp_inputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- .config_props = config_input,
- .filter_frame = filter_frame,
- },
- { NULL }
-};
-
-static const AVFilterPad uspp_outputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- },
- { NULL }
-};
-
-AVFilter ff_vf_uspp = {
- .name = "uspp",
- .description = NULL_IF_CONFIG_SMALL("Apply Ultra Simple / Slow Post-processing filter."),
- .priv_size = sizeof(USPPContext),
- .uninit = uninit,
- .query_formats = query_formats,
- .inputs = uspp_inputs,
- .outputs = uspp_outputs,
- .priv_class = &uspp_class,
- .flags = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL,
-};
diff --git a/libavfilter/vf_vaguedenoiser.c b/libavfilter/vf_vaguedenoiser.c
deleted file mode 100644
index 023bd5d..0000000
--- a/libavfilter/vf_vaguedenoiser.c
+++ /dev/null
@@ -1,590 +0,0 @@
-/*
- * Copyright (c) 2003 LeFunGus, lefungus@altern.org
- *
- * This file is part of FFmpeg
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include <float.h>
-
-#include "libavutil/imgutils.h"
-#include "libavutil/attributes.h"
-#include "libavutil/common.h"
-#include "libavutil/pixdesc.h"
-#include "libavutil/intreadwrite.h"
-#include "libavutil/opt.h"
-
-#include "avfilter.h"
-#include "formats.h"
-#include "internal.h"
-#include "video.h"
-
-typedef struct VagueDenoiserContext {
- const AVClass *class;
-
- float threshold;
- float percent;
- int method;
- int nsteps;
- int planes;
-
- int depth;
- int bpc;
- int peak;
- int nb_planes;
- int planeheight[4];
- int planewidth[4];
-
- float *block;
- float *in;
- float *out;
- float *tmp;
-
- int hlowsize[4][32];
- int hhighsize[4][32];
- int vlowsize[4][32];
- int vhighsize[4][32];
-
- void (*thresholding)(float *block, const int width, const int height,
- const int stride, const float threshold,
- const float percent, const int nsteps);
-} VagueDenoiserContext;
-
-#define OFFSET(x) offsetof(VagueDenoiserContext, x)
-#define FLAGS AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_FILTERING_PARAM
-static const AVOption vaguedenoiser_options[] = {
- { "threshold", "set filtering strength", OFFSET(threshold), AV_OPT_TYPE_FLOAT, {.dbl=2.}, 0,DBL_MAX, FLAGS },
- { "method", "set filtering method", OFFSET(method), AV_OPT_TYPE_INT, {.i64=2 }, 0, 2, FLAGS, "method" },
- { "hard", "hard thresholding", 0, AV_OPT_TYPE_CONST, {.i64=0}, 0, 0, FLAGS, "method" },
- { "soft", "soft thresholding", 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, FLAGS, "method" },
- { "garrote", "garotte thresholding", 0, AV_OPT_TYPE_CONST, {.i64=2}, 0, 0, FLAGS, "method" },
- { "nsteps", "set number of steps", OFFSET(nsteps), AV_OPT_TYPE_INT, {.i64=6 }, 1, 32, FLAGS },
- { "percent", "set percent of full denoising", OFFSET(percent),AV_OPT_TYPE_FLOAT, {.dbl=85}, 0,100, FLAGS },
- { "planes", "set planes to filter", OFFSET(planes), AV_OPT_TYPE_INT, {.i64=15 }, 0, 15, FLAGS },
- { NULL }
-};
-
-AVFILTER_DEFINE_CLASS(vaguedenoiser);
-
-#define NPAD 10
-
-static const float analysis_low[9] = {
- 0.037828455506995f, -0.023849465019380f, -0.110624404418423f, 0.377402855612654f,
- 0.852698679009403f, 0.377402855612654f, -0.110624404418423f, -0.023849465019380f, 0.037828455506995f
-};
-
-static const float analysis_high[7] = {
- -0.064538882628938f, 0.040689417609558f, 0.418092273222212f, -0.788485616405664f,
- 0.418092273222212f, 0.040689417609558f, -0.064538882628938f
-};
-
-static const float synthesis_low[7] = {
- -0.064538882628938f, -0.040689417609558f, 0.418092273222212f, 0.788485616405664f,
- 0.418092273222212f, -0.040689417609558f, -0.064538882628938f
-};
-
-static const float synthesis_high[9] = {
- -0.037828455506995f, -0.023849465019380f, 0.110624404418423f, 0.377402855612654f,
- -0.852698679009403f, 0.377402855612654f, 0.110624404418423f, -0.023849465019380f, -0.037828455506995f
-};
-
-static int query_formats(AVFilterContext *ctx)
-{
- static const enum AVPixelFormat pix_fmts[] = {
- AV_PIX_FMT_GRAY8, AV_PIX_FMT_GRAY9, AV_PIX_FMT_GRAY10,
- AV_PIX_FMT_GRAY12, AV_PIX_FMT_GRAY14, AV_PIX_FMT_GRAY16,
- AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV411P,
- AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P,
- AV_PIX_FMT_YUV440P, AV_PIX_FMT_YUV444P,
- AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ422P,
- AV_PIX_FMT_YUVJ440P, AV_PIX_FMT_YUVJ444P,
- AV_PIX_FMT_YUVJ411P,
- AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV422P9, AV_PIX_FMT_YUV444P9,
- AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10,
- AV_PIX_FMT_YUV440P10,
- AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV420P12,
- AV_PIX_FMT_YUV440P12,
- AV_PIX_FMT_YUV444P14, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV420P14,
- AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16,
- AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10,
- AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP16,
- AV_PIX_FMT_YUVA420P, AV_PIX_FMT_YUVA422P, AV_PIX_FMT_YUVA444P,
- AV_PIX_FMT_YUVA444P9, AV_PIX_FMT_YUVA444P10, AV_PIX_FMT_YUVA444P12, AV_PIX_FMT_YUVA444P16,
- AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA422P12, AV_PIX_FMT_YUVA422P16,
- AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA420P16,
- AV_PIX_FMT_GBRAP, AV_PIX_FMT_GBRAP10, AV_PIX_FMT_GBRAP12, AV_PIX_FMT_GBRAP16,
- AV_PIX_FMT_NONE
- };
- AVFilterFormats *fmts_list = ff_make_format_list(pix_fmts);
- if (!fmts_list)
- return AVERROR(ENOMEM);
- return ff_set_common_formats(ctx, fmts_list);
-}
-
-static int config_input(AVFilterLink *inlink)
-{
- VagueDenoiserContext *s = inlink->dst->priv;
- const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
- int p, i, nsteps_width, nsteps_height, nsteps_max;
-
- s->depth = desc->comp[0].depth;
- s->bpc = (s->depth + 7) / 8;
- s->nb_planes = desc->nb_components;
-
- s->planeheight[1] = s->planeheight[2] = AV_CEIL_RSHIFT(inlink->h, desc->log2_chroma_h);
- s->planeheight[0] = s->planeheight[3] = inlink->h;
- s->planewidth[1] = s->planewidth[2] = AV_CEIL_RSHIFT(inlink->w, desc->log2_chroma_w);
- s->planewidth[0] = s->planewidth[3] = inlink->w;
-
- s->block = av_malloc_array(inlink->w * inlink->h, sizeof(*s->block));
- s->in = av_malloc_array(32 + FFMAX(inlink->w, inlink->h), sizeof(*s->in));
- s->out = av_malloc_array(32 + FFMAX(inlink->w, inlink->h), sizeof(*s->out));
- s->tmp = av_malloc_array(32 + FFMAX(inlink->w, inlink->h), sizeof(*s->tmp));
-
- if (!s->block || !s->in || !s->out || !s->tmp)
- return AVERROR(ENOMEM);
-
- s->threshold *= 1 << (s->depth - 8);
- s->peak = (1 << s->depth) - 1;
-
- nsteps_width = ((s->planes & 2 || s->planes & 4) && s->nb_planes > 1) ? s->planewidth[1] : s->planewidth[0];
- nsteps_height = ((s->planes & 2 || s->planes & 4) && s->nb_planes > 1) ? s->planeheight[1] : s->planeheight[0];
-
- for (nsteps_max = 1; nsteps_max < 15; nsteps_max++) {
- if (pow(2, nsteps_max) >= nsteps_width || pow(2, nsteps_max) >= nsteps_height)
- break;
- }
-
- s->nsteps = FFMIN(s->nsteps, nsteps_max - 2);
-
- for (p = 0; p < 4; p++) {
- s->hlowsize[p][0] = (s->planewidth[p] + 1) >> 1;
- s->hhighsize[p][0] = s->planewidth[p] >> 1;
- s->vlowsize[p][0] = (s->planeheight[p] + 1) >> 1;
- s->vhighsize[p][0] = s->planeheight[p] >> 1;
-
- for (i = 1; i < s->nsteps; i++) {
- s->hlowsize[p][i] = (s->hlowsize[p][i - 1] + 1) >> 1;
- s->hhighsize[p][i] = s->hlowsize[p][i - 1] >> 1;
- s->vlowsize[p][i] = (s->vlowsize[p][i - 1] + 1) >> 1;
- s->vhighsize[p][i] = s->vlowsize[p][i - 1] >> 1;
- }
- }
-
- return 0;
-}
-
-static inline void copy(const float *p1, float *p2, const int length)
-{
- memcpy(p2, p1, length * sizeof(float));
-}
-
-static inline void copyv(const float *p1, const int stride1, float *p2, const int length)
-{
- int i;
-
- for (i = 0; i < length; i++) {
- p2[i] = *p1;
- p1 += stride1;
- }
-}
-
-static inline void copyh(const float *p1, float *p2, const int stride2, const int length)
-{
- int i;
-
- for (i = 0; i < length; i++) {
- *p2 = p1[i];
- p2 += stride2;
- }
-}
-
-// Do symmetric extension of data using prescribed symmetries
-// Original values are in output[npad] through output[npad+size-1]
-// New values will be placed in output[0] through output[npad] and in output[npad+size] through output[2*npad+size-1] (note: end values may not be filled in)
-// extension at left bdry is ... 3 2 1 0 | 0 1 2 3 ...
-// same for right boundary
-// if right_ext=1 then ... 3 2 1 0 | 1 2 3
-static void symmetric_extension(float *output, const int size, const int left_ext, const int right_ext)
-{
- int first = NPAD;
- int last = NPAD - 1 + size;
- const int originalLast = last;
- int i, nextend, idx;
-
- if (left_ext == 2)
- output[--first] = output[NPAD];
- if (right_ext == 2)
- output[++last] = output[originalLast];
-
- // extend left end
- nextend = first;
- for (i = 0; i < nextend; i++)
- output[--first] = output[NPAD + 1 + i];
-
- idx = NPAD + NPAD - 1 + size;
-
- // extend right end
- nextend = idx - last;
- for (i = 0; i < nextend; i++)
- output[++last] = output[originalLast - 1 - i];
-}
-
-static void transform_step(float *input, float *output, const int size, const int low_size, VagueDenoiserContext *s)
-{
- int i;
-
- symmetric_extension(input, size, 1, 1);
-
- for (i = NPAD; i < NPAD + low_size; i++) {
- const float a = input[2 * i - 14] * analysis_low[0];
- const float b = input[2 * i - 13] * analysis_low[1];
- const float c = input[2 * i - 12] * analysis_low[2];
- const float d = input[2 * i - 11] * analysis_low[3];
- const float e = input[2 * i - 10] * analysis_low[4];
- const float f = input[2 * i - 9] * analysis_low[3];
- const float g = input[2 * i - 8] * analysis_low[2];
- const float h = input[2 * i - 7] * analysis_low[1];
- const float k = input[2 * i - 6] * analysis_low[0];
-
- output[i] = a + b + c + d + e + f + g + h + k;
- }
-
- for (i = NPAD; i < NPAD + low_size; i++) {
- const float a = input[2 * i - 12] * analysis_high[0];
- const float b = input[2 * i - 11] * analysis_high[1];
- const float c = input[2 * i - 10] * analysis_high[2];
- const float d = input[2 * i - 9] * analysis_high[3];
- const float e = input[2 * i - 8] * analysis_high[2];
- const float f = input[2 * i - 7] * analysis_high[1];
- const float g = input[2 * i - 6] * analysis_high[0];
-
- output[i + low_size] = a + b + c + d + e + f + g;
- }
-}
-
-static void invert_step(const float *input, float *output, float *temp, const int size, VagueDenoiserContext *s)
-{
- const int low_size = (size + 1) >> 1;
- const int high_size = size >> 1;
- int left_ext = 1, right_ext, i;
- int findex;
-
- memcpy(temp + NPAD, input + NPAD, low_size * sizeof(float));
-
- right_ext = (size % 2 == 0) ? 2 : 1;
- symmetric_extension(temp, low_size, left_ext, right_ext);
-
- memset(output, 0, (NPAD + NPAD + size) * sizeof(float));
- findex = (size + 2) >> 1;
-
- for (i = 9; i < findex + 11; i++) {
- const float a = temp[i] * synthesis_low[0];
- const float b = temp[i] * synthesis_low[1];
- const float c = temp[i] * synthesis_low[2];
- const float d = temp[i] * synthesis_low[3];
-
- output[2 * i - 13] += a;
- output[2 * i - 12] += b;
- output[2 * i - 11] += c;
- output[2 * i - 10] += d;
- output[2 * i - 9] += c;
- output[2 * i - 8] += b;
- output[2 * i - 7] += a;
- }
-
- memcpy(temp + NPAD, input + NPAD + low_size, high_size * sizeof(float));
-
- left_ext = 2;
- right_ext = (size % 2 == 0) ? 1 : 2;
- symmetric_extension(temp, high_size, left_ext, right_ext);
-
- for (i = 8; i < findex + 11; i++) {
- const float a = temp[i] * synthesis_high[0];
- const float b = temp[i] * synthesis_high[1];
- const float c = temp[i] * synthesis_high[2];
- const float d = temp[i] * synthesis_high[3];
- const float e = temp[i] * synthesis_high[4];
-
- output[2 * i - 13] += a;
- output[2 * i - 12] += b;
- output[2 * i - 11] += c;
- output[2 * i - 10] += d;
- output[2 * i - 9] += e;
- output[2 * i - 8] += d;
- output[2 * i - 7] += c;
- output[2 * i - 6] += b;
- output[2 * i - 5] += a;
- }
-}
-
-static void hard_thresholding(float *block, const int width, const int height,
- const int stride, const float threshold,
- const float percent, const int unused)
-{
- const float frac = 1.f - percent * 0.01f;
- int y, x;
-
- for (y = 0; y < height; y++) {
- for (x = 0; x < width; x++) {
- if (FFABS(block[x]) <= threshold)
- block[x] *= frac;
- }
- block += stride;
- }
-}
-
-static void soft_thresholding(float *block, const int width, const int height, const int stride,
- const float threshold, const float percent, const int nsteps)
-{
- const float frac = 1.f - percent * 0.01f;
- const float shift = threshold * 0.01f * percent;
- int w = width;
- int h = height;
- int y, x, l;
-
- for (l = 0; l < nsteps; l++) {
- w = (w + 1) >> 1;
- h = (h + 1) >> 1;
- }
-
- for (y = 0; y < height; y++) {
- const int x0 = (y < h) ? w : 0;
- for (x = x0; x < width; x++) {
- const float temp = FFABS(block[x]);
- if (temp <= threshold)
- block[x] *= frac;
- else
- block[x] = (block[x] < 0.f ? -1.f : (block[x] > 0.f ? 1.f : 0.f)) * (temp - shift);
- }
- block += stride;
- }
-}
-
-static void qian_thresholding(float *block, const int width, const int height,
- const int stride, const float threshold,
- const float percent, const int unused)
-{
- const float percent01 = percent * 0.01f;
- const float tr2 = threshold * threshold * percent01;
- const float frac = 1.f - percent01;
- int y, x;
-
- for (y = 0; y < height; y++) {
- for (x = 0; x < width; x++) {
- const float temp = FFABS(block[x]);
- if (temp <= threshold) {
- block[x] *= frac;
- } else {
- const float tp2 = temp * temp;
- block[x] *= (tp2 - tr2) / tp2;
- }
- }
- block += stride;
- }
-}
-
-static void filter(VagueDenoiserContext *s, AVFrame *in, AVFrame *out)
-{
- int p, y, x, i, j;
-
- for (p = 0; p < s->nb_planes; p++) {
- const int height = s->planeheight[p];
- const int width = s->planewidth[p];
- const uint8_t *srcp8 = in->data[p];
- const uint16_t *srcp16 = (const uint16_t *)in->data[p];
- uint8_t *dstp8 = out->data[p];
- uint16_t *dstp16 = (uint16_t *)out->data[p];
- float *output = s->block;
- int h_low_size0 = width;
- int v_low_size0 = height;
- int nsteps_transform = s->nsteps;
- int nsteps_invert = s->nsteps;
- const float *input = s->block;
-
- if (!((1 << p) & s->planes)) {
- av_image_copy_plane(out->data[p], out->linesize[p], in->data[p], in->linesize[p],
- s->planewidth[p] * s->bpc, s->planeheight[p]);
- continue;
- }
-
- if (s->depth <= 8) {
- for (y = 0; y < height; y++) {
- for (x = 0; x < width; x++)
- output[x] = srcp8[x];
- srcp8 += in->linesize[p];
- output += width;
- }
- } else {
- for (y = 0; y < height; y++) {
- for (x = 0; x < width; x++)
- output[x] = srcp16[x];
- srcp16 += in->linesize[p] / 2;
- output += width;
- }
- }
-
- while (nsteps_transform--) {
- int low_size = (h_low_size0 + 1) >> 1;
- float *input = s->block;
- for (j = 0; j < v_low_size0; j++) {
- copy(input, s->in + NPAD, h_low_size0);
- transform_step(s->in, s->out, h_low_size0, low_size, s);
- copy(s->out + NPAD, input, h_low_size0);
- input += width;
- }
-
- low_size = (v_low_size0 + 1) >> 1;
- input = s->block;
- for (j = 0; j < h_low_size0; j++) {
- copyv(input, width, s->in + NPAD, v_low_size0);
- transform_step(s->in, s->out, v_low_size0, low_size, s);
- copyh(s->out + NPAD, input, width, v_low_size0);
- input++;
- }
-
- h_low_size0 = (h_low_size0 + 1) >> 1;
- v_low_size0 = (v_low_size0 + 1) >> 1;
- }
-
- s->thresholding(s->block, width, height, width, s->threshold, s->percent, s->nsteps);
-
- while (nsteps_invert--) {
- const int idx = s->vlowsize[p][nsteps_invert] + s->vhighsize[p][nsteps_invert];
- const int idx2 = s->hlowsize[p][nsteps_invert] + s->hhighsize[p][nsteps_invert];
- float * idx3 = s->block;
- for (i = 0; i < idx2; i++) {
- copyv(idx3, width, s->in + NPAD, idx);
- invert_step(s->in, s->out, s->tmp, idx, s);
- copyh(s->out + NPAD, idx3, width, idx);
- idx3++;
- }
-
- idx3 = s->block;
- for (i = 0; i < idx; i++) {
- copy(idx3, s->in + NPAD, idx2);
- invert_step(s->in, s->out, s->tmp, idx2, s);
- copy(s->out + NPAD, idx3, idx2);
- idx3 += width;
- }
- }
-
- if (s->depth <= 8) {
- for (y = 0; y < height; y++) {
- for (x = 0; x < width; x++)
- dstp8[x] = av_clip_uint8(input[x] + 0.5f);
- input += width;
- dstp8 += out->linesize[p];
- }
- } else {
- for (y = 0; y < height; y++) {
- for (x = 0; x < width; x++)
- dstp16[x] = av_clip(input[x] + 0.5f, 0, s->peak);
- input += width;
- dstp16 += out->linesize[p] / 2;
- }
- }
- }
-}
-
-static int filter_frame(AVFilterLink *inlink, AVFrame *in)
-{
- AVFilterContext *ctx = inlink->dst;
- VagueDenoiserContext *s = ctx->priv;
- AVFilterLink *outlink = ctx->outputs[0];
- AVFrame *out;
- int direct = av_frame_is_writable(in);
-
- if (direct) {
- out = in;
- } else {
- out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
- if (!out) {
- av_frame_free(&in);
- return AVERROR(ENOMEM);
- }
-
- av_frame_copy_props(out, in);
- }
-
- filter(s, in, out);
-
- if (!direct)
- av_frame_free(&in);
-
- return ff_filter_frame(outlink, out);
-}
-
-static av_cold int init(AVFilterContext *ctx)
-{
- VagueDenoiserContext *s = ctx->priv;
-
- switch (s->method) {
- case 0:
- s->thresholding = hard_thresholding;
- break;
- case 1:
- s->thresholding = soft_thresholding;
- break;
- case 2:
- s->thresholding = qian_thresholding;
- break;
- }
-
- return 0;
-}
-
-static av_cold void uninit(AVFilterContext *ctx)
-{
- VagueDenoiserContext *s = ctx->priv;
-
- av_freep(&s->block);
- av_freep(&s->in);
- av_freep(&s->out);
- av_freep(&s->tmp);
-}
-
-static const AVFilterPad vaguedenoiser_inputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- .config_props = config_input,
- .filter_frame = filter_frame,
- },
- { NULL }
-};
-
-
-static const AVFilterPad vaguedenoiser_outputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO
- },
- { NULL }
-};
-
-AVFilter ff_vf_vaguedenoiser = {
- .name = "vaguedenoiser",
- .description = NULL_IF_CONFIG_SMALL("Apply a Wavelet based Denoiser."),
- .priv_size = sizeof(VagueDenoiserContext),
- .priv_class = &vaguedenoiser_class,
- .init = init,
- .uninit = uninit,
- .query_formats = query_formats,
- .inputs = vaguedenoiser_inputs,
- .outputs = vaguedenoiser_outputs,
- .flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
-};
diff --git a/libavfilter/vsrc_mptestsrc.c b/libavfilter/vsrc_mptestsrc.c
deleted file mode 100644
index 2ea736b..0000000
--- a/libavfilter/vsrc_mptestsrc.c
+++ /dev/null
@@ -1,369 +0,0 @@
-/*
- * Copyright (c) 2002 Michael Niedermayer <michaelni@gmx.at>
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/**
- * @file
- * MP test source, ported from MPlayer libmpcodecs/vf_test.c
- */
-
-#include "libavutil/avstring.h"
-#include "libavutil/opt.h"
-#include "libavutil/parseutils.h"
-#include "libavutil/pixdesc.h"
-#include "avfilter.h"
-#include "internal.h"
-#include "formats.h"
-#include "video.h"
-
-#define WIDTH 512
-#define HEIGHT 512
-
-enum test_type {
- TEST_DC_LUMA,
- TEST_DC_CHROMA,
- TEST_FREQ_LUMA,
- TEST_FREQ_CHROMA,
- TEST_AMP_LUMA,
- TEST_AMP_CHROMA,
- TEST_CBP,
- TEST_MV,
- TEST_RING1,
- TEST_RING2,
- TEST_ALL,
- TEST_NB
-};
-
-typedef struct MPTestContext {
- const AVClass *class;
- AVRational frame_rate;
- int64_t pts, max_pts, duration;
- int64_t max_frames;
- int hsub, vsub;
- int test; ///< test_type
-} MPTestContext;
-
-#define OFFSET(x) offsetof(MPTestContext, x)
-#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
-static const AVOption mptestsrc_options[]= {
- { "rate", "set video rate", OFFSET(frame_rate), AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, INT_MAX, FLAGS },
- { "r", "set video rate", OFFSET(frame_rate), AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, INT_MAX, FLAGS },
- { "duration", "set video duration", OFFSET(duration), AV_OPT_TYPE_DURATION, {.i64 = -1}, -1, INT64_MAX, FLAGS },
- { "d", "set video duration", OFFSET(duration), AV_OPT_TYPE_DURATION, {.i64 = -1}, -1, INT64_MAX, FLAGS },
-
- { "test", "set test to perform", OFFSET(test), AV_OPT_TYPE_INT, {.i64=TEST_ALL}, 0, INT_MAX, FLAGS, "test" },
- { "t", "set test to perform", OFFSET(test), AV_OPT_TYPE_INT, {.i64=TEST_ALL}, 0, INT_MAX, FLAGS, "test" },
- { "dc_luma", "", 0, AV_OPT_TYPE_CONST, {.i64=TEST_DC_LUMA}, INT_MIN, INT_MAX, FLAGS, "test" },
- { "dc_chroma", "", 0, AV_OPT_TYPE_CONST, {.i64=TEST_DC_CHROMA}, INT_MIN, INT_MAX, FLAGS, "test" },
- { "freq_luma", "", 0, AV_OPT_TYPE_CONST, {.i64=TEST_FREQ_LUMA}, INT_MIN, INT_MAX, FLAGS, "test" },
- { "freq_chroma", "", 0, AV_OPT_TYPE_CONST, {.i64=TEST_FREQ_CHROMA}, INT_MIN, INT_MAX, FLAGS, "test" },
- { "amp_luma", "", 0, AV_OPT_TYPE_CONST, {.i64=TEST_AMP_LUMA}, INT_MIN, INT_MAX, FLAGS, "test" },
- { "amp_chroma", "", 0, AV_OPT_TYPE_CONST, {.i64=TEST_AMP_CHROMA}, INT_MIN, INT_MAX, FLAGS, "test" },
- { "cbp", "", 0, AV_OPT_TYPE_CONST, {.i64=TEST_CBP}, INT_MIN, INT_MAX, FLAGS, "test" },
- { "mv", "", 0, AV_OPT_TYPE_CONST, {.i64=TEST_MV}, INT_MIN, INT_MAX, FLAGS, "test" },
- { "ring1", "", 0, AV_OPT_TYPE_CONST, {.i64=TEST_RING1}, INT_MIN, INT_MAX, FLAGS, "test" },
- { "ring2", "", 0, AV_OPT_TYPE_CONST, {.i64=TEST_RING2}, INT_MIN, INT_MAX, FLAGS, "test" },
- { "all", "", 0, AV_OPT_TYPE_CONST, {.i64=TEST_ALL}, INT_MIN, INT_MAX, FLAGS, "test" },
- { "max_frames", "Set the maximum number of frames generated for each test", OFFSET(max_frames),
- AV_OPT_TYPE_INT64, {.i64 = 30}, 1, INT64_MAX, FLAGS },
- { "m", "Set the maximum number of frames generated for each test", OFFSET(max_frames),
- AV_OPT_TYPE_INT64, {.i64 = 30}, 1, INT64_MAX, FLAGS },
- { NULL }
-};
-
-AVFILTER_DEFINE_CLASS(mptestsrc);
-
-static double c[64];
-
-static void init_idct(void)
-{
- int i, j;
-
- for (i = 0; i < 8; i++) {
- double s = i == 0 ? sqrt(0.125) : 0.5;
-
- for (j = 0; j < 8; j++)
- c[i*8+j] = s*cos((M_PI/8.0)*i*(j+0.5));
- }
-}
-
-static void idct(uint8_t *dst, int dst_linesize, int src[64])
-{
- int i, j, k;
- double tmp[64];
-
- for (i = 0; i < 8; i++) {
- for (j = 0; j < 8; j++) {
- double sum = 0.0;
-
- for (k = 0; k < 8; k++)
- sum += c[k*8+j] * src[8*i+k];
-
- tmp[8*i+j] = sum;
- }
- }
-
- for (j = 0; j < 8; j++) {
- for (i = 0; i < 8; i++) {
- double sum = 0.0;
-
- for (k = 0; k < 8; k++)
- sum += c[k*8+i]*tmp[8*k+j];
-
- dst[dst_linesize*i + j] = av_clip_uint8(lrint(sum));
- }
- }
-}
-
-static void draw_dc(uint8_t *dst, int dst_linesize, int color, int w, int h)
-{
- int x, y;
-
- for (y = 0; y < h; y++)
- for (x = 0; x < w; x++)
- dst[x + y*dst_linesize] = color;
-}
-
-static void draw_basis(uint8_t *dst, int dst_linesize, int amp, int freq, int dc)
-{
- int src[64];
-
- memset(src, 0, 64*sizeof(int));
- src[0] = dc;
- if (amp)
- src[freq] = amp;
- idct(dst, dst_linesize, src);
-}
-
-static void draw_cbp(uint8_t *dst[3], int dst_linesize[3], int cbp, int amp, int dc)
-{
- if (cbp&1) draw_basis(dst[0] , dst_linesize[0], amp, 1, dc);
- if (cbp&2) draw_basis(dst[0]+8 , dst_linesize[0], amp, 1, dc);
- if (cbp&4) draw_basis(dst[0]+ 8*dst_linesize[0], dst_linesize[0], amp, 1, dc);
- if (cbp&8) draw_basis(dst[0]+8+8*dst_linesize[0], dst_linesize[0], amp, 1, dc);
- if (cbp&16) draw_basis(dst[1] , dst_linesize[1], amp, 1, dc);
- if (cbp&32) draw_basis(dst[2] , dst_linesize[2], amp, 1, dc);
-}
-
-static void dc_test(uint8_t *dst, int dst_linesize, int w, int h, int off)
-{
- const int step = FFMAX(256/(w*h/256), 1);
- int x, y, color = off;
-
- for (y = 0; y < h; y += 16) {
- for (x = 0; x < w; x += 16) {
- draw_dc(dst + x + y*dst_linesize, dst_linesize, color, 8, 8);
- color += step;
- }
- }
-}
-
-static void freq_test(uint8_t *dst, int dst_linesize, int off)
-{
- int x, y, freq = 0;
-
- for (y = 0; y < 8*16; y += 16) {
- for (x = 0; x < 8*16; x += 16) {
- draw_basis(dst + x + y*dst_linesize, dst_linesize, 4*(96+off), freq, 128*8);
- freq++;
- }
- }
-}
-
-static void amp_test(uint8_t *dst, int dst_linesize, int off)
-{
- int x, y, amp = off;
-
- for (y = 0; y < 16*16; y += 16) {
- for (x = 0; x < 16*16; x += 16) {
- draw_basis(dst + x + y*dst_linesize, dst_linesize, 4*amp, 1, 128*8);
- amp++;
- }
- }
-}
-
-static void cbp_test(uint8_t *dst[3], int dst_linesize[3], int off)
-{
- int x, y, cbp = 0;
-
- for (y = 0; y < 16*8; y += 16) {
- for (x = 0; x < 16*8; x += 16) {
- uint8_t *dst1[3];
- dst1[0] = dst[0] + x*2 + y*2*dst_linesize[0];
- dst1[1] = dst[1] + x + y* dst_linesize[1];
- dst1[2] = dst[2] + x + y* dst_linesize[2];
-
- draw_cbp(dst1, dst_linesize, cbp, (64+off)*4, 128*8);
- cbp++;
- }
- }
-}
-
-static void mv_test(uint8_t *dst, int dst_linesize, int off)
-{
- int x, y;
-
- for (y = 0; y < 16*16; y++) {
- if (y&16)
- continue;
- for (x = 0; x < 16*16; x++)
- dst[x + y*dst_linesize] = x + off*8/(y/32+1);
- }
-}
-
-static void ring1_test(uint8_t *dst, int dst_linesize, int off)
-{
- int x, y, color = 0;
-
- for (y = off; y < 16*16; y += 16) {
- for (x = off; x < 16*16; x += 16) {
- draw_dc(dst + x + y*dst_linesize, dst_linesize, ((x+y)&16) ? color : -color, 16, 16);
- color++;
- }
- }
-}
-
-static void ring2_test(uint8_t *dst, int dst_linesize, int off)
-{
- int x, y;
-
- for (y = 0; y < 16*16; y++) {
- for (x = 0; x < 16*16; x++) {
- double d = hypot(x-8*16, y-8*16);
- double r = d/20 - (int)(d/20);
- if (r < off/30.0) {
- dst[x + y*dst_linesize] = 255;
- dst[x + y*dst_linesize+256] = 0;
- } else {
- dst[x + y*dst_linesize] = x;
- dst[x + y*dst_linesize+256] = x;
- }
- }
- }
-}
-
-static av_cold int init(AVFilterContext *ctx)
-{
- MPTestContext *test = ctx->priv;
-
- test->max_pts = test->duration >= 0 ?
- av_rescale_q(test->duration, AV_TIME_BASE_Q, av_inv_q(test->frame_rate)) : -1;
- test->pts = 0;
-
- av_log(ctx, AV_LOG_VERBOSE, "rate:%d/%d duration:%f\n",
- test->frame_rate.num, test->frame_rate.den,
- test->duration < 0 ? -1 : test->max_pts * av_q2d(av_inv_q(test->frame_rate)));
- init_idct();
-
- return 0;
-}
-
-static int config_props(AVFilterLink *outlink)
-{
- AVFilterContext *ctx = outlink->src;
- MPTestContext *test = ctx->priv;
- const AVPixFmtDescriptor *pix_desc = av_pix_fmt_desc_get(outlink->format);
-
- test->hsub = pix_desc->log2_chroma_w;
- test->vsub = pix_desc->log2_chroma_h;
-
- outlink->w = WIDTH;
- outlink->h = HEIGHT;
- outlink->time_base = av_inv_q(test->frame_rate);
-
- return 0;
-}
-
-static int query_formats(AVFilterContext *ctx)
-{
- static const enum AVPixelFormat pix_fmts[] = {
- AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE
- };
-
- AVFilterFormats *fmts_list = ff_make_format_list(pix_fmts);
- if (!fmts_list)
- return AVERROR(ENOMEM);
- return ff_set_common_formats(ctx, fmts_list);
-}
-
-static int request_frame(AVFilterLink *outlink)
-{
- MPTestContext *test = outlink->src->priv;
- AVFrame *picref;
- int w = WIDTH, h = HEIGHT,
- cw = AV_CEIL_RSHIFT(w, test->hsub), ch = AV_CEIL_RSHIFT(h, test->vsub);
- uint64_t frame = outlink->frame_count_in / test->max_frames;
- uint64_t mod = outlink->frame_count_in % test->max_frames;
- enum test_type tt = test->test;
- int i;
-
- if (test->max_pts >= 0 && test->pts > test->max_pts)
- return AVERROR_EOF;
- picref = ff_get_video_buffer(outlink, w, h);
- if (!picref)
- return AVERROR(ENOMEM);
- picref->pts = test->pts++;
-
- // clean image
- for (i = 0; i < h; i++)
- memset(picref->data[0] + i*picref->linesize[0], 0, w);
- for (i = 0; i < ch; i++) {
- memset(picref->data[1] + i*picref->linesize[1], 128, cw);
- memset(picref->data[2] + i*picref->linesize[2], 128, cw);
- }
-
- if (tt == TEST_ALL && mod) /* draw a black frame at the beginning of each test */
- tt = frame%(TEST_NB-1);
-
- switch (tt) {
- case TEST_DC_LUMA: dc_test(picref->data[0], picref->linesize[0], 256, 256, mod); break;
- case TEST_DC_CHROMA: dc_test(picref->data[1], picref->linesize[1], 256, 256, mod); break;
- case TEST_FREQ_LUMA: freq_test(picref->data[0], picref->linesize[0], mod); break;
- case TEST_FREQ_CHROMA: freq_test(picref->data[1], picref->linesize[1], mod); break;
- case TEST_AMP_LUMA: amp_test(picref->data[0], picref->linesize[0], mod); break;
- case TEST_AMP_CHROMA: amp_test(picref->data[1], picref->linesize[1], mod); break;
- case TEST_CBP: cbp_test(picref->data , picref->linesize , mod); break;
- case TEST_MV: mv_test(picref->data[0], picref->linesize[0], mod); break;
- case TEST_RING1: ring1_test(picref->data[0], picref->linesize[0], mod); break;
- case TEST_RING2: ring2_test(picref->data[0], picref->linesize[0], mod); break;
- }
-
- return ff_filter_frame(outlink, picref);
-}
-
-static const AVFilterPad mptestsrc_outputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- .request_frame = request_frame,
- .config_props = config_props,
- },
- { NULL }
-};
-
-AVFilter ff_vsrc_mptestsrc = {
- .name = "mptestsrc",
- .description = NULL_IF_CONFIG_SMALL("Generate various test pattern."),
- .priv_size = sizeof(MPTestContext),
- .priv_class = &mptestsrc_class,
- .init = init,
- .query_formats = query_formats,
- .inputs = NULL,
- .outputs = mptestsrc_outputs,
-};
diff --git a/libavfilter/x86/vf_fspp.asm b/libavfilter/x86/vf_fspp.asm
deleted file mode 100644
index c7f8f64..0000000
--- a/libavfilter/x86/vf_fspp.asm
+++ /dev/null
@@ -1,727 +0,0 @@
-;*****************************************************************************
-;* x86-optimized functions for fspp filter
-;*
-;* Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
-;* Copyright (C) 2005 Nikolaj Poroshin <porosh3@psu.ru>
-;*
-;* This file is part of FFmpeg.
-;*
-;* FFmpeg is free software; you can redistribute it and/or modify
-;* it under the terms of the GNU General Public License as published by
-;* the Free Software Foundation; either version 2 of the License, or
-;* (at your option) any later version.
-;*
-;* FFmpeg is distributed in the hope that it will be useful,
-;* but WITHOUT ANY WARRANTY; without even the implied warranty of
-;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;* GNU General Public License for more details.
-;*
-;* You should have received a copy of the GNU General Public License along
-;* with FFmpeg; if not, write to the Free Software Foundation, Inc.,
-;* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-;******************************************************************************
-
-%include "libavutil/x86/x86util.asm"
-
-SECTION_RODATA
-
-pb_dither: db 0, 48, 12, 60, 3, 51, 15, 63, 32, 16, 44, 28, 35, 19, 47, 31, \
- 8, 56, 4, 52, 11, 59, 7, 55, 40, 24, 36, 20, 43, 27, 39, 23, \
- 2, 50, 14, 62, 1, 49, 13, 61, 34, 18, 46, 30, 33, 17, 45, 29, \
- 10, 58, 6, 54, 9, 57, 5, 53, 42, 26, 38, 22, 41, 25, 37, 21
-pw_187E: times 4 dw 0x187E ; FIX64(0.382683433, 14)
-pw_22A3: times 4 dw 0x22A3 ; FIX64(1.082392200, 13)
-pw_2D41: times 4 dw 0x2D41 ; FIX64(1.414213562, 13)
-pw_539F: times 4 dw 0x539F ; FIX64(1.306562965, 14)
-pw_5A82: times 4 dw 0x5A82 ; FIX64(1.414213562, 14)
-pw_3B21: times 4 dw 0x3B21 ; FIX64(1.847759065, 13)
-pw_AC62: times 4 dw 0xAC62 ; FIX64(-2.613125930, 13)
-pw_3642: times 4 dw 0x3642 ; FIX64(0.847759065, 14)
-pw_2441: times 4 dw 0x2441 ; FIX64(0.566454497, 14)
-pw_0CBB: times 4 dw 0x0CBB ; FIX64(0.198912367, 14)
-pw_4: times 4 dw 4
-pw_2: times 4 dw 2
-
-SECTION .text
-
-%define DCTSIZE 8
-
-INIT_MMX mmx
-
-;void ff_store_slice_mmx(uint8_t *dst, int16_t *src,
-; ptrdiff_t dst_stride, ptrdiff_t src_stride,
-; ptrdiff_t width, ptrdiff_t height, ptrdiff_t log2_scale)
-%if ARCH_X86_64
-cglobal store_slice, 7, 9, 0, dst, src, dst_stride, src_stride, width, dither_height, dither, tmp, tmp2
-%else
-cglobal store_slice, 2, 7, 0, dst, src, width, dither_height, dither, tmp, tmp2
-%define dst_strideq r2m
-%define src_strideq r3m
- mov widthq, r4m
- mov dither_heightq, r5m
- mov ditherq, r6m ; log2_scale
-%endif
- add widthq, 7
- mov tmpq, src_strideq
- and widthq, ~7
- sub dst_strideq, widthq
- movd m5, ditherd ; log2_scale
- xor ditherq, -1 ; log2_scale
- mov tmp2q, tmpq
- add ditherq, 7 ; log2_scale
- neg tmpq
- sub tmp2q, widthq
- movd m2, ditherd ; log2_scale
- add tmp2q, tmp2q
- lea ditherq, [pb_dither]
- mov src_strideq, tmp2q
- shl tmpq, 4
- lea dither_heightq, [ditherq+dither_heightq*8]
- pxor m7, m7
-
-.loop_height:
- movq m3, [ditherq]
- movq m4, m3
- punpcklbw m3, m7
- punpckhbw m4, m7
- mov tmp2q, widthq
- psraw m3, m5
- psraw m4, m5
-
-.loop_width:
- movq [srcq+tmpq], m7
- movq m0, [srcq]
- movq m1, [srcq+8]
- movq [srcq+tmpq+8], m7
- paddw m0, m3
- paddw m1, m4
- movq [srcq], m7
- psraw m0, m2
- psraw m1, m2
- movq [srcq+8], m7
- packuswb m0, m1
- add srcq, 16
- movq [dstq], m0
- add dstq, 8
- sub tmp2q, 8
- jg .loop_width
-
- add srcq, src_strideq
- add ditherq, 8
- add dstq, dst_strideq
- cmp ditherq, dither_heightq
- jl .loop_height
- RET
-
-;void ff_store_slice2_mmx(uint8_t *dst, int16_t *src,
-; ptrdiff_t dst_stride, ptrdiff_t src_stride,
-; ptrdiff_t width, ptrdiff_t height, ptrdiff_t log2_scale)
-%if ARCH_X86_64
-cglobal store_slice2, 7, 9, 0, dst, src, dst_stride, src_stride, width, dither_height, dither, tmp, tmp2
-%else
-cglobal store_slice2, 0, 7, 0, dst, src, width, dither_height, dither, tmp, tmp2
-%define dst_strideq r2m
-%define src_strideq r3m
- mov dstq, dstm
- mov srcq, srcm
- mov widthq, r4m
- mov dither_heightq, r5m
- mov ditherq, r6m ; log2_scale
-%endif
- add widthq, 7
- mov tmpq, src_strideq
- and widthq, ~7
- sub dst_strideq, widthq
- movd m5, ditherd ; log2_scale
- xor ditherq, -1 ; log2_scale
- mov tmp2q, tmpq
- add ditherq, 7 ; log2_scale
- sub tmp2q, widthq
- movd m2, ditherd ; log2_scale
- add tmp2q, tmp2q
- lea ditherq, [pb_dither]
- mov src_strideq, tmp2q
- shl tmpq, 5
- lea dither_heightq, [ditherq+dither_heightq*8]
- pxor m7, m7
-
-.loop_height:
- movq m3, [ditherq]
- movq m4, m3
- punpcklbw m3, m7
- punpckhbw m4, m7
- mov tmp2q,widthq
- psraw m3, m5
- psraw m4, m5
-
-.loop_width:
- movq m0, [srcq]
- movq m1, [srcq+8]
- paddw m0, m3
- paddw m0, [srcq+tmpq]
- paddw m1, m4
- movq m6, [srcq+tmpq+8]
- movq [srcq+tmpq], m7
- psraw m0, m2
- paddw m1, m6
- movq [srcq+tmpq+8], m7
- psraw m1, m2
- packuswb m0, m1
- movq [dstq], m0
- add srcq, 16
- add dstq, 8
- sub tmp2q, 8
- jg .loop_width
-
- add srcq, src_strideq
- add ditherq, 8
- add dstq, dst_strideq
- cmp ditherq, dither_heightq
- jl .loop_height
- RET
-
-;void ff_mul_thrmat_mmx(int16_t *thr_adr_noq, int16_t *thr_adr, int q);
-cglobal mul_thrmat, 3, 3, 0, thrn, thr, q
- movd m7, qd
- movq m0, [thrnq]
- punpcklwd m7, m7
- movq m1, [thrnq+8]
- punpckldq m7, m7
- pmullw m0, m7
- movq m2, [thrnq+8*2]
- pmullw m1, m7
- movq m3, [thrnq+8*3]
- pmullw m2, m7
- movq [thrq], m0
- movq m4, [thrnq+8*4]
- pmullw m3, m7
- movq [thrq+8], m1
- movq m5, [thrnq+8*5]
- pmullw m4, m7
- movq [thrq+8*2], m2
- movq m6, [thrnq+8*6]
- pmullw m5, m7
- movq [thrq+8*3], m3
- movq m0, [thrnq+8*7]
- pmullw m6, m7
- movq [thrq+8*4], m4
- movq m1, [thrnq+8*7+8]
- pmullw m0, m7
- movq [thrq+8*5], m5
- movq m2, [thrnq+8*7+8*2]
- pmullw m1, m7
- movq [thrq+8*6], m6
- movq m3, [thrnq+8*7+8*3]
- pmullw m2, m7
- movq [thrq+8*7], m0
- movq m4, [thrnq+8*7+8*4]
- pmullw m3, m7
- movq [thrq+8*7+8], m1
- movq m5, [thrnq+8*7+8*5]
- pmullw m4, m7
- movq [thrq+8*7+8*2], m2
- movq m6, [thrnq+8*7+8*6]
- pmullw m5, m7
- movq [thrq+8*7+8*3], m3
- movq m0, [thrnq+14*8]
- pmullw m6, m7
- movq [thrq+8*7+8*4], m4
- movq m1, [thrnq+14*8+8]
- pmullw m0, m7
- movq [thrq+8*7+8*5], m5
- pmullw m1, m7
- movq [thrq+8*7+8*6], m6
- movq [thrq+14*8], m0
- movq [thrq+14*8+8], m1
- RET
-
-%macro COLUMN_FDCT 1-3 0, 0
- movq m1, [srcq+DCTSIZE*0*2]
- movq m7, [srcq+DCTSIZE*3*2]
- movq m0, m1
- paddw m1, [srcq+DCTSIZE*7*2]
- movq m3, m7
- paddw m7, [srcq+DCTSIZE*4*2]
- movq m5, m1
- movq m6, [srcq+DCTSIZE*1*2]
- psubw m1, m7
- movq m2, [srcq+DCTSIZE*2*2]
- movq m4, m6
- paddw m6, [srcq+DCTSIZE*6*2]
- paddw m5, m7
- paddw m2, [srcq+DCTSIZE*5*2]
- movq m7, m6
- paddw m6, m2
- psubw m7, m2
- movq m2, m5
- paddw m5, m6
- psubw m2, m6
- paddw m7, m1
- movq m6, [thrq+4*16+%2]
- psllw m7, 2
- psubw m5, [thrq+%2]
- psubw m2, m6
- paddusw m5, [thrq+%2]
- paddusw m2, m6
- pmulhw m7, [pw_2D41]
- paddw m5, [thrq+%2]
- paddw m2, m6
- psubusw m5, [thrq+%2]
- psubusw m2, m6
- paddw m5, [pw_2]
- movq m6, m2
- paddw m2, m5
- psubw m5, m6
- movq m6, m1
- paddw m1, m7
- psubw m1, [thrq+2*16+%2]
- psubw m6, m7
- movq m7, [thrq+6*16+%2]
- psraw m5, 2
- paddusw m1, [thrq+2*16+%2]
- psubw m6, m7
- paddw m1, [thrq+2*16+%2]
- paddusw m6, m7
- psubusw m1, [thrq+2*16+%2]
- paddw m6, m7
- psubw m3, [srcq+DCTSIZE*4*2]
- psubusw m6, m7
- movq m7, m1
- psraw m2, 2
- psubw m4, [srcq+DCTSIZE*6*2]
- psubw m1, m6
- psubw m0, [srcq+DCTSIZE*7*2]
- paddw m6, m7
- psraw m6, 2
- movq m7, m2
- pmulhw m1, [pw_5A82]
- paddw m2, m6
- movq [rsp], m2
- psubw m7, m6
- movq m2, [srcq+DCTSIZE*2*2]
- psubw m1, m6
- psubw m2, [srcq+DCTSIZE*5*2]
- movq m6, m5
- movq [rsp+8*3], m7
- paddw m3, m2
- paddw m2, m4
- paddw m4, m0
- movq m7, m3
- psubw m3, m4
- psllw m3, 2
- psllw m7, 2
- pmulhw m3, [pw_187E]
- psllw m4, 2
- pmulhw m7, [pw_22A3]
- psllw m2, 2
- pmulhw m4, [pw_539F]
- paddw m5, m1
- pmulhw m2, [pw_2D41]
- psubw m6, m1
- paddw m7, m3
- movq [rsp+8], m5
- paddw m4, m3
- movq m3, [thrq+3*16+%2]
- movq m1, m0
- movq [rsp+8*2], m6
- psubw m1, m2
- paddw m0, m2
- movq m5, m1
- movq m2, [thrq+5*16+%2]
- psubw m1, m7
- paddw m5, m7
- psubw m1, m3
- movq m7, [thrq+16+%2]
- psubw m5, m2
- movq m6, m0
- paddw m0, m4
- paddusw m1, m3
- psubw m6, m4
- movq m4, [thrq+7*16+%2]
- psubw m0, m7
- psubw m6, m4
- paddusw m5, m2
- paddusw m6, m4
- paddw m1, m3
- paddw m5, m2
- paddw m6, m4
- psubusw m1, m3
- psubusw m5, m2
- psubusw m6, m4
- movq m4, m1
- por m4, m5
- paddusw m0, m7
- por m4, m6
- paddw m0, m7
- packssdw m4, m4
- psubusw m0, m7
- movd tmpd, m4
- or tmpd, tmpd
- jnz %1
- movq m4, [rsp]
- movq m1, m0
- pmulhw m0, [pw_3642]
- movq m2, m1
- movq m5, [outq+DCTSIZE*0*2]
- movq m3, m2
- pmulhw m1, [pw_2441]
- paddw m5, m4
- movq m6, [rsp+8]
- psraw m3, 2
- pmulhw m2, [pw_0CBB]
- psubw m4, m3
- movq m7, [outq+DCTSIZE*1*2]
- paddw m5, m3
- movq [outq+DCTSIZE*7*2], m4
- paddw m7, m6
- movq m3, [rsp+8*2]
- psubw m6, m0
- movq m4, [outq+DCTSIZE*2*2]
- paddw m7, m0
- movq [outq], m5
- paddw m4, m3
- movq [outq+DCTSIZE*6*2], m6
- psubw m3, m1
- movq m5, [outq+DCTSIZE*5*2]
- paddw m4, m1
- movq m6, [outq+DCTSIZE*3*2]
- paddw m5, m3
- movq m0, [rsp+8*3]
- add srcq, 8+%3
- movq [outq+DCTSIZE*1*2], m7
- paddw m6, m0
- movq [outq+DCTSIZE*2*2], m4
- psubw m0, m2
- movq m7, [outq+DCTSIZE*4*2]
- paddw m6, m2
- movq [outq+DCTSIZE*5*2], m5
- paddw m7, m0
- movq [outq+DCTSIZE*3*2], m6
- movq [outq+DCTSIZE*4*2], m7
- add outq, 8+%3
-%endmacro
-
-%macro COLUMN_IDCT 0-1 0
- movq m3, m5
- psubw m5, m1
- psllw m5, 1
- paddw m3, m1
- movq m2, m0
- psubw m0, m6
- movq m1, m5
- psllw m0, 1
- pmulhw m1, [pw_AC62]
- paddw m5, m0
- pmulhw m5, [pw_3B21]
- paddw m2, m6
- pmulhw m0, [pw_22A3]
- movq m7, m2
- movq m4, [rsp]
- psubw m2, m3
- psllw m2, 1
- paddw m7, m3
- pmulhw m2, [pw_2D41]
- movq m6, m4
- psraw m7, 2
- paddw m4, [outq]
- psubw m6, m7
- movq m3, [rsp+8]
- paddw m4, m7
- movq [outq+DCTSIZE*7*2], m6
- paddw m1, m5
- movq [outq], m4
- psubw m1, m7
- movq m7, [rsp+8*2]
- psubw m0, m5
- movq m6, [rsp+8*3]
- movq m5, m3
- paddw m3, [outq+DCTSIZE*1*2]
- psubw m5, m1
- psubw m2, m1
- paddw m3, m1
- movq [outq+DCTSIZE*6*2], m5
- movq m4, m7
- paddw m7, [outq+DCTSIZE*2*2]
- psubw m4, m2
- paddw m4, [outq+DCTSIZE*5*2]
- paddw m7, m2
- movq [outq+DCTSIZE*1*2], m3
- paddw m0, m2
- movq [outq+DCTSIZE*2*2], m7
- movq m1, m6
- paddw m6, [outq+DCTSIZE*4*2]
- psubw m1, m0
- paddw m1, [outq+DCTSIZE*3*2]
- paddw m6, m0
- movq [outq+DCTSIZE*5*2], m4
- add srcq, 8+%1
- movq [outq+DCTSIZE*4*2], m6
- movq [outq+DCTSIZE*3*2], m1
- add outq, 8+%1
-%endmacro
-
-;void ff_column_fidct_mmx(int16_t *thr_adr, int16_t *data, int16_t *output, int cnt);
-cglobal column_fidct, 4, 5, 0, 32, thr, src, out, cnt, tmp
-.fdct1:
- COLUMN_FDCT .idct1
- jmp .fdct2
-
-.idct1:
- COLUMN_IDCT
-
-.fdct2:
- COLUMN_FDCT .idct2, 8, 16
- sub cntd, 2
- jg .fdct1
- RET
-
-.idct2:
- COLUMN_IDCT 16
- sub cntd, 2
- jg .fdct1
- RET
-
-;void ff_row_idct_mmx(int16_t *workspace, int16_t *output_adr, ptrdiff_t output_stride, int cnt);
-cglobal row_idct, 4, 5, 0, 16, src, dst, stride, cnt, stride3
- add strideq, strideq
- lea stride3q, [strideq+strideq*2]
-.loop:
- movq m0, [srcq+DCTSIZE*0*2]
- movq m1, [srcq+DCTSIZE*1*2]
- movq m4, m0
- movq m2, [srcq+DCTSIZE*2*2]
- punpcklwd m0, m1
- movq m3, [srcq+DCTSIZE*3*2]
- punpckhwd m4, m1
- movq m7, m2
- punpcklwd m2, m3
- movq m6, m0
- punpckldq m0, m2
- punpckhdq m6, m2
- movq m5, m0
- punpckhwd m7, m3
- psubw m0, m6
- pmulhw m0, [pw_5A82]
- movq m2, m4
- punpckldq m4, m7
- paddw m5, m6
- punpckhdq m2, m7
- movq m1, m4
- psllw m0, 2
- paddw m4, m2
- movq m3, [srcq+DCTSIZE*0*2+8]
- psubw m1, m2
- movq m2, [srcq+DCTSIZE*1*2+8]
- psubw m0, m5
- movq m6, m4
- paddw m4, m5
- psubw m6, m5
- movq m7, m1
- movq m5, [srcq+DCTSIZE*2*2+8]
- paddw m1, m0
- movq [rsp], m4
- movq m4, m3
- movq [rsp+8], m6
- punpcklwd m3, m2
- movq m6, [srcq+DCTSIZE*3*2+8]
- punpckhwd m4, m2
- movq m2, m5
- punpcklwd m5, m6
- psubw m7, m0
- punpckhwd m2, m6
- movq m0, m3
- punpckldq m3, m5
- punpckhdq m0, m5
- movq m5, m4
- movq m6, m3
- punpckldq m4, m2
- psubw m3, m0
- punpckhdq m5, m2
- paddw m6, m0
- movq m2, m4
- movq m0, m3
- psubw m4, m5
- pmulhw m0, [pw_AC62]
- paddw m3, m4
- pmulhw m3, [pw_3B21]
- paddw m2, m5
- pmulhw m4, [pw_22A3]
- movq m5, m2
- psubw m2, m6
- paddw m5, m6
- pmulhw m2, [pw_2D41]
- paddw m0, m3
- psllw m0, 3
- psubw m4, m3
- movq m6, [rsp]
- movq m3, m1
- psllw m4, 3
- psubw m0, m5
- psllw m2, 3
- paddw m1, m0
- psubw m2, m0
- psubw m3, m0
- paddw m4, m2
- movq m0, m7
- paddw m7, m2
- psubw m0, m2
- movq m2, [pw_4]
- psubw m6, m5
- paddw m5, [rsp]
- paddw m1, m2
- paddw m5, m2
- psraw m1, 3
- paddw m7, m2
- psraw m5, 3
- paddw m5, [dstq]
- psraw m7, 3
- paddw m1, [dstq+strideq*1]
- paddw m0, m2
- paddw m7, [dstq+strideq*2]
- paddw m3, m2
- movq [dstq], m5
- paddw m6, m2
- movq [dstq+strideq*1], m1
- psraw m0, 3
- movq [dstq+strideq*2], m7
- add dstq, stride3q
- movq m5, [rsp+8]
- psraw m3, 3
- paddw m0, [dstq+strideq*2]
- psubw m5, m4
- paddw m3, [dstq+stride3q*1]
- psraw m6, 3
- paddw m4, [rsp+8]
- paddw m5, m2
- paddw m6, [dstq+strideq*4]
- paddw m4, m2
- movq [dstq+strideq*2], m0
- psraw m5, 3
- paddw m5, [dstq]
- psraw m4, 3
- paddw m4, [dstq+strideq*1]
- add srcq, DCTSIZE*2*4
- movq [dstq+stride3q*1], m3
- movq [dstq+strideq*4], m6
- movq [dstq], m5
- movq [dstq+strideq*1], m4
- sub dstq, stride3q
- add dstq, 8
- dec r3d
- jnz .loop
- RET
-
-;void ff_row_fdct_mmx(int16_t *data, const uint8_t *pixels, ptrdiff_t line_size, int cnt);
-cglobal row_fdct, 4, 5, 0, 16, src, pix, stride, cnt, stride3
- lea stride3q, [strideq+strideq*2]
-.loop:
- movd m0, [pixq]
- pxor m7, m7
- movd m1, [pixq+strideq*1]
- punpcklbw m0, m7
- movd m2, [pixq+strideq*2]
- punpcklbw m1, m7
- punpcklbw m2, m7
- add pixq,stride3q
- movq m5, m0
- movd m3, [pixq+strideq*4]
- movq m6, m1
- movd m4, [pixq+stride3q*1]
- punpcklbw m3, m7
- psubw m5, m3
- punpcklbw m4, m7
- paddw m0, m3
- psubw m6, m4
- movd m3, [pixq+strideq*2]
- paddw m1, m4
- movq [rsp], m5
- punpcklbw m3, m7
- movq [rsp+8], m6
- movq m4, m2
- movd m5, [pixq]
- paddw m2, m3
- movd m6, [pixq+strideq*1]
- punpcklbw m5, m7
- psubw m4, m3
- punpcklbw m6, m7
- movq m3, m5
- paddw m5, m6
- psubw m3, m6
- movq m6, m0
- movq m7, m1
- psubw m0, m5
- psubw m1, m2
- paddw m7, m2
- paddw m1, m0
- movq m2, m7
- psllw m1, 2
- paddw m6, m5
- pmulhw m1, [pw_2D41]
- paddw m7, m6
- psubw m6, m2
- movq m5, m0
- movq m2, m7
- punpcklwd m7, m6
- paddw m0, m1
- punpckhwd m2, m6
- psubw m5, m1
- movq m6, m0
- movq m1, [rsp+8]
- punpcklwd m0, m5
- punpckhwd m6, m5
- movq m5, m0
- punpckldq m0, m7
- paddw m3, m4
- punpckhdq m5, m7
- movq m7, m6
- movq [srcq+DCTSIZE*0*2], m0
- punpckldq m6, m2
- movq [srcq+DCTSIZE*1*2], m5
- punpckhdq m7, m2
- movq [srcq+DCTSIZE*2*2], m6
- paddw m4, m1
- movq [srcq+DCTSIZE*3*2], m7
- psllw m3, 2
- movq m2, [rsp]
- psllw m4, 2
- pmulhw m4, [pw_2D41]
- paddw m1, m2
- psllw m1, 2
- movq m0, m3
- pmulhw m0, [pw_22A3]
- psubw m3, m1
- pmulhw m3, [pw_187E]
- movq m5, m2
- pmulhw m1, [pw_539F]
- psubw m2, m4
- paddw m5, m4
- movq m6, m2
- paddw m0, m3
- movq m7, m5
- paddw m2, m0
- psubw m6, m0
- movq m4, m2
- paddw m1, m3
- punpcklwd m2, m6
- paddw m5, m1
- punpckhwd m4, m6
- psubw m7, m1
- movq m6, m5
- punpcklwd m5, m7
- punpckhwd m6, m7
- movq m7, m2
- punpckldq m2, m5
- sub pixq, stride3q
- punpckhdq m7, m5
- movq m5, m4
- movq [srcq+DCTSIZE*0*2+8], m2
- punpckldq m4, m6
- movq [srcq+DCTSIZE*1*2+8], m7
- punpckhdq m5, m6
- movq [srcq+DCTSIZE*2*2+8], m4
- add pixq, 4
- movq [srcq+DCTSIZE*3*2+8], m5
- add srcq, DCTSIZE*4*2
- dec cntd
- jnz .loop
- RET
diff --git a/libavfilter/x86/vf_fspp_init.c b/libavfilter/x86/vf_fspp_init.c
deleted file mode 100644
index 8e00317..0000000
--- a/libavfilter/x86/vf_fspp_init.c
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
- * Copyright (C) 2005 Nikolaj Poroshin <porosh3@psu.ru>
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "libavutil/attributes.h"
-#include "libavutil/x86/cpu.h"
-#include "libavfilter/vf_fspp.h"
-
-void ff_store_slice_mmx(uint8_t *dst, int16_t *src,
- ptrdiff_t dst_stride, ptrdiff_t src_stride,
- ptrdiff_t width, ptrdiff_t height, ptrdiff_t log2_scale);
-void ff_store_slice2_mmx(uint8_t *dst, int16_t *src,
- ptrdiff_t dst_stride, ptrdiff_t src_stride,
- ptrdiff_t width, ptrdiff_t height, ptrdiff_t log2_scale);
-void ff_mul_thrmat_mmx(int16_t *thr_adr_noq, int16_t *thr_adr, int q);
-void ff_column_fidct_mmx(int16_t *thr_adr, int16_t *data, int16_t *output, int cnt);
-void ff_row_idct_mmx(int16_t *workspace, int16_t *output_adr, ptrdiff_t output_stride, int cnt);
-void ff_row_fdct_mmx(int16_t *data, const uint8_t *pixels, ptrdiff_t line_size, int cnt);
-
-av_cold void ff_fspp_init_x86(FSPPContext *s)
-{
- int cpu_flags = av_get_cpu_flags();
-
- if (EXTERNAL_MMX(cpu_flags)) {
- s->store_slice = ff_store_slice_mmx;
- s->store_slice2 = ff_store_slice2_mmx;
- s->mul_thrmat = ff_mul_thrmat_mmx;
- s->column_fidct = ff_column_fidct_mmx;
- s->row_idct = ff_row_idct_mmx;
- s->row_fdct = ff_row_fdct_mmx;
- }
-}
diff --git a/libavfilter/x86/vf_hqdn3d_init.c b/libavfilter/x86/vf_hqdn3d_init.c
deleted file mode 100644
index 43aca90..0000000
--- a/libavfilter/x86/vf_hqdn3d_init.c
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (c) 2012 Loren Merritt
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "libavutil/attributes.h"
-#include "libavfilter/vf_hqdn3d.h"
-#include "config.h"
-
-void ff_hqdn3d_row_8_x86(uint8_t *src, uint8_t *dst, uint16_t *line_ant,
- uint16_t *frame_ant, ptrdiff_t w, int16_t *spatial,
- int16_t *temporal);
-void ff_hqdn3d_row_9_x86(uint8_t *src, uint8_t *dst, uint16_t *line_ant,
- uint16_t *frame_ant, ptrdiff_t w, int16_t *spatial,
- int16_t *temporal);
-void ff_hqdn3d_row_10_x86(uint8_t *src, uint8_t *dst, uint16_t *line_ant,
- uint16_t *frame_ant, ptrdiff_t w, int16_t *spatial,
- int16_t *temporal);
-void ff_hqdn3d_row_16_x86(uint8_t *src, uint8_t *dst, uint16_t *line_ant,
- uint16_t *frame_ant, ptrdiff_t w, int16_t *spatial,
- int16_t *temporal);
-
-av_cold void ff_hqdn3d_init_x86(HQDN3DContext *hqdn3d)
-{
-#if HAVE_X86ASM
- hqdn3d->denoise_row[8] = ff_hqdn3d_row_8_x86;
- hqdn3d->denoise_row[9] = ff_hqdn3d_row_9_x86;
- hqdn3d->denoise_row[10] = ff_hqdn3d_row_10_x86;
- hqdn3d->denoise_row[16] = ff_hqdn3d_row_16_x86;
-#endif /* HAVE_X86ASM */
-}
diff --git a/libavfilter/x86/vf_interlace.asm b/libavfilter/x86/vf_interlace.asm
deleted file mode 100644
index f4a405c..0000000
--- a/libavfilter/x86/vf_interlace.asm
+++ /dev/null
@@ -1,226 +0,0 @@
-;*****************************************************************************
-;* x86-optimized functions for interlace filter
-;*
-;* Copyright (C) 2014 Kieran Kunhya <kierank@obe.tv>
-;* Copyright (c) 2014 Michael Niedermayer <michaelni@gmx.at>
-;* Copyright (c) 2017 Thomas Mundt <tmundt75@gmail.com>
-;*
-;* This file is part of FFmpeg.
-;*
-;* FFmpeg is free software; you can redistribute it and/or modify
-;* it under the terms of the GNU General Public License as published by
-;* the Free Software Foundation; either version 2 of the License, or
-;* (at your option) any later version.
-;*
-;* FFmpeg is distributed in the hope that it will be useful,
-;* but WITHOUT ANY WARRANTY; without even the implied warranty of
-;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;* GNU General Public License for more details.
-;*
-;* You should have received a copy of the GNU General Public License along
-;* with FFmpeg; if not, write to the Free Software Foundation, Inc.,
-;* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-;******************************************************************************
-
-%include "libavutil/x86/x86util.asm"
-
-SECTION_RODATA
-
-pw_4: times 8 dw 4
-
-SECTION .text
-
-%macro LOWPASS 1
- add dstq, hq
- add srcq, hq
- add mrefq, srcq
- add prefq, srcq
- neg hq
-
- pcmpeq%1 m6, m6
-
- test hq, mmsize
- je .loop
-
- ;process 1 * mmsize
- movu m0, [mrefq+hq]
- pavg%1 m0, [prefq+hq]
- pxor m0, m6
- pxor m2, m6, [srcq+hq]
- pavg%1 m0, m2
- pxor m0, m6
- movu [dstq+hq], m0
- add hq, mmsize
- jge .end
-
-.loop:
- movu m0, [mrefq+hq]
- movu m1, [mrefq+hq+mmsize]
- pavg%1 m0, [prefq+hq]
- pavg%1 m1, [prefq+hq+mmsize]
- pxor m0, m6
- pxor m1, m6
- pxor m2, m6, [srcq+hq]
- pxor m3, m6, [srcq+hq+mmsize]
- pavg%1 m0, m2
- pavg%1 m1, m3
- pxor m0, m6
- pxor m1, m6
- movu [dstq+hq], m0
- movu [dstq+hq+mmsize], m1
-
- add hq, 2*mmsize
- jl .loop
-
-.end:
- REP_RET
-%endmacro
-
-%macro LOWPASS_LINE 0
-cglobal lowpass_line, 5, 5, 7, dst, h, src, mref, pref
- LOWPASS b
-
-cglobal lowpass_line_16, 5, 5, 7, dst, h, src, mref, pref
- shl hq, 1
- LOWPASS w
-%endmacro
-
-%macro LOWPASS_LINE_COMPLEX 0
-cglobal lowpass_line_complex, 5, 5, 8, dst, h, src, mref, pref
- pxor m7, m7
-.loop:
- movu m0, [srcq+mrefq]
- movu m2, [srcq+prefq]
- mova m1, m0
- mova m3, m2
- punpcklbw m0, m7
- punpcklbw m2, m7
- punpckhbw m1, m7
- punpckhbw m3, m7
- paddw m0, m2
- paddw m1, m3
- mova m6, m0
- mova m5, m1
- movu m2, [srcq]
- mova m3, m2
- punpcklbw m2, m7
- punpckhbw m3, m7
- paddw m0, m2
- paddw m1, m3
- psllw m2, 1
- psllw m3, 1
- paddw m0, m2
- paddw m1, m3
- psllw m0, 1
- psllw m1, 1
- pcmpgtw m6, m2
- pcmpgtw m5, m3
- packsswb m6, m5
- movu m2, [srcq+mrefq*2]
- movu m4, [srcq+prefq*2]
- mova m3, m2
- mova m5, m4
- punpcklbw m2, m7
- punpcklbw m4, m7
- punpckhbw m3, m7
- punpckhbw m5, m7
- paddw m2, m4
- paddw m3, m5
- paddw m0, [pw_4]
- paddw m1, [pw_4]
- psubusw m0, m2
- psubusw m1, m3
- psrlw m0, 3
- psrlw m1, 3
- packuswb m0, m1
- mova m1, m0
- movu m2, [srcq]
- pmaxub m0, m2
- pminub m1, m2
- pand m0, m6
- pandn m6, m1
- por m0, m6
- movu [dstq], m0
-
- add dstq, mmsize
- add srcq, mmsize
- sub hd, mmsize
- jg .loop
-REP_RET
-
-cglobal lowpass_line_complex_12, 5, 5, 8, 16, dst, h, src, mref, pref, clip_max
- movd m7, DWORD clip_maxm
- SPLATW m7, m7, 0
- movu [rsp], m7
-.loop:
- movu m0, [srcq+mrefq]
- movu m1, [srcq+mrefq+mmsize]
- movu m2, [srcq+prefq]
- movu m3, [srcq+prefq+mmsize]
- paddw m0, m2
- paddw m1, m3
- mova m6, m0
- mova m7, m1
- movu m2, [srcq]
- movu m3, [srcq+mmsize]
- paddw m0, m2
- paddw m1, m3
- psllw m2, 1
- psllw m3, 1
- paddw m0, m2
- paddw m1, m3
- psllw m0, 1
- psllw m1, 1
- pcmpgtw m6, m2
- pcmpgtw m7, m3
- movu m2, [srcq+2*mrefq]
- movu m3, [srcq+2*mrefq+mmsize]
- movu m4, [srcq+2*prefq]
- movu m5, [srcq+2*prefq+mmsize]
- paddw m2, m4
- paddw m3, m5
- paddw m0, [pw_4]
- paddw m1, [pw_4]
- psubusw m0, m2
- psubusw m1, m3
- psrlw m0, 3
- psrlw m1, 3
- pminsw m0, [rsp]
- pminsw m1, [rsp]
- mova m2, m0
- mova m3, m1
- movu m4, [srcq]
- pmaxsw m0, m4
- pminsw m2, m4
- movu m4, [srcq + mmsize]
- pmaxsw m1, m4
- pminsw m3, m4
- pand m0, m6
- pand m1, m7
- pandn m6, m2
- pandn m7, m3
- por m0, m6
- por m1, m7
- movu [dstq], m0
- movu [dstq+mmsize], m1
-
- add dstq, 2*mmsize
- add srcq, 2*mmsize
- sub hd, mmsize
- jg .loop
-REP_RET
-%endmacro
-
-INIT_XMM sse2
-LOWPASS_LINE
-
-INIT_XMM avx
-LOWPASS_LINE
-
-%if HAVE_AVX2_EXTERNAL
-INIT_YMM avx2
-LOWPASS_LINE
-%endif
-
-INIT_XMM sse2
-LOWPASS_LINE_COMPLEX
diff --git a/libavfilter/x86/vf_pp7.asm b/libavfilter/x86/vf_pp7.asm
deleted file mode 100644
index 7b3e5cf..0000000
--- a/libavfilter/x86/vf_pp7.asm
+++ /dev/null
@@ -1,57 +0,0 @@
-;*****************************************************************************
-;* x86-optimized functions for pp7 filter
-;*
-;* Copyright (c) 2005 Michael Niedermayer <michaelni@gmx.at>
-;*
-;* This file is part of FFmpeg.
-;*
-;* FFmpeg is free software; you can redistribute it and/or modify
-;* it under the terms of the GNU General Public License as published by
-;* the Free Software Foundation; either version 2 of the License, or
-;* (at your option) any later version.
-;*
-;* FFmpeg is distributed in the hope that it will be useful,
-;* but WITHOUT ANY WARRANTY; without even the implied warranty of
-;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;* GNU General Public License for more details.
-;*
-;* You should have received a copy of the GNU General Public License along
-;* with FFmpeg; if not, write to the Free Software Foundation, Inc.,
-;* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-;******************************************************************************
-
-%include "libavutil/x86/x86util.asm"
-
-SECTION .text
-
-INIT_MMX mmx
-
-;void ff_pp7_dctB_mmx(int16_t *dst, int16_t *src)
-cglobal pp7_dctB, 2, 2, 0, dst, src
- movq m0, [srcq]
- movq m1, [srcq+mmsize*1]
- paddw m0, [srcq+mmsize*6]
- paddw m1, [srcq+mmsize*5]
- movq m2, [srcq+mmsize*2]
- movq m3, [srcq+mmsize*3]
- paddw m2, [srcq+mmsize*4]
- paddw m3, m3
- movq m4, m3
- psubw m3, m0
- paddw m4, m0
- movq m0, m2
- psubw m2, m1
- paddw m0, m1
- movq m1, m4
- psubw m4, m0
- paddw m1, m0
- movq m0, m3
- psubw m3, m2
- psubw m3, m2
- paddw m2, m0
- paddw m2, m0
- movq [dstq], m1
- movq [dstq+mmsize*2], m4
- movq [dstq+mmsize*1], m2
- movq [dstq+mmsize*3], m3
- RET
diff --git a/libavfilter/x86/vf_pp7_init.c b/libavfilter/x86/vf_pp7_init.c
deleted file mode 100644
index 165b0dd..0000000
--- a/libavfilter/x86/vf_pp7_init.c
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (c) 2005 Michael Niedermayer <michaelni@gmx.at>
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "libavutil/attributes.h"
-#include "libavutil/cpu.h"
-#include "libavutil/x86/cpu.h"
-#include "libavfilter/vf_pp7.h"
-
-void ff_pp7_dctB_mmx(int16_t *dst, int16_t *src);
-
-av_cold void ff_pp7_init_x86(PP7Context *p)
-{
- int cpu_flags = av_get_cpu_flags();
-
- if (EXTERNAL_MMX(cpu_flags))
- p->dctB = ff_pp7_dctB_mmx;
-}
diff --git a/libavfilter/x86/vf_pullup.asm b/libavfilter/x86/vf_pullup.asm
deleted file mode 100644
index 26c2a27..0000000
--- a/libavfilter/x86/vf_pullup.asm
+++ /dev/null
@@ -1,178 +0,0 @@
-;*****************************************************************************
-;* x86-optimized functions for pullup filter
-;*
-;* This file is part of FFmpeg.
-;*
-;* FFmpeg is free software; you can redistribute it and/or modify
-;* it under the terms of the GNU General Public License as published by
-;* the Free Software Foundation; either version 2 of the License, or
-;* (at your option) any later version.
-;*
-;* FFmpeg is distributed in the hope that it will be useful,
-;* but WITHOUT ANY WARRANTY; without even the implied warranty of
-;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;* GNU General Public License for more details.
-;*
-;* You should have received a copy of the GNU General Public License along
-;* with FFmpeg; if not, write to the Free Software Foundation, Inc.,
-;* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-;******************************************************************************
-
-%include "libavutil/x86/x86util.asm"
-
-SECTION .text
-
-INIT_MMX mmx
-cglobal pullup_filter_diff, 3, 5, 8, first, second, size
- mov r3, 4
- pxor m4, m4
- pxor m7, m7
-
-.loop:
- movq m0, [firstq]
- movq m2, [firstq]
- add firstq, sizeq
- movq m1, [secondq]
- add secondq, sizeq
- psubusb m2, m1
- psubusb m1, m0
- movq m0, m2
- movq m3, m1
- punpcklbw m0, m7
- punpcklbw m1, m7
- punpckhbw m2, m7
- punpckhbw m3, m7
- paddw m4, m0
- paddw m4, m1
- paddw m4, m2
- paddw m4, m3
-
- dec r3
- jnz .loop
-
- movq m3, m4
- punpcklwd m4, m7
- punpckhwd m3, m7
- paddd m3, m4
- movd eax, m3
- psrlq m3, 32
- movd r4d, m3
- add eax, r4d
- RET
-
-INIT_MMX mmx
-cglobal pullup_filter_comb, 3, 5, 8, first, second, size
- mov r3, 4
- pxor m6, m6
- pxor m7, m7
- sub secondq, sizeq
-
-.loop:
- movq m0, [firstq]
- movq m1, [secondq]
- punpcklbw m0, m7
- movq m2, [secondq+sizeq]
- punpcklbw m1, m7
- punpcklbw m2, m7
- paddw m0, m0
- paddw m1, m2
- movq m2, m0
- psubusw m0, m1
- psubusw m1, m2
- paddw m6, m0
- paddw m6, m1
-
- movq m0, [firstq]
- movq m1, [secondq]
- punpckhbw m0, m7
- movq m2, [secondq+sizeq]
- punpckhbw m1, m7
- punpckhbw m2, m7
- paddw m0, m0
- paddw m1, m2
- movq m2, m0
- psubusw m0, m1
- psubusw m1, m2
- paddw m6, m0
- paddw m6, m1
-
- movq m0, [secondq+sizeq]
- movq m1, [firstq]
- punpcklbw m0, m7
- movq m2, [firstq+sizeq]
- punpcklbw m1, m7
- punpcklbw m2, m7
- paddw m0, m0
- paddw m1, m2
- movq m2, m0
- psubusw m0, m1
- psubusw m1, m2
- paddw m6, m0
- paddw m6, m1
-
- movq m0, [secondq+sizeq]
- movq m1, [firstq]
- punpckhbw m0, m7
- movq m2, [firstq+sizeq]
- punpckhbw m1, m7
- punpckhbw m2, m7
- paddw m0, m0
- paddw m1, m2
- movq m2, m0
- psubusw m0, m1
- psubusw m1, m2
- paddw m6, m0
- paddw m6, m1
-
- add firstq, sizeq
- add secondq, sizeq
- dec r3
- jnz .loop
-
- movq m5, m6
- punpcklwd m6, m7
- punpckhwd m5, m7
- paddd m5, m6
- movd eax, m5
- psrlq m5, 32
- movd r4d, m5
- add eax, r4d
- RET
-
-INIT_MMX mmx
-cglobal pullup_filter_var, 3, 5, 8, first, second, size
- mov r3, 3
- pxor m4, m4
- pxor m7, m7
-
-.loop:
- movq m0, [firstq]
- movq m2, [firstq]
- movq m1, [firstq+sizeq]
- add firstq, sizeq
- psubusb m2, m1
- psubusb m1, m0
- movq m0, m2
- movq m3, m1
- punpcklbw m0, m7
- punpcklbw m1, m7
- punpckhbw m2, m7
- punpckhbw m3, m7
- paddw m4, m0
- paddw m4, m1
- paddw m4, m2
- paddw m4, m3
-
- dec r3
- jnz .loop
-
- movq m3, m4
- punpcklwd m4, m7
- punpckhwd m3, m7
- paddd m3, m4
- movd eax, m3
- psrlq m3, 32
- movd r4d, m3
- add eax, r4d
- shl eax, 2
- RET
diff --git a/libavfilter/x86/vf_pullup_init.c b/libavfilter/x86/vf_pullup_init.c
deleted file mode 100644
index 3dc0798..0000000
--- a/libavfilter/x86/vf_pullup_init.c
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-*/
-
-#include "libavutil/attributes.h"
-#include "libavutil/cpu.h"
-#include "libavutil/mem.h"
-#include "libavutil/x86/asm.h"
-#include "libavutil/x86/cpu.h"
-#include "libavfilter/vf_pullup.h"
-
-int ff_pullup_filter_diff_mmx(const uint8_t *a, const uint8_t *b, ptrdiff_t s);
-int ff_pullup_filter_comb_mmx(const uint8_t *a, const uint8_t *b, ptrdiff_t s);
-int ff_pullup_filter_var_mmx (const uint8_t *a, const uint8_t *b, ptrdiff_t s);
-
-av_cold void ff_pullup_init_x86(PullupContext *s)
-{
-#if HAVE_X86ASM
- int cpu_flags = av_get_cpu_flags();
-
- if (EXTERNAL_MMX(cpu_flags)) {
- s->diff = ff_pullup_filter_diff_mmx;
- s->comb = ff_pullup_filter_comb_mmx;
- s->var = ff_pullup_filter_var_mmx;
- }
-#endif
-}
diff --git a/libavfilter/x86/vf_removegrain.asm b/libavfilter/x86/vf_removegrain.asm
deleted file mode 100644
index d049bf2..0000000
--- a/libavfilter/x86/vf_removegrain.asm
+++ /dev/null
@@ -1,1218 +0,0 @@
-;*****************************************************************************
-;* x86-optimized functions for removegrain filter
-;*
-;* Copyright (C) 2015 James Darnley
-;*
-;* This file is part of FFmpeg.
-;*
-;* FFmpeg is free software; you can redistribute it and/or modify
-;* it under the terms of the GNU General Public License as published by
-;* the Free Software Foundation; either version 2 of the License, or
-;* (at your option) any later version.
-;*
-;* FFmpeg is distributed in the hope that it will be useful,
-;* but WITHOUT ANY WARRANTY; without even the implied warranty of
-;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;* GNU General Public License for more details.
-;*
-;* You should have received a copy of the GNU General Public License along
-;* with FFmpeg; if not, write to the Free Software Foundation, Inc.,
-;* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-;*****************************************************************************
-
-; column: -1 0 +1
-; row -1: a1 a2 a3
-; row 0: a4 c a5
-; row +1: a6 a7 a8
-
-%include "libavutil/x86/x86util.asm"
-
-SECTION_RODATA 32
-
-pw_4: times 16 dw 4
-pw_8: times 16 dw 8
-pw_div9: times 16 dw ((1<<16)+4)/9
-
-SECTION .text
-
-;*** Preprocessor helpers
-
-%define a1 srcq+stride_n-1
-%define a2 srcq+stride_n
-%define a3 srcq+stride_n+1
-%define a4 srcq-1
-%define c srcq
-%define a5 srcq+1
-%define a6 srcq+stride_p-1
-%define a7 srcq+stride_p
-%define a8 srcq+stride_p+1
-
-; %1 dest simd register
-; %2 source memory location
-; %3 zero location (simd register/memory)
-%macro LOAD 3
- movh %1, %2
- punpcklbw %1, %3
-%endmacro
-
-%macro LOAD_SQUARE 0
- movu m1, [a1]
- movu m2, [a2]
- movu m3, [a3]
- movu m4, [a4]
- movu m0, [c]
- movu m5, [a5]
- movu m6, [a6]
- movu m7, [a7]
- movu m8, [a8]
-%endmacro
-
-; %1 zero location (simd register/memory)
-%macro LOAD_SQUARE_16 1
- LOAD m1, [a1], %1
- LOAD m2, [a2], %1
- LOAD m3, [a3], %1
- LOAD m4, [a4], %1
- LOAD m0, [c], %1
- LOAD m5, [a5], %1
- LOAD m6, [a6], %1
- LOAD m7, [a7], %1
- LOAD m8, [a8], %1
-%endmacro
-
-; %1 data type
-; %2 simd register to hold maximums
-; %3 simd register to hold minimums
-; %4 temp location (simd register/memory)
-%macro SORT_PAIR 4
- mova %4, %2
- pmin%1 %2, %3
- pmax%1 %3, %4
-%endmacro
-
-%macro SORT_AXIS 0
- SORT_PAIR ub, m1, m8, m9
- SORT_PAIR ub, m2, m7, m10
- SORT_PAIR ub, m3, m6, m11
- SORT_PAIR ub, m4, m5, m12
-%endmacro
-
-
-%macro SORT_AXIS_16 0
- SORT_PAIR sw, m1, m8, m9
- SORT_PAIR sw, m2, m7, m10
- SORT_PAIR sw, m3, m6, m11
- SORT_PAIR sw, m4, m5, m12
-%endmacro
-
-; The loop doesn't need to do all the iterations. It could stop when the right
-; pixels are in the right registers.
-%macro SORT_SQUARE 0
- %assign k 7
- %rep 7
- %assign i 1
- %assign j 2
- %rep k
- SORT_PAIR ub, m %+ i , m %+ j , m9
- %assign i i+1
- %assign j j+1
- %endrep
- %assign k k-1
- %endrep
-%endmacro
-
-; %1 dest simd register
-; %2 source (simd register/memory)
-; %3 temp simd register
-%macro ABS_DIFF 3
- mova %3, %2
- psubusb %3, %1
- psubusb %1, %2
- por %1, %3
-%endmacro
-
-; %1 dest simd register
-; %2 source (simd register/memory)
-; %3 temp simd register
-%macro ABS_DIFF_W 3
- mova %3, %2
- psubusw %3, %1
- psubusw %1, %2
- por %1, %3
-%endmacro
-
-; %1 simd register that holds the "false" values and will hold the result
-; %2 simd register that holds the "true" values
-; %3 location (simd register/memory) that hold the mask
-%macro BLEND 3
-%if cpuflag(avx2)
- vpblendvb %1, %1, %2, %3
-%else
- pand %2, %3
- pandn %3, %1
- por %3, %2
- SWAP %1, %3
-%endif
-%endmacro
-
-; Functions
-
-INIT_XMM sse2
-cglobal rg_fl_mode_1, 4, 5, 3, 0, dst, src, stride, pixels
- mov r4q, strideq
- neg r4q
- %define stride_p strideq
- %define stride_n r4q
-
- .loop:
- movu m0, [a1]
- mova m1, m0
-
- movu m2, [a2]
- pmaxub m0, m2
- pminub m1, m2
-
- movu m2, [a3]
- pmaxub m0, m2
- pminub m1, m2
-
- movu m2, [a4]
- pmaxub m0, m2
- pminub m1, m2
-
- movu m2, [a5]
- pmaxub m0, m2
- pminub m1, m2
-
- movu m2, [a6]
- pmaxub m0, m2
- pminub m1, m2
-
- movu m2, [a7]
- pmaxub m0, m2
- pminub m1, m2
-
- movu m2, [a8]
- pmaxub m0, m2
- pminub m1, m2
-
- movu m2, [c]
- pminub m2, m0
- pmaxub m2, m1
-
- movu [dstq], m2
- add srcq, mmsize
- add dstq, mmsize
- sub pixelsd, mmsize
- jg .loop
-RET
-
-%if ARCH_X86_64
-cglobal rg_fl_mode_2, 4, 5, 10, 0, dst, src, stride, pixels
- mov r4q, strideq
- neg r4q
- %define stride_p strideq
- %define stride_n r4q
-
- .loop:
- LOAD_SQUARE
- SORT_SQUARE
-
- CLIPUB m0, m2, m7
-
- movu [dstq], m0
- add srcq, mmsize
- add dstq, mmsize
- sub pixelsd, mmsize
- jg .loop
-RET
-
-cglobal rg_fl_mode_3, 4, 5, 10, 0, dst, src, stride, pixels
- mov r4q, strideq
- neg r4q
- %define stride_p strideq
- %define stride_n r4q
-
- .loop:
- LOAD_SQUARE
- SORT_SQUARE
-
- CLIPUB m0, m3, m6
-
- movu [dstq], m0
- add srcq, mmsize
- add dstq, mmsize
- sub pixelsd, mmsize
- jg .loop
-RET
-
-cglobal rg_fl_mode_4, 4, 5, 10, 0, dst, src, stride, pixels
- mov r4q, strideq
- neg r4q
- %define stride_p strideq
- %define stride_n r4q
-
- .loop:
- LOAD_SQUARE
- SORT_SQUARE
-
- CLIPUB m0, m4, m5
-
- movu [dstq], m0
- add srcq, mmsize
- add dstq, mmsize
- sub pixelsd, mmsize
- jg .loop
-RET
-
-cglobal rg_fl_mode_5, 4, 5, 13, 0, dst, src, stride, pixels
- mov r4q, strideq
- neg r4q
- %define stride_p strideq
- %define stride_n r4q
-
- .loop:
- LOAD_SQUARE
- SORT_AXIS
-
- mova m9, m0
- mova m10, m0
- mova m11, m0
- mova m12, m0
-
- CLIPUB m9, m1, m8
- CLIPUB m10, m2, m7
- CLIPUB m11, m3, m6
- CLIPUB m12, m4, m5
-
- mova m8, m9 ; clip1
- mova m7, m10 ; clip2
- mova m6, m11 ; clip3
- mova m5, m12 ; clip4
-
- ABS_DIFF m9, m0, m1 ; c1
- ABS_DIFF m10, m0, m2 ; c2
- ABS_DIFF m11, m0, m3 ; c3
- ABS_DIFF m12, m0, m4 ; c4
-
- pminub m9, m10
- pminub m9, m11
- pminub m9, m12 ; mindiff
-
- pcmpeqb m10, m9
- pcmpeqb m11, m9
- pcmpeqb m12, m9
-
- ; Notice the order here: c1, c3, c2, c4
- BLEND m8, m6, m11
- BLEND m8, m7, m10
- BLEND m8, m5, m12
-
- movu [dstq], m8
- add srcq, mmsize
- add dstq, mmsize
- sub pixelsd, mmsize
- jg .loop
-RET
-
-cglobal rg_fl_mode_6, 4, 5, 16, 0, dst, src, stride, pixels
- mov r4q, strideq
- neg r4q
- %define stride_p strideq
- %define stride_n r4q
-
- ; Some register saving suggestions: the zero can be somewhere other than a
- ; register, the center pixels could be on the stack.
-
- pxor m15, m15
- .loop:
- LOAD_SQUARE_16 m15
- SORT_AXIS_16
-
- mova m9, m0
- mova m10, m0
- mova m11, m0
- mova m12, m0
- CLIPW m9, m1, m8 ; clip1
- CLIPW m10, m2, m7 ; clip2
- CLIPW m11, m3, m6 ; clip3
- CLIPW m12, m4, m5 ; clip4
-
- psubw m8, m1 ; d1
- psubw m7, m2 ; d2
- psubw m6, m3 ; d3
- psubw m5, m4 ; d4
-
- mova m1, m9
- mova m2, m10
- mova m3, m11
- mova m4, m12
- ABS_DIFF_W m1, m0, m13
- ABS_DIFF_W m2, m0, m14
- ABS_DIFF_W m3, m0, m13
- ABS_DIFF_W m4, m0, m14
- psllw m1, 1
- psllw m2, 1
- psllw m3, 1
- psllw m4, 1
- paddw m1, m8 ; c1
- paddw m2, m7 ; c2
- paddw m3, m6 ; c3
- paddw m4, m5 ; c4
- ; As the differences (d1..d4) can only be positive, there is no need to
- ; clip to zero. Also, the maximum positive value is less than 768.
-
- pminsw m1, m2
- pminsw m1, m3
- pminsw m1, m4
-
- pcmpeqw m2, m1
- pcmpeqw m3, m1
- pcmpeqw m4, m1
-
- BLEND m9, m11, m3
- BLEND m9, m10, m2
- BLEND m9, m12, m4
- packuswb m9, m9
-
- movh [dstq], m9
- add srcq, mmsize/2
- add dstq, mmsize/2
- sub pixelsd, mmsize/2
- jg .loop
-RET
-
-; This is just copy-pasted straight from mode 6 with the left shifts removed.
-cglobal rg_fl_mode_7, 4, 5, 16, 0, dst, src, stride, pixels
- mov r4q, strideq
- neg r4q
- %define stride_p strideq
- %define stride_n r4q
-
- ; Can this be done without unpacking?
-
- pxor m15, m15
- .loop:
- LOAD_SQUARE_16 m15
- SORT_AXIS_16
-
- mova m9, m0
- mova m10, m0
- mova m11, m0
- mova m12, m0
- CLIPW m9, m1, m8 ; clip1
- CLIPW m10, m2, m7 ; clip2
- CLIPW m11, m3, m6 ; clip3
- CLIPW m12, m4, m5 ; clip4
-
- psubw m8, m1 ; d1
- psubw m7, m2 ; d2
- psubw m6, m3 ; d3
- psubw m5, m4 ; d4
-
- mova m1, m9
- mova m2, m10
- mova m3, m11
- mova m4, m12
- ABS_DIFF_W m1, m0, m13
- ABS_DIFF_W m2, m0, m14
- ABS_DIFF_W m3, m0, m13
- ABS_DIFF_W m4, m0, m14
- paddw m1, m8 ; c1
- paddw m2, m7 ; c2
- paddw m3, m6 ; c3
- paddw m4, m5 ; c4
-
- pminsw m1, m2
- pminsw m1, m3
- pminsw m1, m4
-
- pcmpeqw m2, m1
- pcmpeqw m3, m1
- pcmpeqw m4, m1
-
- BLEND m9, m11, m3
- BLEND m9, m10, m2
- BLEND m9, m12, m4
- packuswb m9, m9
-
- movh [dstq], m9
- add srcq, mmsize/2
- add dstq, mmsize/2
- sub pixelsd, mmsize/2
- jg .loop
-RET
-
-; This is just copy-pasted straight from mode 6 with a few changes.
-cglobal rg_fl_mode_8, 4, 5, 16, 0, dst, src, stride, pixels
- mov r4q, strideq
- neg r4q
- %define stride_p strideq
- %define stride_n r4q
-
- pxor m15, m15
- .loop:
- LOAD_SQUARE_16 m15
- SORT_AXIS_16
-
- mova m9, m0
- mova m10, m0
- mova m11, m0
- mova m12, m0
- CLIPW m9, m1, m8 ; clip1
- CLIPW m10, m2, m7 ; clip2
- CLIPW m11, m3, m6 ; clip3
- CLIPW m12, m4, m5 ; clip4
-
- psubw m8, m1 ; d1
- psubw m7, m2 ; d2
- psubw m6, m3 ; d3
- psubw m5, m4 ; d4
- psllw m8, 1
- psllw m7, 1
- psllw m6, 1
- psllw m5, 1
-
- mova m1, m9
- mova m2, m10
- mova m3, m11
- mova m4, m12
- ABS_DIFF_W m1, m0, m13
- ABS_DIFF_W m2, m0, m14
- ABS_DIFF_W m3, m0, m13
- ABS_DIFF_W m4, m0, m14
- paddw m1, m8 ; c1
- paddw m2, m7 ; c1
- paddw m3, m6 ; c1
- paddw m4, m5 ; c1
- ; As the differences (d1..d4) can only be positive, there is no need to
- ; clip to zero. Also, the maximum positive value is less than 768.
-
- pminsw m1, m2
- pminsw m1, m3
- pminsw m1, m4
-
- pcmpeqw m2, m1
- pcmpeqw m3, m1
- pcmpeqw m4, m1
-
- BLEND m9, m11, m3
- BLEND m9, m10, m2
- BLEND m9, m12, m4
- packuswb m9, m9
-
- movh [dstq], m9
- add srcq, mmsize/2
- add dstq, mmsize/2
- sub pixelsd, mmsize/2
- jg .loop
-RET
-
-cglobal rg_fl_mode_9, 4, 5, 13, 0, dst, src, stride, pixels
- mov r4q, strideq
- neg r4q
- %define stride_p strideq
- %define stride_n r4q
-
- .loop:
- LOAD_SQUARE
- SORT_AXIS
-
- mova m9, m0
- mova m10, m0
- mova m11, m0
- mova m12, m0
- CLIPUB m9, m1, m8 ; clip1
- CLIPUB m10, m2, m7 ; clip2
- CLIPUB m11, m3, m6 ; clip3
- CLIPUB m12, m4, m5 ; clip4
-
- psubb m8, m1 ; d1
- psubb m7, m2 ; d2
- psubb m6, m3 ; d3
- psubb m5, m4 ; d4
-
- pminub m8, m7
- pminub m8, m6
- pminub m8, m5
-
- pcmpeqb m7, m8
- pcmpeqb m6, m8
- pcmpeqb m5, m8
-
- BLEND m9, m11, m6
- BLEND m9, m10, m7
- BLEND m9, m12, m5
-
- movu [dstq], m9
- add srcq, mmsize
- add dstq, mmsize
- sub pixelsd, mmsize
- jg .loop
-RET
-%endif
-
-cglobal rg_fl_mode_10, 4, 5, 8, 0, dst, src, stride, pixels
- mov r4q, strideq
- neg r4q
- %define stride_p strideq
- %define stride_n r4q
-
- .loop:
- movu m0, [c]
-
- movu m1, [a4]
- mova m2, m1
- ABS_DIFF m1, m0, m7
-
- movu m3, [a5] ; load pixel
- mova m4, m3
- ABS_DIFF m4, m0, m7 ; absolute difference from center
- pminub m1, m4 ; mindiff
- pcmpeqb m4, m1 ; if (difference == mindiff)
- BLEND m2, m3, m4 ; return pixel
-
- movu m5, [a1]
- mova m6, m5
- ABS_DIFF m6, m0, m7
- pminub m1, m6
- pcmpeqb m6, m1
- BLEND m2, m5, m6
-
- movu m3, [a3]
- mova m4, m3
- ABS_DIFF m4, m0, m7
- pminub m1, m4
- pcmpeqb m4, m1
- BLEND m2, m3, m4
-
- movu m5, [a2]
- mova m6, m5
- ABS_DIFF m6, m0, m7
- pminub m1, m6
- pcmpeqb m6, m1
- BLEND m2, m5, m6
-
- movu m3, [a6]
- mova m4, m3
- ABS_DIFF m4, m0, m7
- pminub m1, m4
- pcmpeqb m4, m1
- BLEND m2, m3, m4
-
- movu m5, [a8]
- mova m6, m5
- ABS_DIFF m6, m0, m7
- pminub m1, m6
- pcmpeqb m6, m1
- BLEND m2, m5, m6
-
- movu m3, [a7]
- mova m4, m3
- ABS_DIFF m4, m0, m7
- pminub m1, m4
- pcmpeqb m4, m1
- BLEND m2, m3, m4
-
- movu [dstq], m2
- add srcq, mmsize
- add dstq, mmsize
- sub pixelsd, mmsize
- jg .loop
-RET
-
-cglobal rg_fl_mode_11_12, 4, 5, 7, 0, dst, src, stride, pixels
- mov r4q, strideq
- neg r4q
- %define stride_p strideq
- %define stride_n r4q
-
- pxor m0, m0
- .loop:
- LOAD m1, [c], m0
- LOAD m2, [a2], m0
- LOAD m3, [a4], m0
- LOAD m4, [a5], m0
- LOAD m5, [a7], m0
-
- psllw m1, 2
- paddw m2, m3
- paddw m4, m5
- paddw m2, m4
- psllw m2, 1
-
- LOAD m3, [a1], m0
- LOAD m4, [a3], m0
- LOAD m5, [a6], m0
- LOAD m6, [a8], m0
- paddw m1, m2
- paddw m3, m4
- paddw m5, m6
- paddw m1, m3
- paddw m1, m5
-
- paddw m1, [pw_8]
- psraw m1, 4
-
- packuswb m1, m1
-
- movh [dstq], m1
- add srcq, mmsize/2
- add dstq, mmsize/2
- sub pixelsd, mmsize/2
- jg .loop
-RET
-
-cglobal rg_fl_mode_13_14, 4, 5, 8, 0, dst, src, stride, pixels
- mov r4q, strideq
- neg r4q
- %define stride_p strideq
- %define stride_n r4q
-
- .loop:
- movu m1, [a1]
- movu m2, [a8]
- mova m0, m1
- pavgb m1, m2
- ABS_DIFF m0, m2, m6
-
- movu m3, [a3]
- movu m4, [a6]
- mova m5, m3
- pavgb m3, m4
- ABS_DIFF m5, m4, m7
- pminub m0, m5
- pcmpeqb m5, m0
- BLEND m1, m3, m5
-
- movu m2, [a2]
- movu m3, [a7]
- mova m4, m2
- pavgb m2, m3
- ABS_DIFF m4, m3, m6
- pminub m0, m4
- pcmpeqb m4, m0
- BLEND m1, m2, m4
-
- movu [dstq], m1
- add srcq, mmsize
- add dstq, mmsize
- sub pixelsd, mmsize
- jg .loop
-RET
-
-%if ARCH_X86_64
-cglobal rg_fl_mode_15_16, 4, 5, 16, 0, dst, src, stride, pixels
- mov r4q, strideq
- neg r4q
- %define stride_p strideq
- %define stride_n r4q
-
- pxor m15, m15
- .loop:
- LOAD_SQUARE_16 m15
-
- mova m9, m1
- mova m10, m2
- mova m11, m3
- ABS_DIFF_W m9, m8, m12
- ABS_DIFF_W m10, m7, m13
- ABS_DIFF_W m11, m6, m14
- pminsw m9, m10
- pminsw m9, m11
- pcmpeqw m10, m9
- pcmpeqw m11, m9
-
- mova m12, m2
- mova m13, m1
- mova m14, m6
- paddw m12, m7
- psllw m12, 1
- paddw m13, m3
- paddw m14, m8
- paddw m12, [pw_4]
- paddw m13, m14
- paddw m12, m13
- psrlw m12, 3
-
- SORT_PAIR ub, m1, m8, m0
- SORT_PAIR ub, m2, m7, m9
- SORT_PAIR ub, m3, m6, m14
- mova m4, m12
- mova m5, m12
- CLIPW m4, m1, m8
- CLIPW m5, m2, m7
- CLIPW m12, m3, m6
-
- BLEND m4, m12, m11
- BLEND m4, m5, m10
- packuswb m4, m4
-
- movh [dstq], m4
- add srcq, mmsize/2
- add dstq, mmsize/2
- sub pixelsd, mmsize/2
- jg .loop
-RET
-
-cglobal rg_fl_mode_17, 4, 5, 9, 0, dst, src, stride, pixels
- mov r4q, strideq
- neg r4q
- %define stride_p strideq
- %define stride_n r4q
-
- .loop:
- LOAD_SQUARE
- SORT_AXIS
-
- pmaxub m1, m2
- pmaxub m3, m4
-
- pminub m8, m7
- pminub m5, m6
-
- pmaxub m1, m3
- pminub m8, m5
-
- mova m2, m1
- pminub m1, m8
- pmaxub m8, m2
-
- CLIPUB m0, m1, m8
-
- movu [dstq], m0
- add srcq, mmsize
- add dstq, mmsize
- sub pixelsd, mmsize
- jg .loop
-RET
-
-cglobal rg_fl_mode_18, 4, 5, 16, 0, dst, src, stride, pixels
- mov r4q, strideq
- neg r4q
- %define stride_p strideq
- %define stride_n r4q
-
- .loop:
- LOAD_SQUARE
-
- mova m9, m1
- mova m10, m8
- ABS_DIFF m9, m0, m11
- ABS_DIFF m10, m0, m12
- pmaxub m9, m10 ; m9 = d1
-
- mova m10, m2
- mova m11, m7
- ABS_DIFF m10, m0, m12
- ABS_DIFF m11, m0, m13
- pmaxub m10, m11 ; m10 = d2
-
- mova m11, m3
- mova m12, m6
- ABS_DIFF m11, m0, m13
- ABS_DIFF m12, m0, m14
- pmaxub m11, m12 ; m11 = d3
-
- mova m12, m4
- mova m13, m5
- ABS_DIFF m12, m0, m14
- ABS_DIFF m13, m0, m15
- pmaxub m12, m13 ; m12 = d4
-
- mova m13, m9
- pminub m13, m10
- pminub m13, m11
- pminub m13, m12 ; m13 = mindiff
-
- pcmpeqb m10, m13
- pcmpeqb m11, m13
- pcmpeqb m12, m13
-
- mova m14, m1
- pminub m1, m8
- pmaxub m8, m14
-
- mova m13, m0
- mova m14, m1
- pminub m1, m8
- pmaxub m8, m14
- CLIPUB m13, m1, m8 ; m13 = ret...d1
-
- mova m14, m0
- mova m15, m3
- pminub m3, m6
- pmaxub m6, m15
- CLIPUB m14, m3, m6
- pand m14, m11
- pandn m11, m13
- por m14, m11 ; m14 = ret...d3
-
- mova m15, m0
- mova m1, m2
- pminub m2, m7
- pmaxub m7, m1
- CLIPUB m15, m2, m7
- pand m15, m10
- pandn m10, m14
- por m15, m10 ; m15 = ret...d2
-
- mova m1, m0
- mova m2, m4
- pminub m4, m5
- pmaxub m5, m2
- CLIPUB m1, m4, m5
- pand m1, m12
- pandn m12, m15
- por m1, m12 ; m15 = ret...d4
-
- movu [dstq], m1
- add srcq, mmsize
- add dstq, mmsize
- sub pixelsd, mmsize
- jg .loop
-RET
-%endif
-
-cglobal rg_fl_mode_19, 4, 5, 7, 0, dst, src, stride, pixels
- mov r4q, strideq
- neg r4q
- %define stride_p strideq
- %define stride_n r4q
-
- pxor m0, m0
- .loop:
- LOAD m1, [a1], m0
- LOAD m2, [a2], m0
- paddw m1, m2
-
- LOAD m3, [a3], m0
- LOAD m4, [a4], m0
- paddw m3, m4
-
- LOAD m5, [a5], m0
- LOAD m6, [a6], m0
- paddw m5, m6
-
- LOAD m2, [a7], m0
- LOAD m4, [a8], m0
- paddw m2, m4
-
- paddw m1, m3
- paddw m2, m5
- paddw m1, m2
-
- paddw m1, [pw_4]
- psraw m1, 3
-
- packuswb m1, m1
-
- movh [dstq], m1
- add srcq, mmsize/2
- add dstq, mmsize/2
- sub pixelsd, mmsize/2
- jg .loop
-RET
-
-cglobal rg_fl_mode_20, 4, 5, 7, 0, dst, src, stride, pixels
- mov r4q, strideq
- neg r4q
- %define stride_p strideq
- %define stride_n r4q
-
- pxor m0, m0
- .loop:
- LOAD m1, [a1], m0
- LOAD m2, [a2], m0
- paddw m1, m2
-
- LOAD m3, [a3], m0
- LOAD m4, [a4], m0
- paddw m3, m4
-
- LOAD m5, [a5], m0
- LOAD m6, [a6], m0
- paddw m5, m6
-
- LOAD m2, [a7], m0
- LOAD m4, [a8], m0
- paddw m2, m4
-
- LOAD m6, [c], m0
- paddw m1, m3
- paddw m2, m5
- paddw m6, [pw_4]
-
- paddw m1, m2
- paddw m1, m6
-
- pmulhuw m1, [pw_div9]
-
- packuswb m1, m1
-
- movh [dstq], m1
- add srcq, mmsize/2
- add dstq, mmsize/2
- sub pixelsd, mmsize/2
- jg .loop
-RET
-
-cglobal rg_fl_mode_21, 4, 5, 8, 0, dst, src, stride, pixels
- mov r4q, strideq
- neg r4q
- %define stride_p strideq
- %define stride_n r4q
-
- pxor m0, m0
- .loop:
- movu m1, [a1]
- movu m2, [a8]
- pavgb m7, m1, m2
- punpckhbw m3, m1, m0
- punpcklbw m1, m0
- punpckhbw m4, m2, m0
- punpcklbw m2, m0
- paddw m3, m4
- paddw m1, m2
- psrlw m3, 1
- psrlw m1, 1
- packuswb m1, m3
-
- movu m2, [a2]
- movu m3, [a7]
- pavgb m6, m2, m3
- punpckhbw m4, m2, m0
- punpcklbw m2, m0
- punpckhbw m5, m3, m0
- punpcklbw m3, m0
- paddw m4, m5
- paddw m2, m3
- psrlw m4, 1
- psrlw m2, 1
- packuswb m2, m4
-
- pminub m1, m2
- pmaxub m7, m6
-
- movu m2, [a3]
- movu m3, [a6]
- pavgb m6, m2, m3
- punpckhbw m4, m2, m0
- punpcklbw m2, m0
- punpckhbw m5, m3, m0
- punpcklbw m3, m0
- paddw m4, m5
- paddw m2, m3
- psrlw m4, 1
- psrlw m2, 1
- packuswb m2, m4
-
- pminub m1, m2
- pmaxub m7, m6
-
- movu m2, [a4]
- movu m3, [a5]
- pavgb m6, m2, m3
- punpckhbw m4, m2, m0
- punpcklbw m2, m0
- punpckhbw m5, m3, m0
- punpcklbw m3, m0
- paddw m4, m5
- paddw m2, m3
- psrlw m4, 1
- psrlw m2, 1
- packuswb m2, m4
-
- pminub m1, m2
- pmaxub m7, m6
-
- movu m3, [c]
- CLIPUB m3, m1, m7
-
- movu [dstq], m3
- add srcq, mmsize
- add dstq, mmsize
- sub pixelsd, mmsize
- jg .loop
-RET
-
-cglobal rg_fl_mode_22, 4, 5, 8, 0, dst, src, stride, pixels
- mov r4q, strideq
- neg r4q
- %define stride_p strideq
- %define stride_n r4q
-
- .loop:
- movu m0, [a1]
- movu m1, [a8]
- pavgb m0, m1
- movu m2, [a2]
- movu m3, [a7]
- pavgb m2, m3
- movu m4, [a3]
- movu m5, [a6]
- pavgb m4, m5
- movu m6, [a4]
- movu m7, [a5]
- pavgb m6, m7
-
- mova m1, m0
- mova m3, m2
- mova m5, m4
- mova m7, m6
- pminub m0, m2
- pminub m4, m6
- pmaxub m1, m3
- pmaxub m5, m7
- pminub m0, m4
- pmaxub m1, m5
-
- movu m2, [c]
- CLIPUB m2, m0, m1
-
- movu [dstq], m2
- add srcq, mmsize
- add dstq, mmsize
- sub pixelsd, mmsize
- jg .loop
-RET
-
-%if ARCH_X86_64
-cglobal rg_fl_mode_23, 4, 5, 16, 0, dst, src, stride, pixels
- mov r4q, strideq
- neg r4q
- %define stride_p strideq
- %define stride_n r4q
-
- pxor m15, m15
- .loop:
- LOAD_SQUARE_16 m15
- SORT_AXIS_16
-
- mova m9, m8
- mova m10, m7
- mova m11, m6
- mova m12, m5
- psubw m9, m1 ; linediff1
- psubw m10, m2 ; linediff2
- psubw m11, m3 ; linediff3
- psubw m12, m4 ; linediff4
-
- psubw m1, m0
- psubw m2, m0
- psubw m3, m0
- psubw m4, m0
- pminsw m1, m9 ; d1
- pminsw m2, m10 ; d2
- pminsw m3, m11 ; d3
- pminsw m4, m12 ; d4
- pmaxsw m1, m2
- pmaxsw m3, m4
- pmaxsw m1, m3
- pmaxsw m1, m15 ; d
-
- mova m13, m0
- mova m14, m0
- mova m2, m0
- mova m4, m0
- psubw m13, m8
- psubw m14, m7
- psubw m2, m6
- psubw m4, m5
- pminsw m9, m13 ; u1
- pminsw m10, m14 ; u2
- pminsw m11, m2 ; u3
- pminsw m12, m4 ; u4
- pmaxsw m9, m10
- pmaxsw m11, m12
- pmaxsw m9, m11
- pmaxsw m9, m15 ; u
-
- paddw m0, m1
- psubw m0, m9
- packuswb m0, m0
-
- movh [dstq], m0
- add srcq, mmsize/2
- add dstq, mmsize/2
- sub pixelsd, mmsize/2
- jg .loop
-RET
-
-cglobal rg_fl_mode_24, 4, 5, 16, mmsize, dst, src, stride, pixels
- mov r4q, strideq
- neg r4q
- %define stride_p strideq
- %define stride_n r4q
-
- pxor m15, m15
- .loop:
- LOAD_SQUARE_16 m15
- mova [rsp], m0
- SORT_AXIS_16
-
- mova m9, m8
- mova m10, m7
- mova m11, m6
- mova m12, m5
- psubw m9, m1 ; linediff1
- psubw m10, m2 ; linediff2
- psubw m11, m3 ; linediff3
- psubw m12, m4 ; linediff4
-
- psubw m1, [rsp] ; td1
- psubw m2, [rsp] ; td2
- psubw m3, [rsp] ; td3
- psubw m4, [rsp] ; td4
- mova m0, m9
- mova m13, m10
- mova m14, m11
- mova m15, m12
- psubw m0, m1
- psubw m13, m2
- psubw m14, m3
- psubw m15, m4
- pminsw m1, m0 ; d1
- pminsw m2, m13 ; d2
- pminsw m3, m14 ; d3
- pminsw m4, m15 ; d4
- pmaxsw m1, m2
- pmaxsw m3, m4
-
- mova m0, [rsp]
- mova m13, [rsp]
- mova m14, [rsp]
- mova m15, [rsp]
- psubw m0, m8 ; tu1
- psubw m13, m7 ; tu2
- psubw m14, m6 ; tu3
- psubw m15, m5 ; tu4
- psubw m9, m0
- psubw m10, m13
- psubw m11, m14
- psubw m12, m15
- pminsw m9, m0 ; u1
- pminsw m10, m13 ; u2
- pminsw m11, m14 ; u3
- pminsw m12, m15 ; u4
- pmaxsw m9, m10
- pmaxsw m11, m12
-
- pmaxsw m1, m3 ; d without max(d,0)
- pmaxsw m9, m11 ; u without max(u,0)
- pxor m15, m15
- pmaxsw m1, m15
- pmaxsw m9, m15
-
- mova m0, [rsp]
- paddw m0, m1
- psubw m0, m9
- packuswb m0, m0
-
- movh [dstq], m0
- add srcq, mmsize/2
- add dstq, mmsize/2
- sub pixelsd, mmsize/2
- jg .loop
-RET
-%endif
diff --git a/libavfilter/x86/vf_spp.c b/libavfilter/x86/vf_spp.c
deleted file mode 100644
index 7d5da61..0000000
--- a/libavfilter/x86/vf_spp.c
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-
-#include "libavutil/attributes.h"
-#include "libavutil/cpu.h"
-#include "libavutil/crc.h"
-#include "libavutil/mem.h"
-#include "libavutil/x86/asm.h"
-#include "libavfilter/vf_spp.h"
-
-#if HAVE_MMX_INLINE
-static void hardthresh_mmx(int16_t dst[64], const int16_t src[64],
- int qp, const uint8_t *permutation)
-{
- int bias = 0; //FIXME
- unsigned int threshold1;
-
- threshold1 = qp * ((1<<4) - bias) - 1;
-
-#define REQUANT_CORE(dst0, dst1, dst2, dst3, src0, src1, src2, src3) \
- "movq " #src0 ", %%mm0 \n" \
- "movq " #src1 ", %%mm1 \n" \
- "movq " #src2 ", %%mm2 \n" \
- "movq " #src3 ", %%mm3 \n" \
- "psubw %%mm4, %%mm0 \n" \
- "psubw %%mm4, %%mm1 \n" \
- "psubw %%mm4, %%mm2 \n" \
- "psubw %%mm4, %%mm3 \n" \
- "paddusw %%mm5, %%mm0 \n" \
- "paddusw %%mm5, %%mm1 \n" \
- "paddusw %%mm5, %%mm2 \n" \
- "paddusw %%mm5, %%mm3 \n" \
- "paddw %%mm6, %%mm0 \n" \
- "paddw %%mm6, %%mm1 \n" \
- "paddw %%mm6, %%mm2 \n" \
- "paddw %%mm6, %%mm3 \n" \
- "psubusw %%mm6, %%mm0 \n" \
- "psubusw %%mm6, %%mm1 \n" \
- "psubusw %%mm6, %%mm2 \n" \
- "psubusw %%mm6, %%mm3 \n" \
- "psraw $3, %%mm0 \n" \
- "psraw $3, %%mm1 \n" \
- "psraw $3, %%mm2 \n" \
- "psraw $3, %%mm3 \n" \
- \
- "movq %%mm0, %%mm7 \n" \
- "punpcklwd %%mm2, %%mm0 \n" /*A*/ \
- "punpckhwd %%mm2, %%mm7 \n" /*C*/ \
- "movq %%mm1, %%mm2 \n" \
- "punpcklwd %%mm3, %%mm1 \n" /*B*/ \
- "punpckhwd %%mm3, %%mm2 \n" /*D*/ \
- "movq %%mm0, %%mm3 \n" \
- "punpcklwd %%mm1, %%mm0 \n" /*A*/ \
- "punpckhwd %%mm7, %%mm3 \n" /*C*/ \
- "punpcklwd %%mm2, %%mm7 \n" /*B*/ \
- "punpckhwd %%mm2, %%mm1 \n" /*D*/ \
- \
- "movq %%mm0, " #dst0 " \n" \
- "movq %%mm7, " #dst1 " \n" \
- "movq %%mm3, " #dst2 " \n" \
- "movq %%mm1, " #dst3 " \n"
-
- __asm__ volatile(
- "movd %2, %%mm4 \n"
- "movd %3, %%mm5 \n"
- "movd %4, %%mm6 \n"
- "packssdw %%mm4, %%mm4 \n"
- "packssdw %%mm5, %%mm5 \n"
- "packssdw %%mm6, %%mm6 \n"
- "packssdw %%mm4, %%mm4 \n"
- "packssdw %%mm5, %%mm5 \n"
- "packssdw %%mm6, %%mm6 \n"
- REQUANT_CORE( (%1), 8(%1), 16(%1), 24(%1), (%0), 8(%0), 64(%0), 72(%0))
- REQUANT_CORE(32(%1), 40(%1), 48(%1), 56(%1),16(%0),24(%0), 48(%0), 56(%0))
- REQUANT_CORE(64(%1), 72(%1), 80(%1), 88(%1),32(%0),40(%0), 96(%0),104(%0))
- REQUANT_CORE(96(%1),104(%1),112(%1),120(%1),80(%0),88(%0),112(%0),120(%0))
- : : "r" (src), "r" (dst), "g" (threshold1+1), "g" (threshold1+5), "g" (threshold1-4) //FIXME maybe more accurate then needed?
- );
- dst[0] = (src[0] + 4) >> 3;
-}
-
-static void softthresh_mmx(int16_t dst[64], const int16_t src[64],
- int qp, const uint8_t *permutation)
-{
- int bias = 0; //FIXME
- unsigned int threshold1;
-
- threshold1 = qp*((1<<4) - bias) - 1;
-
-#undef REQUANT_CORE
-#define REQUANT_CORE(dst0, dst1, dst2, dst3, src0, src1, src2, src3) \
- "movq " #src0 ", %%mm0 \n" \
- "movq " #src1 ", %%mm1 \n" \
- "pxor %%mm6, %%mm6 \n" \
- "pxor %%mm7, %%mm7 \n" \
- "pcmpgtw %%mm0, %%mm6 \n" \
- "pcmpgtw %%mm1, %%mm7 \n" \
- "pxor %%mm6, %%mm0 \n" \
- "pxor %%mm7, %%mm1 \n" \
- "psubusw %%mm4, %%mm0 \n" \
- "psubusw %%mm4, %%mm1 \n" \
- "pxor %%mm6, %%mm0 \n" \
- "pxor %%mm7, %%mm1 \n" \
- "movq " #src2 ", %%mm2 \n" \
- "movq " #src3 ", %%mm3 \n" \
- "pxor %%mm6, %%mm6 \n" \
- "pxor %%mm7, %%mm7 \n" \
- "pcmpgtw %%mm2, %%mm6 \n" \
- "pcmpgtw %%mm3, %%mm7 \n" \
- "pxor %%mm6, %%mm2 \n" \
- "pxor %%mm7, %%mm3 \n" \
- "psubusw %%mm4, %%mm2 \n" \
- "psubusw %%mm4, %%mm3 \n" \
- "pxor %%mm6, %%mm2 \n" \
- "pxor %%mm7, %%mm3 \n" \
- \
- "paddsw %%mm5, %%mm0 \n" \
- "paddsw %%mm5, %%mm1 \n" \
- "paddsw %%mm5, %%mm2 \n" \
- "paddsw %%mm5, %%mm3 \n" \
- "psraw $3, %%mm0 \n" \
- "psraw $3, %%mm1 \n" \
- "psraw $3, %%mm2 \n" \
- "psraw $3, %%mm3 \n" \
- \
- "movq %%mm0, %%mm7 \n" \
- "punpcklwd %%mm2, %%mm0 \n" /*A*/ \
- "punpckhwd %%mm2, %%mm7 \n" /*C*/ \
- "movq %%mm1, %%mm2 \n" \
- "punpcklwd %%mm3, %%mm1 \n" /*B*/ \
- "punpckhwd %%mm3, %%mm2 \n" /*D*/ \
- "movq %%mm0, %%mm3 \n" \
- "punpcklwd %%mm1, %%mm0 \n" /*A*/ \
- "punpckhwd %%mm7, %%mm3 \n" /*C*/ \
- "punpcklwd %%mm2, %%mm7 \n" /*B*/ \
- "punpckhwd %%mm2, %%mm1 \n" /*D*/ \
- \
- "movq %%mm0, " #dst0 " \n" \
- "movq %%mm7, " #dst1 " \n" \
- "movq %%mm3, " #dst2 " \n" \
- "movq %%mm1, " #dst3 " \n"
-
- __asm__ volatile(
- "movd %2, %%mm4 \n"
- "movd %3, %%mm5 \n"
- "packssdw %%mm4, %%mm4 \n"
- "packssdw %%mm5, %%mm5 \n"
- "packssdw %%mm4, %%mm4 \n"
- "packssdw %%mm5, %%mm5 \n"
- REQUANT_CORE( (%1), 8(%1), 16(%1), 24(%1), (%0), 8(%0), 64(%0), 72(%0))
- REQUANT_CORE(32(%1), 40(%1), 48(%1), 56(%1),16(%0),24(%0), 48(%0), 56(%0))
- REQUANT_CORE(64(%1), 72(%1), 80(%1), 88(%1),32(%0),40(%0), 96(%0),104(%0))
- REQUANT_CORE(96(%1),104(%1),112(%1),120(%1),80(%0),88(%0),112(%0),120(%0))
- : : "r" (src), "r" (dst), "g" (threshold1), "rm" (4) //FIXME maybe more accurate then needed?
- );
-
- dst[0] = (src[0] + 4) >> 3;
-}
-
-static void store_slice_mmx(uint8_t *dst, const int16_t *src,
- int dst_stride, int src_stride,
- int width, int height, int log2_scale,
- const uint8_t dither[8][8])
-{
- int y;
-
- for (y = 0; y < height; y++) {
- uint8_t *dst1 = dst;
- const int16_t *src1 = src;
- __asm__ volatile(
- "movq (%3), %%mm3 \n"
- "movq (%3), %%mm4 \n"
- "movd %4, %%mm2 \n"
- "pxor %%mm0, %%mm0 \n"
- "punpcklbw %%mm0, %%mm3 \n"
- "punpckhbw %%mm0, %%mm4 \n"
- "psraw %%mm2, %%mm3 \n"
- "psraw %%mm2, %%mm4 \n"
- "movd %5, %%mm2 \n"
- "1: \n"
- "movq (%0), %%mm0 \n"
- "movq 8(%0), %%mm1 \n"
- "paddw %%mm3, %%mm0 \n"
- "paddw %%mm4, %%mm1 \n"
- "psraw %%mm2, %%mm0 \n"
- "psraw %%mm2, %%mm1 \n"
- "packuswb %%mm1, %%mm0 \n"
- "movq %%mm0, (%1) \n"
- "add $16, %0 \n"
- "add $8, %1 \n"
- "cmp %2, %1 \n"
- " jb 1b \n"
- : "+r" (src1), "+r"(dst1)
- : "r"(dst + width), "r"(dither[y]), "g"(log2_scale), "g"(MAX_LEVEL - log2_scale)
- );
- src += src_stride;
- dst += dst_stride;
- }
-}
-
-#endif /* HAVE_MMX_INLINE */
-
-av_cold void ff_spp_init_x86(SPPContext *s)
-{
-#if HAVE_MMX_INLINE
- int cpu_flags = av_get_cpu_flags();
-
- if (cpu_flags & AV_CPU_FLAG_MMX) {
- static const uint32_t mmx_idct_perm_crc = 0xe5e8adc4;
- uint32_t idct_perm_crc =
- av_crc(av_crc_get_table(AV_CRC_32_IEEE), 0,
- s->dct->idct_permutation,
- sizeof(s->dct->idct_permutation));
- int64_t bps;
- s->store_slice = store_slice_mmx;
- av_opt_get_int(s->dct, "bits_per_sample", 0, &bps);
- if (bps <= 8 && idct_perm_crc == mmx_idct_perm_crc) {
- switch (s->mode) {
- case 0: s->requantize = hardthresh_mmx; break;
- case 1: s->requantize = softthresh_mmx; break;
- }
- }
- }
-#endif
-}
diff --git a/libavfilter/x86/vf_tinterlace_init.c b/libavfilter/x86/vf_tinterlace_init.c
deleted file mode 100644
index 2c9b1de..0000000
--- a/libavfilter/x86/vf_tinterlace_init.c
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (C) 2014 Kieran Kunhya <kierank@obe.tv>
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "libavutil/attributes.h"
-#include "libavutil/cpu.h"
-#include "libavutil/internal.h"
-#include "libavutil/mem.h"
-#include "libavutil/x86/asm.h"
-#include "libavutil/x86/cpu.h"
-
-#include "libavfilter/tinterlace.h"
-
-void ff_lowpass_line_sse2(uint8_t *dstp, ptrdiff_t linesize,
- const uint8_t *srcp, ptrdiff_t mref,
- ptrdiff_t pref, int clip_max);
-void ff_lowpass_line_avx (uint8_t *dstp, ptrdiff_t linesize,
- const uint8_t *srcp, ptrdiff_t mref,
- ptrdiff_t pref, int clip_max);
-void ff_lowpass_line_avx2 (uint8_t *dstp, ptrdiff_t linesize,
- const uint8_t *srcp, ptrdiff_t mref,
- ptrdiff_t pref, int clip_max);
-
-void ff_lowpass_line_16_sse2(uint8_t *dstp, ptrdiff_t linesize,
- const uint8_t *srcp, ptrdiff_t mref,
- ptrdiff_t pref, int clip_max);
-void ff_lowpass_line_16_avx (uint8_t *dstp, ptrdiff_t linesize,
- const uint8_t *srcp, ptrdiff_t mref,
- ptrdiff_t pref, int clip_max);
-void ff_lowpass_line_16_avx2 (uint8_t *dstp, ptrdiff_t linesize,
- const uint8_t *srcp, ptrdiff_t mref,
- ptrdiff_t pref, int clip_max);
-
-void ff_lowpass_line_complex_sse2(uint8_t *dstp, ptrdiff_t linesize,
- const uint8_t *srcp, ptrdiff_t mref,
- ptrdiff_t pref, int clip_max);
-
-void ff_lowpass_line_complex_12_sse2(uint8_t *dstp, ptrdiff_t linesize,
- const uint8_t *srcp, ptrdiff_t mref,
- ptrdiff_t pref, int clip_max);
-
-av_cold void ff_tinterlace_init_x86(TInterlaceContext *s)
-{
- int cpu_flags = av_get_cpu_flags();
-
- if (s->csp->comp[0].depth > 8) {
- if (EXTERNAL_SSE2(cpu_flags)) {
- if (!(s->flags & TINTERLACE_FLAG_CVLPF))
- s->lowpass_line = ff_lowpass_line_16_sse2;
- else
- s->lowpass_line = ff_lowpass_line_complex_12_sse2;
- }
- if (EXTERNAL_AVX(cpu_flags))
- if (!(s->flags & TINTERLACE_FLAG_CVLPF))
- s->lowpass_line = ff_lowpass_line_16_avx;
- if (EXTERNAL_AVX2_FAST(cpu_flags)) {
- if (!(s->flags & TINTERLACE_FLAG_CVLPF)) {
- s->lowpass_line = ff_lowpass_line_16_avx2;
- }
- }
- } else {
- if (EXTERNAL_SSE2(cpu_flags)) {
- if (!(s->flags & TINTERLACE_FLAG_CVLPF))
- s->lowpass_line = ff_lowpass_line_sse2;
- else
- s->lowpass_line = ff_lowpass_line_complex_sse2;
- }
- if (EXTERNAL_AVX(cpu_flags))
- if (!(s->flags & TINTERLACE_FLAG_CVLPF))
- s->lowpass_line = ff_lowpass_line_avx;
- if (EXTERNAL_AVX2_FAST(cpu_flags)) {
- if (!(s->flags & TINTERLACE_FLAG_CVLPF)) {
- s->lowpass_line = ff_lowpass_line_avx2;
- }
- }
- }
-}
diff --git a/libavformat/avformat.h b/libavformat/avformat.h
index 39b99b4..81a0bd0 100644
--- a/libavformat/avformat.h
+++ b/libavformat/avformat.h
@@ -313,6 +313,11 @@
#include "libavutil/dict.h"
#include "libavutil/log.h"
+// We have to implement deprecated functions until they are removed, this is the
+// simplest way to prevent warnings
+#undef attribute_deprecated
+#define attribute_deprecated
+
#include "avio.h"
#include "libavformat/version.h"
diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
index 784973a..76ead7d 100644
--- a/libavformat/matroskaenc.c
+++ b/libavformat/matroskaenc.c
@@ -1790,6 +1790,13 @@
av_dict_get(s->metadata, "alpha_mode", NULL, 0))
version = 4;
+ if (s->nb_streams > MAX_TRACKS) {
+ av_log(s, AV_LOG_ERROR,
+ "At most %d streams are supported for muxing in Matroska\n",
+ MAX_TRACKS);
+ return AVERROR(EINVAL);
+ }
+
for (i = 0; i < s->nb_streams; i++) {
if (s->streams[i]->codecpar->codec_id == AV_CODEC_ID_OPUS ||
av_dict_get(s->streams[i]->metadata, "stereo_mode", NULL, 0) ||
diff --git a/libpostproc/postprocess.c b/libpostproc/postprocess.c
deleted file mode 100644
index 8d44165..0000000
--- a/libpostproc/postprocess.c
+++ /dev/null
@@ -1,1036 +0,0 @@
-/*
- * Copyright (C) 2001-2003 Michael Niedermayer (michaelni@gmx.at)
- *
- * AltiVec optimizations (C) 2004 Romain Dolbeau <romain@dolbeau.org>
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with FFmpeg; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-/**
- * @file
- * postprocessing.
- */
-
-/*
- C MMX MMX2 3DNow AltiVec
-isVertDC Ec Ec Ec
-isVertMinMaxOk Ec Ec Ec
-doVertLowPass E e e Ec
-doVertDefFilter Ec Ec e e Ec
-isHorizDC Ec Ec Ec
-isHorizMinMaxOk a E Ec
-doHorizLowPass E e e Ec
-doHorizDefFilter Ec Ec e e Ec
-do_a_deblock Ec E Ec E
-deRing E e e* Ecp
-Vertical RKAlgo1 E a a
-Horizontal RKAlgo1 a a
-Vertical X1# a E E
-Horizontal X1# a E E
-LinIpolDeinterlace e E E*
-CubicIpolDeinterlace a e e*
-LinBlendDeinterlace e E E*
-MedianDeinterlace# E Ec Ec
-TempDeNoiser# E e e Ec
-
-* I do not have a 3DNow! CPU -> it is untested, but no one said it does not work so it seems to work
-# more or less selfinvented filters so the exactness is not too meaningful
-E = Exact implementation
-e = almost exact implementation (slightly different rounding,...)
-a = alternative / approximate impl
-c = checked against the other implementations (-vo md5)
-p = partially optimized, still some work to do
-*/
-
-/*
-TODO:
-reduce the time wasted on the mem transfer
-unroll stuff if instructions depend too much on the prior one
-move YScale thing to the end instead of fixing QP
-write a faster and higher quality deblocking filter :)
-make the mainloop more flexible (variable number of blocks at once
- (the if/else stuff per block is slowing things down)
-compare the quality & speed of all filters
-split this huge file
-optimize c versions
-try to unroll inner for(x=0 ... loop to avoid these damn if(x ... checks
-...
-*/
-
-//Changelog: use git log
-
-#include "config.h"
-#include "libavutil/avutil.h"
-#include "libavutil/avassert.h"
-#include "libavutil/intreadwrite.h"
-#include <inttypes.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-//#undef HAVE_MMXEXT_INLINE
-//#define HAVE_AMD3DNOW_INLINE
-//#undef HAVE_MMX_INLINE
-//#undef ARCH_X86
-//#define DEBUG_BRIGHTNESS
-#include "postprocess.h"
-#include "postprocess_internal.h"
-#include "libavutil/avstring.h"
-#include "libavutil/ppc/util_altivec.h"
-
-#include "libavutil/ffversion.h"
-const char postproc_ffversion[] = "FFmpeg version " FFMPEG_VERSION;
-
-unsigned postproc_version(void)
-{
- av_assert0(LIBPOSTPROC_VERSION_MICRO >= 100);
- return LIBPOSTPROC_VERSION_INT;
-}
-
-const char *postproc_configuration(void)
-{
- return FFMPEG_CONFIGURATION;
-}
-
-const char *postproc_license(void)
-{
-#define LICENSE_PREFIX "libpostproc license: "
- return &LICENSE_PREFIX FFMPEG_LICENSE[sizeof(LICENSE_PREFIX) - 1];
-}
-
-#define GET_MODE_BUFFER_SIZE 500
-#define OPTIONS_ARRAY_SIZE 10
-#define BLOCK_SIZE 8
-#define TEMP_STRIDE 8
-//#define NUM_BLOCKS_AT_ONCE 16 //not used yet
-
-#if ARCH_X86 && HAVE_INLINE_ASM
-DECLARE_ASM_CONST(8, uint64_t, w05)= 0x0005000500050005LL;
-DECLARE_ASM_CONST(8, uint64_t, w04)= 0x0004000400040004LL;
-DECLARE_ASM_CONST(8, uint64_t, w20)= 0x0020002000200020LL;
-DECLARE_ASM_CONST(8, uint64_t, b00)= 0x0000000000000000LL;
-DECLARE_ASM_CONST(8, uint64_t, b01)= 0x0101010101010101LL;
-DECLARE_ASM_CONST(8, uint64_t, b02)= 0x0202020202020202LL;
-DECLARE_ASM_CONST(8, uint64_t, b08)= 0x0808080808080808LL;
-DECLARE_ASM_CONST(8, uint64_t, b80)= 0x8080808080808080LL;
-#endif
-
-DECLARE_ASM_CONST(8, int, deringThreshold)= 20;
-
-
-static const struct PPFilter filters[]=
-{
- {"hb", "hdeblock", 1, 1, 3, H_DEBLOCK},
- {"vb", "vdeblock", 1, 2, 4, V_DEBLOCK},
-/* {"hr", "rkhdeblock", 1, 1, 3, H_RK1_FILTER},
- {"vr", "rkvdeblock", 1, 2, 4, V_RK1_FILTER},*/
- {"h1", "x1hdeblock", 1, 1, 3, H_X1_FILTER},
- {"v1", "x1vdeblock", 1, 2, 4, V_X1_FILTER},
- {"ha", "ahdeblock", 1, 1, 3, H_A_DEBLOCK},
- {"va", "avdeblock", 1, 2, 4, V_A_DEBLOCK},
- {"dr", "dering", 1, 5, 6, DERING},
- {"al", "autolevels", 0, 1, 2, LEVEL_FIX},
- {"lb", "linblenddeint", 1, 1, 4, LINEAR_BLEND_DEINT_FILTER},
- {"li", "linipoldeint", 1, 1, 4, LINEAR_IPOL_DEINT_FILTER},
- {"ci", "cubicipoldeint", 1, 1, 4, CUBIC_IPOL_DEINT_FILTER},
- {"md", "mediandeint", 1, 1, 4, MEDIAN_DEINT_FILTER},
- {"fd", "ffmpegdeint", 1, 1, 4, FFMPEG_DEINT_FILTER},
- {"l5", "lowpass5", 1, 1, 4, LOWPASS5_DEINT_FILTER},
- {"tn", "tmpnoise", 1, 7, 8, TEMP_NOISE_FILTER},
- {"fq", "forcequant", 1, 0, 0, FORCE_QUANT},
- {"be", "bitexact", 1, 0, 0, BITEXACT},
- {"vi", "visualize", 1, 0, 0, VISUALIZE},
- {NULL, NULL,0,0,0,0} //End Marker
-};
-
-static const char * const replaceTable[]=
-{
- "default", "hb:a,vb:a,dr:a",
- "de", "hb:a,vb:a,dr:a",
- "fast", "h1:a,v1:a,dr:a",
- "fa", "h1:a,v1:a,dr:a",
- "ac", "ha:a:128:7,va:a,dr:a",
- NULL //End Marker
-};
-
-/* The horizontal functions exist only in C because the MMX
- * code is faster with vertical filters and transposing. */
-
-/**
- * Check if the given 8x8 Block is mostly "flat"
- */
-static inline int isHorizDC_C(const uint8_t src[], int stride, const PPContext *c)
-{
- int numEq= 0;
- int y;
- const int dcOffset= ((c->nonBQP*c->ppMode.baseDcDiff)>>8) + 1;
- const int dcThreshold= dcOffset*2 + 1;
-
- for(y=0; y<BLOCK_SIZE; y++){
- numEq += ((unsigned)(src[0] - src[1] + dcOffset)) < dcThreshold;
- numEq += ((unsigned)(src[1] - src[2] + dcOffset)) < dcThreshold;
- numEq += ((unsigned)(src[2] - src[3] + dcOffset)) < dcThreshold;
- numEq += ((unsigned)(src[3] - src[4] + dcOffset)) < dcThreshold;
- numEq += ((unsigned)(src[4] - src[5] + dcOffset)) < dcThreshold;
- numEq += ((unsigned)(src[5] - src[6] + dcOffset)) < dcThreshold;
- numEq += ((unsigned)(src[6] - src[7] + dcOffset)) < dcThreshold;
- src+= stride;
- }
- return numEq > c->ppMode.flatnessThreshold;
-}
-
-/**
- * Check if the middle 8x8 Block in the given 8x16 block is flat
- */
-static inline int isVertDC_C(const uint8_t src[], int stride, const PPContext *c)
-{
- int numEq= 0;
- int y;
- const int dcOffset= ((c->nonBQP*c->ppMode.baseDcDiff)>>8) + 1;
- const int dcThreshold= dcOffset*2 + 1;
-
- src+= stride*4; // src points to begin of the 8x8 Block
- for(y=0; y<BLOCK_SIZE-1; y++){
- numEq += ((unsigned)(src[0] - src[0+stride] + dcOffset)) < dcThreshold;
- numEq += ((unsigned)(src[1] - src[1+stride] + dcOffset)) < dcThreshold;
- numEq += ((unsigned)(src[2] - src[2+stride] + dcOffset)) < dcThreshold;
- numEq += ((unsigned)(src[3] - src[3+stride] + dcOffset)) < dcThreshold;
- numEq += ((unsigned)(src[4] - src[4+stride] + dcOffset)) < dcThreshold;
- numEq += ((unsigned)(src[5] - src[5+stride] + dcOffset)) < dcThreshold;
- numEq += ((unsigned)(src[6] - src[6+stride] + dcOffset)) < dcThreshold;
- numEq += ((unsigned)(src[7] - src[7+stride] + dcOffset)) < dcThreshold;
- src+= stride;
- }
- return numEq > c->ppMode.flatnessThreshold;
-}
-
-static inline int isHorizMinMaxOk_C(const uint8_t src[], int stride, int QP)
-{
- int i;
- for(i=0; i<2; i++){
- if((unsigned)(src[0] - src[5] + 2*QP) > 4*QP) return 0;
- src += stride;
- if((unsigned)(src[2] - src[7] + 2*QP) > 4*QP) return 0;
- src += stride;
- if((unsigned)(src[4] - src[1] + 2*QP) > 4*QP) return 0;
- src += stride;
- if((unsigned)(src[6] - src[3] + 2*QP) > 4*QP) return 0;
- src += stride;
- }
- return 1;
-}
-
-static inline int isVertMinMaxOk_C(const uint8_t src[], int stride, int QP)
-{
- int x;
- src+= stride*4;
- for(x=0; x<BLOCK_SIZE; x+=4){
- if((unsigned)(src[ x + 0*stride] - src[ x + 5*stride] + 2*QP) > 4*QP) return 0;
- if((unsigned)(src[1+x + 2*stride] - src[1+x + 7*stride] + 2*QP) > 4*QP) return 0;
- if((unsigned)(src[2+x + 4*stride] - src[2+x + 1*stride] + 2*QP) > 4*QP) return 0;
- if((unsigned)(src[3+x + 6*stride] - src[3+x + 3*stride] + 2*QP) > 4*QP) return 0;
- }
- return 1;
-}
-
-static inline int horizClassify_C(const uint8_t src[], int stride, const PPContext *c)
-{
- if( isHorizDC_C(src, stride, c) ){
- return isHorizMinMaxOk_C(src, stride, c->QP);
- }else{
- return 2;
- }
-}
-
-static inline int vertClassify_C(const uint8_t src[], int stride, const PPContext *c)
-{
- if( isVertDC_C(src, stride, c) ){
- return isVertMinMaxOk_C(src, stride, c->QP);
- }else{
- return 2;
- }
-}
-
-static inline void doHorizDefFilter_C(uint8_t dst[], int stride, const PPContext *c)
-{
- int y;
- for(y=0; y<BLOCK_SIZE; y++){
- const int middleEnergy= 5*(dst[4] - dst[3]) + 2*(dst[2] - dst[5]);
-
- if(FFABS(middleEnergy) < 8*c->QP){
- const int q=(dst[3] - dst[4])/2;
- const int leftEnergy= 5*(dst[2] - dst[1]) + 2*(dst[0] - dst[3]);
- const int rightEnergy= 5*(dst[6] - dst[5]) + 2*(dst[4] - dst[7]);
-
- int d= FFABS(middleEnergy) - FFMIN( FFABS(leftEnergy), FFABS(rightEnergy) );
- d= FFMAX(d, 0);
-
- d= (5*d + 32) >> 6;
- d*= FFSIGN(-middleEnergy);
-
- if(q>0)
- {
- d = FFMAX(d, 0);
- d = FFMIN(d, q);
- }
- else
- {
- d = FFMIN(d, 0);
- d = FFMAX(d, q);
- }
-
- dst[3]-= d;
- dst[4]+= d;
- }
- dst+= stride;
- }
-}
-
-/**
- * Do a horizontal low pass filter on the 10x8 block (dst points to middle 8x8 Block)
- * using the 9-Tap Filter (1,1,2,2,4,2,2,1,1)/16 (C version)
- */
-static inline void doHorizLowPass_C(uint8_t dst[], int stride, const PPContext *c)
-{
- int y;
- for(y=0; y<BLOCK_SIZE; y++){
- const int first= FFABS(dst[-1] - dst[0]) < c->QP ? dst[-1] : dst[0];
- const int last= FFABS(dst[8] - dst[7]) < c->QP ? dst[8] : dst[7];
-
- int sums[10];
- sums[0] = 4*first + dst[0] + dst[1] + dst[2] + 4;
- sums[1] = sums[0] - first + dst[3];
- sums[2] = sums[1] - first + dst[4];
- sums[3] = sums[2] - first + dst[5];
- sums[4] = sums[3] - first + dst[6];
- sums[5] = sums[4] - dst[0] + dst[7];
- sums[6] = sums[5] - dst[1] + last;
- sums[7] = sums[6] - dst[2] + last;
- sums[8] = sums[7] - dst[3] + last;
- sums[9] = sums[8] - dst[4] + last;
-
- dst[0]= (sums[0] + sums[2] + 2*dst[0])>>4;
- dst[1]= (sums[1] + sums[3] + 2*dst[1])>>4;
- dst[2]= (sums[2] + sums[4] + 2*dst[2])>>4;
- dst[3]= (sums[3] + sums[5] + 2*dst[3])>>4;
- dst[4]= (sums[4] + sums[6] + 2*dst[4])>>4;
- dst[5]= (sums[5] + sums[7] + 2*dst[5])>>4;
- dst[6]= (sums[6] + sums[8] + 2*dst[6])>>4;
- dst[7]= (sums[7] + sums[9] + 2*dst[7])>>4;
-
- dst+= stride;
- }
-}
-
-/**
- * Experimental Filter 1 (Horizontal)
- * will not damage linear gradients
- * Flat blocks should look like they were passed through the (1,1,2,2,4,2,2,1,1) 9-Tap filter
- * can only smooth blocks at the expected locations (it cannot smooth them if they did move)
- * MMX2 version does correct clipping C version does not
- * not identical with the vertical one
- */
-static inline void horizX1Filter(uint8_t *src, int stride, int QP)
-{
- int y;
- static uint64_t lut[256];
- if(!lut[255])
- {
- int i;
- for(i=0; i<256; i++)
- {
- int v= i < 128 ? 2*i : 2*(i-256);
-/*
-//Simulate 112242211 9-Tap filter
- uint64_t a= (v/16) & 0xFF;
- uint64_t b= (v/8) & 0xFF;
- uint64_t c= (v/4) & 0xFF;
- uint64_t d= (3*v/8) & 0xFF;
-*/
-//Simulate piecewise linear interpolation
- uint64_t a= (v/16) & 0xFF;
- uint64_t b= (v*3/16) & 0xFF;
- uint64_t c= (v*5/16) & 0xFF;
- uint64_t d= (7*v/16) & 0xFF;
- uint64_t A= (0x100 - a)&0xFF;
- uint64_t B= (0x100 - b)&0xFF;
- uint64_t C= (0x100 - c)&0xFF;
- uint64_t D= (0x100 - c)&0xFF;
-
- lut[i] = (a<<56) | (b<<48) | (c<<40) | (d<<32) |
- (D<<24) | (C<<16) | (B<<8) | (A);
- //lut[i] = (v<<32) | (v<<24);
- }
- }
-
- for(y=0; y<BLOCK_SIZE; y++){
- int a= src[1] - src[2];
- int b= src[3] - src[4];
- int c= src[5] - src[6];
-
- int d= FFMAX(FFABS(b) - (FFABS(a) + FFABS(c))/2, 0);
-
- if(d < QP){
- int v = d * FFSIGN(-b);
-
- src[1] +=v/8;
- src[2] +=v/4;
- src[3] +=3*v/8;
- src[4] -=3*v/8;
- src[5] -=v/4;
- src[6] -=v/8;
- }
- src+=stride;
- }
-}
-
-/**
- * accurate deblock filter
- */
-static av_always_inline void do_a_deblock_C(uint8_t *src, int step,
- int stride, const PPContext *c, int mode)
-{
- int y;
- const int QP= c->QP;
- const int dcOffset= ((c->nonBQP*c->ppMode.baseDcDiff)>>8) + 1;
- const int dcThreshold= dcOffset*2 + 1;
-
- src+= step*4; // src points to begin of the 8x8 Block
- for(y=0; y<8; y++){
- int numEq= 0;
-
- numEq += ((unsigned)(src[-1*step] - src[0*step] + dcOffset)) < dcThreshold;
- numEq += ((unsigned)(src[ 0*step] - src[1*step] + dcOffset)) < dcThreshold;
- numEq += ((unsigned)(src[ 1*step] - src[2*step] + dcOffset)) < dcThreshold;
- numEq += ((unsigned)(src[ 2*step] - src[3*step] + dcOffset)) < dcThreshold;
- numEq += ((unsigned)(src[ 3*step] - src[4*step] + dcOffset)) < dcThreshold;
- numEq += ((unsigned)(src[ 4*step] - src[5*step] + dcOffset)) < dcThreshold;
- numEq += ((unsigned)(src[ 5*step] - src[6*step] + dcOffset)) < dcThreshold;
- numEq += ((unsigned)(src[ 6*step] - src[7*step] + dcOffset)) < dcThreshold;
- numEq += ((unsigned)(src[ 7*step] - src[8*step] + dcOffset)) < dcThreshold;
- if(numEq > c->ppMode.flatnessThreshold){
- int min, max, x;
-
- if(src[0] > src[step]){
- max= src[0];
- min= src[step];
- }else{
- max= src[step];
- min= src[0];
- }
- for(x=2; x<8; x+=2){
- if(src[x*step] > src[(x+1)*step]){
- if(src[x *step] > max) max= src[ x *step];
- if(src[(x+1)*step] < min) min= src[(x+1)*step];
- }else{
- if(src[(x+1)*step] > max) max= src[(x+1)*step];
- if(src[ x *step] < min) min= src[ x *step];
- }
- }
- if(max-min < 2*QP){
- const int first= FFABS(src[-1*step] - src[0]) < QP ? src[-1*step] : src[0];
- const int last= FFABS(src[8*step] - src[7*step]) < QP ? src[8*step] : src[7*step];
-
- int sums[10];
- sums[0] = 4*first + src[0*step] + src[1*step] + src[2*step] + 4;
- sums[1] = sums[0] - first + src[3*step];
- sums[2] = sums[1] - first + src[4*step];
- sums[3] = sums[2] - first + src[5*step];
- sums[4] = sums[3] - first + src[6*step];
- sums[5] = sums[4] - src[0*step] + src[7*step];
- sums[6] = sums[5] - src[1*step] + last;
- sums[7] = sums[6] - src[2*step] + last;
- sums[8] = sums[7] - src[3*step] + last;
- sums[9] = sums[8] - src[4*step] + last;
-
- if (mode & VISUALIZE) {
- src[0*step] =
- src[1*step] =
- src[2*step] =
- src[3*step] =
- src[4*step] =
- src[5*step] =
- src[6*step] =
- src[7*step] = 128;
- }
- src[0*step]= (sums[0] + sums[2] + 2*src[0*step])>>4;
- src[1*step]= (sums[1] + sums[3] + 2*src[1*step])>>4;
- src[2*step]= (sums[2] + sums[4] + 2*src[2*step])>>4;
- src[3*step]= (sums[3] + sums[5] + 2*src[3*step])>>4;
- src[4*step]= (sums[4] + sums[6] + 2*src[4*step])>>4;
- src[5*step]= (sums[5] + sums[7] + 2*src[5*step])>>4;
- src[6*step]= (sums[6] + sums[8] + 2*src[6*step])>>4;
- src[7*step]= (sums[7] + sums[9] + 2*src[7*step])>>4;
- }
- }else{
- const int middleEnergy= 5*(src[4*step] - src[3*step]) + 2*(src[2*step] - src[5*step]);
-
- if(FFABS(middleEnergy) < 8*QP){
- const int q=(src[3*step] - src[4*step])/2;
- const int leftEnergy= 5*(src[2*step] - src[1*step]) + 2*(src[0*step] - src[3*step]);
- const int rightEnergy= 5*(src[6*step] - src[5*step]) + 2*(src[4*step] - src[7*step]);
-
- int d= FFABS(middleEnergy) - FFMIN( FFABS(leftEnergy), FFABS(rightEnergy) );
- d= FFMAX(d, 0);
-
- d= (5*d + 32) >> 6;
- d*= FFSIGN(-middleEnergy);
-
- if(q>0){
- d = FFMAX(d, 0);
- d = FFMIN(d, q);
- }else{
- d = FFMIN(d, 0);
- d = FFMAX(d, q);
- }
-
- if ((mode & VISUALIZE) && d) {
- d= (d < 0) ? 32 : -32;
- src[3*step]= av_clip_uint8(src[3*step] - d);
- src[4*step]= av_clip_uint8(src[4*step] + d);
- d = 0;
- }
-
- src[3*step]-= d;
- src[4*step]+= d;
- }
- }
-
- src += stride;
- }
-}
-
-//Note: we have C, MMX, MMX2, 3DNOW version there is no 3DNOW+MMX2 one
-//Plain C versions
-//we always compile C for testing which needs bitexactness
-#define TEMPLATE_PP_C 1
-#include "postprocess_template.c"
-
-#if HAVE_ALTIVEC
-# define TEMPLATE_PP_ALTIVEC 1
-# include "postprocess_altivec_template.c"
-# include "postprocess_template.c"
-#endif
-
-#if ARCH_X86 && HAVE_INLINE_ASM
-# if CONFIG_RUNTIME_CPUDETECT
-# define TEMPLATE_PP_MMX 1
-# include "postprocess_template.c"
-# define TEMPLATE_PP_MMXEXT 1
-# include "postprocess_template.c"
-# define TEMPLATE_PP_3DNOW 1
-# include "postprocess_template.c"
-# define TEMPLATE_PP_SSE2 1
-# include "postprocess_template.c"
-# else
-# if HAVE_SSE2_INLINE
-# define TEMPLATE_PP_SSE2 1
-# include "postprocess_template.c"
-# elif HAVE_MMXEXT_INLINE
-# define TEMPLATE_PP_MMXEXT 1
-# include "postprocess_template.c"
-# elif HAVE_AMD3DNOW_INLINE
-# define TEMPLATE_PP_3DNOW 1
-# include "postprocess_template.c"
-# elif HAVE_MMX_INLINE
-# define TEMPLATE_PP_MMX 1
-# include "postprocess_template.c"
-# endif
-# endif
-#endif
-
-typedef void (*pp_fn)(const uint8_t src[], int srcStride, uint8_t dst[], int dstStride, int width, int height,
- const int8_t QPs[], int QPStride, int isColor, PPContext *c2);
-
-static inline void postProcess(const uint8_t src[], int srcStride, uint8_t dst[], int dstStride, int width, int height,
- const int8_t QPs[], int QPStride, int isColor, pp_mode *vm, pp_context *vc)
-{
- pp_fn pp = postProcess_C;
- PPContext *c= (PPContext *)vc;
- PPMode *ppMode= (PPMode *)vm;
- c->ppMode= *ppMode; //FIXME
-
- if (!(ppMode->lumMode & BITEXACT)) {
-#if CONFIG_RUNTIME_CPUDETECT
-#if ARCH_X86 && HAVE_INLINE_ASM
- // ordered per speed fastest first
- if (c->cpuCaps & AV_CPU_FLAG_SSE2) pp = postProcess_SSE2;
- else if (c->cpuCaps & AV_CPU_FLAG_MMXEXT) pp = postProcess_MMX2;
- else if (c->cpuCaps & AV_CPU_FLAG_3DNOW) pp = postProcess_3DNow;
- else if (c->cpuCaps & AV_CPU_FLAG_MMX) pp = postProcess_MMX;
-#elif HAVE_ALTIVEC
- if (c->cpuCaps & AV_CPU_FLAG_ALTIVEC) pp = postProcess_altivec;
-#endif
-#else /* CONFIG_RUNTIME_CPUDETECT */
-#if HAVE_SSE2_INLINE
- pp = postProcess_SSE2;
-#elif HAVE_MMXEXT_INLINE
- pp = postProcess_MMX2;
-#elif HAVE_AMD3DNOW_INLINE
- pp = postProcess_3DNow;
-#elif HAVE_MMX_INLINE
- pp = postProcess_MMX;
-#elif HAVE_ALTIVEC
- pp = postProcess_altivec;
-#endif
-#endif /* !CONFIG_RUNTIME_CPUDETECT */
- }
-
- pp(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, c);
-}
-
-/* -pp Command line Help
-*/
-const char pp_help[] =
-"Available postprocessing filters:\n"
-"Filters Options\n"
-"short long name short long option Description\n"
-"* * a autoq CPU power dependent enabler\n"
-" c chrom chrominance filtering enabled\n"
-" y nochrom chrominance filtering disabled\n"
-" n noluma luma filtering disabled\n"
-"hb hdeblock (2 threshold) horizontal deblocking filter\n"
-" 1. difference factor: default=32, higher -> more deblocking\n"
-" 2. flatness threshold: default=39, lower -> more deblocking\n"
-" the h & v deblocking filters share these\n"
-" so you can't set different thresholds for h / v\n"
-"vb vdeblock (2 threshold) vertical deblocking filter\n"
-"ha hadeblock (2 threshold) horizontal deblocking filter\n"
-"va vadeblock (2 threshold) vertical deblocking filter\n"
-"h1 x1hdeblock experimental h deblock filter 1\n"
-"v1 x1vdeblock experimental v deblock filter 1\n"
-"dr dering deringing filter\n"
-"al autolevels automatic brightness / contrast\n"
-" f fullyrange stretch luminance to (0..255)\n"
-"lb linblenddeint linear blend deinterlacer\n"
-"li linipoldeint linear interpolating deinterlace\n"
-"ci cubicipoldeint cubic interpolating deinterlacer\n"
-"md mediandeint median deinterlacer\n"
-"fd ffmpegdeint ffmpeg deinterlacer\n"
-"l5 lowpass5 FIR lowpass deinterlacer\n"
-"de default hb:a,vb:a,dr:a\n"
-"fa fast h1:a,v1:a,dr:a\n"
-"ac ha:a:128:7,va:a,dr:a\n"
-"tn tmpnoise (3 threshold) temporal noise reducer\n"
-" 1. <= 2. <= 3. larger -> stronger filtering\n"
-"fq forceQuant <quantizer> force quantizer\n"
-"Usage:\n"
-"<filterName>[:<option>[:<option>...]][[,|/][-]<filterName>[:<option>...]]...\n"
-"long form example:\n"
-"vdeblock:autoq/hdeblock:autoq/linblenddeint default,-vdeblock\n"
-"short form example:\n"
-"vb:a/hb:a/lb de,-vb\n"
-"more examples:\n"
-"tn:64:128:256\n"
-"\n"
-;
-
-pp_mode *pp_get_mode_by_name_and_quality(const char *name, int quality)
-{
- char temp[GET_MODE_BUFFER_SIZE];
- char *p= temp;
- static const char filterDelimiters[] = ",/";
- static const char optionDelimiters[] = ":|";
- struct PPMode *ppMode;
- char *filterToken;
-
- if (!name) {
- av_log(NULL, AV_LOG_ERROR, "pp: Missing argument\n");
- return NULL;
- }
-
- if (!strcmp(name, "help")) {
- const char *p;
- for (p = pp_help; strchr(p, '\n'); p = strchr(p, '\n') + 1) {
- av_strlcpy(temp, p, FFMIN(sizeof(temp), strchr(p, '\n') - p + 2));
- av_log(NULL, AV_LOG_INFO, "%s", temp);
- }
- return NULL;
- }
-
- ppMode= av_malloc(sizeof(PPMode));
- if (!ppMode)
- return NULL;
-
- ppMode->lumMode= 0;
- ppMode->chromMode= 0;
- ppMode->maxTmpNoise[0]= 700;
- ppMode->maxTmpNoise[1]= 1500;
- ppMode->maxTmpNoise[2]= 3000;
- ppMode->maxAllowedY= 234;
- ppMode->minAllowedY= 16;
- ppMode->baseDcDiff= 256/8;
- ppMode->flatnessThreshold= 56-16-1;
- ppMode->maxClippedThreshold= (AVRational){1,100};
- ppMode->error=0;
-
- memset(temp, 0, GET_MODE_BUFFER_SIZE);
- av_strlcpy(temp, name, GET_MODE_BUFFER_SIZE - 1);
-
- av_log(NULL, AV_LOG_DEBUG, "pp: %s\n", name);
-
- for(;;){
- const char *filterName;
- int q= 1000000; //PP_QUALITY_MAX;
- int chrom=-1;
- int luma=-1;
- const char *option;
- const char *options[OPTIONS_ARRAY_SIZE];
- int i;
- int filterNameOk=0;
- int numOfUnknownOptions=0;
- int enable=1; //does the user want us to enabled or disabled the filter
- char *tokstate;
-
- filterToken= av_strtok(p, filterDelimiters, &tokstate);
- if(!filterToken) break;
- p+= strlen(filterToken) + 1; // p points to next filterToken
- filterName= av_strtok(filterToken, optionDelimiters, &tokstate);
- if (!filterName) {
- ppMode->error++;
- break;
- }
- av_log(NULL, AV_LOG_DEBUG, "pp: %s::%s\n", filterToken, filterName);
-
- if(*filterName == '-'){
- enable=0;
- filterName++;
- }
-
- for(;;){ //for all options
- option= av_strtok(NULL, optionDelimiters, &tokstate);
- if(!option) break;
-
- av_log(NULL, AV_LOG_DEBUG, "pp: option: %s\n", option);
- if(!strcmp("autoq", option) || !strcmp("a", option)) q= quality;
- else if(!strcmp("nochrom", option) || !strcmp("y", option)) chrom=0;
- else if(!strcmp("chrom", option) || !strcmp("c", option)) chrom=1;
- else if(!strcmp("noluma", option) || !strcmp("n", option)) luma=0;
- else{
- options[numOfUnknownOptions] = option;
- numOfUnknownOptions++;
- }
- if(numOfUnknownOptions >= OPTIONS_ARRAY_SIZE-1) break;
- }
- options[numOfUnknownOptions] = NULL;
-
- /* replace stuff from the replace Table */
- for(i=0; replaceTable[2*i]; i++){
- if(!strcmp(replaceTable[2*i], filterName)){
- size_t newlen = strlen(replaceTable[2*i + 1]);
- int plen;
- int spaceLeft;
-
- p--, *p=',';
-
- plen= strlen(p);
- spaceLeft= p - temp + plen;
- if(spaceLeft + newlen >= GET_MODE_BUFFER_SIZE - 1){
- ppMode->error++;
- break;
- }
- memmove(p + newlen, p, plen+1);
- memcpy(p, replaceTable[2*i + 1], newlen);
- filterNameOk=1;
- }
- }
-
- for(i=0; filters[i].shortName; i++){
- if( !strcmp(filters[i].longName, filterName)
- || !strcmp(filters[i].shortName, filterName)){
- ppMode->lumMode &= ~filters[i].mask;
- ppMode->chromMode &= ~filters[i].mask;
-
- filterNameOk=1;
- if(!enable) break; // user wants to disable it
-
- if(q >= filters[i].minLumQuality && luma)
- ppMode->lumMode|= filters[i].mask;
- if(chrom==1 || (chrom==-1 && filters[i].chromDefault))
- if(q >= filters[i].minChromQuality)
- ppMode->chromMode|= filters[i].mask;
-
- if(filters[i].mask == LEVEL_FIX){
- int o;
- ppMode->minAllowedY= 16;
- ppMode->maxAllowedY= 234;
- for(o=0; options[o]; o++){
- if( !strcmp(options[o],"fullyrange")
- ||!strcmp(options[o],"f")){
- ppMode->minAllowedY= 0;
- ppMode->maxAllowedY= 255;
- numOfUnknownOptions--;
- }
- }
- }
- else if(filters[i].mask == TEMP_NOISE_FILTER)
- {
- int o;
- int numOfNoises=0;
-
- for(o=0; options[o]; o++){
- char *tail;
- ppMode->maxTmpNoise[numOfNoises]=
- strtol(options[o], &tail, 0);
- if(tail!=options[o]){
- numOfNoises++;
- numOfUnknownOptions--;
- if(numOfNoises >= 3) break;
- }
- }
- }
- else if(filters[i].mask == V_DEBLOCK || filters[i].mask == H_DEBLOCK
- || filters[i].mask == V_A_DEBLOCK || filters[i].mask == H_A_DEBLOCK){
- int o;
-
- for(o=0; options[o] && o<2; o++){
- char *tail;
- int val= strtol(options[o], &tail, 0);
- if(tail==options[o]) break;
-
- numOfUnknownOptions--;
- if(o==0) ppMode->baseDcDiff= val;
- else ppMode->flatnessThreshold= val;
- }
- }
- else if(filters[i].mask == FORCE_QUANT){
- int o;
- ppMode->forcedQuant= 15;
-
- for(o=0; options[o] && o<1; o++){
- char *tail;
- int val= strtol(options[o], &tail, 0);
- if(tail==options[o]) break;
-
- numOfUnknownOptions--;
- ppMode->forcedQuant= val;
- }
- }
- }
- }
- if(!filterNameOk) ppMode->error++;
- ppMode->error += numOfUnknownOptions;
- }
-
- av_log(NULL, AV_LOG_DEBUG, "pp: lumMode=%X, chromMode=%X\n", ppMode->lumMode, ppMode->chromMode);
- if(ppMode->error){
- av_log(NULL, AV_LOG_ERROR, "%d errors in postprocess string \"%s\"\n", ppMode->error, name);
- av_free(ppMode);
- return NULL;
- }
- return ppMode;
-}
-
-void pp_free_mode(pp_mode *mode){
- av_free(mode);
-}
-
-static void reallocAlign(void **p, int size){
- av_free(*p);
- *p= av_mallocz(size);
-}
-
-static void reallocBuffers(PPContext *c, int width, int height, int stride, int qpStride){
- int mbWidth = (width+15)>>4;
- int mbHeight= (height+15)>>4;
- int i;
-
- c->stride= stride;
- c->qpStride= qpStride;
-
- reallocAlign((void **)&c->tempDst, stride*24+32);
- reallocAlign((void **)&c->tempSrc, stride*24);
- reallocAlign((void **)&c->tempBlocks, 2*16*8);
- reallocAlign((void **)&c->yHistogram, 256*sizeof(uint64_t));
- for(i=0; i<256; i++)
- c->yHistogram[i]= width*height/64*15/256;
-
- for(i=0; i<3; i++){
- //Note: The +17*1024 is just there so I do not have to worry about r/w over the end.
- reallocAlign((void **)&c->tempBlurred[i], stride*mbHeight*16 + 17*1024);
- reallocAlign((void **)&c->tempBlurredPast[i], 256*((height+7)&(~7))/2 + 17*1024);//FIXME size
- }
-
- reallocAlign((void **)&c->deintTemp, 2*width+32);
- reallocAlign((void **)&c->nonBQPTable, qpStride*mbHeight*sizeof(int8_t));
- reallocAlign((void **)&c->stdQPTable, qpStride*mbHeight*sizeof(int8_t));
- reallocAlign((void **)&c->forcedQPTable, mbWidth*sizeof(int8_t));
-}
-
-static const char * context_to_name(void * ptr) {
- return "postproc";
-}
-
-static const AVClass av_codec_context_class = { "Postproc", context_to_name, NULL };
-
-av_cold pp_context *pp_get_context(int width, int height, int cpuCaps){
- PPContext *c= av_mallocz(sizeof(PPContext));
- int stride= FFALIGN(width, 16); //assumed / will realloc if needed
- int qpStride= (width+15)/16 + 2; //assumed / will realloc if needed
-
- if (!c)
- return NULL;
-
- c->av_class = &av_codec_context_class;
- if(cpuCaps&PP_FORMAT){
- c->hChromaSubSample= cpuCaps&0x3;
- c->vChromaSubSample= (cpuCaps>>4)&0x3;
- }else{
- c->hChromaSubSample= 1;
- c->vChromaSubSample= 1;
- }
- if (cpuCaps & PP_CPU_CAPS_AUTO) {
- c->cpuCaps = av_get_cpu_flags();
- } else {
- c->cpuCaps = 0;
- if (cpuCaps & PP_CPU_CAPS_MMX) c->cpuCaps |= AV_CPU_FLAG_MMX;
- if (cpuCaps & PP_CPU_CAPS_MMX2) c->cpuCaps |= AV_CPU_FLAG_MMXEXT;
- if (cpuCaps & PP_CPU_CAPS_3DNOW) c->cpuCaps |= AV_CPU_FLAG_3DNOW;
- if (cpuCaps & PP_CPU_CAPS_ALTIVEC) c->cpuCaps |= AV_CPU_FLAG_ALTIVEC;
- }
-
- reallocBuffers(c, width, height, stride, qpStride);
-
- c->frameNum=-1;
-
- return c;
-}
-
-av_cold void pp_free_context(void *vc){
- PPContext *c = (PPContext*)vc;
- int i;
-
- for(i=0; i<FF_ARRAY_ELEMS(c->tempBlurred); i++)
- av_free(c->tempBlurred[i]);
- for(i=0; i<FF_ARRAY_ELEMS(c->tempBlurredPast); i++)
- av_free(c->tempBlurredPast[i]);
-
- av_free(c->tempBlocks);
- av_free(c->yHistogram);
- av_free(c->tempDst);
- av_free(c->tempSrc);
- av_free(c->deintTemp);
- av_free(c->stdQPTable);
- av_free(c->nonBQPTable);
- av_free(c->forcedQPTable);
-
- memset(c, 0, sizeof(PPContext));
-
- av_free(c);
-}
-
-void pp_postprocess(const uint8_t * src[3], const int srcStride[3],
- uint8_t * dst[3], const int dstStride[3],
- int width, int height,
- const int8_t *QP_store, int QPStride,
- pp_mode *vm, void *vc, int pict_type)
-{
- int mbWidth = (width+15)>>4;
- int mbHeight= (height+15)>>4;
- PPMode *mode = vm;
- PPContext *c = vc;
- int minStride= FFMAX(FFABS(srcStride[0]), FFABS(dstStride[0]));
- int absQPStride = FFABS(QPStride);
-
- // c->stride and c->QPStride are always positive
- if(c->stride < minStride || c->qpStride < absQPStride)
- reallocBuffers(c, width, height,
- FFMAX(minStride, c->stride),
- FFMAX(c->qpStride, absQPStride));
-
- if(!QP_store || (mode->lumMode & FORCE_QUANT)){
- int i;
- QP_store= c->forcedQPTable;
- absQPStride = QPStride = 0;
- if(mode->lumMode & FORCE_QUANT)
- for(i=0; i<mbWidth; i++) c->forcedQPTable[i]= mode->forcedQuant;
- else
- for(i=0; i<mbWidth; i++) c->forcedQPTable[i]= 1;
- }
-
- if(pict_type & PP_PICT_TYPE_QP2){
- int i;
- const int count= FFMAX(mbHeight * absQPStride, mbWidth);
- for(i=0; i<(count>>2); i++){
- AV_WN32(c->stdQPTable + (i<<2), AV_RN32(QP_store + (i<<2)) >> 1 & 0x7F7F7F7F);
- }
- for(i<<=2; i<count; i++){
- c->stdQPTable[i] = QP_store[i]>>1;
- }
- QP_store= c->stdQPTable;
- QPStride= absQPStride;
- }
-
- if(0){
- int x,y;
- for(y=0; y<mbHeight; y++){
- for(x=0; x<mbWidth; x++){
- av_log(c, AV_LOG_INFO, "%2d ", QP_store[x + y*QPStride]);
- }
- av_log(c, AV_LOG_INFO, "\n");
- }
- av_log(c, AV_LOG_INFO, "\n");
- }
-
- if((pict_type&7)!=3){
- if (QPStride >= 0){
- int i;
- const int count= FFMAX(mbHeight * QPStride, mbWidth);
- for(i=0; i<(count>>2); i++){
- AV_WN32(c->nonBQPTable + (i<<2), AV_RN32(QP_store + (i<<2)) & 0x3F3F3F3F);
- }
- for(i<<=2; i<count; i++){
- c->nonBQPTable[i] = QP_store[i] & 0x3F;
- }
- } else {
- int i,j;
- for(i=0; i<mbHeight; i++) {
- for(j=0; j<absQPStride; j++) {
- c->nonBQPTable[i*absQPStride+j] = QP_store[i*QPStride+j] & 0x3F;
- }
- }
- }
- }
-
- av_log(c, AV_LOG_DEBUG, "using npp filters 0x%X/0x%X\n",
- mode->lumMode, mode->chromMode);
-
- postProcess(src[0], srcStride[0], dst[0], dstStride[0],
- width, height, QP_store, QPStride, 0, mode, c);
-
- if (!(src[1] && src[2] && dst[1] && dst[2]))
- return;
-
- width = (width )>>c->hChromaSubSample;
- height = (height)>>c->vChromaSubSample;
-
- if(mode->chromMode){
- postProcess(src[1], srcStride[1], dst[1], dstStride[1],
- width, height, QP_store, QPStride, 1, mode, c);
- postProcess(src[2], srcStride[2], dst[2], dstStride[2],
- width, height, QP_store, QPStride, 2, mode, c);
- }
- else if(srcStride[1] == dstStride[1] && srcStride[2] == dstStride[2]){
- linecpy(dst[1], src[1], height, srcStride[1]);
- linecpy(dst[2], src[2], height, srcStride[2]);
- }else{
- int y;
- for(y=0; y<height; y++){
- memcpy(&(dst[1][y*dstStride[1]]), &(src[1][y*srcStride[1]]), width);
- memcpy(&(dst[2][y*dstStride[2]]), &(src[2][y*srcStride[2]]), width);
- }
- }
-}
diff --git a/libpostproc/postprocess.h b/libpostproc/postprocess.h
deleted file mode 100644
index 348ee7c..0000000
--- a/libpostproc/postprocess.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright (C) 2001-2003 Michael Niedermayer (michaelni@gmx.at)
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with FFmpeg; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#ifndef POSTPROC_POSTPROCESS_H
-#define POSTPROC_POSTPROCESS_H
-
-/**
- * @file
- * @ingroup lpp
- * external API header
- */
-
-/**
- * @defgroup lpp libpostproc
- * Video postprocessing library.
- *
- * @{
- */
-
-#include "libpostproc/version.h"
-
-/**
- * Return the LIBPOSTPROC_VERSION_INT constant.
- */
-unsigned postproc_version(void);
-
-/**
- * Return the libpostproc build-time configuration.
- */
-const char *postproc_configuration(void);
-
-/**
- * Return the libpostproc license.
- */
-const char *postproc_license(void);
-
-#define PP_QUALITY_MAX 6
-
-#include <inttypes.h>
-
-typedef void pp_context;
-typedef void pp_mode;
-
-#if LIBPOSTPROC_VERSION_INT < (52<<16)
-typedef pp_context pp_context_t;
-typedef pp_mode pp_mode_t;
-extern const char *const pp_help; ///< a simple help text
-#else
-extern const char pp_help[]; ///< a simple help text
-#endif
-
-void pp_postprocess(const uint8_t * src[3], const int srcStride[3],
- uint8_t * dst[3], const int dstStride[3],
- int horizontalSize, int verticalSize,
- const int8_t *QP_store, int QP_stride,
- pp_mode *mode, pp_context *ppContext, int pict_type);
-
-
-/**
- * Return a pp_mode or NULL if an error occurred.
- *
- * @param name the string after "-pp" on the command line
- * @param quality a number from 0 to PP_QUALITY_MAX
- */
-pp_mode *pp_get_mode_by_name_and_quality(const char *name, int quality);
-void pp_free_mode(pp_mode *mode);
-
-pp_context *pp_get_context(int width, int height, int flags);
-void pp_free_context(pp_context *ppContext);
-
-#define PP_CPU_CAPS_MMX 0x80000000
-#define PP_CPU_CAPS_MMX2 0x20000000
-#define PP_CPU_CAPS_3DNOW 0x40000000
-#define PP_CPU_CAPS_ALTIVEC 0x10000000
-#define PP_CPU_CAPS_AUTO 0x00080000
-
-#define PP_FORMAT 0x00000008
-#define PP_FORMAT_420 (0x00000011|PP_FORMAT)
-#define PP_FORMAT_422 (0x00000001|PP_FORMAT)
-#define PP_FORMAT_411 (0x00000002|PP_FORMAT)
-#define PP_FORMAT_444 (0x00000000|PP_FORMAT)
-#define PP_FORMAT_440 (0x00000010|PP_FORMAT)
-
-#define PP_PICT_TYPE_QP2 0x00000010 ///< MPEG2 style QScale
-
-/**
- * @}
- */
-
-#endif /* POSTPROC_POSTPROCESS_H */
diff --git a/libpostproc/postprocess_altivec_template.c b/libpostproc/postprocess_altivec_template.c
deleted file mode 100644
index fa6ebe2..0000000
--- a/libpostproc/postprocess_altivec_template.c
+++ /dev/null
@@ -1,1210 +0,0 @@
-/*
- * AltiVec optimizations (C) 2004 Romain Dolbeau <romain@dolbeau.org>
- *
- * based on code by Copyright (C) 2001-2003 Michael Niedermayer (michaelni@gmx.at)
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with FFmpeg; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#include "libavutil/avutil.h"
-
-#define ALTIVEC_TRANSPOSE_8x8_SHORT(src_a,src_b,src_c,src_d,src_e,src_f,src_g,src_h) \
- do { \
- __typeof__(src_a) tempA1, tempB1, tempC1, tempD1; \
- __typeof__(src_a) tempE1, tempF1, tempG1, tempH1; \
- __typeof__(src_a) tempA2, tempB2, tempC2, tempD2; \
- __typeof__(src_a) tempE2, tempF2, tempG2, tempH2; \
- tempA1 = vec_mergeh (src_a, src_e); \
- tempB1 = vec_mergel (src_a, src_e); \
- tempC1 = vec_mergeh (src_b, src_f); \
- tempD1 = vec_mergel (src_b, src_f); \
- tempE1 = vec_mergeh (src_c, src_g); \
- tempF1 = vec_mergel (src_c, src_g); \
- tempG1 = vec_mergeh (src_d, src_h); \
- tempH1 = vec_mergel (src_d, src_h); \
- tempA2 = vec_mergeh (tempA1, tempE1); \
- tempB2 = vec_mergel (tempA1, tempE1); \
- tempC2 = vec_mergeh (tempB1, tempF1); \
- tempD2 = vec_mergel (tempB1, tempF1); \
- tempE2 = vec_mergeh (tempC1, tempG1); \
- tempF2 = vec_mergel (tempC1, tempG1); \
- tempG2 = vec_mergeh (tempD1, tempH1); \
- tempH2 = vec_mergel (tempD1, tempH1); \
- src_a = vec_mergeh (tempA2, tempE2); \
- src_b = vec_mergel (tempA2, tempE2); \
- src_c = vec_mergeh (tempB2, tempF2); \
- src_d = vec_mergel (tempB2, tempF2); \
- src_e = vec_mergeh (tempC2, tempG2); \
- src_f = vec_mergel (tempC2, tempG2); \
- src_g = vec_mergeh (tempD2, tempH2); \
- src_h = vec_mergel (tempD2, tempH2); \
- } while (0)
-
-
-static inline int vertClassify_altivec(uint8_t src[], int stride, PPContext *c) {
- /*
- this code makes no assumption on src or stride.
- One could remove the recomputation of the perm
- vector by assuming (stride % 16) == 0, unfortunately
- this is not always true.
- */
- short data_0 = ((c->nonBQP*c->ppMode.baseDcDiff)>>8) + 1;
- DECLARE_ALIGNED(16, short, data)[8] =
- {
- data_0,
- data_0 * 2 + 1,
- c->QP * 2,
- c->QP * 4
- };
- int numEq;
- uint8_t *src2 = src;
- vector signed short v_dcOffset;
- vector signed short v2QP;
- vector unsigned short v4QP;
- vector unsigned short v_dcThreshold;
- const int properStride = (stride % 16);
- const int srcAlign = ((unsigned long)src2 % 16);
- const int two_vectors = ((srcAlign > 8) || properStride) ? 1 : 0;
- const vector signed int zero = vec_splat_s32(0);
- const vector signed short mask = vec_splat_s16(1);
- vector signed int v_numEq = vec_splat_s32(0);
- vector signed short v_data = vec_ld(0, data);
- vector signed short v_srcAss0, v_srcAss1, v_srcAss2, v_srcAss3,
- v_srcAss4, v_srcAss5, v_srcAss6, v_srcAss7;
-//FIXME avoid this mess if possible
- register int j0 = 0,
- j1 = stride,
- j2 = 2 * stride,
- j3 = 3 * stride,
- j4 = 4 * stride,
- j5 = 5 * stride,
- j6 = 6 * stride,
- j7 = 7 * stride;
- vector unsigned char v_srcA0, v_srcA1, v_srcA2, v_srcA3,
- v_srcA4, v_srcA5, v_srcA6, v_srcA7;
-
- v_dcOffset = vec_splat(v_data, 0);
- v_dcThreshold = (vector unsigned short)vec_splat(v_data, 1);
- v2QP = vec_splat(v_data, 2);
- v4QP = (vector unsigned short)vec_splat(v_data, 3);
-
- src2 += stride * 4;
-
-#define LOAD_LINE(i) \
- { \
- vector unsigned char perm##i = vec_lvsl(j##i, src2); \
- vector unsigned char v_srcA2##i; \
- vector unsigned char v_srcA1##i = vec_ld(j##i, src2); \
- if (two_vectors) \
- v_srcA2##i = vec_ld(j##i + 16, src2); \
- v_srcA##i = \
- vec_perm(v_srcA1##i, v_srcA2##i, perm##i); \
- v_srcAss##i = \
- (vector signed short)vec_mergeh((vector signed char)zero, \
- (vector signed char)v_srcA##i); }
-
-#define LOAD_LINE_ALIGNED(i) \
- v_srcA##i = vec_ld(j##i, src2); \
- v_srcAss##i = \
- (vector signed short)vec_mergeh((vector signed char)zero, \
- (vector signed char)v_srcA##i)
-
- /* Special-casing the aligned case is worthwhile, as all calls from
- * the (transposed) horizontable deblocks will be aligned, in addition
- * to the naturally aligned vertical deblocks. */
- if (properStride && srcAlign) {
- LOAD_LINE_ALIGNED(0);
- LOAD_LINE_ALIGNED(1);
- LOAD_LINE_ALIGNED(2);
- LOAD_LINE_ALIGNED(3);
- LOAD_LINE_ALIGNED(4);
- LOAD_LINE_ALIGNED(5);
- LOAD_LINE_ALIGNED(6);
- LOAD_LINE_ALIGNED(7);
- } else {
- LOAD_LINE(0);
- LOAD_LINE(1);
- LOAD_LINE(2);
- LOAD_LINE(3);
- LOAD_LINE(4);
- LOAD_LINE(5);
- LOAD_LINE(6);
- LOAD_LINE(7);
- }
-#undef LOAD_LINE
-#undef LOAD_LINE_ALIGNED
-
-#define ITER(i, j) \
- const vector signed short v_diff##i = \
- vec_sub(v_srcAss##i, v_srcAss##j); \
- const vector signed short v_sum##i = \
- vec_add(v_diff##i, v_dcOffset); \
- const vector signed short v_comp##i = \
- (vector signed short)vec_cmplt((vector unsigned short)v_sum##i, \
- v_dcThreshold); \
- const vector signed short v_part##i = vec_and(mask, v_comp##i);
-
- {
- ITER(0, 1)
- ITER(1, 2)
- ITER(2, 3)
- ITER(3, 4)
- ITER(4, 5)
- ITER(5, 6)
- ITER(6, 7)
-
- v_numEq = vec_sum4s(v_part0, v_numEq);
- v_numEq = vec_sum4s(v_part1, v_numEq);
- v_numEq = vec_sum4s(v_part2, v_numEq);
- v_numEq = vec_sum4s(v_part3, v_numEq);
- v_numEq = vec_sum4s(v_part4, v_numEq);
- v_numEq = vec_sum4s(v_part5, v_numEq);
- v_numEq = vec_sum4s(v_part6, v_numEq);
- }
-
-#undef ITER
-
- v_numEq = vec_sums(v_numEq, zero);
-
- v_numEq = vec_splat(v_numEq, 3);
- vec_ste(v_numEq, 0, &numEq);
-
- if (numEq > c->ppMode.flatnessThreshold){
- const vector unsigned char mmoP1 = (const vector unsigned char)
- {0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f,
- 0x00, 0x01, 0x12, 0x13, 0x08, 0x09, 0x1A, 0x1B};
- const vector unsigned char mmoP2 = (const vector unsigned char)
- {0x04, 0x05, 0x16, 0x17, 0x0C, 0x0D, 0x1E, 0x1F,
- 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f};
- const vector unsigned char mmoP = (const vector unsigned char)
- vec_lvsl(8, (unsigned char*)0);
-
- vector signed short mmoL1 = vec_perm(v_srcAss0, v_srcAss2, mmoP1);
- vector signed short mmoL2 = vec_perm(v_srcAss4, v_srcAss6, mmoP2);
- vector signed short mmoL = vec_perm(mmoL1, mmoL2, mmoP);
- vector signed short mmoR1 = vec_perm(v_srcAss5, v_srcAss7, mmoP1);
- vector signed short mmoR2 = vec_perm(v_srcAss1, v_srcAss3, mmoP2);
- vector signed short mmoR = vec_perm(mmoR1, mmoR2, mmoP);
- vector signed short mmoDiff = vec_sub(mmoL, mmoR);
- vector unsigned short mmoSum = (vector unsigned short)vec_add(mmoDiff, v2QP);
-
- if (vec_any_gt(mmoSum, v4QP))
- return 0;
- else
- return 1;
- }
- else return 2;
-}
-
-static inline void doVertLowPass_altivec(uint8_t *src, int stride, PPContext *c) {
- /*
- this code makes no assumption on src or stride.
- One could remove the recomputation of the perm
- vector by assuming (stride % 16) == 0, unfortunately
- this is not always true. Quite a lot of load/stores
- can be removed by assuming proper alignment of
- src & stride :-(
- */
- uint8_t *src2 = src;
- const vector signed int zero = vec_splat_s32(0);
- const int properStride = (stride % 16);
- const int srcAlign = ((unsigned long)src2 % 16);
- DECLARE_ALIGNED(16, short, qp)[8] = {c->QP};
- vector signed short vqp = vec_ld(0, qp);
- vector signed short vb0, vb1, vb2, vb3, vb4, vb5, vb6, vb7, vb8, vb9;
- vector unsigned char vbA0, av_uninit(vbA1), av_uninit(vbA2), av_uninit(vbA3), av_uninit(vbA4), av_uninit(vbA5), av_uninit(vbA6), av_uninit(vbA7), av_uninit(vbA8), vbA9;
- vector unsigned char vbB0, av_uninit(vbB1), av_uninit(vbB2), av_uninit(vbB3), av_uninit(vbB4), av_uninit(vbB5), av_uninit(vbB6), av_uninit(vbB7), av_uninit(vbB8), vbB9;
- vector unsigned char vbT0, vbT1, vbT2, vbT3, vbT4, vbT5, vbT6, vbT7, vbT8, vbT9;
- vector unsigned char perml0, perml1, perml2, perml3, perml4,
- perml5, perml6, perml7, perml8, perml9;
- register int j0 = 0,
- j1 = stride,
- j2 = 2 * stride,
- j3 = 3 * stride,
- j4 = 4 * stride,
- j5 = 5 * stride,
- j6 = 6 * stride,
- j7 = 7 * stride,
- j8 = 8 * stride,
- j9 = 9 * stride;
-
- vqp = vec_splat(vqp, 0);
-
- src2 += stride*3;
-
-#define LOAD_LINE(i) \
- perml##i = vec_lvsl(i * stride, src2); \
- vbA##i = vec_ld(i * stride, src2); \
- vbB##i = vec_ld(i * stride + 16, src2); \
- vbT##i = vec_perm(vbA##i, vbB##i, perml##i); \
- vb##i = \
- (vector signed short)vec_mergeh((vector unsigned char)zero, \
- (vector unsigned char)vbT##i)
-
-#define LOAD_LINE_ALIGNED(i) \
- vbT##i = vec_ld(j##i, src2); \
- vb##i = \
- (vector signed short)vec_mergeh((vector signed char)zero, \
- (vector signed char)vbT##i)
-
- /* Special-casing the aligned case is worthwhile, as all calls from
- * the (transposed) horizontable deblocks will be aligned, in addition
- * to the naturally aligned vertical deblocks. */
- if (properStride && srcAlign) {
- LOAD_LINE_ALIGNED(0);
- LOAD_LINE_ALIGNED(1);
- LOAD_LINE_ALIGNED(2);
- LOAD_LINE_ALIGNED(3);
- LOAD_LINE_ALIGNED(4);
- LOAD_LINE_ALIGNED(5);
- LOAD_LINE_ALIGNED(6);
- LOAD_LINE_ALIGNED(7);
- LOAD_LINE_ALIGNED(8);
- LOAD_LINE_ALIGNED(9);
- } else {
- LOAD_LINE(0);
- LOAD_LINE(1);
- LOAD_LINE(2);
- LOAD_LINE(3);
- LOAD_LINE(4);
- LOAD_LINE(5);
- LOAD_LINE(6);
- LOAD_LINE(7);
- LOAD_LINE(8);
- LOAD_LINE(9);
- }
-#undef LOAD_LINE
-#undef LOAD_LINE_ALIGNED
- {
- const vector unsigned short v_2 = vec_splat_u16(2);
- const vector unsigned short v_4 = vec_splat_u16(4);
-
- const vector signed short v_diff01 = vec_sub(vb0, vb1);
- const vector unsigned short v_cmp01 =
- (const vector unsigned short) vec_cmplt(vec_abs(v_diff01), vqp);
- const vector signed short v_first = vec_sel(vb1, vb0, v_cmp01);
- const vector signed short v_diff89 = vec_sub(vb8, vb9);
- const vector unsigned short v_cmp89 =
- (const vector unsigned short) vec_cmplt(vec_abs(v_diff89), vqp);
- const vector signed short v_last = vec_sel(vb8, vb9, v_cmp89);
-
- const vector signed short temp01 = vec_mladd(v_first, (vector signed short)v_4, vb1);
- const vector signed short temp02 = vec_add(vb2, vb3);
- const vector signed short temp03 = vec_add(temp01, (vector signed short)v_4);
- const vector signed short v_sumsB0 = vec_add(temp02, temp03);
-
- const vector signed short temp11 = vec_sub(v_sumsB0, v_first);
- const vector signed short v_sumsB1 = vec_add(temp11, vb4);
-
- const vector signed short temp21 = vec_sub(v_sumsB1, v_first);
- const vector signed short v_sumsB2 = vec_add(temp21, vb5);
-
- const vector signed short temp31 = vec_sub(v_sumsB2, v_first);
- const vector signed short v_sumsB3 = vec_add(temp31, vb6);
-
- const vector signed short temp41 = vec_sub(v_sumsB3, v_first);
- const vector signed short v_sumsB4 = vec_add(temp41, vb7);
-
- const vector signed short temp51 = vec_sub(v_sumsB4, vb1);
- const vector signed short v_sumsB5 = vec_add(temp51, vb8);
-
- const vector signed short temp61 = vec_sub(v_sumsB5, vb2);
- const vector signed short v_sumsB6 = vec_add(temp61, v_last);
-
- const vector signed short temp71 = vec_sub(v_sumsB6, vb3);
- const vector signed short v_sumsB7 = vec_add(temp71, v_last);
-
- const vector signed short temp81 = vec_sub(v_sumsB7, vb4);
- const vector signed short v_sumsB8 = vec_add(temp81, v_last);
-
- const vector signed short temp91 = vec_sub(v_sumsB8, vb5);
- const vector signed short v_sumsB9 = vec_add(temp91, v_last);
-
- #define COMPUTE_VR(i, j, k) \
- const vector signed short temps1##i = \
- vec_add(v_sumsB##i, v_sumsB##k); \
- const vector signed short temps2##i = \
- vec_mladd(vb##j, (vector signed short)v_2, temps1##i); \
- const vector signed short vr##j = vec_sra(temps2##i, v_4)
-
- COMPUTE_VR(0, 1, 2);
- COMPUTE_VR(1, 2, 3);
- COMPUTE_VR(2, 3, 4);
- COMPUTE_VR(3, 4, 5);
- COMPUTE_VR(4, 5, 6);
- COMPUTE_VR(5, 6, 7);
- COMPUTE_VR(6, 7, 8);
- COMPUTE_VR(7, 8, 9);
-
- const vector signed char neg1 = vec_splat_s8(-1);
- const vector unsigned char permHH = (const vector unsigned char){0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
- 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F};
-
-#define PACK_AND_STORE(i) \
-{ const vector unsigned char perms##i = \
- vec_lvsr(i * stride, src2); \
- const vector unsigned char vf##i = \
- vec_packsu(vr##i, (vector signed short)zero); \
- const vector unsigned char vg##i = \
- vec_perm(vf##i, vbT##i, permHH); \
- const vector unsigned char mask##i = \
- vec_perm((vector unsigned char)zero, (vector unsigned char)neg1, perms##i); \
- const vector unsigned char vg2##i = \
- vec_perm(vg##i, vg##i, perms##i); \
- const vector unsigned char svA##i = \
- vec_sel(vbA##i, vg2##i, mask##i); \
- const vector unsigned char svB##i = \
- vec_sel(vg2##i, vbB##i, mask##i); \
- vec_st(svA##i, i * stride, src2); \
- vec_st(svB##i, i * stride + 16, src2);}
-
-#define PACK_AND_STORE_ALIGNED(i) \
-{ const vector unsigned char vf##i = \
- vec_packsu(vr##i, (vector signed short)zero); \
- const vector unsigned char vg##i = \
- vec_perm(vf##i, vbT##i, permHH); \
- vec_st(vg##i, i * stride, src2);}
-
- /* Special-casing the aligned case is worthwhile, as all calls from
- * the (transposed) horizontable deblocks will be aligned, in addition
- * to the naturally aligned vertical deblocks. */
- if (properStride && srcAlign) {
- PACK_AND_STORE_ALIGNED(1)
- PACK_AND_STORE_ALIGNED(2)
- PACK_AND_STORE_ALIGNED(3)
- PACK_AND_STORE_ALIGNED(4)
- PACK_AND_STORE_ALIGNED(5)
- PACK_AND_STORE_ALIGNED(6)
- PACK_AND_STORE_ALIGNED(7)
- PACK_AND_STORE_ALIGNED(8)
- } else {
- PACK_AND_STORE(1)
- PACK_AND_STORE(2)
- PACK_AND_STORE(3)
- PACK_AND_STORE(4)
- PACK_AND_STORE(5)
- PACK_AND_STORE(6)
- PACK_AND_STORE(7)
- PACK_AND_STORE(8)
- }
- #undef PACK_AND_STORE
- #undef PACK_AND_STORE_ALIGNED
- }
-}
-
-
-
-static inline void doVertDefFilter_altivec(uint8_t src[], int stride, PPContext *c) {
- /*
- this code makes no assumption on src or stride.
- One could remove the recomputation of the perm
- vector by assuming (stride % 16) == 0, unfortunately
- this is not always true. Quite a lot of load/stores
- can be removed by assuming proper alignment of
- src & stride :-(
- */
- uint8_t *src2 = src + stride*3;
- const vector signed int zero = vec_splat_s32(0);
- DECLARE_ALIGNED(16, short, qp)[8] = {8*c->QP};
- vector signed short vqp = vec_splat(
- (vector signed short)vec_ld(0, qp), 0);
-
-#define LOAD_LINE(i) \
- const vector unsigned char perm##i = \
- vec_lvsl(i * stride, src2); \
- const vector unsigned char vbA##i = \
- vec_ld(i * stride, src2); \
- const vector unsigned char vbB##i = \
- vec_ld(i * stride + 16, src2); \
- const vector unsigned char vbT##i = \
- vec_perm(vbA##i, vbB##i, perm##i); \
- const vector signed short vb##i = \
- (vector signed short)vec_mergeh((vector unsigned char)zero, \
- (vector unsigned char)vbT##i)
-
- LOAD_LINE(1);
- LOAD_LINE(2);
- LOAD_LINE(3);
- LOAD_LINE(4);
- LOAD_LINE(5);
- LOAD_LINE(6);
- LOAD_LINE(7);
- LOAD_LINE(8);
-#undef LOAD_LINE
-
- const vector signed short v_1 = vec_splat_s16(1);
- const vector signed short v_2 = vec_splat_s16(2);
- const vector signed short v_5 = vec_splat_s16(5);
- const vector signed short v_32 = vec_sl(v_1,
- (vector unsigned short)v_5);
- /* middle energy */
- const vector signed short l3minusl6 = vec_sub(vb3, vb6);
- const vector signed short l5minusl4 = vec_sub(vb5, vb4);
- const vector signed short twotimes_l3minusl6 = vec_mladd(v_2, l3minusl6, (vector signed short)zero);
- const vector signed short mE = vec_mladd(v_5, l5minusl4, twotimes_l3minusl6);
- const vector signed short absmE = vec_abs(mE);
- /* left & right energy */
- const vector signed short l1minusl4 = vec_sub(vb1, vb4);
- const vector signed short l3minusl2 = vec_sub(vb3, vb2);
- const vector signed short l5minusl8 = vec_sub(vb5, vb8);
- const vector signed short l7minusl6 = vec_sub(vb7, vb6);
- const vector signed short twotimes_l1minusl4 = vec_mladd(v_2, l1minusl4, (vector signed short)zero);
- const vector signed short twotimes_l5minusl8 = vec_mladd(v_2, l5minusl8, (vector signed short)zero);
- const vector signed short lE = vec_mladd(v_5, l3minusl2, twotimes_l1minusl4);
- const vector signed short rE = vec_mladd(v_5, l7minusl6, twotimes_l5minusl8);
- /* d */
- const vector signed short ddiff = vec_sub(absmE,
- vec_min(vec_abs(lE),
- vec_abs(rE)));
- const vector signed short ddiffclamp = vec_max(ddiff, (vector signed short)zero);
- const vector signed short dtimes64 = vec_mladd(v_5, ddiffclamp, v_32);
- const vector signed short d = vec_sra(dtimes64, vec_splat_u16(6));
- const vector signed short minusd = vec_sub((vector signed short)zero, d);
- const vector signed short finald = vec_sel(minusd,
- d,
- vec_cmpgt(vec_sub((vector signed short)zero, mE),
- (vector signed short)zero));
- /* q */
- const vector signed short qtimes2 = vec_sub(vb4, vb5);
- /* for a shift right to behave like /2, we need to add one
- to all negative integer */
- const vector signed short rounddown = vec_sel((vector signed short)zero,
- v_1,
- vec_cmplt(qtimes2, (vector signed short)zero));
- const vector signed short q = vec_sra(vec_add(qtimes2, rounddown), vec_splat_u16(1));
- /* clamp */
- const vector signed short dclamp_P1 = vec_max((vector signed short)zero, finald);
- const vector signed short dclamp_P = vec_min(dclamp_P1, q);
- const vector signed short dclamp_N1 = vec_min((vector signed short)zero, finald);
- const vector signed short dclamp_N = vec_max(dclamp_N1, q);
-
- const vector signed short dclampedfinal = vec_sel(dclamp_N,
- dclamp_P,
- vec_cmpgt(q, (vector signed short)zero));
- const vector signed short dornotd = vec_sel((vector signed short)zero,
- dclampedfinal,
- vec_cmplt(absmE, vqp));
- /* add/subtract to l4 and l5 */
- const vector signed short vb4minusd = vec_sub(vb4, dornotd);
- const vector signed short vb5plusd = vec_add(vb5, dornotd);
- /* finally, stores */
- const vector unsigned char st4 = vec_packsu(vb4minusd, (vector signed short)zero);
- const vector unsigned char st5 = vec_packsu(vb5plusd, (vector signed short)zero);
-
- const vector signed char neg1 = vec_splat_s8(-1);
- const vector unsigned char permHH = (const vector unsigned char){0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
- 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F};
-
-#define STORE(i) \
-{ const vector unsigned char perms##i = \
- vec_lvsr(i * stride, src2); \
- const vector unsigned char vg##i = \
- vec_perm(st##i, vbT##i, permHH); \
- const vector unsigned char mask##i = \
- vec_perm((vector unsigned char)zero, (vector unsigned char)neg1, perms##i); \
- const vector unsigned char vg2##i = \
- vec_perm(vg##i, vg##i, perms##i); \
- const vector unsigned char svA##i = \
- vec_sel(vbA##i, vg2##i, mask##i); \
- const vector unsigned char svB##i = \
- vec_sel(vg2##i, vbB##i, mask##i); \
- vec_st(svA##i, i * stride, src2); \
- vec_st(svB##i, i * stride + 16, src2);}
-
- STORE(4)
- STORE(5)
-}
-
-static inline void dering_altivec(uint8_t src[], int stride, PPContext *c) {
- const vector signed int vsint32_8 = vec_splat_s32(8);
- const vector unsigned int vuint32_4 = vec_splat_u32(4);
- const vector signed char neg1 = vec_splat_s8(-1);
-
- const vector unsigned char permA1 = (vector unsigned char)
- {0x00, 0x01, 0x02, 0x10, 0x11, 0x12, 0x1F, 0x1F,
- 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F};
- const vector unsigned char permA2 = (vector unsigned char)
- {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x10, 0x11,
- 0x12, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F};
- const vector unsigned char permA1inc = (vector unsigned char)
- {0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
- const vector unsigned char permA2inc = (vector unsigned char)
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01,
- 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
- const vector unsigned char magic = (vector unsigned char)
- {0x01, 0x02, 0x01, 0x02, 0x04, 0x02, 0x01, 0x02,
- 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
- const vector unsigned char extractPerm = (vector unsigned char)
- {0x10, 0x10, 0x10, 0x01, 0x10, 0x10, 0x10, 0x01,
- 0x10, 0x10, 0x10, 0x01, 0x10, 0x10, 0x10, 0x01};
- const vector unsigned char extractPermInc = (vector unsigned char)
- {0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
- 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01};
- const vector unsigned char identity = vec_lvsl(0,(unsigned char *)0);
- const vector unsigned char tenRight = (vector unsigned char)
- {0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
- const vector unsigned char eightLeft = (vector unsigned char)
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08};
-
- /*
- this code makes no assumption on src or stride.
- One could remove the recomputation of the perm
- vector by assuming (stride % 16) == 0, unfortunately
- this is not always true. Quite a lot of load/stores
- can be removed by assuming proper alignment of
- src & stride :-(
- */
- uint8_t *srcCopy = src;
- DECLARE_ALIGNED(16, uint8_t, dt)[16] = { deringThreshold };
- const vector signed int zero = vec_splat_s32(0);
- vector unsigned char v_dt = vec_splat(vec_ld(0, dt), 0);
-
-#define LOAD_LINE(i) \
- const vector unsigned char perm##i = \
- vec_lvsl(i * stride, srcCopy); \
- vector unsigned char sA##i = vec_ld(i * stride, srcCopy); \
- vector unsigned char sB##i = vec_ld(i * stride + 16, srcCopy); \
- vector unsigned char src##i = vec_perm(sA##i, sB##i, perm##i)
-
- LOAD_LINE(0);
- LOAD_LINE(1);
- LOAD_LINE(2);
- LOAD_LINE(3);
- LOAD_LINE(4);
- LOAD_LINE(5);
- LOAD_LINE(6);
- LOAD_LINE(7);
- LOAD_LINE(8);
- LOAD_LINE(9);
-#undef LOAD_LINE
-
- vector unsigned char v_avg;
- DECLARE_ALIGNED(16, signed int, S)[8];
- DECLARE_ALIGNED(16, int, tQP2)[4] = { c->QP/2 + 1 };
- vector signed int vQP2 = vec_ld(0, tQP2);
- vQP2 = vec_splat(vQP2, 0);
-
- {
- const vector unsigned char trunc_perm = (vector unsigned char)
- {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
- 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
- const vector unsigned char trunc_src12 = vec_perm(src1, src2, trunc_perm);
- const vector unsigned char trunc_src34 = vec_perm(src3, src4, trunc_perm);
- const vector unsigned char trunc_src56 = vec_perm(src5, src6, trunc_perm);
- const vector unsigned char trunc_src78 = vec_perm(src7, src8, trunc_perm);
-
-#define EXTRACT(op) do { \
- const vector unsigned char s_1 = vec_##op(trunc_src12, trunc_src34); \
- const vector unsigned char s_2 = vec_##op(trunc_src56, trunc_src78); \
- const vector unsigned char s_6 = vec_##op(s_1, s_2); \
- const vector unsigned char s_8h = vec_mergeh(s_6, s_6); \
- const vector unsigned char s_8l = vec_mergel(s_6, s_6); \
- const vector unsigned char s_9 = vec_##op(s_8h, s_8l); \
- const vector unsigned char s_9h = vec_mergeh(s_9, s_9); \
- const vector unsigned char s_9l = vec_mergel(s_9, s_9); \
- const vector unsigned char s_10 = vec_##op(s_9h, s_9l); \
- const vector unsigned char s_10h = vec_mergeh(s_10, s_10); \
- const vector unsigned char s_10l = vec_mergel(s_10, s_10); \
- const vector unsigned char s_11 = vec_##op(s_10h, s_10l); \
- const vector unsigned char s_11h = vec_mergeh(s_11, s_11); \
- const vector unsigned char s_11l = vec_mergel(s_11, s_11); \
- v_##op = vec_##op(s_11h, s_11l); \
-} while (0)
-
- vector unsigned char v_min;
- vector unsigned char v_max;
- EXTRACT(min);
- EXTRACT(max);
-#undef EXTRACT
-
- if (vec_all_lt(vec_sub(v_max, v_min), v_dt))
- return;
-
- v_avg = vec_avg(v_min, v_max);
- }
-
- {
- const vector unsigned short mask1 = (vector unsigned short)
- {0x0001, 0x0002, 0x0004, 0x0008,
- 0x0010, 0x0020, 0x0040, 0x0080};
- const vector unsigned short mask2 = (vector unsigned short)
- {0x0100, 0x0200, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000};
-
- const vector unsigned int vuint32_16 = vec_sl(vec_splat_u32(1), vec_splat_u32(4));
- const vector unsigned int vuint32_1 = vec_splat_u32(1);
-
- vector signed int sumA2;
- vector signed int sumB2;
- vector signed int sum0, sum1, sum2, sum3, sum4;
- vector signed int sum5, sum6, sum7, sum8, sum9;
-
-#define COMPARE(i) \
- do { \
- const vector unsigned char cmp = \
- (vector unsigned char)vec_cmpgt(src##i, v_avg); \
- const vector unsigned short cmpHi = \
- (vector unsigned short)vec_mergeh(cmp, cmp); \
- const vector unsigned short cmpLi = \
- (vector unsigned short)vec_mergel(cmp, cmp); \
- const vector signed short cmpHf = \
- (vector signed short)vec_and(cmpHi, mask1); \
- const vector signed short cmpLf = \
- (vector signed short)vec_and(cmpLi, mask2); \
- const vector signed int sump = vec_sum4s(cmpHf, zero); \
- const vector signed int sumq = vec_sum4s(cmpLf, sump); \
- sum##i = vec_sums(sumq, zero); \
- } while (0)
-
- COMPARE(0);
- COMPARE(1);
- COMPARE(2);
- COMPARE(3);
- COMPARE(4);
- COMPARE(5);
- COMPARE(6);
- COMPARE(7);
- COMPARE(8);
- COMPARE(9);
-#undef COMPARE
-
- {
- const vector signed int sump02 = vec_mergel(sum0, sum2);
- const vector signed int sump13 = vec_mergel(sum1, sum3);
- const vector signed int sumA = vec_mergel(sump02, sump13);
-
- const vector signed int sump46 = vec_mergel(sum4, sum6);
- const vector signed int sump57 = vec_mergel(sum5, sum7);
- const vector signed int sumB = vec_mergel(sump46, sump57);
-
- const vector signed int sump8A = vec_mergel(sum8, zero);
- const vector signed int sump9B = vec_mergel(sum9, zero);
- const vector signed int sumC = vec_mergel(sump8A, sump9B);
-
- const vector signed int tA = vec_sl(vec_nor(zero, sumA), vuint32_16);
- const vector signed int tB = vec_sl(vec_nor(zero, sumB), vuint32_16);
- const vector signed int tC = vec_sl(vec_nor(zero, sumC), vuint32_16);
- const vector signed int t2A = vec_or(sumA, tA);
- const vector signed int t2B = vec_or(sumB, tB);
- const vector signed int t2C = vec_or(sumC, tC);
- const vector signed int t3A = vec_and(vec_sra(t2A, vuint32_1),
- vec_sl(t2A, vuint32_1));
- const vector signed int t3B = vec_and(vec_sra(t2B, vuint32_1),
- vec_sl(t2B, vuint32_1));
- const vector signed int t3C = vec_and(vec_sra(t2C, vuint32_1),
- vec_sl(t2C, vuint32_1));
- const vector signed int yA = vec_and(t2A, t3A);
- const vector signed int yB = vec_and(t2B, t3B);
- const vector signed int yC = vec_and(t2C, t3C);
-
- const vector unsigned char strangeperm1 = vec_lvsl(4, (unsigned char*)0);
- const vector unsigned char strangeperm2 = vec_lvsl(8, (unsigned char*)0);
- const vector signed int sumAd4 = vec_perm(yA, yB, strangeperm1);
- const vector signed int sumAd8 = vec_perm(yA, yB, strangeperm2);
- const vector signed int sumBd4 = vec_perm(yB, yC, strangeperm1);
- const vector signed int sumBd8 = vec_perm(yB, yC, strangeperm2);
- const vector signed int sumAp = vec_and(yA,
- vec_and(sumAd4,sumAd8));
- const vector signed int sumBp = vec_and(yB,
- vec_and(sumBd4,sumBd8));
- sumA2 = vec_or(sumAp,
- vec_sra(sumAp,
- vuint32_16));
- sumB2 = vec_or(sumBp,
- vec_sra(sumBp,
- vuint32_16));
- }
- vec_st(sumA2, 0, S);
- vec_st(sumB2, 16, S);
- }
-
- /* I'm not sure the following is actually faster
- than straight, unvectorized C code :-( */
-
-#define F_INIT() \
- vector unsigned char tenRightM = tenRight; \
- vector unsigned char permA1M = permA1; \
- vector unsigned char permA2M = permA2; \
- vector unsigned char extractPermM = extractPerm
-
-#define F2(i, j, k, l) \
- if (S[i] & (1 << (l+1))) { \
- const vector unsigned char a_A = vec_perm(src##i, src##j, permA1M); \
- const vector unsigned char a_B = vec_perm(a_A, src##k, permA2M); \
- const vector signed int a_sump = \
- (vector signed int)vec_msum(a_B, magic, (vector unsigned int)zero);\
- vector signed int F = vec_sr(vec_sums(a_sump, vsint32_8), vuint32_4); \
- const vector signed int p = \
- (vector signed int)vec_perm(src##j, (vector unsigned char)zero, \
- extractPermM); \
- const vector signed int sum = vec_add(p, vQP2); \
- const vector signed int diff = vec_sub(p, vQP2); \
- vector signed int newpm; \
- vector unsigned char newpm2, mask; \
- F = vec_splat(F, 3); \
- if (vec_all_lt(sum, F)) \
- newpm = sum; \
- else if (vec_all_gt(diff, F)) \
- newpm = diff; \
- else newpm = F; \
- newpm2 = vec_splat((vector unsigned char)newpm, 15); \
- mask = vec_add(identity, tenRightM); \
- src##j = vec_perm(src##j, newpm2, mask); \
- } \
- permA1M = vec_add(permA1M, permA1inc); \
- permA2M = vec_add(permA2M, permA2inc); \
- tenRightM = vec_sro(tenRightM, eightLeft); \
- extractPermM = vec_add(extractPermM, extractPermInc)
-
-#define ITER(i, j, k) do { \
- F_INIT(); \
- F2(i, j, k, 0); \
- F2(i, j, k, 1); \
- F2(i, j, k, 2); \
- F2(i, j, k, 3); \
- F2(i, j, k, 4); \
- F2(i, j, k, 5); \
- F2(i, j, k, 6); \
- F2(i, j, k, 7); \
-} while (0)
-
- ITER(0, 1, 2);
- ITER(1, 2, 3);
- ITER(2, 3, 4);
- ITER(3, 4, 5);
- ITER(4, 5, 6);
- ITER(5, 6, 7);
- ITER(6, 7, 8);
- ITER(7, 8, 9);
-
-#define STORE_LINE(i) do { \
- const vector unsigned char permST = \
- vec_lvsr(i * stride, srcCopy); \
- const vector unsigned char maskST = \
- vec_perm((vector unsigned char)zero, \
- (vector unsigned char)neg1, permST); \
- src##i = vec_perm(src##i ,src##i, permST); \
- sA##i= vec_sel(sA##i, src##i, maskST); \
- sB##i= vec_sel(src##i, sB##i, maskST); \
- vec_st(sA##i, i * stride, srcCopy); \
- vec_st(sB##i, i * stride + 16, srcCopy); \
-} while (0)
-
- STORE_LINE(1);
- STORE_LINE(2);
- STORE_LINE(3);
- STORE_LINE(4);
- STORE_LINE(5);
- STORE_LINE(6);
- STORE_LINE(7);
- STORE_LINE(8);
-
-#undef STORE_LINE
-#undef ITER
-#undef F2
-}
-
-#define doHorizLowPass_altivec(a...) doHorizLowPass_C(a)
-#define doHorizDefFilter_altivec(a...) doHorizDefFilter_C(a)
-#define do_a_deblock_altivec(a...) do_a_deblock_C(a)
-
-static inline void tempNoiseReducer_altivec(uint8_t *src, int stride,
- uint8_t *tempBlurred, uint32_t *tempBlurredPast, int *maxNoise)
-{
- const vector signed char neg1 = vec_splat_s8(-1);
- const vector unsigned char permHH = (const vector unsigned char){0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
- 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F};
-
- const vector signed int zero = vec_splat_s32(0);
- const vector signed short vsint16_1 = vec_splat_s16(1);
- vector signed int v_dp = zero;
- vector signed int v_sysdp = zero;
- int d, sysd, i;
-
-#define LOAD_LINE(src, i) \
- register int j##src##i = i * stride; \
- vector unsigned char perm##src##i = vec_lvsl(j##src##i, src); \
- const vector unsigned char v_##src##A1##i = vec_ld(j##src##i, src); \
- const vector unsigned char v_##src##A2##i = vec_ld(j##src##i + 16, src); \
- const vector unsigned char v_##src##A##i = \
- vec_perm(v_##src##A1##i, v_##src##A2##i, perm##src##i); \
- vector signed short v_##src##Ass##i = \
- (vector signed short)vec_mergeh((vector signed char)zero, \
- (vector signed char)v_##src##A##i)
-
- LOAD_LINE(src, 0);
- LOAD_LINE(src, 1);
- LOAD_LINE(src, 2);
- LOAD_LINE(src, 3);
- LOAD_LINE(src, 4);
- LOAD_LINE(src, 5);
- LOAD_LINE(src, 6);
- LOAD_LINE(src, 7);
-
- LOAD_LINE(tempBlurred, 0);
- LOAD_LINE(tempBlurred, 1);
- LOAD_LINE(tempBlurred, 2);
- LOAD_LINE(tempBlurred, 3);
- LOAD_LINE(tempBlurred, 4);
- LOAD_LINE(tempBlurred, 5);
- LOAD_LINE(tempBlurred, 6);
- LOAD_LINE(tempBlurred, 7);
-#undef LOAD_LINE
-
-#define ACCUMULATE_DIFFS(i) do { \
- vector signed short v_d = vec_sub(v_tempBlurredAss##i, \
- v_srcAss##i); \
- v_dp = vec_msums(v_d, v_d, v_dp); \
- v_sysdp = vec_msums(v_d, vsint16_1, v_sysdp); \
- } while (0)
-
- ACCUMULATE_DIFFS(0);
- ACCUMULATE_DIFFS(1);
- ACCUMULATE_DIFFS(2);
- ACCUMULATE_DIFFS(3);
- ACCUMULATE_DIFFS(4);
- ACCUMULATE_DIFFS(5);
- ACCUMULATE_DIFFS(6);
- ACCUMULATE_DIFFS(7);
-#undef ACCUMULATE_DIFFS
-
- tempBlurredPast[127]= maxNoise[0];
- tempBlurredPast[128]= maxNoise[1];
- tempBlurredPast[129]= maxNoise[2];
-
- v_dp = vec_sums(v_dp, zero);
- v_sysdp = vec_sums(v_sysdp, zero);
-
- v_dp = vec_splat(v_dp, 3);
- v_sysdp = vec_splat(v_sysdp, 3);
-
- vec_ste(v_dp, 0, &d);
- vec_ste(v_sysdp, 0, &sysd);
-
- i = d;
- d = (4*d
- +(*(tempBlurredPast-256))
- +(*(tempBlurredPast-1))+ (*(tempBlurredPast+1))
- +(*(tempBlurredPast+256))
- +4)>>3;
-
- *tempBlurredPast=i;
-
- if (d > maxNoise[1]) {
- if (d < maxNoise[2]) {
-#define OP(i) v_tempBlurredAss##i = vec_avg(v_tempBlurredAss##i, v_srcAss##i);
-
- OP(0);
- OP(1);
- OP(2);
- OP(3);
- OP(4);
- OP(5);
- OP(6);
- OP(7);
-#undef OP
- } else {
-#define OP(i) v_tempBlurredAss##i = v_srcAss##i;
-
- OP(0);
- OP(1);
- OP(2);
- OP(3);
- OP(4);
- OP(5);
- OP(6);
- OP(7);
-#undef OP
- }
- } else {
- if (d < maxNoise[0]) {
- const vector signed short vsint16_7 = vec_splat_s16(7);
- const vector signed short vsint16_4 = vec_splat_s16(4);
- const vector unsigned short vuint16_3 = vec_splat_u16(3);
-
-#define OP(i) do { \
- const vector signed short v_temp = \
- vec_mladd(v_tempBlurredAss##i, vsint16_7, v_srcAss##i); \
- const vector signed short v_temp2 = vec_add(v_temp, vsint16_4); \
- v_tempBlurredAss##i = vec_sr(v_temp2, vuint16_3); \
- } while (0)
-
- OP(0);
- OP(1);
- OP(2);
- OP(3);
- OP(4);
- OP(5);
- OP(6);
- OP(7);
-#undef OP
- } else {
- const vector signed short vsint16_3 = vec_splat_s16(3);
- const vector signed short vsint16_2 = vec_splat_s16(2);
-
-#define OP(i) do { \
- const vector signed short v_temp = \
- vec_mladd(v_tempBlurredAss##i, vsint16_3, v_srcAss##i); \
- const vector signed short v_temp2 = vec_add(v_temp, vsint16_2); \
- v_tempBlurredAss##i = \
- vec_sr(v_temp2, (vector unsigned short)vsint16_2); \
- } while (0)
-
- OP(0);
- OP(1);
- OP(2);
- OP(3);
- OP(4);
- OP(5);
- OP(6);
- OP(7);
-#undef OP
- }
- }
-
-#define PACK_AND_STORE(src, i) do { \
- const vector unsigned char perms = vec_lvsr(i * stride, src); \
- const vector unsigned char vf = \
- vec_packsu(v_tempBlurredAss##1, (vector signed short)zero); \
- const vector unsigned char vg = vec_perm(vf, v_##src##A##i, permHH); \
- const vector unsigned char mask = \
- vec_perm((vector unsigned char)zero, (vector unsigned char)neg1, perms); \
- const vector unsigned char vg2 = vec_perm(vg, vg, perms); \
- const vector unsigned char svA = vec_sel(v_##src##A1##i, vg2, mask); \
- const vector unsigned char svB = vec_sel(vg2, v_##src##A2##i, mask); \
- vec_st(svA, i * stride, src); \
- vec_st(svB, i * stride + 16, src); \
-} while (0)
-
- PACK_AND_STORE(src, 0);
- PACK_AND_STORE(src, 1);
- PACK_AND_STORE(src, 2);
- PACK_AND_STORE(src, 3);
- PACK_AND_STORE(src, 4);
- PACK_AND_STORE(src, 5);
- PACK_AND_STORE(src, 6);
- PACK_AND_STORE(src, 7);
- PACK_AND_STORE(tempBlurred, 0);
- PACK_AND_STORE(tempBlurred, 1);
- PACK_AND_STORE(tempBlurred, 2);
- PACK_AND_STORE(tempBlurred, 3);
- PACK_AND_STORE(tempBlurred, 4);
- PACK_AND_STORE(tempBlurred, 5);
- PACK_AND_STORE(tempBlurred, 6);
- PACK_AND_STORE(tempBlurred, 7);
-#undef PACK_AND_STORE
-}
-
-static inline void transpose_16x8_char_toPackedAlign_altivec(unsigned char* dst, unsigned char* src, int stride) {
- const vector unsigned char zero = vec_splat_u8(0);
-
-#define LOAD_DOUBLE_LINE(i, j) \
- vector unsigned char perm1##i = vec_lvsl(i * stride, src); \
- vector unsigned char perm2##i = vec_lvsl(j * stride, src); \
- vector unsigned char srcA##i = vec_ld(i * stride, src); \
- vector unsigned char srcB##i = vec_ld(i * stride + 16, src); \
- vector unsigned char srcC##i = vec_ld(j * stride, src); \
- vector unsigned char srcD##i = vec_ld(j * stride+ 16, src); \
- vector unsigned char src##i = vec_perm(srcA##i, srcB##i, perm1##i); \
- vector unsigned char src##j = vec_perm(srcC##i, srcD##i, perm2##i)
-
- LOAD_DOUBLE_LINE(0, 1);
- LOAD_DOUBLE_LINE(2, 3);
- LOAD_DOUBLE_LINE(4, 5);
- LOAD_DOUBLE_LINE(6, 7);
-#undef LOAD_DOUBLE_LINE
-
- vector unsigned char tempA = vec_mergeh(src0, zero);
- vector unsigned char tempB = vec_mergel(src0, zero);
- vector unsigned char tempC = vec_mergeh(src1, zero);
- vector unsigned char tempD = vec_mergel(src1, zero);
- vector unsigned char tempE = vec_mergeh(src2, zero);
- vector unsigned char tempF = vec_mergel(src2, zero);
- vector unsigned char tempG = vec_mergeh(src3, zero);
- vector unsigned char tempH = vec_mergel(src3, zero);
- vector unsigned char tempI = vec_mergeh(src4, zero);
- vector unsigned char tempJ = vec_mergel(src4, zero);
- vector unsigned char tempK = vec_mergeh(src5, zero);
- vector unsigned char tempL = vec_mergel(src5, zero);
- vector unsigned char tempM = vec_mergeh(src6, zero);
- vector unsigned char tempN = vec_mergel(src6, zero);
- vector unsigned char tempO = vec_mergeh(src7, zero);
- vector unsigned char tempP = vec_mergel(src7, zero);
-
- vector unsigned char temp0 = vec_mergeh(tempA, tempI);
- vector unsigned char temp1 = vec_mergel(tempA, tempI);
- vector unsigned char temp2 = vec_mergeh(tempB, tempJ);
- vector unsigned char temp3 = vec_mergel(tempB, tempJ);
- vector unsigned char temp4 = vec_mergeh(tempC, tempK);
- vector unsigned char temp5 = vec_mergel(tempC, tempK);
- vector unsigned char temp6 = vec_mergeh(tempD, tempL);
- vector unsigned char temp7 = vec_mergel(tempD, tempL);
- vector unsigned char temp8 = vec_mergeh(tempE, tempM);
- vector unsigned char temp9 = vec_mergel(tempE, tempM);
- vector unsigned char temp10 = vec_mergeh(tempF, tempN);
- vector unsigned char temp11 = vec_mergel(tempF, tempN);
- vector unsigned char temp12 = vec_mergeh(tempG, tempO);
- vector unsigned char temp13 = vec_mergel(tempG, tempO);
- vector unsigned char temp14 = vec_mergeh(tempH, tempP);
- vector unsigned char temp15 = vec_mergel(tempH, tempP);
-
- tempA = vec_mergeh(temp0, temp8);
- tempB = vec_mergel(temp0, temp8);
- tempC = vec_mergeh(temp1, temp9);
- tempD = vec_mergel(temp1, temp9);
- tempE = vec_mergeh(temp2, temp10);
- tempF = vec_mergel(temp2, temp10);
- tempG = vec_mergeh(temp3, temp11);
- tempH = vec_mergel(temp3, temp11);
- tempI = vec_mergeh(temp4, temp12);
- tempJ = vec_mergel(temp4, temp12);
- tempK = vec_mergeh(temp5, temp13);
- tempL = vec_mergel(temp5, temp13);
- tempM = vec_mergeh(temp6, temp14);
- tempN = vec_mergel(temp6, temp14);
- tempO = vec_mergeh(temp7, temp15);
- tempP = vec_mergel(temp7, temp15);
-
- temp0 = vec_mergeh(tempA, tempI);
- temp1 = vec_mergel(tempA, tempI);
- temp2 = vec_mergeh(tempB, tempJ);
- temp3 = vec_mergel(tempB, tempJ);
- temp4 = vec_mergeh(tempC, tempK);
- temp5 = vec_mergel(tempC, tempK);
- temp6 = vec_mergeh(tempD, tempL);
- temp7 = vec_mergel(tempD, tempL);
- temp8 = vec_mergeh(tempE, tempM);
- temp9 = vec_mergel(tempE, tempM);
- temp10 = vec_mergeh(tempF, tempN);
- temp11 = vec_mergel(tempF, tempN);
- temp12 = vec_mergeh(tempG, tempO);
- temp13 = vec_mergel(tempG, tempO);
- temp14 = vec_mergeh(tempH, tempP);
- temp15 = vec_mergel(tempH, tempP);
-
- vec_st(temp0, 0, dst);
- vec_st(temp1, 16, dst);
- vec_st(temp2, 32, dst);
- vec_st(temp3, 48, dst);
- vec_st(temp4, 64, dst);
- vec_st(temp5, 80, dst);
- vec_st(temp6, 96, dst);
- vec_st(temp7, 112, dst);
- vec_st(temp8, 128, dst);
- vec_st(temp9, 144, dst);
- vec_st(temp10, 160, dst);
- vec_st(temp11, 176, dst);
- vec_st(temp12, 192, dst);
- vec_st(temp13, 208, dst);
- vec_st(temp14, 224, dst);
- vec_st(temp15, 240, dst);
-}
-
-static inline void transpose_8x16_char_fromPackedAlign_altivec(unsigned char* dst, unsigned char* src, int stride) {
- const vector unsigned char zero = vec_splat_u8(0);
- const vector signed char neg1 = vec_splat_s8(-1);
-
-#define LOAD_DOUBLE_LINE(i, j) \
- vector unsigned char src##i = vec_ld(i * 16, src); \
- vector unsigned char src##j = vec_ld(j * 16, src)
-
- LOAD_DOUBLE_LINE(0, 1);
- LOAD_DOUBLE_LINE(2, 3);
- LOAD_DOUBLE_LINE(4, 5);
- LOAD_DOUBLE_LINE(6, 7);
- LOAD_DOUBLE_LINE(8, 9);
- LOAD_DOUBLE_LINE(10, 11);
- LOAD_DOUBLE_LINE(12, 13);
- LOAD_DOUBLE_LINE(14, 15);
-#undef LOAD_DOUBLE_LINE
-
- vector unsigned char tempA = vec_mergeh(src0, src8);
- vector unsigned char tempB;
- vector unsigned char tempC = vec_mergeh(src1, src9);
- vector unsigned char tempD;
- vector unsigned char tempE = vec_mergeh(src2, src10);
- vector unsigned char tempG = vec_mergeh(src3, src11);
- vector unsigned char tempI = vec_mergeh(src4, src12);
- vector unsigned char tempJ;
- vector unsigned char tempK = vec_mergeh(src5, src13);
- vector unsigned char tempL;
- vector unsigned char tempM = vec_mergeh(src6, src14);
- vector unsigned char tempO = vec_mergeh(src7, src15);
-
- vector unsigned char temp0 = vec_mergeh(tempA, tempI);
- vector unsigned char temp1 = vec_mergel(tempA, tempI);
- vector unsigned char temp2;
- vector unsigned char temp3;
- vector unsigned char temp4 = vec_mergeh(tempC, tempK);
- vector unsigned char temp5 = vec_mergel(tempC, tempK);
- vector unsigned char temp6;
- vector unsigned char temp7;
- vector unsigned char temp8 = vec_mergeh(tempE, tempM);
- vector unsigned char temp9 = vec_mergel(tempE, tempM);
- vector unsigned char temp12 = vec_mergeh(tempG, tempO);
- vector unsigned char temp13 = vec_mergel(tempG, tempO);
-
- tempA = vec_mergeh(temp0, temp8);
- tempB = vec_mergel(temp0, temp8);
- tempC = vec_mergeh(temp1, temp9);
- tempD = vec_mergel(temp1, temp9);
- tempI = vec_mergeh(temp4, temp12);
- tempJ = vec_mergel(temp4, temp12);
- tempK = vec_mergeh(temp5, temp13);
- tempL = vec_mergel(temp5, temp13);
-
- temp0 = vec_mergeh(tempA, tempI);
- temp1 = vec_mergel(tempA, tempI);
- temp2 = vec_mergeh(tempB, tempJ);
- temp3 = vec_mergel(tempB, tempJ);
- temp4 = vec_mergeh(tempC, tempK);
- temp5 = vec_mergel(tempC, tempK);
- temp6 = vec_mergeh(tempD, tempL);
- temp7 = vec_mergel(tempD, tempL);
-
-
-#define STORE_DOUBLE_LINE(i, j) do { \
- vector unsigned char dstAi = vec_ld(i * stride, dst); \
- vector unsigned char dstBi = vec_ld(i * stride + 16, dst); \
- vector unsigned char dstAj = vec_ld(j * stride, dst); \
- vector unsigned char dstBj = vec_ld(j * stride+ 16, dst); \
- vector unsigned char aligni = vec_lvsr(i * stride, dst); \
- vector unsigned char alignj = vec_lvsr(j * stride, dst); \
- vector unsigned char maski = \
- vec_perm(zero, (vector unsigned char)neg1, aligni); \
- vector unsigned char maskj = \
- vec_perm(zero, (vector unsigned char)neg1, alignj); \
- vector unsigned char dstRi = vec_perm(temp##i, temp##i, aligni); \
- vector unsigned char dstRj = vec_perm(temp##j, temp##j, alignj); \
- vector unsigned char dstAFi = vec_sel(dstAi, dstRi, maski); \
- vector unsigned char dstBFi = vec_sel(dstRi, dstBi, maski); \
- vector unsigned char dstAFj = vec_sel(dstAj, dstRj, maskj); \
- vector unsigned char dstBFj = vec_sel(dstRj, dstBj, maskj); \
- vec_st(dstAFi, i * stride, dst); \
- vec_st(dstBFi, i * stride + 16, dst); \
- vec_st(dstAFj, j * stride, dst); \
- vec_st(dstBFj, j * stride + 16, dst); \
-} while (0)
-
- STORE_DOUBLE_LINE(0,1);
- STORE_DOUBLE_LINE(2,3);
- STORE_DOUBLE_LINE(4,5);
- STORE_DOUBLE_LINE(6,7);
-}
diff --git a/libpostproc/postprocess_internal.h b/libpostproc/postprocess_internal.h
deleted file mode 100644
index 765fdeb..0000000
--- a/libpostproc/postprocess_internal.h
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Copyright (C) 2001-2002 Michael Niedermayer (michaelni@gmx.at)
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with FFmpeg; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-/**
- * @file
- * internal API header.
- */
-
-#ifndef POSTPROC_POSTPROCESS_INTERNAL_H
-#define POSTPROC_POSTPROCESS_INTERNAL_H
-
-#include <string.h>
-#include "libavutil/avutil.h"
-#include "libavutil/intmath.h"
-#include "libavutil/log.h"
-#include "postprocess.h"
-
-#define V_DEBLOCK 0x01
-#define H_DEBLOCK 0x02
-#define DERING 0x04
-#define LEVEL_FIX 0x08 ///< Brightness & Contrast
-
-#define LUM_V_DEBLOCK V_DEBLOCK // 1
-#define LUM_H_DEBLOCK H_DEBLOCK // 2
-#define CHROM_V_DEBLOCK (V_DEBLOCK<<4) // 16
-#define CHROM_H_DEBLOCK (H_DEBLOCK<<4) // 32
-#define LUM_DERING DERING // 4
-#define CHROM_DERING (DERING<<4) // 64
-#define LUM_LEVEL_FIX LEVEL_FIX // 8
-#define CHROM_LEVEL_FIX (LEVEL_FIX<<4) // 128 (not implemented yet)
-
-// Experimental vertical filters
-#define V_X1_FILTER 0x0200 // 512
-#define V_A_DEBLOCK 0x0400
-
-// Experimental horizontal filters
-#define H_X1_FILTER 0x2000 // 8192
-#define H_A_DEBLOCK 0x4000
-
-/// select between full y range (255-0) or standard one (234-16)
-#define FULL_Y_RANGE 0x8000 // 32768
-
-//Deinterlacing Filters
-#define LINEAR_IPOL_DEINT_FILTER 0x10000 // 65536
-#define LINEAR_BLEND_DEINT_FILTER 0x20000 // 131072
-#define CUBIC_BLEND_DEINT_FILTER 0x8000 // (not implemented yet)
-#define CUBIC_IPOL_DEINT_FILTER 0x40000 // 262144
-#define MEDIAN_DEINT_FILTER 0x80000 // 524288
-#define FFMPEG_DEINT_FILTER 0x400000
-#define LOWPASS5_DEINT_FILTER 0x800000
-
-#define TEMP_NOISE_FILTER 0x100000
-#define FORCE_QUANT 0x200000
-#define BITEXACT 0x1000000
-#define VISUALIZE 0x2000000
-
-//use if you want a faster postprocessing code
-//cannot differentiate between chroma & luma filters (both on or both off)
-//obviously the -pp option on the command line has no effect except turning the here selected
-//filters on
-//#define COMPILE_TIME_MODE 0x77
-
-/**
- * Postprocessing filter.
- */
-struct PPFilter{
- const char *shortName;
- const char *longName;
- int chromDefault; ///< is chrominance filtering on by default if this filter is manually activated
- int minLumQuality; ///< minimum quality to turn luminance filtering on
- int minChromQuality; ///< minimum quality to turn chrominance filtering on
- int mask; ///< Bitmask to turn this filter on
-};
-
-/**
- * Postprocessing mode.
- */
-typedef struct PPMode{
- int lumMode; ///< activates filters for luminance
- int chromMode; ///< activates filters for chrominance
- int error; ///< non zero on error
-
- int minAllowedY; ///< for brightness correction
- int maxAllowedY; ///< for brightness correction
- AVRational maxClippedThreshold; ///< amount of "black" you are willing to lose to get a brightness-corrected picture
-
- int maxTmpNoise[3]; ///< for Temporal Noise Reducing filter (Maximal sum of abs differences)
-
- int baseDcDiff;
- int flatnessThreshold;
-
- int forcedQuant; ///< quantizer if FORCE_QUANT is used
-} PPMode;
-
-/**
- * postprocess context.
- */
-typedef struct PPContext{
- /**
- * info on struct for av_log
- */
- const AVClass *av_class;
-
- uint8_t *tempBlocks; ///<used for the horizontal code
-
- /**
- * luma histogram.
- * we need 64bit here otherwise we'll going to have a problem
- * after watching a black picture for 5 hours
- */
- uint64_t *yHistogram;
-
- DECLARE_ALIGNED(8, uint64_t, packedYOffset);
- DECLARE_ALIGNED(8, uint64_t, packedYScale);
-
- /** Temporal noise reducing buffers */
- uint8_t *tempBlurred[3];
- int32_t *tempBlurredPast[3];
-
- /** Temporary buffers for handling the last row(s) */
- uint8_t *tempDst;
- uint8_t *tempSrc;
-
- uint8_t *deintTemp;
-
- DECLARE_ALIGNED(8, uint64_t, pQPb);
- DECLARE_ALIGNED(8, uint64_t, pQPb2);
-
- DECLARE_ALIGNED(32, uint64_t, pQPb_block)[4];
- DECLARE_ALIGNED(32, uint64_t, pQPb2_block)[4];
-
- DECLARE_ALIGNED(32, uint64_t, mmxDcOffset)[64];
- DECLARE_ALIGNED(32, uint64_t, mmxDcThreshold)[64];
-
- int8_t *stdQPTable; ///< used to fix MPEG2 style qscale
- int8_t *nonBQPTable;
- int8_t *forcedQPTable;
-
- int QP;
- int nonBQP;
-
- DECLARE_ALIGNED(32, int, QP_block)[4];
- DECLARE_ALIGNED(32, int, nonBQP_block)[4];
-
- int frameNum;
-
- int cpuCaps;
-
- int qpStride; ///<size of qp buffers (needed to realloc them if needed)
- int stride; ///<size of some buffers (needed to realloc them if needed)
-
- int hChromaSubSample;
- int vChromaSubSample;
-
- PPMode ppMode;
-} PPContext;
-
-
-static inline void linecpy(void *dest, const void *src, int lines, int stride) {
- if (stride > 0) {
- memcpy(dest, src, lines*stride);
- } else {
- memcpy((uint8_t*)dest+(lines-1)*stride, (const uint8_t*)src+(lines-1)*stride, -lines*stride);
- }
-}
-
-#endif /* POSTPROC_POSTPROCESS_INTERNAL_H */
diff --git a/libpostproc/postprocess_template.c b/libpostproc/postprocess_template.c
deleted file mode 100644
index df1684d..0000000
--- a/libpostproc/postprocess_template.c
+++ /dev/null
@@ -1,3740 +0,0 @@
-/*
- * Copyright (C) 2001-2002 Michael Niedermayer (michaelni@gmx.at)
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with FFmpeg; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-/**
- * @file
- * mmx/mmx2/3dnow postprocess code.
- */
-
-#include "libavutil/x86/asm.h"
-
-/* A single TEMPLATE_PP_* should be defined (to 1) when this template is
- * included. The following macros will define its dependencies to 1 as well
- * (like MMX2 depending on MMX), and will define to 0 all the others. Every
- * TEMPLATE_PP_* need to be undef at the end. */
-
-#ifdef TEMPLATE_PP_C
-# define RENAME(a) a ## _C
-#else
-# define TEMPLATE_PP_C 0
-#endif
-
-#ifdef TEMPLATE_PP_ALTIVEC
-# define RENAME(a) a ## _altivec
-#else
-# define TEMPLATE_PP_ALTIVEC 0
-#endif
-
-#ifdef TEMPLATE_PP_MMX
-# define RENAME(a) a ## _MMX
-#else
-# define TEMPLATE_PP_MMX 0
-#endif
-
-#ifdef TEMPLATE_PP_MMXEXT
-# undef TEMPLATE_PP_MMX
-# define TEMPLATE_PP_MMX 1
-# define RENAME(a) a ## _MMX2
-#else
-# define TEMPLATE_PP_MMXEXT 0
-#endif
-
-#ifdef TEMPLATE_PP_3DNOW
-# undef TEMPLATE_PP_MMX
-# define TEMPLATE_PP_MMX 1
-# define RENAME(a) a ## _3DNow
-#else
-# define TEMPLATE_PP_3DNOW 0
-#endif
-
-#ifdef TEMPLATE_PP_SSE2
-# undef TEMPLATE_PP_MMX
-# define TEMPLATE_PP_MMX 1
-# undef TEMPLATE_PP_MMXEXT
-# define TEMPLATE_PP_MMXEXT 1
-# define RENAME(a) a ## _SSE2
-#else
-# define TEMPLATE_PP_SSE2 0
-#endif
-
-#undef REAL_PAVGB
-#undef PAVGB
-#undef PMINUB
-#undef PMAXUB
-
-#if TEMPLATE_PP_MMXEXT
-#define REAL_PAVGB(a,b) "pavgb " #a ", " #b " \n\t"
-#elif TEMPLATE_PP_3DNOW
-#define REAL_PAVGB(a,b) "pavgusb " #a ", " #b " \n\t"
-#endif
-#define PAVGB(a,b) REAL_PAVGB(a,b)
-
-#if TEMPLATE_PP_MMXEXT
-#define PMINUB(a,b,t) "pminub " #a ", " #b " \n\t"
-#elif TEMPLATE_PP_MMX
-#define PMINUB(b,a,t) \
- "movq " #a ", " #t " \n\t"\
- "psubusb " #b ", " #t " \n\t"\
- "psubb " #t ", " #a " \n\t"
-#endif
-
-#if TEMPLATE_PP_MMXEXT
-#define PMAXUB(a,b) "pmaxub " #a ", " #b " \n\t"
-#elif TEMPLATE_PP_MMX
-#define PMAXUB(a,b) \
- "psubusb " #a ", " #b " \n\t"\
- "paddb " #a ", " #b " \n\t"
-#endif
-
-//FIXME? |255-0| = 1 (should not be a problem ...)
-#if TEMPLATE_PP_MMX
-/**
- * Check if the middle 8x8 Block in the given 8x16 block is flat
- */
-static inline int RENAME(vertClassify)(const uint8_t src[], int stride, PPContext *c){
- int numEq= 0, dcOk;
- src+= stride*4; // src points to begin of the 8x8 Block
- __asm__ volatile(
- "movq %0, %%mm7 \n\t"
- "movq %1, %%mm6 \n\t"
- : : "m" (c->mmxDcOffset[c->nonBQP]), "m" (c->mmxDcThreshold[c->nonBQP])
- );
-
- __asm__ volatile(
- "lea (%2, %3), %%"FF_REG_a" \n\t"
-// 0 1 2 3 4 5 6 7 8 9
-// %1 eax eax+%2 eax+2%2 %1+4%2 ecx ecx+%2 ecx+2%2 %1+8%2 ecx+4%2
-
- "movq (%2), %%mm0 \n\t"
- "movq (%%"FF_REG_a"), %%mm1 \n\t"
- "movq %%mm0, %%mm3 \n\t"
- "movq %%mm0, %%mm4 \n\t"
- PMAXUB(%%mm1, %%mm4)
- PMINUB(%%mm1, %%mm3, %%mm5)
- "psubb %%mm1, %%mm0 \n\t" // mm0 = difference
- "paddb %%mm7, %%mm0 \n\t"
- "pcmpgtb %%mm6, %%mm0 \n\t"
-
- "movq (%%"FF_REG_a",%3), %%mm2 \n\t"
- PMAXUB(%%mm2, %%mm4)
- PMINUB(%%mm2, %%mm3, %%mm5)
- "psubb %%mm2, %%mm1 \n\t"
- "paddb %%mm7, %%mm1 \n\t"
- "pcmpgtb %%mm6, %%mm1 \n\t"
- "paddb %%mm1, %%mm0 \n\t"
-
- "movq (%%"FF_REG_a", %3, 2), %%mm1 \n\t"
- PMAXUB(%%mm1, %%mm4)
- PMINUB(%%mm1, %%mm3, %%mm5)
- "psubb %%mm1, %%mm2 \n\t"
- "paddb %%mm7, %%mm2 \n\t"
- "pcmpgtb %%mm6, %%mm2 \n\t"
- "paddb %%mm2, %%mm0 \n\t"
-
- "lea (%%"FF_REG_a", %3, 4), %%"FF_REG_a"\n\t"
-
- "movq (%2, %3, 4), %%mm2 \n\t"
- PMAXUB(%%mm2, %%mm4)
- PMINUB(%%mm2, %%mm3, %%mm5)
- "psubb %%mm2, %%mm1 \n\t"
- "paddb %%mm7, %%mm1 \n\t"
- "pcmpgtb %%mm6, %%mm1 \n\t"
- "paddb %%mm1, %%mm0 \n\t"
-
- "movq (%%"FF_REG_a"), %%mm1 \n\t"
- PMAXUB(%%mm1, %%mm4)
- PMINUB(%%mm1, %%mm3, %%mm5)
- "psubb %%mm1, %%mm2 \n\t"
- "paddb %%mm7, %%mm2 \n\t"
- "pcmpgtb %%mm6, %%mm2 \n\t"
- "paddb %%mm2, %%mm0 \n\t"
-
- "movq (%%"FF_REG_a", %3), %%mm2 \n\t"
- PMAXUB(%%mm2, %%mm4)
- PMINUB(%%mm2, %%mm3, %%mm5)
- "psubb %%mm2, %%mm1 \n\t"
- "paddb %%mm7, %%mm1 \n\t"
- "pcmpgtb %%mm6, %%mm1 \n\t"
- "paddb %%mm1, %%mm0 \n\t"
-
- "movq (%%"FF_REG_a", %3, 2), %%mm1 \n\t"
- PMAXUB(%%mm1, %%mm4)
- PMINUB(%%mm1, %%mm3, %%mm5)
- "psubb %%mm1, %%mm2 \n\t"
- "paddb %%mm7, %%mm2 \n\t"
- "pcmpgtb %%mm6, %%mm2 \n\t"
- "paddb %%mm2, %%mm0 \n\t"
- "psubusb %%mm3, %%mm4 \n\t"
-
- " \n\t"
-#if TEMPLATE_PP_MMXEXT
- "pxor %%mm7, %%mm7 \n\t"
- "psadbw %%mm7, %%mm0 \n\t"
-#else
- "movq %%mm0, %%mm1 \n\t"
- "psrlw $8, %%mm0 \n\t"
- "paddb %%mm1, %%mm0 \n\t"
- "movq %%mm0, %%mm1 \n\t"
- "psrlq $16, %%mm0 \n\t"
- "paddb %%mm1, %%mm0 \n\t"
- "movq %%mm0, %%mm1 \n\t"
- "psrlq $32, %%mm0 \n\t"
- "paddb %%mm1, %%mm0 \n\t"
-#endif
- "movq %4, %%mm7 \n\t" // QP,..., QP
- "paddusb %%mm7, %%mm7 \n\t" // 2QP ... 2QP
- "psubusb %%mm7, %%mm4 \n\t" // Diff <= 2QP -> 0
- "packssdw %%mm4, %%mm4 \n\t"
- "movd %%mm0, %0 \n\t"
- "movd %%mm4, %1 \n\t"
-
- : "=r" (numEq), "=r" (dcOk)
- : "r" (src), "r" ((x86_reg)stride), "m" (c->pQPb)
- : "%"FF_REG_a
- );
-
- numEq= (-numEq) &0xFF;
- if(numEq > c->ppMode.flatnessThreshold){
- if(dcOk) return 0;
- else return 1;
- }else{
- return 2;
- }
-}
-#endif //TEMPLATE_PP_MMX
-
-/**
- * Do a vertical low pass filter on the 8x16 block (only write to the 8x8 block in the middle)
- * using the 9-Tap Filter (1,1,2,2,4,2,2,1,1)/16
- */
-#if !TEMPLATE_PP_ALTIVEC
-static inline void RENAME(doVertLowPass)(uint8_t *src, int stride, PPContext *c)
-{
-#if TEMPLATE_PP_MMXEXT || TEMPLATE_PP_3DNOW
- src+= stride*3;
- __asm__ volatile( //"movv %0 %1 %2\n\t"
- "movq %2, %%mm0 \n\t" // QP,..., QP
- "pxor %%mm4, %%mm4 \n\t"
-
- "movq (%0), %%mm6 \n\t"
- "movq (%0, %1), %%mm5 \n\t"
- "movq %%mm5, %%mm1 \n\t"
- "movq %%mm6, %%mm2 \n\t"
- "psubusb %%mm6, %%mm5 \n\t"
- "psubusb %%mm1, %%mm2 \n\t"
- "por %%mm5, %%mm2 \n\t" // ABS Diff of lines
- "psubusb %%mm0, %%mm2 \n\t" // diff <= QP -> 0
- "pcmpeqb %%mm4, %%mm2 \n\t" // diff <= QP -> FF
-
- "pand %%mm2, %%mm6 \n\t"
- "pandn %%mm1, %%mm2 \n\t"
- "por %%mm2, %%mm6 \n\t"// First Line to Filter
-
- "movq (%0, %1, 8), %%mm5 \n\t"
- "lea (%0, %1, 4), %%"FF_REG_a" \n\t"
- "lea (%0, %1, 8), %%"FF_REG_c" \n\t"
- "sub %1, %%"FF_REG_c" \n\t"
- "add %1, %0 \n\t" // %0 points to line 1 not 0
- "movq (%0, %1, 8), %%mm7 \n\t"
- "movq %%mm5, %%mm1 \n\t"
- "movq %%mm7, %%mm2 \n\t"
- "psubusb %%mm7, %%mm5 \n\t"
- "psubusb %%mm1, %%mm2 \n\t"
- "por %%mm5, %%mm2 \n\t" // ABS Diff of lines
- "psubusb %%mm0, %%mm2 \n\t" // diff <= QP -> 0
- "pcmpeqb %%mm4, %%mm2 \n\t" // diff <= QP -> FF
-
- "pand %%mm2, %%mm7 \n\t"
- "pandn %%mm1, %%mm2 \n\t"
- "por %%mm2, %%mm7 \n\t" // First Line to Filter
-
-
- // 1 2 3 4 5 6 7 8
- // %0 %0+%1 %0+2%1 eax %0+4%1 eax+2%1 ecx eax+4%1
- // 6 4 2 2 1 1
- // 6 4 4 2
- // 6 8 2
-
- "movq (%0, %1), %%mm0 \n\t" // 1
- "movq %%mm0, %%mm1 \n\t" // 1
- PAVGB(%%mm6, %%mm0) //1 1 /2
- PAVGB(%%mm6, %%mm0) //3 1 /4
-
- "movq (%0, %1, 4), %%mm2 \n\t" // 1
- "movq %%mm2, %%mm5 \n\t" // 1
- PAVGB((%%FF_REGa), %%mm2) // 11 /2
- PAVGB((%0, %1, 2), %%mm2) // 211 /4
- "movq %%mm2, %%mm3 \n\t" // 211 /4
- "movq (%0), %%mm4 \n\t" // 1
- PAVGB(%%mm4, %%mm3) // 4 211 /8
- PAVGB(%%mm0, %%mm3) //642211 /16
- "movq %%mm3, (%0) \n\t" // X
- // mm1=2 mm2=3(211) mm4=1 mm5=5 mm6=0 mm7=9
- "movq %%mm1, %%mm0 \n\t" // 1
- PAVGB(%%mm6, %%mm0) //1 1 /2
- "movq %%mm4, %%mm3 \n\t" // 1
- PAVGB((%0,%1,2), %%mm3) // 1 1 /2
- PAVGB((%%FF_REGa,%1,2), %%mm5) // 11 /2
- PAVGB((%%FF_REGa), %%mm5) // 211 /4
- PAVGB(%%mm5, %%mm3) // 2 2211 /8
- PAVGB(%%mm0, %%mm3) //4242211 /16
- "movq %%mm3, (%0,%1) \n\t" // X
- // mm1=2 mm2=3(211) mm4=1 mm5=4(211) mm6=0 mm7=9
- PAVGB(%%mm4, %%mm6) //11 /2
- "movq (%%"FF_REG_c"), %%mm0 \n\t" // 1
- PAVGB((%%FF_REGa, %1, 2), %%mm0) // 11/2
- "movq %%mm0, %%mm3 \n\t" // 11/2
- PAVGB(%%mm1, %%mm0) // 2 11/4
- PAVGB(%%mm6, %%mm0) //222 11/8
- PAVGB(%%mm2, %%mm0) //22242211/16
- "movq (%0, %1, 2), %%mm2 \n\t" // 1
- "movq %%mm0, (%0, %1, 2) \n\t" // X
- // mm1=2 mm2=3 mm3=6(11) mm4=1 mm5=4(211) mm6=0(11) mm7=9
- "movq (%%"FF_REG_a", %1, 4), %%mm0 \n\t" // 1
- PAVGB((%%FF_REGc), %%mm0) // 11 /2
- PAVGB(%%mm0, %%mm6) //11 11 /4
- PAVGB(%%mm1, %%mm4) // 11 /2
- PAVGB(%%mm2, %%mm1) // 11 /2
- PAVGB(%%mm1, %%mm6) //1122 11 /8
- PAVGB(%%mm5, %%mm6) //112242211 /16
- "movq (%%"FF_REG_a"), %%mm5 \n\t" // 1
- "movq %%mm6, (%%"FF_REG_a") \n\t" // X
- // mm0=7(11) mm1=2(11) mm2=3 mm3=6(11) mm4=1(11) mm5=4 mm7=9
- "movq (%%"FF_REG_a", %1, 4), %%mm6 \n\t" // 1
- PAVGB(%%mm7, %%mm6) // 11 /2
- PAVGB(%%mm4, %%mm6) // 11 11 /4
- PAVGB(%%mm3, %%mm6) // 11 2211 /8
- PAVGB(%%mm5, %%mm2) // 11 /2
- "movq (%0, %1, 4), %%mm4 \n\t" // 1
- PAVGB(%%mm4, %%mm2) // 112 /4
- PAVGB(%%mm2, %%mm6) // 112242211 /16
- "movq %%mm6, (%0, %1, 4) \n\t" // X
- // mm0=7(11) mm1=2(11) mm2=3(112) mm3=6(11) mm4=5 mm5=4 mm7=9
- PAVGB(%%mm7, %%mm1) // 11 2 /4
- PAVGB(%%mm4, %%mm5) // 11 /2
- PAVGB(%%mm5, %%mm0) // 11 11 /4
- "movq (%%"FF_REG_a", %1, 2), %%mm6 \n\t" // 1
- PAVGB(%%mm6, %%mm1) // 11 4 2 /8
- PAVGB(%%mm0, %%mm1) // 11224222 /16
- "movq %%mm1, (%%"FF_REG_a", %1, 2) \n\t" // X
- // mm2=3(112) mm3=6(11) mm4=5 mm5=4(11) mm6=6 mm7=9
- PAVGB((%%FF_REGc), %%mm2) // 112 4 /8
- "movq (%%"FF_REG_a", %1, 4), %%mm0 \n\t" // 1
- PAVGB(%%mm0, %%mm6) // 1 1 /2
- PAVGB(%%mm7, %%mm6) // 1 12 /4
- PAVGB(%%mm2, %%mm6) // 1122424 /4
- "movq %%mm6, (%%"FF_REG_c") \n\t" // X
- // mm0=8 mm3=6(11) mm4=5 mm5=4(11) mm7=9
- PAVGB(%%mm7, %%mm5) // 11 2 /4
- PAVGB(%%mm7, %%mm5) // 11 6 /8
-
- PAVGB(%%mm3, %%mm0) // 112 /4
- PAVGB(%%mm0, %%mm5) // 112246 /16
- "movq %%mm5, (%%"FF_REG_a", %1, 4) \n\t" // X
- "sub %1, %0 \n\t"
-
- :
- : "r" (src), "r" ((x86_reg)stride), "m" (c->pQPb)
- : "%"FF_REG_a, "%"FF_REG_c
- );
-#else //TEMPLATE_PP_MMXEXT || TEMPLATE_PP_3DNOW
- const int l1= stride;
- const int l2= stride + l1;
- const int l3= stride + l2;
- const int l4= stride + l3;
- const int l5= stride + l4;
- const int l6= stride + l5;
- const int l7= stride + l6;
- const int l8= stride + l7;
- const int l9= stride + l8;
- int x;
- src+= stride*3;
- for(x=0; x<BLOCK_SIZE; x++){
- const int first= FFABS(src[0] - src[l1]) < c->QP ? src[0] : src[l1];
- const int last= FFABS(src[l8] - src[l9]) < c->QP ? src[l9] : src[l8];
-
- int sums[10];
- sums[0] = 4*first + src[l1] + src[l2] + src[l3] + 4;
- sums[1] = sums[0] - first + src[l4];
- sums[2] = sums[1] - first + src[l5];
- sums[3] = sums[2] - first + src[l6];
- sums[4] = sums[3] - first + src[l7];
- sums[5] = sums[4] - src[l1] + src[l8];
- sums[6] = sums[5] - src[l2] + last;
- sums[7] = sums[6] - src[l3] + last;
- sums[8] = sums[7] - src[l4] + last;
- sums[9] = sums[8] - src[l5] + last;
-
- src[l1]= (sums[0] + sums[2] + 2*src[l1])>>4;
- src[l2]= (sums[1] + sums[3] + 2*src[l2])>>4;
- src[l3]= (sums[2] + sums[4] + 2*src[l3])>>4;
- src[l4]= (sums[3] + sums[5] + 2*src[l4])>>4;
- src[l5]= (sums[4] + sums[6] + 2*src[l5])>>4;
- src[l6]= (sums[5] + sums[7] + 2*src[l6])>>4;
- src[l7]= (sums[6] + sums[8] + 2*src[l7])>>4;
- src[l8]= (sums[7] + sums[9] + 2*src[l8])>>4;
-
- src++;
- }
-#endif //TEMPLATE_PP_MMXEXT || TEMPLATE_PP_3DNOW
-}
-#endif //TEMPLATE_PP_ALTIVEC
-
-/**
- * Experimental Filter 1
- * will not damage linear gradients
- * Flat blocks should look like they were passed through the (1,1,2,2,4,2,2,1,1) 9-Tap filter
- * can only smooth blocks at the expected locations (it cannot smooth them if they did move)
- * MMX2 version does correct clipping C version does not
- */
-static inline void RENAME(vertX1Filter)(uint8_t *src, int stride, PPContext *co)
-{
-#if TEMPLATE_PP_MMXEXT || TEMPLATE_PP_3DNOW
- src+= stride*3;
-
- __asm__ volatile(
- "pxor %%mm7, %%mm7 \n\t" // 0
- "lea (%0, %1), %%"FF_REG_a" \n\t"
- "lea (%%"FF_REG_a", %1, 4), %%"FF_REG_c"\n\t"
-// 0 1 2 3 4 5 6 7 8 9
-// %0 eax eax+%1 eax+2%1 %0+4%1 ecx ecx+%1 ecx+2%1 %0+8%1 ecx+4%1
- "movq (%%"FF_REG_a", %1, 2), %%mm0 \n\t" // line 3
- "movq (%0, %1, 4), %%mm1 \n\t" // line 4
- "movq %%mm1, %%mm2 \n\t" // line 4
- "psubusb %%mm0, %%mm1 \n\t"
- "psubusb %%mm2, %%mm0 \n\t"
- "por %%mm1, %%mm0 \n\t" // |l2 - l3|
- "movq (%%"FF_REG_c"), %%mm3 \n\t" // line 5
- "movq (%%"FF_REG_c", %1), %%mm4 \n\t" // line 6
- "movq %%mm3, %%mm5 \n\t" // line 5
- "psubusb %%mm4, %%mm3 \n\t"
- "psubusb %%mm5, %%mm4 \n\t"
- "por %%mm4, %%mm3 \n\t" // |l5 - l6|
- PAVGB(%%mm3, %%mm0) // (|l2 - l3| + |l5 - l6|)/2
- "movq %%mm2, %%mm1 \n\t" // line 4
- "psubusb %%mm5, %%mm2 \n\t"
- "movq %%mm2, %%mm4 \n\t"
- "pcmpeqb %%mm7, %%mm2 \n\t" // (l4 - l5) <= 0 ? -1 : 0
- "psubusb %%mm1, %%mm5 \n\t"
- "por %%mm5, %%mm4 \n\t" // |l4 - l5|
- "psubusb %%mm0, %%mm4 \n\t" //d = MAX(0, |l4-l5| - (|l2-l3| + |l5-l6|)/2)
- "movq %%mm4, %%mm3 \n\t" // d
- "movq %2, %%mm0 \n\t"
- "paddusb %%mm0, %%mm0 \n\t"
- "psubusb %%mm0, %%mm4 \n\t"
- "pcmpeqb %%mm7, %%mm4 \n\t" // d <= QP ? -1 : 0
- "psubusb "MANGLE(b01)", %%mm3 \n\t"
- "pand %%mm4, %%mm3 \n\t" // d <= QP ? d : 0
-
- PAVGB(%%mm7, %%mm3) // d/2
- "movq %%mm3, %%mm1 \n\t" // d/2
- PAVGB(%%mm7, %%mm3) // d/4
- PAVGB(%%mm1, %%mm3) // 3*d/8
-
- "movq (%0, %1, 4), %%mm0 \n\t" // line 4
- "pxor %%mm2, %%mm0 \n\t" //(l4 - l5) <= 0 ? -l4-1 : l4
- "psubusb %%mm3, %%mm0 \n\t"
- "pxor %%mm2, %%mm0 \n\t"
- "movq %%mm0, (%0, %1, 4) \n\t" // line 4
-
- "movq (%%"FF_REG_c"), %%mm0 \n\t" // line 5
- "pxor %%mm2, %%mm0 \n\t" //(l4 - l5) <= 0 ? -l5-1 : l5
- "paddusb %%mm3, %%mm0 \n\t"
- "pxor %%mm2, %%mm0 \n\t"
- "movq %%mm0, (%%"FF_REG_c") \n\t" // line 5
-
- PAVGB(%%mm7, %%mm1) // d/4
-
- "movq (%%"FF_REG_a", %1, 2), %%mm0 \n\t" // line 3
- "pxor %%mm2, %%mm0 \n\t" //(l4 - l5) <= 0 ? -l4-1 : l4
- "psubusb %%mm1, %%mm0 \n\t"
- "pxor %%mm2, %%mm0 \n\t"
- "movq %%mm0, (%%"FF_REG_a", %1, 2) \n\t" // line 3
-
- "movq (%%"FF_REG_c", %1), %%mm0 \n\t" // line 6
- "pxor %%mm2, %%mm0 \n\t" //(l4 - l5) <= 0 ? -l5-1 : l5
- "paddusb %%mm1, %%mm0 \n\t"
- "pxor %%mm2, %%mm0 \n\t"
- "movq %%mm0, (%%"FF_REG_c", %1) \n\t" // line 6
-
- PAVGB(%%mm7, %%mm1) // d/8
-
- "movq (%%"FF_REG_a", %1), %%mm0 \n\t" // line 2
- "pxor %%mm2, %%mm0 \n\t" //(l4 - l5) <= 0 ? -l2-1 : l2
- "psubusb %%mm1, %%mm0 \n\t"
- "pxor %%mm2, %%mm0 \n\t"
- "movq %%mm0, (%%"FF_REG_a", %1) \n\t" // line 2
-
- "movq (%%"FF_REG_c", %1, 2), %%mm0 \n\t" // line 7
- "pxor %%mm2, %%mm0 \n\t" //(l4 - l5) <= 0 ? -l7-1 : l7
- "paddusb %%mm1, %%mm0 \n\t"
- "pxor %%mm2, %%mm0 \n\t"
- "movq %%mm0, (%%"FF_REG_c", %1, 2) \n\t" // line 7
-
- :
- : "r" (src), "r" ((x86_reg)stride), "m" (co->pQPb)
- NAMED_CONSTRAINTS_ADD(b01)
- : "%"FF_REG_a, "%"FF_REG_c
- );
-#else //TEMPLATE_PP_MMXEXT || TEMPLATE_PP_3DNOW
-
- const int l1= stride;
- const int l2= stride + l1;
- const int l3= stride + l2;
- const int l4= stride + l3;
- const int l5= stride + l4;
- const int l6= stride + l5;
- const int l7= stride + l6;
-// const int l8= stride + l7;
-// const int l9= stride + l8;
- int x;
-
- src+= stride*3;
- for(x=0; x<BLOCK_SIZE; x++){
- int a= src[l3] - src[l4];
- int b= src[l4] - src[l5];
- int c= src[l5] - src[l6];
-
- int d= FFABS(b) - ((FFABS(a) + FFABS(c))>>1);
- d= FFMAX(d, 0);
-
- if(d < co->QP*2){
- int v = d * FFSIGN(-b);
-
- src[l2] +=v>>3;
- src[l3] +=v>>2;
- src[l4] +=(3*v)>>3;
- src[l5] -=(3*v)>>3;
- src[l6] -=v>>2;
- src[l7] -=v>>3;
- }
- src++;
- }
-#endif //TEMPLATE_PP_MMXEXT || TEMPLATE_PP_3DNOW
-}
-
-#if !TEMPLATE_PP_ALTIVEC
-static inline void RENAME(doVertDefFilter)(uint8_t src[], int stride, PPContext *c)
-{
-#if TEMPLATE_PP_MMXEXT || TEMPLATE_PP_3DNOW
-/*
- uint8_t tmp[16];
- const int l1= stride;
- const int l2= stride + l1;
- const int l3= stride + l2;
- const int l4= (int)tmp - (int)src - stride*3;
- const int l5= (int)tmp - (int)src - stride*3 + 8;
- const int l6= stride*3 + l3;
- const int l7= stride + l6;
- const int l8= stride + l7;
-
- memcpy(tmp, src+stride*7, 8);
- memcpy(tmp+8, src+stride*8, 8);
-*/
- src+= stride*4;
- __asm__ volatile(
-
-#if 0 //slightly more accurate and slightly slower
- "pxor %%mm7, %%mm7 \n\t" // 0
- "lea (%0, %1), %%"FF_REG_a" \n\t"
- "lea (%%"FF_REG_a", %1, 4), %%"FF_REG_c"\n\t"
-// 0 1 2 3 4 5 6 7
-// %0 %0+%1 %0+2%1 eax+2%1 %0+4%1 eax+4%1 ecx+%1 ecx+2%1
-// %0 eax eax+%1 eax+2%1 %0+4%1 ecx ecx+%1 ecx+2%1
-
-
- "movq (%0, %1, 2), %%mm0 \n\t" // l2
- "movq (%0), %%mm1 \n\t" // l0
- "movq %%mm0, %%mm2 \n\t" // l2
- PAVGB(%%mm7, %%mm0) // ~l2/2
- PAVGB(%%mm1, %%mm0) // ~(l2 + 2l0)/4
- PAVGB(%%mm2, %%mm0) // ~(5l2 + 2l0)/8
-
- "movq (%%"FF_REG_a"), %%mm1 \n\t" // l1
- "movq (%%"FF_REG_a", %1, 2), %%mm3 \n\t" // l3
- "movq %%mm1, %%mm4 \n\t" // l1
- PAVGB(%%mm7, %%mm1) // ~l1/2
- PAVGB(%%mm3, %%mm1) // ~(l1 + 2l3)/4
- PAVGB(%%mm4, %%mm1) // ~(5l1 + 2l3)/8
-
- "movq %%mm0, %%mm4 \n\t" // ~(5l2 + 2l0)/8
- "psubusb %%mm1, %%mm0 \n\t"
- "psubusb %%mm4, %%mm1 \n\t"
- "por %%mm0, %%mm1 \n\t" // ~|2l0 - 5l1 + 5l2 - 2l3|/8
-// mm1= |lenergy|, mm2= l2, mm3= l3, mm7=0
-
- "movq (%0, %1, 4), %%mm0 \n\t" // l4
- "movq %%mm0, %%mm4 \n\t" // l4
- PAVGB(%%mm7, %%mm0) // ~l4/2
- PAVGB(%%mm2, %%mm0) // ~(l4 + 2l2)/4
- PAVGB(%%mm4, %%mm0) // ~(5l4 + 2l2)/8
-
- "movq (%%"FF_REG_c"), %%mm2 \n\t" // l5
- "movq %%mm3, %%mm5 \n\t" // l3
- PAVGB(%%mm7, %%mm3) // ~l3/2
- PAVGB(%%mm2, %%mm3) // ~(l3 + 2l5)/4
- PAVGB(%%mm5, %%mm3) // ~(5l3 + 2l5)/8
-
- "movq %%mm0, %%mm6 \n\t" // ~(5l4 + 2l2)/8
- "psubusb %%mm3, %%mm0 \n\t"
- "psubusb %%mm6, %%mm3 \n\t"
- "por %%mm0, %%mm3 \n\t" // ~|2l2 - 5l3 + 5l4 - 2l5|/8
- "pcmpeqb %%mm7, %%mm0 \n\t" // SIGN(2l2 - 5l3 + 5l4 - 2l5)
-// mm0= SIGN(menergy), mm1= |lenergy|, mm2= l5, mm3= |menergy|, mm4=l4, mm5= l3, mm7=0
-
- "movq (%%"FF_REG_c", %1), %%mm6 \n\t" // l6
- "movq %%mm6, %%mm5 \n\t" // l6
- PAVGB(%%mm7, %%mm6) // ~l6/2
- PAVGB(%%mm4, %%mm6) // ~(l6 + 2l4)/4
- PAVGB(%%mm5, %%mm6) // ~(5l6 + 2l4)/8
-
- "movq (%%"FF_REG_c", %1, 2), %%mm5 \n\t" // l7
- "movq %%mm2, %%mm4 \n\t" // l5
- PAVGB(%%mm7, %%mm2) // ~l5/2
- PAVGB(%%mm5, %%mm2) // ~(l5 + 2l7)/4
- PAVGB(%%mm4, %%mm2) // ~(5l5 + 2l7)/8
-
- "movq %%mm6, %%mm4 \n\t" // ~(5l6 + 2l4)/8
- "psubusb %%mm2, %%mm6 \n\t"
- "psubusb %%mm4, %%mm2 \n\t"
- "por %%mm6, %%mm2 \n\t" // ~|2l4 - 5l5 + 5l6 - 2l7|/8
-// mm0= SIGN(menergy), mm1= |lenergy|/8, mm2= |renergy|/8, mm3= |menergy|/8, mm7=0
-
-
- PMINUB(%%mm2, %%mm1, %%mm4) // MIN(|lenergy|,|renergy|)/8
- "movq %2, %%mm4 \n\t" // QP //FIXME QP+1 ?
- "paddusb "MANGLE(b01)", %%mm4 \n\t"
- "pcmpgtb %%mm3, %%mm4 \n\t" // |menergy|/8 < QP
- "psubusb %%mm1, %%mm3 \n\t" // d=|menergy|/8-MIN(|lenergy|,|renergy|)/8
- "pand %%mm4, %%mm3 \n\t"
-
- "movq %%mm3, %%mm1 \n\t"
-// "psubusb "MANGLE(b01)", %%mm3 \n\t"
- PAVGB(%%mm7, %%mm3)
- PAVGB(%%mm7, %%mm3)
- "paddusb %%mm1, %%mm3 \n\t"
-// "paddusb "MANGLE(b01)", %%mm3 \n\t"
-
- "movq (%%"FF_REG_a", %1, 2), %%mm6 \n\t" //l3
- "movq (%0, %1, 4), %%mm5 \n\t" //l4
- "movq (%0, %1, 4), %%mm4 \n\t" //l4
- "psubusb %%mm6, %%mm5 \n\t"
- "psubusb %%mm4, %%mm6 \n\t"
- "por %%mm6, %%mm5 \n\t" // |l3-l4|
- "pcmpeqb %%mm7, %%mm6 \n\t" // SIGN(l3-l4)
- "pxor %%mm6, %%mm0 \n\t"
- "pand %%mm0, %%mm3 \n\t"
- PMINUB(%%mm5, %%mm3, %%mm0)
-
- "psubusb "MANGLE(b01)", %%mm3 \n\t"
- PAVGB(%%mm7, %%mm3)
-
- "movq (%%"FF_REG_a", %1, 2), %%mm0 \n\t"
- "movq (%0, %1, 4), %%mm2 \n\t"
- "pxor %%mm6, %%mm0 \n\t"
- "pxor %%mm6, %%mm2 \n\t"
- "psubb %%mm3, %%mm0 \n\t"
- "paddb %%mm3, %%mm2 \n\t"
- "pxor %%mm6, %%mm0 \n\t"
- "pxor %%mm6, %%mm2 \n\t"
- "movq %%mm0, (%%"FF_REG_a", %1, 2) \n\t"
- "movq %%mm2, (%0, %1, 4) \n\t"
-#endif //0
-
- "lea (%0, %1), %%"FF_REG_a" \n\t"
- "pcmpeqb %%mm6, %%mm6 \n\t" // -1
-// 0 1 2 3 4 5 6 7
-// %0 %0+%1 %0+2%1 eax+2%1 %0+4%1 eax+4%1 ecx+%1 ecx+2%1
-// %0 eax eax+%1 eax+2%1 %0+4%1 ecx ecx+%1 ecx+2%1
-
-
- "movq (%%"FF_REG_a", %1, 2), %%mm1 \n\t" // l3
- "movq (%0, %1, 4), %%mm0 \n\t" // l4
- "pxor %%mm6, %%mm1 \n\t" // -l3-1
- PAVGB(%%mm1, %%mm0) // -q+128 = (l4-l3+256)/2
-// mm1=-l3-1, mm0=128-q
-
- "movq (%%"FF_REG_a", %1, 4), %%mm2 \n\t" // l5
- "movq (%%"FF_REG_a", %1), %%mm3 \n\t" // l2
- "pxor %%mm6, %%mm2 \n\t" // -l5-1
- "movq %%mm2, %%mm5 \n\t" // -l5-1
- "movq "MANGLE(b80)", %%mm4 \n\t" // 128
- "lea (%%"FF_REG_a", %1, 4), %%"FF_REG_c"\n\t"
- PAVGB(%%mm3, %%mm2) // (l2-l5+256)/2
- PAVGB(%%mm0, %%mm4) // ~(l4-l3)/4 + 128
- PAVGB(%%mm2, %%mm4) // ~(l2-l5)/4 +(l4-l3)/8 + 128
- PAVGB(%%mm0, %%mm4) // ~(l2-l5)/8 +5(l4-l3)/16 + 128
-// mm1=-l3-1, mm0=128-q, mm3=l2, mm4=menergy/16 + 128, mm5= -l5-1
-
- "movq (%%"FF_REG_a"), %%mm2 \n\t" // l1
- "pxor %%mm6, %%mm2 \n\t" // -l1-1
- PAVGB(%%mm3, %%mm2) // (l2-l1+256)/2
- PAVGB((%0), %%mm1) // (l0-l3+256)/2
- "movq "MANGLE(b80)", %%mm3 \n\t" // 128
- PAVGB(%%mm2, %%mm3) // ~(l2-l1)/4 + 128
- PAVGB(%%mm1, %%mm3) // ~(l0-l3)/4 +(l2-l1)/8 + 128
- PAVGB(%%mm2, %%mm3) // ~(l0-l3)/8 +5(l2-l1)/16 + 128
-// mm0=128-q, mm3=lenergy/16 + 128, mm4= menergy/16 + 128, mm5= -l5-1
-
- PAVGB((%%FF_REGc, %1), %%mm5) // (l6-l5+256)/2
- "movq (%%"FF_REG_c", %1, 2), %%mm1 \n\t" // l7
- "pxor %%mm6, %%mm1 \n\t" // -l7-1
- PAVGB((%0, %1, 4), %%mm1) // (l4-l7+256)/2
- "movq "MANGLE(b80)", %%mm2 \n\t" // 128
- PAVGB(%%mm5, %%mm2) // ~(l6-l5)/4 + 128
- PAVGB(%%mm1, %%mm2) // ~(l4-l7)/4 +(l6-l5)/8 + 128
- PAVGB(%%mm5, %%mm2) // ~(l4-l7)/8 +5(l6-l5)/16 + 128
-// mm0=128-q, mm2=renergy/16 + 128, mm3=lenergy/16 + 128, mm4= menergy/16 + 128
-
- "movq "MANGLE(b00)", %%mm1 \n\t" // 0
- "movq "MANGLE(b00)", %%mm5 \n\t" // 0
- "psubb %%mm2, %%mm1 \n\t" // 128 - renergy/16
- "psubb %%mm3, %%mm5 \n\t" // 128 - lenergy/16
- PMAXUB(%%mm1, %%mm2) // 128 + |renergy/16|
- PMAXUB(%%mm5, %%mm3) // 128 + |lenergy/16|
- PMINUB(%%mm2, %%mm3, %%mm1) // 128 + MIN(|lenergy|,|renergy|)/16
-
-// mm0=128-q, mm3=128 + MIN(|lenergy|,|renergy|)/16, mm4= menergy/16 + 128
-
- "movq "MANGLE(b00)", %%mm7 \n\t" // 0
- "movq %2, %%mm2 \n\t" // QP
- PAVGB(%%mm6, %%mm2) // 128 + QP/2
- "psubb %%mm6, %%mm2 \n\t"
-
- "movq %%mm4, %%mm1 \n\t"
- "pcmpgtb %%mm7, %%mm1 \n\t" // SIGN(menergy)
- "pxor %%mm1, %%mm4 \n\t"
- "psubb %%mm1, %%mm4 \n\t" // 128 + |menergy|/16
- "pcmpgtb %%mm4, %%mm2 \n\t" // |menergy|/16 < QP/2
- "psubusb %%mm3, %%mm4 \n\t" //d=|menergy|/16 - MIN(|lenergy|,|renergy|)/16
-// mm0=128-q, mm1= SIGN(menergy), mm2= |menergy|/16 < QP/2, mm4= d/16
-
- "movq %%mm4, %%mm3 \n\t" // d
- "psubusb "MANGLE(b01)", %%mm4 \n\t"
- PAVGB(%%mm7, %%mm4) // d/32
- PAVGB(%%mm7, %%mm4) // (d + 32)/64
- "paddb %%mm3, %%mm4 \n\t" // 5d/64
- "pand %%mm2, %%mm4 \n\t"
-
- "movq "MANGLE(b80)", %%mm5 \n\t" // 128
- "psubb %%mm0, %%mm5 \n\t" // q
- "paddsb %%mm6, %%mm5 \n\t" // fix bad rounding
- "pcmpgtb %%mm5, %%mm7 \n\t" // SIGN(q)
- "pxor %%mm7, %%mm5 \n\t"
-
- PMINUB(%%mm5, %%mm4, %%mm3) // MIN(|q|, 5d/64)
- "pxor %%mm1, %%mm7 \n\t" // SIGN(d*q)
-
- "pand %%mm7, %%mm4 \n\t"
- "movq (%%"FF_REG_a", %1, 2), %%mm0 \n\t"
- "movq (%0, %1, 4), %%mm2 \n\t"
- "pxor %%mm1, %%mm0 \n\t"
- "pxor %%mm1, %%mm2 \n\t"
- "paddb %%mm4, %%mm0 \n\t"
- "psubb %%mm4, %%mm2 \n\t"
- "pxor %%mm1, %%mm0 \n\t"
- "pxor %%mm1, %%mm2 \n\t"
- "movq %%mm0, (%%"FF_REG_a", %1, 2) \n\t"
- "movq %%mm2, (%0, %1, 4) \n\t"
-
- :
- : "r" (src), "r" ((x86_reg)stride), "m" (c->pQPb)
- NAMED_CONSTRAINTS_ADD(b80,b00,b01)
- : "%"FF_REG_a, "%"FF_REG_c
- );
-
-/*
- {
- int x;
- src-= stride;
- for(x=0; x<BLOCK_SIZE; x++){
- const int middleEnergy= 5*(src[l5] - src[l4]) + 2*(src[l3] - src[l6]);
- if(FFABS(middleEnergy)< 8*QP){
- const int q=(src[l4] - src[l5])/2;
- const int leftEnergy= 5*(src[l3] - src[l2]) + 2*(src[l1] - src[l4]);
- const int rightEnergy= 5*(src[l7] - src[l6]) + 2*(src[l5] - src[l8]);
-
- int d= FFABS(middleEnergy) - FFMIN( FFABS(leftEnergy), FFABS(rightEnergy) );
- d= FFMAX(d, 0);
-
- d= (5*d + 32) >> 6;
- d*= FFSIGN(-middleEnergy);
-
- if(q>0){
- d= d<0 ? 0 : d;
- d= d>q ? q : d;
- }else{
- d= d>0 ? 0 : d;
- d= d<q ? q : d;
- }
-
- src[l4]-= d;
- src[l5]+= d;
- }
- src++;
- }
- src-=8;
- for(x=0; x<8; x++){
- int y;
- for(y=4; y<6; y++){
- int d= src[x+y*stride] - tmp[x+(y-4)*8];
- int ad= FFABS(d);
- static int max=0;
- static int sum=0;
- static int num=0;
- static int bias=0;
-
- if(max<ad) max=ad;
- sum+= ad>3 ? 1 : 0;
- if(ad>3){
- src[0] = src[7] = src[stride*7] = src[(stride+1)*7]=255;
- }
- if(y==4) bias+=d;
- num++;
- if(num%1000000 == 0){
- av_log(c, AV_LOG_INFO, " %d %d %d %d\n", num, sum, max, bias);
- }
- }
- }
-}
-*/
-#elif TEMPLATE_PP_MMX
- DECLARE_ALIGNED(8, uint64_t, tmp)[4]; // make space for 4 8-byte vars
- src+= stride*4;
- __asm__ volatile(
- "pxor %%mm7, %%mm7 \n\t"
-// 0 1 2 3 4 5 6 7
-// %0 %0+%1 %0+2%1 eax+2%1 %0+4%1 eax+4%1 edx+%1 edx+2%1
-// %0 eax eax+%1 eax+2%1 %0+4%1 edx edx+%1 edx+2%1
-
- "movq (%0), %%mm0 \n\t"
- "movq %%mm0, %%mm1 \n\t"
- "punpcklbw %%mm7, %%mm0 \n\t" // low part of line 0
- "punpckhbw %%mm7, %%mm1 \n\t" // high part of line 0
-
- "movq (%0, %1), %%mm2 \n\t"
- "lea (%0, %1, 2), %%"FF_REG_a" \n\t"
- "movq %%mm2, %%mm3 \n\t"
- "punpcklbw %%mm7, %%mm2 \n\t" // low part of line 1
- "punpckhbw %%mm7, %%mm3 \n\t" // high part of line 1
-
- "movq (%%"FF_REG_a"), %%mm4 \n\t"
- "movq %%mm4, %%mm5 \n\t"
- "punpcklbw %%mm7, %%mm4 \n\t" // low part of line 2
- "punpckhbw %%mm7, %%mm5 \n\t" // high part of line 2
-
- "paddw %%mm0, %%mm0 \n\t" // 2L0
- "paddw %%mm1, %%mm1 \n\t" // 2H0
- "psubw %%mm4, %%mm2 \n\t" // L1 - L2
- "psubw %%mm5, %%mm3 \n\t" // H1 - H2
- "psubw %%mm2, %%mm0 \n\t" // 2L0 - L1 + L2
- "psubw %%mm3, %%mm1 \n\t" // 2H0 - H1 + H2
-
- "psllw $2, %%mm2 \n\t" // 4L1 - 4L2
- "psllw $2, %%mm3 \n\t" // 4H1 - 4H2
- "psubw %%mm2, %%mm0 \n\t" // 2L0 - 5L1 + 5L2
- "psubw %%mm3, %%mm1 \n\t" // 2H0 - 5H1 + 5H2
-
- "movq (%%"FF_REG_a", %1), %%mm2 \n\t"
- "movq %%mm2, %%mm3 \n\t"
- "punpcklbw %%mm7, %%mm2 \n\t" // L3
- "punpckhbw %%mm7, %%mm3 \n\t" // H3
-
- "psubw %%mm2, %%mm0 \n\t" // 2L0 - 5L1 + 5L2 - L3
- "psubw %%mm3, %%mm1 \n\t" // 2H0 - 5H1 + 5H2 - H3
- "psubw %%mm2, %%mm0 \n\t" // 2L0 - 5L1 + 5L2 - 2L3
- "psubw %%mm3, %%mm1 \n\t" // 2H0 - 5H1 + 5H2 - 2H3
- "movq %%mm0, (%3) \n\t" // 2L0 - 5L1 + 5L2 - 2L3
- "movq %%mm1, 8(%3) \n\t" // 2H0 - 5H1 + 5H2 - 2H3
-
- "movq (%%"FF_REG_a", %1, 2), %%mm0 \n\t"
- "movq %%mm0, %%mm1 \n\t"
- "punpcklbw %%mm7, %%mm0 \n\t" // L4
- "punpckhbw %%mm7, %%mm1 \n\t" // H4
-
- "psubw %%mm0, %%mm2 \n\t" // L3 - L4
- "psubw %%mm1, %%mm3 \n\t" // H3 - H4
- "movq %%mm2, 16(%3) \n\t" // L3 - L4
- "movq %%mm3, 24(%3) \n\t" // H3 - H4
- "paddw %%mm4, %%mm4 \n\t" // 2L2
- "paddw %%mm5, %%mm5 \n\t" // 2H2
- "psubw %%mm2, %%mm4 \n\t" // 2L2 - L3 + L4
- "psubw %%mm3, %%mm5 \n\t" // 2H2 - H3 + H4
-
- "lea (%%"FF_REG_a", %1), %0 \n\t"
- "psllw $2, %%mm2 \n\t" // 4L3 - 4L4
- "psllw $2, %%mm3 \n\t" // 4H3 - 4H4
- "psubw %%mm2, %%mm4 \n\t" // 2L2 - 5L3 + 5L4
- "psubw %%mm3, %%mm5 \n\t" // 2H2 - 5H3 + 5H4
-//50 opcodes so far
- "movq (%0, %1, 2), %%mm2 \n\t"
- "movq %%mm2, %%mm3 \n\t"
- "punpcklbw %%mm7, %%mm2 \n\t" // L5
- "punpckhbw %%mm7, %%mm3 \n\t" // H5
- "psubw %%mm2, %%mm4 \n\t" // 2L2 - 5L3 + 5L4 - L5
- "psubw %%mm3, %%mm5 \n\t" // 2H2 - 5H3 + 5H4 - H5
- "psubw %%mm2, %%mm4 \n\t" // 2L2 - 5L3 + 5L4 - 2L5
- "psubw %%mm3, %%mm5 \n\t" // 2H2 - 5H3 + 5H4 - 2H5
-
- "movq (%%"FF_REG_a", %1, 4), %%mm6 \n\t"
- "punpcklbw %%mm7, %%mm6 \n\t" // L6
- "psubw %%mm6, %%mm2 \n\t" // L5 - L6
- "movq (%%"FF_REG_a", %1, 4), %%mm6 \n\t"
- "punpckhbw %%mm7, %%mm6 \n\t" // H6
- "psubw %%mm6, %%mm3 \n\t" // H5 - H6
-
- "paddw %%mm0, %%mm0 \n\t" // 2L4
- "paddw %%mm1, %%mm1 \n\t" // 2H4
- "psubw %%mm2, %%mm0 \n\t" // 2L4 - L5 + L6
- "psubw %%mm3, %%mm1 \n\t" // 2H4 - H5 + H6
-
- "psllw $2, %%mm2 \n\t" // 4L5 - 4L6
- "psllw $2, %%mm3 \n\t" // 4H5 - 4H6
- "psubw %%mm2, %%mm0 \n\t" // 2L4 - 5L5 + 5L6
- "psubw %%mm3, %%mm1 \n\t" // 2H4 - 5H5 + 5H6
-
- "movq (%0, %1, 4), %%mm2 \n\t"
- "movq %%mm2, %%mm3 \n\t"
- "punpcklbw %%mm7, %%mm2 \n\t" // L7
- "punpckhbw %%mm7, %%mm3 \n\t" // H7
-
- "paddw %%mm2, %%mm2 \n\t" // 2L7
- "paddw %%mm3, %%mm3 \n\t" // 2H7
- "psubw %%mm2, %%mm0 \n\t" // 2L4 - 5L5 + 5L6 - 2L7
- "psubw %%mm3, %%mm1 \n\t" // 2H4 - 5H5 + 5H6 - 2H7
-
- "movq (%3), %%mm2 \n\t" // 2L0 - 5L1 + 5L2 - 2L3
- "movq 8(%3), %%mm3 \n\t" // 2H0 - 5H1 + 5H2 - 2H3
-
-#if TEMPLATE_PP_MMXEXT
- "movq %%mm7, %%mm6 \n\t" // 0
- "psubw %%mm0, %%mm6 \n\t"
- "pmaxsw %%mm6, %%mm0 \n\t" // |2L4 - 5L5 + 5L6 - 2L7|
- "movq %%mm7, %%mm6 \n\t" // 0
- "psubw %%mm1, %%mm6 \n\t"
- "pmaxsw %%mm6, %%mm1 \n\t" // |2H4 - 5H5 + 5H6 - 2H7|
- "movq %%mm7, %%mm6 \n\t" // 0
- "psubw %%mm2, %%mm6 \n\t"
- "pmaxsw %%mm6, %%mm2 \n\t" // |2L0 - 5L1 + 5L2 - 2L3|
- "movq %%mm7, %%mm6 \n\t" // 0
- "psubw %%mm3, %%mm6 \n\t"
- "pmaxsw %%mm6, %%mm3 \n\t" // |2H0 - 5H1 + 5H2 - 2H3|
-#else
- "movq %%mm7, %%mm6 \n\t" // 0
- "pcmpgtw %%mm0, %%mm6 \n\t"
- "pxor %%mm6, %%mm0 \n\t"
- "psubw %%mm6, %%mm0 \n\t" // |2L4 - 5L5 + 5L6 - 2L7|
- "movq %%mm7, %%mm6 \n\t" // 0
- "pcmpgtw %%mm1, %%mm6 \n\t"
- "pxor %%mm6, %%mm1 \n\t"
- "psubw %%mm6, %%mm1 \n\t" // |2H4 - 5H5 + 5H6 - 2H7|
- "movq %%mm7, %%mm6 \n\t" // 0
- "pcmpgtw %%mm2, %%mm6 \n\t"
- "pxor %%mm6, %%mm2 \n\t"
- "psubw %%mm6, %%mm2 \n\t" // |2L0 - 5L1 + 5L2 - 2L3|
- "movq %%mm7, %%mm6 \n\t" // 0
- "pcmpgtw %%mm3, %%mm6 \n\t"
- "pxor %%mm6, %%mm3 \n\t"
- "psubw %%mm6, %%mm3 \n\t" // |2H0 - 5H1 + 5H2 - 2H3|
-#endif
-
-#if TEMPLATE_PP_MMXEXT
- "pminsw %%mm2, %%mm0 \n\t"
- "pminsw %%mm3, %%mm1 \n\t"
-#else
- "movq %%mm0, %%mm6 \n\t"
- "psubusw %%mm2, %%mm6 \n\t"
- "psubw %%mm6, %%mm0 \n\t"
- "movq %%mm1, %%mm6 \n\t"
- "psubusw %%mm3, %%mm6 \n\t"
- "psubw %%mm6, %%mm1 \n\t"
-#endif
-
- "movd %2, %%mm2 \n\t" // QP
- "punpcklbw %%mm7, %%mm2 \n\t"
-
- "movq %%mm7, %%mm6 \n\t" // 0
- "pcmpgtw %%mm4, %%mm6 \n\t" // sign(2L2 - 5L3 + 5L4 - 2L5)
- "pxor %%mm6, %%mm4 \n\t"
- "psubw %%mm6, %%mm4 \n\t" // |2L2 - 5L3 + 5L4 - 2L5|
- "pcmpgtw %%mm5, %%mm7 \n\t" // sign(2H2 - 5H3 + 5H4 - 2H5)
- "pxor %%mm7, %%mm5 \n\t"
- "psubw %%mm7, %%mm5 \n\t" // |2H2 - 5H3 + 5H4 - 2H5|
-// 100 opcodes
- "psllw $3, %%mm2 \n\t" // 8QP
- "movq %%mm2, %%mm3 \n\t" // 8QP
- "pcmpgtw %%mm4, %%mm2 \n\t"
- "pcmpgtw %%mm5, %%mm3 \n\t"
- "pand %%mm2, %%mm4 \n\t"
- "pand %%mm3, %%mm5 \n\t"
-
-
- "psubusw %%mm0, %%mm4 \n\t" // hd
- "psubusw %%mm1, %%mm5 \n\t" // ld
-
-
- "movq "MANGLE(w05)", %%mm2 \n\t" // 5
- "pmullw %%mm2, %%mm4 \n\t"
- "pmullw %%mm2, %%mm5 \n\t"
- "movq "MANGLE(w20)", %%mm2 \n\t" // 32
- "paddw %%mm2, %%mm4 \n\t"
- "paddw %%mm2, %%mm5 \n\t"
- "psrlw $6, %%mm4 \n\t"
- "psrlw $6, %%mm5 \n\t"
-
- "movq 16(%3), %%mm0 \n\t" // L3 - L4
- "movq 24(%3), %%mm1 \n\t" // H3 - H4
-
- "pxor %%mm2, %%mm2 \n\t"
- "pxor %%mm3, %%mm3 \n\t"
-
- "pcmpgtw %%mm0, %%mm2 \n\t" // sign (L3-L4)
- "pcmpgtw %%mm1, %%mm3 \n\t" // sign (H3-H4)
- "pxor %%mm2, %%mm0 \n\t"
- "pxor %%mm3, %%mm1 \n\t"
- "psubw %%mm2, %%mm0 \n\t" // |L3-L4|
- "psubw %%mm3, %%mm1 \n\t" // |H3-H4|
- "psrlw $1, %%mm0 \n\t" // |L3 - L4|/2
- "psrlw $1, %%mm1 \n\t" // |H3 - H4|/2
-
- "pxor %%mm6, %%mm2 \n\t"
- "pxor %%mm7, %%mm3 \n\t"
- "pand %%mm2, %%mm4 \n\t"
- "pand %%mm3, %%mm5 \n\t"
-
-#if TEMPLATE_PP_MMXEXT
- "pminsw %%mm0, %%mm4 \n\t"
- "pminsw %%mm1, %%mm5 \n\t"
-#else
- "movq %%mm4, %%mm2 \n\t"
- "psubusw %%mm0, %%mm2 \n\t"
- "psubw %%mm2, %%mm4 \n\t"
- "movq %%mm5, %%mm2 \n\t"
- "psubusw %%mm1, %%mm2 \n\t"
- "psubw %%mm2, %%mm5 \n\t"
-#endif
- "pxor %%mm6, %%mm4 \n\t"
- "pxor %%mm7, %%mm5 \n\t"
- "psubw %%mm6, %%mm4 \n\t"
- "psubw %%mm7, %%mm5 \n\t"
- "packsswb %%mm5, %%mm4 \n\t"
- "movq (%0), %%mm0 \n\t"
- "paddb %%mm4, %%mm0 \n\t"
- "movq %%mm0, (%0) \n\t"
- "movq (%0, %1), %%mm0 \n\t"
- "psubb %%mm4, %%mm0 \n\t"
- "movq %%mm0, (%0, %1) \n\t"
-
- : "+r" (src)
- : "r" ((x86_reg)stride), "m" (c->pQPb), "r"(tmp)
- NAMED_CONSTRAINTS_ADD(w05,w20)
- : "%"FF_REG_a
- );
-#else //TEMPLATE_PP_MMXEXT || TEMPLATE_PP_3DNOW
- const int l1= stride;
- const int l2= stride + l1;
- const int l3= stride + l2;
- const int l4= stride + l3;
- const int l5= stride + l4;
- const int l6= stride + l5;
- const int l7= stride + l6;
- const int l8= stride + l7;
-// const int l9= stride + l8;
- int x;
- src+= stride*3;
- for(x=0; x<BLOCK_SIZE; x++){
- const int middleEnergy= 5*(src[l5] - src[l4]) + 2*(src[l3] - src[l6]);
- if(FFABS(middleEnergy) < 8*c->QP){
- const int q=(src[l4] - src[l5])/2;
- const int leftEnergy= 5*(src[l3] - src[l2]) + 2*(src[l1] - src[l4]);
- const int rightEnergy= 5*(src[l7] - src[l6]) + 2*(src[l5] - src[l8]);
-
- int d= FFABS(middleEnergy) - FFMIN( FFABS(leftEnergy), FFABS(rightEnergy) );
- d= FFMAX(d, 0);
-
- d= (5*d + 32) >> 6;
- d*= FFSIGN(-middleEnergy);
-
- if(q>0){
- d = FFMAX(d, 0);
- d = FFMIN(d, q);
- }else{
- d = FFMIN(d, 0);
- d = FFMAX(d, q);
- }
-
- src[l4]-= d;
- src[l5]+= d;
- }
- src++;
- }
-#endif //TEMPLATE_PP_MMXEXT || TEMPLATE_PP_3DNOW
-}
-#endif //TEMPLATE_PP_ALTIVEC
-
-#if !TEMPLATE_PP_ALTIVEC
-static inline void RENAME(dering)(uint8_t src[], int stride, PPContext *c)
-{
-#if HAVE_7REGS && (TEMPLATE_PP_MMXEXT || TEMPLATE_PP_3DNOW)
- DECLARE_ALIGNED(8, uint64_t, tmp)[3];
- __asm__ volatile(
- "pxor %%mm6, %%mm6 \n\t"
- "pcmpeqb %%mm7, %%mm7 \n\t"
- "movq %2, %%mm0 \n\t"
- "punpcklbw %%mm6, %%mm0 \n\t"
- "psrlw $1, %%mm0 \n\t"
- "psubw %%mm7, %%mm0 \n\t"
- "packuswb %%mm0, %%mm0 \n\t"
- "movq %%mm0, %3 \n\t"
-
- "lea (%0, %1), %%"FF_REG_a" \n\t"
- "lea (%%"FF_REG_a", %1, 4), %%"FF_REG_d"\n\t"
-
-// 0 1 2 3 4 5 6 7 8 9
-// %0 eax eax+%1 eax+2%1 %0+4%1 edx edx+%1 edx+2%1 %0+8%1 edx+4%1
-
-#undef REAL_FIND_MIN_MAX
-#undef FIND_MIN_MAX
-#if TEMPLATE_PP_MMXEXT
-#define REAL_FIND_MIN_MAX(addr)\
- "movq " #addr ", %%mm0 \n\t"\
- "pminub %%mm0, %%mm7 \n\t"\
- "pmaxub %%mm0, %%mm6 \n\t"
-#else
-#define REAL_FIND_MIN_MAX(addr)\
- "movq " #addr ", %%mm0 \n\t"\
- "movq %%mm7, %%mm1 \n\t"\
- "psubusb %%mm0, %%mm6 \n\t"\
- "paddb %%mm0, %%mm6 \n\t"\
- "psubusb %%mm0, %%mm1 \n\t"\
- "psubb %%mm1, %%mm7 \n\t"
-#endif
-#define FIND_MIN_MAX(addr) REAL_FIND_MIN_MAX(addr)
-
-FIND_MIN_MAX((%%FF_REGa))
-FIND_MIN_MAX((%%FF_REGa, %1))
-FIND_MIN_MAX((%%FF_REGa, %1, 2))
-FIND_MIN_MAX((%0, %1, 4))
-FIND_MIN_MAX((%%FF_REGd))
-FIND_MIN_MAX((%%FF_REGd, %1))
-FIND_MIN_MAX((%%FF_REGd, %1, 2))
-FIND_MIN_MAX((%0, %1, 8))
-
- "movq %%mm7, %%mm4 \n\t"
- "psrlq $8, %%mm7 \n\t"
-#if TEMPLATE_PP_MMXEXT
- "pminub %%mm4, %%mm7 \n\t" // min of pixels
- "pshufw $0xF9, %%mm7, %%mm4 \n\t"
- "pminub %%mm4, %%mm7 \n\t" // min of pixels
- "pshufw $0xFE, %%mm7, %%mm4 \n\t"
- "pminub %%mm4, %%mm7 \n\t"
-#else
- "movq %%mm7, %%mm1 \n\t"
- "psubusb %%mm4, %%mm1 \n\t"
- "psubb %%mm1, %%mm7 \n\t"
- "movq %%mm7, %%mm4 \n\t"
- "psrlq $16, %%mm7 \n\t"
- "movq %%mm7, %%mm1 \n\t"
- "psubusb %%mm4, %%mm1 \n\t"
- "psubb %%mm1, %%mm7 \n\t"
- "movq %%mm7, %%mm4 \n\t"
- "psrlq $32, %%mm7 \n\t"
- "movq %%mm7, %%mm1 \n\t"
- "psubusb %%mm4, %%mm1 \n\t"
- "psubb %%mm1, %%mm7 \n\t"
-#endif
-
-
- "movq %%mm6, %%mm4 \n\t"
- "psrlq $8, %%mm6 \n\t"
-#if TEMPLATE_PP_MMXEXT
- "pmaxub %%mm4, %%mm6 \n\t" // max of pixels
- "pshufw $0xF9, %%mm6, %%mm4 \n\t"
- "pmaxub %%mm4, %%mm6 \n\t"
- "pshufw $0xFE, %%mm6, %%mm4 \n\t"
- "pmaxub %%mm4, %%mm6 \n\t"
-#else
- "psubusb %%mm4, %%mm6 \n\t"
- "paddb %%mm4, %%mm6 \n\t"
- "movq %%mm6, %%mm4 \n\t"
- "psrlq $16, %%mm6 \n\t"
- "psubusb %%mm4, %%mm6 \n\t"
- "paddb %%mm4, %%mm6 \n\t"
- "movq %%mm6, %%mm4 \n\t"
- "psrlq $32, %%mm6 \n\t"
- "psubusb %%mm4, %%mm6 \n\t"
- "paddb %%mm4, %%mm6 \n\t"
-#endif
- "movq %%mm6, %%mm0 \n\t" // max
- "psubb %%mm7, %%mm6 \n\t" // max - min
- "push %%"FF_REG_a" \n\t"
- "movd %%mm6, %%eax \n\t"
- "cmpb "MANGLE(deringThreshold)", %%al \n\t"
- "pop %%"FF_REG_a" \n\t"
- " jb 1f \n\t"
- PAVGB(%%mm0, %%mm7) // a=(max + min)/2
- "punpcklbw %%mm7, %%mm7 \n\t"
- "punpcklbw %%mm7, %%mm7 \n\t"
- "punpcklbw %%mm7, %%mm7 \n\t"
- "movq %%mm7, (%4) \n\t"
-
- "movq (%0), %%mm0 \n\t" // L10
- "movq %%mm0, %%mm1 \n\t" // L10
- "movq %%mm0, %%mm2 \n\t" // L10
- "psllq $8, %%mm1 \n\t"
- "psrlq $8, %%mm2 \n\t"
- "movd -4(%0), %%mm3 \n\t"
- "movd 8(%0), %%mm4 \n\t"
- "psrlq $24, %%mm3 \n\t"
- "psllq $56, %%mm4 \n\t"
- "por %%mm3, %%mm1 \n\t" // L00
- "por %%mm4, %%mm2 \n\t" // L20
- "movq %%mm1, %%mm3 \n\t" // L00
- PAVGB(%%mm2, %%mm1) // (L20 + L00)/2
- PAVGB(%%mm0, %%mm1) // (L20 + L00 + 2L10)/4
- "psubusb %%mm7, %%mm0 \n\t"
- "psubusb %%mm7, %%mm2 \n\t"
- "psubusb %%mm7, %%mm3 \n\t"
- "pcmpeqb "MANGLE(b00)", %%mm0 \n\t" // L10 > a ? 0 : -1
- "pcmpeqb "MANGLE(b00)", %%mm2 \n\t" // L20 > a ? 0 : -1
- "pcmpeqb "MANGLE(b00)", %%mm3 \n\t" // L00 > a ? 0 : -1
- "paddb %%mm2, %%mm0 \n\t"
- "paddb %%mm3, %%mm0 \n\t"
-
- "movq (%%"FF_REG_a"), %%mm2 \n\t" // L11
- "movq %%mm2, %%mm3 \n\t" // L11
- "movq %%mm2, %%mm4 \n\t" // L11
- "psllq $8, %%mm3 \n\t"
- "psrlq $8, %%mm4 \n\t"
- "movd -4(%%"FF_REG_a"), %%mm5 \n\t"
- "movd 8(%%"FF_REG_a"), %%mm6 \n\t"
- "psrlq $24, %%mm5 \n\t"
- "psllq $56, %%mm6 \n\t"
- "por %%mm5, %%mm3 \n\t" // L01
- "por %%mm6, %%mm4 \n\t" // L21
- "movq %%mm3, %%mm5 \n\t" // L01
- PAVGB(%%mm4, %%mm3) // (L21 + L01)/2
- PAVGB(%%mm2, %%mm3) // (L21 + L01 + 2L11)/4
- "psubusb %%mm7, %%mm2 \n\t"
- "psubusb %%mm7, %%mm4 \n\t"
- "psubusb %%mm7, %%mm5 \n\t"
- "pcmpeqb "MANGLE(b00)", %%mm2 \n\t" // L11 > a ? 0 : -1
- "pcmpeqb "MANGLE(b00)", %%mm4 \n\t" // L21 > a ? 0 : -1
- "pcmpeqb "MANGLE(b00)", %%mm5 \n\t" // L01 > a ? 0 : -1
- "paddb %%mm4, %%mm2 \n\t"
- "paddb %%mm5, %%mm2 \n\t"
-// 0, 2, 3, 1
-#define REAL_DERING_CORE(dst,src,ppsx,psx,sx,pplx,plx,lx,t0,t1) \
- "movq " #src ", " #sx " \n\t" /* src[0] */\
- "movq " #sx ", " #lx " \n\t" /* src[0] */\
- "movq " #sx ", " #t0 " \n\t" /* src[0] */\
- "psllq $8, " #lx " \n\t"\
- "psrlq $8, " #t0 " \n\t"\
- "movd -4" #src ", " #t1 " \n\t"\
- "psrlq $24, " #t1 " \n\t"\
- "por " #t1 ", " #lx " \n\t" /* src[-1] */\
- "movd 8" #src ", " #t1 " \n\t"\
- "psllq $56, " #t1 " \n\t"\
- "por " #t1 ", " #t0 " \n\t" /* src[+1] */\
- "movq " #lx ", " #t1 " \n\t" /* src[-1] */\
- PAVGB(t0, lx) /* (src[-1] + src[+1])/2 */\
- PAVGB(sx, lx) /* (src[-1] + 2src[0] + src[+1])/4 */\
- PAVGB(lx, pplx) \
- "movq " #lx ", 8(%4) \n\t"\
- "movq (%4), " #lx " \n\t"\
- "psubusb " #lx ", " #t1 " \n\t"\
- "psubusb " #lx ", " #t0 " \n\t"\
- "psubusb " #lx ", " #sx " \n\t"\
- "movq "MANGLE(b00)", " #lx " \n\t"\
- "pcmpeqb " #lx ", " #t1 " \n\t" /* src[-1] > a ? 0 : -1*/\
- "pcmpeqb " #lx ", " #t0 " \n\t" /* src[+1] > a ? 0 : -1*/\
- "pcmpeqb " #lx ", " #sx " \n\t" /* src[0] > a ? 0 : -1*/\
- "paddb " #t1 ", " #t0 " \n\t"\
- "paddb " #t0 ", " #sx " \n\t"\
-\
- PAVGB(plx, pplx) /* filtered */\
- "movq " #dst ", " #t0 " \n\t" /* dst */\
- "movq " #t0 ", " #t1 " \n\t" /* dst */\
- "psubusb %3, " #t0 " \n\t"\
- "paddusb %3, " #t1 " \n\t"\
- PMAXUB(t0, pplx)\
- PMINUB(t1, pplx, t0)\
- "paddb " #sx ", " #ppsx " \n\t"\
- "paddb " #psx ", " #ppsx " \n\t"\
- "#paddb "MANGLE(b02)", " #ppsx " \n\t"\
- "pand "MANGLE(b08)", " #ppsx " \n\t"\
- "pcmpeqb " #lx ", " #ppsx " \n\t"\
- "pand " #ppsx ", " #pplx " \n\t"\
- "pandn " #dst ", " #ppsx " \n\t"\
- "por " #pplx ", " #ppsx " \n\t"\
- "movq " #ppsx ", " #dst " \n\t"\
- "movq 8(%4), " #lx " \n\t"
-
-#define DERING_CORE(dst,src,ppsx,psx,sx,pplx,plx,lx,t0,t1) \
- REAL_DERING_CORE(dst,src,ppsx,psx,sx,pplx,plx,lx,t0,t1)
-/*
-0000000
-1111111
-
-1111110
-1111101
-1111100
-1111011
-1111010
-1111001
-
-1111000
-1110111
-
-*/
-//DERING_CORE(dst ,src ,ppsx ,psx ,sx ,pplx ,plx ,lx ,t0 ,t1)
-DERING_CORE((%%FF_REGa) ,(%%FF_REGa, %1) ,%%mm0,%%mm2,%%mm4,%%mm1,%%mm3,%%mm5,%%mm6,%%mm7)
-DERING_CORE((%%FF_REGa, %1) ,(%%FF_REGa, %1, 2),%%mm2,%%mm4,%%mm0,%%mm3,%%mm5,%%mm1,%%mm6,%%mm7)
-DERING_CORE((%%FF_REGa, %1, 2),(%0, %1, 4) ,%%mm4,%%mm0,%%mm2,%%mm5,%%mm1,%%mm3,%%mm6,%%mm7)
-DERING_CORE((%0, %1, 4) ,(%%FF_REGd) ,%%mm0,%%mm2,%%mm4,%%mm1,%%mm3,%%mm5,%%mm6,%%mm7)
-DERING_CORE((%%FF_REGd) ,(%%FF_REGd, %1) ,%%mm2,%%mm4,%%mm0,%%mm3,%%mm5,%%mm1,%%mm6,%%mm7)
-DERING_CORE((%%FF_REGd, %1) ,(%%FF_REGd, %1, 2),%%mm4,%%mm0,%%mm2,%%mm5,%%mm1,%%mm3,%%mm6,%%mm7)
-DERING_CORE((%%FF_REGd, %1, 2),(%0, %1, 8) ,%%mm0,%%mm2,%%mm4,%%mm1,%%mm3,%%mm5,%%mm6,%%mm7)
-DERING_CORE((%0, %1, 8) ,(%%FF_REGd, %1, 4),%%mm2,%%mm4,%%mm0,%%mm3,%%mm5,%%mm1,%%mm6,%%mm7)
-
- "1: \n\t"
- : : "r" (src), "r" ((x86_reg)stride), "m" (c->pQPb), "m"(c->pQPb2), "q"(tmp)
- NAMED_CONSTRAINTS_ADD(deringThreshold,b00,b02,b08)
- : "%"FF_REG_a, "%"FF_REG_d
- );
-#else // HAVE_7REGS && (TEMPLATE_PP_MMXEXT || TEMPLATE_PP_3DNOW)
- int y;
- int min=255;
- int max=0;
- int avg;
- uint8_t *p;
- int s[10];
- const int QP2= c->QP/2 + 1;
-
- src --;
- for(y=1; y<9; y++){
- int x;
- p= src + stride*y;
- for(x=1; x<9; x++){
- p++;
- if(*p > max) max= *p;
- if(*p < min) min= *p;
- }
- }
- avg= (min + max + 1)>>1;
-
- if(max - min <deringThreshold) return;
-
- for(y=0; y<10; y++){
- int t = 0;
-
- if(src[stride*y + 0] > avg) t+= 1;
- if(src[stride*y + 1] > avg) t+= 2;
- if(src[stride*y + 2] > avg) t+= 4;
- if(src[stride*y + 3] > avg) t+= 8;
- if(src[stride*y + 4] > avg) t+= 16;
- if(src[stride*y + 5] > avg) t+= 32;
- if(src[stride*y + 6] > avg) t+= 64;
- if(src[stride*y + 7] > avg) t+= 128;
- if(src[stride*y + 8] > avg) t+= 256;
- if(src[stride*y + 9] > avg) t+= 512;
-
- t |= (~t)<<16;
- t &= (t<<1) & (t>>1);
- s[y] = t;
- }
-
- for(y=1; y<9; y++){
- int t = s[y-1] & s[y] & s[y+1];
- t|= t>>16;
- s[y-1]= t;
- }
-
- for(y=1; y<9; y++){
- int x;
- int t = s[y-1];
-
- p= src + stride*y;
- for(x=1; x<9; x++){
- p++;
- if(t & (1<<x)){
- int f= (*(p-stride-1)) + 2*(*(p-stride)) + (*(p-stride+1))
- +2*(*(p -1)) + 4*(*p ) + 2*(*(p +1))
- +(*(p+stride-1)) + 2*(*(p+stride)) + (*(p+stride+1));
- f= (f + 8)>>4;
-
-#ifdef DEBUG_DERING_THRESHOLD
- __asm__ volatile("emms\n\t":);
- {
- static uint64_t numPixels=0;
- if(x!=1 && x!=8 && y!=1 && y!=8) numPixels++;
-// if((max-min)<20 || (max-min)*QP<200)
-// if((max-min)*QP < 500)
-// if(max-min<QP/2)
- if(max-min < 20){
- static int numSkipped=0;
- static int errorSum=0;
- static int worstQP=0;
- static int worstRange=0;
- static int worstDiff=0;
- int diff= (f - *p);
- int absDiff= FFABS(diff);
- int error= diff*diff;
-
- if(x==1 || x==8 || y==1 || y==8) continue;
-
- numSkipped++;
- if(absDiff > worstDiff){
- worstDiff= absDiff;
- worstQP= QP;
- worstRange= max-min;
- }
- errorSum+= error;
-
- if(1024LL*1024LL*1024LL % numSkipped == 0){
- av_log(c, AV_LOG_INFO, "sum:%1.3f, skip:%d, wQP:%d, "
- "wRange:%d, wDiff:%d, relSkip:%1.3f\n",
- (float)errorSum/numSkipped, numSkipped, worstQP, worstRange,
- worstDiff, (float)numSkipped/numPixels);
- }
- }
- }
-#endif
- if (*p + QP2 < f) *p= *p + QP2;
- else if(*p - QP2 > f) *p= *p - QP2;
- else *p=f;
- }
- }
- }
-#ifdef DEBUG_DERING_THRESHOLD
- if(max-min < 20){
- for(y=1; y<9; y++){
- int x;
- int t = 0;
- p= src + stride*y;
- for(x=1; x<9; x++){
- p++;
- *p = FFMIN(*p + 20, 255);
- }
- }
-// src[0] = src[7]=src[stride*7]=src[stride*7 + 7]=255;
- }
-#endif
-#endif //TEMPLATE_PP_MMXEXT || TEMPLATE_PP_3DNOW
-}
-#endif //TEMPLATE_PP_ALTIVEC
-
-/**
- * Deinterlace the given block by linearly interpolating every second line.
- * will be called for every 8x8 block and can read & write from line 4-15
- * lines 0-3 have been passed through the deblock / dering filters already, but can be read, too.
- * lines 4-12 will be read into the deblocking filter and should be deinterlaced
- */
-static inline void RENAME(deInterlaceInterpolateLinear)(uint8_t src[], int stride)
-{
-#if TEMPLATE_PP_MMXEXT || TEMPLATE_PP_3DNOW
- src+= 4*stride;
- __asm__ volatile(
- "lea (%0, %1), %%"FF_REG_a" \n\t"
- "lea (%%"FF_REG_a", %1, 4), %%"FF_REG_c"\n\t"
-// 0 1 2 3 4 5 6 7 8 9
-// %0 eax eax+%1 eax+2%1 %0+4%1 ecx ecx+%1 ecx+2%1 %0+8%1 ecx+4%1
-
- "movq (%0), %%mm0 \n\t"
- "movq (%%"FF_REG_a", %1), %%mm1 \n\t"
- PAVGB(%%mm1, %%mm0)
- "movq %%mm0, (%%"FF_REG_a") \n\t"
- "movq (%0, %1, 4), %%mm0 \n\t"
- PAVGB(%%mm0, %%mm1)
- "movq %%mm1, (%%"FF_REG_a", %1, 2) \n\t"
- "movq (%%"FF_REG_c", %1), %%mm1 \n\t"
- PAVGB(%%mm1, %%mm0)
- "movq %%mm0, (%%"FF_REG_c") \n\t"
- "movq (%0, %1, 8), %%mm0 \n\t"
- PAVGB(%%mm0, %%mm1)
- "movq %%mm1, (%%"FF_REG_c", %1, 2) \n\t"
-
- : : "r" (src), "r" ((x86_reg)stride)
- : "%"FF_REG_a, "%"FF_REG_c
- );
-#else
- int a, b, x;
- src+= 4*stride;
-
- for(x=0; x<2; x++){
- a= *(uint32_t*)&src[stride*0];
- b= *(uint32_t*)&src[stride*2];
- *(uint32_t*)&src[stride*1]= (a|b) - (((a^b)&0xFEFEFEFEUL)>>1);
- a= *(uint32_t*)&src[stride*4];
- *(uint32_t*)&src[stride*3]= (a|b) - (((a^b)&0xFEFEFEFEUL)>>1);
- b= *(uint32_t*)&src[stride*6];
- *(uint32_t*)&src[stride*5]= (a|b) - (((a^b)&0xFEFEFEFEUL)>>1);
- a= *(uint32_t*)&src[stride*8];
- *(uint32_t*)&src[stride*7]= (a|b) - (((a^b)&0xFEFEFEFEUL)>>1);
- src += 4;
- }
-#endif
-}
-
-/**
- * Deinterlace the given block by cubic interpolating every second line.
- * will be called for every 8x8 block and can read & write from line 4-15
- * lines 0-3 have been passed through the deblock / dering filters already, but can be read, too.
- * lines 4-12 will be read into the deblocking filter and should be deinterlaced
- * this filter will read lines 3-15 and write 7-13
- */
-static inline void RENAME(deInterlaceInterpolateCubic)(uint8_t src[], int stride)
-{
-#if TEMPLATE_PP_SSE2 || TEMPLATE_PP_MMXEXT || TEMPLATE_PP_3DNOW
- src+= stride*3;
- __asm__ volatile(
- "lea (%0, %1), %%"FF_REG_a" \n\t"
- "lea (%%"FF_REG_a", %1, 4), %%"FF_REG_d"\n\t"
- "lea (%%"FF_REG_d", %1, 4), %%"FF_REG_c"\n\t"
- "add %1, %%"FF_REG_c" \n\t"
-#if TEMPLATE_PP_SSE2
- "pxor %%xmm7, %%xmm7 \n\t"
-#define REAL_DEINT_CUBIC(a,b,c,d,e)\
- "movq " #a ", %%xmm0 \n\t"\
- "movq " #b ", %%xmm1 \n\t"\
- "movq " #d ", %%xmm2 \n\t"\
- "movq " #e ", %%xmm3 \n\t"\
- "pavgb %%xmm2, %%xmm1 \n\t"\
- "pavgb %%xmm3, %%xmm0 \n\t"\
- "punpcklbw %%xmm7, %%xmm0 \n\t"\
- "punpcklbw %%xmm7, %%xmm1 \n\t"\
- "psubw %%xmm1, %%xmm0 \n\t"\
- "psraw $3, %%xmm0 \n\t"\
- "psubw %%xmm0, %%xmm1 \n\t"\
- "packuswb %%xmm1, %%xmm1 \n\t"\
- "movlps %%xmm1, " #c " \n\t"
-#else //TEMPLATE_PP_SSE2
- "pxor %%mm7, %%mm7 \n\t"
-// 0 1 2 3 4 5 6 7 8 9 10
-// %0 eax eax+%1 eax+2%1 %0+4%1 edx edx+%1 edx+2%1 %0+8%1 edx+4%1 ecx
-
-#define REAL_DEINT_CUBIC(a,b,c,d,e)\
- "movq " #a ", %%mm0 \n\t"\
- "movq " #b ", %%mm1 \n\t"\
- "movq " #d ", %%mm2 \n\t"\
- "movq " #e ", %%mm3 \n\t"\
- PAVGB(%%mm2, %%mm1) /* (b+d) /2 */\
- PAVGB(%%mm3, %%mm0) /* (a+e) /2 */\
- "movq %%mm0, %%mm2 \n\t"\
- "punpcklbw %%mm7, %%mm0 \n\t"\
- "punpckhbw %%mm7, %%mm2 \n\t"\
- "movq %%mm1, %%mm3 \n\t"\
- "punpcklbw %%mm7, %%mm1 \n\t"\
- "punpckhbw %%mm7, %%mm3 \n\t"\
- "psubw %%mm1, %%mm0 \n\t" /* L(a+e - (b+d))/2 */\
- "psubw %%mm3, %%mm2 \n\t" /* H(a+e - (b+d))/2 */\
- "psraw $3, %%mm0 \n\t" /* L(a+e - (b+d))/16 */\
- "psraw $3, %%mm2 \n\t" /* H(a+e - (b+d))/16 */\
- "psubw %%mm0, %%mm1 \n\t" /* L(9b + 9d - a - e)/16 */\
- "psubw %%mm2, %%mm3 \n\t" /* H(9b + 9d - a - e)/16 */\
- "packuswb %%mm3, %%mm1 \n\t"\
- "movq %%mm1, " #c " \n\t"
-#endif //TEMPLATE_PP_SSE2
-#define DEINT_CUBIC(a,b,c,d,e) REAL_DEINT_CUBIC(a,b,c,d,e)
-
-DEINT_CUBIC((%0) , (%%FF_REGa, %1), (%%FF_REGa, %1, 2), (%0, %1, 4) , (%%FF_REGd, %1))
-DEINT_CUBIC((%%FF_REGa, %1), (%0, %1, 4) , (%%FF_REGd) , (%%FF_REGd, %1), (%0, %1, 8))
-DEINT_CUBIC((%0, %1, 4) , (%%FF_REGd, %1), (%%FF_REGd, %1, 2), (%0, %1, 8) , (%%FF_REGc))
-DEINT_CUBIC((%%FF_REGd, %1), (%0, %1, 8) , (%%FF_REGd, %1, 4), (%%FF_REGc) , (%%FF_REGc, %1, 2))
-
- : : "r" (src), "r" ((x86_reg)stride)
- :
-#if TEMPLATE_PP_SSE2
- XMM_CLOBBERS("%xmm0", "%xmm1", "%xmm2", "%xmm3", "%xmm7",)
-#endif
- "%"FF_REG_a, "%"FF_REG_d, "%"FF_REG_c
- );
-#undef REAL_DEINT_CUBIC
-#else //TEMPLATE_PP_SSE2 || TEMPLATE_PP_MMXEXT || TEMPLATE_PP_3DNOW
- int x;
- src+= stride*3;
- for(x=0; x<8; x++){
- src[stride*3] = av_clip_uint8((-src[0] + 9*src[stride*2] + 9*src[stride*4] - src[stride*6])>>4);
- src[stride*5] = av_clip_uint8((-src[stride*2] + 9*src[stride*4] + 9*src[stride*6] - src[stride*8])>>4);
- src[stride*7] = av_clip_uint8((-src[stride*4] + 9*src[stride*6] + 9*src[stride*8] - src[stride*10])>>4);
- src[stride*9] = av_clip_uint8((-src[stride*6] + 9*src[stride*8] + 9*src[stride*10] - src[stride*12])>>4);
- src++;
- }
-#endif //TEMPLATE_PP_SSE2 || TEMPLATE_PP_MMXEXT || TEMPLATE_PP_3DNOW
-}
-
-/**
- * Deinterlace the given block by filtering every second line with a (-1 4 2 4 -1) filter.
- * will be called for every 8x8 block and can read & write from line 4-15
- * lines 0-3 have been passed through the deblock / dering filters already, but can be read, too.
- * lines 4-12 will be read into the deblocking filter and should be deinterlaced
- * this filter will read lines 4-13 and write 5-11
- */
-static inline void RENAME(deInterlaceFF)(uint8_t src[], int stride, uint8_t *tmp)
-{
-#if TEMPLATE_PP_MMXEXT || TEMPLATE_PP_3DNOW
- src+= stride*4;
- __asm__ volatile(
- "lea (%0, %1), %%"FF_REG_a" \n\t"
- "lea (%%"FF_REG_a", %1, 4), %%"FF_REG_d"\n\t"
- "pxor %%mm7, %%mm7 \n\t"
- "movq (%2), %%mm0 \n\t"
-// 0 1 2 3 4 5 6 7 8 9 10
-// %0 eax eax+%1 eax+2%1 %0+4%1 edx edx+%1 edx+2%1 %0+8%1 edx+4%1 ecx
-
-#define REAL_DEINT_FF(a,b,c,d)\
- "movq " #a ", %%mm1 \n\t"\
- "movq " #b ", %%mm2 \n\t"\
- "movq " #c ", %%mm3 \n\t"\
- "movq " #d ", %%mm4 \n\t"\
- PAVGB(%%mm3, %%mm1) \
- PAVGB(%%mm4, %%mm0) \
- "movq %%mm0, %%mm3 \n\t"\
- "punpcklbw %%mm7, %%mm0 \n\t"\
- "punpckhbw %%mm7, %%mm3 \n\t"\
- "movq %%mm1, %%mm4 \n\t"\
- "punpcklbw %%mm7, %%mm1 \n\t"\
- "punpckhbw %%mm7, %%mm4 \n\t"\
- "psllw $2, %%mm1 \n\t"\
- "psllw $2, %%mm4 \n\t"\
- "psubw %%mm0, %%mm1 \n\t"\
- "psubw %%mm3, %%mm4 \n\t"\
- "movq %%mm2, %%mm5 \n\t"\
- "movq %%mm2, %%mm0 \n\t"\
- "punpcklbw %%mm7, %%mm2 \n\t"\
- "punpckhbw %%mm7, %%mm5 \n\t"\
- "paddw %%mm2, %%mm1 \n\t"\
- "paddw %%mm5, %%mm4 \n\t"\
- "psraw $2, %%mm1 \n\t"\
- "psraw $2, %%mm4 \n\t"\
- "packuswb %%mm4, %%mm1 \n\t"\
- "movq %%mm1, " #b " \n\t"\
-
-#define DEINT_FF(a,b,c,d) REAL_DEINT_FF(a,b,c,d)
-
-DEINT_FF((%0) , (%%FF_REGa) , (%%FF_REGa, %1), (%%FF_REGa, %1, 2))
-DEINT_FF((%%FF_REGa, %1), (%%FF_REGa, %1, 2), (%0, %1, 4) , (%%FF_REGd) )
-DEINT_FF((%0, %1, 4) , (%%FF_REGd) , (%%FF_REGd, %1), (%%FF_REGd, %1, 2))
-DEINT_FF((%%FF_REGd, %1), (%%FF_REGd, %1, 2), (%0, %1, 8) , (%%FF_REGd, %1, 4))
-
- "movq %%mm0, (%2) \n\t"
- : : "r" (src), "r" ((x86_reg)stride), "r"(tmp)
- : "%"FF_REG_a, "%"FF_REG_d
- );
-#else //TEMPLATE_PP_MMXEXT || TEMPLATE_PP_3DNOW
- int x;
- src+= stride*4;
- for(x=0; x<8; x++){
- int t1= tmp[x];
- int t2= src[stride*1];
-
- src[stride*1]= av_clip_uint8((-t1 + 4*src[stride*0] + 2*t2 + 4*src[stride*2] - src[stride*3] + 4)>>3);
- t1= src[stride*4];
- src[stride*3]= av_clip_uint8((-t2 + 4*src[stride*2] + 2*t1 + 4*src[stride*4] - src[stride*5] + 4)>>3);
- t2= src[stride*6];
- src[stride*5]= av_clip_uint8((-t1 + 4*src[stride*4] + 2*t2 + 4*src[stride*6] - src[stride*7] + 4)>>3);
- t1= src[stride*8];
- src[stride*7]= av_clip_uint8((-t2 + 4*src[stride*6] + 2*t1 + 4*src[stride*8] - src[stride*9] + 4)>>3);
- tmp[x]= t1;
-
- src++;
- }
-#endif //TEMPLATE_PP_MMXEXT || TEMPLATE_PP_3DNOW
-}
-
-/**
- * Deinterlace the given block by filtering every line with a (-1 2 6 2 -1) filter.
- * will be called for every 8x8 block and can read & write from line 4-15
- * lines 0-3 have been passed through the deblock / dering filters already, but can be read, too.
- * lines 4-12 will be read into the deblocking filter and should be deinterlaced
- * this filter will read lines 4-13 and write 4-11
- */
-static inline void RENAME(deInterlaceL5)(uint8_t src[], int stride, uint8_t *tmp, uint8_t *tmp2)
-{
-#if (TEMPLATE_PP_MMXEXT || TEMPLATE_PP_3DNOW) && HAVE_6REGS
- src+= stride*4;
- __asm__ volatile(
- "lea (%0, %1), %%"FF_REG_a" \n\t"
- "lea (%%"FF_REG_a", %1, 4), %%"FF_REG_d"\n\t"
- "pxor %%mm7, %%mm7 \n\t"
- "movq (%2), %%mm0 \n\t"
- "movq (%3), %%mm1 \n\t"
-// 0 1 2 3 4 5 6 7 8 9 10
-// %0 eax eax+%1 eax+2%1 %0+4%1 edx edx+%1 edx+2%1 %0+8%1 edx+4%1 ecx
-
-#define REAL_DEINT_L5(t1,t2,a,b,c)\
- "movq " #a ", %%mm2 \n\t"\
- "movq " #b ", %%mm3 \n\t"\
- "movq " #c ", %%mm4 \n\t"\
- PAVGB(t2, %%mm3) \
- PAVGB(t1, %%mm4) \
- "movq %%mm2, %%mm5 \n\t"\
- "movq %%mm2, " #t1 " \n\t"\
- "punpcklbw %%mm7, %%mm2 \n\t"\
- "punpckhbw %%mm7, %%mm5 \n\t"\
- "movq %%mm2, %%mm6 \n\t"\
- "paddw %%mm2, %%mm2 \n\t"\
- "paddw %%mm6, %%mm2 \n\t"\
- "movq %%mm5, %%mm6 \n\t"\
- "paddw %%mm5, %%mm5 \n\t"\
- "paddw %%mm6, %%mm5 \n\t"\
- "movq %%mm3, %%mm6 \n\t"\
- "punpcklbw %%mm7, %%mm3 \n\t"\
- "punpckhbw %%mm7, %%mm6 \n\t"\
- "paddw %%mm3, %%mm3 \n\t"\
- "paddw %%mm6, %%mm6 \n\t"\
- "paddw %%mm3, %%mm2 \n\t"\
- "paddw %%mm6, %%mm5 \n\t"\
- "movq %%mm4, %%mm6 \n\t"\
- "punpcklbw %%mm7, %%mm4 \n\t"\
- "punpckhbw %%mm7, %%mm6 \n\t"\
- "psubw %%mm4, %%mm2 \n\t"\
- "psubw %%mm6, %%mm5 \n\t"\
- "psraw $2, %%mm2 \n\t"\
- "psraw $2, %%mm5 \n\t"\
- "packuswb %%mm5, %%mm2 \n\t"\
- "movq %%mm2, " #a " \n\t"\
-
-#define DEINT_L5(t1,t2,a,b,c) REAL_DEINT_L5(t1,t2,a,b,c)
-
-DEINT_L5(%%mm0, %%mm1, (%0) , (%%FF_REGa) , (%%FF_REGa, %1) )
-DEINT_L5(%%mm1, %%mm0, (%%FF_REGa) , (%%FF_REGa, %1) , (%%FF_REGa, %1, 2))
-DEINT_L5(%%mm0, %%mm1, (%%FF_REGa, %1) , (%%FF_REGa, %1, 2), (%0, %1, 4) )
-DEINT_L5(%%mm1, %%mm0, (%%FF_REGa, %1, 2), (%0, %1, 4) , (%%FF_REGd) )
-DEINT_L5(%%mm0, %%mm1, (%0, %1, 4) , (%%FF_REGd) , (%%FF_REGd, %1) )
-DEINT_L5(%%mm1, %%mm0, (%%FF_REGd) , (%%FF_REGd, %1) , (%%FF_REGd, %1, 2))
-DEINT_L5(%%mm0, %%mm1, (%%FF_REGd, %1) , (%%FF_REGd, %1, 2), (%0, %1, 8) )
-DEINT_L5(%%mm1, %%mm0, (%%FF_REGd, %1, 2), (%0, %1, 8) , (%%FF_REGd, %1, 4))
-
- "movq %%mm0, (%2) \n\t"
- "movq %%mm1, (%3) \n\t"
- : : "r" (src), "r" ((x86_reg)stride), "r"(tmp), "r"(tmp2)
- : "%"FF_REG_a, "%"FF_REG_d
- );
-#else //(TEMPLATE_PP_MMXEXT || TEMPLATE_PP_3DNOW) && HAVE_6REGS
- int x;
- src+= stride*4;
- for(x=0; x<8; x++){
- int t1= tmp[x];
- int t2= tmp2[x];
- int t3= src[0];
-
- src[stride*0]= av_clip_uint8((-(t1 + src[stride*2]) + 2*(t2 + src[stride*1]) + 6*t3 + 4)>>3);
- t1= src[stride*1];
- src[stride*1]= av_clip_uint8((-(t2 + src[stride*3]) + 2*(t3 + src[stride*2]) + 6*t1 + 4)>>3);
- t2= src[stride*2];
- src[stride*2]= av_clip_uint8((-(t3 + src[stride*4]) + 2*(t1 + src[stride*3]) + 6*t2 + 4)>>3);
- t3= src[stride*3];
- src[stride*3]= av_clip_uint8((-(t1 + src[stride*5]) + 2*(t2 + src[stride*4]) + 6*t3 + 4)>>3);
- t1= src[stride*4];
- src[stride*4]= av_clip_uint8((-(t2 + src[stride*6]) + 2*(t3 + src[stride*5]) + 6*t1 + 4)>>3);
- t2= src[stride*5];
- src[stride*5]= av_clip_uint8((-(t3 + src[stride*7]) + 2*(t1 + src[stride*6]) + 6*t2 + 4)>>3);
- t3= src[stride*6];
- src[stride*6]= av_clip_uint8((-(t1 + src[stride*8]) + 2*(t2 + src[stride*7]) + 6*t3 + 4)>>3);
- t1= src[stride*7];
- src[stride*7]= av_clip_uint8((-(t2 + src[stride*9]) + 2*(t3 + src[stride*8]) + 6*t1 + 4)>>3);
-
- tmp[x]= t3;
- tmp2[x]= t1;
-
- src++;
- }
-#endif //(TEMPLATE_PP_MMXEXT || TEMPLATE_PP_3DNOW) && HAVE_6REGS
-}
-
-/**
- * Deinterlace the given block by filtering all lines with a (1 2 1) filter.
- * will be called for every 8x8 block and can read & write from line 4-15
- * lines 0-3 have been passed through the deblock / dering filters already, but can be read, too.
- * lines 4-12 will be read into the deblocking filter and should be deinterlaced
- * this filter will read lines 4-13 and write 4-11
- */
-static inline void RENAME(deInterlaceBlendLinear)(uint8_t src[], int stride, uint8_t *tmp)
-{
-#if TEMPLATE_PP_MMXEXT || TEMPLATE_PP_3DNOW
- src+= 4*stride;
- __asm__ volatile(
- "lea (%0, %1), %%"FF_REG_a" \n\t"
- "lea (%%"FF_REG_a", %1, 4), %%"FF_REG_d"\n\t"
-// 0 1 2 3 4 5 6 7 8 9
-// %0 eax eax+%1 eax+2%1 %0+4%1 edx edx+%1 edx+2%1 %0+8%1 edx+4%1
-
- "movq (%2), %%mm0 \n\t" // L0
- "movq (%%"FF_REG_a"), %%mm1 \n\t" // L2
- PAVGB(%%mm1, %%mm0) // L0+L2
- "movq (%0), %%mm2 \n\t" // L1
- PAVGB(%%mm2, %%mm0)
- "movq %%mm0, (%0) \n\t"
- "movq (%%"FF_REG_a", %1), %%mm0 \n\t" // L3
- PAVGB(%%mm0, %%mm2) // L1+L3
- PAVGB(%%mm1, %%mm2) // 2L2 + L1 + L3
- "movq %%mm2, (%%"FF_REG_a") \n\t"
- "movq (%%"FF_REG_a", %1, 2), %%mm2 \n\t" // L4
- PAVGB(%%mm2, %%mm1) // L2+L4
- PAVGB(%%mm0, %%mm1) // 2L3 + L2 + L4
- "movq %%mm1, (%%"FF_REG_a", %1) \n\t"
- "movq (%0, %1, 4), %%mm1 \n\t" // L5
- PAVGB(%%mm1, %%mm0) // L3+L5
- PAVGB(%%mm2, %%mm0) // 2L4 + L3 + L5
- "movq %%mm0, (%%"FF_REG_a", %1, 2) \n\t"
- "movq (%%"FF_REG_d"), %%mm0 \n\t" // L6
- PAVGB(%%mm0, %%mm2) // L4+L6
- PAVGB(%%mm1, %%mm2) // 2L5 + L4 + L6
- "movq %%mm2, (%0, %1, 4) \n\t"
- "movq (%%"FF_REG_d", %1), %%mm2 \n\t" // L7
- PAVGB(%%mm2, %%mm1) // L5+L7
- PAVGB(%%mm0, %%mm1) // 2L6 + L5 + L7
- "movq %%mm1, (%%"FF_REG_d") \n\t"
- "movq (%%"FF_REG_d", %1, 2), %%mm1 \n\t" // L8
- PAVGB(%%mm1, %%mm0) // L6+L8
- PAVGB(%%mm2, %%mm0) // 2L7 + L6 + L8
- "movq %%mm0, (%%"FF_REG_d", %1) \n\t"
- "movq (%0, %1, 8), %%mm0 \n\t" // L9
- PAVGB(%%mm0, %%mm2) // L7+L9
- PAVGB(%%mm1, %%mm2) // 2L8 + L7 + L9
- "movq %%mm2, (%%"FF_REG_d", %1, 2) \n\t"
- "movq %%mm1, (%2) \n\t"
-
- : : "r" (src), "r" ((x86_reg)stride), "r" (tmp)
- : "%"FF_REG_a, "%"FF_REG_d
- );
-#else //TEMPLATE_PP_MMXEXT || TEMPLATE_PP_3DNOW
- int a, b, c, x;
- src+= 4*stride;
-
- for(x=0; x<2; x++){
- a= *(uint32_t*)&tmp[stride*0];
- b= *(uint32_t*)&src[stride*0];
- c= *(uint32_t*)&src[stride*1];
- a= (a&c) + (((a^c)&0xFEFEFEFEUL)>>1);
- *(uint32_t*)&src[stride*0]= (a|b) - (((a^b)&0xFEFEFEFEUL)>>1);
-
- a= *(uint32_t*)&src[stride*2];
- b= (a&b) + (((a^b)&0xFEFEFEFEUL)>>1);
- *(uint32_t*)&src[stride*1]= (c|b) - (((c^b)&0xFEFEFEFEUL)>>1);
-
- b= *(uint32_t*)&src[stride*3];
- c= (b&c) + (((b^c)&0xFEFEFEFEUL)>>1);
- *(uint32_t*)&src[stride*2]= (c|a) - (((c^a)&0xFEFEFEFEUL)>>1);
-
- c= *(uint32_t*)&src[stride*4];
- a= (a&c) + (((a^c)&0xFEFEFEFEUL)>>1);
- *(uint32_t*)&src[stride*3]= (a|b) - (((a^b)&0xFEFEFEFEUL)>>1);
-
- a= *(uint32_t*)&src[stride*5];
- b= (a&b) + (((a^b)&0xFEFEFEFEUL)>>1);
- *(uint32_t*)&src[stride*4]= (c|b) - (((c^b)&0xFEFEFEFEUL)>>1);
-
- b= *(uint32_t*)&src[stride*6];
- c= (b&c) + (((b^c)&0xFEFEFEFEUL)>>1);
- *(uint32_t*)&src[stride*5]= (c|a) - (((c^a)&0xFEFEFEFEUL)>>1);
-
- c= *(uint32_t*)&src[stride*7];
- a= (a&c) + (((a^c)&0xFEFEFEFEUL)>>1);
- *(uint32_t*)&src[stride*6]= (a|b) - (((a^b)&0xFEFEFEFEUL)>>1);
-
- a= *(uint32_t*)&src[stride*8];
- b= (a&b) + (((a^b)&0xFEFEFEFEUL)>>1);
- *(uint32_t*)&src[stride*7]= (c|b) - (((c^b)&0xFEFEFEFEUL)>>1);
-
- *(uint32_t*)&tmp[stride*0]= c;
- src += 4;
- tmp += 4;
- }
-#endif //TEMPLATE_PP_MMXEXT || TEMPLATE_PP_3DNOW
-}
-
-/**
- * Deinterlace the given block by applying a median filter to every second line.
- * will be called for every 8x8 block and can read & write from line 4-15,
- * lines 0-3 have been passed through the deblock / dering filters already, but can be read, too.
- * lines 4-12 will be read into the deblocking filter and should be deinterlaced
- */
-static inline void RENAME(deInterlaceMedian)(uint8_t src[], int stride)
-{
-#if TEMPLATE_PP_MMX
- src+= 4*stride;
-#if TEMPLATE_PP_MMXEXT
- __asm__ volatile(
- "lea (%0, %1), %%"FF_REG_a" \n\t"
- "lea (%%"FF_REG_a", %1, 4), %%"FF_REG_d"\n\t"
-// 0 1 2 3 4 5 6 7 8 9
-// %0 eax eax+%1 eax+2%1 %0+4%1 edx edx+%1 edx+2%1 %0+8%1 edx+4%1
-
- "movq (%0), %%mm0 \n\t"
- "movq (%%"FF_REG_a", %1), %%mm2 \n\t"
- "movq (%%"FF_REG_a"), %%mm1 \n\t"
- "movq %%mm0, %%mm3 \n\t"
- "pmaxub %%mm1, %%mm0 \n\t"
- "pminub %%mm3, %%mm1 \n\t"
- "pmaxub %%mm2, %%mm1 \n\t"
- "pminub %%mm1, %%mm0 \n\t"
- "movq %%mm0, (%%"FF_REG_a") \n\t"
-
- "movq (%0, %1, 4), %%mm0 \n\t"
- "movq (%%"FF_REG_a", %1, 2), %%mm1 \n\t"
- "movq %%mm2, %%mm3 \n\t"
- "pmaxub %%mm1, %%mm2 \n\t"
- "pminub %%mm3, %%mm1 \n\t"
- "pmaxub %%mm0, %%mm1 \n\t"
- "pminub %%mm1, %%mm2 \n\t"
- "movq %%mm2, (%%"FF_REG_a", %1, 2) \n\t"
-
- "movq (%%"FF_REG_d"), %%mm2 \n\t"
- "movq (%%"FF_REG_d", %1), %%mm1 \n\t"
- "movq %%mm2, %%mm3 \n\t"
- "pmaxub %%mm0, %%mm2 \n\t"
- "pminub %%mm3, %%mm0 \n\t"
- "pmaxub %%mm1, %%mm0 \n\t"
- "pminub %%mm0, %%mm2 \n\t"
- "movq %%mm2, (%%"FF_REG_d") \n\t"
-
- "movq (%%"FF_REG_d", %1, 2), %%mm2 \n\t"
- "movq (%0, %1, 8), %%mm0 \n\t"
- "movq %%mm2, %%mm3 \n\t"
- "pmaxub %%mm0, %%mm2 \n\t"
- "pminub %%mm3, %%mm0 \n\t"
- "pmaxub %%mm1, %%mm0 \n\t"
- "pminub %%mm0, %%mm2 \n\t"
- "movq %%mm2, (%%"FF_REG_d", %1, 2) \n\t"
-
-
- : : "r" (src), "r" ((x86_reg)stride)
- : "%"FF_REG_a, "%"FF_REG_d
- );
-
-#else // MMX without MMX2
- __asm__ volatile(
- "lea (%0, %1), %%"FF_REG_a" \n\t"
- "lea (%%"FF_REG_a", %1, 4), %%"FF_REG_d"\n\t"
-// 0 1 2 3 4 5 6 7 8 9
-// %0 eax eax+%1 eax+2%1 %0+4%1 edx edx+%1 edx+2%1 %0+8%1 edx+4%1
- "pxor %%mm7, %%mm7 \n\t"
-
-#define REAL_MEDIAN(a,b,c)\
- "movq " #a ", %%mm0 \n\t"\
- "movq " #b ", %%mm2 \n\t"\
- "movq " #c ", %%mm1 \n\t"\
- "movq %%mm0, %%mm3 \n\t"\
- "movq %%mm1, %%mm4 \n\t"\
- "movq %%mm2, %%mm5 \n\t"\
- "psubusb %%mm1, %%mm3 \n\t"\
- "psubusb %%mm2, %%mm4 \n\t"\
- "psubusb %%mm0, %%mm5 \n\t"\
- "pcmpeqb %%mm7, %%mm3 \n\t"\
- "pcmpeqb %%mm7, %%mm4 \n\t"\
- "pcmpeqb %%mm7, %%mm5 \n\t"\
- "movq %%mm3, %%mm6 \n\t"\
- "pxor %%mm4, %%mm3 \n\t"\
- "pxor %%mm5, %%mm4 \n\t"\
- "pxor %%mm6, %%mm5 \n\t"\
- "por %%mm3, %%mm1 \n\t"\
- "por %%mm4, %%mm2 \n\t"\
- "por %%mm5, %%mm0 \n\t"\
- "pand %%mm2, %%mm0 \n\t"\
- "pand %%mm1, %%mm0 \n\t"\
- "movq %%mm0, " #b " \n\t"
-#define MEDIAN(a,b,c) REAL_MEDIAN(a,b,c)
-
-MEDIAN((%0) , (%%FF_REGa) , (%%FF_REGa, %1))
-MEDIAN((%%FF_REGa, %1), (%%FF_REGa, %1, 2), (%0, %1, 4))
-MEDIAN((%0, %1, 4) , (%%FF_REGd) , (%%FF_REGd, %1))
-MEDIAN((%%FF_REGd, %1), (%%FF_REGd, %1, 2), (%0, %1, 8))
-
- : : "r" (src), "r" ((x86_reg)stride)
- : "%"FF_REG_a, "%"FF_REG_d
- );
-#endif //TEMPLATE_PP_MMXEXT
-#else //TEMPLATE_PP_MMX
- int x, y;
- src+= 4*stride;
- // FIXME - there should be a way to do a few columns in parallel like w/mmx
- for(x=0; x<8; x++){
- uint8_t *colsrc = src;
- for (y=0; y<4; y++){
- int a, b, c, d, e, f;
- a = colsrc[0 ];
- b = colsrc[stride ];
- c = colsrc[stride*2];
- d = (a-b)>>31;
- e = (b-c)>>31;
- f = (c-a)>>31;
- colsrc[stride ] = (a|(d^f)) & (b|(d^e)) & (c|(e^f));
- colsrc += stride*2;
- }
- src++;
- }
-#endif //TEMPLATE_PP_MMX
-}
-
-#if TEMPLATE_PP_MMX
-/**
- * Transpose and shift the given 8x8 Block into dst1 and dst2.
- */
-static inline void RENAME(transpose1)(uint8_t *dst1, uint8_t *dst2, const uint8_t *src, int srcStride)
-{
- __asm__(
- "lea (%0, %1), %%"FF_REG_a" \n\t"
-// 0 1 2 3 4 5 6 7 8 9
-// %0 eax eax+%1 eax+2%1 %0+4%1 edx edx+%1 edx+2%1 %0+8%1 edx+4%1
- "movq (%0), %%mm0 \n\t" // 12345678
- "movq (%%"FF_REG_a"), %%mm1 \n\t" // abcdefgh
- "movq %%mm0, %%mm2 \n\t" // 12345678
- "punpcklbw %%mm1, %%mm0 \n\t" // 1a2b3c4d
- "punpckhbw %%mm1, %%mm2 \n\t" // 5e6f7g8h
-
- "movq (%%"FF_REG_a", %1), %%mm1 \n\t"
- "movq (%%"FF_REG_a", %1, 2), %%mm3 \n\t"
- "movq %%mm1, %%mm4 \n\t"
- "punpcklbw %%mm3, %%mm1 \n\t"
- "punpckhbw %%mm3, %%mm4 \n\t"
-
- "movq %%mm0, %%mm3 \n\t"
- "punpcklwd %%mm1, %%mm0 \n\t"
- "punpckhwd %%mm1, %%mm3 \n\t"
- "movq %%mm2, %%mm1 \n\t"
- "punpcklwd %%mm4, %%mm2 \n\t"
- "punpckhwd %%mm4, %%mm1 \n\t"
-
- "movd %%mm0, 128(%2) \n\t"
- "psrlq $32, %%mm0 \n\t"
- "movd %%mm0, 144(%2) \n\t"
- "movd %%mm3, 160(%2) \n\t"
- "psrlq $32, %%mm3 \n\t"
- "movd %%mm3, 176(%2) \n\t"
- "movd %%mm3, 48(%3) \n\t"
- "movd %%mm2, 192(%2) \n\t"
- "movd %%mm2, 64(%3) \n\t"
- "psrlq $32, %%mm2 \n\t"
- "movd %%mm2, 80(%3) \n\t"
- "movd %%mm1, 96(%3) \n\t"
- "psrlq $32, %%mm1 \n\t"
- "movd %%mm1, 112(%3) \n\t"
-
- "lea (%%"FF_REG_a", %1, 4), %%"FF_REG_a"\n\t"
-
- "movq (%0, %1, 4), %%mm0 \n\t" // 12345678
- "movq (%%"FF_REG_a"), %%mm1 \n\t" // abcdefgh
- "movq %%mm0, %%mm2 \n\t" // 12345678
- "punpcklbw %%mm1, %%mm0 \n\t" // 1a2b3c4d
- "punpckhbw %%mm1, %%mm2 \n\t" // 5e6f7g8h
-
- "movq (%%"FF_REG_a", %1), %%mm1 \n\t"
- "movq (%%"FF_REG_a", %1, 2), %%mm3 \n\t"
- "movq %%mm1, %%mm4 \n\t"
- "punpcklbw %%mm3, %%mm1 \n\t"
- "punpckhbw %%mm3, %%mm4 \n\t"
-
- "movq %%mm0, %%mm3 \n\t"
- "punpcklwd %%mm1, %%mm0 \n\t"
- "punpckhwd %%mm1, %%mm3 \n\t"
- "movq %%mm2, %%mm1 \n\t"
- "punpcklwd %%mm4, %%mm2 \n\t"
- "punpckhwd %%mm4, %%mm1 \n\t"
-
- "movd %%mm0, 132(%2) \n\t"
- "psrlq $32, %%mm0 \n\t"
- "movd %%mm0, 148(%2) \n\t"
- "movd %%mm3, 164(%2) \n\t"
- "psrlq $32, %%mm3 \n\t"
- "movd %%mm3, 180(%2) \n\t"
- "movd %%mm3, 52(%3) \n\t"
- "movd %%mm2, 196(%2) \n\t"
- "movd %%mm2, 68(%3) \n\t"
- "psrlq $32, %%mm2 \n\t"
- "movd %%mm2, 84(%3) \n\t"
- "movd %%mm1, 100(%3) \n\t"
- "psrlq $32, %%mm1 \n\t"
- "movd %%mm1, 116(%3) \n\t"
-
-
- :: "r" (src), "r" ((x86_reg)srcStride), "r" (dst1), "r" (dst2)
- : "%"FF_REG_a
- );
-}
-
-/**
- * Transpose the given 8x8 block.
- */
-static inline void RENAME(transpose2)(uint8_t *dst, int dstStride, const uint8_t *src)
-{
- __asm__(
- "lea (%0, %1), %%"FF_REG_a" \n\t"
- "lea (%%"FF_REG_a",%1,4), %%"FF_REG_d" \n\t"
-// 0 1 2 3 4 5 6 7 8 9
-// %0 eax eax+%1 eax+2%1 %0+4%1 edx edx+%1 edx+2%1 %0+8%1 edx+4%1
- "movq (%2), %%mm0 \n\t" // 12345678
- "movq 16(%2), %%mm1 \n\t" // abcdefgh
- "movq %%mm0, %%mm2 \n\t" // 12345678
- "punpcklbw %%mm1, %%mm0 \n\t" // 1a2b3c4d
- "punpckhbw %%mm1, %%mm2 \n\t" // 5e6f7g8h
-
- "movq 32(%2), %%mm1 \n\t"
- "movq 48(%2), %%mm3 \n\t"
- "movq %%mm1, %%mm4 \n\t"
- "punpcklbw %%mm3, %%mm1 \n\t"
- "punpckhbw %%mm3, %%mm4 \n\t"
-
- "movq %%mm0, %%mm3 \n\t"
- "punpcklwd %%mm1, %%mm0 \n\t"
- "punpckhwd %%mm1, %%mm3 \n\t"
- "movq %%mm2, %%mm1 \n\t"
- "punpcklwd %%mm4, %%mm2 \n\t"
- "punpckhwd %%mm4, %%mm1 \n\t"
-
- "movd %%mm0, (%0) \n\t"
- "psrlq $32, %%mm0 \n\t"
- "movd %%mm0, (%%"FF_REG_a") \n\t"
- "movd %%mm3, (%%"FF_REG_a", %1) \n\t"
- "psrlq $32, %%mm3 \n\t"
- "movd %%mm3, (%%"FF_REG_a", %1, 2) \n\t"
- "movd %%mm2, (%0, %1, 4) \n\t"
- "psrlq $32, %%mm2 \n\t"
- "movd %%mm2, (%%"FF_REG_d") \n\t"
- "movd %%mm1, (%%"FF_REG_d", %1) \n\t"
- "psrlq $32, %%mm1 \n\t"
- "movd %%mm1, (%%"FF_REG_d", %1, 2) \n\t"
-
-
- "movq 64(%2), %%mm0 \n\t" // 12345678
- "movq 80(%2), %%mm1 \n\t" // abcdefgh
- "movq %%mm0, %%mm2 \n\t" // 12345678
- "punpcklbw %%mm1, %%mm0 \n\t" // 1a2b3c4d
- "punpckhbw %%mm1, %%mm2 \n\t" // 5e6f7g8h
-
- "movq 96(%2), %%mm1 \n\t"
- "movq 112(%2), %%mm3 \n\t"
- "movq %%mm1, %%mm4 \n\t"
- "punpcklbw %%mm3, %%mm1 \n\t"
- "punpckhbw %%mm3, %%mm4 \n\t"
-
- "movq %%mm0, %%mm3 \n\t"
- "punpcklwd %%mm1, %%mm0 \n\t"
- "punpckhwd %%mm1, %%mm3 \n\t"
- "movq %%mm2, %%mm1 \n\t"
- "punpcklwd %%mm4, %%mm2 \n\t"
- "punpckhwd %%mm4, %%mm1 \n\t"
-
- "movd %%mm0, 4(%0) \n\t"
- "psrlq $32, %%mm0 \n\t"
- "movd %%mm0, 4(%%"FF_REG_a") \n\t"
- "movd %%mm3, 4(%%"FF_REG_a", %1) \n\t"
- "psrlq $32, %%mm3 \n\t"
- "movd %%mm3, 4(%%"FF_REG_a", %1, 2) \n\t"
- "movd %%mm2, 4(%0, %1, 4) \n\t"
- "psrlq $32, %%mm2 \n\t"
- "movd %%mm2, 4(%%"FF_REG_d") \n\t"
- "movd %%mm1, 4(%%"FF_REG_d", %1) \n\t"
- "psrlq $32, %%mm1 \n\t"
- "movd %%mm1, 4(%%"FF_REG_d", %1, 2) \n\t"
-
- :: "r" (dst), "r" ((x86_reg)dstStride), "r" (src)
- : "%"FF_REG_a, "%"FF_REG_d
- );
-}
-#endif //TEMPLATE_PP_MMX
-//static long test=0;
-
-#if !TEMPLATE_PP_ALTIVEC
-static inline void RENAME(tempNoiseReducer)(uint8_t *src, int stride,
- uint8_t *tempBlurred, uint32_t *tempBlurredPast, const int *maxNoise)
-{
- // to save a register (FIXME do this outside of the loops)
- tempBlurredPast[127]= maxNoise[0];
- tempBlurredPast[128]= maxNoise[1];
- tempBlurredPast[129]= maxNoise[2];
-
-#define FAST_L2_DIFF
-//#define L1_DIFF //u should change the thresholds too if u try that one
-#if (TEMPLATE_PP_MMXEXT || TEMPLATE_PP_3DNOW) && HAVE_6REGS
- __asm__ volatile(
- "lea (%2, %2, 2), %%"FF_REG_a" \n\t" // 3*stride
- "lea (%2, %2, 4), %%"FF_REG_d" \n\t" // 5*stride
- "lea (%%"FF_REG_d", %2, 2), %%"FF_REG_c"\n\t" // 7*stride
-// 0 1 2 3 4 5 6 7 8 9
-// %x %x+%2 %x+2%2 %x+eax %x+4%2 %x+edx %x+2eax %x+ecx %x+8%2
-//FIXME reorder?
-#ifdef L1_DIFF //needs mmx2
- "movq (%0), %%mm0 \n\t" // L0
- "psadbw (%1), %%mm0 \n\t" // |L0-R0|
- "movq (%0, %2), %%mm1 \n\t" // L1
- "psadbw (%1, %2), %%mm1 \n\t" // |L1-R1|
- "movq (%0, %2, 2), %%mm2 \n\t" // L2
- "psadbw (%1, %2, 2), %%mm2 \n\t" // |L2-R2|
- "movq (%0, %%"FF_REG_a"), %%mm3 \n\t" // L3
- "psadbw (%1, %%"FF_REG_a"), %%mm3 \n\t" // |L3-R3|
-
- "movq (%0, %2, 4), %%mm4 \n\t" // L4
- "paddw %%mm1, %%mm0 \n\t"
- "psadbw (%1, %2, 4), %%mm4 \n\t" // |L4-R4|
- "movq (%0, %%"FF_REG_d"), %%mm5 \n\t" // L5
- "paddw %%mm2, %%mm0 \n\t"
- "psadbw (%1, %%"FF_REG_d"), %%mm5 \n\t" // |L5-R5|
- "movq (%0, %%"FF_REG_a", 2), %%mm6 \n\t" // L6
- "paddw %%mm3, %%mm0 \n\t"
- "psadbw (%1, %%"FF_REG_a", 2), %%mm6 \n\t" // |L6-R6|
- "movq (%0, %%"FF_REG_c"), %%mm7 \n\t" // L7
- "paddw %%mm4, %%mm0 \n\t"
- "psadbw (%1, %%"FF_REG_c"), %%mm7 \n\t" // |L7-R7|
- "paddw %%mm5, %%mm6 \n\t"
- "paddw %%mm7, %%mm6 \n\t"
- "paddw %%mm6, %%mm0 \n\t"
-#else //L1_DIFF
-#if defined (FAST_L2_DIFF)
- "pcmpeqb %%mm7, %%mm7 \n\t"
- "movq "MANGLE(b80)", %%mm6 \n\t"
- "pxor %%mm0, %%mm0 \n\t"
-#define REAL_L2_DIFF_CORE(a, b)\
- "movq " #a ", %%mm5 \n\t"\
- "movq " #b ", %%mm2 \n\t"\
- "pxor %%mm7, %%mm2 \n\t"\
- PAVGB(%%mm2, %%mm5)\
- "paddb %%mm6, %%mm5 \n\t"\
- "movq %%mm5, %%mm2 \n\t"\
- "psllw $8, %%mm5 \n\t"\
- "pmaddwd %%mm5, %%mm5 \n\t"\
- "pmaddwd %%mm2, %%mm2 \n\t"\
- "paddd %%mm2, %%mm5 \n\t"\
- "psrld $14, %%mm5 \n\t"\
- "paddd %%mm5, %%mm0 \n\t"
-
-#else //defined (FAST_L2_DIFF)
- "pxor %%mm7, %%mm7 \n\t"
- "pxor %%mm0, %%mm0 \n\t"
-#define REAL_L2_DIFF_CORE(a, b)\
- "movq " #a ", %%mm5 \n\t"\
- "movq " #b ", %%mm2 \n\t"\
- "movq %%mm5, %%mm1 \n\t"\
- "movq %%mm2, %%mm3 \n\t"\
- "punpcklbw %%mm7, %%mm5 \n\t"\
- "punpckhbw %%mm7, %%mm1 \n\t"\
- "punpcklbw %%mm7, %%mm2 \n\t"\
- "punpckhbw %%mm7, %%mm3 \n\t"\
- "psubw %%mm2, %%mm5 \n\t"\
- "psubw %%mm3, %%mm1 \n\t"\
- "pmaddwd %%mm5, %%mm5 \n\t"\
- "pmaddwd %%mm1, %%mm1 \n\t"\
- "paddd %%mm1, %%mm5 \n\t"\
- "paddd %%mm5, %%mm0 \n\t"
-
-#endif //defined (FAST_L2_DIFF)
-
-#define L2_DIFF_CORE(a, b) REAL_L2_DIFF_CORE(a, b)
-
-L2_DIFF_CORE((%0) , (%1))
-L2_DIFF_CORE((%0, %2) , (%1, %2))
-L2_DIFF_CORE((%0, %2, 2) , (%1, %2, 2))
-L2_DIFF_CORE((%0, %%FF_REGa) , (%1, %%FF_REGa))
-L2_DIFF_CORE((%0, %2, 4) , (%1, %2, 4))
-L2_DIFF_CORE((%0, %%FF_REGd) , (%1, %%FF_REGd))
-L2_DIFF_CORE((%0, %%FF_REGa,2), (%1, %%FF_REGa,2))
-L2_DIFF_CORE((%0, %%FF_REGc) , (%1, %%FF_REGc))
-
-#endif //L1_DIFF
-
- "movq %%mm0, %%mm4 \n\t"
- "psrlq $32, %%mm0 \n\t"
- "paddd %%mm0, %%mm4 \n\t"
- "movd %%mm4, %%ecx \n\t"
- "shll $2, %%ecx \n\t"
- "mov %3, %%"FF_REG_d" \n\t"
- "addl -4(%%"FF_REG_d"), %%ecx \n\t"
- "addl 4(%%"FF_REG_d"), %%ecx \n\t"
- "addl -1024(%%"FF_REG_d"), %%ecx \n\t"
- "addl $4, %%ecx \n\t"
- "addl 1024(%%"FF_REG_d"), %%ecx \n\t"
- "shrl $3, %%ecx \n\t"
- "movl %%ecx, (%%"FF_REG_d") \n\t"
-
-// "mov %3, %%"FF_REG_c" \n\t"
-// "mov %%"FF_REG_c", test \n\t"
-// "jmp 4f \n\t"
- "cmpl 512(%%"FF_REG_d"), %%ecx \n\t"
- " jb 2f \n\t"
- "cmpl 516(%%"FF_REG_d"), %%ecx \n\t"
- " jb 1f \n\t"
-
- "lea (%%"FF_REG_a", %2, 2), %%"FF_REG_d"\n\t" // 5*stride
- "lea (%%"FF_REG_d", %2, 2), %%"FF_REG_c"\n\t" // 7*stride
- "movq (%0), %%mm0 \n\t" // L0
- "movq (%0, %2), %%mm1 \n\t" // L1
- "movq (%0, %2, 2), %%mm2 \n\t" // L2
- "movq (%0, %%"FF_REG_a"), %%mm3 \n\t" // L3
- "movq (%0, %2, 4), %%mm4 \n\t" // L4
- "movq (%0, %%"FF_REG_d"), %%mm5 \n\t" // L5
- "movq (%0, %%"FF_REG_a", 2), %%mm6 \n\t" // L6
- "movq (%0, %%"FF_REG_c"), %%mm7 \n\t" // L7
- "movq %%mm0, (%1) \n\t" // L0
- "movq %%mm1, (%1, %2) \n\t" // L1
- "movq %%mm2, (%1, %2, 2) \n\t" // L2
- "movq %%mm3, (%1, %%"FF_REG_a") \n\t" // L3
- "movq %%mm4, (%1, %2, 4) \n\t" // L4
- "movq %%mm5, (%1, %%"FF_REG_d") \n\t" // L5
- "movq %%mm6, (%1, %%"FF_REG_a", 2) \n\t" // L6
- "movq %%mm7, (%1, %%"FF_REG_c") \n\t" // L7
- "jmp 4f \n\t"
-
- "1: \n\t"
- "lea (%%"FF_REG_a", %2, 2), %%"FF_REG_d"\n\t" // 5*stride
- "lea (%%"FF_REG_d", %2, 2), %%"FF_REG_c"\n\t" // 7*stride
- "movq (%0), %%mm0 \n\t" // L0
- PAVGB((%1), %%mm0) // L0
- "movq (%0, %2), %%mm1 \n\t" // L1
- PAVGB((%1, %2), %%mm1) // L1
- "movq (%0, %2, 2), %%mm2 \n\t" // L2
- PAVGB((%1, %2, 2), %%mm2) // L2
- "movq (%0, %%"FF_REG_a"), %%mm3 \n\t" // L3
- PAVGB((%1, %%FF_REGa), %%mm3) // L3
- "movq (%0, %2, 4), %%mm4 \n\t" // L4
- PAVGB((%1, %2, 4), %%mm4) // L4
- "movq (%0, %%"FF_REG_d"), %%mm5 \n\t" // L5
- PAVGB((%1, %%FF_REGd), %%mm5) // L5
- "movq (%0, %%"FF_REG_a", 2), %%mm6 \n\t" // L6
- PAVGB((%1, %%FF_REGa, 2), %%mm6) // L6
- "movq (%0, %%"FF_REG_c"), %%mm7 \n\t" // L7
- PAVGB((%1, %%FF_REGc), %%mm7) // L7
- "movq %%mm0, (%1) \n\t" // R0
- "movq %%mm1, (%1, %2) \n\t" // R1
- "movq %%mm2, (%1, %2, 2) \n\t" // R2
- "movq %%mm3, (%1, %%"FF_REG_a") \n\t" // R3
- "movq %%mm4, (%1, %2, 4) \n\t" // R4
- "movq %%mm5, (%1, %%"FF_REG_d") \n\t" // R5
- "movq %%mm6, (%1, %%"FF_REG_a", 2) \n\t" // R6
- "movq %%mm7, (%1, %%"FF_REG_c") \n\t" // R7
- "movq %%mm0, (%0) \n\t" // L0
- "movq %%mm1, (%0, %2) \n\t" // L1
- "movq %%mm2, (%0, %2, 2) \n\t" // L2
- "movq %%mm3, (%0, %%"FF_REG_a") \n\t" // L3
- "movq %%mm4, (%0, %2, 4) \n\t" // L4
- "movq %%mm5, (%0, %%"FF_REG_d") \n\t" // L5
- "movq %%mm6, (%0, %%"FF_REG_a", 2) \n\t" // L6
- "movq %%mm7, (%0, %%"FF_REG_c") \n\t" // L7
- "jmp 4f \n\t"
-
- "2: \n\t"
- "cmpl 508(%%"FF_REG_d"), %%ecx \n\t"
- " jb 3f \n\t"
-
- "lea (%%"FF_REG_a", %2, 2), %%"FF_REG_d"\n\t" // 5*stride
- "lea (%%"FF_REG_d", %2, 2), %%"FF_REG_c"\n\t" // 7*stride
- "movq (%0), %%mm0 \n\t" // L0
- "movq (%0, %2), %%mm1 \n\t" // L1
- "movq (%0, %2, 2), %%mm2 \n\t" // L2
- "movq (%0, %%"FF_REG_a"), %%mm3 \n\t" // L3
- "movq (%1), %%mm4 \n\t" // R0
- "movq (%1, %2), %%mm5 \n\t" // R1
- "movq (%1, %2, 2), %%mm6 \n\t" // R2
- "movq (%1, %%"FF_REG_a"), %%mm7 \n\t" // R3
- PAVGB(%%mm4, %%mm0)
- PAVGB(%%mm5, %%mm1)
- PAVGB(%%mm6, %%mm2)
- PAVGB(%%mm7, %%mm3)
- PAVGB(%%mm4, %%mm0)
- PAVGB(%%mm5, %%mm1)
- PAVGB(%%mm6, %%mm2)
- PAVGB(%%mm7, %%mm3)
- "movq %%mm0, (%1) \n\t" // R0
- "movq %%mm1, (%1, %2) \n\t" // R1
- "movq %%mm2, (%1, %2, 2) \n\t" // R2
- "movq %%mm3, (%1, %%"FF_REG_a") \n\t" // R3
- "movq %%mm0, (%0) \n\t" // L0
- "movq %%mm1, (%0, %2) \n\t" // L1
- "movq %%mm2, (%0, %2, 2) \n\t" // L2
- "movq %%mm3, (%0, %%"FF_REG_a") \n\t" // L3
-
- "movq (%0, %2, 4), %%mm0 \n\t" // L4
- "movq (%0, %%"FF_REG_d"), %%mm1 \n\t" // L5
- "movq (%0, %%"FF_REG_a", 2), %%mm2 \n\t" // L6
- "movq (%0, %%"FF_REG_c"), %%mm3 \n\t" // L7
- "movq (%1, %2, 4), %%mm4 \n\t" // R4
- "movq (%1, %%"FF_REG_d"), %%mm5 \n\t" // R5
- "movq (%1, %%"FF_REG_a", 2), %%mm6 \n\t" // R6
- "movq (%1, %%"FF_REG_c"), %%mm7 \n\t" // R7
- PAVGB(%%mm4, %%mm0)
- PAVGB(%%mm5, %%mm1)
- PAVGB(%%mm6, %%mm2)
- PAVGB(%%mm7, %%mm3)
- PAVGB(%%mm4, %%mm0)
- PAVGB(%%mm5, %%mm1)
- PAVGB(%%mm6, %%mm2)
- PAVGB(%%mm7, %%mm3)
- "movq %%mm0, (%1, %2, 4) \n\t" // R4
- "movq %%mm1, (%1, %%"FF_REG_d") \n\t" // R5
- "movq %%mm2, (%1, %%"FF_REG_a", 2) \n\t" // R6
- "movq %%mm3, (%1, %%"FF_REG_c") \n\t" // R7
- "movq %%mm0, (%0, %2, 4) \n\t" // L4
- "movq %%mm1, (%0, %%"FF_REG_d") \n\t" // L5
- "movq %%mm2, (%0, %%"FF_REG_a", 2) \n\t" // L6
- "movq %%mm3, (%0, %%"FF_REG_c") \n\t" // L7
- "jmp 4f \n\t"
-
- "3: \n\t"
- "lea (%%"FF_REG_a", %2, 2), %%"FF_REG_d"\n\t" // 5*stride
- "lea (%%"FF_REG_d", %2, 2), %%"FF_REG_c"\n\t" // 7*stride
- "movq (%0), %%mm0 \n\t" // L0
- "movq (%0, %2), %%mm1 \n\t" // L1
- "movq (%0, %2, 2), %%mm2 \n\t" // L2
- "movq (%0, %%"FF_REG_a"), %%mm3 \n\t" // L3
- "movq (%1), %%mm4 \n\t" // R0
- "movq (%1, %2), %%mm5 \n\t" // R1
- "movq (%1, %2, 2), %%mm6 \n\t" // R2
- "movq (%1, %%"FF_REG_a"), %%mm7 \n\t" // R3
- PAVGB(%%mm4, %%mm0)
- PAVGB(%%mm5, %%mm1)
- PAVGB(%%mm6, %%mm2)
- PAVGB(%%mm7, %%mm3)
- PAVGB(%%mm4, %%mm0)
- PAVGB(%%mm5, %%mm1)
- PAVGB(%%mm6, %%mm2)
- PAVGB(%%mm7, %%mm3)
- PAVGB(%%mm4, %%mm0)
- PAVGB(%%mm5, %%mm1)
- PAVGB(%%mm6, %%mm2)
- PAVGB(%%mm7, %%mm3)
- "movq %%mm0, (%1) \n\t" // R0
- "movq %%mm1, (%1, %2) \n\t" // R1
- "movq %%mm2, (%1, %2, 2) \n\t" // R2
- "movq %%mm3, (%1, %%"FF_REG_a") \n\t" // R3
- "movq %%mm0, (%0) \n\t" // L0
- "movq %%mm1, (%0, %2) \n\t" // L1
- "movq %%mm2, (%0, %2, 2) \n\t" // L2
- "movq %%mm3, (%0, %%"FF_REG_a") \n\t" // L3
-
- "movq (%0, %2, 4), %%mm0 \n\t" // L4
- "movq (%0, %%"FF_REG_d"), %%mm1 \n\t" // L5
- "movq (%0, %%"FF_REG_a", 2), %%mm2 \n\t" // L6
- "movq (%0, %%"FF_REG_c"), %%mm3 \n\t" // L7
- "movq (%1, %2, 4), %%mm4 \n\t" // R4
- "movq (%1, %%"FF_REG_d"), %%mm5 \n\t" // R5
- "movq (%1, %%"FF_REG_a", 2), %%mm6 \n\t" // R6
- "movq (%1, %%"FF_REG_c"), %%mm7 \n\t" // R7
- PAVGB(%%mm4, %%mm0)
- PAVGB(%%mm5, %%mm1)
- PAVGB(%%mm6, %%mm2)
- PAVGB(%%mm7, %%mm3)
- PAVGB(%%mm4, %%mm0)
- PAVGB(%%mm5, %%mm1)
- PAVGB(%%mm6, %%mm2)
- PAVGB(%%mm7, %%mm3)
- PAVGB(%%mm4, %%mm0)
- PAVGB(%%mm5, %%mm1)
- PAVGB(%%mm6, %%mm2)
- PAVGB(%%mm7, %%mm3)
- "movq %%mm0, (%1, %2, 4) \n\t" // R4
- "movq %%mm1, (%1, %%"FF_REG_d") \n\t" // R5
- "movq %%mm2, (%1, %%"FF_REG_a", 2) \n\t" // R6
- "movq %%mm3, (%1, %%"FF_REG_c") \n\t" // R7
- "movq %%mm0, (%0, %2, 4) \n\t" // L4
- "movq %%mm1, (%0, %%"FF_REG_d") \n\t" // L5
- "movq %%mm2, (%0, %%"FF_REG_a", 2) \n\t" // L6
- "movq %%mm3, (%0, %%"FF_REG_c") \n\t" // L7
-
- "4: \n\t"
-
- :: "r" (src), "r" (tempBlurred), "r"((x86_reg)stride), "m" (tempBlurredPast)
- NAMED_CONSTRAINTS_ADD(b80)
- : "%"FF_REG_a, "%"FF_REG_d, "%"FF_REG_c, "memory"
- );
-#else //(TEMPLATE_PP_MMXEXT || TEMPLATE_PP_3DNOW) && HAVE_6REGS
-{
- int y;
- int d=0;
-// int sysd=0;
- int i;
-
- for(y=0; y<8; y++){
- int x;
- for(x=0; x<8; x++){
- int ref= tempBlurred[ x + y*stride ];
- int cur= src[ x + y*stride ];
- int d1=ref - cur;
-// if(x==0 || x==7) d1+= d1>>1;
-// if(y==0 || y==7) d1+= d1>>1;
-// d+= FFABS(d1);
- d+= d1*d1;
-// sysd+= d1;
- }
- }
- i=d;
- d= (
- 4*d
- +(*(tempBlurredPast-256))
- +(*(tempBlurredPast-1))+ (*(tempBlurredPast+1))
- +(*(tempBlurredPast+256))
- +4)>>3;
- *tempBlurredPast=i;
-// ((*tempBlurredPast)*3 + d + 2)>>2;
-
-/*
-Switch between
- 1 0 0 0 0 0 0 (0)
-64 32 16 8 4 2 1 (1)
-64 48 36 27 20 15 11 (33) (approx)
-64 56 49 43 37 33 29 (200) (approx)
-*/
- if(d > maxNoise[1]){
- if(d < maxNoise[2]){
- for(y=0; y<8; y++){
- int x;
- for(x=0; x<8; x++){
- int ref= tempBlurred[ x + y*stride ];
- int cur= src[ x + y*stride ];
- tempBlurred[ x + y*stride ]=
- src[ x + y*stride ]=
- (ref + cur + 1)>>1;
- }
- }
- }else{
- for(y=0; y<8; y++){
- int x;
- for(x=0; x<8; x++){
- tempBlurred[ x + y*stride ]= src[ x + y*stride ];
- }
- }
- }
- }else{
- if(d < maxNoise[0]){
- for(y=0; y<8; y++){
- int x;
- for(x=0; x<8; x++){
- int ref= tempBlurred[ x + y*stride ];
- int cur= src[ x + y*stride ];
- tempBlurred[ x + y*stride ]=
- src[ x + y*stride ]=
- (ref*7 + cur + 4)>>3;
- }
- }
- }else{
- for(y=0; y<8; y++){
- int x;
- for(x=0; x<8; x++){
- int ref= tempBlurred[ x + y*stride ];
- int cur= src[ x + y*stride ];
- tempBlurred[ x + y*stride ]=
- src[ x + y*stride ]=
- (ref*3 + cur + 2)>>2;
- }
- }
- }
- }
-}
-#endif //(TEMPLATE_PP_MMXEXT || TEMPLATE_PP_3DNOW) && HAVE_6REGS
-}
-#endif //TEMPLATE_PP_ALTIVEC
-
-#if TEMPLATE_PP_MMX
-/**
- * accurate deblock filter
- */
-static av_always_inline void RENAME(do_a_deblock)(uint8_t *src, int step, int stride, const PPContext *c, int mode){
- int64_t dc_mask, eq_mask, both_masks;
- int64_t sums[10*8*2];
- src+= step*3; // src points to begin of the 8x8 Block
-
- __asm__ volatile(
- "movq %0, %%mm7 \n\t"
- "movq %1, %%mm6 \n\t"
- : : "m" (c->mmxDcOffset[c->nonBQP]), "m" (c->mmxDcThreshold[c->nonBQP])
- );
-
- __asm__ volatile(
- "lea (%2, %3), %%"FF_REG_a" \n\t"
-// 0 1 2 3 4 5 6 7 8 9
-// %1 eax eax+%2 eax+2%2 %1+4%2 ecx ecx+%2 ecx+2%2 %1+8%2 ecx+4%2
-
- "movq (%2), %%mm0 \n\t"
- "movq (%%"FF_REG_a"), %%mm1 \n\t"
- "movq %%mm1, %%mm3 \n\t"
- "movq %%mm1, %%mm4 \n\t"
- "psubb %%mm1, %%mm0 \n\t" // mm0 = difference
- "paddb %%mm7, %%mm0 \n\t"
- "pcmpgtb %%mm6, %%mm0 \n\t"
-
- "movq (%%"FF_REG_a",%3), %%mm2 \n\t"
- PMAXUB(%%mm2, %%mm4)
- PMINUB(%%mm2, %%mm3, %%mm5)
- "psubb %%mm2, %%mm1 \n\t"
- "paddb %%mm7, %%mm1 \n\t"
- "pcmpgtb %%mm6, %%mm1 \n\t"
- "paddb %%mm1, %%mm0 \n\t"
-
- "movq (%%"FF_REG_a", %3, 2), %%mm1 \n\t"
- PMAXUB(%%mm1, %%mm4)
- PMINUB(%%mm1, %%mm3, %%mm5)
- "psubb %%mm1, %%mm2 \n\t"
- "paddb %%mm7, %%mm2 \n\t"
- "pcmpgtb %%mm6, %%mm2 \n\t"
- "paddb %%mm2, %%mm0 \n\t"
-
- "lea (%%"FF_REG_a", %3, 4), %%"FF_REG_a"\n\t"
-
- "movq (%2, %3, 4), %%mm2 \n\t"
- PMAXUB(%%mm2, %%mm4)
- PMINUB(%%mm2, %%mm3, %%mm5)
- "psubb %%mm2, %%mm1 \n\t"
- "paddb %%mm7, %%mm1 \n\t"
- "pcmpgtb %%mm6, %%mm1 \n\t"
- "paddb %%mm1, %%mm0 \n\t"
-
- "movq (%%"FF_REG_a"), %%mm1 \n\t"
- PMAXUB(%%mm1, %%mm4)
- PMINUB(%%mm1, %%mm3, %%mm5)
- "psubb %%mm1, %%mm2 \n\t"
- "paddb %%mm7, %%mm2 \n\t"
- "pcmpgtb %%mm6, %%mm2 \n\t"
- "paddb %%mm2, %%mm0 \n\t"
-
- "movq (%%"FF_REG_a", %3), %%mm2 \n\t"
- PMAXUB(%%mm2, %%mm4)
- PMINUB(%%mm2, %%mm3, %%mm5)
- "psubb %%mm2, %%mm1 \n\t"
- "paddb %%mm7, %%mm1 \n\t"
- "pcmpgtb %%mm6, %%mm1 \n\t"
- "paddb %%mm1, %%mm0 \n\t"
-
- "movq (%%"FF_REG_a", %3, 2), %%mm1 \n\t"
- PMAXUB(%%mm1, %%mm4)
- PMINUB(%%mm1, %%mm3, %%mm5)
- "psubb %%mm1, %%mm2 \n\t"
- "paddb %%mm7, %%mm2 \n\t"
- "pcmpgtb %%mm6, %%mm2 \n\t"
- "paddb %%mm2, %%mm0 \n\t"
-
- "movq (%2, %3, 8), %%mm2 \n\t"
- PMAXUB(%%mm2, %%mm4)
- PMINUB(%%mm2, %%mm3, %%mm5)
- "psubb %%mm2, %%mm1 \n\t"
- "paddb %%mm7, %%mm1 \n\t"
- "pcmpgtb %%mm6, %%mm1 \n\t"
- "paddb %%mm1, %%mm0 \n\t"
-
- "movq (%%"FF_REG_a", %3, 4), %%mm1 \n\t"
- "psubb %%mm1, %%mm2 \n\t"
- "paddb %%mm7, %%mm2 \n\t"
- "pcmpgtb %%mm6, %%mm2 \n\t"
- "paddb %%mm2, %%mm0 \n\t"
- "psubusb %%mm3, %%mm4 \n\t"
-
- "pxor %%mm6, %%mm6 \n\t"
- "movq %4, %%mm7 \n\t" // QP,..., QP
- "paddusb %%mm7, %%mm7 \n\t" // 2QP ... 2QP
- "psubusb %%mm4, %%mm7 \n\t" // Diff >=2QP -> 0
- "pcmpeqb %%mm6, %%mm7 \n\t" // Diff < 2QP -> 0
- "pcmpeqb %%mm6, %%mm7 \n\t" // Diff < 2QP -> 0
- "movq %%mm7, %1 \n\t"
-
- "movq %5, %%mm7 \n\t"
- "punpcklbw %%mm7, %%mm7 \n\t"
- "punpcklbw %%mm7, %%mm7 \n\t"
- "punpcklbw %%mm7, %%mm7 \n\t"
- "psubb %%mm0, %%mm6 \n\t"
- "pcmpgtb %%mm7, %%mm6 \n\t"
- "movq %%mm6, %0 \n\t"
-
- : "=m" (eq_mask), "=m" (dc_mask)
- : "r" (src), "r" ((x86_reg)step), "m" (c->pQPb), "m"(c->ppMode.flatnessThreshold)
- : "%"FF_REG_a
- );
-
- both_masks = dc_mask & eq_mask;
-
- if(both_masks){
- x86_reg offset= -8*step;
- int64_t *temp_sums= sums;
-
- __asm__ volatile(
- "movq %2, %%mm0 \n\t" // QP,..., QP
- "pxor %%mm4, %%mm4 \n\t"
-
- "movq (%0), %%mm6 \n\t"
- "movq (%0, %1), %%mm5 \n\t"
- "movq %%mm5, %%mm1 \n\t"
- "movq %%mm6, %%mm2 \n\t"
- "psubusb %%mm6, %%mm5 \n\t"
- "psubusb %%mm1, %%mm2 \n\t"
- "por %%mm5, %%mm2 \n\t" // ABS Diff of lines
- "psubusb %%mm2, %%mm0 \n\t" // diff >= QP -> 0
- "pcmpeqb %%mm4, %%mm0 \n\t" // diff >= QP -> FF
-
- "pxor %%mm6, %%mm1 \n\t"
- "pand %%mm0, %%mm1 \n\t"
- "pxor %%mm1, %%mm6 \n\t"
- // 0:QP 6:First
-
- "movq (%0, %1, 8), %%mm5 \n\t"
- "add %1, %0 \n\t" // %0 points to line 1 not 0
- "movq (%0, %1, 8), %%mm7 \n\t"
- "movq %%mm5, %%mm1 \n\t"
- "movq %%mm7, %%mm2 \n\t"
- "psubusb %%mm7, %%mm5 \n\t"
- "psubusb %%mm1, %%mm2 \n\t"
- "por %%mm5, %%mm2 \n\t" // ABS Diff of lines
- "movq %2, %%mm0 \n\t" // QP,..., QP
- "psubusb %%mm2, %%mm0 \n\t" // diff >= QP -> 0
- "pcmpeqb %%mm4, %%mm0 \n\t" // diff >= QP -> FF
-
- "pxor %%mm7, %%mm1 \n\t"
- "pand %%mm0, %%mm1 \n\t"
- "pxor %%mm1, %%mm7 \n\t"
-
- "movq %%mm6, %%mm5 \n\t"
- "punpckhbw %%mm4, %%mm6 \n\t"
- "punpcklbw %%mm4, %%mm5 \n\t"
- // 4:0 5/6:First 7:Last
-
- "movq %%mm5, %%mm0 \n\t"
- "movq %%mm6, %%mm1 \n\t"
- "psllw $2, %%mm0 \n\t"
- "psllw $2, %%mm1 \n\t"
- "paddw "MANGLE(w04)", %%mm0 \n\t"
- "paddw "MANGLE(w04)", %%mm1 \n\t"
-
-#define NEXT\
- "movq (%0), %%mm2 \n\t"\
- "movq (%0), %%mm3 \n\t"\
- "add %1, %0 \n\t"\
- "punpcklbw %%mm4, %%mm2 \n\t"\
- "punpckhbw %%mm4, %%mm3 \n\t"\
- "paddw %%mm2, %%mm0 \n\t"\
- "paddw %%mm3, %%mm1 \n\t"
-
-#define PREV\
- "movq (%0), %%mm2 \n\t"\
- "movq (%0), %%mm3 \n\t"\
- "add %1, %0 \n\t"\
- "punpcklbw %%mm4, %%mm2 \n\t"\
- "punpckhbw %%mm4, %%mm3 \n\t"\
- "psubw %%mm2, %%mm0 \n\t"\
- "psubw %%mm3, %%mm1 \n\t"
-
-
- NEXT //0
- NEXT //1
- NEXT //2
- "movq %%mm0, (%3) \n\t"
- "movq %%mm1, 8(%3) \n\t"
-
- NEXT //3
- "psubw %%mm5, %%mm0 \n\t"
- "psubw %%mm6, %%mm1 \n\t"
- "movq %%mm0, 16(%3) \n\t"
- "movq %%mm1, 24(%3) \n\t"
-
- NEXT //4
- "psubw %%mm5, %%mm0 \n\t"
- "psubw %%mm6, %%mm1 \n\t"
- "movq %%mm0, 32(%3) \n\t"
- "movq %%mm1, 40(%3) \n\t"
-
- NEXT //5
- "psubw %%mm5, %%mm0 \n\t"
- "psubw %%mm6, %%mm1 \n\t"
- "movq %%mm0, 48(%3) \n\t"
- "movq %%mm1, 56(%3) \n\t"
-
- NEXT //6
- "psubw %%mm5, %%mm0 \n\t"
- "psubw %%mm6, %%mm1 \n\t"
- "movq %%mm0, 64(%3) \n\t"
- "movq %%mm1, 72(%3) \n\t"
-
- "movq %%mm7, %%mm6 \n\t"
- "punpckhbw %%mm4, %%mm7 \n\t"
- "punpcklbw %%mm4, %%mm6 \n\t"
-
- NEXT //7
- "mov %4, %0 \n\t"
- "add %1, %0 \n\t"
- PREV //0
- "movq %%mm0, 80(%3) \n\t"
- "movq %%mm1, 88(%3) \n\t"
-
- PREV //1
- "paddw %%mm6, %%mm0 \n\t"
- "paddw %%mm7, %%mm1 \n\t"
- "movq %%mm0, 96(%3) \n\t"
- "movq %%mm1, 104(%3) \n\t"
-
- PREV //2
- "paddw %%mm6, %%mm0 \n\t"
- "paddw %%mm7, %%mm1 \n\t"
- "movq %%mm0, 112(%3) \n\t"
- "movq %%mm1, 120(%3) \n\t"
-
- PREV //3
- "paddw %%mm6, %%mm0 \n\t"
- "paddw %%mm7, %%mm1 \n\t"
- "movq %%mm0, 128(%3) \n\t"
- "movq %%mm1, 136(%3) \n\t"
-
- PREV //4
- "paddw %%mm6, %%mm0 \n\t"
- "paddw %%mm7, %%mm1 \n\t"
- "movq %%mm0, 144(%3) \n\t"
- "movq %%mm1, 152(%3) \n\t"
-
- "mov %4, %0 \n\t" //FIXME
-
- : "+&r"(src)
- : "r" ((x86_reg)step), "m" (c->pQPb), "r"(sums), "g"(src)
- NAMED_CONSTRAINTS_ADD(w04)
- );
-
- src+= step; // src points to begin of the 8x8 Block
-
- __asm__ volatile(
- "movq %4, %%mm6 \n\t"
- "pcmpeqb %%mm5, %%mm5 \n\t"
- "pxor %%mm6, %%mm5 \n\t"
- "pxor %%mm7, %%mm7 \n\t"
-
- "1: \n\t"
- "movq (%1), %%mm0 \n\t"
- "movq 8(%1), %%mm1 \n\t"
- "paddw 32(%1), %%mm0 \n\t"
- "paddw 40(%1), %%mm1 \n\t"
- "movq (%0, %3), %%mm2 \n\t"
- "movq %%mm2, %%mm3 \n\t"
- "movq %%mm2, %%mm4 \n\t"
- "punpcklbw %%mm7, %%mm2 \n\t"
- "punpckhbw %%mm7, %%mm3 \n\t"
- "paddw %%mm2, %%mm0 \n\t"
- "paddw %%mm3, %%mm1 \n\t"
- "paddw %%mm2, %%mm0 \n\t"
- "paddw %%mm3, %%mm1 \n\t"
- "psrlw $4, %%mm0 \n\t"
- "psrlw $4, %%mm1 \n\t"
- "packuswb %%mm1, %%mm0 \n\t"
- "pand %%mm6, %%mm0 \n\t"
- "pand %%mm5, %%mm4 \n\t"
- "por %%mm4, %%mm0 \n\t"
- "movq %%mm0, (%0, %3) \n\t"
- "add $16, %1 \n\t"
- "add %2, %0 \n\t"
- " js 1b \n\t"
-
- : "+r"(offset), "+r"(temp_sums)
- : "r" ((x86_reg)step), "r"(src - offset), "m"(both_masks)
- );
- }else
- src+= step; // src points to begin of the 8x8 Block
-
- if(eq_mask != -1LL){
- uint8_t *temp_src= src;
- DECLARE_ALIGNED(8, uint64_t, tmp)[4]; // make space for 4 8-byte vars
- __asm__ volatile(
- "pxor %%mm7, %%mm7 \n\t"
-// 0 1 2 3 4 5 6 7 8 9
-// %0 eax eax+%1 eax+2%1 %0+4%1 ecx ecx+%1 ecx+2%1 %1+8%1 ecx+4%1
-
- "movq (%0), %%mm0 \n\t"
- "movq %%mm0, %%mm1 \n\t"
- "punpcklbw %%mm7, %%mm0 \n\t" // low part of line 0
- "punpckhbw %%mm7, %%mm1 \n\t" // high part of line 0
-
- "movq (%0, %1), %%mm2 \n\t"
- "lea (%0, %1, 2), %%"FF_REG_a" \n\t"
- "movq %%mm2, %%mm3 \n\t"
- "punpcklbw %%mm7, %%mm2 \n\t" // low part of line 1
- "punpckhbw %%mm7, %%mm3 \n\t" // high part of line 1
-
- "movq (%%"FF_REG_a"), %%mm4 \n\t"
- "movq %%mm4, %%mm5 \n\t"
- "punpcklbw %%mm7, %%mm4 \n\t" // low part of line 2
- "punpckhbw %%mm7, %%mm5 \n\t" // high part of line 2
-
- "paddw %%mm0, %%mm0 \n\t" // 2L0
- "paddw %%mm1, %%mm1 \n\t" // 2H0
- "psubw %%mm4, %%mm2 \n\t" // L1 - L2
- "psubw %%mm5, %%mm3 \n\t" // H1 - H2
- "psubw %%mm2, %%mm0 \n\t" // 2L0 - L1 + L2
- "psubw %%mm3, %%mm1 \n\t" // 2H0 - H1 + H2
-
- "psllw $2, %%mm2 \n\t" // 4L1 - 4L2
- "psllw $2, %%mm3 \n\t" // 4H1 - 4H2
- "psubw %%mm2, %%mm0 \n\t" // 2L0 - 5L1 + 5L2
- "psubw %%mm3, %%mm1 \n\t" // 2H0 - 5H1 + 5H2
-
- "movq (%%"FF_REG_a", %1), %%mm2 \n\t"
- "movq %%mm2, %%mm3 \n\t"
- "punpcklbw %%mm7, %%mm2 \n\t" // L3
- "punpckhbw %%mm7, %%mm3 \n\t" // H3
-
- "psubw %%mm2, %%mm0 \n\t" // 2L0 - 5L1 + 5L2 - L3
- "psubw %%mm3, %%mm1 \n\t" // 2H0 - 5H1 + 5H2 - H3
- "psubw %%mm2, %%mm0 \n\t" // 2L0 - 5L1 + 5L2 - 2L3
- "psubw %%mm3, %%mm1 \n\t" // 2H0 - 5H1 + 5H2 - 2H3
- "movq %%mm0, (%4) \n\t" // 2L0 - 5L1 + 5L2 - 2L3
- "movq %%mm1, 8(%4) \n\t" // 2H0 - 5H1 + 5H2 - 2H3
-
- "movq (%%"FF_REG_a", %1, 2), %%mm0 \n\t"
- "movq %%mm0, %%mm1 \n\t"
- "punpcklbw %%mm7, %%mm0 \n\t" // L4
- "punpckhbw %%mm7, %%mm1 \n\t" // H4
-
- "psubw %%mm0, %%mm2 \n\t" // L3 - L4
- "psubw %%mm1, %%mm3 \n\t" // H3 - H4
- "movq %%mm2, 16(%4) \n\t" // L3 - L4
- "movq %%mm3, 24(%4) \n\t" // H3 - H4
- "paddw %%mm4, %%mm4 \n\t" // 2L2
- "paddw %%mm5, %%mm5 \n\t" // 2H2
- "psubw %%mm2, %%mm4 \n\t" // 2L2 - L3 + L4
- "psubw %%mm3, %%mm5 \n\t" // 2H2 - H3 + H4
-
- "lea (%%"FF_REG_a", %1), %0 \n\t"
- "psllw $2, %%mm2 \n\t" // 4L3 - 4L4
- "psllw $2, %%mm3 \n\t" // 4H3 - 4H4
- "psubw %%mm2, %%mm4 \n\t" // 2L2 - 5L3 + 5L4
- "psubw %%mm3, %%mm5 \n\t" // 2H2 - 5H3 + 5H4
-//50 opcodes so far
- "movq (%0, %1, 2), %%mm2 \n\t"
- "movq %%mm2, %%mm3 \n\t"
- "punpcklbw %%mm7, %%mm2 \n\t" // L5
- "punpckhbw %%mm7, %%mm3 \n\t" // H5
- "psubw %%mm2, %%mm4 \n\t" // 2L2 - 5L3 + 5L4 - L5
- "psubw %%mm3, %%mm5 \n\t" // 2H2 - 5H3 + 5H4 - H5
- "psubw %%mm2, %%mm4 \n\t" // 2L2 - 5L3 + 5L4 - 2L5
- "psubw %%mm3, %%mm5 \n\t" // 2H2 - 5H3 + 5H4 - 2H5
-
- "movq (%%"FF_REG_a", %1, 4), %%mm6 \n\t"
- "punpcklbw %%mm7, %%mm6 \n\t" // L6
- "psubw %%mm6, %%mm2 \n\t" // L5 - L6
- "movq (%%"FF_REG_a", %1, 4), %%mm6 \n\t"
- "punpckhbw %%mm7, %%mm6 \n\t" // H6
- "psubw %%mm6, %%mm3 \n\t" // H5 - H6
-
- "paddw %%mm0, %%mm0 \n\t" // 2L4
- "paddw %%mm1, %%mm1 \n\t" // 2H4
- "psubw %%mm2, %%mm0 \n\t" // 2L4 - L5 + L6
- "psubw %%mm3, %%mm1 \n\t" // 2H4 - H5 + H6
-
- "psllw $2, %%mm2 \n\t" // 4L5 - 4L6
- "psllw $2, %%mm3 \n\t" // 4H5 - 4H6
- "psubw %%mm2, %%mm0 \n\t" // 2L4 - 5L5 + 5L6
- "psubw %%mm3, %%mm1 \n\t" // 2H4 - 5H5 + 5H6
-
- "movq (%0, %1, 4), %%mm2 \n\t"
- "movq %%mm2, %%mm3 \n\t"
- "punpcklbw %%mm7, %%mm2 \n\t" // L7
- "punpckhbw %%mm7, %%mm3 \n\t" // H7
-
- "paddw %%mm2, %%mm2 \n\t" // 2L7
- "paddw %%mm3, %%mm3 \n\t" // 2H7
- "psubw %%mm2, %%mm0 \n\t" // 2L4 - 5L5 + 5L6 - 2L7
- "psubw %%mm3, %%mm1 \n\t" // 2H4 - 5H5 + 5H6 - 2H7
-
- "movq (%4), %%mm2 \n\t" // 2L0 - 5L1 + 5L2 - 2L3
- "movq 8(%4), %%mm3 \n\t" // 2H0 - 5H1 + 5H2 - 2H3
-
-#if TEMPLATE_PP_MMXEXT
- "movq %%mm7, %%mm6 \n\t" // 0
- "psubw %%mm0, %%mm6 \n\t"
- "pmaxsw %%mm6, %%mm0 \n\t" // |2L4 - 5L5 + 5L6 - 2L7|
- "movq %%mm7, %%mm6 \n\t" // 0
- "psubw %%mm1, %%mm6 \n\t"
- "pmaxsw %%mm6, %%mm1 \n\t" // |2H4 - 5H5 + 5H6 - 2H7|
- "movq %%mm7, %%mm6 \n\t" // 0
- "psubw %%mm2, %%mm6 \n\t"
- "pmaxsw %%mm6, %%mm2 \n\t" // |2L0 - 5L1 + 5L2 - 2L3|
- "movq %%mm7, %%mm6 \n\t" // 0
- "psubw %%mm3, %%mm6 \n\t"
- "pmaxsw %%mm6, %%mm3 \n\t" // |2H0 - 5H1 + 5H2 - 2H3|
-#else
- "movq %%mm7, %%mm6 \n\t" // 0
- "pcmpgtw %%mm0, %%mm6 \n\t"
- "pxor %%mm6, %%mm0 \n\t"
- "psubw %%mm6, %%mm0 \n\t" // |2L4 - 5L5 + 5L6 - 2L7|
- "movq %%mm7, %%mm6 \n\t" // 0
- "pcmpgtw %%mm1, %%mm6 \n\t"
- "pxor %%mm6, %%mm1 \n\t"
- "psubw %%mm6, %%mm1 \n\t" // |2H4 - 5H5 + 5H6 - 2H7|
- "movq %%mm7, %%mm6 \n\t" // 0
- "pcmpgtw %%mm2, %%mm6 \n\t"
- "pxor %%mm6, %%mm2 \n\t"
- "psubw %%mm6, %%mm2 \n\t" // |2L0 - 5L1 + 5L2 - 2L3|
- "movq %%mm7, %%mm6 \n\t" // 0
- "pcmpgtw %%mm3, %%mm6 \n\t"
- "pxor %%mm6, %%mm3 \n\t"
- "psubw %%mm6, %%mm3 \n\t" // |2H0 - 5H1 + 5H2 - 2H3|
-#endif
-
-#if TEMPLATE_PP_MMXEXT
- "pminsw %%mm2, %%mm0 \n\t"
- "pminsw %%mm3, %%mm1 \n\t"
-#else
- "movq %%mm0, %%mm6 \n\t"
- "psubusw %%mm2, %%mm6 \n\t"
- "psubw %%mm6, %%mm0 \n\t"
- "movq %%mm1, %%mm6 \n\t"
- "psubusw %%mm3, %%mm6 \n\t"
- "psubw %%mm6, %%mm1 \n\t"
-#endif
-
- "movd %2, %%mm2 \n\t" // QP
- "punpcklbw %%mm7, %%mm2 \n\t"
-
- "movq %%mm7, %%mm6 \n\t" // 0
- "pcmpgtw %%mm4, %%mm6 \n\t" // sign(2L2 - 5L3 + 5L4 - 2L5)
- "pxor %%mm6, %%mm4 \n\t"
- "psubw %%mm6, %%mm4 \n\t" // |2L2 - 5L3 + 5L4 - 2L5|
- "pcmpgtw %%mm5, %%mm7 \n\t" // sign(2H2 - 5H3 + 5H4 - 2H5)
- "pxor %%mm7, %%mm5 \n\t"
- "psubw %%mm7, %%mm5 \n\t" // |2H2 - 5H3 + 5H4 - 2H5|
-// 100 opcodes
- "psllw $3, %%mm2 \n\t" // 8QP
- "movq %%mm2, %%mm3 \n\t" // 8QP
- "pcmpgtw %%mm4, %%mm2 \n\t"
- "pcmpgtw %%mm5, %%mm3 \n\t"
- "pand %%mm2, %%mm4 \n\t"
- "pand %%mm3, %%mm5 \n\t"
-
-
- "psubusw %%mm0, %%mm4 \n\t" // hd
- "psubusw %%mm1, %%mm5 \n\t" // ld
-
-
- "movq "MANGLE(w05)", %%mm2 \n\t" // 5
- "pmullw %%mm2, %%mm4 \n\t"
- "pmullw %%mm2, %%mm5 \n\t"
- "movq "MANGLE(w20)", %%mm2 \n\t" // 32
- "paddw %%mm2, %%mm4 \n\t"
- "paddw %%mm2, %%mm5 \n\t"
- "psrlw $6, %%mm4 \n\t"
- "psrlw $6, %%mm5 \n\t"
-
- "movq 16(%4), %%mm0 \n\t" // L3 - L4
- "movq 24(%4), %%mm1 \n\t" // H3 - H4
-
- "pxor %%mm2, %%mm2 \n\t"
- "pxor %%mm3, %%mm3 \n\t"
-
- "pcmpgtw %%mm0, %%mm2 \n\t" // sign (L3-L4)
- "pcmpgtw %%mm1, %%mm3 \n\t" // sign (H3-H4)
- "pxor %%mm2, %%mm0 \n\t"
- "pxor %%mm3, %%mm1 \n\t"
- "psubw %%mm2, %%mm0 \n\t" // |L3-L4|
- "psubw %%mm3, %%mm1 \n\t" // |H3-H4|
- "psrlw $1, %%mm0 \n\t" // |L3 - L4|/2
- "psrlw $1, %%mm1 \n\t" // |H3 - H4|/2
-
- "pxor %%mm6, %%mm2 \n\t"
- "pxor %%mm7, %%mm3 \n\t"
- "pand %%mm2, %%mm4 \n\t"
- "pand %%mm3, %%mm5 \n\t"
-
-#if TEMPLATE_PP_MMXEXT
- "pminsw %%mm0, %%mm4 \n\t"
- "pminsw %%mm1, %%mm5 \n\t"
-#else
- "movq %%mm4, %%mm2 \n\t"
- "psubusw %%mm0, %%mm2 \n\t"
- "psubw %%mm2, %%mm4 \n\t"
- "movq %%mm5, %%mm2 \n\t"
- "psubusw %%mm1, %%mm2 \n\t"
- "psubw %%mm2, %%mm5 \n\t"
-#endif
- "pxor %%mm6, %%mm4 \n\t"
- "pxor %%mm7, %%mm5 \n\t"
- "psubw %%mm6, %%mm4 \n\t"
- "psubw %%mm7, %%mm5 \n\t"
- "packsswb %%mm5, %%mm4 \n\t"
- "movq %3, %%mm1 \n\t"
- "pandn %%mm4, %%mm1 \n\t"
- "movq (%0), %%mm0 \n\t"
- "paddb %%mm1, %%mm0 \n\t"
- "movq %%mm0, (%0) \n\t"
- "movq (%0, %1), %%mm0 \n\t"
- "psubb %%mm1, %%mm0 \n\t"
- "movq %%mm0, (%0, %1) \n\t"
-
- : "+r" (temp_src)
- : "r" ((x86_reg)step), "m" (c->pQPb), "m"(eq_mask), "r"(tmp)
- NAMED_CONSTRAINTS_ADD(w05,w20)
- : "%"FF_REG_a
- );
- }
-}
-#endif //TEMPLATE_PP_MMX
-
-static void RENAME(postProcess)(const uint8_t src[], int srcStride, uint8_t dst[], int dstStride, int width, int height,
- const int8_t QPs[], int QPStride, int isColor, PPContext *c);
-
-/**
- * Copy a block from src to dst and fixes the blacklevel.
- * levelFix == 0 -> do not touch the brightness & contrast
- */
-#undef REAL_SCALED_CPY
-#undef SCALED_CPY
-
-static inline void RENAME(blockCopy)(uint8_t dst[], int dstStride, const uint8_t src[], int srcStride,
- int levelFix, int64_t *packedOffsetAndScale)
-{
-#if !TEMPLATE_PP_MMX || !HAVE_6REGS
- int i;
-#endif
- if(levelFix){
-#if TEMPLATE_PP_MMX && HAVE_6REGS
- __asm__ volatile(
- "movq (%%"FF_REG_a"), %%mm2 \n\t" // packedYOffset
- "movq 8(%%"FF_REG_a"), %%mm3 \n\t" // packedYScale
- "lea (%2,%4), %%"FF_REG_a" \n\t"
- "lea (%3,%5), %%"FF_REG_d" \n\t"
- "pxor %%mm4, %%mm4 \n\t"
-#if TEMPLATE_PP_MMXEXT
-#define REAL_SCALED_CPY(src1, src2, dst1, dst2) \
- "movq " #src1 ", %%mm0 \n\t"\
- "movq " #src1 ", %%mm5 \n\t"\
- "movq " #src2 ", %%mm1 \n\t"\
- "movq " #src2 ", %%mm6 \n\t"\
- "punpcklbw %%mm0, %%mm0 \n\t"\
- "punpckhbw %%mm5, %%mm5 \n\t"\
- "punpcklbw %%mm1, %%mm1 \n\t"\
- "punpckhbw %%mm6, %%mm6 \n\t"\
- "pmulhuw %%mm3, %%mm0 \n\t"\
- "pmulhuw %%mm3, %%mm5 \n\t"\
- "pmulhuw %%mm3, %%mm1 \n\t"\
- "pmulhuw %%mm3, %%mm6 \n\t"\
- "psubw %%mm2, %%mm0 \n\t"\
- "psubw %%mm2, %%mm5 \n\t"\
- "psubw %%mm2, %%mm1 \n\t"\
- "psubw %%mm2, %%mm6 \n\t"\
- "packuswb %%mm5, %%mm0 \n\t"\
- "packuswb %%mm6, %%mm1 \n\t"\
- "movq %%mm0, " #dst1 " \n\t"\
- "movq %%mm1, " #dst2 " \n\t"\
-
-#else //TEMPLATE_PP_MMXEXT
-#define REAL_SCALED_CPY(src1, src2, dst1, dst2) \
- "movq " #src1 ", %%mm0 \n\t"\
- "movq " #src1 ", %%mm5 \n\t"\
- "punpcklbw %%mm4, %%mm0 \n\t"\
- "punpckhbw %%mm4, %%mm5 \n\t"\
- "psubw %%mm2, %%mm0 \n\t"\
- "psubw %%mm2, %%mm5 \n\t"\
- "movq " #src2 ", %%mm1 \n\t"\
- "psllw $6, %%mm0 \n\t"\
- "psllw $6, %%mm5 \n\t"\
- "pmulhw %%mm3, %%mm0 \n\t"\
- "movq " #src2 ", %%mm6 \n\t"\
- "pmulhw %%mm3, %%mm5 \n\t"\
- "punpcklbw %%mm4, %%mm1 \n\t"\
- "punpckhbw %%mm4, %%mm6 \n\t"\
- "psubw %%mm2, %%mm1 \n\t"\
- "psubw %%mm2, %%mm6 \n\t"\
- "psllw $6, %%mm1 \n\t"\
- "psllw $6, %%mm6 \n\t"\
- "pmulhw %%mm3, %%mm1 \n\t"\
- "pmulhw %%mm3, %%mm6 \n\t"\
- "packuswb %%mm5, %%mm0 \n\t"\
- "packuswb %%mm6, %%mm1 \n\t"\
- "movq %%mm0, " #dst1 " \n\t"\
- "movq %%mm1, " #dst2 " \n\t"\
-
-#endif //TEMPLATE_PP_MMXEXT
-#define SCALED_CPY(src1, src2, dst1, dst2)\
- REAL_SCALED_CPY(src1, src2, dst1, dst2)
-
-SCALED_CPY((%2) , (%2, %4) , (%3) , (%3, %5))
-SCALED_CPY((%2, %4, 2), (%%FF_REGa, %4, 2), (%3, %5, 2), (%%FF_REGd, %5, 2))
-SCALED_CPY((%2, %4, 4), (%%FF_REGa, %4, 4), (%3, %5, 4), (%%FF_REGd, %5, 4))
- "lea (%%"FF_REG_a",%4,4), %%"FF_REG_a" \n\t"
- "lea (%%"FF_REG_d",%5,4), %%"FF_REG_d" \n\t"
-SCALED_CPY((%%FF_REGa, %4), (%%FF_REGa, %4, 2), (%%FF_REGd, %5), (%%FF_REGd, %5, 2))
-
-
- : "=&a" (packedOffsetAndScale)
- : "0" (packedOffsetAndScale),
- "r"(src),
- "r"(dst),
- "r" ((x86_reg)srcStride),
- "r" ((x86_reg)dstStride)
- : "%"FF_REG_d
- );
-#else //TEMPLATE_PP_MMX && HAVE_6REGS
- for(i=0; i<8; i++)
- memcpy( &(dst[dstStride*i]),
- &(src[srcStride*i]), BLOCK_SIZE);
-#endif //TEMPLATE_PP_MMX && HAVE_6REGS
- }else{
-#if TEMPLATE_PP_MMX && HAVE_6REGS
- __asm__ volatile(
- "lea (%0,%2), %%"FF_REG_a" \n\t"
- "lea (%1,%3), %%"FF_REG_d" \n\t"
-
-#define REAL_SIMPLE_CPY(src1, src2, dst1, dst2) \
- "movq " #src1 ", %%mm0 \n\t"\
- "movq " #src2 ", %%mm1 \n\t"\
- "movq %%mm0, " #dst1 " \n\t"\
- "movq %%mm1, " #dst2 " \n\t"\
-
-#define SIMPLE_CPY(src1, src2, dst1, dst2)\
- REAL_SIMPLE_CPY(src1, src2, dst1, dst2)
-
-SIMPLE_CPY((%0) , (%0, %2) , (%1) , (%1, %3))
-SIMPLE_CPY((%0, %2, 2), (%%FF_REGa, %2, 2), (%1, %3, 2), (%%FF_REGd, %3, 2))
-SIMPLE_CPY((%0, %2, 4), (%%FF_REGa, %2, 4), (%1, %3, 4), (%%FF_REGd, %3, 4))
- "lea (%%"FF_REG_a",%2,4), %%"FF_REG_a" \n\t"
- "lea (%%"FF_REG_d",%3,4), %%"FF_REG_d" \n\t"
-SIMPLE_CPY((%%FF_REGa, %2), (%%FF_REGa, %2, 2), (%%FF_REGd, %3), (%%FF_REGd, %3, 2))
-
- : : "r" (src),
- "r" (dst),
- "r" ((x86_reg)srcStride),
- "r" ((x86_reg)dstStride)
- : "%"FF_REG_a, "%"FF_REG_d
- );
-#else //TEMPLATE_PP_MMX && HAVE_6REGS
- for(i=0; i<8; i++)
- memcpy( &(dst[dstStride*i]),
- &(src[srcStride*i]), BLOCK_SIZE);
-#endif //TEMPLATE_PP_MMX && HAVE_6REGS
- }
-}
-
-/**
- * Duplicate the given 8 src pixels ? times upward
- */
-static inline void RENAME(duplicate)(uint8_t src[], int stride)
-{
-#if TEMPLATE_PP_MMX
- __asm__ volatile(
- "movq (%0), %%mm0 \n\t"
- "movq %%mm0, (%0, %1, 4) \n\t"
- "add %1, %0 \n\t"
- "movq %%mm0, (%0) \n\t"
- "movq %%mm0, (%0, %1) \n\t"
- "movq %%mm0, (%0, %1, 2) \n\t"
- "movq %%mm0, (%0, %1, 4) \n\t"
- : "+r" (src)
- : "r" ((x86_reg)-stride)
- );
-#else
- int i;
- uint8_t *p=src;
- for(i=0; i<5; i++){
- p-= stride;
- memcpy(p, src, 8);
- }
-#endif
-}
-
-#if ARCH_X86 && TEMPLATE_PP_MMXEXT
-static inline void RENAME(prefetchnta)(const void *p)
-{
- __asm__ volatile( "prefetchnta (%0)\n\t"
- : : "r" (p)
- );
-}
-
-static inline void RENAME(prefetcht0)(const void *p)
-{
- __asm__ volatile( "prefetcht0 (%0)\n\t"
- : : "r" (p)
- );
-}
-
-static inline void RENAME(prefetcht1)(const void *p)
-{
- __asm__ volatile( "prefetcht1 (%0)\n\t"
- : : "r" (p)
- );
-}
-
-static inline void RENAME(prefetcht2)(const void *p)
-{
- __asm__ volatile( "prefetcht2 (%0)\n\t"
- : : "r" (p)
- );
-}
-#elif !ARCH_X86 && AV_GCC_VERSION_AT_LEAST(3,2)
-static inline void RENAME(prefetchnta)(const void *p)
-{
- __builtin_prefetch(p,0,0);
-}
-static inline void RENAME(prefetcht0)(const void *p)
-{
- __builtin_prefetch(p,0,1);
-}
-static inline void RENAME(prefetcht1)(const void *p)
-{
- __builtin_prefetch(p,0,2);
-}
-static inline void RENAME(prefetcht2)(const void *p)
-{
- __builtin_prefetch(p,0,3);
-}
-#else
-static inline void RENAME(prefetchnta)(const void *p)
-{
- return;
-}
-static inline void RENAME(prefetcht0)(const void *p)
-{
- return;
-}
-static inline void RENAME(prefetcht1)(const void *p)
-{
- return;
-}
-static inline void RENAME(prefetcht2)(const void *p)
-{
- return;
-}
-#endif
-/**
- * Filter array of bytes (Y or U or V values)
- */
-static void RENAME(postProcess)(const uint8_t src[], int srcStride, uint8_t dst[], int dstStride, int width, int height,
- const int8_t QPs[], int QPStride, int isColor, PPContext *c2)
-{
- DECLARE_ALIGNED(8, PPContext, c)= *c2; //copy to stack for faster access
- int x,y;
-#ifdef TEMPLATE_PP_TIME_MODE
- const int mode= TEMPLATE_PP_TIME_MODE;
-#else
- const int mode= isColor ? c.ppMode.chromMode : c.ppMode.lumMode;
-#endif
- int black=0, white=255; // blackest black and whitest white in the picture
- int QPCorrecture= 256*256;
-
- int copyAhead;
-#if TEMPLATE_PP_MMX
- int i;
-#endif
-
- const int qpHShift= isColor ? 4-c.hChromaSubSample : 4;
- const int qpVShift= isColor ? 4-c.vChromaSubSample : 4;
-
- //FIXME remove
- uint64_t * const yHistogram= c.yHistogram;
- uint8_t * const tempSrc= srcStride > 0 ? c.tempSrc : c.tempSrc - 23*srcStride;
- uint8_t * const tempDst= (dstStride > 0 ? c.tempDst : c.tempDst - 23*dstStride) + 32;
- //const int mbWidth= isColor ? (width+7)>>3 : (width+15)>>4;
-
- if (mode & VISUALIZE){
- if(!(mode & (V_A_DEBLOCK | H_A_DEBLOCK)) || TEMPLATE_PP_MMX) {
- av_log(c2, AV_LOG_WARNING, "Visualization is currently only supported with the accurate deblock filter without SIMD\n");
- }
- }
-
-#if TEMPLATE_PP_MMX
- for(i=0; i<57; i++){
- int offset= ((i*c.ppMode.baseDcDiff)>>8) + 1;
- int threshold= offset*2 + 1;
- c.mmxDcOffset[i]= 0x7F - offset;
- c.mmxDcThreshold[i]= 0x7F - threshold;
- c.mmxDcOffset[i]*= 0x0101010101010101LL;
- c.mmxDcThreshold[i]*= 0x0101010101010101LL;
- }
-#endif
-
- if(mode & CUBIC_IPOL_DEINT_FILTER) copyAhead=16;
- else if( (mode & LINEAR_BLEND_DEINT_FILTER)
- || (mode & FFMPEG_DEINT_FILTER)
- || (mode & LOWPASS5_DEINT_FILTER)) copyAhead=14;
- else if( (mode & V_DEBLOCK)
- || (mode & LINEAR_IPOL_DEINT_FILTER)
- || (mode & MEDIAN_DEINT_FILTER)
- || (mode & V_A_DEBLOCK)) copyAhead=13;
- else if(mode & V_X1_FILTER) copyAhead=11;
-// else if(mode & V_RK1_FILTER) copyAhead=10;
- else if(mode & DERING) copyAhead=9;
- else copyAhead=8;
-
- copyAhead-= 8;
-
- if(!isColor){
- uint64_t sum= 0;
- int i;
- uint64_t maxClipped;
- uint64_t clipped;
- AVRational scale;
-
- c.frameNum++;
- // first frame is fscked so we ignore it
- if(c.frameNum == 1) yHistogram[0]= width*(uint64_t)height/64*15/256;
-
- for(i=0; i<256; i++){
- sum+= yHistogram[i];
- }
-
- /* We always get a completely black picture first. */
- maxClipped= av_rescale(sum, c.ppMode.maxClippedThreshold.num, c.ppMode.maxClippedThreshold.den);
-
- clipped= sum;
- for(black=255; black>0; black--){
- if(clipped < maxClipped) break;
- clipped-= yHistogram[black];
- }
-
- clipped= sum;
- for(white=0; white<256; white++){
- if(clipped < maxClipped) break;
- clipped-= yHistogram[white];
- }
-
- scale = (AVRational){c.ppMode.maxAllowedY - c.ppMode.minAllowedY, white - black};
-
-#if TEMPLATE_PP_MMXEXT
- c.packedYScale = (uint16_t)av_rescale(scale.num, 256, scale.den);
- c.packedYOffset= (((black*c.packedYScale)>>8) - c.ppMode.minAllowedY) & 0xFFFF;
-#else
- c.packedYScale = (uint16_t)av_rescale(scale.num, 1024, scale.den);
- c.packedYOffset= (black - c.ppMode.minAllowedY) & 0xFFFF;
-#endif
-
- c.packedYOffset|= c.packedYOffset<<32;
- c.packedYOffset|= c.packedYOffset<<16;
-
- c.packedYScale|= c.packedYScale<<32;
- c.packedYScale|= c.packedYScale<<16;
-
- if(mode & LEVEL_FIX) QPCorrecture= (int)av_rescale(scale.num, 256*256, scale.den);
- else QPCorrecture= 256*256;
- }else{
- c.packedYScale= 0x0100010001000100LL;
- c.packedYOffset= 0;
- QPCorrecture= 256*256;
- }
-
- /* copy & deinterlace first row of blocks */
- y=-BLOCK_SIZE;
- {
- const uint8_t *srcBlock= &(src[y*srcStride]);
- uint8_t *dstBlock= tempDst + dstStride;
-
- // From this point on it is guaranteed that we can read and write 16 lines downward
- // finish 1 block before the next otherwise we might have a problem
- // with the L1 Cache of the P4 ... or only a few blocks at a time or something
- for(x=0; x<width; x+=BLOCK_SIZE){
- RENAME(prefetchnta)(srcBlock + (((x>>2)&6) + copyAhead)*srcStride + 32);
- RENAME(prefetchnta)(srcBlock + (((x>>2)&6) + copyAhead+1)*srcStride + 32);
- RENAME(prefetcht0)(dstBlock + (((x>>2)&6) + copyAhead)*dstStride + 32);
- RENAME(prefetcht0)(dstBlock + (((x>>2)&6) + copyAhead+1)*dstStride + 32);
-
- RENAME(blockCopy)(dstBlock + dstStride*8, dstStride,
- srcBlock + srcStride*8, srcStride, mode & LEVEL_FIX, &c.packedYOffset);
-
- RENAME(duplicate)(dstBlock + dstStride*8, dstStride);
-
- if(mode & LINEAR_IPOL_DEINT_FILTER)
- RENAME(deInterlaceInterpolateLinear)(dstBlock, dstStride);
- else if(mode & LINEAR_BLEND_DEINT_FILTER)
- RENAME(deInterlaceBlendLinear)(dstBlock, dstStride, c.deintTemp + x);
- else if(mode & MEDIAN_DEINT_FILTER)
- RENAME(deInterlaceMedian)(dstBlock, dstStride);
- else if(mode & CUBIC_IPOL_DEINT_FILTER)
- RENAME(deInterlaceInterpolateCubic)(dstBlock, dstStride);
- else if(mode & FFMPEG_DEINT_FILTER)
- RENAME(deInterlaceFF)(dstBlock, dstStride, c.deintTemp + x);
- else if(mode & LOWPASS5_DEINT_FILTER)
- RENAME(deInterlaceL5)(dstBlock, dstStride, c.deintTemp + x, c.deintTemp + width + x);
-/* else if(mode & CUBIC_BLEND_DEINT_FILTER)
- RENAME(deInterlaceBlendCubic)(dstBlock, dstStride);
-*/
- dstBlock+=8;
- srcBlock+=8;
- }
- if(width==FFABS(dstStride))
- linecpy(dst, tempDst + 9*dstStride, copyAhead, dstStride);
- else{
- int i;
- for(i=0; i<copyAhead; i++){
- memcpy(dst + i*dstStride, tempDst + (9+i)*dstStride, width);
- }
- }
- }
-
- for(y=0; y<height; y+=BLOCK_SIZE){
- //1% speedup if these are here instead of the inner loop
- const uint8_t *srcBlock= &(src[y*srcStride]);
- uint8_t *dstBlock= &(dst[y*dstStride]);
-#if TEMPLATE_PP_MMX
- uint8_t *tempBlock1= c.tempBlocks;
- uint8_t *tempBlock2= c.tempBlocks + 8;
-#endif
- const int8_t *QPptr= &QPs[(y>>qpVShift)*QPStride];
- int8_t *nonBQPptr= &c.nonBQPTable[(y>>qpVShift)*FFABS(QPStride)];
- int QP=0, nonBQP=0;
- /* can we mess with a 8x16 block from srcBlock/dstBlock downwards and 1 line upwards
- if not than use a temporary buffer */
- if(y+15 >= height){
- int i;
- /* copy from line (copyAhead) to (copyAhead+7) of src, these will be copied with
- blockcopy to dst later */
- linecpy(tempSrc + srcStride*copyAhead, srcBlock + srcStride*copyAhead,
- FFMAX(height-y-copyAhead, 0), srcStride);
-
- /* duplicate last line of src to fill the void up to line (copyAhead+7) */
- for(i=FFMAX(height-y, 8); i<copyAhead+8; i++)
- memcpy(tempSrc + srcStride*i, src + srcStride*(height-1), FFABS(srcStride));
-
- /* copy up to (copyAhead+1) lines of dst (line -1 to (copyAhead-1))*/
- linecpy(tempDst, dstBlock - dstStride, FFMIN(height-y+1, copyAhead+1), dstStride);
-
- /* duplicate last line of dst to fill the void up to line (copyAhead) */
- for(i=height-y+1; i<=copyAhead; i++)
- memcpy(tempDst + dstStride*i, dst + dstStride*(height-1), FFABS(dstStride));
-
- dstBlock= tempDst + dstStride;
- srcBlock= tempSrc;
- }
-
- // From this point on it is guaranteed that we can read and write 16 lines downward
- // finish 1 block before the next otherwise we might have a problem
- // with the L1 Cache of the P4 ... or only a few blocks at a time or something
- for(x=0; x<width; ){
- int startx = x;
- int endx = FFMIN(width, x+32);
- uint8_t *dstBlockStart = dstBlock;
- const uint8_t *srcBlockStart = srcBlock;
- int qp_index = 0;
- for(qp_index=0; qp_index < (endx-startx)/BLOCK_SIZE; qp_index++){
- QP = QPptr[(x+qp_index*BLOCK_SIZE)>>qpHShift];
- nonBQP = nonBQPptr[(x+qp_index*BLOCK_SIZE)>>qpHShift];
- if(!isColor){
- QP= (QP* QPCorrecture + 256*128)>>16;
- nonBQP= (nonBQP* QPCorrecture + 256*128)>>16;
- yHistogram[(srcBlock+qp_index*8)[srcStride*12 + 4]]++;
- }
- c.QP_block[qp_index] = QP;
- c.nonBQP_block[qp_index] = nonBQP;
-#if TEMPLATE_PP_MMX
- __asm__ volatile(
- "movd %1, %%mm7 \n\t"
- "packuswb %%mm7, %%mm7 \n\t" // 0, 0, 0, QP, 0, 0, 0, QP
- "packuswb %%mm7, %%mm7 \n\t" // 0,QP, 0, QP, 0,QP, 0, QP
- "packuswb %%mm7, %%mm7 \n\t" // QP,..., QP
- "movq %%mm7, %0 \n\t"
- : "=m" (c.pQPb_block[qp_index])
- : "r" (QP)
- );
-#endif
- }
- for(; x < endx; x+=BLOCK_SIZE){
- RENAME(prefetchnta)(srcBlock + (((x>>2)&6) + copyAhead)*srcStride + 32);
- RENAME(prefetchnta)(srcBlock + (((x>>2)&6) + copyAhead+1)*srcStride + 32);
- RENAME(prefetcht0)(dstBlock + (((x>>2)&6) + copyAhead)*dstStride + 32);
- RENAME(prefetcht0)(dstBlock + (((x>>2)&6) + copyAhead+1)*dstStride + 32);
-
- RENAME(blockCopy)(dstBlock + dstStride*copyAhead, dstStride,
- srcBlock + srcStride*copyAhead, srcStride, mode & LEVEL_FIX, &c.packedYOffset);
-
- if(mode & LINEAR_IPOL_DEINT_FILTER)
- RENAME(deInterlaceInterpolateLinear)(dstBlock, dstStride);
- else if(mode & LINEAR_BLEND_DEINT_FILTER)
- RENAME(deInterlaceBlendLinear)(dstBlock, dstStride, c.deintTemp + x);
- else if(mode & MEDIAN_DEINT_FILTER)
- RENAME(deInterlaceMedian)(dstBlock, dstStride);
- else if(mode & CUBIC_IPOL_DEINT_FILTER)
- RENAME(deInterlaceInterpolateCubic)(dstBlock, dstStride);
- else if(mode & FFMPEG_DEINT_FILTER)
- RENAME(deInterlaceFF)(dstBlock, dstStride, c.deintTemp + x);
- else if(mode & LOWPASS5_DEINT_FILTER)
- RENAME(deInterlaceL5)(dstBlock, dstStride, c.deintTemp + x, c.deintTemp + width + x);
-/* else if(mode & CUBIC_BLEND_DEINT_FILTER)
- RENAME(deInterlaceBlendCubic)(dstBlock, dstStride);
-*/
- dstBlock+=8;
- srcBlock+=8;
- }
-
- dstBlock = dstBlockStart;
- srcBlock = srcBlockStart;
-
- for(x = startx, qp_index = 0; x < endx; x+=BLOCK_SIZE, qp_index++){
- const int stride= dstStride;
- //temporary while changing QP stuff to make things continue to work
- //eventually QP,nonBQP,etc will be arrays and this will be unnecessary
- c.QP = c.QP_block[qp_index];
- c.nonBQP = c.nonBQP_block[qp_index];
- c.pQPb = c.pQPb_block[qp_index];
- c.pQPb2 = c.pQPb2_block[qp_index];
-
- /* only deblock if we have 2 blocks */
- if(y + 8 < height){
- if(mode & V_X1_FILTER)
- RENAME(vertX1Filter)(dstBlock, stride, &c);
- else if(mode & V_DEBLOCK){
- const int t= RENAME(vertClassify)(dstBlock, stride, &c);
-
- if(t==1)
- RENAME(doVertLowPass)(dstBlock, stride, &c);
- else if(t==2)
- RENAME(doVertDefFilter)(dstBlock, stride, &c);
- }else if(mode & V_A_DEBLOCK){
- RENAME(do_a_deblock)(dstBlock, stride, 1, &c, mode);
- }
- }
-
- dstBlock+=8;
- srcBlock+=8;
- }
-
- dstBlock = dstBlockStart;
- srcBlock = srcBlockStart;
-
- for(x = startx, qp_index=0; x < endx; x+=BLOCK_SIZE, qp_index++){
- const int stride= dstStride;
- av_unused uint8_t *tmpXchg;
- c.QP = c.QP_block[qp_index];
- c.nonBQP = c.nonBQP_block[qp_index];
- c.pQPb = c.pQPb_block[qp_index];
- c.pQPb2 = c.pQPb2_block[qp_index];
-#if TEMPLATE_PP_MMX
- RENAME(transpose1)(tempBlock1, tempBlock2, dstBlock, dstStride);
-#endif
- /* check if we have a previous block to deblock it with dstBlock */
- if(x - 8 >= 0){
-#if TEMPLATE_PP_MMX
- if(mode & H_X1_FILTER)
- RENAME(vertX1Filter)(tempBlock1, 16, &c);
- else if(mode & H_DEBLOCK){
- const int t= RENAME(vertClassify)(tempBlock1, 16, &c);
- if(t==1)
- RENAME(doVertLowPass)(tempBlock1, 16, &c);
- else if(t==2)
- RENAME(doVertDefFilter)(tempBlock1, 16, &c);
- }else if(mode & H_A_DEBLOCK){
- RENAME(do_a_deblock)(tempBlock1, 16, 1, &c, mode);
- }
-
- RENAME(transpose2)(dstBlock-4, dstStride, tempBlock1 + 4*16);
-
-#else
- if(mode & H_X1_FILTER)
- horizX1Filter(dstBlock-4, stride, c.QP);
- else if(mode & H_DEBLOCK){
-#if TEMPLATE_PP_ALTIVEC
- DECLARE_ALIGNED(16, unsigned char, tempBlock)[272];
- int t;
- transpose_16x8_char_toPackedAlign_altivec(tempBlock, dstBlock - (4 + 1), stride);
-
- t = vertClassify_altivec(tempBlock-48, 16, &c);
- if(t==1) {
- doVertLowPass_altivec(tempBlock-48, 16, &c);
- transpose_8x16_char_fromPackedAlign_altivec(dstBlock - (4 + 1), tempBlock, stride);
- }
- else if(t==2) {
- doVertDefFilter_altivec(tempBlock-48, 16, &c);
- transpose_8x16_char_fromPackedAlign_altivec(dstBlock - (4 + 1), tempBlock, stride);
- }
-#else
- const int t= RENAME(horizClassify)(dstBlock-4, stride, &c);
-
- if(t==1)
- RENAME(doHorizLowPass)(dstBlock-4, stride, &c);
- else if(t==2)
- RENAME(doHorizDefFilter)(dstBlock-4, stride, &c);
-#endif
- }else if(mode & H_A_DEBLOCK){
- RENAME(do_a_deblock)(dstBlock-8, 1, stride, &c, mode);
- }
-#endif //TEMPLATE_PP_MMX
- if(mode & DERING){
- //FIXME filter first line
- if(y>0) RENAME(dering)(dstBlock - stride - 8, stride, &c);
- }
-
- if(mode & TEMP_NOISE_FILTER)
- {
- RENAME(tempNoiseReducer)(dstBlock-8, stride,
- c.tempBlurred[isColor] + y*dstStride + x,
- c.tempBlurredPast[isColor] + (y>>3)*256 + (x>>3) + 256,
- c.ppMode.maxTmpNoise);
- }
- }
-
- dstBlock+=8;
- srcBlock+=8;
-
-#if TEMPLATE_PP_MMX
- tmpXchg= tempBlock1;
- tempBlock1= tempBlock2;
- tempBlock2 = tmpXchg;
-#endif
- }
- }
-
- if(mode & DERING){
- if(y > 0) RENAME(dering)(dstBlock - dstStride - 8, dstStride, &c);
- }
-
- if((mode & TEMP_NOISE_FILTER)){
- RENAME(tempNoiseReducer)(dstBlock-8, dstStride,
- c.tempBlurred[isColor] + y*dstStride + x,
- c.tempBlurredPast[isColor] + (y>>3)*256 + (x>>3) + 256,
- c.ppMode.maxTmpNoise);
- }
-
- /* did we use a tmp buffer for the last lines*/
- if(y+15 >= height){
- uint8_t *dstBlock= &(dst[y*dstStride]);
- if(width==FFABS(dstStride))
- linecpy(dstBlock, tempDst + dstStride, height-y, dstStride);
- else{
- int i;
- for(i=0; i<height-y; i++){
- memcpy(dstBlock + i*dstStride, tempDst + (i+1)*dstStride, width);
- }
- }
- }
- }
-#if TEMPLATE_PP_3DNOW
- __asm__ volatile("femms");
-#elif TEMPLATE_PP_MMX
- __asm__ volatile("emms");
-#endif
-
-#ifdef DEBUG_BRIGHTNESS
- if(!isColor){
- int max=1;
- int i;
- for(i=0; i<256; i++)
- if(yHistogram[i] > max) max=yHistogram[i];
-
- for(i=1; i<256; i++){
- int x;
- int start=yHistogram[i-1]/(max/256+1);
- int end=yHistogram[i]/(max/256+1);
- int inc= end > start ? 1 : -1;
- for(x=start; x!=end+inc; x+=inc)
- dst[ i*dstStride + x]+=128;
- }
-
- for(i=0; i<100; i+=2){
- dst[ (white)*dstStride + i]+=128;
- dst[ (black)*dstStride + i]+=128;
- }
- }
-#endif
-
- *c2= c; //copy local context back
-
-}
-
-#undef RENAME
-#undef TEMPLATE_PP_C
-#undef TEMPLATE_PP_ALTIVEC
-#undef TEMPLATE_PP_MMX
-#undef TEMPLATE_PP_MMXEXT
-#undef TEMPLATE_PP_3DNOW
-#undef TEMPLATE_PP_SSE2
diff --git a/libswresample/tests/swresample.c b/libswresample/tests/swresample.c
deleted file mode 100644
index 5389658..0000000
--- a/libswresample/tests/swresample.c
+++ /dev/null
@@ -1,422 +0,0 @@
-/*
- * Copyright (C) 2011-2012 Michael Niedermayer (michaelni@gmx.at)
- * Copyright (c) 2002 Fabrice Bellard
- *
- * This file is part of libswresample
- *
- * libswresample is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * libswresample is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with libswresample; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#include "libavutil/avassert.h"
-#include "libavutil/channel_layout.h"
-#include "libavutil/common.h"
-#include "libavutil/opt.h"
-
-#include "libswresample/swresample.h"
-
-#undef time
-#include <time.h>
-#undef fprintf
-
-#define SAMPLES 1000
-
-#define SWR_CH_MAX 32
-
-#define ASSERT_LEVEL 2
-
-static double get(uint8_t *a[], int ch, int index, int ch_count, enum AVSampleFormat f){
- const uint8_t *p;
- if(av_sample_fmt_is_planar(f)){
- f= av_get_alt_sample_fmt(f, 0);
- p= a[ch];
- }else{
- p= a[0];
- index= ch + index*ch_count;
- }
-
- switch(f){
- case AV_SAMPLE_FMT_U8 : return ((const uint8_t*)p)[index]/127.0-1.0;
- case AV_SAMPLE_FMT_S16: return ((const int16_t*)p)[index]/32767.0;
- case AV_SAMPLE_FMT_S32: return ((const int32_t*)p)[index]/2147483647.0;
- case AV_SAMPLE_FMT_FLT: return ((const float *)p)[index];
- case AV_SAMPLE_FMT_DBL: return ((const double *)p)[index];
- default: av_assert0(0);
- }
-}
-
-static void set(uint8_t *a[], int ch, int index, int ch_count, enum AVSampleFormat f, double v){
- uint8_t *p;
- if(av_sample_fmt_is_planar(f)){
- f= av_get_alt_sample_fmt(f, 0);
- p= a[ch];
- }else{
- p= a[0];
- index= ch + index*ch_count;
- }
- switch(f){
- case AV_SAMPLE_FMT_U8 : ((uint8_t*)p)[index]= av_clip_uint8 (lrint((v+1.0)*127)); break;
- case AV_SAMPLE_FMT_S16: ((int16_t*)p)[index]= av_clip_int16 (lrint(v*32767)); break;
- case AV_SAMPLE_FMT_S32: ((int32_t*)p)[index]= av_clipl_int32(llrint(v*2147483647)); break;
- case AV_SAMPLE_FMT_FLT: ((float *)p)[index]= v; break;
- case AV_SAMPLE_FMT_DBL: ((double *)p)[index]= v; break;
- default: av_assert2(0);
- }
-}
-
-static void shift(uint8_t *a[], int index, int ch_count, enum AVSampleFormat f){
- int ch;
-
- if(av_sample_fmt_is_planar(f)){
- f= av_get_alt_sample_fmt(f, 0);
- for(ch= 0; ch<ch_count; ch++)
- a[ch] += index*av_get_bytes_per_sample(f);
- }else{
- a[0] += index*ch_count*av_get_bytes_per_sample(f);
- }
-}
-
-static const enum AVSampleFormat formats[] = {
- AV_SAMPLE_FMT_S16,
- AV_SAMPLE_FMT_FLTP,
- AV_SAMPLE_FMT_S16P,
- AV_SAMPLE_FMT_FLT,
- AV_SAMPLE_FMT_S32P,
- AV_SAMPLE_FMT_S32,
- AV_SAMPLE_FMT_U8P,
- AV_SAMPLE_FMT_U8,
- AV_SAMPLE_FMT_DBLP,
- AV_SAMPLE_FMT_DBL,
-};
-
-static const int rates[] = {
- 8000,
- 11025,
- 16000,
- 22050,
- 32000,
- 48000,
-};
-
-static const uint64_t layouts[]={
- AV_CH_LAYOUT_MONO ,
- AV_CH_LAYOUT_STEREO ,
- AV_CH_LAYOUT_2_1 ,
- AV_CH_LAYOUT_SURROUND ,
- AV_CH_LAYOUT_4POINT0 ,
- AV_CH_LAYOUT_2_2 ,
- AV_CH_LAYOUT_QUAD ,
- AV_CH_LAYOUT_5POINT0 ,
- AV_CH_LAYOUT_5POINT1 ,
- AV_CH_LAYOUT_5POINT0_BACK ,
- AV_CH_LAYOUT_5POINT1_BACK ,
- AV_CH_LAYOUT_7POINT0 ,
- AV_CH_LAYOUT_7POINT1 ,
- AV_CH_LAYOUT_7POINT1_WIDE ,
-};
-
-static void setup_array(uint8_t *out[SWR_CH_MAX], uint8_t *in, enum AVSampleFormat format, int samples){
- if(av_sample_fmt_is_planar(format)){
- int i;
- int plane_size= av_get_bytes_per_sample(format&0xFF)*samples;
- format&=0xFF;
- for(i=0; i<SWR_CH_MAX; i++){
- out[i]= in + i*plane_size;
- }
- }else{
- out[0]= in;
- }
-}
-
-static int cmp(const void *a, const void *b){
- return *(const int *)a - *(const int *)b;
-}
-
-static void audiogen(void *data, enum AVSampleFormat sample_fmt,
- int channels, int sample_rate, int nb_samples)
-{
- int i, ch, k;
- double v, f, a, ampa;
- double tabf1[SWR_CH_MAX];
- double tabf2[SWR_CH_MAX];
- double taba[SWR_CH_MAX];
- unsigned static rnd;
-
-#define PUT_SAMPLE set(data, ch, k, channels, sample_fmt, v);
-#define uint_rand(x) ((x) = (x) * 1664525 + 1013904223)
-#define dbl_rand(x) (uint_rand(x)*2.0 / (double)UINT_MAX - 1)
- k = 0;
-
- /* 1 second of single freq sinus at 1000 Hz */
- a = 0;
- for (i = 0; i < 1 * sample_rate && k < nb_samples; i++, k++) {
- v = sin(a) * 0.30;
- for (ch = 0; ch < channels; ch++)
- PUT_SAMPLE
- a += M_PI * 1000.0 * 2.0 / sample_rate;
- }
-
- /* 1 second of varying frequency between 100 and 10000 Hz */
- a = 0;
- for (i = 0; i < 1 * sample_rate && k < nb_samples; i++, k++) {
- v = sin(a) * 0.30;
- for (ch = 0; ch < channels; ch++)
- PUT_SAMPLE
- f = 100.0 + (((10000.0 - 100.0) * i) / sample_rate);
- a += M_PI * f * 2.0 / sample_rate;
- }
-
- /* 0.5 second of low amplitude white noise */
- for (i = 0; i < sample_rate / 2 && k < nb_samples; i++, k++) {
- v = dbl_rand(rnd) * 0.30;
- for (ch = 0; ch < channels; ch++)
- PUT_SAMPLE
- }
-
- /* 0.5 second of high amplitude white noise */
- for (i = 0; i < sample_rate / 2 && k < nb_samples; i++, k++) {
- v = dbl_rand(rnd);
- for (ch = 0; ch < channels; ch++)
- PUT_SAMPLE
- }
-
- /* 1 second of unrelated ramps for each channel */
- for (ch = 0; ch < channels; ch++) {
- taba[ch] = 0;
- tabf1[ch] = 100 + uint_rand(rnd) % 5000;
- tabf2[ch] = 100 + uint_rand(rnd) % 5000;
- }
- for (i = 0; i < 1 * sample_rate && k < nb_samples; i++, k++) {
- for (ch = 0; ch < channels; ch++) {
- v = sin(taba[ch]) * 0.30;
- PUT_SAMPLE
- f = tabf1[ch] + (((tabf2[ch] - tabf1[ch]) * i) / sample_rate);
- taba[ch] += M_PI * f * 2.0 / sample_rate;
- }
- }
-
- /* 2 seconds of 500 Hz with varying volume */
- a = 0;
- ampa = 0;
- for (i = 0; i < 2 * sample_rate && k < nb_samples; i++, k++) {
- for (ch = 0; ch < channels; ch++) {
- double amp = (1.0 + sin(ampa)) * 0.15;
- if (ch & 1)
- amp = 0.30 - amp;
- v = sin(a) * amp;
- PUT_SAMPLE
- a += M_PI * 500.0 * 2.0 / sample_rate;
- ampa += M_PI * 2.0 / sample_rate;
- }
- }
-}
-
-int main(int argc, char **argv){
- int in_sample_rate, out_sample_rate, ch ,i, flush_count;
- uint64_t in_ch_layout, out_ch_layout;
- enum AVSampleFormat in_sample_fmt, out_sample_fmt;
- uint8_t array_in[SAMPLES*8*8];
- uint8_t array_mid[SAMPLES*8*8*3];
- uint8_t array_out[SAMPLES*8*8+100];
- uint8_t *ain[SWR_CH_MAX];
- uint8_t *aout[SWR_CH_MAX];
- uint8_t *amid[SWR_CH_MAX];
- int flush_i=0;
- int mode;
- int num_tests = 10000;
- uint32_t seed = 0;
- uint32_t rand_seed = 0;
- int remaining_tests[FF_ARRAY_ELEMS(rates) * FF_ARRAY_ELEMS(layouts) * FF_ARRAY_ELEMS(formats) * FF_ARRAY_ELEMS(layouts) * FF_ARRAY_ELEMS(formats)];
- int max_tests = FF_ARRAY_ELEMS(remaining_tests);
- int test;
- int specific_test= -1;
-
- struct SwrContext * forw_ctx= NULL;
- struct SwrContext *backw_ctx= NULL;
-
- if (argc > 1) {
- if (!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")) {
- av_log(NULL, AV_LOG_INFO, "Usage: swresample-test [<num_tests>[ <test>]] \n"
- "num_tests Default is %d\n", num_tests);
- return 0;
- }
- num_tests = strtol(argv[1], NULL, 0);
- if(num_tests < 0) {
- num_tests = -num_tests;
- rand_seed = time(0);
- }
- if(num_tests<= 0 || num_tests>max_tests)
- num_tests = max_tests;
- if(argc > 2) {
- specific_test = strtol(argv[1], NULL, 0);
- }
- }
-
- for(i=0; i<max_tests; i++)
- remaining_tests[i] = i;
-
- for(test=0; test<num_tests; test++){
- unsigned r;
- uint_rand(seed);
- r = (seed * (uint64_t)(max_tests - test)) >>32;
- FFSWAP(int, remaining_tests[r], remaining_tests[max_tests - test - 1]);
- }
- qsort(remaining_tests + max_tests - num_tests, num_tests, sizeof(remaining_tests[0]), cmp);
- in_sample_rate=16000;
- for(test=0; test<num_tests; test++){
- char in_layout_string[256];
- char out_layout_string[256];
- unsigned vector= remaining_tests[max_tests - test - 1];
- int in_ch_count;
- int out_count, mid_count, out_ch_count;
-
- in_ch_layout = layouts[vector % FF_ARRAY_ELEMS(layouts)]; vector /= FF_ARRAY_ELEMS(layouts);
- out_ch_layout = layouts[vector % FF_ARRAY_ELEMS(layouts)]; vector /= FF_ARRAY_ELEMS(layouts);
- in_sample_fmt = formats[vector % FF_ARRAY_ELEMS(formats)]; vector /= FF_ARRAY_ELEMS(formats);
- out_sample_fmt = formats[vector % FF_ARRAY_ELEMS(formats)]; vector /= FF_ARRAY_ELEMS(formats);
- out_sample_rate = rates [vector % FF_ARRAY_ELEMS(rates )]; vector /= FF_ARRAY_ELEMS(rates);
- av_assert0(!vector);
-
- if(specific_test == 0){
- if(out_sample_rate != in_sample_rate || in_ch_layout != out_ch_layout)
- continue;
- }
-
- in_ch_count= av_get_channel_layout_nb_channels(in_ch_layout);
- out_ch_count= av_get_channel_layout_nb_channels(out_ch_layout);
- av_get_channel_layout_string( in_layout_string, sizeof( in_layout_string), in_ch_count, in_ch_layout);
- av_get_channel_layout_string(out_layout_string, sizeof(out_layout_string), out_ch_count, out_ch_layout);
- fprintf(stderr, "TEST: %s->%s, rate:%5d->%5d, fmt:%s->%s\n",
- in_layout_string, out_layout_string,
- in_sample_rate, out_sample_rate,
- av_get_sample_fmt_name(in_sample_fmt), av_get_sample_fmt_name(out_sample_fmt));
- forw_ctx = swr_alloc_set_opts(forw_ctx, out_ch_layout, out_sample_fmt, out_sample_rate,
- in_ch_layout, in_sample_fmt, in_sample_rate,
- 0, 0);
- backw_ctx = swr_alloc_set_opts(backw_ctx, in_ch_layout, in_sample_fmt, in_sample_rate,
- out_ch_layout, out_sample_fmt, out_sample_rate,
- 0, 0);
- if(!forw_ctx) {
- fprintf(stderr, "Failed to init forw_cts\n");
- return 1;
- }
- if(!backw_ctx) {
- fprintf(stderr, "Failed to init backw_ctx\n");
- return 1;
- }
- if (uint_rand(rand_seed) % 3 == 0)
- av_opt_set_int(forw_ctx, "ich", 0, 0);
- if (uint_rand(rand_seed) % 3 == 0)
- av_opt_set_int(forw_ctx, "och", 0, 0);
-
- if(swr_init( forw_ctx) < 0)
- fprintf(stderr, "swr_init(->) failed\n");
- if(swr_init(backw_ctx) < 0)
- fprintf(stderr, "swr_init(<-) failed\n");
- //FIXME test planar
- setup_array(ain , array_in , in_sample_fmt, SAMPLES);
- setup_array(amid, array_mid, out_sample_fmt, 3*SAMPLES);
- setup_array(aout, array_out, in_sample_fmt , SAMPLES);
-#if 0
- for(ch=0; ch<in_ch_count; ch++){
- for(i=0; i<SAMPLES; i++)
- set(ain, ch, i, in_ch_count, in_sample_fmt, sin(i*i*3/SAMPLES));
- }
-#else
- audiogen(ain, in_sample_fmt, in_ch_count, SAMPLES/6+1, SAMPLES);
-#endif
- mode = uint_rand(rand_seed) % 3;
- if(mode==0 /*|| out_sample_rate == in_sample_rate*/) {
- mid_count= swr_convert(forw_ctx, amid, 3*SAMPLES, (const uint8_t **)ain, SAMPLES);
- } else if(mode==1){
- mid_count= swr_convert(forw_ctx, amid, 0, (const uint8_t **)ain, SAMPLES);
- mid_count+=swr_convert(forw_ctx, amid, 3*SAMPLES, (const uint8_t **)ain, 0);
- } else {
- int tmp_count;
- mid_count= swr_convert(forw_ctx, amid, 0, (const uint8_t **)ain, 1);
- av_assert0(mid_count==0);
- shift(ain, 1, in_ch_count, in_sample_fmt);
- mid_count+=swr_convert(forw_ctx, amid, 3*SAMPLES, (const uint8_t **)ain, 0);
- shift(amid, mid_count, out_ch_count, out_sample_fmt); tmp_count = mid_count;
- mid_count+=swr_convert(forw_ctx, amid, 2, (const uint8_t **)ain, 2);
- shift(amid, mid_count-tmp_count, out_ch_count, out_sample_fmt); tmp_count = mid_count;
- shift(ain, 2, in_ch_count, in_sample_fmt);
- mid_count+=swr_convert(forw_ctx, amid, 1, (const uint8_t **)ain, SAMPLES-3);
- shift(amid, mid_count-tmp_count, out_ch_count, out_sample_fmt); tmp_count = mid_count;
- shift(ain, -3, in_ch_count, in_sample_fmt);
- mid_count+=swr_convert(forw_ctx, amid, 3*SAMPLES, (const uint8_t **)ain, 0);
- shift(amid, -tmp_count, out_ch_count, out_sample_fmt);
- }
- out_count= swr_convert(backw_ctx,aout, SAMPLES, (const uint8_t **)amid, mid_count);
-
- for(ch=0; ch<in_ch_count; ch++){
- double sse, maxdiff=0;
- double sum_a= 0;
- double sum_b= 0;
- double sum_aa= 0;
- double sum_bb= 0;
- double sum_ab= 0;
- for(i=0; i<out_count; i++){
- double a= get(ain , ch, i, in_ch_count, in_sample_fmt);
- double b= get(aout, ch, i, in_ch_count, in_sample_fmt);
- sum_a += a;
- sum_b += b;
- sum_aa+= a*a;
- sum_bb+= b*b;
- sum_ab+= a*b;
- maxdiff= FFMAX(maxdiff, fabs(a-b));
- }
- sse= sum_aa + sum_bb - 2*sum_ab;
- if(sse < 0 && sse > -0.00001) sse=0; //fix rounding error
-
- fprintf(stderr, "[e:%f c:%f max:%f] len:%5d\n", out_count ? sqrt(sse/out_count) : 0, sum_ab/(sqrt(sum_aa*sum_bb)), maxdiff, out_count);
- }
-
- flush_i++;
- flush_i%=21;
- flush_count = swr_convert(backw_ctx,aout, flush_i, 0, 0);
- shift(aout, flush_i, in_ch_count, in_sample_fmt);
- flush_count+= swr_convert(backw_ctx,aout, SAMPLES-flush_i, 0, 0);
- shift(aout, -flush_i, in_ch_count, in_sample_fmt);
- if(flush_count){
- for(ch=0; ch<in_ch_count; ch++){
- double sse, maxdiff=0;
- double sum_a= 0;
- double sum_b= 0;
- double sum_aa= 0;
- double sum_bb= 0;
- double sum_ab= 0;
- for(i=0; i<flush_count; i++){
- double a= get(ain , ch, i+out_count, in_ch_count, in_sample_fmt);
- double b= get(aout, ch, i, in_ch_count, in_sample_fmt);
- sum_a += a;
- sum_b += b;
- sum_aa+= a*a;
- sum_bb+= b*b;
- sum_ab+= a*b;
- maxdiff= FFMAX(maxdiff, fabs(a-b));
- }
- sse= sum_aa + sum_bb - 2*sum_ab;
- if(sse < 0 && sse > -0.00001) sse=0; //fix rounding error
-
- fprintf(stderr, "[e:%f c:%f max:%f] len:%5d F:%3d\n", sqrt(sse/flush_count), sum_ab/(sqrt(sum_aa*sum_bb)), maxdiff, flush_count, flush_i);
- }
- }
-
-
- fprintf(stderr, "\n");
- }
-
- return 0;
-}
diff --git a/manifest/ffmpeg b/manifest/ffmpeg
new file mode 100644
index 0000000..a651d71
--- /dev/null
+++ b/manifest/ffmpeg
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<manifest>
+ <imports>
+ <import remote="https://fuchsia.googlesource.com/garnet"
+ manifest="manifest/garnet"
+ name="garnet"
+ revision="e558fa19d9178d5e61a650cfdc1a2afe6ae2292f"/>
+ </imports>
+ <projects>
+ <project name="third_party/ffmpeg"
+ path="third_party/ffmpeg"
+ remote="https://fuchsia.googlesource.com/third_party/ffmpeg"
+ gerrithost="https://fuchsia-review.googlesource.com"/>
+ <project name="third_party/yasm"
+ path="third_party/yasm"
+ remote="https://fuchsia.googlesource.com/third_party/yasm"
+ gerrithost="https://fuchsia-review.googlesource.com"
+ revision="edb428581932cfc87873aa44f4ff8b3a8c37bd09"/>
+ </projects>
+</manifest>
diff --git a/packages/ffmpeg b/packages/ffmpeg
new file mode 100644
index 0000000..be44b63
--- /dev/null
+++ b/packages/ffmpeg
@@ -0,0 +1,5 @@
+{
+ "labels": [
+ "//third_party/ffmpeg"
+ ]
+}
diff --git a/tests/checkasm/aacpsdsp.c b/tests/checkasm/aacpsdsp.c
deleted file mode 100644
index 2ceef43..0000000
--- a/tests/checkasm/aacpsdsp.c
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "libavcodec/aacpsdsp.h"
-#include "libavutil/intfloat.h"
-
-#include "checkasm.h"
-
-#define N 32
-#define STRIDE 128
-#define BUF_SIZE (N * STRIDE)
-
-#define randomize(buf, len) do { \
- int i; \
- for (i = 0; i < len; i++) { \
- const INTFLOAT f = (INTFLOAT)rnd() / UINT_MAX; \
- (buf)[i] = f; \
- } \
-} while (0)
-
-#define EPS 0.005
-
-static void clear_less_significant_bits(INTFLOAT *buf, int len, int bits)
-{
- int i;
- for (i = 0; i < len; i++) {
- union av_intfloat32 u = { .f = buf[i] };
- u.i &= (0xffffffff << bits);
- buf[i] = u.f;
- }
-}
-
-static void test_add_squares(void)
-{
- LOCAL_ALIGNED_16(INTFLOAT, dst0, [BUF_SIZE]);
- LOCAL_ALIGNED_16(INTFLOAT, dst1, [BUF_SIZE]);
- LOCAL_ALIGNED_16(INTFLOAT, src, [BUF_SIZE], [2]);
-
- declare_func(void, INTFLOAT *dst,
- const INTFLOAT (*src)[2], int n);
-
- randomize((INTFLOAT *)src, BUF_SIZE * 2);
- randomize(dst0, BUF_SIZE);
- memcpy(dst1, dst0, BUF_SIZE * sizeof(INTFLOAT));
- call_ref(dst0, src, BUF_SIZE);
- call_new(dst1, src, BUF_SIZE);
- if (!float_near_abs_eps_array(dst0, dst1, EPS, BUF_SIZE))
- fail();
- bench_new(dst1, src, BUF_SIZE);
-}
-
-static void test_mul_pair_single(void)
-{
- LOCAL_ALIGNED_16(INTFLOAT, dst0, [BUF_SIZE], [2]);
- LOCAL_ALIGNED_16(INTFLOAT, dst1, [BUF_SIZE], [2]);
- LOCAL_ALIGNED_16(INTFLOAT, src0, [BUF_SIZE], [2]);
- LOCAL_ALIGNED_16(INTFLOAT, src1, [BUF_SIZE]);
-
- declare_func(void, INTFLOAT (*dst)[2],
- INTFLOAT (*src0)[2], INTFLOAT *src1, int n);
-
- randomize((INTFLOAT *)src0, BUF_SIZE * 2);
- randomize(src1, BUF_SIZE);
- call_ref(dst0, src0, src1, BUF_SIZE);
- call_new(dst1, src0, src1, BUF_SIZE);
- if (!float_near_abs_eps_array((float *)dst0, (float *)dst1, EPS, BUF_SIZE * 2))
- fail();
- bench_new(dst1, src0, src1, BUF_SIZE);
-}
-
-static void test_hybrid_analysis(void)
-{
- LOCAL_ALIGNED_16(INTFLOAT, dst0, [BUF_SIZE], [2]);
- LOCAL_ALIGNED_16(INTFLOAT, dst1, [BUF_SIZE], [2]);
- LOCAL_ALIGNED_16(INTFLOAT, in, [13], [2]);
- LOCAL_ALIGNED_16(INTFLOAT, filter, [N], [8][2]);
-
- declare_func(void, INTFLOAT (*out)[2], INTFLOAT (*in)[2],
- const INTFLOAT (*filter)[8][2],
- ptrdiff_t stride, int n);
-
- randomize((INTFLOAT *)in, 13 * 2);
- randomize((INTFLOAT *)filter, N * 8 * 2);
-
- randomize((INTFLOAT *)dst0, BUF_SIZE * 2);
- memcpy(dst1, dst0, BUF_SIZE * 2 * sizeof(INTFLOAT));
-
- call_ref(dst0, in, filter, STRIDE, N);
- call_new(dst1, in, filter, STRIDE, N);
-
- if (!float_near_abs_eps_array((float *)dst0, (float *)dst1, EPS, BUF_SIZE * 2))
- fail();
- bench_new(dst1, in, filter, STRIDE, N);
-}
-
-static void test_hybrid_analysis_ileave(void)
-{
- LOCAL_ALIGNED_16(INTFLOAT, in, [2], [38][64]);
- LOCAL_ALIGNED_16(INTFLOAT, out0, [91], [32][2]);
- LOCAL_ALIGNED_16(INTFLOAT, out1, [91], [32][2]);
-
- declare_func(void, INTFLOAT (*out)[32][2], INTFLOAT L[2][38][64],
- int i, int len);
-
- randomize((INTFLOAT *)out0, 91 * 32 * 2);
- randomize((INTFLOAT *)in, 2 * 38 * 64);
- memcpy(out1, out0, 91 * 32 * 2 * sizeof(INTFLOAT));
-
- /* len is hardcoded to 32 as that's the only value used in
- libavcodec. asm functions are likely to be optimized
- hardcoding this value in their loops and could fail with
- anything else.
- i is hardcoded to the two values currently used by the
- aac decoder because the arm neon implementation is
- micro-optimized for them and will fail for almost every
- other value. */
- call_ref(out0, in, 3, 32);
- call_new(out1, in, 3, 32);
-
- /* the function just moves data around, so memcmp is enough */
- if (memcmp(out0, out1, 91 * 32 * 2 * sizeof(INTFLOAT)))
- fail();
-
- call_ref(out0, in, 5, 32);
- call_new(out1, in, 5, 32);
-
- if (memcmp(out0, out1, 91 * 32 * 2 * sizeof(INTFLOAT)))
- fail();
-
- bench_new(out1, in, 3, 32);
-}
-
-static void test_hybrid_synthesis_deint(void)
-{
- LOCAL_ALIGNED_16(INTFLOAT, out0, [2], [38][64]);
- LOCAL_ALIGNED_16(INTFLOAT, out1, [2], [38][64]);
- LOCAL_ALIGNED_16(INTFLOAT, in, [91], [32][2]);
-
- declare_func(void, INTFLOAT out[2][38][64], INTFLOAT (*in)[32][2],
- int i, int len);
-
- randomize((INTFLOAT *)in, 91 * 32 * 2);
- randomize((INTFLOAT *)out0, 2 * 38 * 64);
- memcpy(out1, out0, 2 * 38 * 64 * sizeof(INTFLOAT));
-
- /* len is hardcoded to 32 as that's the only value used in
- libavcodec. asm functions are likely to be optimized
- hardcoding this value in their loops and could fail with
- anything else.
- i is hardcoded to the two values currently used by the
- aac decoder because the arm neon implementation is
- micro-optimized for them and will fail for almost every
- other value. */
- call_ref(out0, in, 3, 32);
- call_new(out1, in, 3, 32);
-
- /* the function just moves data around, so memcmp is enough */
- if (memcmp(out0, out1, 2 * 38 * 64 * sizeof(INTFLOAT)))
- fail();
-
- call_ref(out0, in, 5, 32);
- call_new(out1, in, 5, 32);
-
- if (memcmp(out0, out1, 2 * 38 * 64 * sizeof(INTFLOAT)))
- fail();
-
- bench_new(out1, in, 3, 32);
-}
-
-static void test_stereo_interpolate(PSDSPContext *psdsp)
-{
- int i;
- LOCAL_ALIGNED_16(INTFLOAT, l, [BUF_SIZE], [2]);
- LOCAL_ALIGNED_16(INTFLOAT, r, [BUF_SIZE], [2]);
- LOCAL_ALIGNED_16(INTFLOAT, l0, [BUF_SIZE], [2]);
- LOCAL_ALIGNED_16(INTFLOAT, r0, [BUF_SIZE], [2]);
- LOCAL_ALIGNED_16(INTFLOAT, l1, [BUF_SIZE], [2]);
- LOCAL_ALIGNED_16(INTFLOAT, r1, [BUF_SIZE], [2]);
- LOCAL_ALIGNED_16(INTFLOAT, h, [2], [4]);
- LOCAL_ALIGNED_16(INTFLOAT, h_step, [2], [4]);
-
- declare_func(void, INTFLOAT (*l)[2], INTFLOAT (*r)[2],
- INTFLOAT h[2][4], INTFLOAT h_step[2][4], int len);
-
- randomize((INTFLOAT *)l, BUF_SIZE * 2);
- randomize((INTFLOAT *)r, BUF_SIZE * 2);
-
- for (i = 0; i < 2; i++) {
- if (check_func(psdsp->stereo_interpolate[i], "ps_stereo_interpolate%s", i ? "_ipdopd" : "")) {
- memcpy(l0, l, BUF_SIZE * 2 * sizeof(INTFLOAT));
- memcpy(l1, l, BUF_SIZE * 2 * sizeof(INTFLOAT));
- memcpy(r0, r, BUF_SIZE * 2 * sizeof(INTFLOAT));
- memcpy(r1, r, BUF_SIZE * 2 * sizeof(INTFLOAT));
-
- randomize((INTFLOAT *)h, 2 * 4);
- randomize((INTFLOAT *)h_step, 2 * 4);
- // Clear the least significant 14 bits of h_step, to avoid
- // divergence when accumulating h_step BUF_SIZE times into
- // a float variable which may or may not have extra intermediate
- // precision. Therefore clear roughly log2(BUF_SIZE) less
- // significant bits, to get the same result regardless of any
- // extra precision in the accumulator.
- clear_less_significant_bits((INTFLOAT *)h_step, 2 * 4, 14);
-
- call_ref(l0, r0, h, h_step, BUF_SIZE);
- call_new(l1, r1, h, h_step, BUF_SIZE);
- if (!float_near_abs_eps_array((float *)l0, (float *)l1, EPS, BUF_SIZE * 2) ||
- !float_near_abs_eps_array((float *)r0, (float *)r1, EPS, BUF_SIZE * 2))
- fail();
-
- memcpy(l1, l, BUF_SIZE * 2 * sizeof(INTFLOAT));
- memcpy(r1, r, BUF_SIZE * 2 * sizeof(INTFLOAT));
- bench_new(l1, r1, h, h_step, BUF_SIZE);
- }
- }
-}
-
-void checkasm_check_aacpsdsp(void)
-{
- PSDSPContext psdsp;
-
- ff_psdsp_init(&psdsp);
-
- if (check_func(psdsp.add_squares, "ps_add_squares"))
- test_add_squares();
- report("add_squares");
-
- if (check_func(psdsp.mul_pair_single, "ps_mul_pair_single"))
- test_mul_pair_single();
- report("mul_pair_single");
-
- if (check_func(psdsp.hybrid_analysis, "ps_hybrid_analysis"))
- test_hybrid_analysis();
- report("hybrid_analysis");
-
- if (check_func(psdsp.hybrid_analysis_ileave, "ps_hybrid_analysis_ileave"))
- test_hybrid_analysis_ileave();
- report("hybrid_analysis_ileave");
-
- if (check_func(psdsp.hybrid_synthesis_deint, "ps_hybrid_synthesis_deint"))
- test_hybrid_synthesis_deint();
- report("hybrid_synthesis_deint");
-
- test_stereo_interpolate(&psdsp);
- report("stereo_interpolate");
-}
diff --git a/tests/checkasm/aarch64/checkasm.S b/tests/checkasm/aarch64/checkasm.S
deleted file mode 100644
index 89f2b77..0000000
--- a/tests/checkasm/aarch64/checkasm.S
+++ /dev/null
@@ -1,157 +0,0 @@
-/****************************************************************************
- * Assembly testing and benchmarking tool
- * Copyright (c) 2015 Martin Storsjo
- * Copyright (c) 2015 Janne Grunau
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA.
- *****************************************************************************/
-
-#include "libavutil/aarch64/asm.S"
-
-const register_init, align=4
- .quad 0x21f86d66c8ca00ce
- .quad 0x75b6ba21077c48ad
- .quad 0xed56bb2dcb3c7736
- .quad 0x8bda43d3fd1a7e06
- .quad 0xb64a9c9e5d318408
- .quad 0xdf9a54b303f1d3a3
- .quad 0x4a75479abd64e097
- .quad 0x249214109d5d1c88
- .quad 0x1a1b2550a612b48c
- .quad 0x79445c159ce79064
- .quad 0x2eed899d5a28ddcd
- .quad 0x86b2536fcd8cf636
- .quad 0xb0856806085e7943
- .quad 0x3f2bf84fc0fcca4e
- .quad 0xacbd382dcf5b8de2
- .quad 0xd229e1f5b281303f
- .quad 0x71aeaff20b095fd9
- .quad 0xab63e2e11fa38ed9
-endconst
-
-
-const error_message
- .asciz "failed to preserve register"
-endconst
-
-
-// max number of args used by any asm function.
-#define MAX_ARGS 15
-
-#define CLOBBER_STACK ((8*MAX_ARGS + 15) & ~15)
-
-function checkasm_stack_clobber, export=1
- mov x3, sp
- mov x2, #CLOBBER_STACK
-1:
- stp x0, x1, [sp, #-16]!
- subs x2, x2, #16
- b.gt 1b
- mov sp, x3
- ret
-endfunc
-
-#define ARG_STACK ((8*(MAX_ARGS - 8) + 15) & ~15)
-
-function checkasm_checked_call, export=1
- stp x29, x30, [sp, #-16]!
- mov x29, sp
- stp x19, x20, [sp, #-16]!
- stp x21, x22, [sp, #-16]!
- stp x23, x24, [sp, #-16]!
- stp x25, x26, [sp, #-16]!
- stp x27, x28, [sp, #-16]!
- stp d8, d9, [sp, #-16]!
- stp d10, d11, [sp, #-16]!
- stp d12, d13, [sp, #-16]!
- stp d14, d15, [sp, #-16]!
-
- movrel x9, register_init
- ldp d8, d9, [x9], #16
- ldp d10, d11, [x9], #16
- ldp d12, d13, [x9], #16
- ldp d14, d15, [x9], #16
- ldp x19, x20, [x9], #16
- ldp x21, x22, [x9], #16
- ldp x23, x24, [x9], #16
- ldp x25, x26, [x9], #16
- ldp x27, x28, [x9], #16
-
- sub sp, sp, #ARG_STACK
-.equ pos, 0
-.rept MAX_ARGS-8
- // Skip the first 8 args, that are loaded into registers
- ldr x9, [x29, #16 + 8*8 + pos]
- str x9, [sp, #pos]
-.equ pos, pos + 8
-.endr
-
- mov x12, x0
- ldp x0, x1, [x29, #16]
- ldp x2, x3, [x29, #32]
- ldp x4, x5, [x29, #48]
- ldp x6, x7, [x29, #64]
- blr x12
- add sp, sp, #ARG_STACK
- stp x0, x1, [sp, #-16]!
- movrel x9, register_init
- movi v3.8h, #0
-
-.macro check_reg_neon reg1, reg2
- ldr q1, [x9], #16
- uzp1 v2.2d, v\reg1\().2d, v\reg2\().2d
- eor v1.16b, v1.16b, v2.16b
- orr v3.16b, v3.16b, v1.16b
-.endm
- check_reg_neon 8, 9
- check_reg_neon 10, 11
- check_reg_neon 12, 13
- check_reg_neon 14, 15
- uqxtn v3.8b, v3.8h
- umov x3, v3.d[0]
-
-.macro check_reg reg1, reg2
- ldp x0, x1, [x9], #16
- eor x0, x0, \reg1
- eor x1, x1, \reg2
- orr x3, x3, x0
- orr x3, x3, x1
-.endm
- check_reg x19, x20
- check_reg x21, x22
- check_reg x23, x24
- check_reg x25, x26
- check_reg x27, x28
-
- cbz x3, 0f
-
- movrel x0, error_message
- bl X(checkasm_fail_func)
-0:
- ldp x0, x1, [sp], #16
- ldp d14, d15, [sp], #16
- ldp d12, d13, [sp], #16
- ldp d10, d11, [sp], #16
- ldp d8, d9, [sp], #16
- ldp x27, x28, [sp], #16
- ldp x25, x26, [sp], #16
- ldp x23, x24, [sp], #16
- ldp x21, x22, [sp], #16
- ldp x19, x20, [sp], #16
- ldp x29, x30, [sp], #16
- ret
-endfunc
diff --git a/tests/checkasm/alacdsp.c b/tests/checkasm/alacdsp.c
deleted file mode 100644
index cbf03f8..0000000
--- a/tests/checkasm/alacdsp.c
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright (c) 2015 James Almer
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include <string.h>
-#include "checkasm.h"
-#include "libavcodec/alacdsp.h"
-#include "libavcodec/mathops.h"
-#include "libavutil/common.h"
-#include "libavutil/internal.h"
-
-#define BUF_SIZE 256
-#define MAX_CHANNELS 2
-
-#define randomize_buffers() \
- do { \
- int i; \
- for (i = 0; i < BUF_SIZE*MAX_CHANNELS; i++) { \
- int32_t r = sign_extend(rnd(), 24); \
- ref_buf[i] = r; \
- new_buf[i] = r; \
- } \
- } while (0)
-
-static void check_decorrelate_stereo(void)
-{
- LOCAL_ALIGNED_16(int32_t, ref_buf, [BUF_SIZE*MAX_CHANNELS]);
- LOCAL_ALIGNED_16(int32_t, new_buf, [BUF_SIZE*MAX_CHANNELS]);
- int32_t *ref[2] = { &ref_buf[BUF_SIZE*0], &ref_buf[BUF_SIZE*1] };
- int32_t *new[2] = { &new_buf[BUF_SIZE*0], &new_buf[BUF_SIZE*1] };
- ALACDSPContext c;
-
- ff_alacdsp_init(&c);
- if (check_func(c.decorrelate_stereo, "alac_decorrelate_stereo")) {
- int len = (rnd() & 0xFF) + 1;
- int shift = rnd() & 0x1F;
- int weight = rnd() & 0xFF;
- declare_func(void, int32_t *buf[2], int len, int shift, int weight);
-
- randomize_buffers();
- call_ref(ref, len, shift, weight);
- call_new(new, len, shift, weight);
- if (memcmp(ref[0], new[0], len * sizeof(int32_t)) ||
- memcmp(ref[1], new[1], len * sizeof(int32_t)))
- fail();
- bench_new(new, BUF_SIZE, shift, weight);
- }
-
- report("decorrelate_stereo");
-}
-
-#undef randomize_buffers
-#define randomize_buffers() \
- do { \
- int i, j; \
- for (i = 0; i < BUF_SIZE; i++) { \
- for (j = 0; j < ch; j++) { \
- int32_t r = sign_extend(rnd(), 24); \
- ref[j][i] = r; \
- new[j][i] = r; \
- r = rnd() & 0xFF; \
- ref_ebb[j][i] = r; \
- new_ebb[j][i] = r; \
- } \
- } \
- } while (0)
-
-static void check_append_extra_bits(void)
-{
- LOCAL_ALIGNED_16(int32_t, ref_buf, [BUF_SIZE*MAX_CHANNELS*2]);
- LOCAL_ALIGNED_16(int32_t, new_buf, [BUF_SIZE*MAX_CHANNELS*2]);
- int32_t *ref[2] = { &ref_buf[BUF_SIZE*0], &ref_buf[BUF_SIZE*1] };
- int32_t *new[2] = { &new_buf[BUF_SIZE*0], &new_buf[BUF_SIZE*1] };
- int32_t *ref_ebb[2] = { &ref_buf[BUF_SIZE*2], &ref_buf[BUF_SIZE*3] };
- int32_t *new_ebb[2] = { &new_buf[BUF_SIZE*2], &new_buf[BUF_SIZE*3] };
- ALACDSPContext c;
- static const char * const channels[2] = { "mono", "stereo" };
- int ch;
-
- ff_alacdsp_init(&c);
- for (ch = 1; ch <= 2; ch++) {
- if (check_func(c.append_extra_bits[ch-1], "alac_append_extra_bits_%s", channels[ch-1])) {
- int len = (rnd() & 0xFF) + 1;
- declare_func(void, int32_t *buf[2], int32_t *ebb[2], int ebits, int ch, int len);
-
- randomize_buffers();
- call_ref(ref, ref_ebb, 8, ch, len);
- call_new(new, new_ebb, 8, ch, len);
- if ( memcmp(ref[0], new[0], len * sizeof(int32_t)) ||
- (ch == 2 && memcmp(ref[1], new[1], len * sizeof(int32_t))))
- fail();
- bench_new(new, new_ebb, 8, ch, BUF_SIZE);
- }
- }
-
- report("append_extra_bits");
-}
-
-void checkasm_check_alacdsp(void)
-{
- check_decorrelate_stereo();
- check_append_extra_bits();
-}
diff --git a/tests/checkasm/arm/checkasm.S b/tests/checkasm/arm/checkasm.S
deleted file mode 100644
index 2051b29..0000000
--- a/tests/checkasm/arm/checkasm.S
+++ /dev/null
@@ -1,168 +0,0 @@
-/****************************************************************************
- * Assembly testing and benchmarking tool
- * Copyright (c) 2015 Martin Storsjo
- * Copyright (c) 2015 Janne Grunau
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA.
- *****************************************************************************/
-
-#include "libavutil/arm/asm.S"
-
-/* override fpu so that NEON instructions are rejected */
-#if HAVE_VFP
-FPU .fpu vfp
-ELF .eabi_attribute 10, 0 @ suppress Tag_FP_arch
-#endif
-
-const register_init, align=3
- .quad 0x21f86d66c8ca00ce
- .quad 0x75b6ba21077c48ad
- .quad 0xed56bb2dcb3c7736
- .quad 0x8bda43d3fd1a7e06
- .quad 0xb64a9c9e5d318408
- .quad 0xdf9a54b303f1d3a3
- .quad 0x4a75479abd64e097
- .quad 0x249214109d5d1c88
-endconst
-
-const error_message_fpscr
- .asciz "failed to preserve register FPSCR, changed bits: %x"
-error_message_gpr:
- .asciz "failed to preserve register r%d"
-error_message_vfp:
- .asciz "failed to preserve register d%d"
-endconst
-
-@ max number of args used by any asm function.
-#define MAX_ARGS 15
-
-#define ARG_STACK 4*(MAX_ARGS - 4)
-
-@ align the used stack space to 8 to preserve the stack alignment
-#define ARG_STACK_A (((ARG_STACK + pushed + 7) & ~7) - pushed)
-
-.macro clobbercheck variant
-.equ pushed, 4*9
-function checkasm_checked_call_\variant, export=1
- push {r4-r11, lr}
-.ifc \variant, vfp
- vpush {d8-d15}
- fmrx r4, FPSCR
- push {r4}
-.equ pushed, pushed + 16*4 + 4
-.endif
-
- movrel r12, register_init
-.ifc \variant, vfp
- vldm r12, {d8-d15}
-.endif
- ldm r12, {r4-r11}
-
- sub sp, sp, #ARG_STACK_A
-.equ pos, 0
-.rept MAX_ARGS-4
- ldr r12, [sp, #ARG_STACK_A + pushed + 8 + pos]
- str r12, [sp, #pos]
-.equ pos, pos + 4
-.endr
-
- mov r12, r0
- mov r0, r2
- mov r1, r3
- ldrd r2, r3, [sp, #ARG_STACK_A + pushed]
- blx r12
- add sp, sp, #ARG_STACK_A
-
- push {r0, r1}
- movrel r12, register_init
-.ifc \variant, vfp
-.macro check_reg_vfp, dreg, offset
- ldrd r2, r3, [r12, #8 * (\offset)]
- vmov r0, lr, \dreg
- eor r2, r2, r0
- eor r3, r3, lr
- orrs r2, r2, r3
- bne 4f
-.endm
-
-.irp n, 8, 9, 10, 11, 12, 13, 14, 15
- @ keep track of the checked double/SIMD register
- mov r1, #\n
- check_reg_vfp d\n, \n-8
-.endr
-.purgem check_reg_vfp
-
- fmrx r1, FPSCR
- ldr r3, [sp, #8]
- eor r1, r1, r3
- @ Ignore changes in bits 0-4 and 7
- bic r1, r1, #0x9f
- @ Ignore changes in the topmost 5 bits
- bics r1, r1, #0xf8000000
- bne 3f
-.endif
-
- @ keep track of the checked GPR
- mov r1, #4
-.macro check_reg reg1, reg2=
- ldrd r2, r3, [r12], #8
- eors r2, r2, \reg1
- bne 2f
- add r1, r1, #1
-.ifnb \reg2
- eors r3, r3, \reg2
- bne 2f
-.endif
- add r1, r1, #1
-.endm
- check_reg r4, r5
- check_reg r6, r7
-@ r9 is a volatile register in the ios ABI
-#ifdef __APPLE__
- check_reg r8
-#else
- check_reg r8, r9
-#endif
- check_reg r10, r11
-.purgem check_reg
-
- b 0f
-4:
- movrel r0, error_message_vfp
- b 1f
-3:
- movrel r0, error_message_fpscr
- b 1f
-2:
- movrel r0, error_message_gpr
-1:
- blx X(checkasm_fail_func)
-0:
- pop {r0, r1}
-.ifc \variant, vfp
- pop {r2}
- fmxr FPSCR, r2
- vpop {d8-d15}
-.endif
- pop {r4-r11, pc}
-endfunc
-.endm
-
-#if HAVE_VFP || HAVE_NEON
-clobbercheck vfp
-#endif
-clobbercheck novfp
diff --git a/tests/checkasm/audiodsp.c b/tests/checkasm/audiodsp.c
deleted file mode 100644
index 7c4e16e..0000000
--- a/tests/checkasm/audiodsp.c
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include <math.h>
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "libavcodec/audiodsp.h"
-
-#include "libavutil/common.h"
-#include "libavutil/intreadwrite.h"
-
-#include "checkasm.h"
-
-#define MAX_SIZE (32 * 128)
-
-#define randomize_float(buf, len) \
- do { \
- int i; \
- for (i = 0; i < len; i++) { \
- float f = (float)rnd() / (UINT_MAX >> 5) - 16.0f; \
- buf[i] = f; \
- } \
- } while (0)
-
-#define randomize_int(buf, len, size, bits) \
- do { \
- int i; \
- for (i = 0; i < len; i++) { \
- uint ## size ## _t r = rnd() & ((1LL << bits) - 1); \
- AV_WN ## size ## A(buf + i, -(1LL << (bits - 1)) + r); \
- } \
- } while (0)
-
-void checkasm_check_audiodsp(void)
-{
- AudioDSPContext adsp;
-
- ff_audiodsp_init(&adsp);
-
- if (check_func(adsp.scalarproduct_int16, "audiodsp.scalarproduct_int16")) {
- LOCAL_ALIGNED(32, int16_t, v1, [MAX_SIZE]);
- LOCAL_ALIGNED(32, int16_t, v2, [MAX_SIZE]);
- unsigned int len_bits_minus4, v1_bits, v2_bits, len;
- int32_t res0, res1;
-
- declare_func_emms(AV_CPU_FLAG_MMX, int32_t, const int16_t *v1, const int16_t *v2, int len);
-
- // generate random 5-12bit vector length
- len_bits_minus4 = rnd() % 8;
- len = rnd() & ((1 << len_bits_minus4) - 1);
- len = 16 * FFMAX(len, 1);
-
- // generate the bit counts for each of the vectors such that the result
- // fits into int32
- v1_bits = 1 + rnd() % 15;
- v2_bits = FFMIN(32 - (len_bits_minus4 + 4) - v1_bits - 1, 15);
-
- randomize_int(v1, MAX_SIZE, 16, v1_bits + 1);
- randomize_int(v2, MAX_SIZE, 16, v2_bits + 1);
-
- res0 = call_ref(v1, v2, len);
- res1 = call_new(v1, v2, len);
- if (res0 != res1)
- fail();
- bench_new(v1, v2, MAX_SIZE);
- }
-
- if (check_func(adsp.vector_clip_int32, "audiodsp.vector_clip_int32")) {
- LOCAL_ALIGNED(32, int32_t, src, [MAX_SIZE]);
- LOCAL_ALIGNED(32, int32_t, dst0, [MAX_SIZE]);
- LOCAL_ALIGNED(32, int32_t, dst1, [MAX_SIZE]);
- int32_t val1, val2, min, max;
- int len;
-
- declare_func_emms(AV_CPU_FLAG_MMX, void, int32_t *dst, const int32_t *src,
- int32_t min, int32_t max, unsigned int len);
-
- val1 = ((int32_t)rnd());
- val1 = FFSIGN(val1) * (val1 & ((1 << 24) - 1));
- val2 = ((int32_t)rnd());
- val2 = FFSIGN(val2) * (val2 & ((1 << 24) - 1));
-
- min = FFMIN(val1, val2);
- max = FFMAX(val1, val2);
-
- randomize_int(src, MAX_SIZE, 32, 32);
-
- len = rnd() % 128;
- len = 32 * FFMAX(len, 1);
-
- call_ref(dst0, src, min, max, len);
- call_new(dst1, src, min, max, len);
- if (memcmp(dst0, dst1, len * sizeof(*dst0)))
- fail();
- bench_new(dst1, src, min, max, MAX_SIZE);
- }
-
- if (check_func(adsp.vector_clipf, "audiodsp.vector_clipf")) {
- LOCAL_ALIGNED(32, float, src, [MAX_SIZE]);
- LOCAL_ALIGNED(32, float, dst0, [MAX_SIZE]);
- LOCAL_ALIGNED(32, float, dst1, [MAX_SIZE]);
- float val1, val2, min, max;
- int i, len;
-
- declare_func_emms(AV_CPU_FLAG_MMX, void, float *dst, const float *src,
- int len, float min, float max);
-
- val1 = (float)rnd() / (UINT_MAX >> 1) - 1.0f;
- val2 = (float)rnd() / (UINT_MAX >> 1) - 1.0f;
-
- min = FFMIN(val1, val2);
- max = FFMAX(val1, val2);
-
- randomize_float(src, MAX_SIZE);
-
- len = rnd() % 128;
- len = 16 * FFMAX(len, 1);
-
- call_ref(dst0, src, len, min, max);
- call_new(dst1, src, len, min, max);
- for (i = 0; i < len; i++) {
- if (!float_near_ulp_array(dst0, dst1, 3, len))
- fail();
- }
- bench_new(dst1, src, MAX_SIZE, min, max);
- }
-
- report("audiodsp");
-}
diff --git a/tests/checkasm/blockdsp.c b/tests/checkasm/blockdsp.c
deleted file mode 100644
index c753506..0000000
--- a/tests/checkasm/blockdsp.c
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (c) 2015 Henrik Gramner
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include <string.h>
-
-#include "checkasm.h"
-
-#include "libavcodec/blockdsp.h"
-
-#include "libavutil/common.h"
-#include "libavutil/internal.h"
-#include "libavutil/intreadwrite.h"
-
-#define randomize_buffers(size) \
- do { \
- int i; \
- for (i = 0; i < size; i++) { \
- uint16_t r = rnd(); \
- AV_WN16A(buf0 + i, r); \
- AV_WN16A(buf1 + i, r); \
- } \
- } while (0)
-
-#define check_clear(func, size) \
-do { \
- if (check_func(h.func, "blockdsp." #func)) { \
- declare_func_emms(AV_CPU_FLAG_MMX, void, int16_t *block); \
- randomize_buffers(size); \
- call_ref(buf0); \
- call_new(buf1); \
- if (memcmp(buf0, buf1, sizeof(*buf0) * size)) \
- fail(); \
- bench_new(buf0); \
- } \
-} while (0)
-
-void checkasm_check_blockdsp(void)
-{
- LOCAL_ALIGNED_32(uint16_t, buf0, [6 * 8 * 8]);
- LOCAL_ALIGNED_32(uint16_t, buf1, [6 * 8 * 8]);
-
- AVCodecContext avctx = { 0 };
- BlockDSPContext h;
-
- ff_blockdsp_init(&h, &avctx);
-
- check_clear(clear_block, 8 * 8);
- check_clear(clear_blocks, 8 * 8 * 6);
-
- report("blockdsp");
-}
diff --git a/tests/checkasm/bswapdsp.c b/tests/checkasm/bswapdsp.c
deleted file mode 100644
index 5f75550..0000000
--- a/tests/checkasm/bswapdsp.c
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (c) 2015 Henrik Gramner
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include <string.h>
-#include "checkasm.h"
-#include "libavcodec/bswapdsp.h"
-#include "libavutil/common.h"
-#include "libavutil/internal.h"
-#include "libavutil/intreadwrite.h"
-
-#define BUF_SIZE 512
-
-#define randomize_buffers() \
- do { \
- int i; \
- for (i = 0; i < BUF_SIZE; i += 4) { \
- uint32_t r = rnd(); \
- AV_WN32A(src0 + i, r); \
- AV_WN32A(src1 + i, r); \
- r = rnd(); \
- AV_WN32A(dst0 + i, r); \
- AV_WN32A(dst1 + i, r); \
- } \
- } while (0)
-
-#define check_bswap(type) \
- do { \
- int w; \
- declare_func(void, type *dst, const type *src, int w); \
- \
- for (w = 0; w < BUF_SIZE / sizeof(type); w++) { \
- int offset = (BUF_SIZE / sizeof(type) - w) & 15; /* Test various alignments */ \
- randomize_buffers(); \
- call_ref((type *)dst0 + offset, (type *)src0 + offset, w); \
- call_new((type *)dst1 + offset, (type *)src1 + offset, w); \
- if (memcmp(src0, src1, BUF_SIZE) || memcmp(dst0, dst1, BUF_SIZE)) \
- fail(); \
- bench_new((type *)dst1 + offset, (type *)src1 + offset, w); \
- } \
- } while (0)
-
-void checkasm_check_bswapdsp(void)
-{
- LOCAL_ALIGNED_16(uint8_t, src0, [BUF_SIZE]);
- LOCAL_ALIGNED_16(uint8_t, src1, [BUF_SIZE]);
- LOCAL_ALIGNED_16(uint8_t, dst0, [BUF_SIZE]);
- LOCAL_ALIGNED_16(uint8_t, dst1, [BUF_SIZE]);
- BswapDSPContext h;
-
- ff_bswapdsp_init(&h);
-
- if (check_func(h.bswap_buf, "bswap_buf"))
- check_bswap(uint32_t);
-
- if (check_func(h.bswap16_buf, "bswap16_buf"))
- check_bswap(uint16_t);
-
- report("bswap");
-}
diff --git a/tests/checkasm/checkasm.c b/tests/checkasm/checkasm.c
deleted file mode 100644
index d67147a..0000000
--- a/tests/checkasm/checkasm.c
+++ /dev/null
@@ -1,838 +0,0 @@
-/*
- * Assembly testing and benchmarking tool
- * Copyright (c) 2015 Henrik Gramner
- * Copyright (c) 2008 Loren Merritt
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#if CONFIG_LINUX_PERF
-# ifndef _GNU_SOURCE
-# define _GNU_SOURCE // for syscall (performance monitoring API)
-# endif
-#endif
-
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "checkasm.h"
-#include "libavutil/common.h"
-#include "libavutil/cpu.h"
-#include "libavutil/intfloat.h"
-#include "libavutil/random_seed.h"
-
-#if HAVE_IO_H
-#include <io.h>
-#endif
-
-#if HAVE_SETCONSOLETEXTATTRIBUTE && HAVE_GETSTDHANDLE
-#include <windows.h>
-#define COLOR_RED FOREGROUND_RED
-#define COLOR_GREEN FOREGROUND_GREEN
-#define COLOR_YELLOW (FOREGROUND_RED|FOREGROUND_GREEN)
-#else
-#define COLOR_RED 1
-#define COLOR_GREEN 2
-#define COLOR_YELLOW 3
-#endif
-
-#if HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
-#if !HAVE_ISATTY
-#define isatty(fd) 1
-#endif
-
-#if ARCH_ARM && HAVE_ARMV5TE_EXTERNAL
-#include "libavutil/arm/cpu.h"
-
-void (*checkasm_checked_call)(void *func, int dummy, ...) = checkasm_checked_call_novfp;
-#endif
-
-/* List of tests to invoke */
-static const struct {
- const char *name;
- void (*func)(void);
-} tests[] = {
-#if CONFIG_AVCODEC
- #if CONFIG_AAC_DECODER
- { "aacpsdsp", checkasm_check_aacpsdsp },
- { "sbrdsp", checkasm_check_sbrdsp },
- #endif
- #if CONFIG_ALAC_DECODER
- { "alacdsp", checkasm_check_alacdsp },
- #endif
- #if CONFIG_AUDIODSP
- { "audiodsp", checkasm_check_audiodsp },
- #endif
- #if CONFIG_BLOCKDSP
- { "blockdsp", checkasm_check_blockdsp },
- #endif
- #if CONFIG_BSWAPDSP
- { "bswapdsp", checkasm_check_bswapdsp },
- #endif
- #if CONFIG_DCA_DECODER
- { "synth_filter", checkasm_check_synth_filter },
- #endif
- #if CONFIG_EXR_DECODER
- { "exrdsp", checkasm_check_exrdsp },
- #endif
- #if CONFIG_FLACDSP
- { "flacdsp", checkasm_check_flacdsp },
- #endif
- #if CONFIG_FMTCONVERT
- { "fmtconvert", checkasm_check_fmtconvert },
- #endif
- #if CONFIG_G722DSP
- { "g722dsp", checkasm_check_g722dsp },
- #endif
- #if CONFIG_H264DSP
- { "h264dsp", checkasm_check_h264dsp },
- #endif
- #if CONFIG_H264PRED
- { "h264pred", checkasm_check_h264pred },
- #endif
- #if CONFIG_H264QPEL
- { "h264qpel", checkasm_check_h264qpel },
- #endif
- #if CONFIG_HEVC_DECODER
- { "hevc_add_res", checkasm_check_hevc_add_res },
- { "hevc_idct", checkasm_check_hevc_idct },
- { "hevc_sao", checkasm_check_hevc_sao },
- #endif
- #if CONFIG_HUFFYUV_DECODER
- { "huffyuvdsp", checkasm_check_huffyuvdsp },
- #endif
- #if CONFIG_JPEG2000_DECODER
- { "jpeg2000dsp", checkasm_check_jpeg2000dsp },
- #endif
- #if CONFIG_HUFFYUVDSP
- { "llviddsp", checkasm_check_llviddsp },
- #endif
- #if CONFIG_LLVIDENCDSP
- { "llviddspenc", checkasm_check_llviddspenc },
- #endif
- #if CONFIG_OPUS_DECODER
- { "opusdsp", checkasm_check_opusdsp },
- #endif
- #if CONFIG_PIXBLOCKDSP
- { "pixblockdsp", checkasm_check_pixblockdsp },
- #endif
- #if CONFIG_UTVIDEO_DECODER
- { "utvideodsp", checkasm_check_utvideodsp },
- #endif
- #if CONFIG_V210_DECODER
- { "v210dec", checkasm_check_v210dec },
- #endif
- #if CONFIG_V210_ENCODER
- { "v210enc", checkasm_check_v210enc },
- #endif
- #if CONFIG_VP8DSP
- { "vp8dsp", checkasm_check_vp8dsp },
- #endif
- #if CONFIG_VP9_DECODER
- { "vp9dsp", checkasm_check_vp9dsp },
- #endif
- #if CONFIG_VIDEODSP
- { "videodsp", checkasm_check_videodsp },
- #endif
-#endif
-#if CONFIG_AVFILTER
- #if CONFIG_AFIR_FILTER
- { "af_afir", checkasm_check_afir },
- #endif
- #if CONFIG_BLEND_FILTER
- { "vf_blend", checkasm_check_blend },
- #endif
- #if CONFIG_COLORSPACE_FILTER
- { "vf_colorspace", checkasm_check_colorspace },
- #endif
- #if CONFIG_EQ_FILTER
- { "vf_eq", checkasm_check_vf_eq },
- #endif
- #if CONFIG_GBLUR_FILTER
- { "vf_gblur", checkasm_check_vf_gblur },
- #endif
- #if CONFIG_HFLIP_FILTER
- { "vf_hflip", checkasm_check_vf_hflip },
- #endif
- #if CONFIG_NLMEANS_FILTER
- { "vf_nlmeans", checkasm_check_nlmeans },
- #endif
- #if CONFIG_THRESHOLD_FILTER
- { "vf_threshold", checkasm_check_vf_threshold },
- #endif
-#endif
-#if CONFIG_SWSCALE
- { "sw_rgb", checkasm_check_sw_rgb },
-#endif
-#if CONFIG_AVUTIL
- { "fixed_dsp", checkasm_check_fixed_dsp },
- { "float_dsp", checkasm_check_float_dsp },
-#endif
- { NULL }
-};
-
-/* List of cpu flags to check */
-static const struct {
- const char *name;
- const char *suffix;
- int flag;
-} cpus[] = {
-#if ARCH_AARCH64
- { "ARMV8", "armv8", AV_CPU_FLAG_ARMV8 },
- { "NEON", "neon", AV_CPU_FLAG_NEON },
-#elif ARCH_ARM
- { "ARMV5TE", "armv5te", AV_CPU_FLAG_ARMV5TE },
- { "ARMV6", "armv6", AV_CPU_FLAG_ARMV6 },
- { "ARMV6T2", "armv6t2", AV_CPU_FLAG_ARMV6T2 },
- { "VFP", "vfp", AV_CPU_FLAG_VFP },
- { "VFP_VM", "vfp_vm", AV_CPU_FLAG_VFP_VM },
- { "VFPV3", "vfp3", AV_CPU_FLAG_VFPV3 },
- { "NEON", "neon", AV_CPU_FLAG_NEON },
-#elif ARCH_PPC
- { "ALTIVEC", "altivec", AV_CPU_FLAG_ALTIVEC },
- { "VSX", "vsx", AV_CPU_FLAG_VSX },
- { "POWER8", "power8", AV_CPU_FLAG_POWER8 },
-#elif ARCH_X86
- { "MMX", "mmx", AV_CPU_FLAG_MMX|AV_CPU_FLAG_CMOV },
- { "MMXEXT", "mmxext", AV_CPU_FLAG_MMXEXT },
- { "3DNOW", "3dnow", AV_CPU_FLAG_3DNOW },
- { "3DNOWEXT", "3dnowext", AV_CPU_FLAG_3DNOWEXT },
- { "SSE", "sse", AV_CPU_FLAG_SSE },
- { "SSE2", "sse2", AV_CPU_FLAG_SSE2|AV_CPU_FLAG_SSE2SLOW },
- { "SSE3", "sse3", AV_CPU_FLAG_SSE3|AV_CPU_FLAG_SSE3SLOW },
- { "SSSE3", "ssse3", AV_CPU_FLAG_SSSE3|AV_CPU_FLAG_ATOM },
- { "SSE4.1", "sse4", AV_CPU_FLAG_SSE4 },
- { "SSE4.2", "sse42", AV_CPU_FLAG_SSE42 },
- { "AES-NI", "aesni", AV_CPU_FLAG_AESNI },
- { "AVX", "avx", AV_CPU_FLAG_AVX },
- { "XOP", "xop", AV_CPU_FLAG_XOP },
- { "FMA3", "fma3", AV_CPU_FLAG_FMA3 },
- { "FMA4", "fma4", AV_CPU_FLAG_FMA4 },
- { "AVX2", "avx2", AV_CPU_FLAG_AVX2 },
- { "AVX-512", "avx512", AV_CPU_FLAG_AVX512 },
-#endif
- { NULL }
-};
-
-typedef struct CheckasmFuncVersion {
- struct CheckasmFuncVersion *next;
- void *func;
- int ok;
- int cpu;
- CheckasmPerf perf;
-} CheckasmFuncVersion;
-
-/* Binary search tree node */
-typedef struct CheckasmFunc {
- struct CheckasmFunc *child[2];
- CheckasmFuncVersion versions;
- uint8_t color; /* 0 = red, 1 = black */
- char name[1];
-} CheckasmFunc;
-
-/* Internal state */
-static struct {
- CheckasmFunc *funcs;
- CheckasmFunc *current_func;
- CheckasmFuncVersion *current_func_ver;
- const char *current_test_name;
- const char *bench_pattern;
- int bench_pattern_len;
- int num_checked;
- int num_failed;
-
- /* perf */
- int nop_time;
- int sysfd;
-
- int cpu_flag;
- const char *cpu_flag_name;
- const char *test_name;
-} state;
-
-/* PRNG state */
-AVLFG checkasm_lfg;
-
-/* float compare support code */
-static int is_negative(union av_intfloat32 u)
-{
- return u.i >> 31;
-}
-
-int float_near_ulp(float a, float b, unsigned max_ulp)
-{
- union av_intfloat32 x, y;
-
- x.f = a;
- y.f = b;
-
- if (is_negative(x) != is_negative(y)) {
- // handle -0.0 == +0.0
- return a == b;
- }
-
- if (llabs((int64_t)x.i - y.i) <= max_ulp)
- return 1;
-
- return 0;
-}
-
-int float_near_ulp_array(const float *a, const float *b, unsigned max_ulp,
- unsigned len)
-{
- unsigned i;
-
- for (i = 0; i < len; i++) {
- if (!float_near_ulp(a[i], b[i], max_ulp))
- return 0;
- }
- return 1;
-}
-
-int float_near_abs_eps(float a, float b, float eps)
-{
- float abs_diff = fabsf(a - b);
- if (abs_diff < eps)
- return 1;
-
- fprintf(stderr, "test failed comparing %g with %g (abs diff=%g with EPS=%g)\n", a, b, abs_diff, eps);
-
- return 0;
-}
-
-int float_near_abs_eps_array(const float *a, const float *b, float eps,
- unsigned len)
-{
- unsigned i;
-
- for (i = 0; i < len; i++) {
- if (!float_near_abs_eps(a[i], b[i], eps))
- return 0;
- }
- return 1;
-}
-
-int float_near_abs_eps_ulp(float a, float b, float eps, unsigned max_ulp)
-{
- return float_near_ulp(a, b, max_ulp) || float_near_abs_eps(a, b, eps);
-}
-
-int float_near_abs_eps_array_ulp(const float *a, const float *b, float eps,
- unsigned max_ulp, unsigned len)
-{
- unsigned i;
-
- for (i = 0; i < len; i++) {
- if (!float_near_abs_eps_ulp(a[i], b[i], eps, max_ulp))
- return 0;
- }
- return 1;
-}
-
-int double_near_abs_eps(double a, double b, double eps)
-{
- double abs_diff = fabs(a - b);
-
- return abs_diff < eps;
-}
-
-int double_near_abs_eps_array(const double *a, const double *b, double eps,
- unsigned len)
-{
- unsigned i;
-
- for (i = 0; i < len; i++) {
- if (!double_near_abs_eps(a[i], b[i], eps))
- return 0;
- }
- return 1;
-}
-
-/* Print colored text to stderr if the terminal supports it */
-static void color_printf(int color, const char *fmt, ...)
-{
- static int use_color = -1;
- va_list arg;
-
-#if HAVE_SETCONSOLETEXTATTRIBUTE && HAVE_GETSTDHANDLE
- static HANDLE con;
- static WORD org_attributes;
-
- if (use_color < 0) {
- CONSOLE_SCREEN_BUFFER_INFO con_info;
- con = GetStdHandle(STD_ERROR_HANDLE);
- if (con && con != INVALID_HANDLE_VALUE && GetConsoleScreenBufferInfo(con, &con_info)) {
- org_attributes = con_info.wAttributes;
- use_color = 1;
- } else
- use_color = 0;
- }
- if (use_color)
- SetConsoleTextAttribute(con, (org_attributes & 0xfff0) | (color & 0x0f));
-#else
- if (use_color < 0) {
- const char *term = getenv("TERM");
- use_color = term && strcmp(term, "dumb") && isatty(2);
- }
- if (use_color)
- fprintf(stderr, "\x1b[%d;3%dm", (color & 0x08) >> 3, color & 0x07);
-#endif
-
- va_start(arg, fmt);
- vfprintf(stderr, fmt, arg);
- va_end(arg);
-
- if (use_color) {
-#if HAVE_SETCONSOLETEXTATTRIBUTE && HAVE_GETSTDHANDLE
- SetConsoleTextAttribute(con, org_attributes);
-#else
- fprintf(stderr, "\x1b[0m");
-#endif
- }
-}
-
-/* Deallocate a tree */
-static void destroy_func_tree(CheckasmFunc *f)
-{
- if (f) {
- CheckasmFuncVersion *v = f->versions.next;
- while (v) {
- CheckasmFuncVersion *next = v->next;
- free(v);
- v = next;
- }
-
- destroy_func_tree(f->child[0]);
- destroy_func_tree(f->child[1]);
- free(f);
- }
-}
-
-/* Allocate a zero-initialized block, clean up and exit on failure */
-static void *checkasm_malloc(size_t size)
-{
- void *ptr = calloc(1, size);
- if (!ptr) {
- fprintf(stderr, "checkasm: malloc failed\n");
- destroy_func_tree(state.funcs);
- exit(1);
- }
- return ptr;
-}
-
-/* Get the suffix of the specified cpu flag */
-static const char *cpu_suffix(int cpu)
-{
- int i = FF_ARRAY_ELEMS(cpus);
-
- while (--i >= 0)
- if (cpu & cpus[i].flag)
- return cpus[i].suffix;
-
- return "c";
-}
-
-static int cmp_nop(const void *a, const void *b)
-{
- return *(const uint16_t*)a - *(const uint16_t*)b;
-}
-
-/* Measure the overhead of the timing code (in decicycles) */
-static int measure_nop_time(void)
-{
- uint16_t nops[10000];
- int i, nop_sum = 0;
- av_unused const int sysfd = state.sysfd;
-
- uint64_t t = 0;
- for (i = 0; i < 10000; i++) {
- PERF_START(t);
- PERF_STOP(t);
- nops[i] = t;
- }
-
- qsort(nops, 10000, sizeof(uint16_t), cmp_nop);
- for (i = 2500; i < 7500; i++)
- nop_sum += nops[i];
-
- return nop_sum / 500;
-}
-
-/* Print benchmark results */
-static void print_benchs(CheckasmFunc *f)
-{
- if (f) {
- print_benchs(f->child[0]);
-
- /* Only print functions with at least one assembly version */
- if (f->versions.cpu || f->versions.next) {
- CheckasmFuncVersion *v = &f->versions;
- do {
- CheckasmPerf *p = &v->perf;
- if (p->iterations) {
- int decicycles = (10*p->cycles/p->iterations - state.nop_time) / 4;
- printf("%s_%s: %d.%d\n", f->name, cpu_suffix(v->cpu), decicycles/10, decicycles%10);
- }
- } while ((v = v->next));
- }
-
- print_benchs(f->child[1]);
- }
-}
-
-/* ASCIIbetical sort except preserving natural order for numbers */
-static int cmp_func_names(const char *a, const char *b)
-{
- const char *start = a;
- int ascii_diff, digit_diff;
-
- for (; !(ascii_diff = *(const unsigned char*)a - *(const unsigned char*)b) && *a; a++, b++);
- for (; av_isdigit(*a) && av_isdigit(*b); a++, b++);
-
- if (a > start && av_isdigit(a[-1]) && (digit_diff = av_isdigit(*a) - av_isdigit(*b)))
- return digit_diff;
-
- return ascii_diff;
-}
-
-/* Perform a tree rotation in the specified direction and return the new root */
-static CheckasmFunc *rotate_tree(CheckasmFunc *f, int dir)
-{
- CheckasmFunc *r = f->child[dir^1];
- f->child[dir^1] = r->child[dir];
- r->child[dir] = f;
- r->color = f->color;
- f->color = 0;
- return r;
-}
-
-#define is_red(f) ((f) && !(f)->color)
-
-/* Balance a left-leaning red-black tree at the specified node */
-static void balance_tree(CheckasmFunc **root)
-{
- CheckasmFunc *f = *root;
-
- if (is_red(f->child[0]) && is_red(f->child[1])) {
- f->color ^= 1;
- f->child[0]->color = f->child[1]->color = 1;
- }
-
- if (!is_red(f->child[0]) && is_red(f->child[1]))
- *root = rotate_tree(f, 0); /* Rotate left */
- else if (is_red(f->child[0]) && is_red(f->child[0]->child[0]))
- *root = rotate_tree(f, 1); /* Rotate right */
-}
-
-/* Get a node with the specified name, creating it if it doesn't exist */
-static CheckasmFunc *get_func(CheckasmFunc **root, const char *name)
-{
- CheckasmFunc *f = *root;
-
- if (f) {
- /* Search the tree for a matching node */
- int cmp = cmp_func_names(name, f->name);
- if (cmp) {
- f = get_func(&f->child[cmp > 0], name);
-
- /* Rebalance the tree on the way up if a new node was inserted */
- if (!f->versions.func)
- balance_tree(root);
- }
- } else {
- /* Allocate and insert a new node into the tree */
- int name_length = strlen(name);
- f = *root = checkasm_malloc(sizeof(CheckasmFunc) + name_length);
- memcpy(f->name, name, name_length + 1);
- }
-
- return f;
-}
-
-/* Perform tests and benchmarks for the specified cpu flag if supported by the host */
-static void check_cpu_flag(const char *name, int flag)
-{
- int old_cpu_flag = state.cpu_flag;
-
- flag |= old_cpu_flag;
- av_force_cpu_flags(-1);
- state.cpu_flag = flag & av_get_cpu_flags();
- av_force_cpu_flags(state.cpu_flag);
-
- if (!flag || state.cpu_flag != old_cpu_flag) {
- int i;
-
- state.cpu_flag_name = name;
- for (i = 0; tests[i].func; i++) {
- if (state.test_name && strcmp(tests[i].name, state.test_name))
- continue;
- state.current_test_name = tests[i].name;
- tests[i].func();
- }
- }
-}
-
-/* Print the name of the current CPU flag, but only do it once */
-static void print_cpu_name(void)
-{
- if (state.cpu_flag_name) {
- color_printf(COLOR_YELLOW, "%s:\n", state.cpu_flag_name);
- state.cpu_flag_name = NULL;
- }
-}
-
-#if CONFIG_LINUX_PERF
-static int bench_init_linux(void)
-{
- struct perf_event_attr attr = {
- .type = PERF_TYPE_HARDWARE,
- .size = sizeof(struct perf_event_attr),
- .config = PERF_COUNT_HW_CPU_CYCLES,
- .disabled = 1, // start counting only on demand
- .exclude_kernel = 1,
- .exclude_hv = 1,
- };
-
- printf("benchmarking with Linux Perf Monitoring API\n");
-
- state.sysfd = syscall(__NR_perf_event_open, &attr, 0, -1, -1, 0);
- if (state.sysfd == -1) {
- perror("syscall");
- return -1;
- }
- return 0;
-}
-#endif
-
-#if !CONFIG_LINUX_PERF
-static int bench_init_ffmpeg(void)
-{
-#ifdef AV_READ_TIME
- printf("benchmarking with native FFmpeg timers\n");
- return 0;
-#else
- fprintf(stderr, "checkasm: --bench is not supported on your system\n");
- return -1;
-#endif
-}
-#endif
-
-static int bench_init(void)
-{
-#if CONFIG_LINUX_PERF
- int ret = bench_init_linux();
-#else
- int ret = bench_init_ffmpeg();
-#endif
- if (ret < 0)
- return ret;
-
- state.nop_time = measure_nop_time();
- printf("nop: %d.%d\n", state.nop_time/10, state.nop_time%10);
- return 0;
-}
-
-static void bench_uninit(void)
-{
-#if CONFIG_LINUX_PERF
- if (state.sysfd > 0)
- close(state.sysfd);
-#endif
-}
-
-int main(int argc, char *argv[])
-{
- unsigned int seed = av_get_random_seed();
- int i, ret = 0;
-
-#if ARCH_ARM && HAVE_ARMV5TE_EXTERNAL
- if (have_vfp(av_get_cpu_flags()) || have_neon(av_get_cpu_flags()))
- checkasm_checked_call = checkasm_checked_call_vfp;
-#endif
-
- if (!tests[0].func || !cpus[0].flag) {
- fprintf(stderr, "checkasm: no tests to perform\n");
- return 0;
- }
-
- while (argc > 1) {
- if (!strncmp(argv[1], "--bench", 7)) {
- if (bench_init() < 0)
- return 1;
- if (argv[1][7] == '=') {
- state.bench_pattern = argv[1] + 8;
- state.bench_pattern_len = strlen(state.bench_pattern);
- } else
- state.bench_pattern = "";
- } else if (!strncmp(argv[1], "--test=", 7)) {
- state.test_name = argv[1] + 7;
- } else {
- seed = strtoul(argv[1], NULL, 10);
- }
-
- argc--;
- argv++;
- }
-
- fprintf(stderr, "checkasm: using random seed %u\n", seed);
- av_lfg_init(&checkasm_lfg, seed);
-
- check_cpu_flag(NULL, 0);
- for (i = 0; cpus[i].flag; i++)
- check_cpu_flag(cpus[i].name, cpus[i].flag);
-
- if (state.num_failed) {
- fprintf(stderr, "checkasm: %d of %d tests have failed\n", state.num_failed, state.num_checked);
- ret = 1;
- } else {
- fprintf(stderr, "checkasm: all %d tests passed\n", state.num_checked);
- if (state.bench_pattern) {
- print_benchs(state.funcs);
- }
- }
-
- destroy_func_tree(state.funcs);
- bench_uninit();
- return ret;
-}
-
-/* Decide whether or not the specified function needs to be tested and
- * allocate/initialize data structures if needed. Returns a pointer to a
- * reference function if the function should be tested, otherwise NULL */
-void *checkasm_check_func(void *func, const char *name, ...)
-{
- char name_buf[256];
- void *ref = func;
- CheckasmFuncVersion *v;
- int name_length;
- va_list arg;
-
- va_start(arg, name);
- name_length = vsnprintf(name_buf, sizeof(name_buf), name, arg);
- va_end(arg);
-
- if (!func || name_length <= 0 || name_length >= sizeof(name_buf))
- return NULL;
-
- state.current_func = get_func(&state.funcs, name_buf);
- state.funcs->color = 1;
- v = &state.current_func->versions;
-
- if (v->func) {
- CheckasmFuncVersion *prev;
- do {
- /* Only test functions that haven't already been tested */
- if (v->func == func)
- return NULL;
-
- if (v->ok)
- ref = v->func;
-
- prev = v;
- } while ((v = v->next));
-
- v = prev->next = checkasm_malloc(sizeof(CheckasmFuncVersion));
- }
-
- v->func = func;
- v->ok = 1;
- v->cpu = state.cpu_flag;
- state.current_func_ver = v;
-
- if (state.cpu_flag)
- state.num_checked++;
-
- return ref;
-}
-
-/* Decide whether or not the current function needs to be benchmarked */
-int checkasm_bench_func(void)
-{
- return !state.num_failed && state.bench_pattern &&
- !strncmp(state.current_func->name, state.bench_pattern, state.bench_pattern_len);
-}
-
-/* Indicate that the current test has failed */
-void checkasm_fail_func(const char *msg, ...)
-{
- if (state.current_func_ver->cpu && state.current_func_ver->ok) {
- va_list arg;
-
- print_cpu_name();
- fprintf(stderr, " %s_%s (", state.current_func->name, cpu_suffix(state.current_func_ver->cpu));
- va_start(arg, msg);
- vfprintf(stderr, msg, arg);
- va_end(arg);
- fprintf(stderr, ")\n");
-
- state.current_func_ver->ok = 0;
- state.num_failed++;
- }
-}
-
-/* Get the benchmark context of the current function */
-CheckasmPerf *checkasm_get_perf_context(void)
-{
- CheckasmPerf *perf = &state.current_func_ver->perf;
- memset(perf, 0, sizeof(*perf));
- perf->sysfd = state.sysfd;
- return perf;
-}
-
-/* Print the outcome of all tests performed since the last time this function was called */
-void checkasm_report(const char *name, ...)
-{
- static int prev_checked, prev_failed, max_length;
-
- if (state.num_checked > prev_checked) {
- int pad_length = max_length + 4;
- va_list arg;
-
- print_cpu_name();
- pad_length -= fprintf(stderr, " - %s.", state.current_test_name);
- va_start(arg, name);
- pad_length -= vfprintf(stderr, name, arg);
- va_end(arg);
- fprintf(stderr, "%*c", FFMAX(pad_length, 0) + 2, '[');
-
- if (state.num_failed == prev_failed)
- color_printf(COLOR_GREEN, "OK");
- else
- color_printf(COLOR_RED, "FAILED");
- fprintf(stderr, "]\n");
-
- prev_checked = state.num_checked;
- prev_failed = state.num_failed;
- } else if (!state.cpu_flag) {
- /* Calculate the amount of padding required to make the output vertically aligned */
- int length = strlen(state.current_test_name);
- va_list arg;
-
- va_start(arg, name);
- length += vsnprintf(NULL, 0, name, arg);
- va_end(arg);
-
- if (length > max_length)
- max_length = length;
- }
-}
diff --git a/tests/checkasm/checkasm.h b/tests/checkasm/checkasm.h
deleted file mode 100644
index 0a7f9f2..0000000
--- a/tests/checkasm/checkasm.h
+++ /dev/null
@@ -1,260 +0,0 @@
-/*
- * Assembly testing and benchmarking tool
- * Copyright (c) 2015 Henrik Gramner
- * Copyright (c) 2008 Loren Merritt
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef TESTS_CHECKASM_CHECKASM_H
-#define TESTS_CHECKASM_CHECKASM_H
-
-#include <stdint.h>
-#include "config.h"
-
-#if CONFIG_LINUX_PERF
-#include <unistd.h> // read(3)
-#include <sys/ioctl.h>
-#include <asm/unistd.h>
-#include <linux/perf_event.h>
-#endif
-
-#include "libavutil/avstring.h"
-#include "libavutil/cpu.h"
-#include "libavutil/internal.h"
-#include "libavutil/lfg.h"
-#include "libavutil/timer.h"
-
-void checkasm_check_aacpsdsp(void);
-void checkasm_check_afir(void);
-void checkasm_check_alacdsp(void);
-void checkasm_check_audiodsp(void);
-void checkasm_check_blend(void);
-void checkasm_check_blockdsp(void);
-void checkasm_check_bswapdsp(void);
-void checkasm_check_colorspace(void);
-void checkasm_check_exrdsp(void);
-void checkasm_check_fixed_dsp(void);
-void checkasm_check_flacdsp(void);
-void checkasm_check_float_dsp(void);
-void checkasm_check_fmtconvert(void);
-void checkasm_check_g722dsp(void);
-void checkasm_check_h264dsp(void);
-void checkasm_check_h264pred(void);
-void checkasm_check_h264qpel(void);
-void checkasm_check_hevc_add_res(void);
-void checkasm_check_hevc_idct(void);
-void checkasm_check_hevc_sao(void);
-void checkasm_check_huffyuvdsp(void);
-void checkasm_check_jpeg2000dsp(void);
-void checkasm_check_llviddsp(void);
-void checkasm_check_llviddspenc(void);
-void checkasm_check_nlmeans(void);
-void checkasm_check_opusdsp(void);
-void checkasm_check_pixblockdsp(void);
-void checkasm_check_sbrdsp(void);
-void checkasm_check_synth_filter(void);
-void checkasm_check_sw_rgb(void);
-void checkasm_check_utvideodsp(void);
-void checkasm_check_v210dec(void);
-void checkasm_check_v210enc(void);
-void checkasm_check_vf_eq(void);
-void checkasm_check_vf_gblur(void);
-void checkasm_check_vf_hflip(void);
-void checkasm_check_vf_threshold(void);
-void checkasm_check_vp8dsp(void);
-void checkasm_check_vp9dsp(void);
-void checkasm_check_videodsp(void);
-
-struct CheckasmPerf;
-
-void *checkasm_check_func(void *func, const char *name, ...) av_printf_format(2, 3);
-int checkasm_bench_func(void);
-void checkasm_fail_func(const char *msg, ...) av_printf_format(1, 2);
-struct CheckasmPerf *checkasm_get_perf_context(void);
-void checkasm_report(const char *name, ...) av_printf_format(1, 2);
-
-/* float compare utilities */
-int float_near_ulp(float a, float b, unsigned max_ulp);
-int float_near_abs_eps(float a, float b, float eps);
-int float_near_abs_eps_ulp(float a, float b, float eps, unsigned max_ulp);
-int float_near_ulp_array(const float *a, const float *b, unsigned max_ulp,
- unsigned len);
-int float_near_abs_eps_array(const float *a, const float *b, float eps,
- unsigned len);
-int float_near_abs_eps_array_ulp(const float *a, const float *b, float eps,
- unsigned max_ulp, unsigned len);
-int double_near_abs_eps(double a, double b, double eps);
-int double_near_abs_eps_array(const double *a, const double *b, double eps,
- unsigned len);
-
-extern AVLFG checkasm_lfg;
-#define rnd() av_lfg_get(&checkasm_lfg)
-
-static av_unused void *func_ref, *func_new;
-
-#define BENCH_RUNS 1000 /* Trade-off between accuracy and speed */
-
-/* Decide whether or not the specified function needs to be tested */
-#define check_func(func, ...) (func_ref = checkasm_check_func((func_new = func), __VA_ARGS__))
-
-/* Declare the function prototype. The first argument is the return value, the remaining
- * arguments are the function parameters. Naming parameters is optional. */
-#define declare_func(ret, ...) declare_new(ret, __VA_ARGS__) typedef ret func_type(__VA_ARGS__)
-#define declare_func_float(ret, ...) declare_new_float(ret, __VA_ARGS__) typedef ret func_type(__VA_ARGS__)
-#define declare_func_emms(cpu_flags, ret, ...) declare_new_emms(cpu_flags, ret, __VA_ARGS__) typedef ret func_type(__VA_ARGS__)
-
-/* Indicate that the current test has failed */
-#define fail() checkasm_fail_func("%s:%d", av_basename(__FILE__), __LINE__)
-
-/* Print the test outcome */
-#define report checkasm_report
-
-/* Call the reference function */
-#define call_ref(...) ((func_type *)func_ref)(__VA_ARGS__)
-
-#if ARCH_X86 && HAVE_X86ASM
-/* Verifies that clobbered callee-saved registers are properly saved and restored
- * and that either no MMX registers are touched or emms is issued */
-void checkasm_checked_call(void *func, ...);
-/* Verifies that clobbered callee-saved registers are properly saved and restored
- * and issues emms for asm functions which are not required to do so */
-void checkasm_checked_call_emms(void *func, ...);
-/* Verifies that clobbered callee-saved registers are properly saved and restored
- * but doesn't issue emms. Meant for dsp functions returning float or double */
-void checkasm_checked_call_float(void *func, ...);
-
-#if ARCH_X86_64
-/* Evil hack: detect incorrect assumptions that 32-bit ints are zero-extended to 64-bit.
- * This is done by clobbering the stack with junk around the stack pointer and calling the
- * assembly function through checked_call() with added dummy arguments which forces all
- * real arguments to be passed on the stack and not in registers. For 32-bit arguments the
- * upper half of the 64-bit register locations on the stack will now contain junk which will
- * cause misbehaving functions to either produce incorrect output or segfault. Note that
- * even though this works extremely well in practice, it's technically not guaranteed
- * and false negatives is theoretically possible, but there can never be any false positives.
- */
-void checkasm_stack_clobber(uint64_t clobber, ...);
-#define declare_new(ret, ...) ret (*checked_call)(void *, int, int, int, int, int, __VA_ARGS__)\
- = (void *)checkasm_checked_call;
-#define declare_new_float(ret, ...) ret (*checked_call)(void *, int, int, int, int, int, __VA_ARGS__)\
- = (void *)checkasm_checked_call_float;
-#define declare_new_emms(cpu_flags, ret, ...) \
- ret (*checked_call)(void *, int, int, int, int, int, __VA_ARGS__) = \
- ((cpu_flags) & av_get_cpu_flags()) ? (void *)checkasm_checked_call_emms : \
- (void *)checkasm_checked_call;
-#define CLOB (UINT64_C(0xdeadbeefdeadbeef))
-#define call_new(...) (checkasm_stack_clobber(CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,\
- CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB),\
- checked_call(func_new, 0, 0, 0, 0, 0, __VA_ARGS__))
-#elif ARCH_X86_32
-#define declare_new(ret, ...) ret (*checked_call)(void *, __VA_ARGS__) = (void *)checkasm_checked_call;
-#define declare_new_float(ret, ...) ret (*checked_call)(void *, __VA_ARGS__) = (void *)checkasm_checked_call_float;
-#define declare_new_emms(cpu_flags, ret, ...) ret (*checked_call)(void *, __VA_ARGS__) = \
- ((cpu_flags) & av_get_cpu_flags()) ? (void *)checkasm_checked_call_emms : \
- (void *)checkasm_checked_call;
-#define call_new(...) checked_call(func_new, __VA_ARGS__)
-#endif
-#elif ARCH_ARM && HAVE_ARMV5TE_EXTERNAL
-/* Use a dummy argument, to offset the real parameters by 2, not only 1.
- * This makes sure that potential 8-byte-alignment of parameters is kept the same
- * even when the extra parameters have been removed. */
-void checkasm_checked_call_vfp(void *func, int dummy, ...);
-void checkasm_checked_call_novfp(void *func, int dummy, ...);
-extern void (*checkasm_checked_call)(void *func, int dummy, ...);
-#define declare_new(ret, ...) ret (*checked_call)(void *, int dummy, __VA_ARGS__) = (void *)checkasm_checked_call;
-#define call_new(...) checked_call(func_new, 0, __VA_ARGS__)
-#elif ARCH_AARCH64 && !defined(__APPLE__)
-void checkasm_stack_clobber(uint64_t clobber, ...);
-void checkasm_checked_call(void *func, ...);
-#define declare_new(ret, ...) ret (*checked_call)(void *, int, int, int, int, int, int, int, __VA_ARGS__)\
- = (void *)checkasm_checked_call;
-#define CLOB (UINT64_C(0xdeadbeefdeadbeef))
-#define call_new(...) (checkasm_stack_clobber(CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,\
- CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB),\
- checked_call(func_new, 0, 0, 0, 0, 0, 0, 0, __VA_ARGS__))
-#else
-#define declare_new(ret, ...)
-#define declare_new_float(ret, ...)
-#define declare_new_emms(cpu_flags, ret, ...)
-/* Call the function */
-#define call_new(...) ((func_type *)func_new)(__VA_ARGS__)
-#endif
-
-#ifndef declare_new_emms
-#define declare_new_emms(cpu_flags, ret, ...) declare_new(ret, __VA_ARGS__)
-#endif
-#ifndef declare_new_float
-#define declare_new_float(ret, ...) declare_new(ret, __VA_ARGS__)
-#endif
-
-typedef struct CheckasmPerf {
- int sysfd;
- uint64_t cycles;
- int iterations;
-} CheckasmPerf;
-
-#if defined(AV_READ_TIME) || CONFIG_LINUX_PERF
-
-#if CONFIG_LINUX_PERF
-#define PERF_START(t) do { \
- ioctl(sysfd, PERF_EVENT_IOC_RESET, 0); \
- ioctl(sysfd, PERF_EVENT_IOC_ENABLE, 0); \
-} while (0)
-#define PERF_STOP(t) do { \
- ioctl(sysfd, PERF_EVENT_IOC_DISABLE, 0); \
- read(sysfd, &t, sizeof(t)); \
-} while (0)
-#else
-#define PERF_START(t) t = AV_READ_TIME()
-#define PERF_STOP(t) t = AV_READ_TIME() - t
-#endif
-
-/* Benchmark the function */
-#define bench_new(...)\
- do {\
- if (checkasm_bench_func()) {\
- struct CheckasmPerf *perf = checkasm_get_perf_context();\
- av_unused const int sysfd = perf->sysfd;\
- func_type *tfunc = func_new;\
- uint64_t tsum = 0;\
- int ti, tcount = 0;\
- uint64_t t = 0; \
- for (ti = 0; ti < BENCH_RUNS; ti++) {\
- PERF_START(t);\
- tfunc(__VA_ARGS__);\
- tfunc(__VA_ARGS__);\
- tfunc(__VA_ARGS__);\
- tfunc(__VA_ARGS__);\
- PERF_STOP(t);\
- if (t*tcount <= tsum*4 && ti > 0) {\
- tsum += t;\
- tcount++;\
- }\
- }\
- emms_c();\
- perf->cycles += t;\
- perf->iterations++;\
- }\
- } while (0)
-#else
-#define bench_new(...) while(0)
-#define PERF_START(t) while(0)
-#define PERF_STOP(t) while(0)
-#endif
-
-#endif /* TESTS_CHECKASM_CHECKASM_H */
diff --git a/tests/checkasm/exrdsp.c b/tests/checkasm/exrdsp.c
deleted file mode 100644
index 754a079..0000000
--- a/tests/checkasm/exrdsp.c
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (c) 2017 James Almer
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include <string.h>
-
-#include "checkasm.h"
-#include "libavcodec/avcodec.h"
-#include "libavcodec/exrdsp.h"
-#include "libavutil/intreadwrite.h"
-
-#define BUF_SIZE 5120
-#define PADDED_BUF_SIZE BUF_SIZE+AV_INPUT_BUFFER_PADDING_SIZE*2
-
-#define randomize_buffers() \
- do { \
- int i; \
- for (i = 0; i < BUF_SIZE; i += 4) { \
- uint32_t r = rnd(); \
- AV_WN32A(src + i, r); \
- } \
- } while (0)
-
-static void check_reorder_pixels(void) {
- LOCAL_ALIGNED_32(uint8_t, src, [PADDED_BUF_SIZE]);
- LOCAL_ALIGNED_32(uint8_t, dst_ref, [PADDED_BUF_SIZE]);
- LOCAL_ALIGNED_32(uint8_t, dst_new, [PADDED_BUF_SIZE]);
-
- declare_func(void, uint8_t *dst, const uint8_t *src, ptrdiff_t size);
-
- memset(src, 0, PADDED_BUF_SIZE);
- memset(dst_ref, 0, PADDED_BUF_SIZE);
- memset(dst_new, 0, PADDED_BUF_SIZE);
- randomize_buffers();
- call_ref(dst_ref, src, BUF_SIZE);
- call_new(dst_new, src, BUF_SIZE);
- if (memcmp(dst_ref, dst_new, BUF_SIZE))
- fail();
- bench_new(dst_new, src, BUF_SIZE);
-}
-
-static void check_predictor(void) {
- LOCAL_ALIGNED_32(uint8_t, src, [PADDED_BUF_SIZE]);
- LOCAL_ALIGNED_32(uint8_t, dst_ref, [PADDED_BUF_SIZE]);
- LOCAL_ALIGNED_32(uint8_t, dst_new, [PADDED_BUF_SIZE]);
-
- declare_func(void, uint8_t *src, ptrdiff_t size);
-
- memset(src, 0, PADDED_BUF_SIZE);
- randomize_buffers();
- memcpy(dst_ref, src, PADDED_BUF_SIZE);
- memcpy(dst_new, src, PADDED_BUF_SIZE);
- call_ref(dst_ref, BUF_SIZE);
- call_new(dst_new, BUF_SIZE);
- if (memcmp(dst_ref, dst_new, BUF_SIZE))
- fail();
- bench_new(dst_new, BUF_SIZE);
-}
-
-void checkasm_check_exrdsp(void)
-{
- ExrDSPContext h;
-
- ff_exrdsp_init(&h);
-
- if (check_func(h.reorder_pixels, "reorder_pixels"))
- check_reorder_pixels();
-
- report("reorder_pixels");
-
- if (check_func(h.predictor, "predictor"))
- check_predictor();
-
- report("predictor");
-}
diff --git a/tests/checkasm/fixed_dsp.c b/tests/checkasm/fixed_dsp.c
deleted file mode 100644
index fa11f2e..0000000
--- a/tests/checkasm/fixed_dsp.c
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright (c) 2015 James Almer
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "checkasm.h"
-#include "libavutil/common.h"
-#include "libavutil/fixed_dsp.h"
-#include "libavutil/internal.h"
-#include "libavutil/mem.h"
-
-#define BUF_SIZE 256
-
-#define randomize_buffers() \
- do { \
- int i; \
- for (i = 0; i < BUF_SIZE; i++) { \
- src0[i] = sign_extend(rnd(), 24); \
- src1[i] = sign_extend(rnd(), 24); \
- src2[i] = sign_extend(rnd(), 24); \
- } \
- } while (0)
-
-static void check_vector_fmul(const int *src0, const int *src1)
-{
- LOCAL_ALIGNED_32(int, ref, [BUF_SIZE]);
- LOCAL_ALIGNED_32(int, new, [BUF_SIZE]);
-
- declare_func(void, int *dst, const int *src0, const int *src1, int len);
-
- call_ref(ref, src0, src1, BUF_SIZE);
- call_new(new, src0, src1, BUF_SIZE);
- if (memcmp(ref, new, BUF_SIZE * sizeof(int)))
- fail();
- bench_new(new, src0, src1, BUF_SIZE);
-}
-
-static void check_vector_fmul_add(const int *src0, const int *src1, const int *src2)
-{
- LOCAL_ALIGNED_32(int, ref, [BUF_SIZE]);
- LOCAL_ALIGNED_32(int, new, [BUF_SIZE]);
-
- declare_func(void, int *dst, const int *src0, const int *src1, const int *src2, int len);
-
- call_ref(ref, src0, src1, src2, BUF_SIZE);
- call_new(new, src0, src1, src2, BUF_SIZE);
- if (memcmp(ref, new, BUF_SIZE * sizeof(int)))
- fail();
- bench_new(new, src0, src1, src2, BUF_SIZE);
-}
-
-static void check_vector_fmul_window(const int32_t *src0, const int32_t *src1, const int32_t *win)
-{
- LOCAL_ALIGNED_32(int32_t, ref, [BUF_SIZE]);
- LOCAL_ALIGNED_32(int32_t, new, [BUF_SIZE]);
-
- declare_func(void, int32_t *dst, const int32_t *src0, const int32_t *src1, const int32_t *win, int len);
-
- call_ref(ref, src0, src1, win, BUF_SIZE / 2);
- call_new(new, src0, src1, win, BUF_SIZE / 2);
- if (memcmp(ref, new, BUF_SIZE * sizeof(int32_t)))
- fail();
- bench_new(new, src0, src1, win, BUF_SIZE / 2);
-}
-
-static void check_vector_fmul_window_scaled(const int32_t *src0, const int32_t *src1, const int32_t *win)
-{
- LOCAL_ALIGNED_16(int16_t, ref, [BUF_SIZE]);
- LOCAL_ALIGNED_16(int16_t, new, [BUF_SIZE]);
-
- declare_func(void, int16_t *dst, const int32_t *src0, const int32_t *src1, const int32_t *win, int len, uint8_t bits);
-
- call_ref(ref, src0, src1, win, BUF_SIZE / 2, 2);
- call_new(new, src0, src1, win, BUF_SIZE / 2, 2);
- if (memcmp(ref, new, BUF_SIZE * sizeof(int16_t)))
- fail();
- bench_new(new, src0, src1, win, BUF_SIZE / 2, 2);
-}
-
-static void check_butterflies(const int *src0, const int *src1)
-{
- LOCAL_ALIGNED_16(int, ref0, [BUF_SIZE]);
- LOCAL_ALIGNED_16(int, ref1, [BUF_SIZE]);
- LOCAL_ALIGNED_16(int, new0, [BUF_SIZE]);
- LOCAL_ALIGNED_16(int, new1, [BUF_SIZE]);
-
- declare_func(void, int *av_restrict src0, int *av_restrict src1, int len);
-
- memcpy(ref0, src0, BUF_SIZE * sizeof(*src0));
- memcpy(ref1, src1, BUF_SIZE * sizeof(*src1));
- memcpy(new0, src0, BUF_SIZE * sizeof(*src0));
- memcpy(new1, src1, BUF_SIZE * sizeof(*src1));
-
- call_ref(ref0, ref1, BUF_SIZE);
- call_new(new0, new1, BUF_SIZE);
- if (memcmp(ref0, new0, BUF_SIZE * sizeof(*ref0)) ||
- memcmp(ref1, new1, BUF_SIZE * sizeof(*ref1)))
- fail();
- memcpy(new0, src0, BUF_SIZE * sizeof(*src0));
- memcpy(new1, src1, BUF_SIZE * sizeof(*src1));
- bench_new(new0, new1, BUF_SIZE);
-}
-
-static void check_scalarproduct_fixed(const int *src0, const int *src1)
-{
- int ref, new;
-
- declare_func(int, const int *src0, const int *src1, int len);
-
- ref = call_ref(src0, src1, BUF_SIZE);
- new = call_new(src0, src1, BUF_SIZE);
- if (ref != new)
- fail();
- bench_new(src0, src1, BUF_SIZE);
-}
-
-void checkasm_check_fixed_dsp(void)
-{
- LOCAL_ALIGNED_32(int32_t, src0, [BUF_SIZE]);
- LOCAL_ALIGNED_32(int32_t, src1, [BUF_SIZE]);
- LOCAL_ALIGNED_32(int32_t, src2, [BUF_SIZE]);
- AVFixedDSPContext *fdsp = avpriv_alloc_fixed_dsp(1);
-
- randomize_buffers();
- if (check_func(fdsp->vector_fmul, "vector_fmul_fixed"))
- check_vector_fmul(src0, src1);
- if (check_func(fdsp->vector_fmul_add, "vector_fmul_add_fixed"))
- check_vector_fmul_add(src0, src1, src2);
- if (check_func(fdsp->vector_fmul_reverse, "vector_fmul_reverse_fixed"))
- check_vector_fmul(src0, src1);
- if (check_func(fdsp->vector_fmul_window, "vector_fmul_window_fixed"))
- check_vector_fmul_window(src0, src1, src2);
- if (check_func(fdsp->vector_fmul_window_scaled, "vector_fmul_window_scaled_fixed"))
- check_vector_fmul_window_scaled(src0, src1, src2);
- report("vector_fmul");
- if (check_func(fdsp->butterflies_fixed, "butterflies_fixed"))
- check_butterflies(src0, src1);
- report("butterflies_fixed");
- if (check_func(fdsp->scalarproduct_fixed, "scalarproduct_fixed"))
- check_scalarproduct_fixed(src0, src1);
- report("scalarproduct_fixed");
-
- av_freep(&fdsp);
-}
diff --git a/tests/checkasm/flacdsp.c b/tests/checkasm/flacdsp.c
deleted file mode 100644
index dccb54d..0000000
--- a/tests/checkasm/flacdsp.c
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (c) 2015 James Almer
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include <string.h>
-#include "checkasm.h"
-#include "libavcodec/flacdsp.h"
-#include "libavutil/common.h"
-#include "libavutil/internal.h"
-#include "libavutil/intreadwrite.h"
-
-#define BUF_SIZE 256
-#define MAX_CHANNELS 8
-
-#define randomize_buffers() \
- do { \
- int i, j; \
- for (i = 0; i < BUF_SIZE; i += 4) { \
- for (j = 0; j < channels; j++) { \
- uint32_t r = rnd() & (1 << (bits - 2)) - 1; \
- AV_WN32A(ref_src[j] + i, r); \
- AV_WN32A(new_src[j] + i, r); \
- } \
- } \
- } while (0)
-
-static void check_decorrelate(uint8_t **ref_dst, uint8_t **ref_src, uint8_t **new_dst, uint8_t **new_src,
- int channels, int bits) {
- declare_func(void, uint8_t **out, int32_t **in, int channels, int len, int shift);
-
- randomize_buffers();
- call_ref(ref_dst, (int32_t **)ref_src, channels, BUF_SIZE / sizeof(int32_t), 8);
- call_new(new_dst, (int32_t **)new_src, channels, BUF_SIZE / sizeof(int32_t), 8);
- if (memcmp(*ref_dst, *new_dst, bits == 16 ? BUF_SIZE * (channels/2) : BUF_SIZE * channels) ||
- memcmp(*ref_src, *new_src, BUF_SIZE * channels))
- fail();
- bench_new(new_dst, (int32_t **)new_src, channels, BUF_SIZE / sizeof(int32_t), 8);
-}
-
-void checkasm_check_flacdsp(void)
-{
- LOCAL_ALIGNED_16(uint8_t, ref_dst, [BUF_SIZE*MAX_CHANNELS]);
- LOCAL_ALIGNED_16(uint8_t, ref_buf, [BUF_SIZE*MAX_CHANNELS]);
- LOCAL_ALIGNED_16(uint8_t, new_dst, [BUF_SIZE*MAX_CHANNELS]);
- LOCAL_ALIGNED_16(uint8_t, new_buf, [BUF_SIZE*MAX_CHANNELS]);
- uint8_t *ref_src[] = { &ref_buf[BUF_SIZE*0], &ref_buf[BUF_SIZE*1], &ref_buf[BUF_SIZE*2], &ref_buf[BUF_SIZE*3],
- &ref_buf[BUF_SIZE*4], &ref_buf[BUF_SIZE*5], &ref_buf[BUF_SIZE*6], &ref_buf[BUF_SIZE*7] };
- uint8_t *new_src[] = { &new_buf[BUF_SIZE*0], &new_buf[BUF_SIZE*1], &new_buf[BUF_SIZE*2], &new_buf[BUF_SIZE*3],
- &new_buf[BUF_SIZE*4], &new_buf[BUF_SIZE*5], &new_buf[BUF_SIZE*6], &new_buf[BUF_SIZE*7] };
- static const char * const names[3] = { "ls", "rs", "ms" };
- static const struct {
- enum AVSampleFormat fmt;
- int bits;
- } fmts[] = {
- { AV_SAMPLE_FMT_S16, 16 },
- { AV_SAMPLE_FMT_S32, 32 },
- };
- FLACDSPContext h;
- int i, j;
-
- for (i = 0; i < 2; i++) {
- ff_flacdsp_init(&h, fmts[i].fmt, 2, 0);
- for (j = 0; j < 3; j++)
- if (check_func(h.decorrelate[j], "flac_decorrelate_%s_%d", names[j], fmts[i].bits))
- check_decorrelate(&ref_dst, ref_src, &new_dst, new_src, 2, fmts[i].bits);
- for (j = 2; j <= MAX_CHANNELS; j += 2) {
- ff_flacdsp_init(&h, fmts[i].fmt, j, 0);
- if (check_func(h.decorrelate[0], "flac_decorrelate_indep%d_%d", j, fmts[i].bits))
- check_decorrelate(&ref_dst, ref_src, &new_dst, new_src, j, fmts[i].bits);
- }
- }
-
- report("decorrelate");
-}
diff --git a/tests/checkasm/float_dsp.c b/tests/checkasm/float_dsp.c
deleted file mode 100644
index a1616a6..0000000
--- a/tests/checkasm/float_dsp.c
+++ /dev/null
@@ -1,338 +0,0 @@
-/*
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <float.h>
-#include <stdint.h>
-
-#include "libavutil/float_dsp.h"
-#include "libavutil/internal.h"
-#include "checkasm.h"
-
-#define LEN 256
-
-#define randomize_buffer(buf) \
-do { \
- int i; \
- double bmg[2], stddev = 10.0, mean = 0.0; \
- \
- for (i = 0; i < LEN; i += 2) { \
- av_bmg_get(&checkasm_lfg, bmg); \
- buf[i] = bmg[0] * stddev + mean; \
- buf[i + 1] = bmg[1] * stddev + mean; \
- } \
-} while(0);
-
-static void test_vector_fmul(const float *src0, const float *src1)
-{
- LOCAL_ALIGNED_32(float, cdst, [LEN]);
- LOCAL_ALIGNED_32(float, odst, [LEN]);
- int i;
-
- declare_func(void, float *dst, const float *src0, const float *src1,
- int len);
-
- call_ref(cdst, src0, src1, LEN);
- call_new(odst, src0, src1, LEN);
- for (i = 0; i < LEN; i++) {
- double t = fabs(src0[i]) + fabs(src1[i]) + fabs(src0[i] * src1[i]) + 1.0;
- if (!float_near_abs_eps(cdst[i], odst[i], t * 2 * FLT_EPSILON)) {
- fprintf(stderr, "%d: %- .12f - %- .12f = % .12g\n",
- i, cdst[i], odst[i], cdst[i] - odst[i]);
- fail();
- break;
- }
- }
- bench_new(odst, src0, src1, LEN);
-}
-
-static void test_vector_dmul(const double *src0, const double *src1)
-{
- LOCAL_ALIGNED_32(double, cdst, [LEN]);
- LOCAL_ALIGNED_32(double, odst, [LEN]);
- int i;
-
- declare_func(void, double *dst, const double *src0, const double *src1,
- int len);
-
- call_ref(cdst, src0, src1, LEN);
- call_new(odst, src0, src1, LEN);
- for (i = 0; i < LEN; i++) {
- double t = fabs(src0[i]) + fabs(src1[i]) + fabs(src0[i] * src1[i]) + 1.0;
- if (!double_near_abs_eps(cdst[i], odst[i], t * 2 * DBL_EPSILON)) {
- fprintf(stderr, "%d: %- .12f - %- .12f = % .12g\n",
- i, cdst[i], odst[i], cdst[i] - odst[i]);
- fail();
- break;
- }
- }
- bench_new(odst, src0, src1, LEN);
-}
-
-#define ARBITRARY_FMUL_ADD_CONST 0.005
-static void test_vector_fmul_add(const float *src0, const float *src1, const float *src2)
-{
- LOCAL_ALIGNED_32(float, cdst, [LEN]);
- LOCAL_ALIGNED_32(float, odst, [LEN]);
- int i;
-
- declare_func(void, float *dst, const float *src0, const float *src1,
- const float *src2, int len);
-
- call_ref(cdst, src0, src1, src2, LEN);
- call_new(odst, src0, src1, src2, LEN);
- for (i = 0; i < LEN; i++) {
- if (!float_near_abs_eps(cdst[i], odst[i], ARBITRARY_FMUL_ADD_CONST)) {
- fprintf(stderr, "%d: %- .12f - %- .12f = % .12g\n",
- i, cdst[i], odst[i], cdst[i] - odst[i]);
- fail();
- break;
- }
- }
- bench_new(odst, src0, src1, src2, LEN);
-}
-
-static void test_vector_fmul_scalar(const float *src0, const float *src1)
-{
- LOCAL_ALIGNED_16(float, cdst, [LEN]);
- LOCAL_ALIGNED_16(float, odst, [LEN]);
- int i;
-
- declare_func(void, float *dst, const float *src, float mul, int len);
-
- call_ref(cdst, src0, src1[0], LEN);
- call_new(odst, src0, src1[0], LEN);
- for (i = 0; i < LEN; i++) {
- double t = fabs(src0[i]) + fabs(src1[0]) + fabs(src0[i] * src1[0]) + 1.0;
- if (!float_near_abs_eps(cdst[i], odst[i], t * 2 * FLT_EPSILON)) {
- fprintf(stderr, "%d: %- .12f - %- .12f = % .12g\n",
- i, cdst[i], odst[i], cdst[i] - odst[i]);
- fail();
- break;
- }
- }
- bench_new(odst, src0, src1[0], LEN);
-}
-
-#define ARBITRARY_FMUL_WINDOW_CONST 0.008
-static void test_vector_fmul_window(const float *src0, const float *src1, const float *win)
-{
- LOCAL_ALIGNED_16(float, cdst, [LEN]);
- LOCAL_ALIGNED_16(float, odst, [LEN]);
- int i;
-
- declare_func(void, float *dst, const float *src0, const float *src1,
- const float *win, int len);
-
- call_ref(cdst, src0, src1, win, LEN / 2);
- call_new(odst, src0, src1, win, LEN / 2);
- for (i = 0; i < LEN; i++) {
- if (!float_near_abs_eps(cdst[i], odst[i], ARBITRARY_FMUL_WINDOW_CONST)) {
- fprintf(stderr, "%d: %- .12f - %- .12f = % .12g\n",
- i, cdst[i], odst[i], cdst[i] - odst[i]);
- fail();
- break;
- }
- }
- bench_new(odst, src0, src1, win, LEN / 2);
-}
-
-#define ARBITRARY_FMAC_SCALAR_CONST 0.005
-static void test_vector_fmac_scalar(const float *src0, const float *src1, const float *src2)
-{
- LOCAL_ALIGNED_32(float, cdst, [LEN]);
- LOCAL_ALIGNED_32(float, odst, [LEN]);
- int i;
-
- declare_func(void, float *dst, const float *src, float mul, int len);
-
- memcpy(cdst, src2, LEN * sizeof(*src2));
- memcpy(odst, src2, LEN * sizeof(*src2));
-
- call_ref(cdst, src0, src1[0], LEN);
- call_new(odst, src0, src1[0], LEN);
- for (i = 0; i < LEN; i++) {
- if (!float_near_abs_eps(cdst[i], odst[i], ARBITRARY_FMAC_SCALAR_CONST)) {
- fprintf(stderr, "%d: %- .12f - %- .12f = % .12g\n",
- i, cdst[i], odst[i], cdst[i] - odst[i]);
- fail();
- break;
- }
- }
- memcpy(odst, src2, LEN * sizeof(*src2));
- bench_new(odst, src0, src1[0], LEN);
-}
-
-static void test_vector_dmul_scalar(const double *src0, const double *src1)
-{
- LOCAL_ALIGNED_32(double, cdst, [LEN]);
- LOCAL_ALIGNED_32(double, odst, [LEN]);
- int i;
-
- declare_func(void, double *dst, const double *src, double mul, int len);
-
- call_ref(cdst, src0, src1[0], LEN);
- call_new(odst, src0, src1[0], LEN);
- for (i = 0; i < LEN; i++) {
- double t = fabs(src1[0]) + fabs(src0[i]) + fabs(src1[0] * src0[i]) + 1.0;
- if (!double_near_abs_eps(cdst[i], odst[i], t * 2 * DBL_EPSILON)) {
- fprintf(stderr, "%d: %- .12f - %- .12f = % .12g\n", i,
- cdst[i], odst[i], cdst[i] - odst[i]);
- fail();
- break;
- }
- }
- bench_new(odst, src0, src1[0], LEN);
-}
-
-#define ARBITRARY_DMAC_SCALAR_CONST 0.005
-static void test_vector_dmac_scalar(const double *src0, const double *src1, const double *src2)
-{
- LOCAL_ALIGNED_32(double, cdst, [LEN]);
- LOCAL_ALIGNED_32(double, odst, [LEN]);
- int i;
-
- declare_func(void, double *dst, const double *src, double mul, int len);
-
- memcpy(cdst, src2, LEN * sizeof(*src2));
- memcpy(odst, src2, LEN * sizeof(*src2));
- call_ref(cdst, src0, src1[0], LEN);
- call_new(odst, src0, src1[0], LEN);
- for (i = 0; i < LEN; i++) {
- if (!double_near_abs_eps(cdst[i], odst[i], ARBITRARY_DMAC_SCALAR_CONST)) {
- fprintf(stderr, "%d: %- .12f - %- .12f = % .12g\n",
- i, cdst[i], odst[i], cdst[i] - odst[i]);
- fail();
- break;
- }
- }
- memcpy(odst, src2, LEN * sizeof(*src2));
- bench_new(odst, src0, src1[0], LEN);
-}
-
-static void test_butterflies_float(const float *src0, const float *src1)
-{
- LOCAL_ALIGNED_16(float, cdst, [LEN]);
- LOCAL_ALIGNED_16(float, odst, [LEN]);
- LOCAL_ALIGNED_16(float, cdst1, [LEN]);
- LOCAL_ALIGNED_16(float, odst1, [LEN]);
- int i;
-
- declare_func(void, float *av_restrict src0, float *av_restrict src1,
- int len);
-
- memcpy(cdst, src0, LEN * sizeof(*src0));
- memcpy(cdst1, src1, LEN * sizeof(*src1));
- memcpy(odst, src0, LEN * sizeof(*src0));
- memcpy(odst1, src1, LEN * sizeof(*src1));
-
- call_ref(cdst, cdst1, LEN);
- call_new(odst, odst1, LEN);
- for (i = 0; i < LEN; i++) {
- if (!float_near_abs_eps(cdst[i], odst[i], FLT_EPSILON) ||
- !float_near_abs_eps(cdst1[i], odst1[i], FLT_EPSILON)) {
- fprintf(stderr, "%d: %- .12f - %- .12f = % .12g\n",
- i, cdst[i], odst[i], cdst[i] - odst[i]);
- fprintf(stderr, "%d: %- .12f - %- .12f = % .12g\n",
- i, cdst1[i], odst1[i], cdst1[i] - odst1[i]);
- fail();
- break;
- }
- }
- memcpy(odst, src0, LEN * sizeof(*src0));
- memcpy(odst1, src1, LEN * sizeof(*src1));
- bench_new(odst, odst1, LEN);
-}
-
-#define ARBITRARY_SCALARPRODUCT_CONST 0.2
-static void test_scalarproduct_float(const float *src0, const float *src1)
-{
- float cprod, oprod;
-
- declare_func_float(float, const float *src0, const float *src1, int len);
-
- cprod = call_ref(src0, src1, LEN);
- oprod = call_new(src0, src1, LEN);
- if (!float_near_abs_eps(cprod, oprod, ARBITRARY_SCALARPRODUCT_CONST)) {
- fprintf(stderr, "%- .12f - %- .12f = % .12g\n",
- cprod, oprod, cprod - oprod);
- fail();
- }
- bench_new(src0, src1, LEN);
-}
-
-void checkasm_check_float_dsp(void)
-{
- LOCAL_ALIGNED_32(float, src0, [LEN]);
- LOCAL_ALIGNED_32(float, src1, [LEN]);
- LOCAL_ALIGNED_32(float, src2, [LEN]);
- LOCAL_ALIGNED_16(float, src3, [LEN]);
- LOCAL_ALIGNED_16(float, src4, [LEN]);
- LOCAL_ALIGNED_16(float, src5, [LEN]);
- LOCAL_ALIGNED_32(double, dbl_src0, [LEN]);
- LOCAL_ALIGNED_32(double, dbl_src1, [LEN]);
- LOCAL_ALIGNED_32(double, dbl_src2, [LEN]);
- AVFloatDSPContext *fdsp = avpriv_float_dsp_alloc(1);
-
- if (!fdsp) {
- fprintf(stderr, "floatdsp: Out of memory error\n");
- return;
- }
-
- randomize_buffer(src0);
- randomize_buffer(src1);
- randomize_buffer(src2);
- randomize_buffer(src3);
- randomize_buffer(src4);
- randomize_buffer(src5);
- randomize_buffer(dbl_src0);
- randomize_buffer(dbl_src1);
- randomize_buffer(dbl_src2);
-
- if (check_func(fdsp->vector_fmul, "vector_fmul"))
- test_vector_fmul(src0, src1);
- if (check_func(fdsp->vector_fmul_add, "vector_fmul_add"))
- test_vector_fmul_add(src0, src1, src2);
- if (check_func(fdsp->vector_fmul_scalar, "vector_fmul_scalar"))
- test_vector_fmul_scalar(src3, src4);
- if (check_func(fdsp->vector_fmul_reverse, "vector_fmul_reverse"))
- test_vector_fmul(src0, src1);
- if (check_func(fdsp->vector_fmul_window, "vector_fmul_window"))
- test_vector_fmul_window(src3, src4, src5);
- report("vector_fmul");
- if (check_func(fdsp->vector_fmac_scalar, "vector_fmac_scalar"))
- test_vector_fmac_scalar(src0, src1, src2);
- report("vector_fmac");
- if (check_func(fdsp->vector_dmul, "vector_dmul"))
- test_vector_dmul(dbl_src0, dbl_src1);
- if (check_func(fdsp->vector_dmul_scalar, "vector_dmul_scalar"))
- test_vector_dmul_scalar(dbl_src0, dbl_src1);
- report("vector_dmul");
- if (check_func(fdsp->vector_dmac_scalar, "vector_dmac_scalar"))
- test_vector_dmac_scalar(dbl_src0, dbl_src1, dbl_src2);
- report("vector_dmac");
- if (check_func(fdsp->butterflies_float, "butterflies_float"))
- test_butterflies_float(src3, src4);
- report("butterflies_float");
- if (check_func(fdsp->scalarproduct_float, "scalarproduct_float"))
- test_scalarproduct_float(src3, src4);
- report("scalarproduct_float");
-
- av_freep(&fdsp);
-}
diff --git a/tests/checkasm/fmtconvert.c b/tests/checkasm/fmtconvert.c
deleted file mode 100644
index 50ad3ca..0000000
--- a/tests/checkasm/fmtconvert.c
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (c) 2015 Janne Grunau
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include <math.h>
-#include <stdint.h>
-#include <string.h>
-
-#include "libavutil/internal.h"
-#include "libavutil/common.h"
-#include "libavcodec/fmtconvert.h"
-
-#include "checkasm.h"
-
-#define BUF_SIZE 1024
-
-#define randomize_input(len) \
- do { \
- int k; \
- for (k = 0; k < len; k++) { \
- in[k] = rnd() - INT32_MAX; \
- } \
- for ( ; k < BUF_SIZE; k++) { \
- in[k] = INT32_MAX; \
- } \
- } while (0)
-
-void checkasm_check_fmtconvert(void)
-{
- FmtConvertContext c;
- LOCAL_ALIGNED(32, float, dst0, [BUF_SIZE]);
- LOCAL_ALIGNED(32, float, dst1, [BUF_SIZE]);
- LOCAL_ALIGNED(32, int32_t, in, [BUF_SIZE]);
- float scale_arr[128];
- int length[] = {8, 16, 24, 56, 72, 128, 512, 520, 656, 768, 992};
- int i, j;
-
- for (i = 0; i < FF_ARRAY_ELEMS(scale_arr); i++)
- scale_arr[i] = (FF_ARRAY_ELEMS(scale_arr) - FF_ARRAY_ELEMS(scale_arr) / 2) / 13;
-
- ff_fmt_convert_init(&c, NULL);
-
- memset(dst0, 0, sizeof(*dst0) * BUF_SIZE);
- memset(dst1, 0, sizeof(*dst1) * BUF_SIZE);
-
- if (check_func(c.int32_to_float_fmul_scalar, "int32_to_float_fmul_scalar")) {
- declare_func(void, float *, const int32_t *, float, int);
-
- for (i = 0; i < FF_ARRAY_ELEMS(scale_arr); i++) {
- for (j = 0; j < FF_ARRAY_ELEMS(length); j++) {
-
- randomize_input(length[j]);
-
- call_ref(dst0, in, scale_arr[i], length[j]);
- call_new(dst1, in, scale_arr[i], length[j]);
-
- if (!float_near_ulp_array(dst0, dst1, 3, length[j])) {
- fail();
- break;
- }
-
- bench_new(dst1, in, scale_arr[i], length[j]);
- }
- }
- }
- if (check_func(c.int32_to_float_fmul_array8, "int32_to_float_fmul_array8")) {
- declare_func(void, FmtConvertContext *, float *, const int32_t *,
- const float *, int);
-
- for (i = 0; i < 4; i++) {
- for (j = 0; j < FF_ARRAY_ELEMS(length); j++) {
-
- randomize_input(length[j]);
-
- call_ref(&c, dst0, in, scale_arr, length[j]);
- call_new(&c, dst1, in, scale_arr, length[j]);
-
- if (!float_near_ulp_array(dst0, dst1, 3, length[j])) {
- fail();
- fprintf(stderr, "int32_to_float_fmul_array8: len: %d\n", length[j]);
- break;
- }
-
- bench_new(&c, dst1, in, scale_arr, length[j]);
- }
- }
- }
- report("fmtconvert");
-}
diff --git a/tests/checkasm/g722dsp.c b/tests/checkasm/g722dsp.c
deleted file mode 100644
index 6bcff11..0000000
--- a/tests/checkasm/g722dsp.c
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include <string.h>
-#include "checkasm.h"
-#include "libavcodec/g722.h"
-#include "libavcodec/g722dsp.h"
-#include "libavcodec/mathops.h"
-
-#define randomize_buffers() \
- do { \
- int i; \
- for (i = 0; i < PREV_SAMPLES_BUF_SIZE; i++) { \
- src0[i] = src1[i] = sign_extend(rnd(), 16); \
- } \
- } while (0)
-
-static void check_qmf(void) {
- int16_t src0[PREV_SAMPLES_BUF_SIZE];
- int16_t src1[PREV_SAMPLES_BUF_SIZE];
- const int16_t *tmp0 = src0;
- const int16_t *tmp1 = src1;
- int dst0[2], dst1[2];
- int i;
-
- declare_func(void, const int16_t *prev_samples, int xout[2]);
-
- randomize_buffers();
- for (i = 0; i < PREV_SAMPLES_BUF_SIZE - 24; i++) {
- call_ref(tmp0++, dst0);
- call_new(tmp1++, dst1);
- if (memcmp(dst0, dst1, sizeof(dst0)))
- fail();
- }
- bench_new(src1, dst1);
-}
-
-void checkasm_check_g722dsp(void)
-{
- G722DSPContext h;
-
- ff_g722dsp_init(&h);
-
- if (check_func(h.apply_qmf, "g722_apply_qmf"))
- check_qmf();
-
- report("apply_qmf");
-}
diff --git a/tests/checkasm/h264dsp.c b/tests/checkasm/h264dsp.c
deleted file mode 100644
index 6975205..0000000
--- a/tests/checkasm/h264dsp.c
+++ /dev/null
@@ -1,452 +0,0 @@
-/*
- * Copyright (c) 2016 Martin Storsjo
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include <string.h>
-#include "checkasm.h"
-#include "libavcodec/avcodec.h"
-#include "libavcodec/h264dsp.h"
-#include "libavcodec/h264data.h"
-#include "libavutil/common.h"
-#include "libavutil/internal.h"
-#include "libavutil/intreadwrite.h"
-
-static const uint32_t pixel_mask[3] = { 0xffffffff, 0x01ff01ff, 0x03ff03ff };
-static const uint32_t pixel_mask_lf[3] = { 0xff0fff0f, 0x01ff000f, 0x03ff000f };
-
-#define SIZEOF_PIXEL ((bit_depth + 7) / 8)
-#define SIZEOF_COEF (2 * ((bit_depth + 7) / 8))
-#define PIXEL_STRIDE 16
-
-#define randomize_buffers() \
- do { \
- int x, y; \
- uint32_t mask = pixel_mask[bit_depth - 8]; \
- for (y = 0; y < sz; y++) { \
- for (x = 0; x < PIXEL_STRIDE; x += 4) { \
- AV_WN32A(src + y * PIXEL_STRIDE + x, rnd() & mask); \
- AV_WN32A(dst + y * PIXEL_STRIDE + x, rnd() & mask); \
- } \
- for (x = 0; x < sz; x++) { \
- if (bit_depth == 8) { \
- coef[y * sz + x] = src[y * PIXEL_STRIDE + x] - \
- dst[y * PIXEL_STRIDE + x]; \
- } else { \
- ((int32_t *)coef)[y * sz + x] = \
- ((uint16_t *)src)[y * (PIXEL_STRIDE/2) + x] - \
- ((uint16_t *)dst)[y * (PIXEL_STRIDE/2) + x]; \
- } \
- } \
- } \
- } while (0)
-
-#define dct4x4_impl(size, dctcoef) \
-static void dct4x4_##size(dctcoef *coef) \
-{ \
- int i, y, x; \
- dctcoef tmp[16]; \
- for (i = 0; i < 4; i++) { \
- const int z0 = coef[i*4 + 0] + coef[i*4 + 3]; \
- const int z1 = coef[i*4 + 1] + coef[i*4 + 2]; \
- const int z2 = coef[i*4 + 0] - coef[i*4 + 3]; \
- const int z3 = coef[i*4 + 1] - coef[i*4 + 2]; \
- tmp[i + 4*0] = z0 + z1; \
- tmp[i + 4*1] = 2*z2 + z3; \
- tmp[i + 4*2] = z0 - z1; \
- tmp[i + 4*3] = z2 - 2*z3; \
- } \
- for (i = 0; i < 4; i++) { \
- const int z0 = tmp[i*4 + 0] + tmp[i*4 + 3]; \
- const int z1 = tmp[i*4 + 1] + tmp[i*4 + 2]; \
- const int z2 = tmp[i*4 + 0] - tmp[i*4 + 3]; \
- const int z3 = tmp[i*4 + 1] - tmp[i*4 + 2]; \
- coef[i*4 + 0] = z0 + z1; \
- coef[i*4 + 1] = 2*z2 + z3; \
- coef[i*4 + 2] = z0 - z1; \
- coef[i*4 + 3] = z2 - 2*z3; \
- } \
- for (y = 0; y < 4; y++) { \
- for (x = 0; x < 4; x++) { \
- static const int scale[] = { 13107 * 10, 8066 * 13, 5243 * 16 }; \
- const int idx = (y & 1) + (x & 1); \
- coef[y*4 + x] = (coef[y*4 + x] * scale[idx] + (1 << 14)) >> 15; \
- } \
- } \
-}
-
-#define DCT8_1D(src, srcstride, dst, dststride) do { \
- const int a0 = (src)[srcstride * 0] + (src)[srcstride * 7]; \
- const int a1 = (src)[srcstride * 0] - (src)[srcstride * 7]; \
- const int a2 = (src)[srcstride * 1] + (src)[srcstride * 6]; \
- const int a3 = (src)[srcstride * 1] - (src)[srcstride * 6]; \
- const int a4 = (src)[srcstride * 2] + (src)[srcstride * 5]; \
- const int a5 = (src)[srcstride * 2] - (src)[srcstride * 5]; \
- const int a6 = (src)[srcstride * 3] + (src)[srcstride * 4]; \
- const int a7 = (src)[srcstride * 3] - (src)[srcstride * 4]; \
- const int b0 = a0 + a6; \
- const int b1 = a2 + a4; \
- const int b2 = a0 - a6; \
- const int b3 = a2 - a4; \
- const int b4 = a3 + a5 + (a1 + (a1 >> 1)); \
- const int b5 = a1 - a7 - (a5 + (a5 >> 1)); \
- const int b6 = a1 + a7 - (a3 + (a3 >> 1)); \
- const int b7 = a3 - a5 + (a7 + (a7 >> 1)); \
- (dst)[dststride * 0] = b0 + b1; \
- (dst)[dststride * 1] = b4 + (b7 >> 2); \
- (dst)[dststride * 2] = b2 + (b3 >> 1); \
- (dst)[dststride * 3] = b5 + (b6 >> 2); \
- (dst)[dststride * 4] = b0 - b1; \
- (dst)[dststride * 5] = b6 - (b5 >> 2); \
- (dst)[dststride * 6] = (b2 >> 1) - b3; \
- (dst)[dststride * 7] = (b4 >> 2) - b7; \
-} while (0)
-
-#define dct8x8_impl(size, dctcoef) \
-static void dct8x8_##size(dctcoef *coef) \
-{ \
- int i, x, y; \
- dctcoef tmp[64]; \
- for (i = 0; i < 8; i++) \
- DCT8_1D(coef + i, 8, tmp + i, 8); \
- \
- for (i = 0; i < 8; i++) \
- DCT8_1D(tmp + 8*i, 1, coef + i, 8); \
- \
- for (y = 0; y < 8; y++) { \
- for (x = 0; x < 8; x++) { \
- static const int scale[] = { \
- 13107 * 20, 11428 * 18, 20972 * 32, \
- 12222 * 19, 16777 * 25, 15481 * 24, \
- }; \
- static const int idxmap[] = { \
- 0, 3, 4, 3, \
- 3, 1, 5, 1, \
- 4, 5, 2, 5, \
- 3, 1, 5, 1, \
- }; \
- const int idx = idxmap[(y & 3) * 4 + (x & 3)]; \
- coef[y*8 + x] = ((int64_t)coef[y*8 + x] * \
- scale[idx] + (1 << 17)) >> 18; \
- } \
- } \
-}
-
-dct4x4_impl(16, int16_t)
-dct4x4_impl(32, int32_t)
-
-dct8x8_impl(16, int16_t)
-dct8x8_impl(32, int32_t)
-
-static void dct4x4(int16_t *coef, int bit_depth)
-{
- if (bit_depth == 8)
- dct4x4_16(coef);
- else
- dct4x4_32((int32_t *) coef);
-}
-
-static void dct8x8(int16_t *coef, int bit_depth)
-{
- if (bit_depth == 8) {
- dct8x8_16(coef);
- } else {
- dct8x8_32((int32_t *) coef);
- }
-}
-
-
-static void check_idct(void)
-{
- LOCAL_ALIGNED_16(uint8_t, src, [8 * 8 * 2]);
- LOCAL_ALIGNED_16(uint8_t, dst, [8 * 8 * 2]);
- LOCAL_ALIGNED_16(uint8_t, dst0, [8 * 8 * 2]);
- LOCAL_ALIGNED_16(uint8_t, dst1_base, [8 * 8 * 2 + 32]);
- LOCAL_ALIGNED_16(int16_t, coef, [8 * 8 * 2]);
- LOCAL_ALIGNED_16(int16_t, subcoef0, [8 * 8 * 2]);
- LOCAL_ALIGNED_16(int16_t, subcoef1, [8 * 8 * 2]);
- H264DSPContext h;
- int bit_depth, sz, align, dc;
- declare_func_emms(AV_CPU_FLAG_MMX, void, uint8_t *dst, int16_t *block, int stride);
-
- for (bit_depth = 8; bit_depth <= 10; bit_depth++) {
- ff_h264dsp_init(&h, bit_depth, 1);
- for (sz = 4; sz <= 8; sz += 4) {
- randomize_buffers();
-
- if (sz == 4)
- dct4x4(coef, bit_depth);
- else
- dct8x8(coef, bit_depth);
-
- for (dc = 0; dc <= 1; dc++) {
- void (*idct)(uint8_t *, int16_t *, int) = NULL;
- switch ((sz << 1) | dc) {
- case (4 << 1) | 0: idct = h.h264_idct_add; break;
- case (4 << 1) | 1: idct = h.h264_idct_dc_add; break;
- case (8 << 1) | 0: idct = h.h264_idct8_add; break;
- case (8 << 1) | 1: idct = h.h264_idct8_dc_add; break;
- }
- if (check_func(idct, "h264_idct%d_add%s_%dbpp", sz, dc ? "_dc" : "", bit_depth)) {
- for (align = 0; align < 16; align += sz * SIZEOF_PIXEL) {
- uint8_t *dst1 = dst1_base + align;
- if (dc) {
- memset(subcoef0, 0, sz * sz * SIZEOF_COEF);
- memcpy(subcoef0, coef, SIZEOF_COEF);
- } else {
- memcpy(subcoef0, coef, sz * sz * SIZEOF_COEF);
- }
- memcpy(dst0, dst, sz * PIXEL_STRIDE);
- memcpy(dst1, dst, sz * PIXEL_STRIDE);
- memcpy(subcoef1, subcoef0, sz * sz * SIZEOF_COEF);
- call_ref(dst0, subcoef0, PIXEL_STRIDE);
- call_new(dst1, subcoef1, PIXEL_STRIDE);
- if (memcmp(dst0, dst1, sz * PIXEL_STRIDE) ||
- memcmp(subcoef0, subcoef1, sz * sz * SIZEOF_COEF))
- fail();
- bench_new(dst1, subcoef1, sz * SIZEOF_PIXEL);
- }
- }
- }
- }
- }
-}
-
-static void check_idct_multiple(void)
-{
- LOCAL_ALIGNED_16(uint8_t, dst_full, [16 * 16 * 2]);
- LOCAL_ALIGNED_16(int16_t, coef_full, [16 * 16 * 2]);
- LOCAL_ALIGNED_16(uint8_t, dst0, [16 * 16 * 2]);
- LOCAL_ALIGNED_16(uint8_t, dst1, [16 * 16 * 2]);
- LOCAL_ALIGNED_16(int16_t, coef0, [16 * 16 * 2]);
- LOCAL_ALIGNED_16(int16_t, coef1, [16 * 16 * 2]);
- LOCAL_ALIGNED_16(uint8_t, nnzc, [15 * 8]);
- H264DSPContext h;
- int bit_depth, i, y, func;
- declare_func_emms(AV_CPU_FLAG_MMX, void, uint8_t *dst, const int *block_offset, int16_t *block, int stride, const uint8_t nnzc[15*8]);
-
- for (bit_depth = 8; bit_depth <= 10; bit_depth++) {
- ff_h264dsp_init(&h, bit_depth, 1);
- for (func = 0; func < 3; func++) {
- void (*idct)(uint8_t *, const int *, int16_t *, int, const uint8_t[]) = NULL;
- const char *name;
- int sz = 4, intra = 0;
- int block_offset[16] = { 0 };
- switch (func) {
- case 0:
- idct = h.h264_idct_add16;
- name = "h264_idct_add16";
- break;
- case 1:
- idct = h.h264_idct_add16intra;
- name = "h264_idct_add16intra";
- intra = 1;
- break;
- case 2:
- idct = h.h264_idct8_add4;
- name = "h264_idct8_add4";
- sz = 8;
- break;
- }
- memset(nnzc, 0, 15 * 8);
- memset(coef_full, 0, 16 * 16 * SIZEOF_COEF);
- for (i = 0; i < 16 * 16; i += sz * sz) {
- uint8_t src[8 * 8 * 2];
- uint8_t dst[8 * 8 * 2];
- int16_t coef[8 * 8 * 2];
- int index = i / sz;
- int block_y = (index / 16) * sz;
- int block_x = index % 16;
- int offset = (block_y * 16 + block_x) * SIZEOF_PIXEL;
- int nnz = rnd() % 3;
-
- randomize_buffers();
- if (sz == 4)
- dct4x4(coef, bit_depth);
- else
- dct8x8(coef, bit_depth);
-
- for (y = 0; y < sz; y++)
- memcpy(&dst_full[offset + y * 16 * SIZEOF_PIXEL],
- &dst[PIXEL_STRIDE * y], sz * SIZEOF_PIXEL);
-
- if (nnz > 1)
- nnz = sz * sz;
- memcpy(&coef_full[i * SIZEOF_COEF/sizeof(coef[0])],
- coef, nnz * SIZEOF_COEF);
-
- if (intra && nnz == 1)
- nnz = 0;
-
- nnzc[scan8[i / 16]] = nnz;
- block_offset[i / 16] = offset;
- }
-
- if (check_func(idct, "%s_%dbpp", name, bit_depth)) {
- memcpy(coef0, coef_full, 16 * 16 * SIZEOF_COEF);
- memcpy(coef1, coef_full, 16 * 16 * SIZEOF_COEF);
- memcpy(dst0, dst_full, 16 * 16 * SIZEOF_PIXEL);
- memcpy(dst1, dst_full, 16 * 16 * SIZEOF_PIXEL);
- call_ref(dst0, block_offset, coef0, 16 * SIZEOF_PIXEL, nnzc);
- call_new(dst1, block_offset, coef1, 16 * SIZEOF_PIXEL, nnzc);
- if (memcmp(dst0, dst1, 16 * 16 * SIZEOF_PIXEL) ||
- memcmp(coef0, coef1, 16 * 16 * SIZEOF_COEF))
- fail();
- bench_new(dst1, block_offset, coef1, 16 * SIZEOF_PIXEL, nnzc);
- }
- }
- }
-}
-
-
-static void check_loop_filter(void)
-{
- LOCAL_ALIGNED_16(uint8_t, dst, [32 * 16 * 2]);
- LOCAL_ALIGNED_16(uint8_t, dst0, [32 * 16 * 2]);
- LOCAL_ALIGNED_16(uint8_t, dst1, [32 * 16 * 2]);
- H264DSPContext h;
- int bit_depth;
- int alphas[36], betas[36];
- int8_t tc0[36][4];
-
- declare_func_emms(AV_CPU_FLAG_MMX, void, uint8_t *pix, ptrdiff_t stride,
- int alpha, int beta, int8_t *tc0);
-
- for (bit_depth = 8; bit_depth <= 10; bit_depth++) {
- int i, j, a, c;
- uint32_t mask = pixel_mask_lf[bit_depth - 8];
- ff_h264dsp_init(&h, bit_depth, 1);
- for (i = 35, a = 255, c = 250; i >= 0; i--) {
- alphas[i] = a << (bit_depth - 8);
- betas[i] = (i + 1) / 2 << (bit_depth - 8);
- tc0[i][0] = tc0[i][3] = (c + 6) / 10;
- tc0[i][1] = (c + 7) / 15;
- tc0[i][2] = (c + 9) / 20;
- a = a*9/10;
- c = c*9/10;
- }
-
-#define CHECK_LOOP_FILTER(name, align, idc) \
- do { \
- if (check_func(h.name, #name #idc "_%dbpp", bit_depth)) { \
- for (j = 0; j < 36; j++) { \
- intptr_t off = 8 * 32 + (j & 15) * 4 * !align; \
- for (i = 0; i < 1024; i+=4) { \
- AV_WN32A(dst + i, rnd() & mask); \
- } \
- memcpy(dst0, dst, 32 * 16 * 2); \
- memcpy(dst1, dst, 32 * 16 * 2); \
- \
- call_ref(dst0 + off, 32, alphas[j], betas[j], tc0[j]); \
- call_new(dst1 + off, 32, alphas[j], betas[j], tc0[j]); \
- if (memcmp(dst0, dst1, 32 * 16 * SIZEOF_PIXEL)) { \
- fprintf(stderr, #name #idc ": j:%d, alpha:%d beta:%d " \
- "tc0:{%d,%d,%d,%d}\n", j, alphas[j], betas[j], \
- tc0[j][0], tc0[j][1], tc0[j][2], tc0[j][3]); \
- fail(); \
- } \
- bench_new(dst1, 32, alphas[j], betas[j], tc0[j]); \
- } \
- } \
- } while (0)
-
- CHECK_LOOP_FILTER(h264_v_loop_filter_luma, 1,);
- CHECK_LOOP_FILTER(h264_h_loop_filter_luma, 0,);
- CHECK_LOOP_FILTER(h264_h_loop_filter_luma_mbaff, 0,);
- CHECK_LOOP_FILTER(h264_v_loop_filter_chroma, 1,);
- CHECK_LOOP_FILTER(h264_h_loop_filter_chroma, 0,);
- CHECK_LOOP_FILTER(h264_h_loop_filter_chroma_mbaff, 0,);
-
- ff_h264dsp_init(&h, bit_depth, 2);
- CHECK_LOOP_FILTER(h264_h_loop_filter_chroma, 0, 422);
- CHECK_LOOP_FILTER(h264_h_loop_filter_chroma_mbaff, 0, 422);
-#undef CHECK_LOOP_FILTER
- }
-}
-
-static void check_loop_filter_intra(void)
-{
- LOCAL_ALIGNED_16(uint8_t, dst, [32 * 16 * 2]);
- LOCAL_ALIGNED_16(uint8_t, dst0, [32 * 16 * 2]);
- LOCAL_ALIGNED_16(uint8_t, dst1, [32 * 16 * 2]);
- H264DSPContext h;
- int bit_depth;
- int alphas[36], betas[36];
-
- declare_func_emms(AV_CPU_FLAG_MMX, void, uint8_t *pix, ptrdiff_t stride,
- int alpha, int beta);
-
- for (bit_depth = 8; bit_depth <= 10; bit_depth++) {
- int i, j, a;
- uint32_t mask = pixel_mask_lf[bit_depth - 8];
- ff_h264dsp_init(&h, bit_depth, 1);
- for (i = 35, a = 255; i >= 0; i--) {
- alphas[i] = a << (bit_depth - 8);
- betas[i] = (i + 1) / 2 << (bit_depth - 8);
- a = a*9/10;
- }
-
-#define CHECK_LOOP_FILTER(name, align, idc) \
- do { \
- if (check_func(h.name, #name #idc "_%dbpp", bit_depth)) { \
- for (j = 0; j < 36; j++) { \
- intptr_t off = 8 * 32 + (j & 15) * 4 * !align; \
- for (i = 0; i < 1024; i+=4) { \
- AV_WN32A(dst + i, rnd() & mask); \
- } \
- memcpy(dst0, dst, 32 * 16 * 2); \
- memcpy(dst1, dst, 32 * 16 * 2); \
- \
- call_ref(dst0 + off, 32, alphas[j], betas[j]); \
- call_new(dst1 + off, 32, alphas[j], betas[j]); \
- if (memcmp(dst0, dst1, 32 * 16 * SIZEOF_PIXEL)) { \
- fprintf(stderr, #name #idc ": j:%d, alpha:%d beta:%d\n", \
- j, alphas[j], betas[j]); \
- fail(); \
- } \
- bench_new(dst1, 32, alphas[j], betas[j]); \
- } \
- } \
- } while (0)
-
- CHECK_LOOP_FILTER(h264_v_loop_filter_luma_intra, 1,);
- CHECK_LOOP_FILTER(h264_h_loop_filter_luma_intra, 0,);
- CHECK_LOOP_FILTER(h264_h_loop_filter_luma_mbaff_intra, 0,);
- CHECK_LOOP_FILTER(h264_v_loop_filter_chroma_intra, 1,);
- CHECK_LOOP_FILTER(h264_h_loop_filter_chroma_intra, 0,);
- CHECK_LOOP_FILTER(h264_h_loop_filter_chroma_mbaff_intra, 0,);
-
- ff_h264dsp_init(&h, bit_depth, 2);
- CHECK_LOOP_FILTER(h264_h_loop_filter_chroma_intra, 0, 422);
- CHECK_LOOP_FILTER(h264_h_loop_filter_chroma_mbaff_intra, 0, 422);
-#undef CHECK_LOOP_FILTER
- }
-}
-
-void checkasm_check_h264dsp(void)
-{
- check_idct();
- check_idct_multiple();
- report("idct");
-
- check_loop_filter();
- report("loop_filter");
-
- check_loop_filter_intra();
- report("loop_filter_intra");
-}
diff --git a/tests/checkasm/h264pred.c b/tests/checkasm/h264pred.c
deleted file mode 100644
index 59dcb2f..0000000
--- a/tests/checkasm/h264pred.c
+++ /dev/null
@@ -1,260 +0,0 @@
-/*
- * Copyright (c) 2015 Henrik Gramner
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include <string.h>
-#include "checkasm.h"
-#include "libavcodec/avcodec.h"
-#include "libavcodec/h264pred.h"
-#include "libavutil/common.h"
-#include "libavutil/internal.h"
-#include "libavutil/intreadwrite.h"
-
-static const int codec_ids[4] = { AV_CODEC_ID_H264, AV_CODEC_ID_VP8, AV_CODEC_ID_RV40, AV_CODEC_ID_SVQ3 };
-
-static const char * const pred4x4_modes[4][15] = {
- { /* H.264 */
- [VERT_PRED ] = "vertical",
- [HOR_PRED ] = "horizontal",
- [DC_PRED ] = "dc",
- [DIAG_DOWN_LEFT_PRED ] = "down_left",
- [DIAG_DOWN_RIGHT_PRED] = "down_right",
- [VERT_RIGHT_PRED ] = "vertical_right",
- [HOR_DOWN_PRED ] = "horizontal_right",
- [VERT_LEFT_PRED ] = "vertical_left",
- [HOR_UP_PRED ] = "horizontal_up",
- [LEFT_DC_PRED ] = "left_dc",
- [TOP_DC_PRED ] = "top_dc",
- [DC_128_PRED ] = "dc_128",
- },
- { /* VP8 */
- [VERT_PRED ] = "vertical_vp8",
- [HOR_PRED ] = "horizontal_vp8",
- [VERT_LEFT_PRED] = "vertical_left_vp8",
- [TM_VP8_PRED ] = "tm_vp8",
- [DC_127_PRED ] = "dc_127_vp8",
- [DC_129_PRED ] = "dc_129_vp8",
- },
- { /* RV40 */
- [DIAG_DOWN_LEFT_PRED ] = "down_left_rv40",
- [VERT_LEFT_PRED ] = "vertical_left_rv40",
- [HOR_UP_PRED ] = "horizontal_up_rv40",
- [DIAG_DOWN_LEFT_PRED_RV40_NODOWN] = "down_left_nodown_rv40",
- [HOR_UP_PRED_RV40_NODOWN ] = "horizontal_up_nodown_rv40",
- [VERT_LEFT_PRED_RV40_NODOWN ] = "vertical_left_nodown_rv40",
- },
- { /* SVQ3 */
- [DIAG_DOWN_LEFT_PRED] = "down_left_svq3",
- },
-};
-
-static const char * const pred8x8_modes[4][11] = {
- { /* H.264 */
- [DC_PRED8x8 ] = "dc",
- [HOR_PRED8x8 ] = "horizontal",
- [VERT_PRED8x8 ] = "vertical",
- [PLANE_PRED8x8 ] = "plane",
- [LEFT_DC_PRED8x8 ] = "left_dc",
- [TOP_DC_PRED8x8 ] = "top_dc",
- [DC_128_PRED8x8 ] = "dc_128",
- [ALZHEIMER_DC_L0T_PRED8x8] = "mad_cow_dc_l0t",
- [ALZHEIMER_DC_0LT_PRED8x8] = "mad_cow_dc_0lt",
- [ALZHEIMER_DC_L00_PRED8x8] = "mad_cow_dc_l00",
- [ALZHEIMER_DC_0L0_PRED8x8] = "mad_cow_dc_0l0",
- },
- { /* VP8 */
- [PLANE_PRED8x8 ] = "tm_vp8",
- [DC_127_PRED8x8] = "dc_127_vp8",
- [DC_129_PRED8x8] = "dc_129_vp8",
- },
- { /* RV40 */
- [DC_PRED8x8 ] = "dc_rv40",
- [LEFT_DC_PRED8x8] = "left_dc_rv40",
- [TOP_DC_PRED8x8 ] = "top_dc_rv40",
- },
- /* nothing for SVQ3 */
-};
-
-static const char * const pred16x16_modes[4][9] = {
- { /* H.264 */
- [DC_PRED8x8 ] = "dc",
- [HOR_PRED8x8 ] = "horizontal",
- [VERT_PRED8x8 ] = "vertical",
- [PLANE_PRED8x8 ] = "plane",
- [LEFT_DC_PRED8x8] = "left_dc",
- [TOP_DC_PRED8x8 ] = "top_dc",
- [DC_128_PRED8x8 ] = "dc_128",
- },
- { /* VP8 */
- [PLANE_PRED8x8 ] = "tm_vp8",
- [DC_127_PRED8x8] = "dc_127_vp8",
- [DC_129_PRED8x8] = "dc_129_vp8",
- },
- { /* RV40 */
- [PLANE_PRED8x8] = "plane_rv40",
- },
- { /* SVQ3 */
- [PLANE_PRED8x8] = "plane_svq3",
- },
-};
-
-static const uint32_t pixel_mask[3] = { 0xffffffff, 0x01ff01ff, 0x03ff03ff };
-
-#define SIZEOF_PIXEL ((bit_depth + 7) / 8)
-#define BUF_SIZE (3 * 16 * 17)
-
-#define check_pred_func(func, name, mode_name) \
- (mode_name && ((codec_ids[codec] == AV_CODEC_ID_H264) ? \
- check_func(func, "pred%s_%s_%d", name, mode_name, bit_depth) : \
- check_func(func, "pred%s_%s", name, mode_name)))
-
-#define randomize_buffers() \
- do { \
- uint32_t mask = pixel_mask[bit_depth - 8]; \
- int i; \
- for (i = 0; i < BUF_SIZE; i += 4) { \
- uint32_t r = rnd() & mask; \
- AV_WN32A(buf0 + i, r); \
- AV_WN32A(buf1 + i, r); \
- } \
- } while (0)
-
-#define src0 (buf0 + 4 * 16) /* Offset to allow room for top and left */
-#define src1 (buf1 + 4 * 16)
-
-static void check_pred4x4(H264PredContext *h, uint8_t *buf0, uint8_t *buf1,
- int codec, int chroma_format, int bit_depth)
-{
- if (chroma_format == 1) {
- uint8_t *topright = buf0 + 2*16;
- int pred_mode;
- declare_func_emms(AV_CPU_FLAG_MMX | AV_CPU_FLAG_MMXEXT, void, uint8_t *src, const uint8_t *topright, ptrdiff_t stride);
-
- for (pred_mode = 0; pred_mode < 15; pred_mode++) {
- if (check_pred_func(h->pred4x4[pred_mode], "4x4", pred4x4_modes[codec][pred_mode])) {
- randomize_buffers();
- call_ref(src0, topright, 12*SIZEOF_PIXEL);
- call_new(src1, topright, 12*SIZEOF_PIXEL);
- if (memcmp(buf0, buf1, BUF_SIZE))
- fail();
- bench_new(src1, topright, 12*SIZEOF_PIXEL);
- }
- }
- }
-}
-
-static void check_pred8x8(H264PredContext *h, uint8_t *buf0, uint8_t *buf1,
- int codec, int chroma_format, int bit_depth)
-{
- int pred_mode;
- declare_func_emms(AV_CPU_FLAG_MMX | AV_CPU_FLAG_MMXEXT, void, uint8_t *src, ptrdiff_t stride);
-
- for (pred_mode = 0; pred_mode < 11; pred_mode++) {
- if (check_pred_func(h->pred8x8[pred_mode], (chroma_format == 2) ? "8x16" : "8x8",
- pred8x8_modes[codec][pred_mode])) {
- randomize_buffers();
- call_ref(src0, 24*SIZEOF_PIXEL);
- call_new(src1, 24*SIZEOF_PIXEL);
- if (memcmp(buf0, buf1, BUF_SIZE))
- fail();
- bench_new(src1, 24*SIZEOF_PIXEL);
- }
- }
-}
-
-static void check_pred16x16(H264PredContext *h, uint8_t *buf0, uint8_t *buf1,
- int codec, int chroma_format, int bit_depth)
-{
- if (chroma_format == 1) {
- int pred_mode;
- declare_func_emms(AV_CPU_FLAG_MMX | AV_CPU_FLAG_MMXEXT, void, uint8_t *src, ptrdiff_t stride);
-
- for (pred_mode = 0; pred_mode < 9; pred_mode++) {
- if (check_pred_func(h->pred16x16[pred_mode], "16x16", pred16x16_modes[codec][pred_mode])) {
- randomize_buffers();
- call_ref(src0, 48);
- call_new(src1, 48);
- if (memcmp(buf0, buf1, BUF_SIZE))
- fail();
- bench_new(src1, 48);
- }
- }
- }
-}
-
-static void check_pred8x8l(H264PredContext *h, uint8_t *buf0, uint8_t *buf1,
- int codec, int chroma_format, int bit_depth)
-{
- if (chroma_format == 1 && codec_ids[codec] == AV_CODEC_ID_H264) {
- int pred_mode;
- declare_func_emms(AV_CPU_FLAG_MMXEXT, void, uint8_t *src, int topleft, int topright, ptrdiff_t stride);
-
- for (pred_mode = 0; pred_mode < 12; pred_mode++) {
- if (check_pred_func(h->pred8x8l[pred_mode], "8x8l", pred4x4_modes[codec][pred_mode])) {
- int neighbors;
- for (neighbors = 0; neighbors <= 0xc000; neighbors += 0x4000) {
- int has_topleft = neighbors & 0x8000;
- int has_topright = neighbors & 0x4000;
-
- if ((pred_mode == DIAG_DOWN_RIGHT_PRED || pred_mode == VERT_RIGHT_PRED) && !has_topleft)
- continue; /* Those aren't allowed according to the spec */
-
- randomize_buffers();
- call_ref(src0, has_topleft, has_topright, 24*SIZEOF_PIXEL);
- call_new(src1, has_topleft, has_topright, 24*SIZEOF_PIXEL);
- if (memcmp(buf0, buf1, BUF_SIZE))
- fail();
- bench_new(src1, has_topleft, has_topright, 24*SIZEOF_PIXEL);
- }
- }
- }
- }
-}
-
-/* TODO: Add tests for H.264 lossless H/V prediction */
-
-void checkasm_check_h264pred(void)
-{
- static const struct {
- void (*func)(H264PredContext*, uint8_t*, uint8_t*, int, int, int);
- const char *name;
- } tests[] = {
- { check_pred4x4, "pred4x4" },
- { check_pred8x8, "pred8x8" },
- { check_pred16x16, "pred16x16" },
- { check_pred8x8l, "pred8x8l" },
- };
-
- LOCAL_ALIGNED_16(uint8_t, buf0, [BUF_SIZE]);
- LOCAL_ALIGNED_16(uint8_t, buf1, [BUF_SIZE]);
- H264PredContext h;
- int test, codec, chroma_format, bit_depth;
-
- for (test = 0; test < FF_ARRAY_ELEMS(tests); test++) {
- for (codec = 0; codec < 4; codec++) {
- int codec_id = codec_ids[codec];
- for (bit_depth = 8; bit_depth <= (codec_id == AV_CODEC_ID_H264 ? 10 : 8); bit_depth++)
- for (chroma_format = 1; chroma_format <= (codec_id == AV_CODEC_ID_H264 ? 2 : 1); chroma_format++) {
- ff_h264_pred_init(&h, codec_id, bit_depth, chroma_format);
- tests[test].func(&h, buf0, buf1, codec, chroma_format, bit_depth);
- }
- }
- report("%s", tests[test].name);
- }
-}
diff --git a/tests/checkasm/h264qpel.c b/tests/checkasm/h264qpel.c
deleted file mode 100644
index ba069f1..0000000
--- a/tests/checkasm/h264qpel.c
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (c) 2015 Henrik Gramner
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include <string.h>
-#include "checkasm.h"
-#include "libavcodec/h264qpel.h"
-#include "libavutil/common.h"
-#include "libavutil/internal.h"
-#include "libavutil/intreadwrite.h"
-
-static const uint32_t pixel_mask[3] = { 0xffffffff, 0x01ff01ff, 0x03ff03ff };
-
-#define SIZEOF_PIXEL ((bit_depth + 7) / 8)
-#define BUF_SIZE (2 * 16 * (16 + 3 + 4))
-
-#define randomize_buffers() \
- do { \
- uint32_t mask = pixel_mask[bit_depth - 8]; \
- int k; \
- for (k = 0; k < BUF_SIZE; k += 4) { \
- uint32_t r = rnd() & mask; \
- AV_WN32A(buf0 + k, r); \
- AV_WN32A(buf1 + k, r); \
- r = rnd(); \
- AV_WN32A(dst0 + k, r); \
- AV_WN32A(dst1 + k, r); \
- } \
- } while (0)
-
-#define src0 (buf0 + 3 * 2 * 16) /* h264qpel functions read data from negative src pointer offsets */
-#define src1 (buf1 + 3 * 2 * 16)
-
-void checkasm_check_h264qpel(void)
-{
- LOCAL_ALIGNED_16(uint8_t, buf0, [BUF_SIZE]);
- LOCAL_ALIGNED_16(uint8_t, buf1, [BUF_SIZE]);
- LOCAL_ALIGNED_16(uint8_t, dst0, [BUF_SIZE]);
- LOCAL_ALIGNED_16(uint8_t, dst1, [BUF_SIZE]);
- H264QpelContext h;
- int op, bit_depth, i, j;
- declare_func_emms(AV_CPU_FLAG_MMX | AV_CPU_FLAG_MMXEXT, void, uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
-
- for (op = 0; op < 2; op++) {
- qpel_mc_func (*tab)[16] = op ? h.avg_h264_qpel_pixels_tab : h.put_h264_qpel_pixels_tab;
- const char *op_name = op ? "avg" : "put";
-
- for (bit_depth = 8; bit_depth <= 10; bit_depth++) {
- ff_h264qpel_init(&h, bit_depth);
- for (i = 0; i < (op ? 3 : 4); i++) {
- int size = 16 >> i;
- for (j = 0; j < 16; j++)
- if (check_func(tab[i][j], "%s_h264_qpel_%d_mc%d%d_%d", op_name, size, j & 3, j >> 2, bit_depth)) {
- randomize_buffers();
- call_ref(dst0, src0, size * SIZEOF_PIXEL);
- call_new(dst1, src1, size * SIZEOF_PIXEL);
- if (memcmp(buf0, buf1, BUF_SIZE) || memcmp(dst0, dst1, BUF_SIZE))
- fail();
- bench_new(dst1, src1, size * SIZEOF_PIXEL);
- }
- }
- }
- report("%s", op_name);
- }
-}
diff --git a/tests/checkasm/hevc_add_res.c b/tests/checkasm/hevc_add_res.c
deleted file mode 100644
index 0a3bcbb..0000000
--- a/tests/checkasm/hevc_add_res.c
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright (c) 2016 Alexandra Hájková
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include <string.h>
-
-#include "libavutil/intreadwrite.h"
-
-#include "libavcodec/hevcdsp.h"
-
-#include "checkasm.h"
-
-#define randomize_buffers(buf, size) \
- do { \
- int j; \
- for (j = 0; j < size; j++) { \
- int16_t r = rnd(); \
- AV_WN16A(buf + j, r >> 3); \
- } \
- } while (0)
-
-#define randomize_buffers2(buf, size) \
- do { \
- int j; \
- for (j = 0; j < size; j++) \
- AV_WN16A(buf + j * 2, rnd() & 0x3FF); \
- } while (0)
-
-static void compare_add_res(int size, ptrdiff_t stride, int overflow_test)
-{
- LOCAL_ALIGNED_32(int16_t, res0, [32 * 32]);
- LOCAL_ALIGNED_32(int16_t, res1, [32 * 32]);
- LOCAL_ALIGNED_32(uint8_t, dst0, [32 * 32 * 2]);
- LOCAL_ALIGNED_32(uint8_t, dst1, [32 * 32 * 2]);
-
- declare_func_emms(AV_CPU_FLAG_MMX, void, uint8_t *dst, int16_t *res, ptrdiff_t stride);
-
- randomize_buffers(res0, size);
- randomize_buffers2(dst0, size);
- if (overflow_test)
- res0[0] = 0x8000;
- memcpy(res1, res0, sizeof(*res0) * size);
- memcpy(dst1, dst0, sizeof(int16_t) * size);
-
- call_ref(dst0, res0, stride);
- call_new(dst1, res1, stride);
- if (memcmp(dst0, dst1, size))
- fail();
- bench_new(dst1, res1, stride);
-}
-
-static void check_add_res(HEVCDSPContext h, int bit_depth)
-{
- int i;
-
- for (i = 2; i <= 5; i++) {
- int block_size = 1 << i;
- int size = block_size * block_size;
- ptrdiff_t stride = block_size << (bit_depth > 8);
-
- if (check_func(h.add_residual[i - 2], "hevc_add_res_%dx%d_%d", block_size, block_size, bit_depth)) {
- compare_add_res(size, stride, 0);
- // overflow test for res = -32768
- compare_add_res(size, stride, 1);
- }
- }
-}
-
-void checkasm_check_hevc_add_res(void)
-{
- int bit_depth;
-
- for (bit_depth = 8; bit_depth <= 10; bit_depth++) {
- HEVCDSPContext h;
-
- ff_hevc_dsp_init(&h, bit_depth);
- check_add_res(h, bit_depth);
- }
- report("add_residual");
-}
diff --git a/tests/checkasm/hevc_idct.c b/tests/checkasm/hevc_idct.c
deleted file mode 100644
index c20111c..0000000
--- a/tests/checkasm/hevc_idct.c
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (c) 2016 Alexandra Hájková
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include <string.h>
-
-#include "libavutil/intreadwrite.h"
-
-#include "libavcodec/hevcdsp.h"
-
-#include "checkasm.h"
-
-#define randomize_buffers(buf, size) \
- do { \
- int j; \
- for (j = 0; j < size; j++) { \
- int16_t r = rnd(); \
- AV_WN16A(buf + j, r); \
- } \
- } while (0)
-
-static void check_idct(HEVCDSPContext h, int bit_depth)
-{
- int i;
- LOCAL_ALIGNED(32, int16_t, coeffs0, [32 * 32]);
- LOCAL_ALIGNED(32, int16_t, coeffs1, [32 * 32]);
-
- for (i = 2; i <= 5; i++) {
- int block_size = 1 << i;
- int size = block_size * block_size;
- int col_limit = block_size;
- declare_func(void, int16_t *coeffs, int col_limit);
-
- randomize_buffers(coeffs0, size);
- memcpy(coeffs1, coeffs0, sizeof(*coeffs0) * size);
- if (check_func(h.idct[i - 2], "hevc_idct_%dx%d_%d", block_size, block_size, bit_depth)) {
- call_ref(coeffs0, col_limit);
- call_new(coeffs1, col_limit);
- if (memcmp(coeffs0, coeffs1, sizeof(*coeffs0) * size))
- fail();
- bench_new(coeffs1, col_limit);
- }
- }
-}
-
-static void check_idct_dc(HEVCDSPContext h, int bit_depth)
-{
- int i;
- LOCAL_ALIGNED(32, int16_t, coeffs0, [32 * 32]);
- LOCAL_ALIGNED(32, int16_t, coeffs1, [32 * 32]);
-
- for (i = 2; i <= 5; i++) {
- int block_size = 1 << i;
- int size = block_size * block_size;
- declare_func_emms(AV_CPU_FLAG_MMXEXT, void, int16_t *coeffs);
-
- randomize_buffers(coeffs0, size);
- memcpy(coeffs1, coeffs0, sizeof(*coeffs0) * size);
-
- if (check_func(h.idct_dc[i - 2], "hevc_idct_%dx%d_dc_%d", block_size, block_size, bit_depth)) {
- call_ref(coeffs0);
- call_new(coeffs1);
- if (memcmp(coeffs0, coeffs1, sizeof(*coeffs0) * size))
- fail();
- bench_new(coeffs1);
- }
- }
-}
-
-void checkasm_check_hevc_idct(void)
-{
- int bit_depth;
-
- for (bit_depth = 8; bit_depth <= 12; bit_depth += 2) {
- HEVCDSPContext h;
-
- ff_hevc_dsp_init(&h, bit_depth);
- check_idct_dc(h, bit_depth);
- }
- report("idct_dc");
-
- for (bit_depth = 8; bit_depth <= 12; bit_depth += 2) {
- HEVCDSPContext h;
-
- ff_hevc_dsp_init(&h, bit_depth);
- check_idct(h, bit_depth);
- }
- report("idct");
-}
diff --git a/tests/checkasm/jpeg2000dsp.c b/tests/checkasm/jpeg2000dsp.c
deleted file mode 100644
index bce534d..0000000
--- a/tests/checkasm/jpeg2000dsp.c
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (c) 2015 James Almer
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "checkasm.h"
-#include "libavcodec/jpeg2000dsp.h"
-#include "libavutil/common.h"
-#include "libavutil/internal.h"
-#include "libavutil/intreadwrite.h"
-
-#define BUF_SIZE 512
-
-#define randomize_buffers() \
- do { \
- int i; \
- for (i = 0; i < BUF_SIZE*3; i++) \
- src[i] = rnd(); \
- } while (0)
-
-#define randomize_buffers_float() \
- do { \
- int i; \
- for (i = 0; i < BUF_SIZE*3; i++) \
- src[i] = (float)rnd() / (UINT_MAX >> 5); \
- } while (0)
-
-static void check_rct_int(void)
-{
- LOCAL_ALIGNED_32(int32_t, src, [BUF_SIZE*3]);
- LOCAL_ALIGNED_32(int32_t, ref, [BUF_SIZE*3]);
- LOCAL_ALIGNED_32(int32_t, new, [BUF_SIZE*3]);
- int32_t *ref0 = &ref[BUF_SIZE*0], *new0 = &new[BUF_SIZE*0];
- int32_t *ref1 = &ref[BUF_SIZE*1], *new1 = &new[BUF_SIZE*1];
- int32_t *ref2 = &ref[BUF_SIZE*2], *new2 = &new[BUF_SIZE*2];
-
- declare_func(void, void *src0, void *src1, void *src2, int csize);
-
- randomize_buffers();
- memcpy(ref, src, BUF_SIZE * 3 * sizeof(*src));
- memcpy(new, src, BUF_SIZE * 3 * sizeof(*src));
- call_ref(ref0, ref1, ref2, BUF_SIZE);
- call_new(new0, new1, new2, BUF_SIZE);
- if (memcmp(ref0, new0, BUF_SIZE * sizeof(*src)) ||
- memcmp(ref1, new1, BUF_SIZE * sizeof(*src)) ||
- memcmp(ref2, new2, BUF_SIZE * sizeof(*src)))
- fail();
- memcpy(new, src, BUF_SIZE * 3 * sizeof(*src));
- bench_new(new0, new1, new2, BUF_SIZE);
-}
-
-static void check_ict_float(void)
-{
- LOCAL_ALIGNED_32(float, src, [BUF_SIZE*3]);
- LOCAL_ALIGNED_32(float, ref, [BUF_SIZE*3]);
- LOCAL_ALIGNED_32(float, new, [BUF_SIZE*3]);
- float *ref0 = &ref[BUF_SIZE*0], *new0 = &new[BUF_SIZE*0];
- float *ref1 = &ref[BUF_SIZE*1], *new1 = &new[BUF_SIZE*1];
- float *ref2 = &ref[BUF_SIZE*2], *new2 = &new[BUF_SIZE*2];
-
- declare_func(void, void *src0, void *src1, void *src2, int csize);
-
- randomize_buffers_float();
- memcpy(ref, src, BUF_SIZE * 3 * sizeof(*src));
- memcpy(new, src, BUF_SIZE * 3 * sizeof(*src));
- call_ref(ref0, ref1, ref2, BUF_SIZE);
- call_new(new0, new1, new2, BUF_SIZE);
- if (!float_near_abs_eps_array(ref0, new0, 1.0e-5, BUF_SIZE) ||
- !float_near_abs_eps_array(ref1, new1, 1.0e-5, BUF_SIZE) ||
- !float_near_abs_eps_array(ref2, new2, 1.0e-5, BUF_SIZE))
- fail();
- memcpy(new, src, BUF_SIZE * 3 * sizeof(*src));
- bench_new(new0, new1, new2, BUF_SIZE);
-}
-
-void checkasm_check_jpeg2000dsp(void)
-{
- Jpeg2000DSPContext h;
-
- ff_jpeg2000dsp_init(&h);
-
- if (check_func(h.mct_decode[FF_DWT53], "jpeg2000_rct_int"))
- check_rct_int();
- if (check_func(h.mct_decode[FF_DWT97], "jpeg2000_ict_float"))
- check_ict_float();
-
- report("mct_decode");
-}
diff --git a/tests/checkasm/llviddsp.c b/tests/checkasm/llviddsp.c
deleted file mode 100644
index 4f75ffc..0000000
--- a/tests/checkasm/llviddsp.c
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * Copyright (c) 2016 Alexandra Hájková
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include <string.h>
-
-#include "libavutil/common.h"
-#include "libavutil/intreadwrite.h"
-#include "libavutil/mem.h"
-
-#include "libavcodec/lossless_videodsp.h"
-
-#include "checkasm.h"
-
-#define randomize_buffers(buf, size) \
- do { \
- int j; \
- uint8_t *tmp_buf = (uint8_t *)buf;\
- for (j = 0; j < size; j++) \
- tmp_buf[j] = rnd() & 0xFF; \
- } while (0)
-
-#define init_buffer(a0, a1, type, width)\
- if (!a0 || !a1)\
- fail();\
- randomize_buffers(a0, width * sizeof(type));\
- memcpy(a1, a0, width*sizeof(type));\
-
-static void check_add_bytes(LLVidDSPContext c, int width)
-{
- uint8_t *dst0 = av_mallocz(width);
- uint8_t *dst1 = av_mallocz(width);
- uint8_t *src0 = av_mallocz_array(width, sizeof(uint8_t));
- uint8_t *src1 = av_mallocz_array(width, sizeof(uint8_t));
- declare_func_emms(AV_CPU_FLAG_MMX, void, uint8_t *dst, uint8_t *src, ptrdiff_t w);
-
- init_buffer(src0, src1, uint8_t, width);
-
- if (!dst0 || !dst1)
- fail();
-
-
- if (check_func(c.add_bytes, "add_bytes")) {
- call_ref(dst0, src0, width);
- call_new(dst1, src1, width);
- if (memcmp(dst0, dst1, width))
- fail();
- bench_new(dst1, src1, width);
- }
-
- av_free(src0);
- av_free(src1);
- av_free(dst0);
- av_free(dst1);
-}
-
-static void check_add_median_pred(LLVidDSPContext c, int width) {
- int A0, A1, B0, B1;
- uint8_t *dst0 = av_mallocz(width);
- uint8_t *dst1 = av_mallocz(width);
- uint8_t *src0 = av_mallocz_array(width, sizeof(uint8_t));
- uint8_t *src1 = av_mallocz_array(width, sizeof(uint8_t));
- uint8_t *diff0 = av_mallocz_array(width, sizeof(uint8_t));
- uint8_t *diff1 = av_mallocz_array(width, sizeof(uint8_t));
- declare_func_emms(AV_CPU_FLAG_MMX, void, uint8_t *dst, const uint8_t *src1,
- const uint8_t *diff, ptrdiff_t w,
- int *left, int *left_top);
-
- init_buffer(src0, src1, uint8_t, width);
- init_buffer(diff0, diff1, uint8_t, width);
-
- A0 = rnd() & 0xFF;
- B0 = rnd() & 0xFF;
- A1 = A0;
- B1 = B0;
-
-
- if (check_func(c.add_median_pred, "add_median_pred")) {
- call_ref(dst0, src0, diff0, width, &A0, &B0);
- call_new(dst1, src1, diff1, width, &A1, &B1);
- if (memcmp(dst0, dst1, width) || (A0 != A1) || (B0 != B1))
- fail();
- bench_new(dst1, src1, diff1, width, &A1, &B1);
- }
-
- av_free(src0);
- av_free(src1);
- av_free(diff0);
- av_free(diff1);
- av_free(dst0);
- av_free(dst1);
-}
-
-static void check_add_left_pred(LLVidDSPContext c, int width, int acc, const char * report)
-{
- int res0, res1;
- uint8_t *dst0 = av_mallocz(width);
- uint8_t *dst1 = av_mallocz(width);
- uint8_t *src0 = av_mallocz_array(width, sizeof(uint8_t));
- uint8_t *src1 = av_mallocz_array(width, sizeof(uint8_t));
- declare_func_emms(AV_CPU_FLAG_MMX, int, uint8_t *dst, uint8_t *src, ptrdiff_t w, int acc);
-
- init_buffer(src0, src1, uint8_t, width);
-
- if (!dst0 || !dst1)
- fail();
-
- if (check_func(c.add_left_pred, "%s", report)) {
- res0 = call_ref(dst0, src0, width, acc);
- res1 = call_new(dst1, src1, width, acc);
- if ((res0 & 0xFF) != (res1 & 0xFF)||\
- memcmp(dst0, dst1, width))
- fail();
- bench_new(dst1, src1, width, acc);
- }
-
- av_free(src0);
- av_free(src1);
- av_free(dst0);
- av_free(dst1);
-}
-
-static void check_add_left_pred_16(LLVidDSPContext c, unsigned mask, int width, unsigned acc, const char * report)
-{
- int res0, res1;
- uint16_t *dst0 = av_mallocz_array(width, sizeof(uint16_t));
- uint16_t *dst1 = av_mallocz_array(width, sizeof(uint16_t));
- uint16_t *src0 = av_mallocz_array(width, sizeof(uint16_t));
- uint16_t *src1 = av_mallocz_array(width, sizeof(uint16_t));
- declare_func_emms(AV_CPU_FLAG_MMX, int, uint16_t *dst, uint16_t *src, unsigned mask, ptrdiff_t w, unsigned acc);
-
- init_buffer(src0, src1, uint16_t, width);
-
- if (!dst0 || !dst1)
- fail();
-
- if (check_func(c.add_left_pred_int16, "%s", report)) {
- res0 = call_ref(dst0, src0, mask, width, acc);
- res1 = call_new(dst1, src1, mask, width, acc);
- if ((res0 &0xFFFF) != (res1 &0xFFFF)||\
- memcmp(dst0, dst1, width))
- fail();
- bench_new(dst1, src1, mask, width, acc);
- }
-
- av_free(src0);
- av_free(src1);
- av_free(dst0);
- av_free(dst1);
-}
-
-static void check_add_gradient_pred(LLVidDSPContext c, int w) {
- int src_size, stride;
- uint8_t *src0, *src1;
- declare_func_emms(AV_CPU_FLAG_MMX, void, uint8_t *src, const ptrdiff_t stride,
- const ptrdiff_t width);
-
- stride = w + 32;
- src_size = (stride + 32) * 2; /* dsp need previous line, and ignore the start of the line */
- src0 = av_mallocz(src_size);
- src1 = av_mallocz(src_size);
-
- init_buffer(src0, src1, uint8_t, src_size);
-
- if (check_func(c.add_gradient_pred, "add_gradient_pred")) {
- call_ref(src0 + stride + 32, stride, w);
- call_new(src1 + stride + 32, stride, w);
- if (memcmp(src0, src1, stride)||/* previous line doesn't change */
- memcmp(src0+stride, src1 + stride, w + 32)) {
- fail();
- }
- bench_new(src1 + stride + 32, stride, w);
- }
-
- av_free(src0);
- av_free(src1);
-}
-
-void checkasm_check_llviddsp(void)
-{
- LLVidDSPContext c;
- int width = 16 * av_clip(rnd(), 16, 128);
- int accRnd = rnd() & 0xFF;
-
- ff_llviddsp_init(&c);
-
- check_add_bytes(c, width);
- report("add_bytes");
-
- check_add_median_pred(c, width);
- report("add_median_pred");
-
- check_add_left_pred(c, width, 0, "add_left_pred_zero");
- report("add_left_pred_zero");
-
- check_add_left_pred(c, width, accRnd, "add_left_pred_rnd_acc");
- report("add_left_pred_rnd_acc");
-
- check_add_left_pred_16(c, 255, width, accRnd, "add_left_pred_int16");
- report("add_left_pred_int16");
-
- check_add_gradient_pred(c, width);
- report("add_gradient_pred");
-}
diff --git a/tests/checkasm/pixblockdsp.c b/tests/checkasm/pixblockdsp.c
deleted file mode 100644
index e14b0a9..0000000
--- a/tests/checkasm/pixblockdsp.c
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright (c) 2015 Tiancheng "Timothy" Gu
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include <string.h>
-#include "checkasm.h"
-#include "libavcodec/pixblockdsp.h"
-#include "libavutil/common.h"
-#include "libavutil/internal.h"
-#include "libavutil/intreadwrite.h"
-
-#define BUF_UNITS 8
-#define BUF_SIZE (BUF_UNITS * 128 + 8 * BUF_UNITS)
-
-#define randomize_buffers() \
- do { \
- int i; \
- for (i = 0; i < BUF_SIZE; i += 4) { \
- uint32_t r = rnd(); \
- AV_WN32A(src10 + i, r); \
- AV_WN32A(src11 + i, r); \
- r = rnd(); \
- AV_WN32A(src20 + i, r); \
- AV_WN32A(src21 + i, r); \
- r = rnd(); \
- AV_WN32A(dst0_ + i, r); \
- AV_WN32A(dst1_ + i, r); \
- } \
- } while (0)
-
-#define check_get_pixels(type) \
- do { \
- int i; \
- declare_func_emms(AV_CPU_FLAG_MMX, void, int16_t *block, const uint8_t *pixels, ptrdiff_t line_size); \
- \
- for (i = 0; i < BUF_UNITS; i++) { \
- int src_offset = i * 64 * sizeof(type) + 8 * i; /* Test various alignments */ \
- int dst_offset = i * 64; /* dst must be aligned */ \
- randomize_buffers(); \
- call_ref(dst0 + dst_offset, src10 + src_offset, 8); \
- call_new(dst1 + dst_offset, src11 + src_offset, 8); \
- if (memcmp(src10, src11, BUF_SIZE)|| memcmp(dst0, dst1, BUF_SIZE)) \
- fail(); \
- bench_new(dst1 + dst_offset, src11 + src_offset, 8); \
- } \
- } while (0)
-
-#define check_diff_pixels(type) \
- do { \
- int i; \
- declare_func_emms(AV_CPU_FLAG_MMX, void, int16_t *av_restrict block, const uint8_t *s1, const uint8_t *s2, ptrdiff_t stride); \
- \
- for (i = 0; i < BUF_UNITS; i++) { \
- int src_offset = i * 64 * sizeof(type) + 8 * i; /* Test various alignments */ \
- int dst_offset = i * 64; /* dst must be aligned */ \
- randomize_buffers(); \
- call_ref(dst0 + dst_offset, src10 + src_offset, src20 + src_offset, 8); \
- call_new(dst1 + dst_offset, src11 + src_offset, src21 + src_offset, 8); \
- if (memcmp(src10, src11, BUF_SIZE) || memcmp(src20, src21, BUF_SIZE) || memcmp(dst0, dst1, BUF_SIZE)) \
- fail(); \
- bench_new(dst1 + dst_offset, src11 + src_offset, src21 + src_offset, 8); \
- } \
- } while (0)
-
-void checkasm_check_pixblockdsp(void)
-{
- LOCAL_ALIGNED_16(uint8_t, src10, [BUF_SIZE]);
- LOCAL_ALIGNED_16(uint8_t, src11, [BUF_SIZE]);
- LOCAL_ALIGNED_16(uint8_t, src20, [BUF_SIZE]);
- LOCAL_ALIGNED_16(uint8_t, src21, [BUF_SIZE]);
- LOCAL_ALIGNED_16(uint8_t, dst0_, [BUF_SIZE]);
- LOCAL_ALIGNED_16(uint8_t, dst1_, [BUF_SIZE]);
- uint16_t *dst0 = (uint16_t *)dst0_;
- uint16_t *dst1 = (uint16_t *)dst1_;
- PixblockDSPContext h;
- AVCodecContext avctx = {
- .bits_per_raw_sample = 8,
- };
-
- ff_pixblockdsp_init(&h, &avctx);
-
- if (check_func(h.get_pixels, "get_pixels"))
- check_get_pixels(uint8_t);
-
- report("get_pixels");
-
- if (check_func(h.diff_pixels, "diff_pixels"))
- check_diff_pixels(uint8_t);
-
- report("diff_pixels");
-}
diff --git a/tests/checkasm/sbrdsp.c b/tests/checkasm/sbrdsp.c
deleted file mode 100644
index 516b9f0..0000000
--- a/tests/checkasm/sbrdsp.c
+++ /dev/null
@@ -1,300 +0,0 @@
-/*
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "libavcodec/sbrdsp.h"
-#include <float.h>
-
-#include "checkasm.h"
-
-#define randomize(buf, len) do { \
- int i; \
- for (i = 0; i < len; i++) { \
- const INTFLOAT f = (INTFLOAT)rnd() / UINT_MAX; \
- (buf)[i] = f; \
- } \
-} while (0)
-
-#define EPS 0.0001
-
-static void test_sum64x5(void)
-{
- LOCAL_ALIGNED_16(INTFLOAT, dst0, [64 + 256]);
- LOCAL_ALIGNED_16(INTFLOAT, dst1, [64 + 256]);
-
- declare_func(void, INTFLOAT *z);
-
- randomize((INTFLOAT *)dst0, 64 + 256);
- memcpy(dst1, dst0, (64 + 256) * sizeof(INTFLOAT));
- call_ref(dst0);
- call_new(dst1);
- if (!float_near_abs_eps_array(dst0, dst1, EPS, 64 + 256))
- fail();
- bench_new(dst1);
-}
-
-static void test_sum_square(void)
-{
- INTFLOAT res0;
- INTFLOAT res1;
- LOCAL_ALIGNED_16(INTFLOAT, src, [256], [2]);
- double t = 4 * 256;
-
- declare_func_float(INTFLOAT, INTFLOAT (*x)[2], int n);
-
- randomize((INTFLOAT *)src, 256 * 2);
- res0 = call_ref(src, 256);
- res1 = call_new(src, 256);
- if (!float_near_abs_eps(res0, res1, t * 2 * FLT_EPSILON))
- fail();
- bench_new(src, 256);
-}
-
-static void test_neg_odd_64(void)
-{
- LOCAL_ALIGNED_16(INTFLOAT, dst0, [64]);
- LOCAL_ALIGNED_16(INTFLOAT, dst1, [64]);
-
- declare_func(void, INTFLOAT *x);
-
- randomize((INTFLOAT *)dst0, 64);
- memcpy(dst1, dst0, (64) * sizeof(INTFLOAT));
- call_ref(dst0);
- call_new(dst1);
- if (!float_near_abs_eps_array(dst0, dst1, EPS, 64))
- fail();
- bench_new(dst1);
-}
-
-static void test_qmf_pre_shuffle(void)
-{
- LOCAL_ALIGNED_16(INTFLOAT, dst0, [128]);
- LOCAL_ALIGNED_16(INTFLOAT, dst1, [128]);
-
- declare_func(void, INTFLOAT *z);
-
- randomize((INTFLOAT *)dst0, 128);
- memcpy(dst1, dst0, (128) * sizeof(INTFLOAT));
- call_ref(dst0);
- call_new(dst1);
- if (!float_near_abs_eps_array(dst0, dst1, EPS, 128))
- fail();
- bench_new(dst1);
-}
-
-static void test_qmf_post_shuffle(void)
-{
- LOCAL_ALIGNED_16(INTFLOAT, src, [64]);
- LOCAL_ALIGNED_16(INTFLOAT, dst0, [32], [2]);
- LOCAL_ALIGNED_16(INTFLOAT, dst1, [32], [2]);
-
- declare_func(void, INTFLOAT W[32][2], const INTFLOAT *z);
-
- randomize((INTFLOAT *)src, 64);
- call_ref(dst0, src);
- call_new(dst1, src);
- if (!float_near_abs_eps_array((INTFLOAT *)dst0, (INTFLOAT *)dst1, EPS, 64))
- fail();
- bench_new(dst1, src);
-}
-
-static void test_qmf_deint_neg(void)
-{
- LOCAL_ALIGNED_16(INTFLOAT, src, [64]);
- LOCAL_ALIGNED_16(INTFLOAT, dst0, [64]);
- LOCAL_ALIGNED_16(INTFLOAT, dst1, [64]);
-
- declare_func(void, INTFLOAT *v, const INTFLOAT *src);
-
- randomize((INTFLOAT *)src, 64);
- call_ref(dst0, src);
- call_new(dst1, src);
- if (!float_near_abs_eps_array(dst0, dst1, EPS, 64))
- fail();
- bench_new(dst1, src);
-}
-
-static void test_qmf_deint_bfly(void)
-{
- LOCAL_ALIGNED_16(INTFLOAT, src0, [64]);
- LOCAL_ALIGNED_16(INTFLOAT, src1, [64]);
- LOCAL_ALIGNED_16(INTFLOAT, dst0, [128]);
- LOCAL_ALIGNED_16(INTFLOAT, dst1, [128]);
-
- declare_func(void, INTFLOAT *v, const INTFLOAT *src0, const INTFLOAT *src1);
-
- memset(dst0, 0, 128 * sizeof(INTFLOAT));
- memset(dst1, 0, 128 * sizeof(INTFLOAT));
-
- randomize((INTFLOAT *)src0, 64);
- randomize((INTFLOAT *)src1, 64);
- call_ref(dst0, src0, src1);
- call_new(dst1, src0, src1);
- if (!float_near_abs_eps_array(dst0, dst1, EPS, 128))
- fail();
- bench_new(dst1, src0, src1);
-}
-
-static void test_autocorrelate(void)
-{
- LOCAL_ALIGNED_16(INTFLOAT, src, [40], [2]);
- LOCAL_ALIGNED_16(INTFLOAT, dst0, [3], [2][2]);
- LOCAL_ALIGNED_16(INTFLOAT, dst1, [3], [2][2]);
-
- declare_func(void, const INTFLOAT x[40][2], INTFLOAT phi[3][2][2]);
-
- memset(dst0, 0, 3 * 2 * 2 * sizeof(INTFLOAT));
- memset(dst1, 0, 3 * 2 * 2 * sizeof(INTFLOAT));
-
- randomize((INTFLOAT *)src, 80);
- call_ref(src, dst0);
- call_new(src, dst1);
- if (!float_near_abs_eps_array((INTFLOAT *)dst0, (INTFLOAT *)dst1, EPS, 3 * 2 * 2))
- fail();
- bench_new(src, dst1);
-}
-
-static void test_hf_gen(void)
-{
- LOCAL_ALIGNED_16(INTFLOAT, low, [128], [2]);
- LOCAL_ALIGNED_16(INTFLOAT, alpha0, [2]);
- LOCAL_ALIGNED_16(INTFLOAT, alpha1, [2]);
- LOCAL_ALIGNED_16(INTFLOAT, dst0, [128], [2]);
- LOCAL_ALIGNED_16(INTFLOAT, dst1, [128], [2]);
- INTFLOAT bw = (INTFLOAT)rnd() / UINT_MAX;
- int i;
-
- declare_func(void, INTFLOAT (*X_high)[2], const INTFLOAT (*X_low)[2],
- const INTFLOAT alpha0[2], const INTFLOAT alpha1[2],
- INTFLOAT bw, int start, int end);
-
- randomize((INTFLOAT *)low, 128 * 2);
- randomize((INTFLOAT *)alpha0, 2);
- randomize((INTFLOAT *)alpha1, 2);
- for (i = 2; i < 64; i += 2) {
- memset(dst0, 0, 128 * 2 * sizeof(INTFLOAT));
- memset(dst1, 0, 128 * 2 * sizeof(INTFLOAT));
- call_ref(dst0, low, alpha0, alpha1, 0.0, i, 128);
- call_new(dst1, low, alpha0, alpha1, 0.0, i, 128);
- if (!float_near_abs_eps_array((INTFLOAT *)dst0, (INTFLOAT *)dst1, EPS, 128 * 2))
- fail();
- bench_new(dst1, low, alpha0, alpha1, bw, i, 128);
- }
-}
-
-static void test_hf_g_filt(void)
-{
- LOCAL_ALIGNED_16(INTFLOAT, high, [128], [40][2]);
- LOCAL_ALIGNED_16(INTFLOAT, g_filt, [128]);
- LOCAL_ALIGNED_16(INTFLOAT, dst0, [128], [2]);
- LOCAL_ALIGNED_16(INTFLOAT, dst1, [128], [2]);
-
- declare_func(void, INTFLOAT (*Y)[2], const INTFLOAT (*X_high)[40][2],
- const INTFLOAT *g_filt, int m_max, intptr_t ixh);
-
- randomize((INTFLOAT *)high, 128 * 40 * 2);
- randomize((INTFLOAT *)g_filt, 128);
-
- call_ref(dst0, high, g_filt, 128, 20);
- call_new(dst1, high, g_filt, 128, 20);
- if (!float_near_abs_eps_array((INTFLOAT *)dst0, (INTFLOAT *)dst1, EPS, 128 * 2))
- fail();
- bench_new(dst1, high, g_filt, 128, 20);
-}
-
-static void test_hf_apply_noise(const SBRDSPContext *sbrdsp)
-{
- LOCAL_ALIGNED_16(AAC_FLOAT, s_m, [128]);
- LOCAL_ALIGNED_16(AAC_FLOAT, q_filt, [128]);
- LOCAL_ALIGNED_16(INTFLOAT, ref, [128], [2]);
- LOCAL_ALIGNED_16(INTFLOAT, dst0, [128], [2]);
- LOCAL_ALIGNED_16(INTFLOAT, dst1, [128], [2]);
- int noise = 0x2a;
- int i, j;
-
- declare_func(void, INTFLOAT (*Y)[2], const AAC_FLOAT *s_m,
- const AAC_FLOAT *q_filt, int noise,
- int kx, int m_max);
-
- randomize((INTFLOAT *)ref, 128 * 2);
- randomize((INTFLOAT *)s_m, 128);
- randomize((INTFLOAT *)q_filt, 128);
-
- for (i = 0; i < 4; i++) {
- if (check_func(sbrdsp->hf_apply_noise[i], "hf_apply_noise_%d", i)) {
- for (j = 0; j < 2; j++) {
- memcpy(dst0, ref, 128 * 2 * sizeof(INTFLOAT));
- memcpy(dst1, ref, 128 * 2 * sizeof(INTFLOAT));
- call_ref(dst0, s_m, q_filt, noise, j, 128);
- call_new(dst1, s_m, q_filt, noise, j, 128);
- if (!float_near_abs_eps_array((INTFLOAT *)dst0, (INTFLOAT *)dst1, EPS, 128 * 2))
- fail();
- bench_new(dst1, s_m, q_filt, noise, j, 128);
- }
- }
- }
-}
-
-void checkasm_check_sbrdsp(void)
-{
- SBRDSPContext sbrdsp;
-
- ff_sbrdsp_init(&sbrdsp);
-
- if (check_func(sbrdsp.sum64x5, "sum64x5"))
- test_sum64x5();
- report("sum64x5");
-
- if (check_func(sbrdsp.sum_square, "sum_square"))
- test_sum_square();
- report("sum_square");
-
- if (check_func(sbrdsp.neg_odd_64, "neg_odd_64"))
- test_neg_odd_64();
- report("neg_odd_64");
-
- if (check_func(sbrdsp.qmf_pre_shuffle, "qmf_pre_shuffle"))
- test_qmf_pre_shuffle();
- report("qmf_pre_shuffle");
-
- if (check_func(sbrdsp.qmf_post_shuffle, "qmf_post_shuffle"))
- test_qmf_post_shuffle();
- report("qmf_post_shuffle");
-
- if (check_func(sbrdsp.qmf_deint_neg, "qmf_deint_neg"))
- test_qmf_deint_neg();
- report("qmf_deint_neg");
-
- if (check_func(sbrdsp.qmf_deint_bfly, "qmf_deint_bfly"))
- test_qmf_deint_bfly();
- report("qmf_deint_bfly");
-
- if (check_func(sbrdsp.autocorrelate, "autocorrelate"))
- test_autocorrelate();
- report("autocorrelate");
-
- if (check_func(sbrdsp.hf_gen, "hf_gen"))
- test_hf_gen();
- report("hf_gen");
-
- if (check_func(sbrdsp.hf_g_filt, "hf_g_filt"))
- test_hf_g_filt();
- report("hf_g_filt");
-
- test_hf_apply_noise(&sbrdsp);
- report("hf_apply_noise");
-}
diff --git a/tests/checkasm/synth_filter.c b/tests/checkasm/synth_filter.c
deleted file mode 100644
index 87e32eb..0000000
--- a/tests/checkasm/synth_filter.c
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (c) 2015 Janne Grunau
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include <math.h>
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "libavutil/internal.h"
-#include "libavutil/intfloat.h"
-#include "libavcodec/dcadata.h"
-#include "libavcodec/synth_filter.h"
-
-#include "checkasm.h"
-
-#define BUF_SIZE 32
-
-#define randomize_input() \
- do { \
- int i; \
- for (i = 0; i < BUF_SIZE; i++) { \
- float f = (float)rnd() / (UINT_MAX >> 5) - 16.0f; \
- in[i] = f; \
- } \
- } while (0)
-
-void checkasm_check_synth_filter(void)
-{
- FFTContext imdct;
- SynthFilterContext synth;
-
- ff_mdct_init(&imdct, 6, 1, 1.0);
- ff_synth_filter_init(&synth);
-
- if (check_func(synth.synth_filter_float, "synth_filter_float")) {
- LOCAL_ALIGNED(32, float, out0, [BUF_SIZE]);
- LOCAL_ALIGNED(32, float, out1, [BUF_SIZE]);
- LOCAL_ALIGNED(32, float, out_b, [BUF_SIZE]);
- LOCAL_ALIGNED(32, float, in, [BUF_SIZE]);
- LOCAL_ALIGNED(32, float, buf2_0, [BUF_SIZE]);
- LOCAL_ALIGNED(32, float, buf2_1, [BUF_SIZE]);
- LOCAL_ALIGNED(32, float, buf2_b, [BUF_SIZE]);
- LOCAL_ALIGNED(32, float, buf0, [512]);
- LOCAL_ALIGNED(32, float, buf1, [512]);
- LOCAL_ALIGNED(32, float, buf_b, [512]);
- float scale = 1.0f;
- int i, offset0 = 0, offset1 = 0, offset_b = 0;
-
- declare_func(void, FFTContext *, float *, int *, float[32], const float[512],
- float[32], float[32], float);
-
- memset(buf2_0, 0, sizeof(*buf2_0) * BUF_SIZE);
- memset(buf2_1, 0, sizeof(*buf2_1) * BUF_SIZE);
- memset(buf2_b, 0, sizeof(*buf2_b) * BUF_SIZE);
- memset(buf0, 0, sizeof(*buf2_0) * 512);
- memset(buf1, 0, sizeof(*buf2_1) * 512);
- memset(buf_b, 0, sizeof(*buf2_b) * 512);
-
- /* more than 1 synth_buf_offset wrap-around */
- for (i = 0; i < 20; i++) {
- int j;
- const float * window = (i & 1) ? ff_dca_fir_32bands_perfect : ff_dca_fir_32bands_nonperfect;
-
- memset(out0, 0, sizeof(*out0) * BUF_SIZE);
- memset(out1, 0, sizeof(*out1) * BUF_SIZE);
- memset(out_b, 0, sizeof(*out_b) * BUF_SIZE);
-
- randomize_input();
-
- call_ref(&imdct, buf0, &offset0, buf2_0, window,
- out0, in, scale);
- call_new(&imdct, buf1, &offset1, buf2_1, window,
- out1, in, scale);
-
- if (offset0 != offset1) {
- fail();
- fprintf(stderr, "offsets do not match: %d, %d", offset0, offset1);
- break;
- }
-
- for (j = 0; j < BUF_SIZE; j++) {
- if (!float_near_abs_eps_ulp(out0[j], out1[j], 7.0e-7, 16) ||
- !float_near_abs_eps_ulp(buf2_0[j], buf2_1[j], 7.0e-7, 16)) {
- union av_intfloat32 o0, o1, b0, b1;
-
- fail();
- o0.f = out0[j]; o1.f = out1[j];
- b0.f = buf2_0[j], b1.f = buf2_1[j];
- fprintf(stderr, "out: %11g (0x%08x); %11g (0x%08x); abs diff %11g\n",
- o0.f, o0.i, o1.f, o1.i, fabsf(o0.f - o1.f));
- fprintf(stderr, "buf2: %11g (0x%08x); %11g (0x%08x); abs diff %11g\n",
- b0.f, b0.i, b1.f, b1.i, fabsf(b0.f - b1.f));
- break;
- }
- }
-
- bench_new(&imdct, buf_b, &offset_b, buf2_b, window,
- out_b, in, scale);
- }
- }
- ff_mdct_end(&imdct);
-
- report("synth_filter");
-}
diff --git a/tests/checkasm/v210enc.c b/tests/checkasm/v210enc.c
deleted file mode 100644
index ed36776..0000000
--- a/tests/checkasm/v210enc.c
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (c) 2015 Henrik Gramner
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include <string.h>
-#include "checkasm.h"
-#include "libavcodec/v210enc.h"
-#include "libavutil/common.h"
-#include "libavutil/internal.h"
-#include "libavutil/intreadwrite.h"
-
-#define BUF_SIZE 512
-
-#define randomize_buffers(mask) \
- do { \
- int i, size = sizeof(*y0); \
- for (i = 0; i < BUF_SIZE; i += 4 / size) { \
- uint32_t r = rnd() & mask; \
- AV_WN32A(y0 + i, r); \
- AV_WN32A(y1 + i, r); \
- } \
- for (i = 0; i < BUF_SIZE / 2; i += 4 / size) { \
- uint32_t r = rnd() & mask; \
- AV_WN32A(u0 + i, r); \
- AV_WN32A(u1 + i, r); \
- r = rnd() & mask; \
- AV_WN32A(v0 + i, r); \
- AV_WN32A(v1 + i, r); \
- } \
- for (i = 0; i < width * 8 / 3; i += 4) { \
- uint32_t r = rnd(); \
- AV_WN32A(dst0 + i, r); \
- AV_WN32A(dst1 + i, r); \
- } \
- } while (0)
-
-#define check_pack_line(type, mask) \
- do { \
- LOCAL_ALIGNED_16(type, y0, [BUF_SIZE]); \
- LOCAL_ALIGNED_16(type, y1, [BUF_SIZE]); \
- LOCAL_ALIGNED_16(type, u0, [BUF_SIZE / 2]); \
- LOCAL_ALIGNED_16(type, u1, [BUF_SIZE / 2]); \
- LOCAL_ALIGNED_16(type, v0, [BUF_SIZE / 2]); \
- LOCAL_ALIGNED_16(type, v1, [BUF_SIZE / 2]); \
- LOCAL_ALIGNED_16(uint8_t, dst0, [BUF_SIZE * 8 / 3]); \
- LOCAL_ALIGNED_16(uint8_t, dst1, [BUF_SIZE * 8 / 3]); \
- \
- declare_func(void, const type * y, const type * u, const type * v, \
- uint8_t * dst, ptrdiff_t width); \
- ptrdiff_t width, step = 12 / sizeof(type); \
- \
- for (width = step; width < BUF_SIZE - 15; width += step) { \
- int y_offset = rnd() & 15; \
- int uv_offset = y_offset / 2; \
- randomize_buffers(mask); \
- call_ref(y0 + y_offset, u0 + uv_offset, v0 + uv_offset, dst0, width); \
- call_new(y1 + y_offset, u1 + uv_offset, v1 + uv_offset, dst1, width); \
- if (memcmp(y0, y1, BUF_SIZE) || memcmp(u0, u1, BUF_SIZE / 2) || \
- memcmp(v0, v1, BUF_SIZE / 2) || memcmp(dst0, dst1, width * 8 / 3)) \
- fail(); \
- bench_new(y1 + y_offset, u1 + uv_offset, v1 + uv_offset, dst1, width); \
- } \
- } while (0)
-
-void checkasm_check_v210enc(void)
-{
- V210EncContext h;
-
- ff_v210enc_init(&h);
-
- if (check_func(h.pack_line_8, "v210_planar_pack_8"))
- check_pack_line(uint8_t, 0xffffffff);
-
- if (check_func(h.pack_line_10, "v210_planar_pack_10"))
- check_pack_line(uint16_t, 0x03ff03ff);
-
- report("planar_pack");
-}
diff --git a/tests/checkasm/vf_blend.c b/tests/checkasm/vf_blend.c
deleted file mode 100644
index a7578fe..0000000
--- a/tests/checkasm/vf_blend.c
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Copyright (c) 2016 Tiancheng "Timothy" Gu
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include <string.h>
-#include "checkasm.h"
-#include "libavfilter/blend.h"
-#include "libavutil/common.h"
-#include "libavutil/internal.h"
-#include "libavutil/intreadwrite.h"
-
-#define WIDTH 256
-#define HEIGHT 256
-#define BUF_UNITS 3
-#define SIZE_PER_UNIT (WIDTH * HEIGHT)
-#define BUF_SIZE (BUF_UNITS * SIZE_PER_UNIT)
-
-#define randomize_buffers() \
- do { \
- int i, j; \
- for (i = 0; i < HEIGHT; i++) { \
- for (j = 0; j < WIDTH; j++) { \
- top1[i * WIDTH + j] = \
- top2[i * WIDTH + j] = i; \
- bot1[i * WIDTH + j] = \
- bot2[i * WIDTH + j] = j; \
- } \
- } \
- for (i = 0; i < SIZE_PER_UNIT; i += 4) { \
- uint32_t r = rnd(); \
- AV_WN32A(dst1 + i, r); \
- AV_WN32A(dst2 + i, r); \
- } \
- for (; i < BUF_SIZE; i += 4) { \
- uint32_t r = rnd(); \
- AV_WN32A(top1 + i, r); \
- AV_WN32A(top2 + i, r); \
- r = rnd(); \
- AV_WN32A(bot1 + i, r); \
- AV_WN32A(bot2 + i, r); \
- r = rnd(); \
- AV_WN32A(dst1 + i, r); \
- AV_WN32A(dst2 + i, r); \
- } \
- } while (0)
-
-#define check_blend_func(depth) \
- do { \
- int i, w; \
- declare_func(void, const uint8_t *top, ptrdiff_t top_linesize, \
- const uint8_t *bottom, ptrdiff_t bottom_linesize, \
- uint8_t *dst, ptrdiff_t dst_linesize, \
- ptrdiff_t width, ptrdiff_t height, \
- struct FilterParams *param, double *values); \
- w = WIDTH / depth; \
- \
- for (i = 0; i < BUF_UNITS - 1; i++) { \
- int src_offset = i * SIZE_PER_UNIT + (BUF_UNITS - 1 - i) * depth; /* Test various alignments */ \
- int dst_offset = i * SIZE_PER_UNIT; /* dst must be aligned */ \
- randomize_buffers(); \
- call_ref(top1 + src_offset, w, bot1 + src_offset, w, \
- dst1 + dst_offset, w, w, HEIGHT, ¶m, NULL); \
- call_new(top2 + src_offset, w, bot2 + src_offset, w, \
- dst2 + dst_offset, w, w, HEIGHT, ¶m, NULL); \
- if (memcmp(top1, top2, BUF_SIZE) || memcmp(bot1, bot2, BUF_SIZE) || memcmp(dst1, dst2, BUF_SIZE)) \
- fail(); \
- } \
- bench_new(top2, w / 4, bot2, w / 4, dst2, w / 4, \
- w / 4, HEIGHT / 4, ¶m, NULL); \
- } while (0)
-
-void checkasm_check_blend(void)
-{
- uint8_t *top1 = av_malloc(BUF_SIZE);
- uint8_t *top2 = av_malloc(BUF_SIZE);
- uint8_t *bot1 = av_malloc(BUF_SIZE);
- uint8_t *bot2 = av_malloc(BUF_SIZE);
- uint8_t *dst1 = av_malloc(BUF_SIZE);
- uint8_t *dst2 = av_malloc(BUF_SIZE);
- FilterParams param = {
- .opacity = 1.0,
- };
-
-#define check_and_report(name, val, depth) \
- param.mode = val; \
- ff_blend_init(¶m, depth - 1); \
- if (check_func(param.blend, #name)) \
- check_blend_func(depth);
-
- check_and_report(addition, BLEND_ADDITION, 1)
- check_and_report(grainmerge, BLEND_GRAINMERGE, 1)
- check_and_report(and, BLEND_AND, 1)
- check_and_report(average, BLEND_AVERAGE, 1)
- check_and_report(darken, BLEND_DARKEN, 1)
- check_and_report(grainextract, BLEND_GRAINEXTRACT, 1)
- check_and_report(hardmix, BLEND_HARDMIX, 1)
- check_and_report(lighten, BLEND_LIGHTEN, 1)
- check_and_report(multiply, BLEND_MULTIPLY, 1)
- check_and_report(or, BLEND_OR, 1)
- check_and_report(phoenix, BLEND_PHOENIX, 1)
- check_and_report(screen, BLEND_SCREEN, 1)
- check_and_report(subtract, BLEND_SUBTRACT, 1)
- check_and_report(xor, BLEND_XOR, 1)
- check_and_report(difference, BLEND_DIFFERENCE, 1)
- check_and_report(extremity, BLEND_EXTREMITY, 1)
- check_and_report(negation, BLEND_NEGATION, 1)
-
- report("8bit");
-
- check_and_report(addition_16, BLEND_ADDITION, 2)
- check_and_report(grainmerge_16, BLEND_GRAINMERGE, 2)
- check_and_report(and_16, BLEND_AND, 2)
- check_and_report(average_16, BLEND_AVERAGE, 2)
- check_and_report(darken_16, BLEND_DARKEN, 2)
- check_and_report(grainextract_16, BLEND_GRAINEXTRACT, 2)
- check_and_report(difference_16, BLEND_DIFFERENCE, 2)
- check_and_report(extremity_16, BLEND_EXTREMITY, 2)
- check_and_report(negation_16, BLEND_NEGATION, 2)
- check_and_report(lighten_16, BLEND_LIGHTEN, 2)
- check_and_report(or_16, BLEND_OR, 2)
- check_and_report(phoenix_16, BLEND_PHOENIX, 2)
- check_and_report(subtract_16, BLEND_SUBTRACT, 2)
- check_and_report(xor_16, BLEND_SUBTRACT, 2)
-
- report("16bit");
-
- av_freep(&top1);
- av_freep(&top2);
- av_freep(&bot1);
- av_freep(&bot2);
- av_freep(&dst1);
- av_freep(&dst2);
-}
diff --git a/tests/checkasm/videodsp.c b/tests/checkasm/videodsp.c
deleted file mode 100644
index 0a4424a..0000000
--- a/tests/checkasm/videodsp.c
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (c) 2016 Ronald S. Bultje <rsbultje@gmail.com>
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include <string.h>
-#include "checkasm.h"
-#include "libavcodec/videodsp.h"
-#include "libavutil/internal.h"
-#include "libavutil/intreadwrite.h"
-
-#define randomize_buffers(w, h) \
- do { \
- int i; \
- for (i = 0; i < w * h * sizeof(*src0); i += 4) \
- AV_WN32A(((uint8_t *) src0) + i, rnd()); \
- } while (0)
-
-#define iter_1d(type, fix, fix_val, var, var_start, var_end) \
- for (fix = fix_val, var = var_start; var <= var_end; var++) { \
- call_ref((type *) dst0, (const type *) (src0 + y * pw + x), \
- bw * sizeof(type), pw * sizeof(type), \
- bw, bh, x, y, pw, ph); \
- call_new((type *) dst1, (const type *) (src1 + y * pw + x), \
- bw * sizeof(type), pw * sizeof(type), \
- bw, bh, x, y, pw, ph); \
- if (memcmp(dst0, dst1, bw * bh * sizeof(type))) \
- fail(); \
- bench_new((type *) dst1, (const type *) (src1 + y * pw + x),\
- bw * sizeof(type), pw * sizeof(type), \
- bw, bh, x, y, pw, ph); \
- }
-
-#define check_emu_edge_size(type, src_w, src_h, dst_w, dst_h) \
- do { \
- LOCAL_ALIGNED_16(type, src0, [src_w * src_h]); \
- LOCAL_ALIGNED_16(type, src1, [src_w * src_h]); \
- int bw = dst_w, bh = dst_h; \
- int pw = src_w, ph = src_h; \
- int y, x; \
- randomize_buffers(src_w, src_h); \
- memcpy(src1, src0, pw * ph * sizeof(type)); \
- iter_1d(type, y, 0 - src_h, x, 0 - src_w, src_w - 0); \
- iter_1d(type, x, src_w - 0, y, 0 - src_h, src_h - 0); \
- iter_1d(type, y, src_h - 0, x, 0 - src_w, src_w - 0); \
- iter_1d(type, x, 0 - src_w, y, 0 - src_h, src_h - 0); \
- } while (0)
-
-#define check_emu_edge(type) \
- do { \
- LOCAL_ALIGNED_16(type, dst0, [64 * 64]); \
- LOCAL_ALIGNED_16(type, dst1, [64 * 64]); \
- declare_func_emms(AV_CPU_FLAG_MMX | AV_CPU_FLAG_MMXEXT, \
- void, type *dst, const type *src, \
- ptrdiff_t dst_linesize, \
- ptrdiff_t src_linesize, \
- int block_w, int block_h, \
- int src_x, int src_y, \
- int src_w, int src_h); \
- check_emu_edge_size(type, 16, 1, 64, 64); \
- check_emu_edge_size(type, 16, 16, 64, 64); \
- check_emu_edge_size(type, 64, 64, 64, 64); \
- } while (0)
-
-void checkasm_check_videodsp(void)
-{
- VideoDSPContext vdsp;
-
- ff_videodsp_init(&vdsp, 8);
- if (check_func(vdsp.emulated_edge_mc, "emulated_edge_mc_8"))
- check_emu_edge(uint8_t);
-
- report("emulated_edge_mc");
-}
diff --git a/tests/checkasm/vp8dsp.c b/tests/checkasm/vp8dsp.c
deleted file mode 100644
index d93f730..0000000
--- a/tests/checkasm/vp8dsp.c
+++ /dev/null
@@ -1,519 +0,0 @@
-/*
- * Copyright (c) 2016 Martin Storsjo
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include <string.h>
-
-#include "libavcodec/avcodec.h"
-#include "libavcodec/vp8dsp.h"
-
-#include "libavutil/common.h"
-#include "libavutil/intreadwrite.h"
-
-#include "checkasm.h"
-
-#define PIXEL_STRIDE 16
-
-#define randomize_buffers(src, dst, stride, coef) \
- do { \
- int x, y; \
- for (y = 0; y < 4; y++) { \
- AV_WN32A((src) + y * (stride), rnd()); \
- AV_WN32A((dst) + y * (stride), rnd()); \
- for (x = 0; x < 4; x++) \
- (coef)[y * 4 + x] = (src)[y * (stride) + x] - \
- (dst)[y * (stride) + x]; \
- } \
- } while (0)
-
-static void dct4x4(int16_t *coef)
-{
- int i;
- for (i = 0; i < 4; i++) {
- const int a1 = (coef[i*4 + 0] + coef[i*4 + 3]) * 8;
- const int b1 = (coef[i*4 + 1] + coef[i*4 + 2]) * 8;
- const int c1 = (coef[i*4 + 1] - coef[i*4 + 2]) * 8;
- const int d1 = (coef[i*4 + 0] - coef[i*4 + 3]) * 8;
- coef[i*4 + 0] = a1 + b1;
- coef[i*4 + 1] = (c1 * 2217 + d1 * 5352 + 14500) >> 12;
- coef[i*4 + 2] = a1 - b1;
- coef[i*4 + 3] = (d1 * 2217 - c1 * 5352 + 7500) >> 12;
- }
- for (i = 0; i < 4; i++) {
- const int a1 = coef[i + 0*4] + coef[i + 3*4];
- const int b1 = coef[i + 1*4] + coef[i + 2*4];
- const int c1 = coef[i + 1*4] - coef[i + 2*4];
- const int d1 = coef[i + 0*4] - coef[i + 3*4];
- coef[i + 0*4] = (a1 + b1 + 7) >> 4;
- coef[i + 1*4] = ((c1 * 2217 + d1 * 5352 + 12000) >> 16) + !!d1;
- coef[i + 2*4] = (a1 - b1 + 7) >> 4;
- coef[i + 3*4] = (d1 * 2217 - c1 * 5352 + 51000) >> 16;
- }
-}
-
-static void wht4x4(int16_t *coef)
-{
- int i;
- for (i = 0; i < 4; i++) {
- int a1 = coef[0 * 4 + i];
- int b1 = coef[1 * 4 + i];
- int c1 = coef[2 * 4 + i];
- int d1 = coef[3 * 4 + i];
- int e1;
- a1 += b1;
- d1 -= c1;
- e1 = (a1 - d1) >> 1;
- b1 = e1 - b1;
- c1 = e1 - c1;
- a1 -= c1;
- d1 += b1;
- coef[0 * 4 + i] = a1;
- coef[1 * 4 + i] = c1;
- coef[2 * 4 + i] = d1;
- coef[3 * 4 + i] = b1;
- }
- for (i = 0; i < 4; i++) {
- int a1 = coef[i * 4 + 0];
- int b1 = coef[i * 4 + 1];
- int c1 = coef[i * 4 + 2];
- int d1 = coef[i * 4 + 3];
- int e1;
- a1 += b1;
- d1 -= c1;
- e1 = (a1 - d1) >> 1;
- b1 = e1 - b1;
- c1 = e1 - c1;
- a1 -= c1;
- d1 += b1;
- coef[i * 4 + 0] = a1 * 2;
- coef[i * 4 + 1] = c1 * 2;
- coef[i * 4 + 2] = d1 * 2;
- coef[i * 4 + 3] = b1 * 2;
- }
-}
-
-static void check_idct(void)
-{
- LOCAL_ALIGNED_16(uint8_t, src, [4 * 4]);
- LOCAL_ALIGNED_16(uint8_t, dst, [4 * 4]);
- LOCAL_ALIGNED_16(uint8_t, dst0, [4 * 4]);
- LOCAL_ALIGNED_16(uint8_t, dst1, [4 * 4]);
- LOCAL_ALIGNED_16(int16_t, coef, [4 * 4]);
- LOCAL_ALIGNED_16(int16_t, subcoef0, [4 * 4]);
- LOCAL_ALIGNED_16(int16_t, subcoef1, [4 * 4]);
- VP8DSPContext d;
- int dc;
- declare_func_emms(AV_CPU_FLAG_MMX, void, uint8_t *dst, int16_t *block, ptrdiff_t stride);
-
- ff_vp8dsp_init(&d);
- randomize_buffers(src, dst, 4, coef);
-
- dct4x4(coef);
-
- for (dc = 0; dc <= 1; dc++) {
- void (*idct)(uint8_t *, int16_t *, ptrdiff_t) = dc ? d.vp8_idct_dc_add : d.vp8_idct_add;
-
- if (check_func(idct, "vp8_idct_%sadd", dc ? "dc_" : "")) {
- if (dc) {
- memset(subcoef0, 0, 4 * 4 * sizeof(int16_t));
- subcoef0[0] = coef[0];
- } else {
- memcpy(subcoef0, coef, 4 * 4 * sizeof(int16_t));
- }
- memcpy(dst0, dst, 4 * 4);
- memcpy(dst1, dst, 4 * 4);
- memcpy(subcoef1, subcoef0, 4 * 4 * sizeof(int16_t));
- // Note, this uses a pixel stride of 4, even though the real decoder uses a stride as a
- // multiple of 16. If optimizations want to take advantage of that, this test needs to be
- // updated to make it more like the h264dsp tests.
- call_ref(dst0, subcoef0, 4);
- call_new(dst1, subcoef1, 4);
- if (memcmp(dst0, dst1, 4 * 4) ||
- memcmp(subcoef0, subcoef1, 4 * 4 * sizeof(int16_t)))
- fail();
-
- bench_new(dst1, subcoef1, 4);
- }
- }
-}
-
-static void check_idct_dc4(void)
-{
- LOCAL_ALIGNED_16(uint8_t, src, [4 * 4 * 4]);
- LOCAL_ALIGNED_16(uint8_t, dst, [4 * 4 * 4]);
- LOCAL_ALIGNED_16(uint8_t, dst0, [4 * 4 * 4]);
- LOCAL_ALIGNED_16(uint8_t, dst1, [4 * 4 * 4]);
- LOCAL_ALIGNED_16(int16_t, coef, [4], [4 * 4]);
- LOCAL_ALIGNED_16(int16_t, subcoef0, [4], [4 * 4]);
- LOCAL_ALIGNED_16(int16_t, subcoef1, [4], [4 * 4]);
- VP8DSPContext d;
- int i, chroma;
- declare_func_emms(AV_CPU_FLAG_MMX, void, uint8_t *dst, int16_t block[4][16], ptrdiff_t stride);
-
- ff_vp8dsp_init(&d);
-
- for (chroma = 0; chroma <= 1; chroma++) {
- void (*idct4dc)(uint8_t *, int16_t[4][16], ptrdiff_t) = chroma ? d.vp8_idct_dc_add4uv : d.vp8_idct_dc_add4y;
- if (check_func(idct4dc, "vp8_idct_dc_add4%s", chroma ? "uv" : "y")) {
- ptrdiff_t stride = chroma ? 8 : 16;
- int w = chroma ? 2 : 4;
- for (i = 0; i < 4; i++) {
- int blockx = 4 * (i % w);
- int blocky = 4 * (i / w);
- randomize_buffers(src + stride * blocky + blockx, dst + stride * blocky + blockx, stride, coef[i]);
- dct4x4(coef[i]);
- memset(&coef[i][1], 0, 15 * sizeof(int16_t));
- }
-
- memcpy(dst0, dst, 4 * 4 * 4);
- memcpy(dst1, dst, 4 * 4 * 4);
- memcpy(subcoef0, coef, 4 * 4 * 4 * sizeof(int16_t));
- memcpy(subcoef1, coef, 4 * 4 * 4 * sizeof(int16_t));
- call_ref(dst0, subcoef0, stride);
- call_new(dst1, subcoef1, stride);
- if (memcmp(dst0, dst1, 4 * 4 * 4) ||
- memcmp(subcoef0, subcoef1, 4 * 4 * 4 * sizeof(int16_t)))
- fail();
- bench_new(dst1, subcoef1, stride);
- }
- }
-
-}
-
-static void check_luma_dc_wht(void)
-{
- LOCAL_ALIGNED_16(int16_t, dc, [4 * 4]);
- LOCAL_ALIGNED_16(int16_t, dc0, [4 * 4]);
- LOCAL_ALIGNED_16(int16_t, dc1, [4 * 4]);
- int16_t block[4][4][16];
- LOCAL_ALIGNED_16(int16_t, block0, [4], [4][16]);
- LOCAL_ALIGNED_16(int16_t, block1, [4], [4][16]);
- VP8DSPContext d;
- int dc_only;
- int blockx, blocky;
- declare_func_emms(AV_CPU_FLAG_MMX, void, int16_t block[4][4][16], int16_t dc[16]);
-
- ff_vp8dsp_init(&d);
-
- for (blocky = 0; blocky < 4; blocky++) {
- for (blockx = 0; blockx < 4; blockx++) {
- uint8_t src[16], dst[16];
- randomize_buffers(src, dst, 4, block[blocky][blockx]);
-
- dct4x4(block[blocky][blockx]);
- dc[blocky * 4 + blockx] = block[blocky][blockx][0];
- block[blocky][blockx][0] = rnd();
- }
- }
- wht4x4(dc);
-
- for (dc_only = 0; dc_only <= 1; dc_only++) {
- void (*idct)(int16_t [4][4][16], int16_t [16]) = dc_only ? d.vp8_luma_dc_wht_dc : d.vp8_luma_dc_wht;
-
- if (check_func(idct, "vp8_luma_dc_wht%s", dc_only ? "_dc" : "")) {
- if (dc_only) {
- memset(dc0, 0, 16 * sizeof(int16_t));
- dc0[0] = dc[0];
- } else {
- memcpy(dc0, dc, 16 * sizeof(int16_t));
- }
- memcpy(dc1, dc0, 16 * sizeof(int16_t));
- memcpy(block0, block, 4 * 4 * 16 * sizeof(int16_t));
- memcpy(block1, block, 4 * 4 * 16 * sizeof(int16_t));
- call_ref(block0, dc0);
- call_new(block1, dc1);
- if (memcmp(block0, block1, 4 * 4 * 16 * sizeof(int16_t)) ||
- memcmp(dc0, dc1, 16 * sizeof(int16_t)))
- fail();
- bench_new(block1, dc1);
- }
- }
-}
-
-#define SRC_BUF_STRIDE 32
-#define SRC_BUF_SIZE (((size << (size < 16)) + 5) * SRC_BUF_STRIDE)
-// The mc subpixel interpolation filter needs the 2 previous pixels in either
-// direction, the +1 is to make sure the actual load addresses always are
-// unaligned.
-#define src (buf + 2 * SRC_BUF_STRIDE + 2 + 1)
-
-#undef randomize_buffers
-#define randomize_buffers() \
- do { \
- int k; \
- for (k = 0; k < SRC_BUF_SIZE; k += 4) { \
- AV_WN32A(buf + k, rnd()); \
- } \
- } while (0)
-
-static void check_mc(void)
-{
- LOCAL_ALIGNED_16(uint8_t, buf, [32 * 32]);
- LOCAL_ALIGNED_16(uint8_t, dst0, [16 * 16]);
- LOCAL_ALIGNED_16(uint8_t, dst1, [16 * 16]);
- VP8DSPContext d;
- int type, k, dx, dy;
- declare_func_emms(AV_CPU_FLAG_MMX, void, uint8_t *, ptrdiff_t, uint8_t *, ptrdiff_t, int, int, int);
-
- ff_vp78dsp_init(&d);
-
- for (type = 0; type < 2; type++) {
- vp8_mc_func (*tab)[3][3] = type ? d.put_vp8_bilinear_pixels_tab : d.put_vp8_epel_pixels_tab;
- for (k = 1; k < 8; k++) {
- int hsize = k / 3;
- int size = 16 >> hsize;
- int height = (size << 1) >> (k % 3);
- for (dy = 0; dy < 3; dy++) {
- for (dx = 0; dx < 3; dx++) {
- char str[100];
- if (dx || dy) {
- if (type == 0) {
- static const char *dx_names[] = { "", "h4", "h6" };
- static const char *dy_names[] = { "", "v4", "v6" };
- snprintf(str, sizeof(str), "epel%d_%s%s", size, dx_names[dx], dy_names[dy]);
- } else {
- snprintf(str, sizeof(str), "bilin%d_%s%s", size, dx ? "h" : "", dy ? "v" : "");
- }
- } else {
- snprintf(str, sizeof(str), "pixels%d", size);
- }
- if (check_func(tab[hsize][dy][dx], "vp8_put_%s", str)) {
- int mx, my;
- int i;
- if (type == 0) {
- mx = dx == 2 ? 2 + 2 * (rnd() % 3) : dx == 1 ? 1 + 2 * (rnd() % 4) : 0;
- my = dy == 2 ? 2 + 2 * (rnd() % 3) : dy == 1 ? 1 + 2 * (rnd() % 4) : 0;
- } else {
- mx = dx ? 1 + (rnd() % 7) : 0;
- my = dy ? 1 + (rnd() % 7) : 0;
- }
- randomize_buffers();
- for (i = -2; i <= 3; i++) {
- int val = (i == -1 || i == 2) ? 0 : 0xff;
- // Set pixels in the first row and column to the maximum pattern,
- // to test for potential overflows in the filter.
- src[i ] = val;
- src[i * SRC_BUF_STRIDE] = val;
- }
- call_ref(dst0, size, src, SRC_BUF_STRIDE, height, mx, my);
- call_new(dst1, size, src, SRC_BUF_STRIDE, height, mx, my);
- if (memcmp(dst0, dst1, size * height))
- fail();
- bench_new(dst1, size, src, SRC_BUF_STRIDE, height, mx, my);
- }
- }
- }
- }
- }
-}
-
-#undef randomize_buffers
-
-#define setpx(a, b, c) buf[(a) + (b) * jstride] = av_clip_uint8(c)
-// Set the pixel to c +/- [0,d]
-#define setdx(a, b, c, d) setpx(a, b, c - (d) + (rnd() % ((d) * 2 + 1)))
-// Set the pixel to c +/- [d,d+e] (making sure it won't be clipped)
-#define setdx2(a, b, o, c, d, e) setpx(a, b, o = c + ((d) + (rnd() % (e))) * (c >= 128 ? -1 : 1))
-
-static void randomize_loopfilter_buffers(int lineoff, int str,
- int dir, int flim_E, int flim_I,
- int hev_thresh, uint8_t *buf,
- int force_hev)
-{
- uint32_t mask = 0xff;
- int off = dir ? lineoff : lineoff * str;
- int istride = dir ? 1 : str;
- int jstride = dir ? str : 1;
- int i;
- for (i = 0; i < 8; i += 2) {
- // Row 0 will trigger hev for q0/q1, row 2 will trigger hev for p0/p1,
- // rows 4 and 6 will not trigger hev.
- // force_hev 1 will make sure all rows trigger hev, while force_hev -1
- // makes none of them trigger it.
- int idx = off + i * istride, p2, p1, p0, q0, q1, q2;
- setpx(idx, 0, q0 = rnd() & mask);
- if (i == 0 && force_hev >= 0 || force_hev > 0)
- setdx2(idx, 1, q1, q0, hev_thresh + 1, flim_I - hev_thresh - 1);
- else
- setdx(idx, 1, q1 = q0, hev_thresh);
- setdx(idx, 2, q2 = q1, flim_I);
- setdx(idx, 3, q2, flim_I);
- setdx(idx, -1, p0 = q0, flim_E >> 2);
- if (i == 2 && force_hev >= 0 || force_hev > 0)
- setdx2(idx, -2, p1, p0, hev_thresh + 1, flim_I - hev_thresh - 1);
- else
- setdx(idx, -2, p1 = p0, hev_thresh);
- setdx(idx, -3, p2 = p1, flim_I);
- setdx(idx, -4, p2, flim_I);
- }
-}
-
-// Fill the buffer with random pixels
-static void fill_loopfilter_buffers(uint8_t *buf, ptrdiff_t stride, int w, int h)
-{
- int x, y;
- for (y = 0; y < h; y++)
- for (x = 0; x < w; x++)
- buf[y * stride + x] = rnd() & 0xff;
-}
-
-#define randomize_buffers(buf, lineoff, str, force_hev) \
- randomize_loopfilter_buffers(lineoff, str, dir, flim_E, flim_I, hev_thresh, buf, force_hev)
-
-static void check_loopfilter_16y(void)
-{
- LOCAL_ALIGNED_16(uint8_t, base0, [32 + 16 * 16]);
- LOCAL_ALIGNED_16(uint8_t, base1, [32 + 16 * 16]);
- VP8DSPContext d;
- int dir, edge, force_hev;
- int flim_E = 20, flim_I = 10, hev_thresh = 7;
- declare_func_emms(AV_CPU_FLAG_MMX, void, uint8_t *, ptrdiff_t, int, int, int);
-
- ff_vp8dsp_init(&d);
-
- for (dir = 0; dir < 2; dir++) {
- int midoff = dir ? 4 * 16 : 4;
- int midoff_aligned = dir ? 4 * 16 : 16;
- uint8_t *buf0 = base0 + midoff_aligned;
- uint8_t *buf1 = base1 + midoff_aligned;
- for (edge = 0; edge < 2; edge++) {
- void (*func)(uint8_t *, ptrdiff_t, int, int, int) = NULL;
- switch (dir << 1 | edge) {
- case (0 << 1) | 0: func = d.vp8_h_loop_filter16y; break;
- case (1 << 1) | 0: func = d.vp8_v_loop_filter16y; break;
- case (0 << 1) | 1: func = d.vp8_h_loop_filter16y_inner; break;
- case (1 << 1) | 1: func = d.vp8_v_loop_filter16y_inner; break;
- }
- if (check_func(func, "vp8_loop_filter16y%s_%s", edge ? "_inner" : "", dir ? "v" : "h")) {
- for (force_hev = -1; force_hev <= 1; force_hev++) {
- fill_loopfilter_buffers(buf0 - midoff, 16, 16, 16);
- randomize_buffers(buf0, 0, 16, force_hev);
- randomize_buffers(buf0, 8, 16, force_hev);
- memcpy(buf1 - midoff, buf0 - midoff, 16 * 16);
- call_ref(buf0, 16, flim_E, flim_I, hev_thresh);
- call_new(buf1, 16, flim_E, flim_I, hev_thresh);
- if (memcmp(buf0 - midoff, buf1 - midoff, 16 * 16))
- fail();
- }
- fill_loopfilter_buffers(buf0 - midoff, 16, 16, 16);
- randomize_buffers(buf0, 0, 16, 0);
- randomize_buffers(buf0, 8, 16, 0);
- bench_new(buf0, 16, flim_E, flim_I, hev_thresh);
- }
- }
- }
-}
-
-static void check_loopfilter_8uv(void)
-{
- LOCAL_ALIGNED_16(uint8_t, base0u, [32 + 16 * 16]);
- LOCAL_ALIGNED_16(uint8_t, base0v, [32 + 16 * 16]);
- LOCAL_ALIGNED_16(uint8_t, base1u, [32 + 16 * 16]);
- LOCAL_ALIGNED_16(uint8_t, base1v, [32 + 16 * 16]);
- VP8DSPContext d;
- int dir, edge, force_hev;
- int flim_E = 20, flim_I = 10, hev_thresh = 7;
- declare_func_emms(AV_CPU_FLAG_MMX, void, uint8_t *, uint8_t *, ptrdiff_t, int, int, int);
-
- ff_vp8dsp_init(&d);
-
- for (dir = 0; dir < 2; dir++) {
- int midoff = dir ? 4 * 16 : 4;
- int midoff_aligned = dir ? 4 * 16 : 16;
- uint8_t *buf0u = base0u + midoff_aligned;
- uint8_t *buf0v = base0v + midoff_aligned;
- uint8_t *buf1u = base1u + midoff_aligned;
- uint8_t *buf1v = base1v + midoff_aligned;
- for (edge = 0; edge < 2; edge++) {
- void (*func)(uint8_t *, uint8_t *, ptrdiff_t, int, int, int) = NULL;
- switch (dir << 1 | edge) {
- case (0 << 1) | 0: func = d.vp8_h_loop_filter8uv; break;
- case (1 << 1) | 0: func = d.vp8_v_loop_filter8uv; break;
- case (0 << 1) | 1: func = d.vp8_h_loop_filter8uv_inner; break;
- case (1 << 1) | 1: func = d.vp8_v_loop_filter8uv_inner; break;
- }
- if (check_func(func, "vp8_loop_filter8uv%s_%s", edge ? "_inner" : "", dir ? "v" : "h")) {
- for (force_hev = -1; force_hev <= 1; force_hev++) {
- fill_loopfilter_buffers(buf0u - midoff, 16, 16, 16);
- fill_loopfilter_buffers(buf0v - midoff, 16, 16, 16);
- randomize_buffers(buf0u, 0, 16, force_hev);
- randomize_buffers(buf0v, 0, 16, force_hev);
- memcpy(buf1u - midoff, buf0u - midoff, 16 * 16);
- memcpy(buf1v - midoff, buf0v - midoff, 16 * 16);
-
- call_ref(buf0u, buf0v, 16, flim_E, flim_I, hev_thresh);
- call_new(buf1u, buf1v, 16, flim_E, flim_I, hev_thresh);
- if (memcmp(buf0u - midoff, buf1u - midoff, 16 * 16) ||
- memcmp(buf0v - midoff, buf1v - midoff, 16 * 16))
- fail();
- }
- fill_loopfilter_buffers(buf0u - midoff, 16, 16, 16);
- fill_loopfilter_buffers(buf0v - midoff, 16, 16, 16);
- randomize_buffers(buf0u, 0, 16, 0);
- randomize_buffers(buf0v, 0, 16, 0);
- bench_new(buf0u, buf0v, 16, flim_E, flim_I, hev_thresh);
- }
- }
- }
-}
-
-static void check_loopfilter_simple(void)
-{
- LOCAL_ALIGNED_16(uint8_t, base0, [32 + 16 * 16]);
- LOCAL_ALIGNED_16(uint8_t, base1, [32 + 16 * 16]);
- VP8DSPContext d;
- int dir;
- int flim_E = 20, flim_I = 30, hev_thresh = 0;
- declare_func_emms(AV_CPU_FLAG_MMX, void, uint8_t *, ptrdiff_t, int);
-
- ff_vp8dsp_init(&d);
-
- for (dir = 0; dir < 2; dir++) {
- int midoff = dir ? 4 * 16 : 4;
- int midoff_aligned = dir ? 4 * 16 : 16;
- uint8_t *buf0 = base0 + midoff_aligned;
- uint8_t *buf1 = base1 + midoff_aligned;
- void (*func)(uint8_t *, ptrdiff_t, int) = dir ? d.vp8_v_loop_filter_simple : d.vp8_h_loop_filter_simple;
- if (check_func(func, "vp8_loop_filter_simple_%s", dir ? "v" : "h")) {
- fill_loopfilter_buffers(buf0 - midoff, 16, 16, 16);
- randomize_buffers(buf0, 0, 16, -1);
- randomize_buffers(buf0, 8, 16, -1);
- memcpy(buf1 - midoff, buf0 - midoff, 16 * 16);
- call_ref(buf0, 16, flim_E);
- call_new(buf1, 16, flim_E);
- if (memcmp(buf0 - midoff, buf1 - midoff, 16 * 16))
- fail();
- bench_new(buf0, 16, flim_E);
- }
- }
-}
-
-void checkasm_check_vp8dsp(void)
-{
- check_idct();
- check_idct_dc4();
- check_luma_dc_wht();
- report("idct");
- check_mc();
- report("mc");
- check_loopfilter_16y();
- check_loopfilter_8uv();
- check_loopfilter_simple();
- report("loopfilter");
-}
diff --git a/tests/checkasm/vp9dsp.c b/tests/checkasm/vp9dsp.c
deleted file mode 100644
index a91577b..0000000
--- a/tests/checkasm/vp9dsp.c
+++ /dev/null
@@ -1,631 +0,0 @@
-/*
- * Copyright (c) 2015 Ronald S. Bultje <rsbultje@gmail.com>
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include <math.h>
-#include <string.h>
-#include "checkasm.h"
-#include "libavcodec/vp9data.h"
-#include "libavcodec/vp9.h"
-#include "libavutil/common.h"
-#include "libavutil/internal.h"
-#include "libavutil/intreadwrite.h"
-#include "libavutil/mathematics.h"
-
-static const uint32_t pixel_mask[3] = { 0xffffffff, 0x03ff03ff, 0x0fff0fff };
-#define SIZEOF_PIXEL ((bit_depth + 7) / 8)
-
-#define randomize_buffers() \
- do { \
- uint32_t mask = pixel_mask[(bit_depth - 8) >> 1]; \
- int k; \
- for (k = -4; k < SIZEOF_PIXEL * FFMAX(8, size); k += 4) { \
- uint32_t r = rnd() & mask; \
- AV_WN32A(a + k, r); \
- } \
- for (k = 0; k < size * SIZEOF_PIXEL; k += 4) { \
- uint32_t r = rnd() & mask; \
- AV_WN32A(l + k, r); \
- } \
- } while (0)
-
-static void check_ipred(void)
-{
- LOCAL_ALIGNED_32(uint8_t, a_buf, [64 * 2]);
- uint8_t *a = &a_buf[32 * 2];
- LOCAL_ALIGNED_32(uint8_t, l, [32 * 2]);
- LOCAL_ALIGNED_32(uint8_t, dst0, [32 * 32 * 2]);
- LOCAL_ALIGNED_32(uint8_t, dst1, [32 * 32 * 2]);
- VP9DSPContext dsp;
- int tx, mode, bit_depth;
- declare_func_emms(AV_CPU_FLAG_MMX | AV_CPU_FLAG_MMXEXT, void, uint8_t *dst, ptrdiff_t stride,
- const uint8_t *left, const uint8_t *top);
- static const char *const mode_names[N_INTRA_PRED_MODES] = {
- [VERT_PRED] = "vert",
- [HOR_PRED] = "hor",
- [DC_PRED] = "dc",
- [DIAG_DOWN_LEFT_PRED] = "diag_downleft",
- [DIAG_DOWN_RIGHT_PRED] = "diag_downright",
- [VERT_RIGHT_PRED] = "vert_right",
- [HOR_DOWN_PRED] = "hor_down",
- [VERT_LEFT_PRED] = "vert_left",
- [HOR_UP_PRED] = "hor_up",
- [TM_VP8_PRED] = "tm",
- [LEFT_DC_PRED] = "dc_left",
- [TOP_DC_PRED] = "dc_top",
- [DC_128_PRED] = "dc_128",
- [DC_127_PRED] = "dc_127",
- [DC_129_PRED] = "dc_129",
- };
-
- for (bit_depth = 8; bit_depth <= 12; bit_depth += 2) {
- ff_vp9dsp_init(&dsp, bit_depth, 0);
- for (tx = 0; tx < 4; tx++) {
- int size = 4 << tx;
-
- for (mode = 0; mode < N_INTRA_PRED_MODES; mode++) {
- if (check_func(dsp.intra_pred[tx][mode], "vp9_%s_%dx%d_%dbpp",
- mode_names[mode], size, size, bit_depth)) {
- randomize_buffers();
- call_ref(dst0, size * SIZEOF_PIXEL, l, a);
- call_new(dst1, size * SIZEOF_PIXEL, l, a);
- if (memcmp(dst0, dst1, size * size * SIZEOF_PIXEL))
- fail();
- bench_new(dst1, size * SIZEOF_PIXEL,l, a);
- }
- }
- }
- }
- report("ipred");
-}
-
-#undef randomize_buffers
-
-#define randomize_buffers() \
- do { \
- uint32_t mask = pixel_mask[(bit_depth - 8) >> 1]; \
- for (y = 0; y < sz; y++) { \
- for (x = 0; x < sz * SIZEOF_PIXEL; x += 4) { \
- uint32_t r = rnd() & mask; \
- AV_WN32A(dst + y * sz * SIZEOF_PIXEL + x, r); \
- AV_WN32A(src + y * sz * SIZEOF_PIXEL + x, rnd() & mask); \
- } \
- for (x = 0; x < sz; x++) { \
- if (bit_depth == 8) { \
- coef[y * sz + x] = src[y * sz + x] - dst[y * sz + x]; \
- } else { \
- ((int32_t *) coef)[y * sz + x] = \
- ((uint16_t *) src)[y * sz + x] - \
- ((uint16_t *) dst)[y * sz + x]; \
- } \
- } \
- } \
- } while(0)
-
-// wht function copied from libvpx
-static void fwht_1d(double *out, const double *in, int sz)
-{
- double t0 = in[0] + in[1];
- double t3 = in[3] - in[2];
- double t4 = trunc((t0 - t3) * 0.5);
- double t1 = t4 - in[1];
- double t2 = t4 - in[2];
-
- out[0] = t0 - t2;
- out[1] = t2;
- out[2] = t3 + t1;
- out[3] = t1;
-}
-
-// standard DCT-II
-static void fdct_1d(double *out, const double *in, int sz)
-{
- int k, n;
-
- for (k = 0; k < sz; k++) {
- out[k] = 0.0;
- for (n = 0; n < sz; n++)
- out[k] += in[n] * cos(M_PI * (2 * n + 1) * k / (sz * 2.0));
- }
- out[0] *= M_SQRT1_2;
-}
-
-// see "Towards jointly optimal spatial prediction and adaptive transform in
-// video/image coding", by J. Han, A. Saxena, and K. Rose
-// IEEE Proc. ICASSP, pp. 726-729, Mar. 2010.
-static void fadst4_1d(double *out, const double *in, int sz)
-{
- int k, n;
-
- for (k = 0; k < sz; k++) {
- out[k] = 0.0;
- for (n = 0; n < sz; n++)
- out[k] += in[n] * sin(M_PI * (n + 1) * (2 * k + 1) / (sz * 2.0 + 1.0));
- }
-}
-
-// see "A Butterfly Structured Design of The Hybrid Transform Coding Scheme",
-// by Jingning Han, Yaowu Xu, and Debargha Mukherjee
-// http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/41418.pdf
-static void fadst_1d(double *out, const double *in, int sz)
-{
- int k, n;
-
- for (k = 0; k < sz; k++) {
- out[k] = 0.0;
- for (n = 0; n < sz; n++)
- out[k] += in[n] * sin(M_PI * (2 * n + 1) * (2 * k + 1) / (sz * 4.0));
- }
-}
-
-typedef void (*ftx1d_fn)(double *out, const double *in, int sz);
-static void ftx_2d(double *out, const double *in, enum TxfmMode tx,
- enum TxfmType txtp, int sz)
-{
- static const double scaling_factors[5][4] = {
- { 4.0, 16.0 * M_SQRT1_2 / 3.0, 16.0 * M_SQRT1_2 / 3.0, 32.0 / 9.0 },
- { 2.0, 2.0, 2.0, 2.0 },
- { 1.0, 1.0, 1.0, 1.0 },
- { 0.25 },
- { 4.0 }
- };
- static const ftx1d_fn ftx1d_tbl[5][4][2] = {
- {
- { fdct_1d, fdct_1d },
- { fadst4_1d, fdct_1d },
- { fdct_1d, fadst4_1d },
- { fadst4_1d, fadst4_1d },
- }, {
- { fdct_1d, fdct_1d },
- { fadst_1d, fdct_1d },
- { fdct_1d, fadst_1d },
- { fadst_1d, fadst_1d },
- }, {
- { fdct_1d, fdct_1d },
- { fadst_1d, fdct_1d },
- { fdct_1d, fadst_1d },
- { fadst_1d, fadst_1d },
- }, {
- { fdct_1d, fdct_1d },
- }, {
- { fwht_1d, fwht_1d },
- },
- };
- double temp[1024];
- double scaling_factor = scaling_factors[tx][txtp];
- int i, j;
-
- // cols
- for (i = 0; i < sz; ++i) {
- double temp_out[32];
-
- ftx1d_tbl[tx][txtp][0](temp_out, &in[i * sz], sz);
- // scale and transpose
- for (j = 0; j < sz; ++j)
- temp[j * sz + i] = temp_out[j] * scaling_factor;
- }
-
- // rows
- for (i = 0; i < sz; i++)
- ftx1d_tbl[tx][txtp][1](&out[i * sz], &temp[i * sz], sz);
-}
-
-static void ftx(int16_t *buf, enum TxfmMode tx,
- enum TxfmType txtp, int sz, int bit_depth)
-{
- double ind[1024], outd[1024];
- int n;
-
- emms_c();
- for (n = 0; n < sz * sz; n++) {
- if (bit_depth == 8)
- ind[n] = buf[n];
- else
- ind[n] = ((int32_t *) buf)[n];
- }
- ftx_2d(outd, ind, tx, txtp, sz);
- for (n = 0; n < sz * sz; n++) {
- if (bit_depth == 8)
- buf[n] = lrint(outd[n]);
- else
- ((int32_t *) buf)[n] = lrint(outd[n]);
- }
-}
-
-static int copy_subcoefs(int16_t *out, const int16_t *in, enum TxfmMode tx,
- enum TxfmType txtp, int sz, int sub, int bit_depth)
-{
- // copy the topleft coefficients such that the return value (being the
- // coefficient scantable index for the eob token) guarantees that only
- // the topleft $sub out of $sz (where $sz >= $sub) coefficients in both
- // dimensions are non-zero. This leads to braching to specific optimized
- // simd versions (e.g. dc-only) so that we get full asm coverage in this
- // test
-
- int n;
- const int16_t *scan = ff_vp9_scans[tx][txtp];
- int eob;
-
- for (n = 0; n < sz * sz; n++) {
- int rc = scan[n], rcx = rc % sz, rcy = rc / sz;
-
- // find eob for this sub-idct
- if (rcx >= sub || rcy >= sub)
- break;
-
- // copy coef
- if (bit_depth == 8) {
- out[rc] = in[rc];
- } else {
- AV_COPY32(&out[rc * 2], &in[rc * 2]);
- }
- }
-
- eob = n;
-
- for (; n < sz * sz; n++) {
- int rc = scan[n];
-
- // zero
- if (bit_depth == 8) {
- out[rc] = 0;
- } else {
- AV_ZERO32(&out[rc * 2]);
- }
- }
-
- return eob;
-}
-
-static int iszero(const int16_t *c, int sz)
-{
- int n;
-
- for (n = 0; n < sz / sizeof(int16_t); n += 2)
- if (AV_RN32A(&c[n]))
- return 0;
-
- return 1;
-}
-
-#define SIZEOF_COEF (2 * ((bit_depth + 7) / 8))
-
-static void check_itxfm(void)
-{
- LOCAL_ALIGNED_32(uint8_t, src, [32 * 32 * 2]);
- LOCAL_ALIGNED_32(uint8_t, dst, [32 * 32 * 2]);
- LOCAL_ALIGNED_32(uint8_t, dst0, [32 * 32 * 2]);
- LOCAL_ALIGNED_32(uint8_t, dst1, [32 * 32 * 2]);
- LOCAL_ALIGNED_32(int16_t, coef, [32 * 32 * 2]);
- LOCAL_ALIGNED_32(int16_t, subcoef0, [32 * 32 * 2]);
- LOCAL_ALIGNED_32(int16_t, subcoef1, [32 * 32 * 2]);
- declare_func_emms(AV_CPU_FLAG_MMX | AV_CPU_FLAG_MMXEXT, void, uint8_t *dst, ptrdiff_t stride, int16_t *block, int eob);
- VP9DSPContext dsp;
- int y, x, tx, txtp, bit_depth, sub;
- static const char *const txtp_types[N_TXFM_TYPES] = {
- [DCT_DCT] = "dct_dct", [DCT_ADST] = "adst_dct",
- [ADST_DCT] = "dct_adst", [ADST_ADST] = "adst_adst"
- };
-
- for (bit_depth = 8; bit_depth <= 12; bit_depth += 2) {
- ff_vp9dsp_init(&dsp, bit_depth, 0);
-
- for (tx = TX_4X4; tx <= N_TXFM_SIZES /* 4 = lossless */; tx++) {
- int sz = 4 << (tx & 3);
- int n_txtps = tx < TX_32X32 ? N_TXFM_TYPES : 1;
-
- for (txtp = 0; txtp < n_txtps; txtp++) {
- // skip testing sub-IDCTs for WHT or ADST since they don't
- // implement it in any of the SIMD functions. If they do,
- // consider changing this to ensure we have complete test
- // coverage. Test sub=1 for dc-only, then 2, 4, 8, 12, etc,
- // since the arm version can distinguish them at that level.
- for (sub = (txtp == 0 && tx < 4) ? 1 : sz; sub <= sz;
- sub < 4 ? (sub <<= 1) : (sub += 4)) {
- if (check_func(dsp.itxfm_add[tx][txtp],
- "vp9_inv_%s_%dx%d_sub%d_add_%d",
- tx == 4 ? "wht_wht" : txtp_types[txtp],
- sz, sz, sub, bit_depth)) {
- int eob;
-
- randomize_buffers();
- ftx(coef, tx, txtp, sz, bit_depth);
-
- if (sub < sz) {
- eob = copy_subcoefs(subcoef0, coef, tx, txtp,
- sz, sub, bit_depth);
- } else {
- eob = sz * sz;
- memcpy(subcoef0, coef, sz * sz * SIZEOF_COEF);
- }
-
- memcpy(dst0, dst, sz * sz * SIZEOF_PIXEL);
- memcpy(dst1, dst, sz * sz * SIZEOF_PIXEL);
- memcpy(subcoef1, subcoef0, sz * sz * SIZEOF_COEF);
- call_ref(dst0, sz * SIZEOF_PIXEL, subcoef0, eob);
- call_new(dst1, sz * SIZEOF_PIXEL, subcoef1, eob);
- if (memcmp(dst0, dst1, sz * sz * SIZEOF_PIXEL) ||
- !iszero(subcoef0, sz * sz * SIZEOF_COEF) ||
- !iszero(subcoef1, sz * sz * SIZEOF_COEF))
- fail();
-
- bench_new(dst, sz * SIZEOF_PIXEL, coef, eob);
- }
- }
- }
- }
- }
- report("itxfm");
-}
-
-#undef randomize_buffers
-
-#define setpx(a,b,c) \
- do { \
- if (SIZEOF_PIXEL == 1) { \
- buf0[(a) + (b) * jstride] = av_clip_uint8(c); \
- } else { \
- ((uint16_t *)buf0)[(a) + (b) * jstride] = av_clip_uintp2(c, bit_depth); \
- } \
- } while (0)
-
-// c can be an assignment and must not be put under ()
-#define setdx(a,b,c,d) setpx(a,b,c-(d)+(rnd()%((d)*2+1)))
-#define setsx(a,b,c,d) setdx(a,b,c,(d) << (bit_depth - 8))
-static void randomize_loopfilter_buffers(int bidx, int lineoff, int str,
- int bit_depth, int dir, const int *E,
- const int *F, const int *H, const int *I,
- uint8_t *buf0, uint8_t *buf1)
-{
- uint32_t mask = (1 << bit_depth) - 1;
- int off = dir ? lineoff : lineoff * 16;
- int istride = dir ? 1 : 16;
- int jstride = dir ? str : 1;
- int i, j;
- for (i = 0; i < 2; i++) /* flat16 */ {
- int idx = off + i * istride, p0, q0;
- setpx(idx, 0, q0 = rnd() & mask);
- setsx(idx, -1, p0 = q0, E[bidx] >> 2);
- for (j = 1; j < 8; j++) {
- setsx(idx, -1 - j, p0, F[bidx]);
- setsx(idx, j, q0, F[bidx]);
- }
- }
- for (i = 2; i < 4; i++) /* flat8 */ {
- int idx = off + i * istride, p0, q0;
- setpx(idx, 0, q0 = rnd() & mask);
- setsx(idx, -1, p0 = q0, E[bidx] >> 2);
- for (j = 1; j < 4; j++) {
- setsx(idx, -1 - j, p0, F[bidx]);
- setsx(idx, j, q0, F[bidx]);
- }
- for (j = 4; j < 8; j++) {
- setpx(idx, -1 - j, rnd() & mask);
- setpx(idx, j, rnd() & mask);
- }
- }
- for (i = 4; i < 6; i++) /* regular */ {
- int idx = off + i * istride, p2, p1, p0, q0, q1, q2;
- setpx(idx, 0, q0 = rnd() & mask);
- setsx(idx, 1, q1 = q0, I[bidx]);
- setsx(idx, 2, q2 = q1, I[bidx]);
- setsx(idx, 3, q2, I[bidx]);
- setsx(idx, -1, p0 = q0, E[bidx] >> 2);
- setsx(idx, -2, p1 = p0, I[bidx]);
- setsx(idx, -3, p2 = p1, I[bidx]);
- setsx(idx, -4, p2, I[bidx]);
- for (j = 4; j < 8; j++) {
- setpx(idx, -1 - j, rnd() & mask);
- setpx(idx, j, rnd() & mask);
- }
- }
- for (i = 6; i < 8; i++) /* off */ {
- int idx = off + i * istride;
- for (j = 0; j < 8; j++) {
- setpx(idx, -1 - j, rnd() & mask);
- setpx(idx, j, rnd() & mask);
- }
- }
-}
-#define randomize_buffers(bidx, lineoff, str) \
- randomize_loopfilter_buffers(bidx, lineoff, str, bit_depth, dir, \
- E, F, H, I, buf0, buf1)
-
-static void check_loopfilter(void)
-{
- LOCAL_ALIGNED_32(uint8_t, base0, [32 + 16 * 16 * 2]);
- LOCAL_ALIGNED_32(uint8_t, base1, [32 + 16 * 16 * 2]);
- VP9DSPContext dsp;
- int dir, wd, wd2, bit_depth;
- static const char *const dir_name[2] = { "h", "v" };
- static const int E[2] = { 20, 28 }, I[2] = { 10, 16 };
- static const int H[2] = { 7, 11 }, F[2] = { 1, 1 };
- declare_func_emms(AV_CPU_FLAG_MMX | AV_CPU_FLAG_MMXEXT, void, uint8_t *dst, ptrdiff_t stride, int E, int I, int H);
-
- for (bit_depth = 8; bit_depth <= 12; bit_depth += 2) {
- ff_vp9dsp_init(&dsp, bit_depth, 0);
-
- for (dir = 0; dir < 2; dir++) {
- int midoff = (dir ? 8 * 8 : 8) * SIZEOF_PIXEL;
- int midoff_aligned = (dir ? 8 * 8 : 16) * SIZEOF_PIXEL;
- uint8_t *buf0 = base0 + midoff_aligned;
- uint8_t *buf1 = base1 + midoff_aligned;
-
- for (wd = 0; wd < 3; wd++) {
- // 4/8/16wd_8px
- if (check_func(dsp.loop_filter_8[wd][dir],
- "vp9_loop_filter_%s_%d_8_%dbpp",
- dir_name[dir], 4 << wd, bit_depth)) {
- randomize_buffers(0, 0, 8);
- memcpy(buf1 - midoff, buf0 - midoff,
- 16 * 8 * SIZEOF_PIXEL);
- call_ref(buf0, 16 * SIZEOF_PIXEL >> dir, E[0], I[0], H[0]);
- call_new(buf1, 16 * SIZEOF_PIXEL >> dir, E[0], I[0], H[0]);
- if (memcmp(buf0 - midoff, buf1 - midoff, 16 * 8 * SIZEOF_PIXEL))
- fail();
- bench_new(buf1, 16 * SIZEOF_PIXEL >> dir, E[0], I[0], H[0]);
- }
- }
-
- midoff = (dir ? 16 * 8 : 8) * SIZEOF_PIXEL;
- midoff_aligned = (dir ? 16 * 8 : 16) * SIZEOF_PIXEL;
-
- buf0 = base0 + midoff_aligned;
- buf1 = base1 + midoff_aligned;
-
- // 16wd_16px loopfilter
- if (check_func(dsp.loop_filter_16[dir],
- "vp9_loop_filter_%s_16_16_%dbpp",
- dir_name[dir], bit_depth)) {
- randomize_buffers(0, 0, 16);
- randomize_buffers(0, 8, 16);
- memcpy(buf1 - midoff, buf0 - midoff, 16 * 16 * SIZEOF_PIXEL);
- call_ref(buf0, 16 * SIZEOF_PIXEL, E[0], I[0], H[0]);
- call_new(buf1, 16 * SIZEOF_PIXEL, E[0], I[0], H[0]);
- if (memcmp(buf0 - midoff, buf1 - midoff, 16 * 16 * SIZEOF_PIXEL))
- fail();
- bench_new(buf1, 16 * SIZEOF_PIXEL, E[0], I[0], H[0]);
- }
-
- for (wd = 0; wd < 2; wd++) {
- for (wd2 = 0; wd2 < 2; wd2++) {
- // mix2 loopfilter
- if (check_func(dsp.loop_filter_mix2[wd][wd2][dir],
- "vp9_loop_filter_mix2_%s_%d%d_16_%dbpp",
- dir_name[dir], 4 << wd, 4 << wd2, bit_depth)) {
- randomize_buffers(0, 0, 16);
- randomize_buffers(1, 8, 16);
- memcpy(buf1 - midoff, buf0 - midoff, 16 * 16 * SIZEOF_PIXEL);
-#define M(a) (((a)[1] << 8) | (a)[0])
- call_ref(buf0, 16 * SIZEOF_PIXEL, M(E), M(I), M(H));
- call_new(buf1, 16 * SIZEOF_PIXEL, M(E), M(I), M(H));
- if (memcmp(buf0 - midoff, buf1 - midoff, 16 * 16 * SIZEOF_PIXEL))
- fail();
- bench_new(buf1, 16 * SIZEOF_PIXEL, M(E), M(I), M(H));
-#undef M
- }
- }
- }
- }
- }
- report("loopfilter");
-}
-
-#undef setsx
-#undef setpx
-#undef setdx
-#undef randomize_buffers
-
-#define DST_BUF_SIZE (size * size * SIZEOF_PIXEL)
-#define SRC_BUF_STRIDE 72
-#define SRC_BUF_SIZE ((size + 7) * SRC_BUF_STRIDE * SIZEOF_PIXEL)
-#define src (buf + 3 * SIZEOF_PIXEL * (SRC_BUF_STRIDE + 1))
-
-#define randomize_buffers() \
- do { \
- uint32_t mask = pixel_mask[(bit_depth - 8) >> 1]; \
- int k; \
- for (k = 0; k < SRC_BUF_SIZE; k += 4) { \
- uint32_t r = rnd() & mask; \
- AV_WN32A(buf + k, r); \
- } \
- if (op == 1) { \
- for (k = 0; k < DST_BUF_SIZE; k += 4) { \
- uint32_t r = rnd() & mask; \
- AV_WN32A(dst0 + k, r); \
- AV_WN32A(dst1 + k, r); \
- } \
- } \
- } while (0)
-
-static void check_mc(void)
-{
- LOCAL_ALIGNED_32(uint8_t, buf, [72 * 72 * 2]);
- LOCAL_ALIGNED_32(uint8_t, dst0, [64 * 64 * 2]);
- LOCAL_ALIGNED_32(uint8_t, dst1, [64 * 64 * 2]);
- VP9DSPContext dsp;
- int op, hsize, bit_depth, filter, dx, dy;
- declare_func_emms(AV_CPU_FLAG_MMX | AV_CPU_FLAG_MMXEXT, void, uint8_t *dst, ptrdiff_t dst_stride,
- const uint8_t *ref, ptrdiff_t ref_stride,
- int h, int mx, int my);
- static const char *const filter_names[4] = {
- "8tap_smooth", "8tap_regular", "8tap_sharp", "bilin"
- };
- static const char *const subpel_names[2][2] = { { "", "h" }, { "v", "hv" } };
- static const char *const op_names[2] = { "put", "avg" };
- char str[256];
-
- for (op = 0; op < 2; op++) {
- for (bit_depth = 8; bit_depth <= 12; bit_depth += 2) {
- ff_vp9dsp_init(&dsp, bit_depth, 0);
- for (hsize = 0; hsize < 5; hsize++) {
- int size = 64 >> hsize;
-
- for (filter = 0; filter < 4; filter++) {
- for (dx = 0; dx < 2; dx++) {
- for (dy = 0; dy < 2; dy++) {
- if (dx || dy) {
- snprintf(str, sizeof(str),
- "%s_%s_%d%s", op_names[op],
- filter_names[filter], size,
- subpel_names[dy][dx]);
- } else {
- snprintf(str, sizeof(str),
- "%s%d", op_names[op], size);
- }
- if (check_func(dsp.mc[hsize][filter][op][dx][dy],
- "vp9_%s_%dbpp", str, bit_depth)) {
- int mx = dx ? 1 + (rnd() % 14) : 0;
- int my = dy ? 1 + (rnd() % 14) : 0;
- randomize_buffers();
- call_ref(dst0, size * SIZEOF_PIXEL,
- src, SRC_BUF_STRIDE * SIZEOF_PIXEL,
- size, mx, my);
- call_new(dst1, size * SIZEOF_PIXEL,
- src, SRC_BUF_STRIDE * SIZEOF_PIXEL,
- size, mx, my);
- if (memcmp(dst0, dst1, DST_BUF_SIZE))
- fail();
-
- // simd implementations for each filter of subpel
- // functions are identical
- if (filter >= 1 && filter <= 2) continue;
- // 10/12 bpp for bilin are identical
- if (bit_depth == 12 && filter == 3) continue;
-
- bench_new(dst1, size * SIZEOF_PIXEL,
- src, SRC_BUF_STRIDE * SIZEOF_PIXEL,
- size, mx, my);
- }
- }
- }
- }
- }
- }
- }
- report("mc");
-}
-
-void checkasm_check_vp9dsp(void)
-{
- check_ipred();
- check_itxfm();
- check_loopfilter();
- check_mc();
-}
diff --git a/tests/checkasm/x86/checkasm.asm b/tests/checkasm/x86/checkasm.asm
deleted file mode 100644
index 683aae8..0000000
--- a/tests/checkasm/x86/checkasm.asm
+++ /dev/null
@@ -1,244 +0,0 @@
-;*****************************************************************************
-;* Assembly testing and benchmarking tool
-;* Copyright (c) 2008 Loren Merritt
-;* Copyright (c) 2012 Henrik Gramner
-;*
-;* This file is part of FFmpeg.
-;*
-;* FFmpeg is free software; you can redistribute it and/or modify
-;* it under the terms of the GNU General Public License as published by
-;* the Free Software Foundation; either version 2 of the License, or
-;* (at your option) any later version.
-;*
-;* FFmpeg is distributed in the hope that it will be useful,
-;* but WITHOUT ANY WARRANTY; without even the implied warranty of
-;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;* GNU General Public License for more details.
-;*
-;* You should have received a copy of the GNU General Public License
-;* along with this program; if not, write to the Free Software
-;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA.
-;*****************************************************************************
-
-%define private_prefix checkasm
-%include "libavutil/x86/x86inc.asm"
-
-SECTION_RODATA
-
-error_message: db "failed to preserve register", 0
-error_message_emms: db "failed to issue emms", 0
-
-%if ARCH_X86_64
-; just random numbers to reduce the chance of incidental match
-ALIGN 16
-x6: dq 0x1a1b2550a612b48c,0x79445c159ce79064
-x7: dq 0x2eed899d5a28ddcd,0x86b2536fcd8cf636
-x8: dq 0xb0856806085e7943,0x3f2bf84fc0fcca4e
-x9: dq 0xacbd382dcf5b8de2,0xd229e1f5b281303f
-x10: dq 0x71aeaff20b095fd9,0xab63e2e11fa38ed9
-x11: dq 0x89b0c0765892729a,0x77d410d5c42c882d
-x12: dq 0xc45ea11a955d8dd5,0x24b3c1d2a024048b
-x13: dq 0x2e8ec680de14b47c,0xdd7b8919edd42786
-x14: dq 0x135ce6888fa02cbf,0x11e53e2b2ac655ef
-x15: dq 0x011ff554472a7a10,0x6de8f4c914c334d5
-n7: dq 0x21f86d66c8ca00ce
-n8: dq 0x75b6ba21077c48ad
-n9: dq 0xed56bb2dcb3c7736
-n10: dq 0x8bda43d3fd1a7e06
-n11: dq 0xb64a9c9e5d318408
-n12: dq 0xdf9a54b303f1d3a3
-n13: dq 0x4a75479abd64e097
-n14: dq 0x249214109d5d1c88
-%endif
-
-SECTION .text
-
-cextern fail_func
-
-; max number of args used by any asm function.
-; (max_args % 4) must equal 3 for stack alignment
-%define max_args 15
-
-%if ARCH_X86_64
-
-;-----------------------------------------------------------------------------
-; int checkasm_stack_clobber(uint64_t clobber, ...)
-;-----------------------------------------------------------------------------
-cglobal stack_clobber, 1,2
- ; Clobber the stack with junk below the stack pointer
- %define argsize (max_args+6)*8
- SUB rsp, argsize
- mov r1, argsize-8
-.loop:
- mov [rsp+r1], r0
- sub r1, 8
- jge .loop
- ADD rsp, argsize
- RET
-
-%if WIN64
- %assign free_regs 7
- DECLARE_REG_TMP 4
-%else
- %assign free_regs 9
- DECLARE_REG_TMP 7
-%endif
-
-%macro report_fail 1
- mov r9, rax
- mov r10, rdx
- lea r0, [%1]
- xor eax, eax
- call fail_func
- mov rdx, r10
- mov rax, r9
-%endmacro
-
-;-----------------------------------------------------------------------------
-; void checkasm_checked_call(void *func, ...)
-;-----------------------------------------------------------------------------
-INIT_XMM
-%macro CHECKED_CALL 0-1
-cglobal checked_call%1, 2,15,16,max_args*8+8
- mov t0, r0
-
- ; All arguments have been pushed on the stack instead of registers in order to
- ; test for incorrect assumptions that 32-bit ints are zero-extended to 64-bit.
- mov r0, r6mp
- mov r1, r7mp
- mov r2, r8mp
- mov r3, r9mp
-%if UNIX64
- mov r4, r10mp
- mov r5, r11mp
- %assign i 6
- %rep max_args-6
- mov r9, [rsp+stack_offset+(i+1)*8]
- mov [rsp+(i-6)*8], r9
- %assign i i+1
- %endrep
-%else ; WIN64
- %assign i 4
- %rep max_args-4
- mov r9, [rsp+stack_offset+(i+7)*8]
- mov [rsp+i*8], r9
- %assign i i+1
- %endrep
-
- ; Move possible floating-point arguments to the correct registers
- movq m0, r0
- movq m1, r1
- movq m2, r2
- movq m3, r3
-
- %assign i 6
- %rep 16-6
- mova m %+ i, [x %+ i]
- %assign i i+1
- %endrep
-%endif
-
-%assign i 14
-%rep 15-free_regs
- mov r %+ i, [n %+ i]
- %assign i i-1
-%endrep
- call t0
-%assign i 14
-%rep 15-free_regs
- xor r %+ i, [n %+ i]
- or r14, r %+ i
- %assign i i-1
-%endrep
-
-%if WIN64
- %assign i 6
- %rep 16-6
- pxor m %+ i, [x %+ i]
- por m6, m %+ i
- %assign i i+1
- %endrep
- packsswb m6, m6
- movq r5, m6
- or r14, r5
-%endif
-
- ; Call fail_func() with a descriptive message to mark it as a failure
- ; if the called function didn't preserve all callee-saved registers.
- ; Save the return value located in rdx:rax first to prevent clobbering.
- jz .clobber_ok
- report_fail error_message
-.clobber_ok:
-%ifidn %1, _emms
- emms
-%elifnidn %1, _float
- fstenv [rsp]
- cmp word [rsp + 8], 0xffff
- je .emms_ok
- report_fail error_message_emms
- emms
-.emms_ok:
-%endif
- RET
-%endmacro
-
-%else
-
-; just random numbers to reduce the chance of incidental match
-%define n3 dword 0x6549315c
-%define n4 dword 0xe02f3e23
-%define n5 dword 0xb78d0d1d
-%define n6 dword 0x33627ba7
-
-%macro report_fail 1
- mov r3, eax
- mov r4, edx
- lea r0, [%1]
- mov [esp], r0
- call fail_func
- mov edx, r4
- mov eax, r3
-%endmacro
-
-%macro CHECKED_CALL 0-1
-;-----------------------------------------------------------------------------
-; void checkasm_checked_call(void *func, ...)
-;-----------------------------------------------------------------------------
-cglobal checked_call%1, 1,7
- mov r3, n3
- mov r4, n4
- mov r5, n5
- mov r6, n6
-%rep max_args
- PUSH dword [esp+20+max_args*4]
-%endrep
- call r0
- xor r3, n3
- xor r4, n4
- xor r5, n5
- xor r6, n6
- or r3, r4
- or r5, r6
- or r3, r5
- jz .clobber_ok
- report_fail error_message
-.clobber_ok:
-%ifidn %1, _emms
- emms
-%elifnidn %1, _float
- fstenv [esp]
- cmp word [esp + 8], 0xffff
- je .emms_ok
- report_fail error_message_emms
- emms
-.emms_ok:
-%endif
- add esp, max_args*4
- REP_RET
-%endmacro
-
-%endif ; ARCH_X86_64
-
-CHECKED_CALL
-CHECKED_CALL _emms
-CHECKED_CALL _float
diff --git a/tests/tiny_ssim.c b/tests/tiny_ssim.c
deleted file mode 100644
index 08f8e92..0000000
--- a/tests/tiny_ssim.c
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
- * Copyright (c) 2003-2013 Loren Merritt
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110 USA
- */
-/*
- * tiny_ssim.c
- * Computes the Structural Similarity Metric between two rawYV12 video files.
- * original algorithm:
- * Z. Wang, A. C. Bovik, H. R. Sheikh and E. P. Simoncelli,
- * "Image quality assessment: From error visibility to structural similarity,"
- * IEEE Transactions on Image Processing, vol. 13, no. 4, pp. 600-612, Apr. 2004.
- *
- * To improve speed, this implementation uses the standard approximation of
- * overlapped 8x8 block sums, rather than the original gaussian weights.
- */
-
-#include "config.h"
-#include <inttypes.h>
-#include <limits.h>
-#include <math.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#define FFSWAP(type,a,b) do{type SWAP_tmp= b; b= a; a= SWAP_tmp;}while(0)
-#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
-
-#define BIT_DEPTH 8
-#define PIXEL_MAX ((1 << BIT_DEPTH)-1)
-typedef uint8_t pixel;
-
-/****************************************************************************
- * structural similarity metric
- ****************************************************************************/
-static void ssim_4x4x2_core( const pixel *pix1, intptr_t stride1,
- const pixel *pix2, intptr_t stride2,
- int sums[2][4] )
-{
- int x,y,z;
-
- for( z = 0; z < 2; z++ )
- {
- uint32_t s1 = 0, s2 = 0, ss = 0, s12 = 0;
- for( y = 0; y < 4; y++ )
- for( x = 0; x < 4; x++ )
- {
- int a = pix1[x+y*stride1];
- int b = pix2[x+y*stride2];
- s1 += a;
- s2 += b;
- ss += a*a;
- ss += b*b;
- s12 += a*b;
- }
- sums[z][0] = s1;
- sums[z][1] = s2;
- sums[z][2] = ss;
- sums[z][3] = s12;
- pix1 += 4;
- pix2 += 4;
- }
-}
-
-static float ssim_end1( int s1, int s2, int ss, int s12 )
-{
-/* Maximum value for 10-bit is: ss*64 = (2^10-1)^2*16*4*64 = 4286582784, which will overflow in some cases.
- * s1*s1, s2*s2, and s1*s2 also obtain this value for edge cases: ((2^10-1)*16*4)^2 = 4286582784.
- * Maximum value for 9-bit is: ss*64 = (2^9-1)^2*16*4*64 = 1069551616, which will not overflow. */
-#if BIT_DEPTH > 9
- typedef float type;
- static const float ssim_c1 = .01*.01*PIXEL_MAX*PIXEL_MAX*64;
- static const float ssim_c2 = .03*.03*PIXEL_MAX*PIXEL_MAX*64*63;
-#else
- typedef int type;
- static const int ssim_c1 = (int)(.01*.01*PIXEL_MAX*PIXEL_MAX*64 + .5);
- static const int ssim_c2 = (int)(.03*.03*PIXEL_MAX*PIXEL_MAX*64*63 + .5);
-#endif
- type fs1 = s1;
- type fs2 = s2;
- type fss = ss;
- type fs12 = s12;
- type vars = fss*64 - fs1*fs1 - fs2*fs2;
- type covar = fs12*64 - fs1*fs2;
- return (float)(2*fs1*fs2 + ssim_c1) * (float)(2*covar + ssim_c2)
- / ((float)(fs1*fs1 + fs2*fs2 + ssim_c1) * (float)(vars + ssim_c2));
-}
-
-static float ssim_end4( int sum0[5][4], int sum1[5][4], int width )
-{
- float ssim = 0.0;
- int i;
-
- for( i = 0; i < width; i++ )
- ssim += ssim_end1( sum0[i][0] + sum0[i+1][0] + sum1[i][0] + sum1[i+1][0],
- sum0[i][1] + sum0[i+1][1] + sum1[i][1] + sum1[i+1][1],
- sum0[i][2] + sum0[i+1][2] + sum1[i][2] + sum1[i+1][2],
- sum0[i][3] + sum0[i+1][3] + sum1[i][3] + sum1[i+1][3] );
- return ssim;
-}
-
-float ssim_plane(
- pixel *pix1, intptr_t stride1,
- pixel *pix2, intptr_t stride2,
- int width, int height, void *buf, int *cnt )
-{
- int z = 0;
- int x, y;
- float ssim = 0.0;
- int (*sum0)[4] = buf;
- int (*sum1)[4] = sum0 + (width >> 2) + 3;
- width >>= 2;
- height >>= 2;
- for( y = 1; y < height; y++ )
- {
- for( ; z <= y; z++ )
- {
- FFSWAP( void*, sum0, sum1 );
- for( x = 0; x < width; x+=2 )
- ssim_4x4x2_core( &pix1[4*(x+z*stride1)], stride1, &pix2[4*(x+z*stride2)], stride2, &sum0[x] );
- }
- for( x = 0; x < width-1; x += 4 )
- ssim += ssim_end4( sum0+x, sum1+x, FFMIN(4,width-x-1) );
- }
-// *cnt = (height-1) * (width-1);
- return ssim / ((height-1) * (width-1));
-}
-
-
-uint64_t ssd_plane( const uint8_t *pix1, const uint8_t *pix2, int size )
-{
- uint64_t ssd = 0;
- int i;
- for( i=0; i<size; i++ )
- {
- int d = pix1[i] - pix2[i];
- ssd += d*d;
- }
- return ssd;
-}
-
-static double ssd_to_psnr( uint64_t ssd, uint64_t denom )
-{
- return -10*log((double)ssd/(denom*255*255))/log(10);
-}
-
-static double ssim_db( double ssim, double weight )
-{
- return 10*(log(weight)/log(10)-log(weight-ssim)/log(10));
-}
-
-static void print_results(uint64_t ssd[3], double ssim[3], int frames, int w, int h)
-{
- printf( "PSNR Y:%.3f U:%.3f V:%.3f All:%.3f | ",
- ssd_to_psnr( ssd[0], (uint64_t)frames*w*h ),
- ssd_to_psnr( ssd[1], (uint64_t)frames*w*h/4 ),
- ssd_to_psnr( ssd[2], (uint64_t)frames*w*h/4 ),
- ssd_to_psnr( ssd[0] + ssd[1] + ssd[2], (uint64_t)frames*w*h*3/2 ) );
- printf( "SSIM Y:%.5f U:%.5f V:%.5f All:%.5f (%.5f)",
- ssim[0] / frames,
- ssim[1] / frames,
- ssim[2] / frames,
- (ssim[0]*4 + ssim[1] + ssim[2]) / (frames*6),
- ssim_db(ssim[0] * 4 + ssim[1] + ssim[2], frames*6));
-}
-
-int main(int argc, char* argv[])
-{
- FILE *f[2];
- uint8_t *buf[2], *plane[2][3];
- int *temp;
- uint64_t ssd[3] = {0,0,0};
- double ssim[3] = {0,0,0};
- int frame_size, w, h;
- int frames, seek;
- int i;
-
- if( argc<4 || 2 != sscanf(argv[3], "%dx%d", &w, &h) )
- {
- printf("tiny_ssim <file1.yuv> <file2.yuv> <width>x<height> [<seek>]\n");
- return -1;
- }
-
- f[0] = fopen(argv[1], "rb");
- f[1] = fopen(argv[2], "rb");
- sscanf(argv[3], "%dx%d", &w, &h);
-
- if (w<=0 || h<=0 || w*(int64_t)h >= INT_MAX/3 || 2LL*w+12 >= INT_MAX / sizeof(*temp)) {
- fprintf(stderr, "Dimensions are too large, or invalid\n");
- return -2;
- }
-
- frame_size = w*h*3LL/2;
- for( i=0; i<2; i++ )
- {
- buf[i] = malloc(frame_size);
- plane[i][0] = buf[i];
- plane[i][1] = plane[i][0] + w*h;
- plane[i][2] = plane[i][1] + w*h/4;
- }
- temp = malloc((2*w+12)*sizeof(*temp));
- seek = argc<5 ? 0 : atoi(argv[4]);
- fseek(f[seek<0], seek < 0 ? -seek : seek, SEEK_SET);
-
- for( frames=0;; frames++ )
- {
- uint64_t ssd_one[3];
- double ssim_one[3];
- if( fread(buf[0], frame_size, 1, f[0]) != 1) break;
- if( fread(buf[1], frame_size, 1, f[1]) != 1) break;
- for( i=0; i<3; i++ )
- {
- ssd_one[i] = ssd_plane ( plane[0][i], plane[1][i], w*h>>2*!!i );
- ssim_one[i] = ssim_plane( plane[0][i], w>>!!i,
- plane[1][i], w>>!!i,
- w>>!!i, h>>!!i, temp, NULL );
- ssd[i] += ssd_one[i];
- ssim[i] += ssim_one[i];
- }
-
- printf("Frame %d | ", frames);
- print_results(ssd_one, ssim_one, 1, w, h);
- printf(" \r");
- fflush(stdout);
- }
-
- if( !frames ) return 0;
-
- printf("Total %d frames | ", frames);
- print_results(ssd, ssim, frames, w, h);
- printf("\n");
-
- return 0;
-}