From 312e638f30db67b5d34d5a9b12d35bbd6d13eb36 Mon Sep 17 00:00:00 2001 From: Vikas Arora Date: Fri, 14 Mar 2014 09:54:58 -0700 Subject: [PATCH] Extend the search space for GetBestGreenRedToBlue Get back some of the compression gains by extending the search space for GetBestGreenRedToBlue. Also removed the SkipRepeatedPixels call, as it was not helping much in yielding better compression density. Before: 1000 files, 63530337 pixels, 1 loops => 45.0s (45.0 ms/file/iterations) Compression (output/input): 2.463/3.268 bpp, Encode rate (raw data): 1.347 MP/s After: 1000 files, 63530337 pixels, 1 loops => 45.9s (45.9 ms/file/iterations) Compression (output/input): 2.461/3.268 bpp, Encode rate (raw data): 1.321 MP/s Change-Id: I044ba9d3f5bec088305e94a7c40c053ca237fd9d --- src/dsp/lossless.c | 29 ++--------------------------- 1 file changed, 2 insertions(+), 27 deletions(-) diff --git a/src/dsp/lossless.c b/src/dsp/lossless.c index d12ef565..b8251e66 100644 --- a/src/dsp/lossless.c +++ b/src/dsp/lossless.c @@ -892,25 +892,6 @@ static WEBP_INLINE uint8_t TransformColorBlue(uint8_t green_to_blue, return (new_blue & 0xff); } -static WEBP_INLINE int SkipRepeatedPixels(const uint32_t* const argb, - int ix, int xsize) { - const uint32_t v = argb[ix]; - if (ix >= 3) { - if (v == argb[ix - 3] && v == argb[ix - 2] && v == argb[ix - 1]) { - return 1; - } - if (ix >= xsize + 3) { - if (v == argb[ix - xsize] && - argb[ix - 3] == argb[ix - xsize - 3] && - argb[ix - 2] == argb[ix - xsize - 2] && - argb[ix - 1] == argb[ix - xsize - 1]) { - return 1; - } - } - } - return 0; -} - static float PredictionCostCrossColor(const int accumulated[256], const int counts[256]) { // Favor low entropy, locally and globally. @@ -931,9 +912,6 @@ static float GetPredictionCostCrossColorRed( int ix = all_y * xsize + tile_x_offset; int all_x; for (all_x = tile_x_offset; all_x < all_x_max; ++all_x, ++ix) { - if (SkipRepeatedPixels(argb, ix, xsize)) { - continue; - } ++histo[TransformColorRed(green_to_red, argb[ix])]; // red. } } @@ -1001,9 +979,6 @@ static float GetPredictionCostCrossColorBlue( int all_x; int ix = all_y * xsize + tile_x_offset; for (all_x = tile_x_offset; all_x < all_x_max; ++all_x, ++ix) { - if (SkipRepeatedPixels(argb, ix, xsize)) { - continue; - } ++histo[TransformColorBlue(green_to_blue, red_to_blue, argb[ix])]; } } @@ -1039,8 +1014,8 @@ static void GetBestGreenRedToBlue( const int step = (quality < 25) ? 32 : (quality > 50) ? 8 : 16; const int min_green_to_blue = -32; const int max_green_to_blue = 32; - const int min_red_to_blue = -16; - const int max_red_to_blue = 16; + const int min_red_to_blue = -32; + const int max_red_to_blue = 32; const int num_iters = (1 + (max_green_to_blue - min_green_to_blue) / step) * (1 + (max_red_to_blue - min_red_to_blue) / step);