Merge "Tune BackwardReferencesLz77 for low_effort (m=0)."

This commit is contained in:
pascal massimino 2015-01-08 00:46:51 -08:00 committed by Gerrit Code Review
commit 9422211d5f
3 changed files with 20 additions and 12 deletions

View File

@ -58,6 +58,8 @@ static int DistanceToPlaneCode(int xsize, int dist) {
return dist + 120; return dist + 120;
} }
// TODO(vikasa): Evaluate loading (and comparing) 32/64 bits for the inner while
// loop.
static WEBP_INLINE int FindMatchLength(const uint32_t* const array1, static WEBP_INLINE int FindMatchLength(const uint32_t* const array1,
const uint32_t* const array2, const uint32_t* const array2,
int best_len_match, int best_len_match,
@ -228,9 +230,13 @@ static void HashChainInsert(VP8LHashChain* const p,
} }
static void GetParamsForHashChainFindCopy( static void GetParamsForHashChainFindCopy(
int quality, int* iter_max, int* len_for_unit_dist) { int quality, int low_effort, int* iter_max, int* len_for_unit_dist) {
*iter_max = 8 + (quality * quality) / 40; *iter_max = 8 + (quality * quality) / 40;
*len_for_unit_dist = 32 + (96 * quality) / 100; *len_for_unit_dist = 32 + (96 * quality) / 100;
if (low_effort) {
*iter_max -= 2;
*len_for_unit_dist /= 4;
}
} }
static int GetWindowSizeForHashChain(int quality, int xsize) { static int GetWindowSizeForHashChain(int quality, int xsize) {
@ -370,8 +376,8 @@ static int BackwardReferencesRle(int xsize, int ysize,
} }
static int BackwardReferencesLz77(int xsize, int ysize, static int BackwardReferencesLz77(int xsize, int ysize,
const uint32_t* const argb, const uint32_t* const argb, int cache_bits,
int cache_bits, int quality, int quality, int low_effort,
VP8LHashChain* const hash_chain, VP8LHashChain* const hash_chain,
VP8LBackwardRefs* const refs) { VP8LBackwardRefs* const refs) {
int i; int i;
@ -382,7 +388,8 @@ static int BackwardReferencesLz77(int xsize, int ysize,
VP8LColorCache hashers; VP8LColorCache hashers;
int iter_max, len_for_unit_dist; int iter_max, len_for_unit_dist;
const int window_size = GetWindowSizeForHashChain(quality, xsize); const int window_size = GetWindowSizeForHashChain(quality, xsize);
GetParamsForHashChainFindCopy(quality, &iter_max, &len_for_unit_dist); GetParamsForHashChainFindCopy(quality, low_effort, &iter_max,
&len_for_unit_dist);
if (use_color_cache) { if (use_color_cache) {
cc_init = VP8LColorCacheInit(&hashers, cache_bits); cc_init = VP8LColorCacheInit(&hashers, cache_bits);
@ -402,7 +409,7 @@ static int BackwardReferencesLz77(int xsize, int ysize,
int len2 = 0; int len2 = 0;
int k; int k;
HashChainInsert(hash_chain, &argb[i], i); HashChainInsert(hash_chain, &argb[i], i);
if (len < (max_len >> 2)) { if ((len < (max_len >> 2)) && !low_effort) {
// Evaluate Alternative#2: Insert the pixel at 'i' as literal, and code // Evaluate Alternative#2: Insert the pixel at 'i' as literal, and code
// the pixels starting at 'i + 1' using backward reference. // the pixels starting at 'i + 1' using backward reference.
HashChainFindCopy(hash_chain, i + 1, xsize, argb, max_len - 1, HashChainFindCopy(hash_chain, i + 1, xsize, argb, max_len - 1,
@ -582,7 +589,7 @@ static int BackwardReferencesHashChainDistanceOnly(
const int min_distance_code = 2; const int min_distance_code = 2;
int iter_max, len_for_unit_dist; int iter_max, len_for_unit_dist;
const int window_size = GetWindowSizeForHashChain(quality, xsize); const int window_size = GetWindowSizeForHashChain(quality, xsize);
GetParamsForHashChainFindCopy(quality, &iter_max, &len_for_unit_dist); GetParamsForHashChainFindCopy(quality, 0, &iter_max, &len_for_unit_dist);
if (cost == NULL || cost_model == NULL) goto Error; if (cost == NULL || cost_model == NULL) goto Error;
@ -892,7 +899,7 @@ static int CalculateBestCacheSize(const uint32_t* const argb,
// Local color cache is disabled. // Local color cache is disabled.
return 1; return 1;
} }
if (!BackwardReferencesLz77(xsize, ysize, argb, cache_bits_low, quality, if (!BackwardReferencesLz77(xsize, ysize, argb, cache_bits_low, quality, 0,
hash_chain, refs)) { hash_chain, refs)) {
return 0; return 0;
} }
@ -961,7 +968,7 @@ static int BackwardRefsWithLocalCache(const uint32_t* const argb,
VP8LBackwardRefs* VP8LGetBackwardReferences( VP8LBackwardRefs* VP8LGetBackwardReferences(
int width, int height, const uint32_t* const argb, int quality, int width, int height, const uint32_t* const argb, int quality,
int* cache_bits, VP8LHashChain* const hash_chain, int low_effort, int* cache_bits, VP8LHashChain* const hash_chain,
VP8LBackwardRefs refs_array[2]) { VP8LBackwardRefs refs_array[2]) {
int lz77_is_useful; int lz77_is_useful;
int lz77_computed; int lz77_computed;
@ -985,7 +992,7 @@ VP8LBackwardRefs* VP8LGetBackwardReferences(
} }
} else { } else {
if (!BackwardReferencesLz77(width, height, argb, *cache_bits, quality, if (!BackwardReferencesLz77(width, height, argb, *cache_bits, quality,
hash_chain, refs_lz77)) { low_effort, hash_chain, refs_lz77)) {
goto Error; goto Error;
} }
} }

View File

@ -192,7 +192,7 @@ static WEBP_INLINE void VP8LRefsCursorNext(VP8LRefsCursor* const c) {
// refs[0] or refs[1]. // refs[0] or refs[1].
VP8LBackwardRefs* VP8LGetBackwardReferences( VP8LBackwardRefs* VP8LGetBackwardReferences(
int width, int height, const uint32_t* const argb, int quality, int width, int height, const uint32_t* const argb, int quality,
int* cache_bits, VP8LHashChain* const hash_chain, int low_effort, int* cache_bits, VP8LHashChain* const hash_chain,
VP8LBackwardRefs refs[2]); VP8LBackwardRefs refs[2]);
#ifdef __cplusplus #ifdef __cplusplus

View File

@ -685,7 +685,7 @@ static WebPEncodingError EncodeImageNoHuffman(VP8LBitWriter* const bw,
} }
// Calculate backward references from ARGB image. // Calculate backward references from ARGB image.
refs = VP8LGetBackwardReferences(width, height, argb, quality, &cache_bits, refs = VP8LGetBackwardReferences(width, height, argb, quality, 0, &cache_bits,
hash_chain, refs_array); hash_chain, refs_array);
if (refs == NULL) { if (refs == NULL) {
err = VP8_ENC_ERROR_OUT_OF_MEMORY; err = VP8_ENC_ERROR_OUT_OF_MEMORY;
@ -785,7 +785,8 @@ static WebPEncodingError EncodeImageInternal(VP8LBitWriter* const bw,
// of refs_array[0] or refs_array[1]. // of refs_array[0] or refs_array[1].
// Calculate backward references from ARGB image. // Calculate backward references from ARGB image.
best_refs = VP8LGetBackwardReferences(width, height, argb, quality, best_refs = VP8LGetBackwardReferences(width, height, argb, quality,
cache_bits, hash_chain, refs_array); low_effort, cache_bits, hash_chain,
refs_array);
if (best_refs == NULL || !VP8LBackwardRefsCopy(best_refs, &refs)) { if (best_refs == NULL || !VP8LBackwardRefsCopy(best_refs, &refs)) {
err = VP8_ENC_ERROR_OUT_OF_MEMORY; err = VP8_ENC_ERROR_OUT_OF_MEMORY;
goto Error; goto Error;