From 409df481db8f4d67ddbaeb8581df55bd2082a962 Mon Sep 17 00:00:00 2001 From: Surma Date: Wed, 5 Feb 2020 17:12:03 -0800 Subject: [PATCH] Fix HDR image support in AVIF decoder --- codecs/avif_dec/README.md | 12 ++++------ codecs/avif_dec/avif_dec.cpp | 44 ++++++++++++++++++++++++++-------- codecs/avif_dec/avif_dec.wasm | Bin 1801051 -> 1801298 bytes codecs/avif_dec/build.sh | 4 ++-- 4 files changed, 40 insertions(+), 20 deletions(-) diff --git a/codecs/avif_dec/README.md b/codecs/avif_dec/README.md index 4ec8ef7d..ebebeeaf 100644 --- a/codecs/avif_dec/README.md +++ b/codecs/avif_dec/README.md @@ -1,7 +1,7 @@ -# WebP decoder +# AVIF decoder -- Source: -- Version: v1.0.2 +- Source: +- Version: v0.5.4 ## Example @@ -9,13 +9,9 @@ See `example.html` ## API -### `int version()` - -Returns the version of libwebp as a number. va.b.c is encoded as 0x0a0b0c - ### `RawImage decode(std::string buffer)` -Decodes the given webp buffer into raw RGBA. `RawImage` is a class with 3 fields: `buffer`, `width`, and `height`. +Decodes the given avif buffer into raw RGBA. `RawImage` is a class with 3 fields: `buffer`, `width`, and `height`. ### `void free_result()` diff --git a/codecs/avif_dec/avif_dec.cpp b/codecs/avif_dec/avif_dec.cpp index 24ddbae6..05d9a349 100644 --- a/codecs/avif_dec/avif_dec.cpp +++ b/codecs/avif_dec/avif_dec.cpp @@ -56,16 +56,40 @@ RawImage decode(std::string avifimage) { // ... image->rgbPlanes; // ... image->rgbRowBytes; - for (int y = 0; y < height; y++) { - for (int x = 0; x < width; x++) { - int pixelOffset = y * image->width + x; - result[pixelOffset * 4 + 0] = image->rgbPlanes[0][pixelOffset]; - result[pixelOffset * 4 + 1] = image->rgbPlanes[1][pixelOffset]; - result[pixelOffset * 4 + 2] = image->rgbPlanes[2][pixelOffset]; - if (image->alphaPlane) { - result[pixelOffset * 4 + 3] = image->alphaPlane[pixelOffset]; - } else { - result[pixelOffset * 4 + 3] = 255; + if (image->depth > 8) { + uint16_t depthDivistor = 1 << (image->depth - 8); + // Plane ptrs are uint16_t* + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + int pixelOffset = y * image->width + x; + result[pixelOffset * 4 + 0] = (uint8_t)( + ((uint16_t *)(image->rgbPlanes[0]))[pixelOffset] / depthDivistor); + result[pixelOffset * 4 + 1] = (uint8_t)( + ((uint16_t *)(image->rgbPlanes[1]))[pixelOffset] / depthDivistor); + result[pixelOffset * 4 + 2] = (uint8_t)( + ((uint16_t *)(image->rgbPlanes[2]))[pixelOffset] / depthDivistor); + if (image->alphaPlane) { + result[pixelOffset * 4 + 3] = (uint8_t)( + ((uint16_t *)(image->alphaPlane))[pixelOffset] / depthDivistor); + } else { + result[pixelOffset * 4 + 3] = 255; + } + } + } + + } else { + // Plane ptrs are uint8_t* + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + int pixelOffset = y * image->width + x; + result[pixelOffset * 4 + 0] = image->rgbPlanes[0][pixelOffset]; + result[pixelOffset * 4 + 1] = image->rgbPlanes[1][pixelOffset]; + result[pixelOffset * 4 + 2] = image->rgbPlanes[2][pixelOffset]; + if (image->alphaPlane) { + result[pixelOffset * 4 + 3] = image->alphaPlane[pixelOffset]; + } else { + result[pixelOffset * 4 + 3] = 255; + } } } } diff --git a/codecs/avif_dec/avif_dec.wasm b/codecs/avif_dec/avif_dec.wasm index 6f027311adb544f9751188291d65bc59ad8a41c5..e378733874fd233b0dac9c07bd113c90e161b753 100644 GIT binary patch delta 736 zcmZ{iJ!@1!7=`D1?!B{jGwP~QoA*ux6#`LMQdsR&30m3;b{0b-M7FRHZone{AX&+R zU}u*ukV*oASlS9!7XE@@x1QOLAea=-&O1A2X3lx%{y5wI{%8AWzb}4$c{l3sjrtr2 zAb|oJnB!63?!MgksCnJ4n5I}Ukp-!#If^^Kht@W@ZauH8QGJDXIT+sES{ov$QmvO)Kvpi5|yOsPPUbT%IDko`S&AOO8LAFsW$RqTH}n& ztH+GZ7s*EcdaCfGE)j^Cpm(W2&IFsmq7V5Lvh$1LgzxCsI$TK4WaKGG(i=5%4&gE5 zR8D7T-Xf=+2eTIiGdY+#4`%kqw%6iD7%(}ePpgdmlManom^c3|o!eH~HcbT!vl_k5 zZZGia@K&E3b^O-~KhNXCS)1{0j_UlB$hIyNRpk7MCx${(>5nR^{0D_^XYX`uK^{v` j0S7vu23@cOJh%d`f@`1$u7exkCRhfyj!(z8-~apza~YpD delta 497 zcmZY4Jxjwt7zgmX%iZPWQa!b5t;>^CP@#(uIym*F7C(dF<`CLN9EAuD{RUbo#aUds zl{yJ7;^-9HDyR3 zycqfWg(QJa8un7|#CaMM$Kd6Th2#uio5j-M@Bwrt(h$G$1F6Mxm}zX1;|Z0e>O7xGA#FDO?S zY^BKYJdH?pD$E%CIxmsbmjw}d300{d9C#1Kge?Ia@K q-bq7hFdO?2KnM{Sh@k>YunZPfU=`M&3hS@|n^1$T>1