mirror of
https://github.com/webmproject/libwebp.git
synced 2024-11-19 20:08:28 +01:00
libwebp-1.3.1
- 6/23/2023: version 1.3.1 This is a binary compatible release. * security fixes for lossless encoder (#603, chromium: #1420107, #1455619, CVE-2023-1999) * improve error reporting through WebPPicture error codes * fix upsampling for RGB565 and RGBA4444 in NEON builds * img2webp: add -sharp_yuv & -near_lossless * Windows builds: - fix compatibility with clang-cl (#607) - improve Arm64 performance with cl.exe - add Arm64EC support * fix webp_js with emcc >= 3.1.27 (stack size change, #614) * CMake fixes (#592, #610, #612) * further updates to the container and lossless bitstream docs (#581, #611) -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEaw5rcJdt4wPt8vYB+cPWvbgjK10FAmSc53oACgkQ+cPWvbgj K120Fg//f0JkK3oKnO8P4B5XSAK26/5845xBPU8D06UuUqhct+mjfF5kM1CFxxex 49W4rT7RJCpgGlwmRFFgRB3a9j7cW4C+Kt5MAfM++vudVrxnpnX6o3rdVDQ60PEZ C4T5u2jio/HuZAkPWYwwmIAz1vfqTjYpi0D12hn7yoBoketGcISlMuTgmwfjyQKg bn3JcjcjKtERfXSH36aCtnGAXJdf0Ok2WJtwS4kAcZiMByi5wf0AdEK0pnhmE3Y6 YFPc0/RM50RXITnsDxmLZVRqpsAYr4l3RZvHwDDWVFMELWBsGWNF/kgzWlZ3/KjO 4CUPE+810P4oVGJuRZ8++0hMSD0L1qh17awElpqLoBlDXfS1fEIw5QodbmoJzi0H mhiLH7fIZlpjoZyWuwNCzlkhykRLO4cEIaxxq28p5eoC70LXsv77rWqomfAja/6/ 88BQz6wrxHr0k4MmdOa+G8B5sMOBRVXXeW4bP1XCVGUfk8FN2rz0vlhbHk8sx/6/ jqW19Bk3t2QnUZschBi1GKHKa0KkefFhTezTm/CV4fPmT50Z4k/+TTjJ6snSxAAX oYabJDtVARLgPxOcN64Hbsy1t5L9pWGLTfwbYBTVipX4lmofL9SHhgyg6oYVnZd5 qbCVdqpYOOrbXXT/AByOuzo3tuaLMd8Ytas0I5/HHnI6QCTthg0= =/atT -----END PGP SIGNATURE----- Merge tag 'v1.3.1' libwebp-1.3.1 - 6/23/2023: version 1.3.1 This is a binary compatible release. * security fixes for lossless encoder (#603, chromium: #1420107, #1455619, CVE-2023-1999) * improve error reporting through WebPPicture error codes * fix upsampling for RGB565 and RGBA4444 in NEON builds * img2webp: add -sharp_yuv & -near_lossless * Windows builds: - fix compatibility with clang-cl (#607) - improve Arm64 performance with cl.exe - add Arm64EC support * fix webp_js with emcc >= 3.1.27 (stack size change, #614) * CMake fixes (#592, #610, #612) * further updates to the container and lossless bitstream docs (#581, #611) * tag 'v1.3.1': update ChangeLog update NEWS enc/*: normalize WebPEncodingSetError() calls enc/*: add missing WebPEncodingSetError() calls EncodeAlphaInternal: add missing error check vp8l_enc,WriteImage: add missing error check muxread,MuxImageParse: add missing error checks cmake,emscripten: explicitly set stack size WebPDecodeYUV: check u/v/stride/uv_stride ptrs Call png_get_channels() to see if image has alpha update ChangeLog update NEWS bump version to 1.3.1 update AUTHORS update .mailmap Bug: webp:608 Bug: b/281615350 Change-Id: Ic3e1956c92fef0ae22040bbc3e81b297c65008af
This commit is contained in:
commit
4222b00679
1
.mailmap
1
.mailmap
@ -16,3 +16,4 @@ James Zern <jzern@google.com>
|
|||||||
Roberto Alanis <alanisbaez@google.com>
|
Roberto Alanis <alanisbaez@google.com>
|
||||||
Brian Ledger <brianpl@google.com>
|
Brian Ledger <brianpl@google.com>
|
||||||
Maryla Ustarroz-Calonge <maryla@google.com>
|
Maryla Ustarroz-Calonge <maryla@google.com>
|
||||||
|
Yannis Guyon <yguyon@google.com>
|
||||||
|
2
AUTHORS
2
AUTHORS
@ -32,6 +32,7 @@ Contributors:
|
|||||||
- Mislav Bradac (mislavm at google dot com)
|
- Mislav Bradac (mislavm at google dot com)
|
||||||
- Nico Weber (thakis at chromium dot org)
|
- Nico Weber (thakis at chromium dot org)
|
||||||
- Noel Chromium (noel at chromium dot org)
|
- Noel Chromium (noel at chromium dot org)
|
||||||
|
- Nozomi Isozaki (nontan at pixiv dot co dot jp)
|
||||||
- Oliver Wolff (oliver dot wolff at qt dot io)
|
- Oliver Wolff (oliver dot wolff at qt dot io)
|
||||||
- Owen Rodley (orodley at google dot com)
|
- Owen Rodley (orodley at google dot com)
|
||||||
- Parag Salasakar (img dot mips1 at gmail dot com)
|
- Parag Salasakar (img dot mips1 at gmail dot com)
|
||||||
@ -47,6 +48,7 @@ Contributors:
|
|||||||
- Somnath Banerjee (somnath dot banerjee at gmail dot com)
|
- Somnath Banerjee (somnath dot banerjee at gmail dot com)
|
||||||
- Sriraman Tallam (tmsriram at google dot com)
|
- Sriraman Tallam (tmsriram at google dot com)
|
||||||
- Tamar Levy (tamar dot levy at intel dot com)
|
- Tamar Levy (tamar dot levy at intel dot com)
|
||||||
|
- Thiago Perrotta (tperrotta at google dot com)
|
||||||
- Timothy Gu (timothygu99 at gmail dot com)
|
- Timothy Gu (timothygu99 at gmail dot com)
|
||||||
- Urvang Joshi (urvang at google dot com)
|
- Urvang Joshi (urvang at google dot com)
|
||||||
- Vikas Arora (vikasa at google dot com)
|
- Vikas Arora (vikasa at google dot com)
|
||||||
|
@ -651,6 +651,16 @@ if(WEBP_BUILD_EXTRAS)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(WEBP_BUILD_WEBP_JS)
|
if(WEBP_BUILD_WEBP_JS)
|
||||||
|
# The default stack size changed from 5MB to 64KB in 3.1.27. See
|
||||||
|
# https://crbug.com/webp/614.
|
||||||
|
if(EMSCRIPTEN_VERSION VERSION_GREATER_EQUAL "3.1.27")
|
||||||
|
# TOTAL_STACK size was renamed to STACK_SIZE in 3.1.27. The old name was
|
||||||
|
# kept for compatibility, but prefer the new one in case it is removed in
|
||||||
|
# the future.
|
||||||
|
set(emscripten_stack_size "-sSTACK_SIZE=5MB")
|
||||||
|
else()
|
||||||
|
set(emscripten_stack_size "-sTOTAL_STACK=5MB")
|
||||||
|
endif()
|
||||||
# wasm2js does not support SIMD.
|
# wasm2js does not support SIMD.
|
||||||
if(NOT WEBP_ENABLE_SIMD)
|
if(NOT WEBP_ENABLE_SIMD)
|
||||||
# JavaScript version
|
# JavaScript version
|
||||||
@ -660,7 +670,7 @@ if(WEBP_BUILD_WEBP_JS)
|
|||||||
set(WEBP_HAVE_SDL 1)
|
set(WEBP_HAVE_SDL 1)
|
||||||
set_target_properties(
|
set_target_properties(
|
||||||
webp_js
|
webp_js
|
||||||
PROPERTIES LINK_FLAGS "-sWASM=0 \
|
PROPERTIES LINK_FLAGS "-sWASM=0 ${emscripten_stack_size} \
|
||||||
-sEXPORTED_FUNCTIONS=_WebPToSDL -sINVOKE_RUN=0 \
|
-sEXPORTED_FUNCTIONS=_WebPToSDL -sINVOKE_RUN=0 \
|
||||||
-sEXPORTED_RUNTIME_METHODS=cwrap")
|
-sEXPORTED_RUNTIME_METHODS=cwrap")
|
||||||
set_target_properties(webp_js PROPERTIES OUTPUT_NAME webp)
|
set_target_properties(webp_js PROPERTIES OUTPUT_NAME webp)
|
||||||
@ -673,7 +683,7 @@ if(WEBP_BUILD_WEBP_JS)
|
|||||||
target_include_directories(webp_wasm PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
|
target_include_directories(webp_wasm PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
|
||||||
set_target_properties(
|
set_target_properties(
|
||||||
webp_wasm
|
webp_wasm
|
||||||
PROPERTIES LINK_FLAGS "-sWASM=1 \
|
PROPERTIES LINK_FLAGS "-sWASM=1 ${emscripten_stack_size} \
|
||||||
-sEXPORTED_FUNCTIONS=_WebPToSDL -sINVOKE_RUN=0 \
|
-sEXPORTED_FUNCTIONS=_WebPToSDL -sINVOKE_RUN=0 \
|
||||||
-sEXPORTED_RUNTIME_METHODS=cwrap")
|
-sEXPORTED_RUNTIME_METHODS=cwrap")
|
||||||
target_compile_definitions(webp_wasm PUBLIC EMSCRIPTEN WEBP_HAVE_SDL)
|
target_compile_definitions(webp_wasm PUBLIC EMSCRIPTEN WEBP_HAVE_SDL)
|
||||||
|
77
ChangeLog
77
ChangeLog
@ -1,3 +1,78 @@
|
|||||||
|
e1adea50 update NEWS
|
||||||
|
43393320 enc/*: normalize WebPEncodingSetError() calls
|
||||||
|
287fdefe enc/*: add missing WebPEncodingSetError() calls
|
||||||
|
c3bd7cff EncodeAlphaInternal: add missing error check
|
||||||
|
d49cfbb3 vp8l_enc,WriteImage: add missing error check
|
||||||
|
2e5a9ec3 muxread,MuxImageParse: add missing error checks
|
||||||
|
ebb6f949 cmake,emscripten: explicitly set stack size
|
||||||
|
59a2b1f9 WebPDecodeYUV: check u/v/stride/uv_stride ptrs
|
||||||
|
8e965ccb Call png_get_channels() to see if image has alpha
|
||||||
|
7f0a3419 update ChangeLog (tag: v1.3.1-rc1)
|
||||||
|
bab7efbe update NEWS
|
||||||
|
7138bf8f bump version to 1.3.1
|
||||||
|
435b4ded update AUTHORS
|
||||||
|
47351229 update .mailmap
|
||||||
|
ff6c7f4e CONTRIBUTING.md: add C style / cmake-format notes
|
||||||
|
dd530437 add .cmake-format.py
|
||||||
|
adbe2cb1 cmake,cosmetics: apply cmake-format
|
||||||
|
15b36508 doc/webp-container-spec: rm future codec comment
|
||||||
|
c369c4bf doc/webp-lossless-bitstream-spec: improve link text
|
||||||
|
1de35f47 doc/webp-container-spec: don't use 'currently'
|
||||||
|
bb06a16e doc/webp-container-spec: prefer present tense
|
||||||
|
9f38b71e doc/webp-lossless-bitstream-spec: prefer present tense
|
||||||
|
7acb6b82 doc/webp-container-spec: avoid i.e. & e.g.
|
||||||
|
4967e7cd doc/webp-lossless-bitstream-spec: avoid i.e. & e.g.
|
||||||
|
e3366659 Merge "Do not find_package image libraries if not needed." into main
|
||||||
|
428588ef clarify single leaf node trees and use of canonical prefix coding
|
||||||
|
709ec152 Do not find_package image libraries if not needed.
|
||||||
|
8dd80ef8 fuzz_utils.h: lower kFuzzPxLimit w/ASan
|
||||||
|
8f187b9f Clean message calls in CMake
|
||||||
|
cba30078 WebPConfig.cmake.in: use calculated include path
|
||||||
|
6cf9a76a Merge "webp-lossless-bitstream-spec: remove use of 'dynamics'" into main
|
||||||
|
740943b2 Merge "Specialize and optimize ITransform_SSE2 using do_two" into main
|
||||||
|
2d547e24 Compare kFuzzPxLimit to max_num_operations
|
||||||
|
ac42dde1 Specialize and optimize ITransform_SSE2 using do_two
|
||||||
|
17e0ef1d webp-lossless-bitstream-spec: remove use of 'dynamics'
|
||||||
|
ed274371 neon.h,cosmetics: clear a couple lint warnings
|
||||||
|
3fb82947 cpu.h,cosmetics: segment defines
|
||||||
|
0c496a4f cpu.h: add WEBP_AARCH64
|
||||||
|
8151f388 move VP8GetCPUInfo declaration to cpu.c
|
||||||
|
916548c2 Make kFuzzPxLimit sanitizer dependent
|
||||||
|
4070b271 advanced_api_fuzzer: reduce scaling limit
|
||||||
|
761f49c3 Merge "webp-lossless-bitstream-spec: add missing bits to ABNF" into main
|
||||||
|
84d04c48 webp-lossless-bitstream-spec: add missing bits to ABNF
|
||||||
|
0696e1a7 advanced_api_fuzzer: reduce scaling limit
|
||||||
|
93d88aa2 Merge "deps.cmake: remove unneeded header checks" into main
|
||||||
|
118e0035 deps.cmake: remove unneeded header checks
|
||||||
|
4c3d7018 webp-lossless-bitstream-spec: condense normal-prefix-code
|
||||||
|
a6a09b32 webp-lossless-bitstream-spec: fix 2 code typos
|
||||||
|
50ac4f7c Merge "cpu.h: enable NEON w/_M_ARM64EC" into main
|
||||||
|
4b7d7b4f Add contribution instructions
|
||||||
|
0afbd97b cpu.h: enable NEON w/_M_ARM64EC
|
||||||
|
349f4353 Merge changes Ibd89e56b,Ic57e7f84,I89096614 into main
|
||||||
|
8f7513b7 upsampling_neon.c: fix WEBP_SWAP_16BIT_CSP check
|
||||||
|
cbf624b5 advanced_api_fuzzer: reduce scaling limit
|
||||||
|
89edfdd1 Skip slow scaling in libwebp advanced_api_fuzzer
|
||||||
|
859f19f7 Reduce libwebp advanced_api_fuzzer threshold
|
||||||
|
a4f04835 Merge changes Ic389aaa2,I329ccd79 into main
|
||||||
|
1275fac8 Makefile.vc: fix img2webp link w/dynamic cfg
|
||||||
|
2fe27bb9 img2webp: normalize help output
|
||||||
|
24bed3d9 cwebp: reflow -near_lossless help text
|
||||||
|
0825faa4 img2webp: add -sharp_yuv/-near_lossless
|
||||||
|
d64e6d7d Merge "PaletteSortModifiedZeng: fix leak on error" into main
|
||||||
|
0e12a22d Merge "EncodeAlphaInternal: clear result->bw on error" into main
|
||||||
|
0edbb6ea PaletteSortModifiedZeng: fix leak on error
|
||||||
|
41ffe04e Merge "Update yapf style from "chromium" to "yapf"" into main
|
||||||
|
2d9d9265 Update yapf style from "chromium" to "yapf"
|
||||||
|
a486d800 EncodeAlphaInternal: clear result->bw on error
|
||||||
|
1347a32d Skip big scaled advanced_api_fuzzer
|
||||||
|
52b6f067 Fix scaling limit in advanced_api_fuzzer.c
|
||||||
|
73618428 Limit scaling in libwebp advanced_api_fuzzer.c
|
||||||
|
b54d21a0 Merge "CMakeLists.txt: allow CMAKE_INSTALL_RPATH to be set empty" into main
|
||||||
|
31c28db5 libwebp{,demux,mux}.pc.in: Requires -> Requires.private
|
||||||
|
d9a505ff CMakeLists.txt: allow CMAKE_INSTALL_RPATH to be set empty
|
||||||
|
bdf33d03 Merge tag 'v1.3.0'
|
||||||
|
b5577769 update ChangeLog (tag: v1.3.0-rc1, tag: v1.3.0)
|
||||||
0ba77244 update NEWS
|
0ba77244 update NEWS
|
||||||
e763eb1e bump version to 1.3.0
|
e763eb1e bump version to 1.3.0
|
||||||
2a8686fc update AUTHORS
|
2a8686fc update AUTHORS
|
||||||
@ -103,7 +178,7 @@ c626e7d5 cwebp: fix WebPPictureHasTransparency call
|
|||||||
866e349c Merge tag 'v1.2.4'
|
866e349c Merge tag 'v1.2.4'
|
||||||
c170df38 Merge "Create libsharpyuv.a in makefile.unix." into main
|
c170df38 Merge "Create libsharpyuv.a in makefile.unix." into main
|
||||||
9d7ff74a Create libsharpyuv.a in makefile.unix.
|
9d7ff74a Create libsharpyuv.a in makefile.unix.
|
||||||
0d1f1254 update ChangeLog (tag: v1.2.4, origin/1.2.4)
|
0d1f1254 update ChangeLog (tag: v1.2.4)
|
||||||
fcbc2d78 Merge "doc/*.txt: restrict code to 69 columns" into main
|
fcbc2d78 Merge "doc/*.txt: restrict code to 69 columns" into main
|
||||||
4ad0e189 Merge "webp-container-spec.txt: normalize fourcc spelling" into main
|
4ad0e189 Merge "webp-container-spec.txt: normalize fourcc spelling" into main
|
||||||
980d2488 update NEWS
|
980d2488 update NEWS
|
||||||
|
15
NEWS
15
NEWS
@ -1,3 +1,18 @@
|
|||||||
|
- 6/23/2023: version 1.3.1
|
||||||
|
This is a binary compatible release.
|
||||||
|
* security fixes for lossless encoder (#603, chromium: #1420107, #1455619,
|
||||||
|
CVE-2023-1999)
|
||||||
|
* improve error reporting through WebPPicture error codes
|
||||||
|
* fix upsampling for RGB565 and RGBA4444 in NEON builds
|
||||||
|
* img2webp: add -sharp_yuv & -near_lossless
|
||||||
|
* Windows builds:
|
||||||
|
- fix compatibility with clang-cl (#607)
|
||||||
|
- improve Arm64 performance with cl.exe
|
||||||
|
- add Arm64EC support
|
||||||
|
* fix webp_js with emcc >= 3.1.27 (stack size change, #614)
|
||||||
|
* CMake fixes (#592, #610, #612)
|
||||||
|
* further updates to the container and lossless bitstream docs (#581, #611)
|
||||||
|
|
||||||
- 12/16/2022: version 1.3.0
|
- 12/16/2022: version 1.3.0
|
||||||
This is a binary compatible release.
|
This is a binary compatible release.
|
||||||
* add libsharpyuv, which exposes -sharp_yuv/config.use_sharp_yuv
|
* add libsharpyuv, which exposes -sharp_yuv/config.use_sharp_yuv
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
\__\__/\____/\_____/__/ ____ ___
|
\__\__/\____/\_____/__/ ____ ___
|
||||||
/ _/ / \ \ / _ \/ _/
|
/ _/ / \ \ / _ \/ _/
|
||||||
/ \_/ / / \ \ __/ \__
|
/ \_/ / / \ \ __/ \__
|
||||||
\____/____/\_____/_____/____/v1.3.0
|
\____/____/\_____/_____/____/v1.3.1
|
||||||
```
|
```
|
||||||
|
|
||||||
WebP codec is a library to encode and decode images in WebP format. This package
|
WebP codec is a library to encode and decode images in WebP format. This package
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
AC_INIT([libwebp], [1.3.0],
|
AC_INIT([libwebp], [1.3.1],
|
||||||
[https://bugs.chromium.org/p/webp],,
|
[https://bugs.chromium.org/p/webp],,
|
||||||
[https://developers.google.com/speed/webp])
|
[https://developers.google.com/speed/webp])
|
||||||
AC_CANONICAL_HOST
|
AC_CANONICAL_HOST
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
|
|
||||||
#define XTRA_MAJ_VERSION 1
|
#define XTRA_MAJ_VERSION 1
|
||||||
#define XTRA_MIN_VERSION 3
|
#define XTRA_MIN_VERSION 3
|
||||||
#define XTRA_REV_VERSION 0
|
#define XTRA_REV_VERSION 1
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -235,7 +235,7 @@ int ReadPNG(const uint8_t* const data, size_t data_size,
|
|||||||
volatile png_infop end_info = NULL;
|
volatile png_infop end_info = NULL;
|
||||||
PNGReadContext context = { NULL, 0, 0 };
|
PNGReadContext context = { NULL, 0, 0 };
|
||||||
int color_type, bit_depth, interlaced;
|
int color_type, bit_depth, interlaced;
|
||||||
int has_alpha;
|
int num_channels;
|
||||||
int num_passes;
|
int num_passes;
|
||||||
int p;
|
int p;
|
||||||
volatile int ok = 0;
|
volatile int ok = 0;
|
||||||
@ -293,9 +293,6 @@ int ReadPNG(const uint8_t* const data, size_t data_size,
|
|||||||
}
|
}
|
||||||
if (png_get_valid(png, info, PNG_INFO_tRNS)) {
|
if (png_get_valid(png, info, PNG_INFO_tRNS)) {
|
||||||
png_set_tRNS_to_alpha(png);
|
png_set_tRNS_to_alpha(png);
|
||||||
has_alpha = 1;
|
|
||||||
} else {
|
|
||||||
has_alpha = !!(color_type & PNG_COLOR_MASK_ALPHA);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Apply gamma correction if needed.
|
// Apply gamma correction if needed.
|
||||||
@ -310,13 +307,16 @@ int ReadPNG(const uint8_t* const data, size_t data_size,
|
|||||||
|
|
||||||
if (!keep_alpha) {
|
if (!keep_alpha) {
|
||||||
png_set_strip_alpha(png);
|
png_set_strip_alpha(png);
|
||||||
has_alpha = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
num_passes = png_set_interlace_handling(png);
|
num_passes = png_set_interlace_handling(png);
|
||||||
png_read_update_info(png, info);
|
png_read_update_info(png, info);
|
||||||
|
|
||||||
stride = (int64_t)(has_alpha ? 4 : 3) * width * sizeof(*rgb);
|
num_channels = png_get_channels(png, info);
|
||||||
|
if (num_channels != 3 && num_channels != 4) {
|
||||||
|
goto Error;
|
||||||
|
}
|
||||||
|
stride = (int64_t)num_channels * width * sizeof(*rgb);
|
||||||
if (stride != (int)stride ||
|
if (stride != (int)stride ||
|
||||||
!ImgIoUtilCheckSizeArgumentsOverflow(stride, height)) {
|
!ImgIoUtilCheckSizeArgumentsOverflow(stride, height)) {
|
||||||
goto Error;
|
goto Error;
|
||||||
@ -341,8 +341,8 @@ int ReadPNG(const uint8_t* const data, size_t data_size,
|
|||||||
|
|
||||||
pic->width = (int)width;
|
pic->width = (int)width;
|
||||||
pic->height = (int)height;
|
pic->height = (int)height;
|
||||||
ok = has_alpha ? WebPPictureImportRGBA(pic, rgb, (int)stride)
|
ok = (num_channels == 4) ? WebPPictureImportRGBA(pic, rgb, (int)stride)
|
||||||
: WebPPictureImportRGB(pic, rgb, (int)stride);
|
: WebPPictureImportRGB(pic, rgb, (int)stride);
|
||||||
|
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
goto Error;
|
goto Error;
|
||||||
|
@ -33,7 +33,7 @@ libsharpyuv_la_SOURCES += sharpyuv_gamma.c sharpyuv_gamma.h
|
|||||||
libsharpyuv_la_SOURCES += sharpyuv.c sharpyuv.h
|
libsharpyuv_la_SOURCES += sharpyuv.c sharpyuv.h
|
||||||
|
|
||||||
libsharpyuv_la_CPPFLAGS = $(AM_CPPFLAGS)
|
libsharpyuv_la_CPPFLAGS = $(AM_CPPFLAGS)
|
||||||
libsharpyuv_la_LDFLAGS = -no-undefined -version-info 0:0:0 -lm
|
libsharpyuv_la_LDFLAGS = -no-undefined -version-info 0:1:0 -lm
|
||||||
libsharpyuv_la_LIBADD =
|
libsharpyuv_la_LIBADD =
|
||||||
libsharpyuv_la_LIBADD += libsharpyuv_sse2.la
|
libsharpyuv_la_LIBADD += libsharpyuv_sse2.la
|
||||||
libsharpyuv_la_LIBADD += libsharpyuv_neon.la
|
libsharpyuv_la_LIBADD += libsharpyuv_neon.la
|
||||||
|
@ -6,8 +6,8 @@
|
|||||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 0,0,2,0
|
FILEVERSION 0,0,2,1
|
||||||
PRODUCTVERSION 0,0,2,0
|
PRODUCTVERSION 0,0,2,1
|
||||||
FILEFLAGSMASK 0x3fL
|
FILEFLAGSMASK 0x3fL
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
FILEFLAGS 0x1L
|
FILEFLAGS 0x1L
|
||||||
@ -24,12 +24,12 @@ BEGIN
|
|||||||
BEGIN
|
BEGIN
|
||||||
VALUE "CompanyName", "Google, Inc."
|
VALUE "CompanyName", "Google, Inc."
|
||||||
VALUE "FileDescription", "libsharpyuv DLL"
|
VALUE "FileDescription", "libsharpyuv DLL"
|
||||||
VALUE "FileVersion", "0.2.0"
|
VALUE "FileVersion", "0.2.1"
|
||||||
VALUE "InternalName", "libsharpyuv.dll"
|
VALUE "InternalName", "libsharpyuv.dll"
|
||||||
VALUE "LegalCopyright", "Copyright (C) 2022"
|
VALUE "LegalCopyright", "Copyright (C) 2023"
|
||||||
VALUE "OriginalFilename", "libsharpyuv.dll"
|
VALUE "OriginalFilename", "libsharpyuv.dll"
|
||||||
VALUE "ProductName", "SharpYuv Library"
|
VALUE "ProductName", "SharpYuv Library"
|
||||||
VALUE "ProductVersion", "0.2.0"
|
VALUE "ProductVersion", "0.2.1"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
|
@ -36,7 +36,7 @@ libwebp_la_LIBADD += utils/libwebputils.la
|
|||||||
# other than the ones listed on the command line, i.e., after linking, it will
|
# other than the ones listed on the command line, i.e., after linking, it will
|
||||||
# not have unresolved symbols. Some platforms (Windows among them) require all
|
# not have unresolved symbols. Some platforms (Windows among them) require all
|
||||||
# symbols in shared libraries to be resolved at library creation.
|
# symbols in shared libraries to be resolved at library creation.
|
||||||
libwebp_la_LDFLAGS = -no-undefined -version-info 8:6:1
|
libwebp_la_LDFLAGS = -no-undefined -version-info 8:7:1
|
||||||
libwebpincludedir = $(includedir)/webp
|
libwebpincludedir = $(includedir)/webp
|
||||||
pkgconfig_DATA = libwebp.pc
|
pkgconfig_DATA = libwebp.pc
|
||||||
|
|
||||||
@ -48,7 +48,7 @@ if BUILD_LIBWEBPDECODER
|
|||||||
libwebpdecoder_la_LIBADD += dsp/libwebpdspdecode.la
|
libwebpdecoder_la_LIBADD += dsp/libwebpdspdecode.la
|
||||||
libwebpdecoder_la_LIBADD += utils/libwebputilsdecode.la
|
libwebpdecoder_la_LIBADD += utils/libwebputilsdecode.la
|
||||||
|
|
||||||
libwebpdecoder_la_LDFLAGS = -no-undefined -version-info 4:6:1
|
libwebpdecoder_la_LDFLAGS = -no-undefined -version-info 4:7:1
|
||||||
pkgconfig_DATA += libwebpdecoder.pc
|
pkgconfig_DATA += libwebpdecoder.pc
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ extern "C" {
|
|||||||
// version numbers
|
// version numbers
|
||||||
#define DEC_MAJ_VERSION 1
|
#define DEC_MAJ_VERSION 1
|
||||||
#define DEC_MIN_VERSION 3
|
#define DEC_MIN_VERSION 3
|
||||||
#define DEC_REV_VERSION 0
|
#define DEC_REV_VERSION 1
|
||||||
|
|
||||||
// YUV-cache parameters. Cache is 32-bytes wide (= one cacheline).
|
// YUV-cache parameters. Cache is 32-bytes wide (= one cacheline).
|
||||||
// Constraints are: We need to store one 16x16 block of luma samples (y),
|
// Constraints are: We need to store one 16x16 block of luma samples (y),
|
||||||
|
@ -658,19 +658,26 @@ uint8_t* WebPDecodeBGRA(const uint8_t* data, size_t data_size,
|
|||||||
uint8_t* WebPDecodeYUV(const uint8_t* data, size_t data_size,
|
uint8_t* WebPDecodeYUV(const uint8_t* data, size_t data_size,
|
||||||
int* width, int* height, uint8_t** u, uint8_t** v,
|
int* width, int* height, uint8_t** u, uint8_t** v,
|
||||||
int* stride, int* uv_stride) {
|
int* stride, int* uv_stride) {
|
||||||
WebPDecBuffer output; // only to preserve the side-infos
|
// data, width and height are checked by Decode().
|
||||||
uint8_t* const out = Decode(MODE_YUV, data, data_size,
|
if (u == NULL || v == NULL || stride == NULL || uv_stride == NULL) {
|
||||||
width, height, &output);
|
return NULL;
|
||||||
|
}
|
||||||
if (out != NULL) {
|
|
||||||
const WebPYUVABuffer* const buf = &output.u.YUVA;
|
{
|
||||||
*u = buf->u;
|
WebPDecBuffer output; // only to preserve the side-infos
|
||||||
*v = buf->v;
|
uint8_t* const out = Decode(MODE_YUV, data, data_size,
|
||||||
*stride = buf->y_stride;
|
width, height, &output);
|
||||||
*uv_stride = buf->u_stride;
|
|
||||||
assert(buf->u_stride == buf->v_stride);
|
if (out != NULL) {
|
||||||
|
const WebPYUVABuffer* const buf = &output.u.YUVA;
|
||||||
|
*u = buf->u;
|
||||||
|
*v = buf->v;
|
||||||
|
*stride = buf->y_stride;
|
||||||
|
*uv_stride = buf->u_stride;
|
||||||
|
assert(buf->u_stride == buf->v_stride);
|
||||||
|
}
|
||||||
|
return out;
|
||||||
}
|
}
|
||||||
return out;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void DefaultFeatures(WebPBitstreamFeatures* const features) {
|
static void DefaultFeatures(WebPBitstreamFeatures* const features) {
|
||||||
|
@ -13,6 +13,6 @@ noinst_HEADERS =
|
|||||||
noinst_HEADERS += ../webp/format_constants.h
|
noinst_HEADERS += ../webp/format_constants.h
|
||||||
|
|
||||||
libwebpdemux_la_LIBADD = ../libwebp.la
|
libwebpdemux_la_LIBADD = ../libwebp.la
|
||||||
libwebpdemux_la_LDFLAGS = -no-undefined -version-info 2:12:0
|
libwebpdemux_la_LDFLAGS = -no-undefined -version-info 2:13:0
|
||||||
libwebpdemuxincludedir = $(includedir)/webp
|
libwebpdemuxincludedir = $(includedir)/webp
|
||||||
pkgconfig_DATA = libwebpdemux.pc
|
pkgconfig_DATA = libwebpdemux.pc
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
#define DMUX_MAJ_VERSION 1
|
#define DMUX_MAJ_VERSION 1
|
||||||
#define DMUX_MIN_VERSION 3
|
#define DMUX_MIN_VERSION 3
|
||||||
#define DMUX_REV_VERSION 0
|
#define DMUX_REV_VERSION 1
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
size_t start_; // start location of the data
|
size_t start_; // start location of the data
|
||||||
|
@ -6,8 +6,8 @@
|
|||||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 1,0,3,0
|
FILEVERSION 1,0,3,1
|
||||||
PRODUCTVERSION 1,0,3,0
|
PRODUCTVERSION 1,0,3,1
|
||||||
FILEFLAGSMASK 0x3fL
|
FILEFLAGSMASK 0x3fL
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
FILEFLAGS 0x1L
|
FILEFLAGS 0x1L
|
||||||
@ -24,12 +24,12 @@ BEGIN
|
|||||||
BEGIN
|
BEGIN
|
||||||
VALUE "CompanyName", "Google, Inc."
|
VALUE "CompanyName", "Google, Inc."
|
||||||
VALUE "FileDescription", "libwebpdemux DLL"
|
VALUE "FileDescription", "libwebpdemux DLL"
|
||||||
VALUE "FileVersion", "1.3.0"
|
VALUE "FileVersion", "1.3.1"
|
||||||
VALUE "InternalName", "libwebpdemux.dll"
|
VALUE "InternalName", "libwebpdemux.dll"
|
||||||
VALUE "LegalCopyright", "Copyright (C) 2022"
|
VALUE "LegalCopyright", "Copyright (C) 2023"
|
||||||
VALUE "OriginalFilename", "libwebpdemux.dll"
|
VALUE "OriginalFilename", "libwebpdemux.dll"
|
||||||
VALUE "ProductName", "WebP Image Demuxer"
|
VALUE "ProductName", "WebP Image Demuxer"
|
||||||
VALUE "ProductVersion", "1.3.0"
|
VALUE "ProductVersion", "1.3.1"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
|
@ -141,6 +141,11 @@ static int EncodeAlphaInternal(const uint8_t* const data, int width, int height,
|
|||||||
!reduce_levels, &tmp_bw, &result->stats);
|
!reduce_levels, &tmp_bw, &result->stats);
|
||||||
if (ok) {
|
if (ok) {
|
||||||
output = VP8LBitWriterFinish(&tmp_bw);
|
output = VP8LBitWriterFinish(&tmp_bw);
|
||||||
|
if (tmp_bw.error_) {
|
||||||
|
VP8LBitWriterWipeOut(&tmp_bw);
|
||||||
|
memset(&result->bw, 0, sizeof(result->bw));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
output_size = VP8LBitWriterNumBytes(&tmp_bw);
|
output_size = VP8LBitWriterNumBytes(&tmp_bw);
|
||||||
if (output_size > data_size) {
|
if (output_size > data_size) {
|
||||||
// compressed size is larger than source! Revert to uncompressed mode.
|
// compressed size is larger than source! Revert to uncompressed mode.
|
||||||
@ -314,11 +319,11 @@ static int EncodeAlpha(VP8Encoder* const enc,
|
|||||||
assert(filter >= WEBP_FILTER_NONE && filter <= WEBP_FILTER_FAST);
|
assert(filter >= WEBP_FILTER_NONE && filter <= WEBP_FILTER_FAST);
|
||||||
|
|
||||||
if (quality < 0 || quality > 100) {
|
if (quality < 0 || quality > 100) {
|
||||||
return 0;
|
return WebPEncodingSetError(pic, VP8_ENC_ERROR_INVALID_CONFIGURATION);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (method < ALPHA_NO_COMPRESSION || method > ALPHA_LOSSLESS_COMPRESSION) {
|
if (method < ALPHA_NO_COMPRESSION || method > ALPHA_LOSSLESS_COMPRESSION) {
|
||||||
return 0;
|
return WebPEncodingSetError(pic, VP8_ENC_ERROR_INVALID_CONFIGURATION);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (method == ALPHA_NO_COMPRESSION) {
|
if (method == ALPHA_NO_COMPRESSION) {
|
||||||
@ -328,7 +333,7 @@ static int EncodeAlpha(VP8Encoder* const enc,
|
|||||||
|
|
||||||
quant_alpha = (uint8_t*)WebPSafeMalloc(1ULL, data_size);
|
quant_alpha = (uint8_t*)WebPSafeMalloc(1ULL, data_size);
|
||||||
if (quant_alpha == NULL) {
|
if (quant_alpha == NULL) {
|
||||||
return 0;
|
return WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Extract alpha data (width x height) from raw_data (stride x height).
|
// Extract alpha data (width x height) from raw_data (stride x height).
|
||||||
@ -348,6 +353,9 @@ static int EncodeAlpha(VP8Encoder* const enc,
|
|||||||
ok = ApplyFiltersAndEncode(quant_alpha, width, height, data_size, method,
|
ok = ApplyFiltersAndEncode(quant_alpha, width, height, data_size, method,
|
||||||
filter, reduce_levels, effort_level, output,
|
filter, reduce_levels, effort_level, output,
|
||||||
output_size, pic->stats);
|
output_size, pic->stats);
|
||||||
|
if (!ok) {
|
||||||
|
WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY); // imprecise
|
||||||
|
}
|
||||||
#if !defined(WEBP_DISABLE_STATS)
|
#if !defined(WEBP_DISABLE_STATS)
|
||||||
if (pic->stats != NULL) { // need stats?
|
if (pic->stats != NULL) { // need stats?
|
||||||
pic->stats->coded_size += (int)(*output_size);
|
pic->stats->coded_size += (int)(*output_size);
|
||||||
@ -407,7 +415,7 @@ int VP8EncStartAlpha(VP8Encoder* const enc) {
|
|||||||
WebPWorker* const worker = &enc->alpha_worker_;
|
WebPWorker* const worker = &enc->alpha_worker_;
|
||||||
// Makes sure worker is good to go.
|
// Makes sure worker is good to go.
|
||||||
if (!WebPGetWorkerInterface()->Reset(worker)) {
|
if (!WebPGetWorkerInterface()->Reset(worker)) {
|
||||||
return 0;
|
return WebPEncodingSetError(enc->pic_, VP8_ENC_ERROR_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
WebPGetWorkerInterface()->Launch(worker);
|
WebPGetWorkerInterface()->Launch(worker);
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -474,6 +474,10 @@ int VP8EncAnalyze(VP8Encoder* const enc) {
|
|||||||
} else { // Use only one default segment.
|
} else { // Use only one default segment.
|
||||||
ResetAllMBInfo(enc);
|
ResetAllMBInfo(enc);
|
||||||
}
|
}
|
||||||
|
if (!ok) {
|
||||||
|
return WebPEncodingSetError(enc->pic_,
|
||||||
|
VP8_ENC_ERROR_OUT_OF_MEMORY); // imprecise
|
||||||
|
}
|
||||||
return ok;
|
return ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -283,8 +283,7 @@ int VP8LHashChainFill(VP8LHashChain* const p, int quality,
|
|||||||
hash_to_first_index =
|
hash_to_first_index =
|
||||||
(int32_t*)WebPSafeMalloc(HASH_SIZE, sizeof(*hash_to_first_index));
|
(int32_t*)WebPSafeMalloc(HASH_SIZE, sizeof(*hash_to_first_index));
|
||||||
if (hash_to_first_index == NULL) {
|
if (hash_to_first_index == NULL) {
|
||||||
WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
|
return WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
percent_range = remaining_percent / 2;
|
percent_range = remaining_percent / 2;
|
||||||
@ -1050,8 +1049,7 @@ int VP8LGetBackwardReferences(
|
|||||||
refs_best = GetBackwardReferencesLowEffort(
|
refs_best = GetBackwardReferencesLowEffort(
|
||||||
width, height, argb, cache_bits_best, hash_chain, refs);
|
width, height, argb, cache_bits_best, hash_chain, refs);
|
||||||
if (refs_best == NULL) {
|
if (refs_best == NULL) {
|
||||||
WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
|
return WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
// Set it in first position.
|
// Set it in first position.
|
||||||
BackwardRefsSwap(refs_best, &refs[0]);
|
BackwardRefsSwap(refs_best, &refs[0]);
|
||||||
@ -1059,8 +1057,7 @@ int VP8LGetBackwardReferences(
|
|||||||
if (!GetBackwardReferences(width, height, argb, quality, lz77_types_to_try,
|
if (!GetBackwardReferences(width, height, argb, quality, lz77_types_to_try,
|
||||||
cache_bits_max, do_no_cache, hash_chain, refs,
|
cache_bits_max, do_no_cache, hash_chain, refs,
|
||||||
cache_bits_best)) {
|
cache_bits_best)) {
|
||||||
WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
|
return WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -689,7 +689,7 @@ static int PreLoopInitialize(VP8Encoder* const enc) {
|
|||||||
}
|
}
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
VP8EncFreeBitWriters(enc); // malloc error occurred
|
VP8EncFreeBitWriters(enc); // malloc error occurred
|
||||||
WebPEncodingSetError(enc->pic_, VP8_ENC_ERROR_OUT_OF_MEMORY);
|
return WebPEncodingSetError(enc->pic_, VP8_ENC_ERROR_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
return ok;
|
return ok;
|
||||||
}
|
}
|
||||||
@ -719,6 +719,7 @@ static int PostLoopFinalize(VP8EncIterator* const it, int ok) {
|
|||||||
} else {
|
} else {
|
||||||
// Something bad happened -> need to do some memory cleanup.
|
// Something bad happened -> need to do some memory cleanup.
|
||||||
VP8EncFreeBitWriters(enc);
|
VP8EncFreeBitWriters(enc);
|
||||||
|
return WebPEncodingSetError(enc->pic_, VP8_ENC_ERROR_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
return ok;
|
return ok;
|
||||||
}
|
}
|
||||||
@ -754,6 +755,11 @@ int VP8EncLoop(VP8Encoder* const enc) {
|
|||||||
// *then* decide how to code the skip decision if there's one.
|
// *then* decide how to code the skip decision if there's one.
|
||||||
if (!VP8Decimate(&it, &info, rd_opt) || dont_use_skip) {
|
if (!VP8Decimate(&it, &info, rd_opt) || dont_use_skip) {
|
||||||
CodeResiduals(it.bw_, &it, &info);
|
CodeResiduals(it.bw_, &it, &info);
|
||||||
|
if (it.bw_->error_) {
|
||||||
|
// enc->pic_->error_code is set in PostLoopFinalize().
|
||||||
|
ok = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
} else { // reset predictors after a skip
|
} else { // reset predictors after a skip
|
||||||
ResetAfterSkip(&it);
|
ResetAfterSkip(&it);
|
||||||
}
|
}
|
||||||
|
@ -535,7 +535,9 @@ static int ImportYUVAFromRGBA(const uint8_t* r_ptr,
|
|||||||
WebPInitConvertARGBToYUV();
|
WebPInitConvertARGBToYUV();
|
||||||
InitGammaTables();
|
InitGammaTables();
|
||||||
|
|
||||||
if (tmp_rgb == NULL) return 0; // malloc error
|
if (tmp_rgb == NULL) {
|
||||||
|
return WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY);
|
||||||
|
}
|
||||||
|
|
||||||
// Downsample Y/U/V planes, two rows at a time
|
// Downsample Y/U/V planes, two rows at a time
|
||||||
for (y = 0; y < (height >> 1); ++y) {
|
for (y = 0; y < (height >> 1); ++y) {
|
||||||
|
@ -137,7 +137,9 @@ int WebPPictureCrop(WebPPicture* pic,
|
|||||||
PictureGrabSpecs(pic, &tmp);
|
PictureGrabSpecs(pic, &tmp);
|
||||||
tmp.width = width;
|
tmp.width = width;
|
||||||
tmp.height = height;
|
tmp.height = height;
|
||||||
if (!WebPPictureAlloc(&tmp)) return 0;
|
if (!WebPPictureAlloc(&tmp)) {
|
||||||
|
return WebPEncodingSetError(pic, tmp.error_code);
|
||||||
|
}
|
||||||
|
|
||||||
if (!pic->use_argb) {
|
if (!pic->use_argb) {
|
||||||
const int y_offset = top * pic->y_stride + left;
|
const int y_offset = top * pic->y_stride + left;
|
||||||
@ -212,26 +214,28 @@ int WebPPictureRescale(WebPPicture* picture, int width, int height) {
|
|||||||
prev_height = picture->height;
|
prev_height = picture->height;
|
||||||
if (!WebPRescalerGetScaledDimensions(
|
if (!WebPRescalerGetScaledDimensions(
|
||||||
prev_width, prev_height, &width, &height)) {
|
prev_width, prev_height, &width, &height)) {
|
||||||
return 0;
|
return WebPEncodingSetError(picture, VP8_ENC_ERROR_BAD_DIMENSION);
|
||||||
}
|
}
|
||||||
|
|
||||||
PictureGrabSpecs(picture, &tmp);
|
PictureGrabSpecs(picture, &tmp);
|
||||||
tmp.width = width;
|
tmp.width = width;
|
||||||
tmp.height = height;
|
tmp.height = height;
|
||||||
if (!WebPPictureAlloc(&tmp)) return 0;
|
if (!WebPPictureAlloc(&tmp)) {
|
||||||
|
return WebPEncodingSetError(picture, tmp.error_code);
|
||||||
|
}
|
||||||
|
|
||||||
if (!picture->use_argb) {
|
if (!picture->use_argb) {
|
||||||
work = (rescaler_t*)WebPSafeMalloc(2ULL * width, sizeof(*work));
|
work = (rescaler_t*)WebPSafeMalloc(2ULL * width, sizeof(*work));
|
||||||
if (work == NULL) {
|
if (work == NULL) {
|
||||||
WebPPictureFree(&tmp);
|
WebPPictureFree(&tmp);
|
||||||
return 0;
|
return WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
// If present, we need to rescale alpha first (for AlphaMultiplyY).
|
// If present, we need to rescale alpha first (for AlphaMultiplyY).
|
||||||
if (picture->a != NULL) {
|
if (picture->a != NULL) {
|
||||||
WebPInitAlphaProcessing();
|
WebPInitAlphaProcessing();
|
||||||
if (!RescalePlane(picture->a, prev_width, prev_height, picture->a_stride,
|
if (!RescalePlane(picture->a, prev_width, prev_height, picture->a_stride,
|
||||||
tmp.a, width, height, tmp.a_stride, work, 1)) {
|
tmp.a, width, height, tmp.a_stride, work, 1)) {
|
||||||
return 0;
|
return WebPEncodingSetError(picture, VP8_ENC_ERROR_BAD_DIMENSION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -246,14 +250,14 @@ int WebPPictureRescale(WebPPicture* picture, int width, int height) {
|
|||||||
!RescalePlane(picture->v, HALVE(prev_width), HALVE(prev_height),
|
!RescalePlane(picture->v, HALVE(prev_width), HALVE(prev_height),
|
||||||
picture->uv_stride, tmp.v, HALVE(width), HALVE(height),
|
picture->uv_stride, tmp.v, HALVE(width), HALVE(height),
|
||||||
tmp.uv_stride, work, 1)) {
|
tmp.uv_stride, work, 1)) {
|
||||||
return 0;
|
return WebPEncodingSetError(picture, VP8_ENC_ERROR_BAD_DIMENSION);
|
||||||
}
|
}
|
||||||
AlphaMultiplyY(&tmp, 1);
|
AlphaMultiplyY(&tmp, 1);
|
||||||
} else {
|
} else {
|
||||||
work = (rescaler_t*)WebPSafeMalloc(2ULL * width * 4, sizeof(*work));
|
work = (rescaler_t*)WebPSafeMalloc(2ULL * width * 4, sizeof(*work));
|
||||||
if (work == NULL) {
|
if (work == NULL) {
|
||||||
WebPPictureFree(&tmp);
|
WebPPictureFree(&tmp);
|
||||||
return 0;
|
return WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
// In order to correctly interpolate colors, we need to apply the alpha
|
// In order to correctly interpolate colors, we need to apply the alpha
|
||||||
// weighting first (black-matting), scale the RGB values, and remove
|
// weighting first (black-matting), scale the RGB values, and remove
|
||||||
@ -263,7 +267,7 @@ int WebPPictureRescale(WebPPicture* picture, int width, int height) {
|
|||||||
if (!RescalePlane((const uint8_t*)picture->argb, prev_width, prev_height,
|
if (!RescalePlane((const uint8_t*)picture->argb, prev_width, prev_height,
|
||||||
picture->argb_stride * 4, (uint8_t*)tmp.argb, width,
|
picture->argb_stride * 4, (uint8_t*)tmp.argb, width,
|
||||||
height, tmp.argb_stride * 4, work, 4)) {
|
height, tmp.argb_stride * 4, work, 4)) {
|
||||||
return 0;
|
return WebPEncodingSetError(picture, VP8_ENC_ERROR_BAD_DIMENSION);
|
||||||
}
|
}
|
||||||
AlphaMultiplyARGB(&tmp, 1);
|
AlphaMultiplyARGB(&tmp, 1);
|
||||||
}
|
}
|
||||||
|
@ -258,7 +258,10 @@ static int EmitPartitionsSize(const VP8Encoder* const enc,
|
|||||||
buf[3 * p + 1] = (part_size >> 8) & 0xff;
|
buf[3 * p + 1] = (part_size >> 8) & 0xff;
|
||||||
buf[3 * p + 2] = (part_size >> 16) & 0xff;
|
buf[3 * p + 2] = (part_size >> 16) & 0xff;
|
||||||
}
|
}
|
||||||
return p ? pic->writer(buf, 3 * p, pic) : 1;
|
if (p && !pic->writer(buf, 3 * p, pic)) {
|
||||||
|
return WebPEncodingSetError(pic, VP8_ENC_ERROR_BAD_WRITE);
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
@ -381,6 +384,7 @@ int VP8EncWrite(VP8Encoder* const enc) {
|
|||||||
|
|
||||||
enc->coded_size_ = (int)(CHUNK_HEADER_SIZE + riff_size);
|
enc->coded_size_ = (int)(CHUNK_HEADER_SIZE + riff_size);
|
||||||
ok = ok && WebPReportProgress(pic, final_percent, &enc->percent_);
|
ok = ok && WebPReportProgress(pic, final_percent, &enc->percent_);
|
||||||
|
if (!ok) WebPEncodingSetError(pic, VP8_ENC_ERROR_BAD_WRITE);
|
||||||
return ok;
|
return ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ extern "C" {
|
|||||||
// version numbers
|
// version numbers
|
||||||
#define ENC_MAJ_VERSION 1
|
#define ENC_MAJ_VERSION 1
|
||||||
#define ENC_MIN_VERSION 3
|
#define ENC_MIN_VERSION 3
|
||||||
#define ENC_REV_VERSION 0
|
#define ENC_REV_VERSION 1
|
||||||
|
|
||||||
enum { MAX_LF_LEVELS = 64, // Maximum loop filter level
|
enum { MAX_LF_LEVELS = 64, // Maximum loop filter level
|
||||||
MAX_VARIABLE_LEVEL = 67, // last (inclusive) level with variable cost
|
MAX_VARIABLE_LEVEL = 67, // last (inclusive) level with variable cost
|
||||||
|
@ -196,8 +196,7 @@ static int CoOccurrenceBuild(const WebPPicture* const pic,
|
|||||||
uint32_t palette_sorted[MAX_PALETTE_SIZE];
|
uint32_t palette_sorted[MAX_PALETTE_SIZE];
|
||||||
lines = (uint32_t*)WebPSafeMalloc(2 * pic->width, sizeof(*lines));
|
lines = (uint32_t*)WebPSafeMalloc(2 * pic->width, sizeof(*lines));
|
||||||
if (lines == NULL) {
|
if (lines == NULL) {
|
||||||
WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
|
return WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
line_top = &lines[0];
|
line_top = &lines[0];
|
||||||
line_current = &lines[pic->width];
|
line_current = &lines[pic->width];
|
||||||
@ -255,8 +254,7 @@ static int PaletteSortModifiedZeng(
|
|||||||
cooccurrence =
|
cooccurrence =
|
||||||
(uint32_t*)WebPSafeCalloc(num_colors * num_colors, sizeof(*cooccurrence));
|
(uint32_t*)WebPSafeCalloc(num_colors * num_colors, sizeof(*cooccurrence));
|
||||||
if (cooccurrence == NULL) {
|
if (cooccurrence == NULL) {
|
||||||
WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
|
return WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
if (!CoOccurrenceBuild(pic, palette_sorted, num_colors, cooccurrence)) {
|
if (!CoOccurrenceBuild(pic, palette_sorted, num_colors, cooccurrence)) {
|
||||||
WebPSafeFree(cooccurrence);
|
WebPSafeFree(cooccurrence);
|
||||||
@ -1013,8 +1011,7 @@ static int StoreImageToBitMask(
|
|||||||
VP8LRefsCursorNext(&c);
|
VP8LRefsCursorNext(&c);
|
||||||
}
|
}
|
||||||
if (bw->error_) {
|
if (bw->error_) {
|
||||||
WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
|
return WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -1298,7 +1295,10 @@ static int EncodeImageInternal(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
tokens = (HuffmanTreeToken*)WebPSafeMalloc(max_tokens, sizeof(*tokens));
|
tokens = (HuffmanTreeToken*)WebPSafeMalloc(max_tokens, sizeof(*tokens));
|
||||||
if (tokens == NULL) goto Error;
|
if (tokens == NULL) {
|
||||||
|
WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
|
||||||
|
goto Error;
|
||||||
|
}
|
||||||
for (i = 0; i < 5 * histogram_image_size; ++i) {
|
for (i = 0; i < 5 * histogram_image_size; ++i) {
|
||||||
HuffmanTreeCode* const codes = &huffman_codes[i];
|
HuffmanTreeCode* const codes = &huffman_codes[i];
|
||||||
StoreHuffmanCode(bw, huff_tree, tokens, codes);
|
StoreHuffmanCode(bw, huff_tree, tokens, codes);
|
||||||
@ -1449,18 +1449,21 @@ static int WriteImage(const WebPPicture* const pic, VP8LBitWriter* const bw,
|
|||||||
const size_t vp8l_size = VP8L_SIGNATURE_SIZE + webpll_size;
|
const size_t vp8l_size = VP8L_SIGNATURE_SIZE + webpll_size;
|
||||||
const size_t pad = vp8l_size & 1;
|
const size_t pad = vp8l_size & 1;
|
||||||
const size_t riff_size = TAG_SIZE + CHUNK_HEADER_SIZE + vp8l_size + pad;
|
const size_t riff_size = TAG_SIZE + CHUNK_HEADER_SIZE + vp8l_size + pad;
|
||||||
|
*coded_size = 0;
|
||||||
|
|
||||||
|
if (bw->error_) {
|
||||||
|
return WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
|
||||||
|
}
|
||||||
|
|
||||||
if (!WriteRiffHeader(pic, riff_size, vp8l_size) ||
|
if (!WriteRiffHeader(pic, riff_size, vp8l_size) ||
|
||||||
!pic->writer(webpll_data, webpll_size, pic)) {
|
!pic->writer(webpll_data, webpll_size, pic)) {
|
||||||
WebPEncodingSetError(pic, VP8_ENC_ERROR_BAD_WRITE);
|
return WebPEncodingSetError(pic, VP8_ENC_ERROR_BAD_WRITE);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pad) {
|
if (pad) {
|
||||||
const uint8_t pad_byte[1] = { 0 };
|
const uint8_t pad_byte[1] = { 0 };
|
||||||
if (!pic->writer(pad_byte, 1, pic)) {
|
if (!pic->writer(pad_byte, 1, pic)) {
|
||||||
WebPEncodingSetError(pic, VP8_ENC_ERROR_BAD_WRITE);
|
return WebPEncodingSetError(pic, VP8_ENC_ERROR_BAD_WRITE);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*coded_size = CHUNK_HEADER_SIZE + riff_size;
|
*coded_size = CHUNK_HEADER_SIZE + riff_size;
|
||||||
@ -1505,8 +1508,7 @@ static int AllocateTransformBuffer(VP8LEncoder* const enc, int width,
|
|||||||
ClearTransformBuffer(enc);
|
ClearTransformBuffer(enc);
|
||||||
mem = (uint32_t*)WebPSafeMalloc(mem_size, sizeof(*mem));
|
mem = (uint32_t*)WebPSafeMalloc(mem_size, sizeof(*mem));
|
||||||
if (mem == NULL) {
|
if (mem == NULL) {
|
||||||
WebPEncodingSetError(enc->pic_, VP8_ENC_ERROR_OUT_OF_MEMORY);
|
return WebPEncodingSetError(enc->pic_, VP8_ENC_ERROR_OUT_OF_MEMORY);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
enc->transform_mem_ = mem;
|
enc->transform_mem_ = mem;
|
||||||
enc->transform_mem_size_ = (size_t)mem_size;
|
enc->transform_mem_size_ = (size_t)mem_size;
|
||||||
@ -1614,8 +1616,7 @@ static int ApplyPalette(const uint32_t* src, uint32_t src_stride, uint32_t* dst,
|
|||||||
int x, y;
|
int x, y;
|
||||||
|
|
||||||
if (tmp_row == NULL) {
|
if (tmp_row == NULL) {
|
||||||
WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
|
return WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (palette_size < APPLY_PALETTE_GREEDY_MAX) {
|
if (palette_size < APPLY_PALETTE_GREEDY_MAX) {
|
||||||
@ -1969,9 +1970,8 @@ int VP8LEncodeStream(const WebPConfig* const config,
|
|||||||
int ok_main;
|
int ok_main;
|
||||||
|
|
||||||
if (enc_main == NULL || !VP8LBitWriterInit(&bw_side, 0)) {
|
if (enc_main == NULL || !VP8LBitWriterInit(&bw_side, 0)) {
|
||||||
WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY);
|
|
||||||
VP8LEncoderDelete(enc_main);
|
VP8LEncoderDelete(enc_main);
|
||||||
return 0;
|
return WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Avoid "garbage value" error from Clang's static analysis tool.
|
// Avoid "garbage value" error from Clang's static analysis tool.
|
||||||
@ -2118,8 +2118,7 @@ int VP8LEncodeImage(const WebPConfig* const config,
|
|||||||
if (picture == NULL) return 0;
|
if (picture == NULL) return 0;
|
||||||
|
|
||||||
if (config == NULL || picture->argb == NULL) {
|
if (config == NULL || picture->argb == NULL) {
|
||||||
WebPEncodingSetError(picture, VP8_ENC_ERROR_NULL_PARAMETER);
|
return WebPEncodingSetError(picture, VP8_ENC_ERROR_NULL_PARAMETER);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
width = picture->width;
|
width = picture->width;
|
||||||
|
@ -307,7 +307,10 @@ int WebPEncodingSetError(const WebPPicture* const pic,
|
|||||||
WebPEncodingError error) {
|
WebPEncodingError error) {
|
||||||
assert((int)error < VP8_ENC_ERROR_LAST);
|
assert((int)error < VP8_ENC_ERROR_LAST);
|
||||||
assert((int)error >= VP8_ENC_OK);
|
assert((int)error >= VP8_ENC_OK);
|
||||||
((WebPPicture*)pic)->error_code = error;
|
// The oldest error reported takes precedence over the new one.
|
||||||
|
if (pic->error_code == VP8_ENC_OK) {
|
||||||
|
((WebPPicture*)pic)->error_code = error;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -317,8 +320,7 @@ int WebPReportProgress(const WebPPicture* const pic,
|
|||||||
*percent_store = percent;
|
*percent_store = percent;
|
||||||
if (pic->progress_hook && !pic->progress_hook(percent, pic)) {
|
if (pic->progress_hook && !pic->progress_hook(percent, pic)) {
|
||||||
// user abort requested
|
// user abort requested
|
||||||
WebPEncodingSetError(pic, VP8_ENC_ERROR_USER_ABORT);
|
return WebPEncodingSetError(pic, VP8_ENC_ERROR_USER_ABORT);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 1; // ok
|
return 1; // ok
|
||||||
@ -329,7 +331,7 @@ int WebPEncode(const WebPConfig* config, WebPPicture* pic) {
|
|||||||
int ok = 0;
|
int ok = 0;
|
||||||
if (pic == NULL) return 0;
|
if (pic == NULL) return 0;
|
||||||
|
|
||||||
WebPEncodingSetError(pic, VP8_ENC_OK); // all ok so far
|
pic->error_code = VP8_ENC_OK; // all ok so far
|
||||||
if (config == NULL) { // bad params
|
if (config == NULL) { // bad params
|
||||||
return WebPEncodingSetError(pic, VP8_ENC_ERROR_NULL_PARAMETER);
|
return WebPEncodingSetError(pic, VP8_ENC_ERROR_NULL_PARAMETER);
|
||||||
}
|
}
|
||||||
|
@ -6,8 +6,8 @@
|
|||||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 1,0,3,0
|
FILEVERSION 1,0,3,1
|
||||||
PRODUCTVERSION 1,0,3,0
|
PRODUCTVERSION 1,0,3,1
|
||||||
FILEFLAGSMASK 0x3fL
|
FILEFLAGSMASK 0x3fL
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
FILEFLAGS 0x1L
|
FILEFLAGS 0x1L
|
||||||
@ -24,12 +24,12 @@ BEGIN
|
|||||||
BEGIN
|
BEGIN
|
||||||
VALUE "CompanyName", "Google, Inc."
|
VALUE "CompanyName", "Google, Inc."
|
||||||
VALUE "FileDescription", "libwebp DLL"
|
VALUE "FileDescription", "libwebp DLL"
|
||||||
VALUE "FileVersion", "1.3.0"
|
VALUE "FileVersion", "1.3.1"
|
||||||
VALUE "InternalName", "libwebp.dll"
|
VALUE "InternalName", "libwebp.dll"
|
||||||
VALUE "LegalCopyright", "Copyright (C) 2022"
|
VALUE "LegalCopyright", "Copyright (C) 2023"
|
||||||
VALUE "OriginalFilename", "libwebp.dll"
|
VALUE "OriginalFilename", "libwebp.dll"
|
||||||
VALUE "ProductName", "WebP Image Codec"
|
VALUE "ProductName", "WebP Image Codec"
|
||||||
VALUE "ProductVersion", "1.3.0"
|
VALUE "ProductVersion", "1.3.1"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
|
@ -6,8 +6,8 @@
|
|||||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 1,0,3,0
|
FILEVERSION 1,0,3,1
|
||||||
PRODUCTVERSION 1,0,3,0
|
PRODUCTVERSION 1,0,3,1
|
||||||
FILEFLAGSMASK 0x3fL
|
FILEFLAGSMASK 0x3fL
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
FILEFLAGS 0x1L
|
FILEFLAGS 0x1L
|
||||||
@ -24,12 +24,12 @@ BEGIN
|
|||||||
BEGIN
|
BEGIN
|
||||||
VALUE "CompanyName", "Google, Inc."
|
VALUE "CompanyName", "Google, Inc."
|
||||||
VALUE "FileDescription", "libwebpdecoder DLL"
|
VALUE "FileDescription", "libwebpdecoder DLL"
|
||||||
VALUE "FileVersion", "1.3.0"
|
VALUE "FileVersion", "1.3.1"
|
||||||
VALUE "InternalName", "libwebpdecoder.dll"
|
VALUE "InternalName", "libwebpdecoder.dll"
|
||||||
VALUE "LegalCopyright", "Copyright (C) 2022"
|
VALUE "LegalCopyright", "Copyright (C) 2023"
|
||||||
VALUE "OriginalFilename", "libwebpdecoder.dll"
|
VALUE "OriginalFilename", "libwebpdecoder.dll"
|
||||||
VALUE "ProductName", "WebP Image Decoder"
|
VALUE "ProductName", "WebP Image Decoder"
|
||||||
VALUE "ProductVersion", "1.3.0"
|
VALUE "ProductVersion", "1.3.1"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
|
@ -17,6 +17,6 @@ noinst_HEADERS =
|
|||||||
noinst_HEADERS += ../webp/format_constants.h
|
noinst_HEADERS += ../webp/format_constants.h
|
||||||
|
|
||||||
libwebpmux_la_LIBADD = ../libwebp.la
|
libwebpmux_la_LIBADD = ../libwebp.la
|
||||||
libwebpmux_la_LDFLAGS = -no-undefined -version-info 3:11:0 -lm
|
libwebpmux_la_LDFLAGS = -no-undefined -version-info 3:12:0 -lm
|
||||||
libwebpmuxincludedir = $(includedir)/webp
|
libwebpmuxincludedir = $(includedir)/webp
|
||||||
pkgconfig_DATA = libwebpmux.pc
|
pkgconfig_DATA = libwebpmux.pc
|
||||||
|
@ -6,8 +6,8 @@
|
|||||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 1,0,3,0
|
FILEVERSION 1,0,3,1
|
||||||
PRODUCTVERSION 1,0,3,0
|
PRODUCTVERSION 1,0,3,1
|
||||||
FILEFLAGSMASK 0x3fL
|
FILEFLAGSMASK 0x3fL
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
FILEFLAGS 0x1L
|
FILEFLAGS 0x1L
|
||||||
@ -24,12 +24,12 @@ BEGIN
|
|||||||
BEGIN
|
BEGIN
|
||||||
VALUE "CompanyName", "Google, Inc."
|
VALUE "CompanyName", "Google, Inc."
|
||||||
VALUE "FileDescription", "libwebpmux DLL"
|
VALUE "FileDescription", "libwebpmux DLL"
|
||||||
VALUE "FileVersion", "1.3.0"
|
VALUE "FileVersion", "1.3.1"
|
||||||
VALUE "InternalName", "libwebpmux.dll"
|
VALUE "InternalName", "libwebpmux.dll"
|
||||||
VALUE "LegalCopyright", "Copyright (C) 2022"
|
VALUE "LegalCopyright", "Copyright (C) 2023"
|
||||||
VALUE "OriginalFilename", "libwebpmux.dll"
|
VALUE "OriginalFilename", "libwebpmux.dll"
|
||||||
VALUE "ProductName", "WebP Image Muxer"
|
VALUE "ProductName", "WebP Image Muxer"
|
||||||
VALUE "ProductVersion", "1.3.0"
|
VALUE "ProductVersion", "1.3.1"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
|
@ -29,7 +29,7 @@ extern "C" {
|
|||||||
|
|
||||||
#define MUX_MAJ_VERSION 1
|
#define MUX_MAJ_VERSION 1
|
||||||
#define MUX_MIN_VERSION 3
|
#define MUX_MIN_VERSION 3
|
||||||
#define MUX_REV_VERSION 0
|
#define MUX_REV_VERSION 1
|
||||||
|
|
||||||
// Chunk object.
|
// Chunk object.
|
||||||
typedef struct WebPChunk WebPChunk;
|
typedef struct WebPChunk WebPChunk;
|
||||||
|
@ -116,9 +116,12 @@ static int MuxImageParse(const WebPChunk* const chunk, int copy_data,
|
|||||||
// Each of ANMF chunk contain a header at the beginning. So, its size should
|
// Each of ANMF chunk contain a header at the beginning. So, its size should
|
||||||
// be at least 'hdr_size'.
|
// be at least 'hdr_size'.
|
||||||
if (size < hdr_size) goto Fail;
|
if (size < hdr_size) goto Fail;
|
||||||
ChunkAssignData(&subchunk, &temp, copy_data, chunk->tag_);
|
if (ChunkAssignData(&subchunk, &temp, copy_data,
|
||||||
|
chunk->tag_) != WEBP_MUX_OK) {
|
||||||
|
goto Fail;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ChunkSetHead(&subchunk, &wpi->header_);
|
if (ChunkSetHead(&subchunk, &wpi->header_) != WEBP_MUX_OK) goto Fail;
|
||||||
wpi->is_partial_ = 1; // Waiting for ALPH and/or VP8/VP8L chunks.
|
wpi->is_partial_ = 1; // Waiting for ALPH and/or VP8/VP8L chunks.
|
||||||
|
|
||||||
// Rest of the chunks.
|
// Rest of the chunks.
|
||||||
|
@ -81,10 +81,11 @@ WEBP_EXTERN uint8_t* WebPDecodeBGR(const uint8_t* data, size_t data_size,
|
|||||||
// returned is the Y samples buffer. Upon return, *u and *v will point to
|
// returned is the Y samples buffer. Upon return, *u and *v will point to
|
||||||
// the U and V chroma data. These U and V buffers need NOT be passed to
|
// the U and V chroma data. These U and V buffers need NOT be passed to
|
||||||
// WebPFree(), unlike the returned Y luma one. The dimension of the U and V
|
// WebPFree(), unlike the returned Y luma one. The dimension of the U and V
|
||||||
// planes are both (*width + 1) / 2 and (*height + 1)/ 2.
|
// planes are both (*width + 1) / 2 and (*height + 1) / 2.
|
||||||
// Upon return, the Y buffer has a stride returned as '*stride', while U and V
|
// Upon return, the Y buffer has a stride returned as '*stride', while U and V
|
||||||
// have a common stride returned as '*uv_stride'.
|
// have a common stride returned as '*uv_stride'.
|
||||||
// Return NULL in case of error.
|
// 'width' and 'height' may be NULL, the other pointers must not be.
|
||||||
|
// Returns NULL in case of error.
|
||||||
// (*) Also named Y'CbCr. See: https://en.wikipedia.org/wiki/YCbCr
|
// (*) Also named Y'CbCr. See: https://en.wikipedia.org/wiki/YCbCr
|
||||||
WEBP_EXTERN uint8_t* WebPDecodeYUV(const uint8_t* data, size_t data_size,
|
WEBP_EXTERN uint8_t* WebPDecodeYUV(const uint8_t* data, size_t data_size,
|
||||||
int* width, int* height,
|
int* width, int* height,
|
||||||
|
Loading…
Reference in New Issue
Block a user