mirror of
https://github.com/webmproject/libwebp.git
synced 2025-07-15 21:39:59 +02:00
Compare commits
32 Commits
Author | SHA1 | Date | |
---|---|---|---|
c4422702d0 | |||
ed665a15e8 | |||
6b1d18c362 | |||
3368d8768a | |||
f213abf620 | |||
50c97c301d | |||
2c206aaf96 | |||
96e3dfef26 | |||
0e0f74b7e3 | |||
35b7436a21 | |||
21d24b4c08 | |||
cdcf89020e | |||
dc683cdef5 | |||
0858494e96 | |||
c2cf6a93b0 | |||
df0e808fed | |||
676c57dba4 | |||
7bb7f7474e | |||
abcd1797a1 | |||
edaf08952d | |||
b96220636b | |||
e23cd5481c | |||
3875c7de07 | |||
1a8f0d45d3 | |||
934801604e | |||
45eaacc939 | |||
42592af875 | |||
e298e05f66 | |||
29148919e0 | |||
c5bc36243a | |||
d2caaba435 | |||
1fe3162541 |
441
.pylintrc
Normal file
441
.pylintrc
Normal file
@ -0,0 +1,441 @@
|
|||||||
|
# This Pylint rcfile contains a best-effort configuration to uphold the
|
||||||
|
# best-practices and style described in the Google Python style guide:
|
||||||
|
# https://google.github.io/styleguide/pyguide.html
|
||||||
|
#
|
||||||
|
# Its canonical open-source location is:
|
||||||
|
# https://google.github.io/styleguide/pylintrc
|
||||||
|
|
||||||
|
[MASTER]
|
||||||
|
|
||||||
|
# Files or directories to be skipped. They should be base names, not paths.
|
||||||
|
ignore=third_party
|
||||||
|
|
||||||
|
# Files or directories matching the regex patterns are skipped. The regex
|
||||||
|
# matches against base names, not paths.
|
||||||
|
ignore-patterns=
|
||||||
|
|
||||||
|
# Pickle collected data for later comparisons.
|
||||||
|
persistent=no
|
||||||
|
|
||||||
|
# List of plugins (as comma separated values of python modules names) to load,
|
||||||
|
# usually to register additional checkers.
|
||||||
|
load-plugins=
|
||||||
|
|
||||||
|
# Use multiple processes to speed up Pylint.
|
||||||
|
jobs=4
|
||||||
|
|
||||||
|
# Allow loading of arbitrary C extensions. Extensions are imported into the
|
||||||
|
# active Python interpreter and may run arbitrary code.
|
||||||
|
unsafe-load-any-extension=no
|
||||||
|
|
||||||
|
|
||||||
|
[MESSAGES CONTROL]
|
||||||
|
|
||||||
|
# Only show warnings with the listed confidence levels. Leave empty to show
|
||||||
|
# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED
|
||||||
|
confidence=
|
||||||
|
|
||||||
|
# Enable the message, report, category or checker with the given id(s). You can
|
||||||
|
# either give multiple identifier separated by comma (,) or put this option
|
||||||
|
# multiple time (only on the command line, not in the configuration file where
|
||||||
|
# it should appear only once). See also the "--disable" option for examples.
|
||||||
|
#enable=
|
||||||
|
|
||||||
|
# Disable the message, report, category or checker with the given id(s). You
|
||||||
|
# can either give multiple identifiers separated by comma (,) or put this
|
||||||
|
# option multiple times (only on the command line, not in the configuration
|
||||||
|
# file where it should appear only once).You can also use "--disable=all" to
|
||||||
|
# disable everything first and then reenable specific checks. For example, if
|
||||||
|
# you want to run only the similarities checker, you can use "--disable=all
|
||||||
|
# --enable=similarities". If you want to run only the classes checker, but have
|
||||||
|
# no Warning level messages displayed, use"--disable=all --enable=classes
|
||||||
|
# --disable=W"
|
||||||
|
disable=abstract-method,
|
||||||
|
apply-builtin,
|
||||||
|
arguments-differ,
|
||||||
|
attribute-defined-outside-init,
|
||||||
|
backtick,
|
||||||
|
bad-option-value,
|
||||||
|
basestring-builtin,
|
||||||
|
buffer-builtin,
|
||||||
|
c-extension-no-member,
|
||||||
|
consider-using-enumerate,
|
||||||
|
cmp-builtin,
|
||||||
|
cmp-method,
|
||||||
|
coerce-builtin,
|
||||||
|
coerce-method,
|
||||||
|
delslice-method,
|
||||||
|
div-method,
|
||||||
|
duplicate-code,
|
||||||
|
eq-without-hash,
|
||||||
|
execfile-builtin,
|
||||||
|
file-builtin,
|
||||||
|
filter-builtin-not-iterating,
|
||||||
|
fixme,
|
||||||
|
getslice-method,
|
||||||
|
global-statement,
|
||||||
|
hex-method,
|
||||||
|
idiv-method,
|
||||||
|
implicit-str-concat-in-sequence,
|
||||||
|
import-error,
|
||||||
|
import-self,
|
||||||
|
import-star-module-level,
|
||||||
|
inconsistent-return-statements,
|
||||||
|
input-builtin,
|
||||||
|
intern-builtin,
|
||||||
|
invalid-str-codec,
|
||||||
|
locally-disabled,
|
||||||
|
long-builtin,
|
||||||
|
long-suffix,
|
||||||
|
map-builtin-not-iterating,
|
||||||
|
misplaced-comparison-constant,
|
||||||
|
missing-function-docstring,
|
||||||
|
metaclass-assignment,
|
||||||
|
next-method-called,
|
||||||
|
next-method-defined,
|
||||||
|
no-absolute-import,
|
||||||
|
no-else-break,
|
||||||
|
no-else-continue,
|
||||||
|
no-else-raise,
|
||||||
|
no-else-return,
|
||||||
|
no-init, # added
|
||||||
|
no-member,
|
||||||
|
no-name-in-module,
|
||||||
|
no-self-use,
|
||||||
|
nonzero-method,
|
||||||
|
oct-method,
|
||||||
|
old-division,
|
||||||
|
old-ne-operator,
|
||||||
|
old-octal-literal,
|
||||||
|
old-raise-syntax,
|
||||||
|
parameter-unpacking,
|
||||||
|
print-statement,
|
||||||
|
raising-string,
|
||||||
|
range-builtin-not-iterating,
|
||||||
|
raw_input-builtin,
|
||||||
|
rdiv-method,
|
||||||
|
reduce-builtin,
|
||||||
|
relative-import,
|
||||||
|
reload-builtin,
|
||||||
|
round-builtin,
|
||||||
|
setslice-method,
|
||||||
|
signature-differs,
|
||||||
|
standarderror-builtin,
|
||||||
|
suppressed-message,
|
||||||
|
sys-max-int,
|
||||||
|
too-few-public-methods,
|
||||||
|
too-many-ancestors,
|
||||||
|
too-many-arguments,
|
||||||
|
too-many-boolean-expressions,
|
||||||
|
too-many-branches,
|
||||||
|
too-many-instance-attributes,
|
||||||
|
too-many-locals,
|
||||||
|
too-many-nested-blocks,
|
||||||
|
too-many-public-methods,
|
||||||
|
too-many-return-statements,
|
||||||
|
too-many-statements,
|
||||||
|
trailing-newlines,
|
||||||
|
unichr-builtin,
|
||||||
|
unicode-builtin,
|
||||||
|
unnecessary-pass,
|
||||||
|
unpacking-in-except,
|
||||||
|
useless-else-on-loop,
|
||||||
|
useless-object-inheritance,
|
||||||
|
useless-suppression,
|
||||||
|
using-cmp-argument,
|
||||||
|
wrong-import-order,
|
||||||
|
xrange-builtin,
|
||||||
|
zip-builtin-not-iterating,
|
||||||
|
|
||||||
|
|
||||||
|
[REPORTS]
|
||||||
|
|
||||||
|
# Set the output format. Available formats are text, parseable, colorized, msvs
|
||||||
|
# (visual studio) and html. You can also give a reporter class, eg
|
||||||
|
# mypackage.mymodule.MyReporterClass.
|
||||||
|
output-format=text
|
||||||
|
|
||||||
|
# Put messages in a separate file for each module / package specified on the
|
||||||
|
# command line instead of printing them on stdout. Reports (if any) will be
|
||||||
|
# written in a file name "pylint_global.[txt|html]". This option is deprecated
|
||||||
|
# and it will be removed in Pylint 2.0.
|
||||||
|
files-output=no
|
||||||
|
|
||||||
|
# Tells whether to display a full report or only the messages
|
||||||
|
reports=no
|
||||||
|
|
||||||
|
# Python expression which should return a note less than 10 (10 is the highest
|
||||||
|
# note). You have access to the variables errors warning, statement which
|
||||||
|
# respectively contain the number of errors / warnings messages and the total
|
||||||
|
# number of statements analyzed. This is used by the global evaluation report
|
||||||
|
# (RP0004).
|
||||||
|
evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)
|
||||||
|
|
||||||
|
# Template used to display messages. This is a python new-style format string
|
||||||
|
# used to format the message information. See doc for all details
|
||||||
|
#msg-template=
|
||||||
|
|
||||||
|
|
||||||
|
[BASIC]
|
||||||
|
|
||||||
|
# Good variable names which should always be accepted, separated by a comma
|
||||||
|
good-names=main,_,PRESUBMIT
|
||||||
|
|
||||||
|
# Bad variable names which should always be refused, separated by a comma
|
||||||
|
bad-names=
|
||||||
|
|
||||||
|
# Colon-delimited sets of names that determine each other's naming style when
|
||||||
|
# the name regexes allow several styles.
|
||||||
|
name-group=
|
||||||
|
|
||||||
|
# Include a hint for the correct naming format with invalid-name
|
||||||
|
include-naming-hint=no
|
||||||
|
|
||||||
|
# List of decorators that produce properties, such as abc.abstractproperty. Add
|
||||||
|
# to this list to register other decorators that produce valid properties.
|
||||||
|
property-classes=abc.abstractproperty,cached_property.cached_property,cached_property.threaded_cached_property,cached_property.cached_property_with_ttl,cached_property.threaded_cached_property_with_ttl
|
||||||
|
|
||||||
|
# Regular expression matching correct function names
|
||||||
|
function-rgx=^(?:(?P<exempt>setUp|tearDown|setUpModule|tearDownModule)|(?P<camel_case>_?[A-Z][a-zA-Z0-9]*)|(?P<snake_case>_?[a-z][a-z0-9_]*))$
|
||||||
|
|
||||||
|
# Regular expression matching correct variable names
|
||||||
|
variable-rgx=^[a-z][a-z0-9_]*$
|
||||||
|
|
||||||
|
# Regular expression matching correct constant names
|
||||||
|
const-rgx=^(_?[A-Z][A-Z0-9_]*|__[a-z0-9_]+__|_?[a-z][a-z0-9_]*)$
|
||||||
|
|
||||||
|
# Regular expression matching correct attribute names
|
||||||
|
attr-rgx=^_{0,2}[a-z][a-z0-9_]*$
|
||||||
|
|
||||||
|
# Regular expression matching correct argument names
|
||||||
|
argument-rgx=^[a-z][a-z0-9_]*$
|
||||||
|
|
||||||
|
# Regular expression matching correct class attribute names
|
||||||
|
class-attribute-rgx=^(_?[A-Z][A-Z0-9_]*|__[a-z0-9_]+__|_?[a-z][a-z0-9_]*)$
|
||||||
|
|
||||||
|
# Regular expression matching correct inline iteration names
|
||||||
|
inlinevar-rgx=^[a-z][a-z0-9_]*$
|
||||||
|
|
||||||
|
# Regular expression matching correct class names
|
||||||
|
class-rgx=^_?[A-Z][a-zA-Z0-9]*$
|
||||||
|
|
||||||
|
# Regular expression matching correct module names
|
||||||
|
module-rgx=^(_?[a-z][a-z0-9_]*|__init__)$
|
||||||
|
|
||||||
|
# Regular expression matching correct method names
|
||||||
|
method-rgx=(?x)^(?:(?P<exempt>_[a-z0-9_]+__|runTest|setUp|tearDown|setUpTestCase|tearDownTestCase|setupSelf|tearDownClass|setUpClass|(test|assert)_*[A-Z0-9][a-zA-Z0-9_]*|next)|(?P<camel_case>_{0,2}[A-Z][a-zA-Z0-9_]*)|(?P<snake_case>_{0,2}[a-z][a-z0-9_]*))$
|
||||||
|
|
||||||
|
# Regular expression which should only match function or class names that do
|
||||||
|
# not require a docstring.
|
||||||
|
no-docstring-rgx=(__.*__|main|test.*|.*test|.*Test)$
|
||||||
|
|
||||||
|
# Minimum line length for functions/classes that require docstrings, shorter
|
||||||
|
# ones are exempt.
|
||||||
|
docstring-min-length=10
|
||||||
|
|
||||||
|
|
||||||
|
[TYPECHECK]
|
||||||
|
|
||||||
|
# List of decorators that produce context managers, such as
|
||||||
|
# contextlib.contextmanager. Add to this list to register other decorators that
|
||||||
|
# produce valid context managers.
|
||||||
|
contextmanager-decorators=contextlib.contextmanager,contextlib2.contextmanager
|
||||||
|
|
||||||
|
# Tells whether missing members accessed in mixin class should be ignored. A
|
||||||
|
# mixin class is detected if its name ends with "mixin" (case insensitive).
|
||||||
|
ignore-mixin-members=yes
|
||||||
|
|
||||||
|
# List of module names for which member attributes should not be checked
|
||||||
|
# (useful for modules/projects where namespaces are manipulated during runtime
|
||||||
|
# and thus existing member attributes cannot be deduced by static analysis. It
|
||||||
|
# supports qualified module names, as well as Unix pattern matching.
|
||||||
|
ignored-modules=
|
||||||
|
|
||||||
|
# List of class names for which member attributes should not be checked (useful
|
||||||
|
# for classes with dynamically set attributes). This supports the use of
|
||||||
|
# qualified names.
|
||||||
|
ignored-classes=optparse.Values,thread._local,_thread._local
|
||||||
|
|
||||||
|
# List of members which are set dynamically and missed by pylint inference
|
||||||
|
# system, and so shouldn't trigger E1101 when accessed. Python regular
|
||||||
|
# expressions are accepted.
|
||||||
|
generated-members=
|
||||||
|
|
||||||
|
|
||||||
|
[FORMAT]
|
||||||
|
|
||||||
|
# Maximum number of characters on a single line.
|
||||||
|
max-line-length=80
|
||||||
|
|
||||||
|
# TODO(https://github.com/PyCQA/pylint/issues/3352): Direct pylint to exempt
|
||||||
|
# lines made too long by directives to pytype.
|
||||||
|
|
||||||
|
# Regexp for a line that is allowed to be longer than the limit.
|
||||||
|
ignore-long-lines=(?x)(
|
||||||
|
^\s*(\#\ )?<?https?://\S+>?$|
|
||||||
|
^\s*(from\s+\S+\s+)?import\s+.+$)
|
||||||
|
|
||||||
|
# Allow the body of an if to be on the same line as the test if there is no
|
||||||
|
# else.
|
||||||
|
single-line-if-stmt=yes
|
||||||
|
|
||||||
|
# List of optional constructs for which whitespace checking is disabled. `dict-
|
||||||
|
# separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}.
|
||||||
|
# `trailing-comma` allows a space between comma and closing bracket: (a, ).
|
||||||
|
# `empty-line` allows space-only lines.
|
||||||
|
no-space-check=
|
||||||
|
|
||||||
|
# Maximum number of lines in a module
|
||||||
|
max-module-lines=99999
|
||||||
|
|
||||||
|
# String used as indentation unit. The internal Google style guide mandates 2
|
||||||
|
# spaces. Google's externaly-published style guide says 4, consistent with
|
||||||
|
# PEP 8. Here, we use 2 spaces, for conformity with many open-sourced Google
|
||||||
|
# projects (like TensorFlow).
|
||||||
|
indent-string=' '
|
||||||
|
|
||||||
|
# Number of spaces of indent required inside a hanging or continued line.
|
||||||
|
indent-after-paren=4
|
||||||
|
|
||||||
|
# Expected format of line ending, e.g. empty (any line ending), LF or CRLF.
|
||||||
|
expected-line-ending-format=
|
||||||
|
|
||||||
|
|
||||||
|
[MISCELLANEOUS]
|
||||||
|
|
||||||
|
# List of note tags to take in consideration, separated by a comma.
|
||||||
|
notes=TODO
|
||||||
|
|
||||||
|
|
||||||
|
[STRING]
|
||||||
|
|
||||||
|
# This flag controls whether inconsistent-quotes generates a warning when the
|
||||||
|
# character used as a quote delimiter is used inconsistently within a module.
|
||||||
|
check-quote-consistency=yes
|
||||||
|
|
||||||
|
|
||||||
|
[VARIABLES]
|
||||||
|
|
||||||
|
# Tells whether we should check for unused import in __init__ files.
|
||||||
|
init-import=no
|
||||||
|
|
||||||
|
# A regular expression matching the name of dummy variables (i.e. expectedly
|
||||||
|
# not used).
|
||||||
|
dummy-variables-rgx=^\*{0,2}(_$|unused_|dummy_)
|
||||||
|
|
||||||
|
# List of additional names supposed to be defined in builtins. Remember that
|
||||||
|
# you should avoid to define new builtins when possible.
|
||||||
|
additional-builtins=
|
||||||
|
|
||||||
|
# List of strings which can identify a callback function by name. A callback
|
||||||
|
# name must start or end with one of those strings.
|
||||||
|
callbacks=cb_,_cb
|
||||||
|
|
||||||
|
# List of qualified module names which can have objects that can redefine
|
||||||
|
# builtins.
|
||||||
|
redefining-builtins-modules=six,six.moves,past.builtins,future.builtins,functools
|
||||||
|
|
||||||
|
|
||||||
|
[LOGGING]
|
||||||
|
|
||||||
|
# Logging modules to check that the string format arguments are in logging
|
||||||
|
# function parameter format
|
||||||
|
logging-modules=logging,absl.logging,tensorflow.io.logging
|
||||||
|
|
||||||
|
|
||||||
|
[SIMILARITIES]
|
||||||
|
|
||||||
|
# Minimum lines number of a similarity.
|
||||||
|
min-similarity-lines=4
|
||||||
|
|
||||||
|
# Ignore comments when computing similarities.
|
||||||
|
ignore-comments=yes
|
||||||
|
|
||||||
|
# Ignore docstrings when computing similarities.
|
||||||
|
ignore-docstrings=yes
|
||||||
|
|
||||||
|
# Ignore imports when computing similarities.
|
||||||
|
ignore-imports=no
|
||||||
|
|
||||||
|
|
||||||
|
[SPELLING]
|
||||||
|
|
||||||
|
# Spelling dictionary name. Available dictionaries: none. To make it working
|
||||||
|
# install python-enchant package.
|
||||||
|
spelling-dict=
|
||||||
|
|
||||||
|
# List of comma separated words that should not be checked.
|
||||||
|
spelling-ignore-words=
|
||||||
|
|
||||||
|
# A path to a file that contains private dictionary; one word per line.
|
||||||
|
spelling-private-dict-file=
|
||||||
|
|
||||||
|
# Tells whether to store unknown words to indicated private dictionary in
|
||||||
|
# --spelling-private-dict-file option instead of raising a message.
|
||||||
|
spelling-store-unknown-words=no
|
||||||
|
|
||||||
|
|
||||||
|
[IMPORTS]
|
||||||
|
|
||||||
|
# Deprecated modules which should not be used, separated by a comma
|
||||||
|
deprecated-modules=regsub,
|
||||||
|
TERMIOS,
|
||||||
|
Bastion,
|
||||||
|
rexec,
|
||||||
|
sets
|
||||||
|
|
||||||
|
# Create a graph of every (i.e. internal and external) dependencies in the
|
||||||
|
# given file (report RP0402 must not be disabled)
|
||||||
|
import-graph=
|
||||||
|
|
||||||
|
# Create a graph of external dependencies in the given file (report RP0402 must
|
||||||
|
# not be disabled)
|
||||||
|
ext-import-graph=
|
||||||
|
|
||||||
|
# Create a graph of internal dependencies in the given file (report RP0402 must
|
||||||
|
# not be disabled)
|
||||||
|
int-import-graph=
|
||||||
|
|
||||||
|
# Force import order to recognize a module as part of the standard
|
||||||
|
# compatibility libraries.
|
||||||
|
known-standard-library=
|
||||||
|
|
||||||
|
# Force import order to recognize a module as part of a third party library.
|
||||||
|
known-third-party=enchant, absl
|
||||||
|
|
||||||
|
# Analyse import fallback blocks. This can be used to support both Python 2 and
|
||||||
|
# 3 compatible code, which means that the block might have code that exists
|
||||||
|
# only in one or another interpreter, leading to false positives when analysed.
|
||||||
|
analyse-fallback-blocks=no
|
||||||
|
|
||||||
|
|
||||||
|
[CLASSES]
|
||||||
|
|
||||||
|
# List of method names used to declare (i.e. assign) instance attributes.
|
||||||
|
defining-attr-methods=__init__,
|
||||||
|
__new__,
|
||||||
|
setUp
|
||||||
|
|
||||||
|
# List of member names, which should be excluded from the protected access
|
||||||
|
# warning.
|
||||||
|
exclude-protected=_asdict,
|
||||||
|
_fields,
|
||||||
|
_replace,
|
||||||
|
_source,
|
||||||
|
_make
|
||||||
|
|
||||||
|
# List of valid names for the first argument in a class method.
|
||||||
|
valid-classmethod-first-arg=cls,
|
||||||
|
class_
|
||||||
|
|
||||||
|
# List of valid names for the first argument in a metaclass class method.
|
||||||
|
valid-metaclass-classmethod-first-arg=mcs
|
||||||
|
|
||||||
|
|
||||||
|
[EXCEPTIONS]
|
||||||
|
|
||||||
|
# Exceptions that will emit a warning when being caught. Defaults to
|
||||||
|
# "Exception"
|
||||||
|
overgeneral-exceptions=StandardError,
|
||||||
|
Exception,
|
||||||
|
BaseException
|
2
.style.yapf
Normal file
2
.style.yapf
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
[style]
|
||||||
|
based_on_style = chromium
|
@ -6,7 +6,7 @@
|
|||||||
# in the file PATENTS. All contributing project authors may
|
# in the file PATENTS. All contributing project authors may
|
||||||
# be found in the AUTHORS file in the root of the source tree.
|
# be found in the AUTHORS file in the root of the source tree.
|
||||||
|
|
||||||
cmake_minimum_required(VERSION 3.5)
|
cmake_minimum_required(VERSION 3.7)
|
||||||
|
|
||||||
if(POLICY CMP0072)
|
if(POLICY CMP0072)
|
||||||
cmake_policy(SET CMP0072 NEW)
|
cmake_policy(SET CMP0072 NEW)
|
||||||
@ -22,6 +22,9 @@ if(NOT EMSCRIPTEN)
|
|||||||
endif()
|
endif()
|
||||||
option(WEBP_ENABLE_SIMD "Enable any SIMD optimization."
|
option(WEBP_ENABLE_SIMD "Enable any SIMD optimization."
|
||||||
${WEBP_ENABLE_SIMD_DEFAULT})
|
${WEBP_ENABLE_SIMD_DEFAULT})
|
||||||
|
# Emscripten supports SSE builds using its compatibility headers, by default it
|
||||||
|
# will use SSE4 if WEBP_ENABLE_WASM_SIMD is OFF and WEBP_ENABLE_SIMD is ON.
|
||||||
|
option(WEBP_ENABLE_WASM_SIMD "Enable WebAssembly SIMD optimizations" OFF)
|
||||||
option(WEBP_BUILD_ANIM_UTILS "Build animation utilities." ON)
|
option(WEBP_BUILD_ANIM_UTILS "Build animation utilities." ON)
|
||||||
option(WEBP_BUILD_CWEBP "Build the cwebp command line tool." ON)
|
option(WEBP_BUILD_CWEBP "Build the cwebp command line tool." ON)
|
||||||
option(WEBP_BUILD_DWEBP "Build the dwebp command line tool." ON)
|
option(WEBP_BUILD_DWEBP "Build the dwebp command line tool." ON)
|
||||||
@ -48,7 +51,6 @@ endif()
|
|||||||
if(WEBP_BUILD_WEBP_JS)
|
if(WEBP_BUILD_WEBP_JS)
|
||||||
set(WEBP_BUILD_ANIM_UTILS OFF)
|
set(WEBP_BUILD_ANIM_UTILS OFF)
|
||||||
set(WEBP_BUILD_CWEBP OFF)
|
set(WEBP_BUILD_CWEBP OFF)
|
||||||
set(WEBP_BUILD_DWEBP OFF)
|
|
||||||
set(WEBP_BUILD_GIF2WEBP OFF)
|
set(WEBP_BUILD_GIF2WEBP OFF)
|
||||||
set(WEBP_BUILD_IMG2WEBP OFF)
|
set(WEBP_BUILD_IMG2WEBP OFF)
|
||||||
set(WEBP_BUILD_VWEBP OFF)
|
set(WEBP_BUILD_VWEBP OFF)
|
||||||
@ -80,6 +82,9 @@ include(GNUInstallDirs)
|
|||||||
if(WEBP_ENABLE_SWAP_16BIT_CSP)
|
if(WEBP_ENABLE_SWAP_16BIT_CSP)
|
||||||
add_definitions(-DWEBP_SWAP_16BIT_CSP=1)
|
add_definitions(-DWEBP_SWAP_16BIT_CSP=1)
|
||||||
endif()
|
endif()
|
||||||
|
if(WEBP_ENABLE_WASM_SIMD)
|
||||||
|
add_definitions(-DWEBP_ENABLE_WASM_SIMD_INTRINSICS)
|
||||||
|
endif()
|
||||||
|
|
||||||
if(NOT WEBP_BITTRACE STREQUAL "0")
|
if(NOT WEBP_BITTRACE STREQUAL "0")
|
||||||
add_definitions(-DBITTRACE=${WEBP_BITTRACE})
|
add_definitions(-DBITTRACE=${WEBP_BITTRACE})
|
||||||
@ -580,7 +585,6 @@ if(WEBP_BUILD_EXTRAS)
|
|||||||
target_link_libraries(get_disto imagedec)
|
target_link_libraries(get_disto imagedec)
|
||||||
target_include_directories(get_disto
|
target_include_directories(get_disto
|
||||||
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
|
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/src
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/src)
|
${CMAKE_CURRENT_BINARY_DIR}/src)
|
||||||
|
|
||||||
# webp_quality
|
# webp_quality
|
||||||
@ -597,7 +601,6 @@ if(WEBP_BUILD_EXTRAS)
|
|||||||
target_link_libraries(vwebp_sdl ${SDL_LIBRARY} imageioutil webp)
|
target_link_libraries(vwebp_sdl ${SDL_LIBRARY} imageioutil webp)
|
||||||
target_include_directories(vwebp_sdl
|
target_include_directories(vwebp_sdl
|
||||||
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
|
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/src
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}
|
${CMAKE_CURRENT_BINARY_DIR}
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/src
|
${CMAKE_CURRENT_BINARY_DIR}/src
|
||||||
${SDL_INCLUDE_DIR})
|
${SDL_INCLUDE_DIR})
|
||||||
|
183
PRESUBMIT.py
Normal file
183
PRESUBMIT.py
Normal file
@ -0,0 +1,183 @@
|
|||||||
|
# Copyright (c) 2021, Google Inc. All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are
|
||||||
|
# met:
|
||||||
|
#
|
||||||
|
# * Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
#
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in
|
||||||
|
# the documentation and/or other materials provided with the
|
||||||
|
# distribution.
|
||||||
|
#
|
||||||
|
# * Neither the name of Google nor the names of its contributors may
|
||||||
|
# be used to endorse or promote products derived from this software
|
||||||
|
# without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
"""Top-level presubmit script for libwebp.
|
||||||
|
|
||||||
|
See https://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts for
|
||||||
|
details on the presubmit API built into depot_tools.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import subprocess2
|
||||||
|
|
||||||
|
USE_PYTHON3 = True
|
||||||
|
_BASH_INDENTATION = "2"
|
||||||
|
_INCLUDE_BASH_FILES_ONLY = [r".*\.sh$"]
|
||||||
|
_INCLUDE_MAN_FILES_ONLY = [r"man/.+\.1$"]
|
||||||
|
_LIBWEBP_MAX_LINE_LENGTH = 80
|
||||||
|
|
||||||
|
|
||||||
|
def _GetFilesToSkip(input_api):
|
||||||
|
return list(input_api.DEFAULT_FILES_TO_SKIP) + [
|
||||||
|
r"swig/.*\.py$",
|
||||||
|
r"\.pylintrc$",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def _RunManCmd(input_api, output_api, man_file):
|
||||||
|
"""man command wrapper."""
|
||||||
|
cmd = ["man", "--warnings", "-EUTF-8", "-l", "-Tutf8", "-Z", man_file]
|
||||||
|
name = "Check %s file." % man_file
|
||||||
|
start = input_api.time.time()
|
||||||
|
output, _ = subprocess2.communicate(
|
||||||
|
cmd, stdout=None, stderr=subprocess2.PIPE, universal_newlines=True)
|
||||||
|
duration = input_api.time.time() - start
|
||||||
|
if output[1]:
|
||||||
|
return output_api.PresubmitError("%s\n%s (%4.2fs) failed\n%s" %
|
||||||
|
(name, " ".join(cmd), duration, output[1]))
|
||||||
|
return output_api.PresubmitResult("%s\n%s (%4.2fs)\n" %
|
||||||
|
(name, " ".join(cmd), duration))
|
||||||
|
|
||||||
|
|
||||||
|
def _RunShellCheckCmd(input_api, output_api, bash_file):
|
||||||
|
"""shellcheck command wrapper."""
|
||||||
|
cmd = ["shellcheck", "-x", "-oall", "-sbash", bash_file]
|
||||||
|
name = "Check %s file." % bash_file
|
||||||
|
start = input_api.time.time()
|
||||||
|
output, rc = subprocess2.communicate(
|
||||||
|
cmd, stdout=None, stderr=subprocess2.PIPE, universal_newlines=True)
|
||||||
|
duration = input_api.time.time() - start
|
||||||
|
if rc == 0:
|
||||||
|
return output_api.PresubmitResult("%s\n%s (%4.2fs)\n" %
|
||||||
|
(name, " ".join(cmd), duration))
|
||||||
|
return output_api.PresubmitError("%s\n%s (%4.2fs) failed\n%s" %
|
||||||
|
(name, " ".join(cmd), duration, output[1]))
|
||||||
|
|
||||||
|
|
||||||
|
def _RunShfmtCheckCmd(input_api, output_api, bash_file):
|
||||||
|
"""shfmt command wrapper."""
|
||||||
|
cmd = [
|
||||||
|
"shfmt", "-i", _BASH_INDENTATION, "-bn", "-ci", "-sr", "-kp", "-d",
|
||||||
|
bash_file
|
||||||
|
]
|
||||||
|
name = "Check %s file." % bash_file
|
||||||
|
start = input_api.time.time()
|
||||||
|
output, rc = subprocess2.communicate(
|
||||||
|
cmd, stdout=None, stderr=subprocess2.PIPE, universal_newlines=True)
|
||||||
|
duration = input_api.time.time() - start
|
||||||
|
if rc == 0:
|
||||||
|
return output_api.PresubmitResult("%s\n%s (%4.2fs)\n" %
|
||||||
|
(name, " ".join(cmd), duration))
|
||||||
|
return output_api.PresubmitError("%s\n%s (%4.2fs) failed\n%s" %
|
||||||
|
(name, " ".join(cmd), duration, output[1]))
|
||||||
|
|
||||||
|
|
||||||
|
def _RunCmdOnCheckedFiles(input_api, output_api, run_cmd, files_to_check):
|
||||||
|
"""Ensure that libwebp/ files are clean."""
|
||||||
|
file_filter = lambda x: input_api.FilterSourceFile(
|
||||||
|
x, files_to_check=files_to_check, files_to_skip=None)
|
||||||
|
|
||||||
|
affected_files = input_api.change.AffectedFiles(file_filter=file_filter)
|
||||||
|
results = [
|
||||||
|
run_cmd(input_api, output_api, f.AbsoluteLocalPath())
|
||||||
|
for f in affected_files
|
||||||
|
]
|
||||||
|
return results
|
||||||
|
|
||||||
|
|
||||||
|
def _CommonChecks(input_api, output_api):
|
||||||
|
"""Ensures this patch does not have trailing spaces, extra EOLs,
|
||||||
|
or long lines.
|
||||||
|
"""
|
||||||
|
results = []
|
||||||
|
results.extend(
|
||||||
|
input_api.canned_checks.CheckChangeHasNoCrAndHasOnlyOneEol(
|
||||||
|
input_api, output_api))
|
||||||
|
results.extend(
|
||||||
|
input_api.canned_checks.CheckChangeHasNoTabs(input_api, output_api))
|
||||||
|
results.extend(
|
||||||
|
input_api.canned_checks.CheckChangeHasNoStrayWhitespace(
|
||||||
|
input_api, output_api))
|
||||||
|
|
||||||
|
source_file_filter = lambda x: input_api.FilterSourceFile(
|
||||||
|
x, files_to_skip=_GetFilesToSkip(input_api))
|
||||||
|
results.extend(
|
||||||
|
input_api.canned_checks.CheckLongLines(
|
||||||
|
input_api,
|
||||||
|
output_api,
|
||||||
|
maxlen=_LIBWEBP_MAX_LINE_LENGTH,
|
||||||
|
source_file_filter=source_file_filter))
|
||||||
|
|
||||||
|
results.extend(
|
||||||
|
input_api.canned_checks.CheckPatchFormatted(
|
||||||
|
input_api,
|
||||||
|
output_api,
|
||||||
|
check_clang_format=False,
|
||||||
|
check_python=True,
|
||||||
|
result_factory=output_api.PresubmitError))
|
||||||
|
results.extend(
|
||||||
|
_RunCmdOnCheckedFiles(input_api, output_api, _RunManCmd,
|
||||||
|
_INCLUDE_MAN_FILES_ONLY))
|
||||||
|
# Run pylint.
|
||||||
|
results.extend(
|
||||||
|
input_api.canned_checks.RunPylint(
|
||||||
|
input_api,
|
||||||
|
output_api,
|
||||||
|
files_to_skip=_GetFilesToSkip(input_api),
|
||||||
|
pylintrc=".pylintrc",
|
||||||
|
version="2.7"))
|
||||||
|
|
||||||
|
# Binaries shellcheck and shfmt are not installed in depot_tools.
|
||||||
|
# Installation is needed
|
||||||
|
try:
|
||||||
|
subprocess2.communicate(["shellcheck", "--version"])
|
||||||
|
results.extend(
|
||||||
|
_RunCmdOnCheckedFiles(input_api, output_api, _RunShellCheckCmd,
|
||||||
|
_INCLUDE_BASH_FILES_ONLY))
|
||||||
|
print("shfmt")
|
||||||
|
subprocess2.communicate(["shfmt", "-version"])
|
||||||
|
results.extend(
|
||||||
|
_RunCmdOnCheckedFiles(input_api, output_api, _RunShfmtCheckCmd,
|
||||||
|
_INCLUDE_BASH_FILES_ONLY))
|
||||||
|
except OSError as os_error:
|
||||||
|
results.append(
|
||||||
|
output_api.PresubmitPromptWarning(
|
||||||
|
"%s\nPlease install missing binaries locally." % os_error.args[0]))
|
||||||
|
return results
|
||||||
|
|
||||||
|
|
||||||
|
def CheckChangeOnUpload(input_api, output_api):
|
||||||
|
results = []
|
||||||
|
results.extend(_CommonChecks(input_api, output_api))
|
||||||
|
return results
|
||||||
|
|
||||||
|
|
||||||
|
def CheckChangeOnCommit(input_api, output_api):
|
||||||
|
results = []
|
||||||
|
results.extend(_CommonChecks(input_api, output_api))
|
||||||
|
return results
|
11
README.mux
11
README.mux
@ -43,11 +43,12 @@ GET_OPTIONS:
|
|||||||
frame n get nth frame
|
frame n get nth frame
|
||||||
|
|
||||||
SET_OPTIONS:
|
SET_OPTIONS:
|
||||||
Set color profile/metadata:
|
Set color profile/metadata/parameters:
|
||||||
loop LOOP_COUNT set the loop count
|
loop LOOP_COUNT set the loop count
|
||||||
icc file.icc set ICC profile
|
bgcolor BACKGROUND_COLOR set the animation background color
|
||||||
exif file.exif set EXIF metadata
|
icc file.icc set ICC profile
|
||||||
xmp file.xmp set XMP metadata
|
exif file.exif set EXIF metadata
|
||||||
|
xmp file.xmp set XMP metadata
|
||||||
where: 'file.icc' contains the ICC profile to be set,
|
where: 'file.icc' contains the ICC profile to be set,
|
||||||
'file.exif' contains the EXIF metadata to be set
|
'file.exif' contains the EXIF metadata to be set
|
||||||
'file.xmp' contains the XMP metadata to be set
|
'file.xmp' contains the XMP metadata to be set
|
||||||
|
@ -108,6 +108,9 @@
|
|||||||
/* Set to 1 if JPEG library is installed */
|
/* Set to 1 if JPEG library is installed */
|
||||||
#cmakedefine WEBP_HAVE_JPEG 1
|
#cmakedefine WEBP_HAVE_JPEG 1
|
||||||
|
|
||||||
|
/* Set to 1 if Wasm SIMD is supported */
|
||||||
|
#cmakedefine WEBP_HAVE_WASM_SIMD
|
||||||
|
|
||||||
/* Set to 1 if NEON is supported */
|
/* Set to 1 if NEON is supported */
|
||||||
#cmakedefine WEBP_HAVE_NEON
|
#cmakedefine WEBP_HAVE_NEON
|
||||||
|
|
||||||
|
@ -36,9 +36,9 @@ function(webp_check_compiler_flag WEBP_SIMD_FLAG ENABLE_SIMD)
|
|||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
# those are included in the names of WEBP_USE_* in c++ code.
|
# those are included in the names of WEBP_USE_* in c++ code.
|
||||||
set(WEBP_SIMD_FLAGS "SSE41;SSE2;MIPS32;MIPS_DSP_R2;NEON;MSA")
|
set(WEBP_SIMD_FLAGS "WASM_SIMD;SSE41;SSE2;MIPS32;MIPS_DSP_R2;NEON;MSA")
|
||||||
set(WEBP_SIMD_FILE_EXTENSIONS
|
set(WEBP_SIMD_FILE_EXTENSIONS
|
||||||
"_sse41.c;_sse2.c;_mips32.c;_mips_dsp_r2.c;_neon.c;_msa.c")
|
"_wasm.c;_sse41.c;_sse2.c;_mips32.c;_mips_dsp_r2.c;_neon.c;_msa.c")
|
||||||
if(MSVC AND CMAKE_C_COMPILER_ID STREQUAL "MSVC")
|
if(MSVC AND CMAKE_C_COMPILER_ID STREQUAL "MSVC")
|
||||||
# With at least Visual Studio 12 (2013)+ /arch is not necessary to build SSE2
|
# With at least Visual Studio 12 (2013)+ /arch is not necessary to build SSE2
|
||||||
# or SSE4 code unless a lesser /arch is forced. MSVC does not have a SSE4
|
# or SSE4 code unless a lesser /arch is forced. MSVC does not have a SSE4
|
||||||
@ -53,9 +53,9 @@ if(MSVC AND CMAKE_C_COMPILER_ID STREQUAL "MSVC")
|
|||||||
set(SIMD_DISABLE_FLAGS)
|
set(SIMD_DISABLE_FLAGS)
|
||||||
else()
|
else()
|
||||||
set(SIMD_ENABLE_FLAGS
|
set(SIMD_ENABLE_FLAGS
|
||||||
"-msse4.1;-msse2;-mips32;-mdspr2;-mfpu=neon;-mmsa")
|
"-msimd128;-msse4.1;-msse2;-mips32;-mdspr2;-mfpu=neon;-mmsa")
|
||||||
set(SIMD_DISABLE_FLAGS
|
set(SIMD_DISABLE_FLAGS
|
||||||
"-mno-sse4.1;-mno-sse2;;-mno-dspr2;;-mno-msa")
|
"-mno-simd128;-mno-sse4.1;-mno-sse2;;-mno-dspr2;;-mno-msa")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(WEBP_SIMD_FILES_TO_NOT_INCLUDE)
|
set(WEBP_SIMD_FILES_TO_NOT_INCLUDE)
|
||||||
@ -77,7 +77,12 @@ math(EXPR WEBP_SIMD_FLAGS_RANGE "${WEBP_SIMD_FLAGS_LENGTH} - 1")
|
|||||||
foreach(I_SIMD RANGE ${WEBP_SIMD_FLAGS_RANGE})
|
foreach(I_SIMD RANGE ${WEBP_SIMD_FLAGS_RANGE})
|
||||||
# With Emscripten 2.0.9 -msimd128 -mfpu=neon will enable NEON, but the
|
# With Emscripten 2.0.9 -msimd128 -mfpu=neon will enable NEON, but the
|
||||||
# source will fail to compile.
|
# source will fail to compile.
|
||||||
if(EMSCRIPTEN AND ${I_SIMD} GREATER_EQUAL 2)
|
if(EMSCRIPTEN AND ${I_SIMD} GREATER_EQUAL 5)
|
||||||
|
break()
|
||||||
|
endif()
|
||||||
|
# Emscripten supports SSE via compat headers, if WEBP_ENABLED_WASM_SIMD is
|
||||||
|
# specified skip testing those (because it will succeed).
|
||||||
|
if (EMSCRIPTEN AND ${I_SIMD} GREATER_EQUAL 1 AND ${WEBP_ENABLE_WASM_SIMD})
|
||||||
break()
|
break()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@ -91,6 +96,7 @@ foreach(I_SIMD RANGE ${WEBP_SIMD_FLAGS_RANGE})
|
|||||||
webp_check_compiler_flag(${WEBP_SIMD_FLAG} ${WEBP_ENABLE_SIMD})
|
webp_check_compiler_flag(${WEBP_SIMD_FLAG} ${WEBP_ENABLE_SIMD})
|
||||||
if(NOT WEBP_HAVE_${WEBP_SIMD_FLAG})
|
if(NOT WEBP_HAVE_${WEBP_SIMD_FLAG})
|
||||||
list(GET SIMD_ENABLE_FLAGS ${I_SIMD} SIMD_COMPILE_FLAG)
|
list(GET SIMD_ENABLE_FLAGS ${I_SIMD} SIMD_COMPILE_FLAG)
|
||||||
|
# This enables using Emscripten's SSE compatibility headers.
|
||||||
if(EMSCRIPTEN)
|
if(EMSCRIPTEN)
|
||||||
set(SIMD_COMPILE_FLAG "-msimd128 ${SIMD_COMPILE_FLAG}")
|
set(SIMD_COMPILE_FLAG "-msimd128 ${SIMD_COMPILE_FLAG}")
|
||||||
endif()
|
endif()
|
||||||
|
@ -53,10 +53,6 @@ document are to be interpreted as described in [RFC 2119][].
|
|||||||
Bit numbering in chunk diagrams starts at `0` for the most significant bit
|
Bit numbering in chunk diagrams starts at `0` for the most significant bit
|
||||||
('MSB 0') as described in [RFC 1166][].
|
('MSB 0') as described in [RFC 1166][].
|
||||||
|
|
||||||
**Note:** Out of the features mentioned above, lossy compression, lossless
|
|
||||||
compression, transparency, metadata, color profile and animation are finalized
|
|
||||||
and are to be considered stable.
|
|
||||||
|
|
||||||
Terminology & Basics
|
Terminology & Basics
|
||||||
------------------------
|
------------------------
|
||||||
|
|
||||||
@ -269,7 +265,7 @@ An extended format file consists of:
|
|||||||
|
|
||||||
* An optional 'XMP ' chunk with XMP metadata.
|
* An optional 'XMP ' chunk with XMP metadata.
|
||||||
|
|
||||||
* An optional list of [unknown chunks](#unknown-chunks). _\[status: experimental\]_
|
* An optional list of [unknown chunks](#unknown-chunks).
|
||||||
|
|
||||||
For a _still image_, the _image data_ consists of a single frame, which is made
|
For a _still image_, the _image data_ consists of a single frame, which is made
|
||||||
up of:
|
up of:
|
||||||
@ -705,7 +701,7 @@ XMP Metadata: _Chunk Size_ bytes
|
|||||||
Additional guidance about handling metadata can be found in the
|
Additional guidance about handling metadata can be found in the
|
||||||
Metadata Working Group's [Guidelines for Handling Metadata][metadata].
|
Metadata Working Group's [Guidelines for Handling Metadata][metadata].
|
||||||
|
|
||||||
#### Unknown Chunks _\[status: experimental\]_
|
#### Unknown Chunks
|
||||||
|
|
||||||
A RIFF chunk (described in [this](#terminology-amp-basics) section) whose _chunk
|
A RIFF chunk (described in [this](#terminology-amp-basics) section) whose _chunk
|
||||||
tag_ is different from any of the chunks described in this document, is
|
tag_ is different from any of the chunks described in this document, is
|
||||||
|
@ -41,6 +41,7 @@
|
|||||||
if (webp_info->show_diagnosis_) { \
|
if (webp_info->show_diagnosis_) { \
|
||||||
fprintf(stderr, "Warning: %s\n", MESSAGE); \
|
fprintf(stderr, "Warning: %s\n", MESSAGE); \
|
||||||
} \
|
} \
|
||||||
|
++webp_info->num_warnings_; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
static const char* const kFormats[3] = {
|
static const char* const kFormats[3] = {
|
||||||
@ -116,6 +117,7 @@ typedef struct WebPInfo {
|
|||||||
int is_processing_anim_frame_, seen_alpha_subchunk_, seen_image_subchunk_;
|
int is_processing_anim_frame_, seen_alpha_subchunk_, seen_image_subchunk_;
|
||||||
// Print output control.
|
// Print output control.
|
||||||
int quiet_, show_diagnosis_, show_summary_;
|
int quiet_, show_diagnosis_, show_summary_;
|
||||||
|
int num_warnings_;
|
||||||
int parse_bitstream_;
|
int parse_bitstream_;
|
||||||
} WebPInfo;
|
} WebPInfo;
|
||||||
|
|
||||||
@ -580,7 +582,7 @@ static WebPInfoStatus ParseAlphaHeader(const ChunkData* const chunk_data,
|
|||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
// Chunk parsing.
|
// Chunk parsing.
|
||||||
|
|
||||||
static WebPInfoStatus ParseRIFFHeader(const WebPInfo* const webp_info,
|
static WebPInfoStatus ParseRIFFHeader(WebPInfo* const webp_info,
|
||||||
MemBuffer* const mem) {
|
MemBuffer* const mem) {
|
||||||
const size_t min_size = RIFF_HEADER_SIZE + CHUNK_HEADER_SIZE;
|
const size_t min_size = RIFF_HEADER_SIZE + CHUNK_HEADER_SIZE;
|
||||||
size_t riff_size;
|
size_t riff_size;
|
||||||
@ -988,7 +990,7 @@ static WebPInfoStatus ProcessChunk(const ChunkData* const chunk_data,
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
static WebPInfoStatus Validate(const WebPInfo* const webp_info) {
|
static WebPInfoStatus Validate(WebPInfo* const webp_info) {
|
||||||
if (webp_info->num_frames_ < 1) {
|
if (webp_info->num_frames_ < 1) {
|
||||||
LOG_ERROR("No image/frame detected.");
|
LOG_ERROR("No image/frame detected.");
|
||||||
return WEBP_INFO_MISSING_DATA;
|
return WEBP_INFO_MISSING_DATA;
|
||||||
@ -1093,16 +1095,14 @@ static WebPInfoStatus AnalyzeWebP(WebPInfo* const webp_info,
|
|||||||
} else {
|
} else {
|
||||||
printf("Errors detected.\n");
|
printf("Errors detected.\n");
|
||||||
}
|
}
|
||||||
|
if (webp_info->num_warnings_ > 0) {
|
||||||
|
printf("There were %d warning(s).\n", webp_info->num_warnings_);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return webp_info_status;
|
return webp_info_status;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void HelpShort(void) {
|
static void Help(void) {
|
||||||
printf("Usage: webpinfo [options] in_files\n"
|
|
||||||
"Try -longhelp for an exhaustive list of options.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void HelpLong(void) {
|
|
||||||
printf("Usage: webpinfo [options] in_files\n"
|
printf("Usage: webpinfo [options] in_files\n"
|
||||||
"Note: there could be multiple input files;\n"
|
"Note: there could be multiple input files;\n"
|
||||||
" options must come before input files.\n"
|
" options must come before input files.\n"
|
||||||
@ -1123,17 +1123,15 @@ int main(int argc, const char* argv[]) {
|
|||||||
INIT_WARGV(argc, argv);
|
INIT_WARGV(argc, argv);
|
||||||
|
|
||||||
if (argc == 1) {
|
if (argc == 1) {
|
||||||
HelpShort();
|
Help();
|
||||||
FREE_WARGV_AND_RETURN(WEBP_INFO_OK);
|
FREE_WARGV_AND_RETURN(WEBP_INFO_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse command-line input.
|
// Parse command-line input.
|
||||||
for (c = 1; c < argc; ++c) {
|
for (c = 1; c < argc; ++c) {
|
||||||
if (!strcmp(argv[c], "-h") || !strcmp(argv[c], "-help")) {
|
if (!strcmp(argv[c], "-h") || !strcmp(argv[c], "-help") ||
|
||||||
HelpShort();
|
!strcmp(argv[c], "-H") || !strcmp(argv[c], "-longhelp")) {
|
||||||
FREE_WARGV_AND_RETURN(WEBP_INFO_OK);
|
Help();
|
||||||
} else if (!strcmp(argv[c], "-H") || !strcmp(argv[c], "-longhelp")) {
|
|
||||||
HelpLong();
|
|
||||||
FREE_WARGV_AND_RETURN(WEBP_INFO_OK);
|
FREE_WARGV_AND_RETURN(WEBP_INFO_OK);
|
||||||
} else if (!strcmp(argv[c], "-quiet")) {
|
} else if (!strcmp(argv[c], "-quiet")) {
|
||||||
quiet = 1;
|
quiet = 1;
|
||||||
@ -1154,7 +1152,7 @@ int main(int argc, const char* argv[]) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (c == argc) {
|
if (c == argc) {
|
||||||
HelpShort();
|
Help();
|
||||||
FREE_WARGV_AND_RETURN(WEBP_INFO_INVALID_COMMAND);
|
FREE_WARGV_AND_RETURN(WEBP_INFO_INVALID_COMMAND);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -99,6 +99,7 @@ typedef enum {
|
|||||||
FEATURE_ANMF,
|
FEATURE_ANMF,
|
||||||
FEATURE_DURATION,
|
FEATURE_DURATION,
|
||||||
FEATURE_LOOP,
|
FEATURE_LOOP,
|
||||||
|
FEATURE_BGCOLOR,
|
||||||
LAST_FEATURE
|
LAST_FEATURE
|
||||||
} FeatureType;
|
} FeatureType;
|
||||||
|
|
||||||
@ -315,11 +316,12 @@ static void PrintHelp(void) {
|
|||||||
|
|
||||||
printf("\n");
|
printf("\n");
|
||||||
printf("SET_OPTIONS:\n");
|
printf("SET_OPTIONS:\n");
|
||||||
printf(" Set color profile/metadata:\n");
|
printf(" Set color profile/metadata/parameters:\n");
|
||||||
printf(" loop LOOP_COUNT set the loop count\n");
|
printf(" loop LOOP_COUNT set the loop count\n");
|
||||||
printf(" icc file.icc set ICC profile\n");
|
printf(" bgcolor BACKGROUND_COLOR set the animation background color\n");
|
||||||
printf(" exif file.exif set EXIF metadata\n");
|
printf(" icc file.icc set ICC profile\n");
|
||||||
printf(" xmp file.xmp set XMP metadata\n");
|
printf(" exif file.exif set EXIF metadata\n");
|
||||||
|
printf(" xmp file.xmp set XMP metadata\n");
|
||||||
printf(" where: 'file.icc' contains the ICC profile to be set,\n");
|
printf(" where: 'file.icc' contains the ICC profile to be set,\n");
|
||||||
printf(" 'file.exif' contains the EXIF metadata to be set\n");
|
printf(" 'file.exif' contains the EXIF metadata to be set\n");
|
||||||
printf(" 'file.xmp' contains the XMP metadata to be set\n");
|
printf(" 'file.xmp' contains the XMP metadata to be set\n");
|
||||||
@ -778,6 +780,13 @@ static int ParseCommandLine(Config* config, const W_CHAR** const unicode_argv) {
|
|||||||
arg->params_ = argv[i + 1];
|
arg->params_ = argv[i + 1];
|
||||||
++feature_arg_index;
|
++feature_arg_index;
|
||||||
i += 2;
|
i += 2;
|
||||||
|
} else if (!strcmp(argv[i], "bgcolor") &&
|
||||||
|
(config->action_type_ == ACTION_SET)) {
|
||||||
|
CHECK_NUM_ARGS_AT_LEAST(2, ErrParse);
|
||||||
|
config->type_ = FEATURE_BGCOLOR;
|
||||||
|
arg->params_ = argv[i + 1];
|
||||||
|
++feature_arg_index;
|
||||||
|
i += 2;
|
||||||
} else { // Assume input file.
|
} else { // Assume input file.
|
||||||
if (config->input_ == NULL) {
|
if (config->input_ == NULL) {
|
||||||
config->input_ = wargv[i];
|
config->input_ = wargv[i];
|
||||||
@ -1053,6 +1062,30 @@ static int Process(const Config* config) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case FEATURE_BGCOLOR: {
|
||||||
|
WebPMuxAnimParams params = { 0xFFFFFFFF, 0 };
|
||||||
|
uint32_t bgcolor;
|
||||||
|
ok = ParseBgcolorArgs(config->args_[0].params_, &bgcolor);
|
||||||
|
if (!ok) {
|
||||||
|
ERROR_GOTO1("ERROR: Could not parse the background color.\n",
|
||||||
|
Err2);
|
||||||
|
}
|
||||||
|
ok = CreateMux(config->input_, &mux);
|
||||||
|
if (!ok) goto Err2;
|
||||||
|
ok = (WebPMuxGetAnimationParams(mux, ¶ms) == WEBP_MUX_OK);
|
||||||
|
if (!ok) {
|
||||||
|
ERROR_GOTO1("ERROR: input file does not seem to be an animation.\n",
|
||||||
|
Err2);
|
||||||
|
}
|
||||||
|
params.bgcolor = bgcolor;
|
||||||
|
err = WebPMuxSetAnimationParams(mux, ¶ms);
|
||||||
|
ok = (err == WEBP_MUX_OK);
|
||||||
|
if (!ok) {
|
||||||
|
ERROR_GOTO2("ERROR (%s): Could not set animation parameters.\n",
|
||||||
|
ErrorString(err), Err2);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
default: {
|
default: {
|
||||||
ERROR_GOTO1("ERROR: Invalid feature for action 'set'.\n", Err2);
|
ERROR_GOTO1("ERROR: Invalid feature for action 'set'.\n", Err2);
|
||||||
break;
|
break;
|
||||||
|
@ -46,7 +46,7 @@ static int ExtractMetadataFromTIFF(TIFF* const tif, Metadata* const metadata) {
|
|||||||
(MetadataPayload*)((uint8_t*)metadata +
|
(MetadataPayload*)((uint8_t*)metadata +
|
||||||
kTIFFMetadataMap[i].storage_offset);
|
kTIFFMetadataMap[i].storage_offset);
|
||||||
void* tag_data;
|
void* tag_data;
|
||||||
uint32 tag_data_len;
|
uint32_t tag_data_len;
|
||||||
|
|
||||||
if (TIFFGetField(tif, kTIFFMetadataMap[i].tag, &tag_data_len, &tag_data) &&
|
if (TIFFGetField(tif, kTIFFMetadataMap[i].tag, &tag_data_len, &tag_data) &&
|
||||||
!MetadataCopy((const char*)tag_data, tag_data_len, payload)) {
|
!MetadataCopy((const char*)tag_data, tag_data_len, payload)) {
|
||||||
@ -230,7 +230,7 @@ int ReadTIFF(const uint8_t* const data, size_t data_size,
|
|||||||
alloc_size = (int64_t)(stride * image_height);
|
alloc_size = (int64_t)(stride * image_height);
|
||||||
if (alloc_size < 0 || alloc_size != (tsize_t)alloc_size) goto End;
|
if (alloc_size < 0 || alloc_size != (tsize_t)alloc_size) goto End;
|
||||||
|
|
||||||
raster = (uint32*)_TIFFmalloc((tsize_t)alloc_size);
|
raster = (uint32_t*)_TIFFmalloc((tsize_t)alloc_size);
|
||||||
if (raster != NULL) {
|
if (raster != NULL) {
|
||||||
if (TIFFReadRGBAImageOriented(tif, image_width, image_height, raster,
|
if (TIFFReadRGBAImageOriented(tif, image_width, image_height, raster,
|
||||||
ORIENTATION_TOPLEFT, 1)) {
|
ORIENTATION_TOPLEFT, 1)) {
|
||||||
|
106
infra/common.sh
Normal file
106
infra/common.sh
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
# Copyright (c) 2021, Google Inc. All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are
|
||||||
|
# met:
|
||||||
|
#
|
||||||
|
# * Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
#
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in
|
||||||
|
# the documentation and/or other materials provided with the
|
||||||
|
# distribution.
|
||||||
|
#
|
||||||
|
# * Neither the name of Google nor the names of its contributors may
|
||||||
|
# be used to endorse or promote products derived from this software
|
||||||
|
# without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
log_err() {
|
||||||
|
echo "[$(date +'%Y-%m-%dT%H:%M:%S%z')]: $*" >&2
|
||||||
|
}
|
||||||
|
|
||||||
|
#######################################
|
||||||
|
# Create build directory. Build directory will be deleted if it exists.
|
||||||
|
# Arguments:
|
||||||
|
# None.
|
||||||
|
# Returns:
|
||||||
|
# mkdir result.
|
||||||
|
#######################################
|
||||||
|
make_build_dir() {
|
||||||
|
if [[ "$#" -ne 1 ]]; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
local build_dir
|
||||||
|
build_dir="$1"
|
||||||
|
rm -rf "${build_dir}"
|
||||||
|
mkdir -p "${build_dir}"
|
||||||
|
}
|
||||||
|
|
||||||
|
#######################################
|
||||||
|
# Cleanup files from the build directory.
|
||||||
|
# Globals:
|
||||||
|
# LIBWEBP_ROOT repository's root path.
|
||||||
|
# Arguments:
|
||||||
|
# $1 build directory.
|
||||||
|
#######################################
|
||||||
|
cleanup() {
|
||||||
|
# $1 is not completely removed to allow for binary artifacts to be
|
||||||
|
# extracted.
|
||||||
|
find "${1:?"Build directory not defined"}" \
|
||||||
|
\( -name "*.[ao]" -o -name "*.l[ao]" \) -exec rm -f {} +
|
||||||
|
}
|
||||||
|
|
||||||
|
#######################################
|
||||||
|
# Setup ccache for toolchain.
|
||||||
|
# Globals:
|
||||||
|
# PATH
|
||||||
|
# Arguments:
|
||||||
|
# None.
|
||||||
|
#######################################
|
||||||
|
setup_ccache() {
|
||||||
|
if [[ -x "$(command -v ccache)" ]]; then
|
||||||
|
export CCACHE_CPP2=yes
|
||||||
|
export PATH="/usr/lib/ccache:${PATH}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
#######################################
|
||||||
|
# Detects whether test block should be run in the current test shard.
|
||||||
|
# Globals:
|
||||||
|
# TEST_TOTAL_SHARDS: Valid range: [1, N]. Defaults to 1.
|
||||||
|
# TEST_SHARD_INDEX: Valid range: [0, TEST_TOTAL_SHARDS). Defaults to 0.
|
||||||
|
# libwebp_test_id: current test number; incremented with each call.
|
||||||
|
# Arguments:
|
||||||
|
# None
|
||||||
|
# Returns:
|
||||||
|
# true if the shard is active
|
||||||
|
# false if the shard is inactive
|
||||||
|
#######################################
|
||||||
|
shard_should_run() {
|
||||||
|
TEST_TOTAL_SHARDS=${TEST_TOTAL_SHARDS:=1}
|
||||||
|
TEST_SHARD_INDEX=${TEST_SHARD_INDEX:=0}
|
||||||
|
libwebp_test_id=${libwebp_test_id:=-1}
|
||||||
|
: $((libwebp_test_id += 1))
|
||||||
|
|
||||||
|
if [[ "${TEST_SHARD_INDEX}" -lt 0 ||
|
||||||
|
"${TEST_SHARD_INDEX}" -ge "${TEST_TOTAL_SHARDS}" ]]; then
|
||||||
|
log_err "Invalid TEST_SHARD_INDEX (${TEST_SHARD_INDEX})!" \
|
||||||
|
"Expected [0, ${TEST_TOTAL_SHARDS})."
|
||||||
|
fi
|
||||||
|
|
||||||
|
[[ "$((libwebp_test_id % TEST_TOTAL_SHARDS))" -eq "${TEST_SHARD_INDEX}" ]]
|
||||||
|
}
|
401
infra/compile.sh
Executable file
401
infra/compile.sh
Executable file
@ -0,0 +1,401 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Copyright (c) 2021, Google Inc. All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are
|
||||||
|
# met:
|
||||||
|
#
|
||||||
|
# * Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
#
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in
|
||||||
|
# the documentation and/or other materials provided with the
|
||||||
|
# distribution.
|
||||||
|
#
|
||||||
|
# * Neither the name of Google nor the names of its contributors may
|
||||||
|
# be used to endorse or promote products derived from this software
|
||||||
|
# without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
set -xe
|
||||||
|
LIBWEBP_ROOT="$(realpath "$(dirname "$0")/..")"
|
||||||
|
WORKSPACE=${WORKSPACE:-"$(mktemp -d -t webp.XXX)"}
|
||||||
|
|
||||||
|
# shellcheck source=infra/common.sh
|
||||||
|
source "${LIBWEBP_ROOT}/infra/common.sh"
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
cat << EOF
|
||||||
|
Usage: compile.sh BUILD_TYPE TARGET
|
||||||
|
Options:
|
||||||
|
BUILD_TYPE supported build type: (shared, static, static-debug)
|
||||||
|
TARGET supported target platforms:
|
||||||
|
aarch64-linux-clang
|
||||||
|
aarch64-linux-gnu
|
||||||
|
arm-linux-gnueabi
|
||||||
|
arm-neon-linux-gnueabi
|
||||||
|
cmake
|
||||||
|
cmake-aarch64
|
||||||
|
cmake-arm
|
||||||
|
cmake-clang
|
||||||
|
disable-near-lossless
|
||||||
|
disable-sse4.1
|
||||||
|
disable-stats
|
||||||
|
force-aligned-32
|
||||||
|
force-aligned-64
|
||||||
|
gradle
|
||||||
|
i686-linux-asan
|
||||||
|
i686-linux-clang
|
||||||
|
i686-linux-gnu
|
||||||
|
i686-w64-mingw32
|
||||||
|
mips2el-linux-gnu
|
||||||
|
mips32dspr2el-linux-gnu
|
||||||
|
mips32eb-linux-gnu
|
||||||
|
mips32el-linux-gnu
|
||||||
|
mips32r2el-linux-gnu
|
||||||
|
mips32r5el-linux-gnu
|
||||||
|
mips64r2el-linux-gnu
|
||||||
|
mips64r6el-linux-gnu
|
||||||
|
native
|
||||||
|
reduce-csp
|
||||||
|
reduce-size
|
||||||
|
reduce-size-disable-stats
|
||||||
|
visibility-default-gnu
|
||||||
|
visibility-hidden-clang
|
||||||
|
visibility-hidden-gnu
|
||||||
|
wasm
|
||||||
|
x86_64-linux-clang
|
||||||
|
x86_64-linux-gnu
|
||||||
|
x86_64-linux-msan
|
||||||
|
x86_64-w64-mingw32
|
||||||
|
Environment variables:
|
||||||
|
WORKSPACE directory where the build is done
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
echo "Building libwebp in ${WORKSPACE}"
|
||||||
|
|
||||||
|
if [[ ! -d "${WORKSPACE}" ]]; then
|
||||||
|
log_err "${WORKSPACE} directory does not exist"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
BUILD_TYPE=${1:?"Build type not defined.$(
|
||||||
|
echo
|
||||||
|
usage
|
||||||
|
)"}
|
||||||
|
TARGET=${2:?"Target not defined.$(
|
||||||
|
echo
|
||||||
|
usage
|
||||||
|
)"}
|
||||||
|
readonly BUILD_DIR="${WORKSPACE}/build-${BUILD_TYPE}"
|
||||||
|
|
||||||
|
trap 'cleanup ${BUILD_DIR}' EXIT
|
||||||
|
make_build_dir "${BUILD_DIR}"
|
||||||
|
|
||||||
|
config_flags=()
|
||||||
|
case "${BUILD_TYPE}" in
|
||||||
|
shared*) ;; # Valid BUILD_TYPE but no setup required
|
||||||
|
static*) config_flags+=("--disable-shared") ;;
|
||||||
|
experimental) config_flags+=("--enable-experimental") ;;
|
||||||
|
*)
|
||||||
|
log_err "Invalid BUILD_TYPE"
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if grep -m 1 -q "enable-asserts" "${LIBWEBP_ROOT}/configure.ac"; then
|
||||||
|
config_flags+=("--enable-asserts")
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "${TARGET}" in
|
||||||
|
aarch64-linux-clang)
|
||||||
|
TARGET="aarch64-linux-gnu"
|
||||||
|
CC="clang"
|
||||||
|
CC="${CC} --target=aarch64-linux-gnu"
|
||||||
|
export CC
|
||||||
|
export CFLAGS="-isystem /usr/aarch64-linux-gnu/include"
|
||||||
|
;;
|
||||||
|
arm-linux-gnueabi)
|
||||||
|
export CFLAGS="-O3 -march=armv7-a -mfloat-abi=softfp -ftree-vectorize"
|
||||||
|
;;
|
||||||
|
arm-neon-linux-gnueabi)
|
||||||
|
TARGET="arm-linux-gnueabi"
|
||||||
|
CFLAGS="-O3 -march=armv7-a -mfpu=neon -mfloat-abi=softfp -ftree-vectorize"
|
||||||
|
export CFLAGS
|
||||||
|
;;
|
||||||
|
mips2el-linux-gnu)
|
||||||
|
export CFLAGS="-EL -O2 -mips2"
|
||||||
|
TARGET="mipsel-linux-gnu"
|
||||||
|
;;
|
||||||
|
mips32el-linux-gnu)
|
||||||
|
export CFLAGS="-EL -O2 -mips32"
|
||||||
|
TARGET="mipsel-linux-gnu"
|
||||||
|
;;
|
||||||
|
mips32r2el-linux-gnu)
|
||||||
|
export CFLAGS="-EL -O2 -mips32r2"
|
||||||
|
TARGET="mipsel-linux-gnu"
|
||||||
|
;;
|
||||||
|
mips32dspr2el-linux-gnu)
|
||||||
|
export CFLAGS="-EL -O2 -mdspr2"
|
||||||
|
TARGET="mipsel-linux-gnu"
|
||||||
|
;;
|
||||||
|
mips32r5el-linux-gnu)
|
||||||
|
export CFLAGS="-EL -O2 -mips32r5 -mmsa"
|
||||||
|
TARGET="mipsel-linux-gnu"
|
||||||
|
;;
|
||||||
|
mips32eb-linux-gnu)
|
||||||
|
export CFLAGS="-EB -O2 -mips32"
|
||||||
|
TARGET="mips-linux-gnu"
|
||||||
|
;;
|
||||||
|
mips64r2el-linux-gnu)
|
||||||
|
export CFLAGS="-EL -O2 -mips64r2 -mabi=64"
|
||||||
|
TARGET="mips64el-linux-gnuabi64"
|
||||||
|
;;
|
||||||
|
mips64r6el-linux-gnu)
|
||||||
|
export CFLAGS="-EL -O2 -mips64r6 -mabi=64 -mmsa"
|
||||||
|
TARGET="mips-img-linux-gnu"
|
||||||
|
;;
|
||||||
|
i686-linux-gnu)
|
||||||
|
export CC="gcc -m32"
|
||||||
|
;;
|
||||||
|
i686-linux-clang)
|
||||||
|
TARGET="i686-linux-gnu"
|
||||||
|
export CC="clang -m32"
|
||||||
|
;;
|
||||||
|
i686-linux-asan)
|
||||||
|
TARGET="i686-linux-gnu"
|
||||||
|
export CC="clang -m32 -fsanitize=address"
|
||||||
|
;;
|
||||||
|
i686-linux-msan)
|
||||||
|
TARGET="i686-linux-gnu"
|
||||||
|
export CC="clang -m32 -fsanitize=memory"
|
||||||
|
;;
|
||||||
|
x86_64-linux-clang)
|
||||||
|
TARGET="x86_64-linux-gnu"
|
||||||
|
export CC=clang
|
||||||
|
;;
|
||||||
|
x86_64-linux-msan)
|
||||||
|
TARGET="x86_64-linux-gnu"
|
||||||
|
export CC="clang -fsanitize=memory"
|
||||||
|
;;
|
||||||
|
force-aligned-32)
|
||||||
|
config_flags+=("--enable-aligned")
|
||||||
|
TARGET="i686-linux-gnu"
|
||||||
|
export CC="gcc -m32"
|
||||||
|
;;
|
||||||
|
force-aligned-64)
|
||||||
|
config_flags+=("--enable-aligned")
|
||||||
|
TARGET="x86_64-linux-gnu"
|
||||||
|
;;
|
||||||
|
visibility-default-*)
|
||||||
|
export CFLAGS="-O2 -g -fvisibility=default"
|
||||||
|
TARGET="x86_64-linux-gnu"
|
||||||
|
;;
|
||||||
|
visibility-hidden-*)
|
||||||
|
export CFLAGS="-O2 -g -fvisibility=hidden"
|
||||||
|
if [[ "${TARGET}" = "visibility-hidden-clang" ]]; then
|
||||||
|
export CC=clang
|
||||||
|
fi
|
||||||
|
TARGET="x86_64-linux-gnu"
|
||||||
|
;;
|
||||||
|
disable-sse4.1)
|
||||||
|
grep "${TARGET}" "${LIBWEBP_ROOT}/configure.ac" || exit 0
|
||||||
|
config_flags+=("--${TARGET}")
|
||||||
|
TARGET="x86_64-linux-gnu"
|
||||||
|
;;
|
||||||
|
disable-near-lossless)
|
||||||
|
grep "${TARGET}" "${LIBWEBP_ROOT}/configure.ac" || exit 0
|
||||||
|
config_flags+=("--${TARGET}")
|
||||||
|
TARGET="x86_64-linux-gnu"
|
||||||
|
;;
|
||||||
|
disable-stats)
|
||||||
|
git -C "${LIBWEBP_ROOT}" grep WEBP_DISABLE_STATS || exit 0
|
||||||
|
export CFLAGS="-O2 -g -DWEBP_DISABLE_STATS"
|
||||||
|
TARGET="x86_64-linux-gnu"
|
||||||
|
;;
|
||||||
|
reduce-size)
|
||||||
|
git -C "${LIBWEBP_ROOT}" grep WEBP_REDUCE_SIZE || exit 0
|
||||||
|
export CFLAGS="-O2 -g -DWEBP_REDUCE_SIZE"
|
||||||
|
TARGET="x86_64-linux-gnu"
|
||||||
|
;;
|
||||||
|
reduce-size-disable-stats)
|
||||||
|
git -C "${LIBWEBP_ROOT}" grep -e WEBP_DISABLE_STATS -e WEBP_REDUCE_SIZE \
|
||||||
|
|| exit 0
|
||||||
|
export CFLAGS="-O2 -g -DWEBP_DISABLE_STATS -DWEBP_REDUCE_SIZE"
|
||||||
|
TARGET="x86_64-linux-gnu"
|
||||||
|
;;
|
||||||
|
reduce-csp)
|
||||||
|
git -C "${LIBWEBP_ROOT}" grep WEBP_REDUCE_CSP || exit 0
|
||||||
|
export CFLAGS="-O2 -g -DWEBP_REDUCE_CSP"
|
||||||
|
TARGET="x86_64-linux-gnu"
|
||||||
|
;;
|
||||||
|
x86_64-linux-gnu | *mingw32 | aarch64*) ;; # Default target configuration
|
||||||
|
# non-configure based builds
|
||||||
|
native)
|
||||||
|
setup_ccache
|
||||||
|
# exercise makefile.unix then quit
|
||||||
|
make -C "${LIBWEBP_ROOT}" -f makefile.unix -j all
|
||||||
|
for tgt in extras examples/anim_diff; do
|
||||||
|
grep -q -m 1 "${tgt}" "${LIBWEBP_ROOT}/makefile.unix" \
|
||||||
|
&& make -C "${LIBWEBP_ROOT}" -f makefile.unix -j "${tgt}"
|
||||||
|
done
|
||||||
|
[[ -d "${LIBWEBP_ROOT}/tests/fuzzer" ]] \
|
||||||
|
&& make -j -C "${LIBWEBP_ROOT}/tests/fuzzer" -f makefile.unix
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
cmake*)
|
||||||
|
setup_ccache
|
||||||
|
# exercise cmake then quit
|
||||||
|
opts=()
|
||||||
|
case "${TARGET}" in
|
||||||
|
cmake-clang)
|
||||||
|
opts+=("-DCMAKE_C_COMPILER=clang")
|
||||||
|
;;
|
||||||
|
cmake-arm)
|
||||||
|
opts+=("-DCMAKE_C_COMPILER=arm-linux-gnueabi-gcc")
|
||||||
|
case "${GERRIT_BRANCH:-}" in
|
||||||
|
portable-intrinsics | 0.6.1) exit 0 ;;
|
||||||
|
*) ;; # Skip configuration
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
cmake-aarch64)
|
||||||
|
opts+=("-DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc")
|
||||||
|
case "${GERRIT_BRANCH:-}" in
|
||||||
|
portable-intrinsics | 0.6.1) exit 0 ;;
|
||||||
|
*) ;; # Skip configuration
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
*) ;; # Skip configuration
|
||||||
|
esac
|
||||||
|
case "${BUILD_TYPE}" in
|
||||||
|
static*)
|
||||||
|
opts+=("-DBUILD_SHARED_LIBS=OFF")
|
||||||
|
;;
|
||||||
|
experimental)
|
||||||
|
opts+=("-DWEBP_EXPERIMENTAL_FEATURES=ON" "-DBUILD_SHARED_LIBS=ON")
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
opts+=("-DBUILD_SHARED_LIBS=ON")
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
case "${BUILD_TYPE}" in
|
||||||
|
*debug) opts+=("-DCMAKE_BUILD_TYPE=Debug") ;;
|
||||||
|
*) opts+=("-DCMAKE_BUILD_TYPE=RelWithDebInfo") ;;
|
||||||
|
esac
|
||||||
|
cd "${BUILD_DIR}"
|
||||||
|
opts+=("-DWEBP_BUILD_CWEBP=ON" "-DWEBP_BUILD_DWEBP=ON")
|
||||||
|
grep -m 1 -q WEBP_BUILD_GIF2WEBP "${LIBWEBP_ROOT}/CMakeLists.txt" \
|
||||||
|
&& opts+=("-DWEBP_BUILD_GIF2WEBP=ON")
|
||||||
|
grep -m 1 -q WEBP_BUILD_IMG2WEBP "${LIBWEBP_ROOT}/CMakeLists.txt" \
|
||||||
|
&& opts+=("-DWEBP_BUILD_IMG2WEBP=ON")
|
||||||
|
cmake "${opts[@]}" "${LIBWEBP_ROOT}"
|
||||||
|
make VERBOSE=1 -j
|
||||||
|
case "${BUILD_TYPE}" in
|
||||||
|
static)
|
||||||
|
mkdir -p examples
|
||||||
|
cp [cd]webp examples
|
||||||
|
;;
|
||||||
|
*) ;; # Skip configuration.
|
||||||
|
esac
|
||||||
|
|
||||||
|
grep "install" "${LIBWEBP_ROOT}/CMakeLists.txt" || exit 0
|
||||||
|
|
||||||
|
make DESTDIR="${BUILD_DIR}/webp-install" install/strip
|
||||||
|
mkdir tmp
|
||||||
|
cd tmp
|
||||||
|
cat > CMakeLists.txt << EOF
|
||||||
|
cmake_minimum_required(VERSION 2.8.7)
|
||||||
|
|
||||||
|
project(libwebp C)
|
||||||
|
|
||||||
|
find_package(WebP)
|
||||||
|
if (NOT WebP_FOUND)
|
||||||
|
message(FATAL_ERROR "WebP package not found")
|
||||||
|
endif ()
|
||||||
|
message("WebP_FOUND: \${WebP_FOUND}")
|
||||||
|
message("WebP_INCLUDE_DIRS: \${WebP_INCLUDE_DIRS}")
|
||||||
|
message("WebP_LIBRARIES: \${WebP_LIBRARIES}")
|
||||||
|
message("WEBP_INCLUDE_DIRS: \${WEBP_INCLUDE_DIRS}")
|
||||||
|
message("WEBP_LIBRARIES: \${WEBP_LIBRARIES}")
|
||||||
|
EOF
|
||||||
|
cmake . "${opts[@]}" \
|
||||||
|
"-DCMAKE_PREFIX_PATH=${BUILD_DIR}/webp-install/usr/local"
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
gradle)
|
||||||
|
setup_ccache
|
||||||
|
# exercise gradle then quit
|
||||||
|
[[ -f "${LIBWEBP_ROOT}/gradlew" ]] || exit 0
|
||||||
|
|
||||||
|
cd "${BUILD_DIR}"
|
||||||
|
# TODO -g / --gradle-user-home could be used if there's a race between jobs
|
||||||
|
"${LIBWEBP_ROOT}/gradlew" -p "${LIBWEBP_ROOT}" buildAllExecutables
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
wasm)
|
||||||
|
grep -m 1 -q WEBP_ENABLE_WASM "${LIBWEBP_ROOT}/CMakeLists.txt" || exit 0
|
||||||
|
opts+=("-DCMAKE_C_COMPILER=clang" "-DWEBP_ENABLE_WASM=ON")
|
||||||
|
opts+=("-DWEBP_BUILD_CWEBP=ON" "-DWEBP_BUILD_DWEBP=ON")
|
||||||
|
case "${BUILD_TYPE}" in
|
||||||
|
*debug) opts+=("-DCMAKE_BUILD_TYPE=Debug") ;;
|
||||||
|
*) opts+=("-DCMAKE_BUILD_TYPE=RelWithDebInfo") ;;
|
||||||
|
esac
|
||||||
|
cd "${BUILD_DIR}"
|
||||||
|
cmake "${opts[@]}" "${LIBWEBP_ROOT}"
|
||||||
|
make VERBOSE=1 -j
|
||||||
|
mkdir examples
|
||||||
|
case "${BUILD_TYPE}" in
|
||||||
|
static)
|
||||||
|
mkdir -p examples
|
||||||
|
cp [cd]webp examples
|
||||||
|
;;
|
||||||
|
*) ;; # Skip configuration
|
||||||
|
esac
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
log_err "Invalid TARGET"
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
case "${TARGET}" in
|
||||||
|
*mingw32) ;; # Skip configuration
|
||||||
|
*)
|
||||||
|
case "${TARGET}-${CC}" in
|
||||||
|
static-debug-gcc* | static-debug-)
|
||||||
|
CFLAGS="${CFLAGS} -fprofile-arcs -ftest-coverage -O0 -g"
|
||||||
|
CXXFLAGS="${CXXFLAGS} -fprofile-arcs -ftest-coverage -O0 -g"
|
||||||
|
export CFLAGS CXXFLAGS
|
||||||
|
;;
|
||||||
|
*) ;; # This case should not be reached.
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
setup_ccache
|
||||||
|
|
||||||
|
cd "${LIBWEBP_ROOT}"
|
||||||
|
./autogen.sh
|
||||||
|
|
||||||
|
cd "${BUILD_DIR}"
|
||||||
|
"${LIBWEBP_ROOT}/configure" \
|
||||||
|
--host "${TARGET}" --build "$("${LIBWEBP_ROOT}/config.guess")" \
|
||||||
|
--enable-everything "${config_flags[@]}"
|
||||||
|
make -j V=1
|
224
infra/compile_android.sh
Executable file
224
infra/compile_android.sh
Executable file
@ -0,0 +1,224 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Copyright (c) 2021, Google Inc. All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are
|
||||||
|
# met:
|
||||||
|
#
|
||||||
|
# * Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
#
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in
|
||||||
|
# the documentation and/or other materials provided with the
|
||||||
|
# distribution.
|
||||||
|
#
|
||||||
|
# * Neither the name of Google nor the names of its contributors may
|
||||||
|
# be used to endorse or promote products derived from this software
|
||||||
|
# without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
set -xe
|
||||||
|
LIBWEBP_ROOT="$(realpath "$(dirname "$0")/..")"
|
||||||
|
readonly LIBWEBP_ROOT
|
||||||
|
readonly WORKSPACE=${WORKSPACE:-"$(mktemp -d -t webp.android.XXX)"}
|
||||||
|
# shellcheck source=infra/common.sh
|
||||||
|
source "${LIBWEBP_ROOT}/infra/common.sh"
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
cat << EOF
|
||||||
|
Usage: $(basename "$0") BUILD_TYPE APP_ABI
|
||||||
|
Options:
|
||||||
|
BUILD_TYPE supported build types:
|
||||||
|
static
|
||||||
|
static-debug
|
||||||
|
shared
|
||||||
|
shared-debug
|
||||||
|
APP_ABI supported application binary interfaces:
|
||||||
|
armeabi-v7a
|
||||||
|
arm64-v8a
|
||||||
|
x86
|
||||||
|
x86_64
|
||||||
|
Environment variables:
|
||||||
|
WORKSPACE directory where the build is done.
|
||||||
|
ANDROID_NDK_DIR directory where the android ndk tools are.
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
echo "Building libwebp for Android in ${WORKSPACE}"
|
||||||
|
|
||||||
|
if [[ ! -d "${WORKSPACE}" ]]; then
|
||||||
|
log_err "${WORKSPACE} directory does not exist."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
readonly BUILD_TYPE=${1:?"BUILD_TYPE is not defined.$(
|
||||||
|
echo
|
||||||
|
usage
|
||||||
|
)"}
|
||||||
|
readonly APP_ABI=${2:?"APP_ABI not defined.$(
|
||||||
|
echo
|
||||||
|
usage
|
||||||
|
)"}
|
||||||
|
readonly ANDROID_NDK_DIR=${ANDROID_NDK_DIR:?"ANDROID_NDK_DIR is not defined.$(
|
||||||
|
echo
|
||||||
|
usage
|
||||||
|
)"}
|
||||||
|
readonly BUILD_DIR="${WORKSPACE}/build-${BUILD_TYPE}"
|
||||||
|
readonly STANDALONE_ANDROID_DIR="${WORKSPACE}/android"
|
||||||
|
|
||||||
|
if [[ ! -x "${ANDROID_NDK_DIR}/ndk-build" ]]; then
|
||||||
|
log_err "unable to find ndk-build in ANDROID_NDK_DIR: ${ANDROID_NDK_DIR}."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
CFLAGS=
|
||||||
|
LDFLAGS=
|
||||||
|
opts=()
|
||||||
|
case "${BUILD_TYPE}" in
|
||||||
|
*debug)
|
||||||
|
readonly APP_OPTIM="debug"
|
||||||
|
CFLAGS="-O0 -g"
|
||||||
|
opts+=("--enable-asserts")
|
||||||
|
;;
|
||||||
|
static* | shared*)
|
||||||
|
readonly APP_OPTIM="release"
|
||||||
|
CFLAGS="-O2 -g"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
case "${BUILD_TYPE}" in
|
||||||
|
shared*) readonly SHARED="1" ;;
|
||||||
|
*)
|
||||||
|
readonly SHARED="0"
|
||||||
|
CFLAGS="${CFLAGS} -fPIE"
|
||||||
|
LDFLAGS="${LDFLAGS} -Wl,-pie"
|
||||||
|
opts+=("--disable-shared")
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Create a fresh build directory
|
||||||
|
make_build_dir "${BUILD_DIR}"
|
||||||
|
cd "${BUILD_DIR}"
|
||||||
|
ln -s "${LIBWEBP_ROOT}" jni
|
||||||
|
|
||||||
|
"${ANDROID_NDK_DIR}/ndk-build" -j2 \
|
||||||
|
APP_ABI="${APP_ABI}" \
|
||||||
|
APP_OPTIM="${APP_OPTIM}" \
|
||||||
|
ENABLE_SHARED="${SHARED}"
|
||||||
|
|
||||||
|
cd "${LIBWEBP_ROOT}"
|
||||||
|
./autogen.sh
|
||||||
|
|
||||||
|
case "${APP_ABI}" in
|
||||||
|
armeabi*) arch="arm" ;;
|
||||||
|
arm64*) arch="arm64" ;;
|
||||||
|
*) arch="${APP_ABI}" ;;
|
||||||
|
esac
|
||||||
|
# TODO(b/185520507): remove this and use the binaries from
|
||||||
|
# toolchains/llvm/prebuilt/ directly.
|
||||||
|
rm -rf "${STANDALONE_ANDROID_DIR}"
|
||||||
|
"${ANDROID_NDK_DIR}/build/tools/make_standalone_toolchain.py" \
|
||||||
|
--api 24 --arch "${arch}" --stl gnustl --install-dir \
|
||||||
|
"${STANDALONE_ANDROID_DIR}"
|
||||||
|
export PATH="${STANDALONE_ANDROID_DIR}/bin:${PATH}"
|
||||||
|
|
||||||
|
rm -rf "${BUILD_DIR}"
|
||||||
|
make_build_dir "${BUILD_DIR}"
|
||||||
|
cd "${BUILD_DIR}"
|
||||||
|
|
||||||
|
case "${arch}" in
|
||||||
|
arm)
|
||||||
|
host="arm-linux-androideabi"
|
||||||
|
case "${APP_ABI}" in
|
||||||
|
armeabi) ;;
|
||||||
|
armeabi-v7a)
|
||||||
|
CFLAGS="${CFLAGS} -march=armv7-a -mfpu=neon -mfloat-abi=softfp"
|
||||||
|
;;
|
||||||
|
*) ;; # No configuration needed
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
arm64)
|
||||||
|
host="aarch64-linux-android"
|
||||||
|
;;
|
||||||
|
x86)
|
||||||
|
host="i686-linux-android"
|
||||||
|
;;
|
||||||
|
x86_64)
|
||||||
|
host="x86_64-linux-android"
|
||||||
|
;;
|
||||||
|
*) ;; # Skip configuration
|
||||||
|
esac
|
||||||
|
|
||||||
|
setup_ccache
|
||||||
|
CC="clang"
|
||||||
|
|
||||||
|
"${LIBWEBP_ROOT}/configure" --host "${host}" --build \
|
||||||
|
"$("${LIBWEBP_ROOT}/config.guess")" CC="${CC}" CFLAGS="${CFLAGS}" \
|
||||||
|
LDFLAGS="${LDFLAGS}" "${opts[@]}"
|
||||||
|
make -j
|
||||||
|
|
||||||
|
if [[ "${GERRIT_REFSPEC:-}" = "refs/heads/portable-intrinsics" ]] \
|
||||||
|
|| [[ "${GERRIT_BRANCH:-}" = "portable-intrinsics" ]]; then
|
||||||
|
cd "${WORKSPACE}"
|
||||||
|
rm -rf build && mkdir build
|
||||||
|
cd build
|
||||||
|
standalone="${WORKSPACE}/android"
|
||||||
|
cmake ../libwebp \
|
||||||
|
-DWEBP_BUILD_DWEBP=1 \
|
||||||
|
-DCMAKE_C_COMPILER="${standalone}/bin/clang" \
|
||||||
|
-DCMAKE_PREFIX_PATH="${standalone}/sysroot/usr/lib" \
|
||||||
|
-DCMAKE_C_FLAGS=-fPIE \
|
||||||
|
-DCMAKE_EXE_LINKER_FLAGS=-Wl,-pie \
|
||||||
|
-DCMAKE_BUILD_TYPE=Release \
|
||||||
|
-DWEBP_ENABLE_WASM=1
|
||||||
|
make -j2
|
||||||
|
|
||||||
|
cd "${WORKSPACE}"
|
||||||
|
make_build_dir "${BUILD_DIR}"
|
||||||
|
cd "${BUILD_DIR}"
|
||||||
|
case "${APP_ABI}" in
|
||||||
|
armeabi-v7a | arm64*)
|
||||||
|
cmake "${LIBWEBP_ROOT}" \
|
||||||
|
-DWEBP_BUILD_DWEBP=1 \
|
||||||
|
-DCMAKE_C_COMPILER="${standalone}/bin/clang" \
|
||||||
|
-DCMAKE_PREFIX_PATH="${standalone}/sysroot/usr/lib" \
|
||||||
|
-DCMAKE_C_FLAGS='-fPIE -DENABLE_NEON_BUILTIN_MULHI_INT16X8' \
|
||||||
|
-DCMAKE_EXE_LINKER_FLAGS=-Wl,-pie \
|
||||||
|
-DCMAKE_BUILD_TYPE=Release \
|
||||||
|
-DWEBP_ENABLE_WASM=1
|
||||||
|
make -j2
|
||||||
|
;;
|
||||||
|
x86*)
|
||||||
|
cmake "${LIBWEBP_ROOT}" \
|
||||||
|
-DWEBP_BUILD_DWEBP=1 \
|
||||||
|
-DCMAKE_C_COMPILER="${standalone}/bin/clang" \
|
||||||
|
-DCMAKE_PREFIX_PATH="${standalone}/sysroot/usr/lib" \
|
||||||
|
-DCMAKE_C_FLAGS='-fPIE -DENABLE_X86_BUILTIN_MULHI_INT16X8' \
|
||||||
|
-DCMAKE_EXE_LINKER_FLAGS=-Wl,-pie \
|
||||||
|
-DCMAKE_BUILD_TYPE=Release \
|
||||||
|
-DWEBP_ENABLE_WASM=1
|
||||||
|
make -j2
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
log_err "APP_ABI not supported."
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
75
infra/compile_js.sh
Executable file
75
infra/compile_js.sh
Executable file
@ -0,0 +1,75 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Copyright (c) 2021, Google Inc. All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are
|
||||||
|
# met:
|
||||||
|
#
|
||||||
|
# * Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
#
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in
|
||||||
|
# the documentation and/or other materials provided with the
|
||||||
|
# distribution.
|
||||||
|
#
|
||||||
|
# * Neither the name of Google nor the names of its contributors may
|
||||||
|
# be used to endorse or promote products derived from this software
|
||||||
|
# without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
set -ex
|
||||||
|
|
||||||
|
readonly WORKSPACE="${WORKSPACE:-"$(mktemp -d -t webp.js.XXX)"}"
|
||||||
|
readonly BUILD_DIR="${WORKSPACE}/webp_js/"
|
||||||
|
readonly LIBWEBP_ROOT="$(realpath "$(dirname "$0")/..")"
|
||||||
|
|
||||||
|
# shellcheck source=infra/common.sh
|
||||||
|
source "${LIBWEBP_ROOT}/infra/common.sh"
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
cat << EOF
|
||||||
|
Usage: $(basename "$0")
|
||||||
|
Environment variables:
|
||||||
|
WORKSPACE directory where the build is done
|
||||||
|
EMSDK_DIR directory where emsdk is installed
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
[[ -d "${EMSDK_DIR:?Not defined}" ]] \
|
||||||
|
|| (log_err "${EMSDK_DIR} is not a valid directory." && exit 1)
|
||||||
|
|
||||||
|
# shellcheck source=/opt/emsdk/emsdk_env.sh
|
||||||
|
source "${EMSDK_DIR}/emsdk_env.sh"
|
||||||
|
|
||||||
|
readonly EMSCRIPTEN=${EMSCRIPTEN:-"${EMSDK}/upstream/emscripten"}
|
||||||
|
readonly \
|
||||||
|
EMSCRIPTEN_CMAKE_FILE="${EMSCRIPTEN}/cmake/Modules/Platform/Emscripten.cmake"
|
||||||
|
make_build_dir "${BUILD_DIR}"
|
||||||
|
|
||||||
|
pushd "${BUILD_DIR}"
|
||||||
|
opts=("-GUnix Makefiles" "-DWEBP_BUILD_WEBP_JS=ON")
|
||||||
|
if [[ -z "$(command -v emcmake)" ]]; then
|
||||||
|
opts+=("-DCMAKE_TOOLCHAIN_FILE=${EMSCRIPTEN_CMAKE_FILE}")
|
||||||
|
cmake \
|
||||||
|
"${opts[@]}" \
|
||||||
|
"${LIBWEBP_ROOT}"
|
||||||
|
make -j
|
||||||
|
else
|
||||||
|
emcmake cmake \
|
||||||
|
"${opts[@]}" \
|
||||||
|
"${LIBWEBP_ROOT}"
|
||||||
|
emmake make -j
|
||||||
|
fi
|
||||||
|
popd
|
98
infra/run_static_analysis.sh
Executable file
98
infra/run_static_analysis.sh
Executable file
@ -0,0 +1,98 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Copyright (c) 2021, Google Inc. All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are
|
||||||
|
# met:
|
||||||
|
#
|
||||||
|
# * Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
#
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in
|
||||||
|
# the documentation and/or other materials provided with the
|
||||||
|
# distribution.
|
||||||
|
#
|
||||||
|
# * Neither the name of Google nor the names of its contributors may
|
||||||
|
# be used to endorse or promote products derived from this software
|
||||||
|
# without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
set -xe
|
||||||
|
|
||||||
|
LIBWEBP_ROOT="$(realpath "$(dirname "$0")/..")"
|
||||||
|
readonly LIBWEBP_ROOT
|
||||||
|
readonly WORKSPACE=${WORKSPACE:-"$(mktemp -d -t webp.scanbuild.XXX)"}
|
||||||
|
|
||||||
|
# shellcheck source=infra/common.sh
|
||||||
|
source "${LIBWEBP_ROOT}/infra/common.sh"
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
cat << EOF
|
||||||
|
Usage: $(basename "$0") MODE
|
||||||
|
Options:
|
||||||
|
MODE supported scan modes: (shallow|deep)
|
||||||
|
Environment variables:
|
||||||
|
WORKSPACE directory where the build is done.
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
#######################################
|
||||||
|
# Wrap clang-tools scan-build.
|
||||||
|
# Globals:
|
||||||
|
# OUTPUT_DIR target directory where scan-build report is generated.
|
||||||
|
# MODE scan-build mode
|
||||||
|
# Arguments:
|
||||||
|
# $* scan-build additional args.
|
||||||
|
# Returns:
|
||||||
|
# scan-build retcode
|
||||||
|
#######################################
|
||||||
|
scan_build() {
|
||||||
|
scan-build -o "${OUTPUT_DIR}" --use-analyzer="$(command -v clang)" \
|
||||||
|
-analyzer-config mode="${MODE}" "$*"
|
||||||
|
}
|
||||||
|
|
||||||
|
MODE=${1:?"MODE is not specified.$(
|
||||||
|
echo
|
||||||
|
usage
|
||||||
|
)"}
|
||||||
|
|
||||||
|
readonly OUTPUT_DIR="${WORKSPACE}/output-${MODE}"
|
||||||
|
readonly BUILD_DIR="${WORKSPACE}/build"
|
||||||
|
|
||||||
|
make_build_dir "${OUTPUT_DIR}"
|
||||||
|
make_build_dir "${BUILD_DIR}"
|
||||||
|
|
||||||
|
cd "${LIBWEBP_ROOT}"
|
||||||
|
./autogen.sh
|
||||||
|
|
||||||
|
cd "${BUILD_DIR}"
|
||||||
|
grep -m 1 -q 'enable-asserts' "${LIBWEBP_ROOT}/configure.ac" \
|
||||||
|
&& args='--enable-asserts'
|
||||||
|
scan_build "${LIBWEBP_ROOT}/configure" --enable-everything "${args}"
|
||||||
|
scan_build make -j4
|
||||||
|
|
||||||
|
index="$(find "${OUTPUT_DIR}" -name index.html)"
|
||||||
|
if [[ -f "${index}" ]]; then
|
||||||
|
mv "$(dirname "${index}")/"* .
|
||||||
|
else
|
||||||
|
# make a empty report to wipe out any old bug reports.
|
||||||
|
cat << EOT > index.html
|
||||||
|
<html>
|
||||||
|
<body>
|
||||||
|
No bugs reported.
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
EOT
|
||||||
|
fi
|
@ -1,5 +1,5 @@
|
|||||||
.\" Hey, EMACS: -*- nroff -*-
|
.\" Hey, EMACS: -*- nroff -*-
|
||||||
.TH WEBPMUX 1 "December 12, 2020"
|
.TH WEBPMUX 1 "November 3, 2021"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
webpmux \- create animated WebP files from non\-animated WebP images, extract
|
webpmux \- create animated WebP files from non\-animated WebP images, extract
|
||||||
frames from animated WebP images, and manage XMP/EXIF metadata and ICC profile.
|
frames from animated WebP images, and manage XMP/EXIF metadata and ICC profile.
|
||||||
@ -82,6 +82,12 @@ Set loop count on an animated file.
|
|||||||
.P
|
.P
|
||||||
Where: 'loop_count' must be in range [0, 65535].
|
Where: 'loop_count' must be in range [0, 65535].
|
||||||
.TP
|
.TP
|
||||||
|
.BI bgcolor " A,R,G,B
|
||||||
|
Set the background color of the canvas on an animated file.
|
||||||
|
.P
|
||||||
|
where: 'A', 'R', 'G' and 'B' are integers in the range 0 to 255 specifying the
|
||||||
|
Alpha, Red, Green and Blue component values respectively.
|
||||||
|
.TP
|
||||||
.BI icc " file.icc
|
.BI icc " file.icc
|
||||||
Set ICC profile.
|
Set ICC profile.
|
||||||
.P
|
.P
|
||||||
|
@ -13,6 +13,7 @@ noinst_LTLIBRARIES += libwebpdsp_mips32.la
|
|||||||
noinst_LTLIBRARIES += libwebpdspdecode_mips32.la
|
noinst_LTLIBRARIES += libwebpdspdecode_mips32.la
|
||||||
noinst_LTLIBRARIES += libwebpdsp_mips_dsp_r2.la
|
noinst_LTLIBRARIES += libwebpdsp_mips_dsp_r2.la
|
||||||
noinst_LTLIBRARIES += libwebpdspdecode_mips_dsp_r2.la
|
noinst_LTLIBRARIES += libwebpdspdecode_mips_dsp_r2.la
|
||||||
|
noinst_LTLIBRARIES += libwebpdspdecode_wasm.la
|
||||||
|
|
||||||
if BUILD_LIBWEBPDECODER
|
if BUILD_LIBWEBPDECODER
|
||||||
noinst_LTLIBRARIES += libwebpdspdecode.la
|
noinst_LTLIBRARIES += libwebpdspdecode.la
|
||||||
@ -106,6 +107,8 @@ libwebpdspdecode_mips_dsp_r2_la_SOURCES += yuv_mips_dsp_r2.c
|
|||||||
libwebpdspdecode_mips_dsp_r2_la_CPPFLAGS = $(libwebpdsp_mips_dsp_r2_la_CPPFLAGS)
|
libwebpdspdecode_mips_dsp_r2_la_CPPFLAGS = $(libwebpdsp_mips_dsp_r2_la_CPPFLAGS)
|
||||||
libwebpdspdecode_mips_dsp_r2_la_CFLAGS = $(libwebpdsp_mips_dsp_r2_la_CFLAGS)
|
libwebpdspdecode_mips_dsp_r2_la_CFLAGS = $(libwebpdsp_mips_dsp_r2_la_CFLAGS)
|
||||||
|
|
||||||
|
libwebpdspdecode_wasm_la_SOURCES = dec_wasm.c
|
||||||
|
|
||||||
libwebpdsp_sse2_la_SOURCES =
|
libwebpdsp_sse2_la_SOURCES =
|
||||||
libwebpdsp_sse2_la_SOURCES += cost_sse2.c
|
libwebpdsp_sse2_la_SOURCES += cost_sse2.c
|
||||||
libwebpdsp_sse2_la_SOURCES += enc_sse2.c
|
libwebpdsp_sse2_la_SOURCES += enc_sse2.c
|
||||||
|
@ -26,8 +26,10 @@
|
|||||||
// SSE2 detection.
|
// SSE2 detection.
|
||||||
//
|
//
|
||||||
|
|
||||||
|
// Skip SSE detection if using Wasm SIMD build.
|
||||||
|
#if defined(WEBP_USE_WASM_SIMD)
|
||||||
// apple/darwin gcc-4.0.1 defines __PIC__, but not __pic__ with -fPIC.
|
// apple/darwin gcc-4.0.1 defines __PIC__, but not __pic__ with -fPIC.
|
||||||
#if (defined(__pic__) || defined(__PIC__)) && defined(__i386__)
|
#elif (defined(__pic__) || defined(__PIC__)) && defined(__i386__)
|
||||||
static WEBP_INLINE void GetCPUInfo(int cpu_info[4], int info_type) {
|
static WEBP_INLINE void GetCPUInfo(int cpu_info[4], int info_type) {
|
||||||
__asm__ volatile (
|
__asm__ volatile (
|
||||||
"mov %%ebx, %%edi\n"
|
"mov %%ebx, %%edi\n"
|
||||||
@ -69,8 +71,10 @@ static WEBP_INLINE void GetCPUInfo(int cpu_info[4], int info_type) {
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Skip xgetbv definition if using Wasm SIMD build.
|
||||||
|
#if defined(WEBP_USE_WASM_SIMD)
|
||||||
// NaCl has no support for xgetbv or the raw opcode.
|
// NaCl has no support for xgetbv or the raw opcode.
|
||||||
#if !defined(__native_client__) && (defined(__i386__) || defined(__x86_64__))
|
#elif !defined(__native_client__) && (defined(__i386__) || defined(__x86_64__))
|
||||||
static WEBP_INLINE uint64_t xgetbv(void) {
|
static WEBP_INLINE uint64_t xgetbv(void) {
|
||||||
const uint32_t ecx = 0;
|
const uint32_t ecx = 0;
|
||||||
uint32_t eax, edx;
|
uint32_t eax, edx;
|
||||||
@ -100,7 +104,13 @@ static WEBP_INLINE uint64_t xgetbv(void) {
|
|||||||
#define xgetbv() 0U // no AVX for older x64 or unrecognized toolchains.
|
#define xgetbv() 0U // no AVX for older x64 or unrecognized toolchains.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__i386__) || defined(__x86_64__) || defined(WEBP_HAVE_MSC_CPUID)
|
#if defined(WEBP_USE_WASM_SIMD)
|
||||||
|
static int wasmCPUInfo(CPUFeature feature) {
|
||||||
|
if (feature != kWasmSIMD) return 0;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
VP8CPUInfo VP8GetCPUInfo = wasmCPUInfo;
|
||||||
|
#elif defined(__i386__) || defined(__x86_64__) || defined(WEBP_HAVE_MSC_CPUID)
|
||||||
|
|
||||||
// helper function for run-time detection of slow SSSE3 platforms
|
// helper function for run-time detection of slow SSSE3 platforms
|
||||||
static int CheckSlowModel(int info) {
|
static int CheckSlowModel(int info) {
|
||||||
|
@ -740,6 +740,7 @@ extern void VP8DspInitNEON(void);
|
|||||||
extern void VP8DspInitMIPS32(void);
|
extern void VP8DspInitMIPS32(void);
|
||||||
extern void VP8DspInitMIPSdspR2(void);
|
extern void VP8DspInitMIPSdspR2(void);
|
||||||
extern void VP8DspInitMSA(void);
|
extern void VP8DspInitMSA(void);
|
||||||
|
extern void VP8DspInitWasmSIMD(void);
|
||||||
|
|
||||||
WEBP_DSP_INIT_FUNC(VP8DspInit) {
|
WEBP_DSP_INIT_FUNC(VP8DspInit) {
|
||||||
VP8InitClipTables();
|
VP8InitClipTables();
|
||||||
@ -831,6 +832,12 @@ WEBP_DSP_INIT_FUNC(VP8DspInit) {
|
|||||||
if (VP8GetCPUInfo(kMSA)) {
|
if (VP8GetCPUInfo(kMSA)) {
|
||||||
VP8DspInitMSA();
|
VP8DspInitMSA();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
#if defined(WEBP_USE_WASM_SIMD) && defined(WEBP_ENABLE_WASM_SIMD_INTRINSICS)
|
||||||
|
// Check that SIMD is supported and that we want to use Wasm intrinsics.
|
||||||
|
if (VP8GetCPUInfo(kWasmSIMD)) {
|
||||||
|
VP8DspInitWasmSIMD();
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
32
src/dsp/dec_wasm.c
Normal file
32
src/dsp/dec_wasm.c
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
// Copyright 2021 Google Inc. All Rights Reserved.
|
||||||
|
//
|
||||||
|
// Use of this source code is governed by a BSD-style license
|
||||||
|
// that can be found in the COPYING file in the root of the source
|
||||||
|
// tree. An additional intellectual property rights grant can be found
|
||||||
|
// in the file PATENTS. All contributing project authors may
|
||||||
|
// be found in the AUTHORS file in the root of the source tree.
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// WebAssembly (Wasm) version of some decoding functions.
|
||||||
|
//
|
||||||
|
// This will contain Wasm implementation of some decoding functions.
|
||||||
|
|
||||||
|
#include "./dsp.h"
|
||||||
|
|
||||||
|
#if defined(WEBP_USE_WASM_SIMD)
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Entry point
|
||||||
|
|
||||||
|
extern void VP8DspInitWasmSIMD(void);
|
||||||
|
|
||||||
|
WEBP_TSAN_IGNORE_FUNCTION void VP8DspInitWasmSIMD(void) {
|
||||||
|
// TODO(crbug.com/v8/12371): No special implementation for Wasm yet, will be
|
||||||
|
// added later.
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
WEBP_DSP_INIT_STUB(VP8DspInitWasmSIMD)
|
||||||
|
|
||||||
|
#endif // WEBP_USE_WASM_SIMD
|
@ -80,6 +80,11 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if (defined(EMSCRIPTEN) || defined(WEBP_HAVE_WASM_SIMD)) && \
|
||||||
|
defined(__wasm_simd128__)
|
||||||
|
#define WEBP_USE_WASM_SIMD
|
||||||
|
#endif
|
||||||
|
|
||||||
// WEBP_HAVE_* are used to indicate the presence of the instruction set in dsp
|
// WEBP_HAVE_* are used to indicate the presence of the instruction set in dsp
|
||||||
// files without intrinsics, allowing the corresponding Init() to be called.
|
// files without intrinsics, allowing the corresponding Init() to be called.
|
||||||
// Files containing intrinsics will need to be built targeting the instruction
|
// Files containing intrinsics will need to be built targeting the instruction
|
||||||
@ -119,7 +124,12 @@ extern "C" {
|
|||||||
#define WEBP_USE_NEON
|
#define WEBP_USE_NEON
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(_MSC_VER) && _MSC_VER >= 1700 && defined(_M_ARM)
|
// Note: ARM64 is supported in Visual Studio 2017, but requires the direct
|
||||||
|
// inclusion of arm64_neon.h; Visual Studio 2019 includes this file in
|
||||||
|
// arm_neon.h.
|
||||||
|
#if defined(_MSC_VER) && \
|
||||||
|
((_MSC_VER >= 1700 && defined(_M_ARM)) || \
|
||||||
|
(_MSC_VER >= 1920 && defined(_M_ARM64)))
|
||||||
#define WEBP_USE_NEON
|
#define WEBP_USE_NEON
|
||||||
#define WEBP_USE_INTRINSICS
|
#define WEBP_USE_INTRINSICS
|
||||||
#endif
|
#endif
|
||||||
@ -252,7 +262,8 @@ typedef enum {
|
|||||||
kNEON,
|
kNEON,
|
||||||
kMIPS32,
|
kMIPS32,
|
||||||
kMIPSdspR2,
|
kMIPSdspR2,
|
||||||
kMSA
|
kMSA,
|
||||||
|
kWasmSIMD
|
||||||
} CPUFeature;
|
} CPUFeature;
|
||||||
// returns true if the CPU supports the feature.
|
// returns true if the CPU supports the feature.
|
||||||
typedef int (*VP8CPUInfo)(CPUFeature feature);
|
typedef int (*VP8CPUInfo)(CPUFeature feature);
|
||||||
|
@ -585,6 +585,9 @@ static WEBP_INLINE score_t RDScoreTrellis(int lambda, score_t rate,
|
|||||||
return rate * lambda + RD_DISTO_MULT * distortion;
|
return rate * lambda + RD_DISTO_MULT * distortion;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Coefficient type.
|
||||||
|
enum { TYPE_I16_AC = 0, TYPE_I16_DC = 1, TYPE_CHROMA_A = 2, TYPE_I4_AC = 3 };
|
||||||
|
|
||||||
static int TrellisQuantizeBlock(const VP8Encoder* const enc,
|
static int TrellisQuantizeBlock(const VP8Encoder* const enc,
|
||||||
int16_t in[16], int16_t out[16],
|
int16_t in[16], int16_t out[16],
|
||||||
int ctx0, int coeff_type,
|
int ctx0, int coeff_type,
|
||||||
@ -593,7 +596,7 @@ static int TrellisQuantizeBlock(const VP8Encoder* const enc,
|
|||||||
const ProbaArray* const probas = enc->proba_.coeffs_[coeff_type];
|
const ProbaArray* const probas = enc->proba_.coeffs_[coeff_type];
|
||||||
CostArrayPtr const costs =
|
CostArrayPtr const costs =
|
||||||
(CostArrayPtr)enc->proba_.remapped_costs_[coeff_type];
|
(CostArrayPtr)enc->proba_.remapped_costs_[coeff_type];
|
||||||
const int first = (coeff_type == 0) ? 1 : 0;
|
const int first = (coeff_type == TYPE_I16_AC) ? 1 : 0;
|
||||||
Node nodes[16][NUM_NODES];
|
Node nodes[16][NUM_NODES];
|
||||||
ScoreState score_states[2][NUM_NODES];
|
ScoreState score_states[2][NUM_NODES];
|
||||||
ScoreState* ss_cur = &SCORE_STATE(0, MIN_DELTA);
|
ScoreState* ss_cur = &SCORE_STATE(0, MIN_DELTA);
|
||||||
@ -657,16 +660,17 @@ static int TrellisQuantizeBlock(const VP8Encoder* const enc,
|
|||||||
// test all alternate level values around level0.
|
// test all alternate level values around level0.
|
||||||
for (m = -MIN_DELTA; m <= MAX_DELTA; ++m) {
|
for (m = -MIN_DELTA; m <= MAX_DELTA; ++m) {
|
||||||
Node* const cur = &NODE(n, m);
|
Node* const cur = &NODE(n, m);
|
||||||
int level = level0 + m;
|
const int level = level0 + m;
|
||||||
const int ctx = (level > 2) ? 2 : level;
|
const int ctx = (level > 2) ? 2 : level;
|
||||||
const int band = VP8EncBands[n + 1];
|
const int band = VP8EncBands[n + 1];
|
||||||
score_t base_score;
|
score_t base_score;
|
||||||
score_t best_cur_score = MAX_COST;
|
score_t best_cur_score;
|
||||||
int best_prev = 0; // default, in case
|
int best_prev;
|
||||||
|
score_t cost, score;
|
||||||
|
|
||||||
ss_cur[m].score = MAX_COST;
|
|
||||||
ss_cur[m].costs = costs[n + 1][ctx];
|
ss_cur[m].costs = costs[n + 1][ctx];
|
||||||
if (level < 0 || level > thresh_level) {
|
if (level < 0 || level > thresh_level) {
|
||||||
|
ss_cur[m].score = MAX_COST;
|
||||||
// Node is dead.
|
// Node is dead.
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -682,18 +686,24 @@ static int TrellisQuantizeBlock(const VP8Encoder* const enc,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Inspect all possible non-dead predecessors. Retain only the best one.
|
// Inspect all possible non-dead predecessors. Retain only the best one.
|
||||||
for (p = -MIN_DELTA; p <= MAX_DELTA; ++p) {
|
// The base_score is added to all scores so it is only added for the final
|
||||||
|
// value after the loop.
|
||||||
|
cost = VP8LevelCost(ss_prev[-MIN_DELTA].costs, level);
|
||||||
|
best_cur_score =
|
||||||
|
ss_prev[-MIN_DELTA].score + RDScoreTrellis(lambda, cost, 0);
|
||||||
|
best_prev = -MIN_DELTA;
|
||||||
|
for (p = -MIN_DELTA + 1; p <= MAX_DELTA; ++p) {
|
||||||
// Dead nodes (with ss_prev[p].score >= MAX_COST) are automatically
|
// Dead nodes (with ss_prev[p].score >= MAX_COST) are automatically
|
||||||
// eliminated since their score can't be better than the current best.
|
// eliminated since their score can't be better than the current best.
|
||||||
const score_t cost = VP8LevelCost(ss_prev[p].costs, level);
|
cost = VP8LevelCost(ss_prev[p].costs, level);
|
||||||
// Examine node assuming it's a non-terminal one.
|
// Examine node assuming it's a non-terminal one.
|
||||||
const score_t score =
|
score = ss_prev[p].score + RDScoreTrellis(lambda, cost, 0);
|
||||||
base_score + ss_prev[p].score + RDScoreTrellis(lambda, cost, 0);
|
|
||||||
if (score < best_cur_score) {
|
if (score < best_cur_score) {
|
||||||
best_cur_score = score;
|
best_cur_score = score;
|
||||||
best_prev = p;
|
best_prev = p;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
best_cur_score += base_score;
|
||||||
// Store best finding in current node.
|
// Store best finding in current node.
|
||||||
cur->sign = sign;
|
cur->sign = sign;
|
||||||
cur->level = level;
|
cur->level = level;
|
||||||
@ -701,11 +711,11 @@ static int TrellisQuantizeBlock(const VP8Encoder* const enc,
|
|||||||
ss_cur[m].score = best_cur_score;
|
ss_cur[m].score = best_cur_score;
|
||||||
|
|
||||||
// Now, record best terminal node (and thus best entry in the graph).
|
// Now, record best terminal node (and thus best entry in the graph).
|
||||||
if (level != 0) {
|
if (level != 0 && best_cur_score < best_score) {
|
||||||
const score_t last_pos_cost =
|
const score_t last_pos_cost =
|
||||||
(n < 15) ? VP8BitCost(0, probas[band][ctx][0]) : 0;
|
(n < 15) ? VP8BitCost(0, probas[band][ctx][0]) : 0;
|
||||||
const score_t last_pos_score = RDScoreTrellis(lambda, last_pos_cost, 0);
|
const score_t last_pos_score = RDScoreTrellis(lambda, last_pos_cost, 0);
|
||||||
const score_t score = best_cur_score + last_pos_score;
|
score = best_cur_score + last_pos_score;
|
||||||
if (score < best_score) {
|
if (score < best_score) {
|
||||||
best_score = score;
|
best_score = score;
|
||||||
best_path[0] = n; // best eob position
|
best_path[0] = n; // best eob position
|
||||||
@ -717,10 +727,16 @@ static int TrellisQuantizeBlock(const VP8Encoder* const enc,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Fresh start
|
// Fresh start
|
||||||
memset(in + first, 0, (16 - first) * sizeof(*in));
|
// Beware! We must preserve in[0]/out[0] value for TYPE_I16_AC case.
|
||||||
memset(out + first, 0, (16 - first) * sizeof(*out));
|
if (coeff_type == TYPE_I16_AC) {
|
||||||
|
memset(in + 1, 0, 15 * sizeof(*in));
|
||||||
|
memset(out + 1, 0, 15 * sizeof(*out));
|
||||||
|
} else {
|
||||||
|
memset(in, 0, 16 * sizeof(*in));
|
||||||
|
memset(out, 0, 16 * sizeof(*out));
|
||||||
|
}
|
||||||
if (best_path[0] == -1) {
|
if (best_path[0] == -1) {
|
||||||
return 0; // skip!
|
return 0; // skip!
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
@ -775,9 +791,9 @@ static int ReconstructIntra16(VP8EncIterator* const it,
|
|||||||
for (y = 0, n = 0; y < 4; ++y) {
|
for (y = 0, n = 0; y < 4; ++y) {
|
||||||
for (x = 0; x < 4; ++x, ++n) {
|
for (x = 0; x < 4; ++x, ++n) {
|
||||||
const int ctx = it->top_nz_[x] + it->left_nz_[y];
|
const int ctx = it->top_nz_[x] + it->left_nz_[y];
|
||||||
const int non_zero =
|
const int non_zero = TrellisQuantizeBlock(
|
||||||
TrellisQuantizeBlock(enc, tmp[n], rd->y_ac_levels[n], ctx, 0,
|
enc, tmp[n], rd->y_ac_levels[n], ctx, TYPE_I16_AC, &dqm->y1_,
|
||||||
&dqm->y1_, dqm->lambda_trellis_i16_);
|
dqm->lambda_trellis_i16_);
|
||||||
it->top_nz_[x] = it->left_nz_[y] = non_zero;
|
it->top_nz_[x] = it->left_nz_[y] = non_zero;
|
||||||
rd->y_ac_levels[n][0] = 0;
|
rd->y_ac_levels[n][0] = 0;
|
||||||
nz |= non_zero << n;
|
nz |= non_zero << n;
|
||||||
@ -818,7 +834,7 @@ static int ReconstructIntra4(VP8EncIterator* const it,
|
|||||||
if (DO_TRELLIS_I4 && it->do_trellis_) {
|
if (DO_TRELLIS_I4 && it->do_trellis_) {
|
||||||
const int x = it->i4_ & 3, y = it->i4_ >> 2;
|
const int x = it->i4_ & 3, y = it->i4_ >> 2;
|
||||||
const int ctx = it->top_nz_[x] + it->left_nz_[y];
|
const int ctx = it->top_nz_[x] + it->left_nz_[y];
|
||||||
nz = TrellisQuantizeBlock(enc, tmp, levels, ctx, 3, &dqm->y1_,
|
nz = TrellisQuantizeBlock(enc, tmp, levels, ctx, TYPE_I4_AC, &dqm->y1_,
|
||||||
dqm->lambda_trellis_i4_);
|
dqm->lambda_trellis_i4_);
|
||||||
} else {
|
} else {
|
||||||
nz = VP8EncQuantizeBlock(tmp, levels, &dqm->y1_);
|
nz = VP8EncQuantizeBlock(tmp, levels, &dqm->y1_);
|
||||||
@ -927,9 +943,9 @@ static int ReconstructUV(VP8EncIterator* const it, VP8ModeScore* const rd,
|
|||||||
for (y = 0; y < 2; ++y) {
|
for (y = 0; y < 2; ++y) {
|
||||||
for (x = 0; x < 2; ++x, ++n) {
|
for (x = 0; x < 2; ++x, ++n) {
|
||||||
const int ctx = it->top_nz_[4 + ch + x] + it->left_nz_[4 + ch + y];
|
const int ctx = it->top_nz_[4 + ch + x] + it->left_nz_[4 + ch + y];
|
||||||
const int non_zero =
|
const int non_zero = TrellisQuantizeBlock(
|
||||||
TrellisQuantizeBlock(enc, tmp[n], rd->uv_levels[n], ctx, 2,
|
enc, tmp[n], rd->uv_levels[n], ctx, TYPE_CHROMA_A, &dqm->uv_,
|
||||||
&dqm->uv_, dqm->lambda_trellis_uv_);
|
dqm->lambda_trellis_uv_);
|
||||||
it->top_nz_[4 + ch + x] = it->left_nz_[4 + ch + y] = non_zero;
|
it->top_nz_[4 + ch + x] = it->left_nz_[4 + ch + y] = non_zero;
|
||||||
nz |= non_zero << n;
|
nz |= non_zero << n;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user