diff options
author | fmalita <fmalita@google.com> | 2015-11-08 16:30:08 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-11-08 16:30:08 -0800 |
commit | 236364904dda3e0b8c7b497adc32b026b0a640f6 (patch) | |
tree | a9c2454e33cd22cbd08ea406cec97e14af88a6b1 /src/images | |
parent | 629162dd8ef127f793c9cedf0f47a1d4de4d3a3d (diff) |
Revert of Change quality settings on SkImageDecoder_libjpeg (patchset #1 id:40001 of https://codereview.chromium.org/1412803009/ )
Reason for revert:
Valgrind failures: http://build.chromium.org/p/client.skia/builders/Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release-Valgrind/builds/631/steps/nanobench/logs/stdio
==14022== Conditional jump or move depends on uninitialised value(s)
==14022== at 0x6A1DD6: S32A_Opaque_BlitRow32_SSE4(unsigned int*, unsigned int const*, int, unsigned int) (SkBlitRow_opts_SSE4.cpp:47)
==14022== by 0x5A7EEA: Sprite_D32_S32::blitRect(int, int, int, int) (SkSpriteBlitter_ARGB32.cpp:47)
==14022== by 0x57DD8A: SkScan::FillIRect(SkIRect const&, SkRegion const*, SkBlitter*) (SkScan.cpp:15)
==14022== by 0x57DEDC: SkScan::FillIRect(SkIRect const&, SkRasterClip const&, SkBlitter*) (SkScan.cpp:73)
==14022== by 0x536072: SkDraw::drawBitmap(SkBitmap const&, SkMatrix const&, SkRect const*, SkPaint const&) const (SkDraw.cpp:1286)
==14022== by 0x59CC50: SkBitmapDevice::drawBitmap(SkDraw const&, SkBitmap const&, SkMatrix const&, SkPaint const&) (SkBitmapDevice.cpp:248)
==14022== by 0x52F0DC: SkBaseDevice::drawImage(SkDraw const&, SkImage const*, float, float, SkPaint const&) (SkDevice.cpp:150)
==14022== by 0x525139: SkCanvas::onDrawImage(SkImage const*, float, float, SkPaint const*) (SkCanvas.cpp:2180)
==14022== by 0x5279A0: SkCanvas::drawImage(SkImage const*, float, float, SkPaint const*) (SkCanvas.cpp:1864)
==14022== by 0x441C83: SKPBench::onPerCanvasPostDraw(SkCanvas*) (SKPBench.cpp:95)
==14022== by 0x40A3FF: Benchmark::perCanvasPostDraw(SkCanvas*) (Benchmark.cpp:53)
==14022== by 0x44C527: nanobench_main() (nanobench.cpp:1254)
==14022== by 0x44D1E6: main (nanobench.cpp:1344)
==14022== Uninitialised value was created by a heap allocation
==14022== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==14022== by 0x602DAC: chromium_jpeg_get_large (jmemnobs.c:57)
==14022== by 0x602818: alloc_large (jmemmgr.c:376)
==14022== by 0x602A2E: alloc_sarray (jmemmgr.c:453)
==14022== by 0x614983: chromium_jinit_d_main_controller (jdmainct.c:450)
==14022== by 0x5FD3A0: chromium_jinit_master_decompress (jdmaster.c:577)
==14022== by 0x5F9198: chromium_jpeg_start_decompress (jdapistd.c:46)
==14022== by 0x680C22: SkJPEGImageDecoder::onDecode(SkStream*, SkBitmap*, SkImageDecoder::Mode) (SkImageDecoder_libjpeg.cpp:575)
==14022== by 0x67BCE8: SkImageDecoder::decode(SkStream*, SkBitmap*, SkColorType, SkImageDecoder::Mode) (SkImageDecoder.cpp:138)
==14022== by 0x6845E3: SkImageDecoderGenerator::onGetPixels(SkImageInfo const&, void*, unsigned long, unsigned int*, int*) (SkImageGenerator_skia.cpp:59)
==14022== by 0x53D4C7: SkImageGenerator::getPixels(SkImageInfo const&, void*, unsigned long, unsigned int*, int*) (SkImageGenerator.cpp:40)
==14022== by 0x53D6DF: SkImageGenerator::tryGenerateBitmap(SkBitmap*, SkImageInfo const*, SkBitmap::Allocator*) (SkImageGenerator.cpp:179)
==14022== by 0x53D334: SkImageCacherator::generateBitmap(SkBitmap*) (SkImageGenerator.h:174)
==14022== by 0x53D3A1: SkImageCacherator::tryLockAsBitmap(SkBitmap*, SkImage const*) (SkImageCacherator.cpp:118)
==14022== by 0x53D3EA: SkImageCacherator::lockAsBitmap(SkBitmap*, SkImage const*) (SkImageCacherator.cpp:132)
==14022== by 0x58EDCF: SkImage_Generator::getROPixels(SkBitmap*) const (SkImage_Generator.cpp:59)
==14022== by 0x52F007: SkBaseDevice::drawImageRect(SkDraw const&, SkImage const*, SkRect const*, SkRect const&, SkPaint const&, SkCanvas::SrcRectConstraint) (SkDevice.cpp:159)
==14022== by 0x5255E0: SkCanvas::onDrawImageRect(SkImage const*, SkRect const*, SkRect const&, SkPaint const*, SkCanvas::SrcRectConstraint) (SkCanvas.cpp:2209)
==14022== by 0x5279DC: SkCanvas::drawImageRect(SkImage const*, SkRect const&, SkRect const&, SkPaint const*, SkCanvas::SrcRectConstraint) (SkCanvas.cpp:1872)
Original issue's description:
> Change quality settings on SkImageDecoder_libjpeg
>
> It has been demonstrated that higher quality settings
> really do make a difference in the visual quality of
> the output image.
> https://code.google.com/p/chromium/issues/detail?id=385515
> https://code.google.com/p/skia/issues/detail?id=3770
>
> We are planning to replace SkImageDecoder with SkCodec,
> and SkCodec will use the higher quality settings. As
> a first step, we are using SkCodec as the underlying
> implementation for BitmapRegionDecoder. CTS tests require
> that BitmapRegionDecoder be a close match to BitmapFactory
> (which uses SkImageDecoder), so we must also update the
> quality of SkImageDecoder to maintain CTS compatibility.
>
> BUG=skia:
>
> Committed: https://skia.googlesource.com/skia/+/69ad6a9d03dd6f14b7c730465319313725a7c903
TBR=scroggo@google.com,msarett@google.com
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=skia:
Review URL: https://codereview.chromium.org/1432863002
Diffstat (limited to 'src/images')
-rw-r--r-- | src/images/SkImageDecoder_libjpeg.cpp | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/images/SkImageDecoder_libjpeg.cpp b/src/images/SkImageDecoder_libjpeg.cpp index f270cae611..914bdea5c8 100644 --- a/src/images/SkImageDecoder_libjpeg.cpp +++ b/src/images/SkImageDecoder_libjpeg.cpp @@ -379,11 +379,35 @@ static void set_error_mgr(jpeg_decompress_struct* cinfo, skjpeg_error_mgr* error } /** + * Common code for turning off upsampling and smoothing. Turning these + * off helps performance without showing noticable differences in the + * resulting bitmap. + */ +static void turn_off_visual_optimizations(jpeg_decompress_struct* cinfo) { + SkASSERT(cinfo != nullptr); + /* this gives about 30% performance improvement. In theory it may + reduce the visual quality, in practice I'm not seeing a difference + */ + cinfo->do_fancy_upsampling = 0; + + /* this gives another few percents */ + cinfo->do_block_smoothing = 0; +} + +/** * Common code for setting the dct method. */ static void set_dct_method(const SkImageDecoder& decoder, jpeg_decompress_struct* cinfo) { SkASSERT(cinfo != nullptr); +#ifdef DCT_IFAST_SUPPORTED + if (decoder.getPreferQualityOverSpeed()) { + cinfo->dct_method = JDCT_ISLOW; + } else { + cinfo->dct_method = JDCT_IFAST; + } +#else cinfo->dct_method = JDCT_ISLOW; +#endif } SkColorType SkJPEGImageDecoder::getBitmapColorType(jpeg_decompress_struct* cinfo) { @@ -552,6 +576,8 @@ SkImageDecoder::Result SkJPEGImageDecoder::onDecode(SkStream* stream, SkBitmap* SkASSERT(1 == cinfo.scale_num); cinfo.scale_denom = sampleSize; + turn_off_visual_optimizations(&cinfo); + const SkColorType colorType = this->getBitmapColorType(&cinfo); const SkAlphaType alphaType = kAlpha_8_SkColorType == colorType ? kPremul_SkAlphaType : kOpaque_SkAlphaType; @@ -877,6 +903,8 @@ bool SkJPEGImageDecoder::onDecodeYUV8Planes(SkStream* stream, SkISize componentS SkASSERT(1 == cinfo.scale_num); cinfo.scale_denom = 1; + turn_off_visual_optimizations(&cinfo); + #ifdef ANDROID_RGB cinfo.dither_mode = JDITHER_NONE; #endif @@ -951,6 +979,8 @@ bool SkJPEGImageDecoder::onBuildTileIndex(SkStreamRewindable* stream, int *width // that change (when it calls jinit_color_deconverter). (void) this->getBitmapColorType(cinfo); + turn_off_visual_optimizations(cinfo); + // instead of jpeg_start_decompress() we start a tiled decompress if (!imageIndex->startTileDecompress()) { return false; |