Skip to content

Commit 2cb4d41

Browse files
committed
Add SSE2 huffman encoding
1 parent fbe5007 commit 2cb4d41

File tree

13 files changed

+945
-9
lines changed

13 files changed

+945
-9
lines changed

jchuff.c

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
* Copyright (C) 1991-1997, Thomas G. Lane.
66
* libjpeg-turbo Modifications:
77
* Copyright (C) 2009-2011, 2014-2015 D. R. Commander.
8+
* Copyright (C) 2015 Matthieu Darbois.
89
* For conditions of distribution and use, see the accompanying README.ijg
910
* file.
1011
*
@@ -21,6 +22,7 @@
2122
#include "jinclude.h"
2223
#include "jpeglib.h"
2324
#include "jchuff.h" /* Declarations shared with jcphuff.c */
25+
#include "jsimdchuff.h"
2426
#include <limits.h>
2527

2628
/*
@@ -478,6 +480,21 @@ flush_bits (working_state * state)
478480

479481

480482
/* Encode a single block's worth of coefficients */
483+
LOCAL(boolean)
484+
encode_one_block_simd (working_state * state, JCOEFPTR block, int last_dc_val,
485+
c_derived_tbl *dctbl, c_derived_tbl *actbl)
486+
{
487+
JOCTET _buffer[BUFSIZE], *buffer;
488+
size_t bytes, bytestocopy; int localbuf = 0;
489+
490+
LOAD_BUFFER()
491+
492+
buffer = jsimd_chuff_encode_one_block(state, buffer, block, last_dc_val, dctbl, actbl);
493+
494+
STORE_BUFFER()
495+
496+
return TRUE;
497+
}
481498

