mirror of
https://github.com/webmproject/libwebp.git
synced 2025-06-24 05:04:33 +02:00
Have lossless return the same results with/without -mt
enc cross_color_transform_bits and predictor_transform_bits were modified between configurations, leading to inconsistent results. Change-Id: I42809495a63dbacdda977ecbcc98d8de63d51184
This commit is contained in:
parent
753ed11ef8
commit
8852f89ab5
@ -1088,8 +1088,8 @@ static void ApplySubtractGreen(VP8LEncoder* const enc, int width, int height,
|
|||||||
static int ApplyPredictFilter(VP8LEncoder* const enc, int width, int height,
|
static int ApplyPredictFilter(VP8LEncoder* const enc, int width, int height,
|
||||||
int quality, int low_effort,
|
int quality, int low_effort,
|
||||||
int used_subtract_green, VP8LBitWriter* const bw,
|
int used_subtract_green, VP8LBitWriter* const bw,
|
||||||
int percent_range, int* const percent) {
|
int percent_range, int* const percent,
|
||||||
int best_bits;
|
int* best_bits) {
|
||||||
const int near_lossless_strength =
|
const int near_lossless_strength =
|
||||||
enc->use_palette ? 100 : enc->config->near_lossless;
|
enc->use_palette ? 100 : enc->config->near_lossless;
|
||||||
const int max_bits = ClampBits(width, height, enc->predictor_transform_bits,
|
const int max_bits = ClampBits(width, height, enc->predictor_transform_bits,
|
||||||
@ -1104,43 +1104,40 @@ static int ApplyPredictFilter(VP8LEncoder* const enc, int width, int height,
|
|||||||
enc->argb, enc->argb_scratch, enc->transform_data,
|
enc->argb, enc->argb_scratch, enc->transform_data,
|
||||||
near_lossless_strength, enc->config->exact,
|
near_lossless_strength, enc->config->exact,
|
||||||
used_subtract_green, enc->pic, percent_range / 2,
|
used_subtract_green, enc->pic, percent_range / 2,
|
||||||
percent, &best_bits)) {
|
percent, best_bits)) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
VP8LPutBits(bw, TRANSFORM_PRESENT, 1);
|
VP8LPutBits(bw, TRANSFORM_PRESENT, 1);
|
||||||
VP8LPutBits(bw, PREDICTOR_TRANSFORM, 2);
|
VP8LPutBits(bw, PREDICTOR_TRANSFORM, 2);
|
||||||
assert(best_bits >= MIN_TRANSFORM_BITS && best_bits <= MAX_TRANSFORM_BITS);
|
assert(*best_bits >= MIN_TRANSFORM_BITS && *best_bits <= MAX_TRANSFORM_BITS);
|
||||||
VP8LPutBits(bw, best_bits - MIN_TRANSFORM_BITS, NUM_TRANSFORM_BITS);
|
VP8LPutBits(bw, *best_bits - MIN_TRANSFORM_BITS, NUM_TRANSFORM_BITS);
|
||||||
enc->predictor_transform_bits = best_bits;
|
|
||||||
return EncodeImageNoHuffman(
|
return EncodeImageNoHuffman(
|
||||||
bw, enc->transform_data, &enc->hash_chain, &enc->refs[0],
|
bw, enc->transform_data, &enc->hash_chain, &enc->refs[0],
|
||||||
VP8LSubSampleSize(width, best_bits), VP8LSubSampleSize(height, best_bits),
|
VP8LSubSampleSize(width, *best_bits),
|
||||||
quality, low_effort, enc->pic, percent_range - percent_range / 2,
|
VP8LSubSampleSize(height, *best_bits), quality, low_effort, enc->pic,
|
||||||
percent);
|
percent_range - percent_range / 2, percent);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ApplyCrossColorFilter(VP8LEncoder* const enc, int width, int height,
|
static int ApplyCrossColorFilter(VP8LEncoder* const enc, int width, int height,
|
||||||
int quality, int low_effort,
|
int quality, int low_effort,
|
||||||
VP8LBitWriter* const bw, int percent_range,
|
VP8LBitWriter* const bw, int percent_range,
|
||||||
int* const percent) {
|
int* const percent, int* best_bits) {
|
||||||
const int min_bits = enc->cross_color_transform_bits;
|
const int min_bits = enc->cross_color_transform_bits;
|
||||||
int best_bits;
|
|
||||||
|
|
||||||
if (!VP8LColorSpaceTransform(width, height, min_bits, quality, enc->argb,
|
if (!VP8LColorSpaceTransform(width, height, min_bits, quality, enc->argb,
|
||||||
enc->transform_data, enc->pic,
|
enc->transform_data, enc->pic, percent_range / 2,
|
||||||
percent_range / 2, percent, &best_bits)) {
|
percent, best_bits)) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
VP8LPutBits(bw, TRANSFORM_PRESENT, 1);
|
VP8LPutBits(bw, TRANSFORM_PRESENT, 1);
|
||||||
VP8LPutBits(bw, CROSS_COLOR_TRANSFORM, 2);
|
VP8LPutBits(bw, CROSS_COLOR_TRANSFORM, 2);
|
||||||
assert(best_bits >= MIN_TRANSFORM_BITS && best_bits <= MAX_TRANSFORM_BITS);
|
assert(*best_bits >= MIN_TRANSFORM_BITS && *best_bits <= MAX_TRANSFORM_BITS);
|
||||||
VP8LPutBits(bw, best_bits - MIN_TRANSFORM_BITS, NUM_TRANSFORM_BITS);
|
VP8LPutBits(bw, *best_bits - MIN_TRANSFORM_BITS, NUM_TRANSFORM_BITS);
|
||||||
enc->cross_color_transform_bits = best_bits;
|
|
||||||
return EncodeImageNoHuffman(
|
return EncodeImageNoHuffman(
|
||||||
bw, enc->transform_data, &enc->hash_chain, &enc->refs[0],
|
bw, enc->transform_data, &enc->hash_chain, &enc->refs[0],
|
||||||
VP8LSubSampleSize(width, best_bits), VP8LSubSampleSize(height, best_bits),
|
VP8LSubSampleSize(width, *best_bits),
|
||||||
quality, low_effort, enc->pic, percent_range - percent_range / 2,
|
VP8LSubSampleSize(height, *best_bits), quality, low_effort, enc->pic,
|
||||||
percent);
|
percent_range - percent_range / 2, percent);
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
@ -1539,6 +1536,7 @@ static int EncodeStreamHook(void* input, void* data2) {
|
|||||||
for (idx = 0; idx < num_crunch_configs; ++idx) {
|
for (idx = 0; idx < num_crunch_configs; ++idx) {
|
||||||
const int entropy_idx = crunch_configs[idx].entropy_idx;
|
const int entropy_idx = crunch_configs[idx].entropy_idx;
|
||||||
int remaining_percent = 97 / num_crunch_configs, percent_range;
|
int remaining_percent = 97 / num_crunch_configs, percent_range;
|
||||||
|
int predictor_transform_bits = 0, cross_color_transform_bits = 0;
|
||||||
enc->use_palette =
|
enc->use_palette =
|
||||||
(entropy_idx == kPalette) || (entropy_idx == kPaletteAndSpatial);
|
(entropy_idx == kPalette) || (entropy_idx == kPaletteAndSpatial);
|
||||||
enc->use_subtract_green =
|
enc->use_subtract_green =
|
||||||
@ -1613,7 +1611,8 @@ static int EncodeStreamHook(void* input, void* data2) {
|
|||||||
percent_range = remaining_percent / 3;
|
percent_range = remaining_percent / 3;
|
||||||
if (!ApplyPredictFilter(enc, enc->current_width, height, quality,
|
if (!ApplyPredictFilter(enc, enc->current_width, height, quality,
|
||||||
low_effort, enc->use_subtract_green, bw,
|
low_effort, enc->use_subtract_green, bw,
|
||||||
percent_range, &percent)) {
|
percent_range, &percent,
|
||||||
|
&predictor_transform_bits)) {
|
||||||
goto Error;
|
goto Error;
|
||||||
}
|
}
|
||||||
remaining_percent -= percent_range;
|
remaining_percent -= percent_range;
|
||||||
@ -1622,7 +1621,8 @@ static int EncodeStreamHook(void* input, void* data2) {
|
|||||||
if (enc->use_cross_color) {
|
if (enc->use_cross_color) {
|
||||||
percent_range = remaining_percent / 2;
|
percent_range = remaining_percent / 2;
|
||||||
if (!ApplyCrossColorFilter(enc, enc->current_width, height, quality,
|
if (!ApplyCrossColorFilter(enc, enc->current_width, height, quality,
|
||||||
low_effort, bw, percent_range, &percent)) {
|
low_effort, bw, percent_range, &percent,
|
||||||
|
&cross_color_transform_bits)) {
|
||||||
goto Error;
|
goto Error;
|
||||||
}
|
}
|
||||||
remaining_percent -= percent_range;
|
remaining_percent -= percent_range;
|
||||||
@ -1654,8 +1654,8 @@ static int EncodeStreamHook(void* input, void* data2) {
|
|||||||
if (enc->use_subtract_green) stats->lossless_features |= 4;
|
if (enc->use_subtract_green) stats->lossless_features |= 4;
|
||||||
if (enc->use_palette) stats->lossless_features |= 8;
|
if (enc->use_palette) stats->lossless_features |= 8;
|
||||||
stats->histogram_bits = enc->histo_bits;
|
stats->histogram_bits = enc->histo_bits;
|
||||||
stats->transform_bits = enc->predictor_transform_bits;
|
stats->transform_bits = predictor_transform_bits;
|
||||||
stats->cross_color_transform_bits = enc->cross_color_transform_bits;
|
stats->cross_color_transform_bits = cross_color_transform_bits;
|
||||||
stats->cache_bits = enc->cache_bits;
|
stats->cache_bits = enc->cache_bits;
|
||||||
stats->palette_size = enc->palette_size;
|
stats->palette_size = enc->palette_size;
|
||||||
stats->lossless_size = (int)(best_size - byte_position);
|
stats->lossless_size = (int)(best_size - byte_position);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user