diff options
author | dcommander <dcommander@3789f03b-4d11-0410-bbf8-ca57d06f2519> | 2011-02-18 03:31:11 +0000 |
---|---|---|
committer | dcommander <dcommander@3789f03b-4d11-0410-bbf8-ca57d06f2519> | 2011-02-18 03:31:11 +0000 |
commit | c20a1d5ef47fc531bc5dddd63282ed7ea36a8472 (patch) | |
tree | 65a3376384782f39e343e1497c959724d40fd432 /branches | |
parent | d80fd1942861c12bc5d1f270ad85fefa2663e469 (diff) |
The SIMD quantization algorithm does not produce correct results with the fast forward integer DCT and JPEG qualities >= 98, so for now, use the non-SIMD quantization function under those circumstances.
git-svn-id: https://libjpeg-turbo.svn.sourceforge.net/svnroot/libjpeg-turbo@383 3789f03b-4d11-0410-bbf8-ca57d06f2519
Diffstat (limited to 'branches')
-rw-r--r-- | branches/1.0.x/ChangeLog.txt | 22 | ||||
-rw-r--r-- | branches/1.0.x/Makefile.am | 2 | ||||
-rwxr-xr-x | branches/1.0.x/README-turbo.txt | 28 | ||||
-rw-r--r-- | branches/1.0.x/jcdctmgr.c | 18 | ||||
-rw-r--r-- | branches/1.0.x/testimgfst100.jpg | bin | 0 -> 18884 bytes | |||
-rwxr-xr-x | branches/1.0.x/win/Makefile | 2 |
6 files changed, 61 insertions, 11 deletions
diff --git a/branches/1.0.x/ChangeLog.txt b/branches/1.0.x/ChangeLog.txt index a1ad2e4..9b1c317 100644 --- a/branches/1.0.x/ChangeLog.txt +++ b/branches/1.0.x/ChangeLog.txt @@ -3,13 +3,21 @@ [1] Added further protections against invalid Huffman codes. -[2] Since the fast integer forward DCT seems to degrade for JPEG qualities -greater than 95, TurboJPEG/OSS will now automatically use the slow integer -forward DCT when generating JPEG images of quality 96 or greater. This -reduces compression performance by as much as 15% for these high-quality images -but is necessary to ensure that the images are perceptually lossless. - -[3] Fixed visual artifacts in grayscale JPEG compression caused by a typo in +[2] The algorithm used by the SIMD quantization function cannot produce correct +results when the JPEG quality is >= 98 and the fast integer forward DCT is +used. Thus, the non-SIMD quantization function is now used for those cases, +and libjpeg-turbo should now produce identical output to libjpeg v6b in all +cases. + +[3] Despite the above, the fast integer forward DCT still degrades somewhat for +JPEG qualities greater than 95, so TurboJPEG/OSS will now automatically use the +slow integer forward DCT when generating JPEG images of quality 96 or greater. +This reduces compression performance by as much as 15% for these high-quality +images but is necessary to ensure that the images are perceptually lossless. +It also ensures that the library can avoid the performance pitfall created by +[2]. + +[4] Fixed visual artifacts in grayscale JPEG compression caused by a typo in the RGB-to-chrominance lookup tables. diff --git a/branches/1.0.x/Makefile.am b/branches/1.0.x/Makefile.am index f8552ea..a22ecda 100644 --- a/branches/1.0.x/Makefile.am +++ b/branches/1.0.x/Makefile.am @@ -102,6 +102,8 @@ test: testclean all ./jpegut ./cjpeg -dct int -outfile testoutint.jpg $(srcdir)/testorig.ppm ./cjpeg -dct fast -opt -outfile testoutfst.jpg $(srcdir)/testorig.ppm + ./cjpeg -dct fast -quality 100 -opt -outfile testoutfst100.jpg $(srcdir)/testorig.ppm + cmp $(srcdir)/testimgfst100.jpg testoutfst100.jpg ./cjpeg -dct float -outfile testoutflt.jpg $(srcdir)/testorig.ppm cmp $(srcdir)/testimgint.jpg testoutint.jpg cmp $(srcdir)/testimgfst.jpg testoutfst.jpg diff --git a/branches/1.0.x/README-turbo.txt b/branches/1.0.x/README-turbo.txt index 40350d0..8fb002b 100755 --- a/branches/1.0.x/README-turbo.txt +++ b/branches/1.0.x/README-turbo.txt @@ -43,6 +43,34 @@ counterparts from the libjpeg v6b source. ******************************************************************************* +** Performance pitfalls +******************************************************************************* + +=============== +Restart Markers +=============== + +The optimized Huffman decoder in libjpeg-turbo does not handle restart markers +in a way that makes libjpeg happy, so it is necessary to use the slow Huffman +decoder when decompressing a JPEG image that has restart markers. This can +cause the decompression performance to drop by as much as 20%, but the +performance will still be much much greater than that of libjpeg v6b. Many +consumer packages, such as PhotoShop, use restart markers when generating JPEG +images, so images generated by those programs will experience this issue. + +=============================================== +Fast Integer Forward DCT at High Quality Levels +=============================================== + +The algorithm used by the SIMD-accelerated quantization function cannot produce +correct results whenever the fast integer forward DCT is used along with a JPEG +quality of 98-100. Thus, libjpeg-turbo must use the non-SIMD quantization +function in those cases. This causes performance to drop by as much as 40%. +It is therefore strongly advised that you use the slow integer forward DCT +whenever encoding images with a JPEG quality of 98 or higher. + + +******************************************************************************* ** Using libjpeg-turbo ******************************************************************************* diff --git a/branches/1.0.x/jcdctmgr.c b/branches/1.0.x/jcdctmgr.c index 156957a..711f9da 100644 --- a/branches/1.0.x/jcdctmgr.c +++ b/branches/1.0.x/jcdctmgr.c @@ -4,6 +4,7 @@ * Copyright (C) 1994-1996, Thomas G. Lane. * Copyright (C) 1999-2006, MIYASAKA Masaru. * Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB + * Copyright (C) 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. * @@ -39,6 +40,8 @@ typedef JMETHOD(void, float_quantize_method_ptr, (JCOEFPTR coef_block, FAST_FLOAT * divisors, FAST_FLOAT * workspace)); +METHODDEF(void) quantize (JCOEFPTR, DCTELEM *, DCTELEM *); + typedef struct { struct jpeg_forward_dct pub; /* public fields */ @@ -160,7 +163,7 @@ flss (UINT16 val) * of in a consecutive manner, yet again in order to allow SIMD * routines. */ -LOCAL(void) +LOCAL(int) compute_reciprocal (UINT16 divisor, DCTELEM * dtbl) { UDCTELEM2 fq, fr; @@ -189,6 +192,9 @@ compute_reciprocal (UINT16 divisor, DCTELEM * dtbl) dtbl[DCTSIZE2 * 1] = (DCTELEM) c; /* correction + roundfactor */ dtbl[DCTSIZE2 * 2] = (DCTELEM) (1 << (sizeof(DCTELEM)*8*2 - r)); /* scale */ dtbl[DCTSIZE2 * 3] = (DCTELEM) r - sizeof(DCTELEM)*8; /* shift */ + + if(r <= 16) return 0; + else return 1; } /* @@ -232,7 +238,9 @@ start_pass_fdctmgr (j_compress_ptr cinfo) } dtbl = fdct->divisors[qtblno]; for (i = 0; i < DCTSIZE2; i++) { - compute_reciprocal(qtbl->quantval[i] << 3, &dtbl[i]); + if(!compute_reciprocal(qtbl->quantval[i] << 3, &dtbl[i]) + && fdct->quantize == jsimd_quantize) + fdct->quantize = quantize; } break; #endif @@ -266,10 +274,12 @@ start_pass_fdctmgr (j_compress_ptr cinfo) } dtbl = fdct->divisors[qtblno]; for (i = 0; i < DCTSIZE2; i++) { - compute_reciprocal( + if(!compute_reciprocal( DESCALE(MULTIPLY16V16((INT32) qtbl->quantval[i], (INT32) aanscales[i]), - CONST_BITS-3), &dtbl[i]); + CONST_BITS-3), &dtbl[i]) + && fdct->quantize == jsimd_quantize) + fdct->quantize = quantize; } } break; diff --git a/branches/1.0.x/testimgfst100.jpg b/branches/1.0.x/testimgfst100.jpg Binary files differnew file mode 100644 index 0000000..36d9b75 --- /dev/null +++ b/branches/1.0.x/testimgfst100.jpg diff --git a/branches/1.0.x/win/Makefile b/branches/1.0.x/win/Makefile index 9101c79..a63faf5 100755 --- a/branches/1.0.x/win/Makefile +++ b/branches/1.0.x/win/Makefile @@ -248,9 +248,11 @@ test: testclean $(ODIR)/cjpeg.exe $(ODIR)/djpeg.exe $(ODIR)/jpegtran.exe \ cd $(ODIR); ./jpegut $(ODIR)/cjpeg -dct int -outfile $(ODIR)/testoutint.jpg testorig.ppm $(ODIR)/cjpeg -dct fast -opt -outfile $(ODIR)/testoutfst.jpg testorig.ppm + $(ODIR)/cjpeg -dct fast -quality 100 -opt -outfile $(ODIR)/testoutfst100.jpg testorig.ppm $(ODIR)/cjpeg -dct float -outfile $(ODIR)/testoutflt.jpg testorig.ppm cmp testimgint.jpg $(ODIR)/testoutint.jpg cmp testimgfst.jpg $(ODIR)/testoutfst.jpg + cmp testimgfst100.jpg $(ODIR)/testoutfst100.jpg cmp testimgflt.jpg $(ODIR)/testoutflt.jpg $(ODIR)/djpeg -dct int -fast -ppm -outfile $(ODIR)/testoutint.ppm testorig.jpg $(ODIR)/djpeg -dct fast -ppm -outfile $(ODIR)/testoutfst.ppm testorig.jpg |