Fix libsharpyuv sRGB transfer function

The transfer function is used to go to linear and back during the RGB
to YUV conversion. It affects the result of the conversion but the
difference between different transfer functions is fairly minor so
it won't terribly break the image if the transfer function used during
the conversion does not match the one used to encode the pixels.

Despite almost all images being encoded with the sRGB transfer function,
libwebp (from which libsharpyuv was eventually extracted) originally
used the BT709 transfer function.
According to
https://groups.google.com/a/webmproject.org/g/webp-discuss/c/6wMQrupJNAM/m/bfNWQuUiAQAJ
BT709 was chosen because it produced the best empirical results.
However, when more transfer functions were added to libsharpyuv in
https://chromium-review.googlesource.com/c/webm/libwebp/+/4637883 it
was wrongly assumed that the existing transfer function was sRGB.
Therefore BT709 is currently implemented twice, with "sRGB" actually
implementing BT709, and the real sRGB is not implemented at all.

Note that the default transfer function (`kSharpYuvTransferFunctionSrgb`
which is actually BT709) used a precomputed LUT for performance, while
the other transfer function did not.

In order to keep the same default behavior for callers that do not
specify a transfer function, this change switches the default to
`kSharpYuvTransferFunctionBt709`, which uses the precomputed LUT.

`kSharpYuvTransferFunctionSrgb` is now really sRGB, so callers that
explicitly set the transfer function to this value WILL see a small
output change, as well as a performance hit since this setting no longer
uses a LUT.

Change-Id: Idacbe56e36d50f28689910b12692c0df28c54253
8 files changed
tree: 22d8b0de85b84ec8b79cf802b2d0eca5f6291f05
  1. cmake/
  2. doc/
  3. examples/
  4. extras/
  5. fuzzer/
  6. gradle/
  7. imageio/
  8. infra/
  9. m4/
  10. man/
  11. sharpyuv/
  12. src/
  13. swig/
  14. tests/
  15. webp_js/
  16. .clang-format
  17. .cmake-format.py
  18. .gitattributes
  19. .gitignore
  20. .mailmap
  21. .pylintrc
  22. .style.yapf
  23. Android.mk
  24. AUTHORS
  25. autogen.sh
  26. build.gradle
  27. ChangeLog
  28. CMakeLists.txt
  29. codereview.settings
  30. configure.ac
  31. CONTRIBUTING.md
  32. COPYING
  33. gradle.properties
  34. gradlew
  35. gradlew.bat
  36. iosbuild.sh
  37. Makefile.am
  38. makefile.unix
  39. Makefile.vc
  40. NEWS
  41. PATENTS
  42. PRESUBMIT.py
  43. README.md
  44. xcframeworkbuild.sh
README.md

WebP Codec

      __   __  ____  ____  ____
     /  \\/  \/  _ \/  _ )/  _ \
     \       /   __/  _  \   __/
      \__\__/\____/\_____/__/ ____  ___
            / _/ /    \    \ /  _ \/ _/
           /  \_/   / /   \ \   __/  \__
           \____/____/\_____/_____/____/v1.6.0

WebP codec is a library to encode and decode images in WebP format. This package contains the library that can be used in other programs to add WebP support, as well as the command line tools ‘cwebp’ and ‘dwebp’ to compress and decompress images respectively.

See https://developers.google.com/speed/webp for details on the image format.

The latest source tree is available at https://chromium.googlesource.com/webm/libwebp

It is released under the same license as the WebM project. See https://www.webmproject.org/license/software/ or the “COPYING” file for details. An additional intellectual property rights grant can be found in the file PATENTS.

Building

See the building documentation.

Encoding and Decoding Tools

The examples/ directory contains tools to encode and decode images and animations, view information about WebP images, and more. See the tools documentation.

APIs

See the APIs documentation, and API usage examples in the examples/ directory.

Bugs

Please report all bugs in the WebP component of the issue tracker. For security reports, select ‘Security report’ from the Template dropdown.

Patches welcome! See how to contribute.

Discuss

Email: webp-discuss@webmproject.org

Web: https://groups.google.com/a/webmproject.org/group/webp-discuss