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:
		@@ -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.
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user