482499
LOCAL(boolean)
483500
encode_one_block (working_state * state, JCOEFPTR block, int last_dc_val,
@@ -587,7 +604,6 @@ encode_one_block (working_state * state, JCOEFPTR block, int last_dc_val,
587604
return TRUE;
588605
}
589606

590-
591607
/*
592608
* Emit a restart marker & resynchronize predictions.
593609
*/
@@ -624,6 +640,12 @@ encode_mcu_huff (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
624640
working_state state;
625641
int blkn, ci;
626642
jpeg_component_info * compptr;
643+
boolean (*encode_one_block_ptr) (working_state*, JCOEFPTR, int,
644+
c_derived_tbl *, c_derived_tbl *) = encode_one_block;
645+
646+
if (jsimd_can_chuff_encode_one_block()) {
647+
encode_one_block_ptr = encode_one_block_simd;
648+
}
627649

628650
/* Load up working state */
629651
state.next_output_byte = cinfo->dest->next_output_byte;
@@ -642,10 +664,10 @@ encode_mcu_huff (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
642664
for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
643665
ci = cinfo->MCU_membership[blkn];
644666
compptr = cinfo->cur_comp_info[ci];
645-
if (! encode_one_block(&state,
646-
MCU_data[blkn][0], state.cur.last_dc_val[ci],
647-
entropy->dc_derived_tbls[compptr->dc_tbl_no],
648-
entropy->ac_derived_tbls[compptr->ac_tbl_no]))
667+
if (! encode_one_block_ptr(&state,
668+
MCU_data[blkn][0], state.cur.last_dc_val[ci],
669+
entropy->dc_derived_tbls[compptr->dc_tbl_no],
670+
entropy->ac_derived_tbls[compptr->ac_tbl_no]))
649671
return FALSE;
650672
/* Update last_dc_val */
651673
state.cur.last_dc_val[ci] = MCU_data[blkn][0][0];

jsimdchuff.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/*
2+
* jsimdchuff.h
3+
*
4+
* Copyright 2015 Matthieu Darbois
5+
*
6+
* Based on the x86 SIMD extension for IJG JPEG library,
7+
* Copyright (C) 1999-2006, MIYASAKA Masaru.
8+
* For conditions of distribution and use, see copyright notice in jsimdext.inc
9+
*
10+
*/
11+
12+
EXTERN(int)
13+
jsimd_can_chuff_encode_one_block (void);
14+
15+
16+
EXTERN(JOCTET*)
17+
jsimd_chuff_encode_one_block (/*working_state*/void * state, JOCTET *buffer,
18+
JCOEFPTR block, int last_dc_val,
19+
c_derived_tbl *dctbl, c_derived_tbl *actbl);

simd/CMakeLists.txt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,17 @@ if(SIMD_X86_64)
2424
set(SIMD_BASENAMES jfdctflt-sse-64 jccolor-sse2-64 jcgray-sse2-64
2525
jcsample-sse2-64 jdcolor-sse2-64 jdmerge-sse2-64 jdsample-sse2-64
2626
jfdctfst-sse2-64 jfdctint-sse2-64 jidctflt-sse2-64 jidctfst-sse2-64
27-
jidctint-sse2-64 jidctred-sse2-64 jquantf-sse2-64 jquanti-sse2-64)
27+
jidctint-sse2-64 jidctred-sse2-64 jquantf-sse2-64 jquanti-sse2-64
28+
jchuff-sse2-64)
2829
message(STATUS "Building x86_64 SIMD extensions")
2930
else()
3031
set(SIMD_BASENAMES jsimdcpu jfdctflt-3dn jidctflt-3dn jquant-3dn jccolor-mmx
3132
jcgray-mmx jcsample-mmx jdcolor-mmx jdmerge-mmx jdsample-mmx jfdctfst-mmx
3233
jfdctint-mmx jidctfst-mmx jidctint-mmx jidctred-mmx jquant-mmx jfdctflt-sse
3334
jidctflt-sse jquant-sse jccolor-sse2 jcgray-sse2 jcsample-sse2 jdcolor-sse2
3435
jdmerge-sse2 jdsample-sse2 jfdctfst-sse2 jfdctint-sse2 jidctflt-sse2
35-
jidctfst-sse2 jidctint-sse2 jidctred-sse2 jquantf-sse2 jquanti-sse2)
36+
jidctfst-sse2 jidctint-sse2 jidctred-sse2 jquantf-sse2 jquanti-sse2
37+
jchuff-sse2)
3638
message(STATUS "Building i386 SIMD extensions")
3739
endif()
3840

simd/Makefile.am

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ libsimd_la_SOURCES = jsimd_x86_64.c jsimd.h jsimdcfg.inc.h jsimdext.inc \
1717
jdcolor-sse2-64.asm jdmerge-sse2-64.asm jdsample-sse2-64.asm \
1818
jfdctfst-sse2-64.asm jfdctint-sse2-64.asm jidctflt-sse2-64.asm \
1919
jidctfst-sse2-64.asm jidctint-sse2-64.asm jidctred-sse2-64.asm \
20-
jquantf-sse2-64.asm jquanti-sse2-64.asm
20+
jquantf-sse2-64.asm jquanti-sse2-64.asm \
21+
jchuff-sse2-64.asm
2122

2223
jccolor-sse2-64.lo: jccolext-sse2-64.asm
2324
jcgray-sse2-64.lo: jcgryext-sse2-64.asm
@@ -40,7 +41,8 @@ libsimd_la_SOURCES = jsimd_i386.c jsimd.h jsimdcfg.inc.h jsimdext.inc \
4041
jdcolor-sse2.asm jdmerge-sse2.asm jdsample-sse2.asm \
4142
jfdctfst-sse2.asm jfdctint-sse2.asm jidctflt-sse2.asm \
4243
jidctfst-sse2.asm jidctint-sse2.asm jidctred-sse2.asm \
43-
jquantf-sse2.asm jquanti-sse2.asm
44+
jquantf-sse2.asm jquanti-sse2.asm \
45+
jchuff-sse2.asm
4446

4547
jccolor-mmx.lo: jccolext-mmx.asm
4648
jcgray.-mmx.lo: jcgryext-mmx.asm

0 commit comments

Comments
 (0)