ef9a4e05ba(libjpeg-turbo 1.4.x), which was based on https://bug815473.bmoattachments.org/attachment.cgi?id=692126 (https://bugzilla.mozilla.org/show_bug.cgi?id=815473), modified the C baseline Huffman encoder so that it precomputes jpeg_nbits_table, in order to facilitate sharing the table among multiple processes. However, libjpeg-turbo never shared the table, and because the table was implemented as a static array,f3a8684cd1(libjpeg-turbo 1.5.x) and37bae1a0e9(libjpeg-turbo 2.0.x) each introduced a duplicate copy of the table for (respectively) the SSE2 baseline Huffman encoder and the C progressive Huffman encoder. This commit does the following: - Move the duplicated code in jchuff.c and jcphuff.c, originally introduced in0cfc4c17b7and37bae1a0e9, into a header (jpeg_nbits.h). - Credit the co-author of0cfc4c17b7. (Refer to https://sourceforge.net/p/libjpeg-turbo/patches/57). - Modify the SSE2 baseline Huffman encoder so that the C Huffman encoders can share its definition of jpeg_nbits_table. - Move the definition of jpeg_nbits_table into a C source file (jpeg_nbits.c) rather than a header, and define the table only if USE_CLZ_INTRINSIC is undefined and the SSE2 baseline Huffman encoder will not be built. - Apply hidden symbol visibility to the shared definition of jpeg_nbits_table, if the compiler supports the necessary attribute. (In practice, only Visual C++ doesn't.) Closes #114 See also: https://bugzilla.mozilla.org/show_bug.cgi?id=1501523
44 lines
1.7 KiB
C
44 lines
1.7 KiB
C
/*
|
|
* Copyright (C) 2014, 2021, 2024, D. R. Commander.
|
|
* Copyright (C) 2014, Olle Liljenzin.
|
|
* Copyright (C) 2020, Arm Limited.
|
|
*
|
|
* For conditions of distribution and use, see the accompanying README.ijg
|
|
* file.
|
|
*/
|
|
|
|
/*
|
|
* NOTE: If USE_CLZ_INTRINSIC is defined, then clz/bsr instructions will be
|
|
* used for bit counting rather than the lookup table. This will reduce the
|
|
* memory footprint by 64k, which is important for some mobile applications
|
|
* that create many isolated instances of libjpeg-turbo (web browsers, for
|
|
* instance.) This may improve performance on some mobile platforms as well.
|
|
* This feature is enabled by default only on Arm processors, because some x86
|
|
* chips have a slow implementation of bsr, and the use of clz/bsr cannot be
|
|
* shown to have a significant performance impact even on the x86 chips that
|
|
* have a fast implementation of it. When building for Armv6, you can
|
|
* explicitly disable the use of clz/bsr by adding -mthumb to the compiler
|
|
* flags (this defines __thumb__).
|
|
*/
|
|
|
|
/* NOTE: Both GCC and Clang define __GNUC__ */
|
|
#if (defined(__GNUC__) && (defined(__arm__) || defined(__aarch64__))) || \
|
|
defined(_M_ARM) || defined(_M_ARM64)
|
|
#if !defined(__thumb__) || defined(__thumb2__)
|
|
#define USE_CLZ_INTRINSIC
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef USE_CLZ_INTRINSIC
|
|
#if defined(_MSC_VER) && !defined(__clang__)
|
|
#define JPEG_NBITS_NONZERO(x) (32 - _CountLeadingZeros(x))
|
|
#else
|
|
#define JPEG_NBITS_NONZERO(x) (32 - __builtin_clz(x))
|
|
#endif
|
|
#define JPEG_NBITS(x) (x ? JPEG_NBITS_NONZERO(x) : 0)
|
|
#else
|
|
extern const unsigned char jpeg_nbits_table[65536];
|
|
#define JPEG_NBITS(x) (jpeg_nbits_table[x])
|
|
#define JPEG_NBITS_NONZERO(x) JPEG_NBITS(x)
|
|
#endif
|