Index: third_party/libjpeg_turbo/jchuff.c |
=================================================================== |
--- third_party/libjpeg_turbo/jchuff.c (revision 95020) |
+++ third_party/libjpeg_turbo/jchuff.c (working copy) |
@@ -2,6 +2,7 @@ |
* jchuff.c |
* |
* Copyright (C) 1991-1997, Thomas G. Lane. |
+ * Copyright (C) 2009-2011, D. R. Commander. |
* This file is part of the Independent JPEG Group's software. |
* For conditions of distribution and use, see the accompanying README file. |
* |
@@ -14,34 +15,20 @@ |
* permanent JPEG objects only upon successful completion of an MCU. |
*/ |
-/* Modifications: |
- * Copyright (C)2007 Sun Microsystems, Inc. |
- * Copyright (C)2009 D. R. Commander |
- * |
- * This library is free software and may be redistributed and/or modified under |
- * the terms of the wxWindows Library License, Version 3.1 or (at your option) |
- * any later version. The full license is in the LICENSE.txt file included |
- * with this distribution. |
- * |
- * This library is distributed in the hope that it will be useful, |
- * but WITHOUT ANY WARRANTY; without even the implied warranty of |
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
- * wxWindows Library License for more details. |
- */ |
- |
#define JPEG_INTERNALS |
#include "jinclude.h" |
#include "jpeglib.h" |
#include "jchuff.h" /* Declarations shared with jcphuff.c */ |
#include <limits.h> |
-static unsigned char jpeg_first_bit_table[65536]; |
-int jpeg_first_bit_table_init=0; |
+static unsigned char jpeg_nbits_table[65536]; |
+static int jpeg_nbits_table_init = 0; |
#ifndef min |
#define min(a,b) ((a)<(b)?(a):(b)) |
#endif |
+ |
/* Expanded entropy encoder object for Huffman encoding. |
* |
* The savable_state subrecord contains fields that change within an MCU, |
@@ -181,7 +168,6 @@ |
} |
/* Initialize bit buffer to empty */ |
- |
entropy->saved.put_buffer = 0; |
entropy->saved.put_bits = 0; |
@@ -285,13 +271,13 @@ |
dtbl->ehufsi[i] = huffsize[p]; |
} |
- if(!jpeg_first_bit_table_init) { |
+ if(!jpeg_nbits_table_init) { |
for(i = 0; i < 65536; i++) { |
- int bit = 0, val = i; |
- while (val) {val >>= 1; bit++;} |
- jpeg_first_bit_table[i] = bit; |
+ int nbits = 0, temp = i; |
+ while (temp) {temp >>= 1; nbits++;} |
+ jpeg_nbits_table[i] = nbits; |
} |
- jpeg_first_bit_table_init = 1; |
+ jpeg_nbits_table_init = 1; |
} |
} |
@@ -325,170 +311,123 @@ |
/* Outputting bits to the file */ |
-/* Only the right 24 bits of put_buffer are used; the valid bits are |
- * left-justified in this part. At most 16 bits can be passed to emit_bits |
- * in one call, and we never retain more than 7 bits in put_buffer |
- * between calls, so 24 bits are sufficient. |
+/* These macros perform the same task as the emit_bits() function in the |
+ * original libjpeg code. In addition to reducing overhead by explicitly |
+ * inlining the code, additional performance is achieved by taking into |
+ * account the size of the bit buffer and waiting until it is almost full |
+ * before emptying it. This mostly benefits 64-bit platforms, since 6 |
+ * bytes can be stored in a 64-bit bit buffer before it has to be emptied. |
*/ |
-/***************************************************************/ |
- |
-#define EMIT_BYTE() { \ |
- if (0xFF == (*buffer++ = (unsigned char)(put_buffer >> (put_bits -= 8)))) \ |
- *buffer++ = 0; \ |
+#define EMIT_BYTE() { \ |
+ JOCTET c; \ |
+ put_bits -= 8; \ |
+ c = (JOCTET)GETJOCTET(put_buffer >> put_bits); \ |
+ *buffer++ = c; \ |
+ if (c == 0xFF) /* need to stuff a zero byte? */ \ |
+ *buffer++ = 0; \ |
} |
-/***************************************************************/ |
+#define PUT_BITS(code, size) { \ |
+ put_bits += size; \ |
+ put_buffer = (put_buffer << size) | code; \ |
+} |
-#define DUMP_BITS_(code, size) { \ |
- put_bits += size; \ |
- put_buffer = (put_buffer << size) | code; \ |
- if (put_bits > 7) \ |
- while(put_bits > 7) \ |
- EMIT_BYTE() \ |
- } |
- |
-/***************************************************************/ |
- |
-#define CHECKBUF15() { \ |
- if (put_bits > 15) { \ |
- EMIT_BYTE() \ |
- EMIT_BYTE() \ |
- } \ |
+#define CHECKBUF15() { \ |
+ if (put_bits > 15) { \ |
+ EMIT_BYTE() \ |
+ EMIT_BYTE() \ |
+ } \ |
} |
-#define CHECKBUF47() { \ |
- if (put_bits > 47) { \ |
- EMIT_BYTE() \ |
- EMIT_BYTE() \ |
- EMIT_BYTE() \ |
- EMIT_BYTE() \ |
- EMIT_BYTE() \ |
- EMIT_BYTE() \ |
- } \ |
+#define CHECKBUF31() { \ |
+ if (put_bits > 31) { \ |
+ EMIT_BYTE() \ |
+ EMIT_BYTE() \ |
+ EMIT_BYTE() \ |
+ EMIT_BYTE() \ |
+ } \ |
} |
-#define CHECKBUF31() { \ |
- if (put_bits > 31) { \ |
- EMIT_BYTE() \ |
- EMIT_BYTE() \ |
- EMIT_BYTE() \ |
- EMIT_BYTE() \ |
- } \ |
+#define CHECKBUF47() { \ |
+ if (put_bits > 47) { \ |
+ EMIT_BYTE() \ |
+ EMIT_BYTE() \ |
+ EMIT_BYTE() \ |
+ EMIT_BYTE() \ |
+ EMIT_BYTE() \ |
+ EMIT_BYTE() \ |
+ } \ |
} |
-/***************************************************************/ |
- |
-#define DUMP_BITS_NOCHECK(code, size) { \ |
- put_bits += size; \ |
- put_buffer = (put_buffer << size) | code; \ |
- } |
- |
#if __WORDSIZE==64 || defined(_WIN64) |
-#define DUMP_BITS(code, size) { \ |
- CHECKBUF47() \ |
- put_bits += size; \ |
- put_buffer = (put_buffer << size) | code; \ |
+#define EMIT_BITS(code, size) { \ |
+ CHECKBUF47() \ |
+ PUT_BITS(code, size) \ |
+} |
+ |
+#define EMIT_CODE(code, size) { \ |
+ temp2 &= (((INT32) 1)<<nbits) - 1; \ |
+ CHECKBUF31() \ |
+ PUT_BITS(code, size) \ |
+ PUT_BITS(temp2, nbits) \ |
} |
#else |
-#define DUMP_BITS(code, size) { \ |
- put_bits += size; \ |
- put_buffer = (put_buffer << size) | code; \ |
- CHECKBUF15() \ |
- } |
+#define EMIT_BITS(code, size) { \ |
+ PUT_BITS(code, size) \ |
+ CHECKBUF15() \ |
+} |
-#endif |
- |
-/***************************************************************/ |
- |
-#define DUMP_SINGLE_VALUE(ht, codevalue) { \ |
- size = ht->ehufsi[codevalue]; \ |
- code = ht->ehufco[codevalue]; \ |
- \ |
- DUMP_BITS(code, size) \ |
+#define EMIT_CODE(code, size) { \ |
+ temp2 &= (((INT32) 1)<<nbits) - 1; \ |
+ PUT_BITS(code, size) \ |
+ CHECKBUF15() \ |
+ PUT_BITS(temp2, nbits) \ |
+ CHECKBUF15() \ |
} |
-/***************************************************************/ |
- |
-#define DUMP_VALUE_SLOW(ht, codevalue, t, nbits) { \ |
- size = ht->ehufsi[codevalue]; \ |
- code = ht->ehufco[codevalue]; \ |
- t &= ~(-1 << nbits); \ |
- DUMP_BITS_NOCHECK(code, size) \ |
- CHECKBUF15() \ |
- DUMP_BITS_NOCHECK(t, nbits) \ |
- CHECKBUF15() \ |
- } |
- |
-int _max=0; |
- |
-#if __WORDSIZE==64 || defined(_WIN64) |
- |
-#define DUMP_VALUE(ht, codevalue, t, nbits) { \ |
- size = ht->ehufsi[codevalue]; \ |
- code = ht->ehufco[codevalue]; \ |
- t &= ~(-1 << nbits); \ |
- CHECKBUF31() \ |
- DUMP_BITS_NOCHECK(code, size) \ |
- DUMP_BITS_NOCHECK(t, nbits) \ |
- } |
- |
-#else |
- |
-#define DUMP_VALUE(ht, codevalue, t, nbits) { \ |
- size = ht->ehufsi[codevalue]; \ |
- code = ht->ehufco[codevalue]; \ |
- t &= ~(-1 << nbits); \ |
- DUMP_BITS_NOCHECK(code, size) \ |
- CHECKBUF15() \ |
- DUMP_BITS_NOCHECK(t, nbits) \ |
- CHECKBUF15() \ |
- } |
- |
#endif |
-/***************************************************************/ |
#define BUFSIZE (DCTSIZE2 * 2) |
-#define LOAD_BUFFER() { \ |
- if (state->free_in_buffer < BUFSIZE) { \ |
- localbuf = 1; \ |
- buffer = _buffer; \ |
- } \ |
- else buffer = state->next_output_byte; \ |
+#define LOAD_BUFFER() { \ |
+ if (state->free_in_buffer < BUFSIZE) { \ |
+ localbuf = 1; \ |
+ buffer = _buffer; \ |
+ } \ |
+ else buffer = state->next_output_byte; \ |
} |
-#define STORE_BUFFER() { \ |
- if (localbuf) { \ |
- bytes = buffer - _buffer; \ |
- buffer = _buffer; \ |
- while (bytes > 0) { \ |
- bytestocopy = min(bytes, state->free_in_buffer); \ |
- MEMCOPY(state->next_output_byte, buffer, bytestocopy); \ |
- state->next_output_byte += bytestocopy; \ |
- buffer += bytestocopy; \ |
- state->free_in_buffer -= bytestocopy; \ |
- if (state->free_in_buffer == 0) \ |
- if (! dump_buffer(state)) return FALSE; \ |
- bytes -= bytestocopy; \ |
- } \ |
- } \ |
- else { \ |
- state->free_in_buffer -= (buffer - state->next_output_byte); \ |
- state->next_output_byte = buffer; \ |
- } \ |
+#define STORE_BUFFER() { \ |
+ if (localbuf) { \ |
+ bytes = buffer - _buffer; \ |
+ buffer = _buffer; \ |
+ while (bytes > 0) { \ |
+ bytestocopy = min(bytes, state->free_in_buffer); \ |
+ MEMCOPY(state->next_output_byte, buffer, bytestocopy); \ |
+ state->next_output_byte += bytestocopy; \ |
+ buffer += bytestocopy; \ |
+ state->free_in_buffer -= bytestocopy; \ |
+ if (state->free_in_buffer == 0) \ |
+ if (! dump_buffer(state)) return FALSE; \ |
+ bytes -= bytestocopy; \ |
+ } \ |
+ } \ |
+ else { \ |
+ state->free_in_buffer -= (buffer - state->next_output_byte); \ |
+ state->next_output_byte = buffer; \ |
+ } \ |
} |
-/***************************************************************/ |
LOCAL(boolean) |
flush_bits (working_state * state) |
{ |
- unsigned char _buffer[BUFSIZE], *buffer; |
+ JOCTET _buffer[BUFSIZE], *buffer; |
size_t put_buffer; int put_bits; |
size_t bytes, bytestocopy; int localbuf = 0; |
@@ -496,7 +435,9 @@ |
put_bits = state->cur.put_bits; |
LOAD_BUFFER() |
- DUMP_BITS_(0x7F, 7) |
+ /* fill any partial byte with ones */ |
+ PUT_BITS(0x7F, 7) |
+ while (put_bits >= 8) EMIT_BYTE() |
state->cur.put_buffer = 0; /* and reset bit-buffer to empty */ |
state->cur.put_bits = 0; |
@@ -505,16 +446,17 @@ |
return TRUE; |
} |
+ |
/* Encode a single block's worth of coefficients */ |
LOCAL(boolean) |
encode_one_block (working_state * state, JCOEFPTR block, int last_dc_val, |
c_derived_tbl *dctbl, c_derived_tbl *actbl) |
{ |
- int temp, temp2; |
+ int temp, temp2, temp3; |
int nbits; |
- int r, sflag, size, code; |
- unsigned char _buffer[BUFSIZE], *buffer; |
+ int r, code, size; |
+ JOCTET _buffer[BUFSIZE], *buffer; |
size_t put_buffer; int put_bits; |
int code_0xf0 = actbl->ehufco[0xf0], size_0xf0 = actbl->ehufsi[0xf0]; |
size_t bytes, bytestocopy; int localbuf = 0; |
@@ -527,50 +469,88 @@ |
temp = temp2 = block[0] - last_dc_val; |
- sflag = temp >> 31; |
- temp -= ((temp + temp) & sflag); |
- temp2 += sflag; |
- nbits = jpeg_first_bit_table[temp]; |
- DUMP_VALUE_SLOW(dctbl, nbits, temp2, nbits) |
+ /* This is a well-known technique for obtaining the absolute value without a |
+ * branch. It is derived from an assembly language technique presented in |
+ * "How to Optimize for the Pentium Processors", Copyright (c) 1996, 1997 by |
+ * Agner Fog. |
+ */ |
+ temp3 = temp >> (CHAR_BIT * sizeof(int) - 1); |
+ temp ^= temp3; |
+ temp -= temp3; |
+ /* For a negative input, want temp2 = bitwise complement of abs(input) */ |
+ /* This code assumes we are on a two's complement machine */ |
+ temp2 += temp3; |
+ |
+ /* Find the number of bits needed for the magnitude of the coefficient */ |
+ nbits = jpeg_nbits_table[temp]; |
+ |
+ /* Emit the Huffman-coded symbol for the number of bits */ |
+ code = dctbl->ehufco[nbits]; |
+ size = dctbl->ehufsi[nbits]; |
+ PUT_BITS(code, size) |
+ CHECKBUF15() |
+ |
+ /* Mask off any extra bits in code */ |
+ temp2 &= (((INT32) 1)<<nbits) - 1; |
+ |
+ /* Emit that number of bits of the value, if positive, */ |
+ /* or the complement of its magnitude, if negative. */ |
+ PUT_BITS(temp2, nbits) |
+ CHECKBUF15() |
+ |
/* Encode the AC coefficients per section F.1.2.2 */ |
r = 0; /* r = run length of zeros */ |
-#define innerloop(order) { \ |
- temp2 = *(JCOEF*)((unsigned char*)block + order); \ |
- if(temp2 == 0) r++; \ |
- else { \ |
- temp = (JCOEF)temp2; \ |
- sflag = temp >> 31; \ |
- temp = (temp ^ sflag) - sflag; \ |
- temp2 += sflag; \ |
- nbits = jpeg_first_bit_table[temp]; \ |
- for(; r > 15; r -= 16) DUMP_BITS(code_0xf0, size_0xf0) \ |
- sflag = (r << 4) + nbits; \ |
- DUMP_VALUE(actbl, sflag, temp2, nbits) \ |
+/* Manually unroll the k loop to eliminate the counter variable. This |
+ * improves performance greatly on systems with a limited number of |
+ * registers (such as x86.) |
+ */ |
+#define kloop(jpeg_natural_order_of_k) { \ |
+ if ((temp = block[jpeg_natural_order_of_k]) == 0) { \ |
+ r++; \ |
+ } else { \ |
+ temp2 = temp; \ |
+ /* Branch-less absolute value, bitwise complement, etc., same as above */ \ |
+ temp3 = temp >> (CHAR_BIT * sizeof(int) - 1); \ |
+ temp ^= temp3; \ |
+ temp -= temp3; \ |
+ temp2 += temp3; \ |
+ nbits = jpeg_nbits_table[temp]; \ |
+ /* if run length > 15, must emit special run-length-16 codes (0xF0) */ \ |
+ while (r > 15) { \ |
+ EMIT_BITS(code_0xf0, size_0xf0) \ |
+ r -= 16; \ |
+ } \ |
+ /* Emit Huffman symbol for run length / number of bits */ \ |
+ temp3 = (r << 4) + nbits; \ |
+ code = actbl->ehufco[temp3]; \ |
+ size = actbl->ehufsi[temp3]; \ |
+ EMIT_CODE(code, size) \ |
r = 0; \ |
- }} |
+ } \ |
+} |
- innerloop(2*1); innerloop(2*8); innerloop(2*16); innerloop(2*9); |
- innerloop(2*2); innerloop(2*3); innerloop(2*10); innerloop(2*17); |
- innerloop(2*24); innerloop(2*32); innerloop(2*25); innerloop(2*18); |
- innerloop(2*11); innerloop(2*4); innerloop(2*5); innerloop(2*12); |
- innerloop(2*19); innerloop(2*26); innerloop(2*33); innerloop(2*40); |
- innerloop(2*48); innerloop(2*41); innerloop(2*34); innerloop(2*27); |
- innerloop(2*20); innerloop(2*13); innerloop(2*6); innerloop(2*7); |
- innerloop(2*14); innerloop(2*21); innerloop(2*28); innerloop(2*35); |
- innerloop(2*42); innerloop(2*49); innerloop(2*56); innerloop(2*57); |
- innerloop(2*50); innerloop(2*43); innerloop(2*36); innerloop(2*29); |
- innerloop(2*22); innerloop(2*15); innerloop(2*23); innerloop(2*30); |
- innerloop(2*37); innerloop(2*44); innerloop(2*51); innerloop(2*58); |
- innerloop(2*59); innerloop(2*52); innerloop(2*45); innerloop(2*38); |
- innerloop(2*31); innerloop(2*39); innerloop(2*46); innerloop(2*53); |
- innerloop(2*60); innerloop(2*61); innerloop(2*54); innerloop(2*47); |
- innerloop(2*55); innerloop(2*62); innerloop(2*63); |
+ /* One iteration for each value in jpeg_natural_order[] */ |
+ kloop(1); kloop(8); kloop(16); kloop(9); kloop(2); kloop(3); |
+ kloop(10); kloop(17); kloop(24); kloop(32); kloop(25); kloop(18); |
+ kloop(11); kloop(4); kloop(5); kloop(12); kloop(19); kloop(26); |
+ kloop(33); kloop(40); kloop(48); kloop(41); kloop(34); kloop(27); |
+ kloop(20); kloop(13); kloop(6); kloop(7); kloop(14); kloop(21); |
+ kloop(28); kloop(35); kloop(42); kloop(49); kloop(56); kloop(57); |
+ kloop(50); kloop(43); kloop(36); kloop(29); kloop(22); kloop(15); |
+ kloop(23); kloop(30); kloop(37); kloop(44); kloop(51); kloop(58); |
+ kloop(59); kloop(52); kloop(45); kloop(38); kloop(31); kloop(39); |
+ kloop(46); kloop(53); kloop(60); kloop(61); kloop(54); kloop(47); |
+ kloop(55); kloop(62); kloop(63); |
/* If the last coef(s) were zero, emit an end-of-block code */ |
- if (r > 0) DUMP_SINGLE_VALUE(actbl, 0x0) |
+ if (r > 0) { |
+ code = actbl->ehufco[0]; |
+ size = actbl->ehufsi[0]; |
+ EMIT_BITS(code, size) |
+ } |
state->cur.put_buffer = put_buffer; |
state->cur.put_bits = put_bits; |