@@ -12,6 +12,11 @@ applications to more easily support both 8-bit-per-component and
|
|||||||
more details.) The `WITH_12BIT` CMake variable can be used to disable
|
more details.) The `WITH_12BIT` CMake variable can be used to disable
|
||||||
12-bit-per-component JPEG support.
|
12-bit-per-component JPEG support.
|
||||||
|
|
||||||
|
2. Significantly sped up the computation of optimal Huffman tables. This
|
||||||
|
speeds up the compression of tiny images by as much as 2x and provides a
|
||||||
|
noticeable speedup for images as large as 256x256 when using optimal Huffman
|
||||||
|
tables.
|
||||||
|
|
||||||
|
|
||||||
2.1.4
|
2.1.4
|
||||||
=====
|
=====
|
||||||
|
|||||||
81
jchuff.c
81
jchuff.c
@@ -8,6 +8,7 @@
|
|||||||
* Copyright (C) 2015, Matthieu Darbois.
|
* Copyright (C) 2015, Matthieu Darbois.
|
||||||
* Copyright (C) 2018, Matthias Räncker.
|
* Copyright (C) 2018, Matthias Räncker.
|
||||||
* Copyright (C) 2020, Arm Limited.
|
* Copyright (C) 2020, Arm Limited.
|
||||||
|
* Copyright (C) 2022, Felix Hanau.
|
||||||
* For conditions of distribution and use, see the accompanying README.ijg
|
* For conditions of distribution and use, see the accompanying README.ijg
|
||||||
* file.
|
* file.
|
||||||
*
|
*
|
||||||
@@ -933,11 +934,13 @@ jpeg_gen_optimal_table(j_compress_ptr cinfo, JHUFF_TBL *htbl, long freq[])
|
|||||||
{
|
{
|
||||||
#define MAX_CLEN 32 /* assumed maximum initial code length */
|
#define MAX_CLEN 32 /* assumed maximum initial code length */
|
||||||
UINT8 bits[MAX_CLEN + 1]; /* bits[k] = # of symbols with code length k */
|
UINT8 bits[MAX_CLEN + 1]; /* bits[k] = # of symbols with code length k */
|
||||||
|
int bit_pos[MAX_CLEN + 1]; /* # of symbols with smaller code length */
|
||||||
int codesize[257]; /* codesize[k] = code length of symbol k */
|
int codesize[257]; /* codesize[k] = code length of symbol k */
|
||||||
int others[257]; /* next symbol in current branch of tree */
|
int others[257]; /* next symbol in current branch of tree */
|
||||||
int c1, c2;
|
int c1, c2;
|
||||||
int p, i, j;
|
int p, i, j;
|
||||||
long v;
|
int indices[257], num_symbols = 0;
|
||||||
|
long v, v2;
|
||||||
|
|
||||||
/* This algorithm is explained in section K.2 of the JPEG standard */
|
/* This algorithm is explained in section K.2 of the JPEG standard */
|
||||||
|
|
||||||
@@ -947,6 +950,14 @@ jpeg_gen_optimal_table(j_compress_ptr cinfo, JHUFF_TBL *htbl, long freq[])
|
|||||||
others[i] = -1; /* init links to empty */
|
others[i] = -1; /* init links to empty */
|
||||||
|
|
||||||
freq[256] = 1; /* make sure 256 has a nonzero count */
|
freq[256] = 1; /* make sure 256 has a nonzero count */
|
||||||
|
|
||||||
|
for (i = 0; i < 257; i++) {
|
||||||
|
if (freq[i]) {
|
||||||
|
indices[num_symbols] = i;
|
||||||
|
freq[num_symbols] = freq[i];
|
||||||
|
num_symbols++;
|
||||||
|
}
|
||||||
|
}
|
||||||
/* Including the pseudo-symbol 256 in the Huffman procedure guarantees
|
/* Including the pseudo-symbol 256 in the Huffman procedure guarantees
|
||||||
* that no real symbol is given code-value of all ones, because 256
|
* that no real symbol is given code-value of all ones, because 256
|
||||||
* will be placed last in the largest codeword category.
|
* will be placed last in the largest codeword category.
|
||||||
@@ -955,25 +966,23 @@ jpeg_gen_optimal_table(j_compress_ptr cinfo, JHUFF_TBL *htbl, long freq[])
|
|||||||
/* Huffman's basic algorithm to assign optimal code lengths to symbols */
|
/* Huffman's basic algorithm to assign optimal code lengths to symbols */
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
/* Find the smallest nonzero frequency, set c1 = its symbol */
|
/* Find the two smallest nonzero frequencies; set c1, c2 = their symbols */
|
||||||
/* In case of ties, take the larger symbol number */
|
/* In case of ties, take the larger symbol number */
|
||||||
c1 = -1;
|
c1 = -1;
|
||||||
v = 1000000000L;
|
|
||||||
for (i = 0; i <= 256; i++) {
|
|
||||||
if (freq[i] && freq[i] <= v) {
|
|
||||||
v = freq[i];
|
|
||||||
c1 = i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Find the next smallest nonzero frequency, set c2 = its symbol */
|
|
||||||
/* In case of ties, take the larger symbol number */
|
|
||||||
c2 = -1;
|
c2 = -1;
|
||||||
v = 1000000000L;
|
v = 1000000000L;
|
||||||
for (i = 0; i <= 256; i++) {
|
v2 = 1000000000L;
|
||||||
if (freq[i] && freq[i] <= v && i != c1) {
|
for (i = 0; i < num_symbols; i++) {
|
||||||
v = freq[i];
|
if (freq[i] <= v2) {
|
||||||
c2 = i;
|
if (freq[i] <= v) {
|
||||||
|
c2 = c1;
|
||||||
|
v2 = v;
|
||||||
|
v = freq[i];
|
||||||
|
c1 = i;
|
||||||
|
} else {
|
||||||
|
v2 = freq[i];
|
||||||
|
c2 = i;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -983,7 +992,9 @@ jpeg_gen_optimal_table(j_compress_ptr cinfo, JHUFF_TBL *htbl, long freq[])
|
|||||||
|
|
||||||
/* Else merge the two counts/trees */
|
/* Else merge the two counts/trees */
|
||||||
freq[c1] += freq[c2];
|
freq[c1] += freq[c2];
|
||||||
freq[c2] = 0;
|
freq[c2] = 1000000001L;
|
||||||
|
c1 = indices[c1];
|
||||||
|
c2 = indices[c2];
|
||||||
|
|
||||||
/* Increment the codesize of everything in c1's tree branch */
|
/* Increment the codesize of everything in c1's tree branch */
|
||||||
codesize[c1]++;
|
codesize[c1]++;
|
||||||
@@ -1003,15 +1014,24 @@ jpeg_gen_optimal_table(j_compress_ptr cinfo, JHUFF_TBL *htbl, long freq[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Now count the number of symbols of each code length */
|
/* Now count the number of symbols of each code length */
|
||||||
for (i = 0; i <= 256; i++) {
|
for (i = 0; i < num_symbols; i++) {
|
||||||
if (codesize[i]) {
|
/* The JPEG standard seems to think that this can't happen, */
|
||||||
/* The JPEG standard seems to think that this can't happen, */
|
/* but I'm paranoid... */
|
||||||
/* but I'm paranoid... */
|
if (codesize[indices[i]] > MAX_CLEN)
|
||||||
if (codesize[i] > MAX_CLEN)
|
ERREXIT(cinfo, JERR_HUFF_CLEN_OVERFLOW);
|
||||||
ERREXIT(cinfo, JERR_HUFF_CLEN_OVERFLOW);
|
|
||||||
|
|
||||||
bits[codesize[i]]++;
|
bits[codesize[indices[i]]]++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Count the number of symbols with a length smaller than i bits, so we can
|
||||||
|
* construct the symbol table more efficiently. Note that this includes the
|
||||||
|
* pseudo-symbol 256, but since it is the last symbol, it will not affect the
|
||||||
|
* table.
|
||||||
|
*/
|
||||||
|
p = 0;
|
||||||
|
for (i = 1; i <= MAX_CLEN; i++) {
|
||||||
|
bit_pos[i] = p;
|
||||||
|
p += bits[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* JPEG doesn't allow symbols with code lengths over 16 bits, so if the pure
|
/* JPEG doesn't allow symbols with code lengths over 16 bits, so if the pure
|
||||||
@@ -1051,14 +1071,9 @@ jpeg_gen_optimal_table(j_compress_ptr cinfo, JHUFF_TBL *htbl, long freq[])
|
|||||||
* changes made above, but Rec. ITU-T T.81 | ISO/IEC 10918-1 seems to think
|
* changes made above, but Rec. ITU-T T.81 | ISO/IEC 10918-1 seems to think
|
||||||
* this works.
|
* this works.
|
||||||
*/
|
*/
|
||||||
p = 0;
|
for (i = 0; i < num_symbols - 1; i++) {
|
||||||
for (i = 1; i <= MAX_CLEN; i++) {
|
htbl->huffval[bit_pos[codesize[indices[i]]]] = (UINT8)indices[i];
|
||||||
for (j = 0; j <= 255; j++) {
|
bit_pos[codesize[indices[i]]]++;
|
||||||
if (codesize[j] == i) {
|
|
||||||
htbl->huffval[p] = (UINT8)j;
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set sent_table FALSE so updated table will be written to JPEG file. */
|
/* Set sent_table FALSE so updated table will be written to JPEG file. */
|
||||||
|
|||||||
Reference in New Issue
Block a user