diff options
author | dcommander <dcommander@3789f03b-4d11-0410-bbf8-ca57d06f2519> | 2011-02-18 20:50:08 +0000 |
---|---|---|
committer | dcommander <dcommander@3789f03b-4d11-0410-bbf8-ca57d06f2519> | 2011-02-18 20:50:08 +0000 |
commit | f2e1b583789bebde820cb23b68781c83638c892c (patch) | |
tree | 4ed295546cfecfed20a61a8236a8e2146c7ed450 /trunk | |
parent | 366d74a7bb57d42b117e772f61d7a02442d2c363 (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@395 3789f03b-4d11-0410-bbf8-ca57d06f2519
Diffstat (limited to 'trunk')
-rw-r--r-- | trunk/ChangeLog.txt | 25 | ||||
-rw-r--r-- | trunk/Makefile.am | 2 | ||||
-rwxr-xr-x | trunk/README-turbo.txt | 28 | ||||
-rw-r--r-- | trunk/jcdctmgr.c | 18 | ||||
-rw-r--r-- | trunk/testimgfst100.jpg | bin | 0 -> 18884 bytes |
5 files changed, 62 insertions, 11 deletions
diff --git a/trunk/ChangeLog.txt b/trunk/ChangeLog.txt index 2f8f464..7537a0f 100644 --- a/trunk/ChangeLog.txt +++ b/trunk/ChangeLog.txt @@ -9,13 +9,24 @@ 1.1.0 ===== -[1] 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. - -[2] Ported jpgtest.cxx to pure C to avoid the need for a C++ compiler. +[1] 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. + +[2] 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 +[1]. + +[3] Ported jpgtest.cxx to pure C to avoid the need for a C++ compiler. + +[4] Fixed visual artifacts in grayscale JPEG compression caused by a typo in +the RGB-to-chrominance lookup tables. 1.0.90 (1.1 beta1) diff --git a/trunk/Makefile.am b/trunk/Makefile.am index 10a7099..dcde9f9 100644 --- a/trunk/Makefile.am +++ b/trunk/Makefile.am @@ -142,6 +142,8 @@ test: testclean all cmp $(srcdir)/testimgint.jpg testoutint.jpg ./cjpeg -dct fast -opt -outfile testoutfst.jpg $(srcdir)/testorig.ppm cmp $(srcdir)/testimgfst.jpg testoutfst.jpg + ./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 if WITH_SIMD cmp $(srcdir)/testimgflt.jpg testoutflt.jpg diff --git a/trunk/README-turbo.txt b/trunk/README-turbo.txt index 9aa44ab..33ed4cc 100755 --- a/trunk/README-turbo.txt +++ b/trunk/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/trunk/jcdctmgr.c b/trunk/jcdctmgr.c index 156957a..711f9da 100644 --- a/trunk/jcdctmgr.c +++ b/trunk/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/trunk/testimgfst100.jpg b/trunk/testimgfst100.jpg Binary files differnew file mode 100644 index 0000000..36d9b75 --- /dev/null +++ b/trunk/testimgfst100.jpg |