fix overflows while encoding large images

The data type that was used to store the memory required for input raw
buffers was int. This works for normal dimensions. For images where
width and height are very large, say greater than 32768, then rgb input
buffer size is 32768 * 32768 * 4. This computation exceeds integer max
causing issues. This change addresses this by assigning the type for
widths/heights/strides/ as unsigned int and buffer sizes as size_t

Bug: 379761763
Test: ./ultrahdr_unit_test
(cherry picked from commit a265b540c6b4bb7a6bbe8f984749ec50ac5ee7fc)
Change-Id: I52cc2d96216c914d051c7ec5869113a6313cb5c6
Merged-In: I52cc2d96216c914d051c7ec5869113a6313cb5c6
23 files changed
tree: 541fb7623c1d718c8ca8059bd3cfd6b0b02e6c25
  1. .github/
  2. adobe-hdr-gain-map-license/
  3. benchmark/
  4. cmake/
  5. docs/
  6. examples/
  7. fuzzer/
  8. java/
  9. lib/
  10. tests/
  11. third_party/
  12. .clang-format
  13. .gitignore
  14. Android.bp
  15. CMakeLists.txt
  16. DESCRIPTION
  17. LICENSE
  18. METADATA
  19. OWNERS
  20. README.md
  21. ultrahdr_api.h
README.md

Introduction

libultrahdr is an image compression library that uses gain map technology to store and distribute HDR images. Conceptually on the encoding side, the library accepts SDR and HDR rendition of an image and from these a Gain Map (quotient between the two renditions) is computed. The library then uses backward compatible means to store the base image (SDR), gain map image and some associated metadata. Legacy readers that do not support handling the gain map image and/or metadata, will display the base image. Readers that support the format combine the base image with the gain map and render a high dynamic range image on compatible displays.

For additional information, see android hdr-image-format guide.

Build from source using CMake

This software suite has been built and tested on platforms:

  • Android
  • Linux
  • macOS
  • Windows

Refer to building.md for complete instructions.

Using libultrahdr

A detailed description of libultrahdr encode and decode api is included in ultrahdr_api.h and for sample usage refer demo app.

libultrahdr includes two classes of APIs, one to compress and the other to decompress HDR images:

Encoding api outline:

ScenarioHdr intent rawSdr intent rawSdr intent compressedGain map compressedQualityExifUse Case
API - 0P010 or rgba1010102 or rgbaf16NoNoNoOptionalOptionalUsed if, only hdr raw intent is present. [^1]
API - 1P010 or rgba1010102 or rgbaf16YUV420 or rgba8888NoNoOptionalOptionalUsed if, hdr raw and sdr raw intents are present.[^2]
API - 2P010 or rgba1010102 or rgbaf16YUV420 or rgba8888YesNoNoNoUsed if, hdr raw, sdr raw and sdr compressed intents are present.[^3]
API - 3P010 or rgba1010102 or rgbaf16NoYesNoNoNoUsed if, hdr raw and sdr compressed intents are present.[^4]
API - 4NoNoYesYesNoNoUsed if, sdr compressed, gain map compressed and GainMap Metadata are present.[^5]

[^1]: Tonemap hdr to sdr. Compute gain map from hdr and sdr. Compress sdr and gainmap at quality configured. Add exif if provided. Combine sdr compressed, gainmap in multi picture format with gainmap metadata. [^2]: Compute gain map from hdr and sdr. Compress sdr and gainmap at quality configured. Add exif if provided. Combine sdr compressed, gainmap in multi picture format with gainmap metadata. [^3]: Compute gain map from hdr and raw sdr. Compress gainmap. Combine sdr compressed, gainmap in multi picture format with gainmap metadata. [^4]: Decode compressed sdr input. Compute gain map from hdr and decoded sdr. Compress gainmap. Combine sdr compressed, gainmap in multi picture format with gainmap metadata. [^5]: Combine sdr compressed, gainmap in multi picture format with gainmap metadata.

Decoding api outline:

Configure display device characteristics (display transfer characteristics, max display boost) for optimal usage.

InputUsage
max_display_boost(optional, >= 1.0) the maximum available boost supported by a display.
supported color transfer format pairscolor transferColor format SDR32bppRGBA8888HDR_LINEAR64bppRGBAHalfFloatHDR_PQ32bppRGBA1010102 PQHDR_HLG32bppRGBA1010102 HLG