Enable combination of trellis quantization and scan optimization

This commit is contained in:
Frank Bossen
2014-03-28 12:42:37 +01:00
parent 2de8e97989
commit 199fffb759
2 changed files with 20 additions and 15 deletions

View File

@@ -42,6 +42,7 @@ typedef struct {
int scan_number; /* current index in scan_info[] */
/* fields for scan optimisation */
int pass_number_scan_opt_base; /* pass number where scan optimization begins */
unsigned char * scan_buffer[64]; /* buffer for a given scan */
unsigned long scan_size[64]; /* size for a given scan */
unsigned long best_cost; /* bit count for best frequency split */
@@ -327,9 +328,9 @@ select_scan_parameters (j_compress_ptr cinfo)
int ci;
#ifdef C_MULTISCAN_FILES_SUPPORTED
if (cinfo->scan_info != NULL) {
my_master_ptr master = (my_master_ptr) cinfo->master;
if (cinfo->scan_info != NULL && !(cinfo->optimize_scans && master->pass_number < master->pass_number_scan_opt_base)) {
/* Prepare for current scan --- the script is already validated */
my_master_ptr master = (my_master_ptr) cinfo->master;
const jpeg_scan_info * scanptr = cinfo->scan_info + master->scan_number;
cinfo->comps_in_scan = scanptr->comps_in_scan;
@@ -622,7 +623,7 @@ select_scans (j_compress_ptr cinfo, int next_scan_number)
master->best_Al_luma = Al;
} else {
master->scan_number = luma_freq_split_scan_start - 1;
master->pass_number = 2 * master->scan_number + 1;
master->pass_number = 2 * master->scan_number + 1 + master->pass_number_scan_opt_base;
}
}
@@ -647,7 +648,7 @@ select_scans (j_compress_ptr cinfo, int next_scan_number)
(idx == 3 && master->best_freq_split_idx_luma != 2) ||
(idx == 4 && master->best_freq_split_idx_luma != 4)) {
master->scan_number = cinfo->num_scans_luma - 1;
master->pass_number = 2 * master->scan_number + 1;
master->pass_number = 2 * master->scan_number + 1 + master->pass_number_scan_opt_base;
master->pub.is_last_pass = (master->pass_number == master->total_passes - 1);
}
}
@@ -679,7 +680,7 @@ select_scans (j_compress_ptr cinfo, int next_scan_number)
master->best_Al_chroma = Al;
} else {
master->scan_number = chroma_freq_split_scan_start - 1;
master->pass_number = 2 * master->scan_number + 1;
master->pass_number = 2 * master->scan_number + 1 + master->pass_number_scan_opt_base;
}
}
@@ -707,7 +708,7 @@ select_scans (j_compress_ptr cinfo, int next_scan_number)
(idx == 3 && master->best_freq_split_idx_chroma != 2) ||
(idx == 4 && master->best_freq_split_idx_chroma != 4)) {
master->scan_number = cinfo->num_scans - 1;
master->pass_number = 2 * master->scan_number + 1;
master->pass_number = 2 * master->scan_number + 1 + master->pass_number_scan_opt_base;
master->pub.is_last_pass = (master->pass_number == master->total_passes - 1);
}
}
@@ -800,10 +801,11 @@ finish_pass_master (j_compress_ptr cinfo)
*/
if (cinfo->trellis_quant)
master->pass_type = trellis_pass;
else
else {
master->pass_type = output_pass;
if (! cinfo->optimize_coding)
master->scan_number++;
if (! cinfo->optimize_coding)
master->scan_number++;
}
break;
case huff_opt_pass:
/* next pass is always output of current scan */
@@ -822,7 +824,7 @@ finish_pass_master (j_compress_ptr cinfo)
master->scan_number++;
break;
case trellis_pass:
master->pass_type = output_pass;
master->pass_type = (cinfo->optimize_scans) ? huff_opt_pass : output_pass;
break;
}
@@ -878,18 +880,21 @@ jinit_c_master_control (j_compress_ptr cinfo, boolean transcode_only)
}
master->scan_number = 0;
master->pass_number = 0;
if (cinfo->trellis_quant)
master->total_passes = 3; // Don't support multiple scans for now
else if (cinfo->optimize_coding)
if (cinfo->optimize_coding)
master->total_passes = cinfo->num_scans * 2;
else
master->total_passes = cinfo->num_scans;
if (cinfo->trellis_quant)
master->total_passes += (cinfo->optimize_scans) ? 2 : 1;
if (cinfo->optimize_scans) {
int i;
master->best_Al_chroma = 0;
for (i = 0; i < cinfo->num_scans; i++)
master->scan_buffer[i] = NULL;
master->pass_number_scan_opt_base = (cinfo->trellis_quant) ? 2 : 0;
}
}

View File

@@ -419,14 +419,14 @@ jpeg_set_defaults (j_compress_ptr cinfo)
jpeg_default_colorspace(cinfo);
#ifdef C_PROGRESSIVE_SUPPORTED
if (cinfo->use_moz_defaults == 1) { // Disable this while working on trellis
if (cinfo->use_moz_defaults != 0) { // Disable this while working on trellis
cinfo->optimize_scans = TRUE;
jpeg_simple_progression(cinfo);
} else
cinfo->optimize_scans = FALSE;
#endif
cinfo->trellis_quant = (cinfo->use_moz_defaults == 2) ? TRUE : FALSE;
cinfo->trellis_quant = (cinfo->use_moz_defaults != 0) ? TRUE : FALSE;
cinfo->lambda_log_scale1 = 17.0;
cinfo->lambda_log_scale2 = 15.0;
}