Index: third_party/libwebp/enc/analysis.c |
diff --git a/third_party/libwebp/enc/analysis.c b/third_party/libwebp/enc/analysis.c |
index e019465bbabdec0c88190e0a16f3add270abde1f..b55128fd4880631ea52d7e6a86233b0af4f473bd 100644 |
--- a/third_party/libwebp/enc/analysis.c |
+++ b/third_party/libwebp/enc/analysis.c |
@@ -111,28 +111,28 @@ static int FinalAlphaValue(int alpha) { |
} |
static int GetAlpha(const VP8Histogram* const histo) { |
- int max_value = 0, last_non_zero = 1; |
- int k; |
- int alpha; |
- for (k = 0; k <= MAX_COEFF_THRESH; ++k) { |
- const int value = histo->distribution[k]; |
- if (value > 0) { |
- if (value > max_value) max_value = value; |
- last_non_zero = k; |
- } |
- } |
// 'alpha' will later be clipped to [0..MAX_ALPHA] range, clamping outer |
// values which happen to be mostly noise. This leaves the maximum precision |
// for handling the useful small values which contribute most. |
- alpha = (max_value > 1) ? ALPHA_SCALE * last_non_zero / max_value : 0; |
+ const int max_value = histo->max_value; |
+ const int last_non_zero = histo->last_non_zero; |
+ const int alpha = |
+ (max_value > 1) ? ALPHA_SCALE * last_non_zero / max_value : 0; |
return alpha; |
} |
+static void InitHistogram(VP8Histogram* const histo) { |
+ histo->max_value = 0; |
+ histo->last_non_zero = 1; |
+} |
+ |
static void MergeHistograms(const VP8Histogram* const in, |
VP8Histogram* const out) { |
- int i; |
- for (i = 0; i <= MAX_COEFF_THRESH; ++i) { |
- out->distribution[i] += in->distribution[i]; |
+ if (in->max_value > out->max_value) { |
+ out->max_value = in->max_value; |
+ } |
+ if (in->last_non_zero > out->last_non_zero) { |
+ out->last_non_zero = in->last_non_zero; |
} |
} |
@@ -245,10 +245,11 @@ static int MBAnalyzeBestIntra16Mode(VP8EncIterator* const it) { |
VP8MakeLuma16Preds(it); |
for (mode = 0; mode < max_mode; ++mode) { |
- VP8Histogram histo = { { 0 } }; |
+ VP8Histogram histo; |
int alpha; |
- VP8CollectHistogram(it->yuv_in_ + Y_OFF, |
+ InitHistogram(&histo); |
+ VP8CollectHistogram(it->yuv_in_ + Y_OFF_ENC, |
it->yuv_p_ + VP8I16ModeOffsets[mode], |
0, 16, &histo); |
alpha = GetAlpha(&histo); |
@@ -266,21 +267,22 @@ static int MBAnalyzeBestIntra4Mode(VP8EncIterator* const it, |
uint8_t modes[16]; |
const int max_mode = MAX_INTRA4_MODE; |
int i4_alpha; |
- VP8Histogram total_histo = { { 0 } }; |
+ VP8Histogram total_histo; |
int cur_histo = 0; |
+ InitHistogram(&total_histo); |
VP8IteratorStartI4(it); |
do { |
int mode; |
int best_mode_alpha = DEFAULT_ALPHA; |
VP8Histogram histos[2]; |
- const uint8_t* const src = it->yuv_in_ + Y_OFF + VP8Scan[it->i4_]; |
+ const uint8_t* const src = it->yuv_in_ + Y_OFF_ENC + VP8Scan[it->i4_]; |
VP8MakeIntra4Preds(it); |
for (mode = 0; mode < max_mode; ++mode) { |
int alpha; |
- memset(&histos[cur_histo], 0, sizeof(histos[cur_histo])); |
+ InitHistogram(&histos[cur_histo]); |
VP8CollectHistogram(src, it->yuv_p_ + VP8I4ModeOffsets[mode], |
0, 1, &histos[cur_histo]); |
alpha = GetAlpha(&histos[cur_histo]); |
@@ -293,7 +295,7 @@ static int MBAnalyzeBestIntra4Mode(VP8EncIterator* const it, |
// accumulate best histogram |
MergeHistograms(&histos[cur_histo ^ 1], &total_histo); |
// Note: we reuse the original samples for predictors |
- } while (VP8IteratorRotateI4(it, it->yuv_in_ + Y_OFF)); |
+ } while (VP8IteratorRotateI4(it, it->yuv_in_ + Y_OFF_ENC)); |
i4_alpha = GetAlpha(&total_histo); |
if (IS_BETTER_ALPHA(i4_alpha, best_alpha)) { |
@@ -311,9 +313,10 @@ static int MBAnalyzeBestUVMode(VP8EncIterator* const it) { |
VP8MakeChroma8Preds(it); |
for (mode = 0; mode < max_mode; ++mode) { |
- VP8Histogram histo = { { 0 } }; |
+ VP8Histogram histo; |
int alpha; |
- VP8CollectHistogram(it->yuv_in_ + U_OFF, |
+ InitHistogram(&histo); |
+ VP8CollectHistogram(it->yuv_in_ + U_OFF_ENC, |
it->yuv_p_ + VP8UVModeOffsets[mode], |
16, 16 + 4 + 4, &histo); |
alpha = GetAlpha(&histo); |
@@ -402,8 +405,8 @@ typedef struct { |
static int DoSegmentsJob(SegmentJob* const job, VP8EncIterator* const it) { |
int ok = 1; |
if (!VP8IteratorIsDone(it)) { |
- uint8_t tmp[32 + ALIGN_CST]; |
- uint8_t* const scratch = (uint8_t*)DO_ALIGN(tmp); |
+ uint8_t tmp[32 + WEBP_ALIGN_CST]; |
+ uint8_t* const scratch = (uint8_t*)WEBP_ALIGN(tmp); |
do { |
// Let's pretend we have perfect lossless reconstruction. |
VP8IteratorImport(it, scratch); |