mirror of
https://github.com/webmproject/libwebp.git
synced 2024-12-26 13:48:21 +01:00
Tune performance of HistogramCombine
Number of pairs selected are limited between 25% of histogram images (at start) and number of histogram images left at any iteration. Increase the range of iter_mult. Removed min_cluster_size as parameter for tuning HistogramCombine. Change-Id: Ia4068cd7af4d0f63c5af9001aceda8a40b9de740
This commit is contained in:
parent
52ad1979d2
commit
812933d6ba
@ -249,8 +249,7 @@ static uint32_t MyRand(uint32_t *seed) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int HistogramCombine(const VP8LHistogramSet* const in,
|
static int HistogramCombine(const VP8LHistogramSet* const in,
|
||||||
VP8LHistogramSet* const out,
|
VP8LHistogramSet* const out, int iter_mult,
|
||||||
int min_cluster_size, int iter_mult,
|
|
||||||
int num_pairs, int num_tries_no_success) {
|
int num_pairs, int num_tries_no_success) {
|
||||||
int ok = 0;
|
int ok = 0;
|
||||||
int i, iter;
|
int i, iter;
|
||||||
@ -258,6 +257,7 @@ static int HistogramCombine(const VP8LHistogramSet* const in,
|
|||||||
int tries_with_no_success = 0;
|
int tries_with_no_success = 0;
|
||||||
int out_size = in->size;
|
int out_size = in->size;
|
||||||
const int outer_iters = in->size * iter_mult;
|
const int outer_iters = in->size * iter_mult;
|
||||||
|
const int min_cluster_size = 2;
|
||||||
VP8LHistogram* const histos = (VP8LHistogram*)malloc(2 * sizeof(*histos));
|
VP8LHistogram* const histos = (VP8LHistogram*)malloc(2 * sizeof(*histos));
|
||||||
VP8LHistogram* cur_combo = histos + 0; // trial merged histogram
|
VP8LHistogram* cur_combo = histos + 0; // trial merged histogram
|
||||||
VP8LHistogram* best_combo = histos + 1; // best merged histogram so far
|
VP8LHistogram* best_combo = histos + 1; // best merged histogram so far
|
||||||
@ -272,12 +272,12 @@ static int HistogramCombine(const VP8LHistogramSet* const in,
|
|||||||
|
|
||||||
// Collapse similar histograms in 'out'.
|
// Collapse similar histograms in 'out'.
|
||||||
for (iter = 0; iter < outer_iters && out_size >= min_cluster_size; ++iter) {
|
for (iter = 0; iter < outer_iters && out_size >= min_cluster_size; ++iter) {
|
||||||
// We pick the best pair to be combined out of 'inner_iters' pairs.
|
|
||||||
double best_cost_diff = 0.;
|
double best_cost_diff = 0.;
|
||||||
int best_idx1 = 0, best_idx2 = 1;
|
int best_idx1 = 0, best_idx2 = 1;
|
||||||
int j;
|
int j;
|
||||||
|
const int num_tries = (num_pairs < out_size) ? num_pairs : out_size;
|
||||||
seed += iter;
|
seed += iter;
|
||||||
for (j = 0; j < num_pairs; ++j) {
|
for (j = 0; j < num_tries; ++j) {
|
||||||
double curr_cost_diff;
|
double curr_cost_diff;
|
||||||
// Choose two histograms at random and try to combine them.
|
// Choose two histograms at random and try to combine them.
|
||||||
const uint32_t idx1 = MyRand(&seed) % out_size;
|
const uint32_t idx1 = MyRand(&seed) % out_size;
|
||||||
@ -386,21 +386,26 @@ int VP8LGetHistoImageSymbols(int xsize, int ysize,
|
|||||||
const int histo_xsize = histo_bits ? VP8LSubSampleSize(xsize, histo_bits) : 1;
|
const int histo_xsize = histo_bits ? VP8LSubSampleSize(xsize, histo_bits) : 1;
|
||||||
const int histo_ysize = histo_bits ? VP8LSubSampleSize(ysize, histo_bits) : 1;
|
const int histo_ysize = histo_bits ? VP8LSubSampleSize(ysize, histo_bits) : 1;
|
||||||
const int histo_image_raw_size = histo_xsize * histo_ysize;
|
const int histo_image_raw_size = histo_xsize * histo_ysize;
|
||||||
|
|
||||||
// Heuristic params for HistogramCombine().
|
// Heuristic params for HistogramCombine().
|
||||||
const int num_pairs = 8 + (quality >> 1);
|
|
||||||
const int num_tries_no_success = 8 + (quality >> 1);
|
const int num_tries_no_success = 8 + (quality >> 1);
|
||||||
const int min_cluster_size = (quality >= 25) ? ((quality >= 75) ? 2 : 3) : 4;
|
const int iter_mult = (quality < 27) ? 1 : 1 + ((quality - 27) >> 4);
|
||||||
const int iter_mult = (quality >= 25) ? ((quality >= 75) ? 3 : 2) : 1;
|
int num_pairs = (quality >> 1);
|
||||||
|
|
||||||
VP8LHistogramSet* const image_out =
|
VP8LHistogramSet* const image_out =
|
||||||
VP8LAllocateHistogramSet(histo_image_raw_size, cache_bits);
|
VP8LAllocateHistogramSet(histo_image_raw_size, cache_bits);
|
||||||
if (image_out == NULL) return 0;
|
if (image_out == NULL) return 0;
|
||||||
|
|
||||||
|
if (num_pairs > (histo_image_raw_size >> 2)) {
|
||||||
|
num_pairs = histo_image_raw_size >> 2;
|
||||||
|
}
|
||||||
|
num_pairs += 10;
|
||||||
|
|
||||||
// Build histogram image.
|
// Build histogram image.
|
||||||
HistogramBuildImage(xsize, histo_bits, refs, image_out);
|
HistogramBuildImage(xsize, histo_bits, refs, image_out);
|
||||||
// Collapse similar histograms.
|
// Collapse similar histograms.
|
||||||
if (!HistogramCombine(image_out, image_in, min_cluster_size, iter_mult,
|
if (!HistogramCombine(image_out, image_in, iter_mult, num_pairs,
|
||||||
num_pairs, num_tries_no_success)) {
|
num_tries_no_success)) {
|
||||||
goto Error;
|
goto Error;
|
||||||
}
|
}
|
||||||
// Find the optimal map from original histograms to the final ones.
|
// Find the optimal map from original histograms to the final ones.
|
||||||
|
Loading…
Reference in New Issue
Block a user