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[] */ int scan_number; /* current index in scan_info[] */
/* fields for scan optimisation */ /* 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 char * scan_buffer[64]; /* buffer for a given scan */
unsigned long scan_size[64]; /* size for a given scan */ unsigned long scan_size[64]; /* size for a given scan */
unsigned long best_cost; /* bit count for best frequency split */ unsigned long best_cost; /* bit count for best frequency split */
@@ -327,9 +328,9 @@ select_scan_parameters (j_compress_ptr cinfo)
int ci; int ci;
#ifdef C_MULTISCAN_FILES_SUPPORTED #ifdef C_MULTISCAN_FILES_SUPPORTED
if (cinfo->scan_info != NULL) {
/* Prepare for current scan --- the script is already validated */
my_master_ptr master = (my_master_ptr) cinfo->master; 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 */
const jpeg_scan_info * scanptr = cinfo->scan_info + master->scan_number; const jpeg_scan_info * scanptr = cinfo->scan_info + master->scan_number;
cinfo->comps_in_scan = scanptr->comps_in_scan; 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; master->best_Al_luma = Al;
} else { } else {
master->scan_number = luma_freq_split_scan_start - 1; 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 == 3 && master->best_freq_split_idx_luma != 2) ||
(idx == 4 && master->best_freq_split_idx_luma != 4)) { (idx == 4 && master->best_freq_split_idx_luma != 4)) {
master->scan_number = cinfo->num_scans_luma - 1; 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); 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; master->best_Al_chroma = Al;
} else { } else {
master->scan_number = chroma_freq_split_scan_start - 1; 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 == 3 && master->best_freq_split_idx_chroma != 2) ||
(idx == 4 && master->best_freq_split_idx_chroma != 4)) { (idx == 4 && master->best_freq_split_idx_chroma != 4)) {
master->scan_number = cinfo->num_scans - 1; 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); 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) if (cinfo->trellis_quant)
master->pass_type = trellis_pass; master->pass_type = trellis_pass;
else else {
master->pass_type = output_pass; master->pass_type = output_pass;
if (! cinfo->optimize_coding) if (! cinfo->optimize_coding)
master->scan_number++; master->scan_number++;
}
break; break;
case huff_opt_pass: case huff_opt_pass:
/* next pass is always output of current scan */ /* next pass is always output of current scan */
@@ -822,7 +824,7 @@ finish_pass_master (j_compress_ptr cinfo)
master->scan_number++; master->scan_number++;
break; break;
case trellis_pass: case trellis_pass:
master->pass_type = output_pass; master->pass_type = (cinfo->optimize_scans) ? huff_opt_pass : output_pass;
break; break;
} }
@@ -878,18 +880,21 @@ jinit_c_master_control (j_compress_ptr cinfo, boolean transcode_only)
} }
master->scan_number = 0; master->scan_number = 0;
master->pass_number = 0; master->pass_number = 0;
if (cinfo->trellis_quant) if (cinfo->optimize_coding)
master->total_passes = 3; // Don't support multiple scans for now
else if (cinfo->optimize_coding)
master->total_passes = cinfo->num_scans * 2; master->total_passes = cinfo->num_scans * 2;
else else
master->total_passes = cinfo->num_scans; master->total_passes = cinfo->num_scans;
if (cinfo->trellis_quant)
master->total_passes += (cinfo->optimize_scans) ? 2 : 1;
if (cinfo->optimize_scans) { if (cinfo->optimize_scans) {
int i; int i;
master->best_Al_chroma = 0; master->best_Al_chroma = 0;
for (i = 0; i < cinfo->num_scans; i++) for (i = 0; i < cinfo->num_scans; i++)
master->scan_buffer[i] = NULL; 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); jpeg_default_colorspace(cinfo);
#ifdef C_PROGRESSIVE_SUPPORTED #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; cinfo->optimize_scans = TRUE;
jpeg_simple_progression(cinfo); jpeg_simple_progression(cinfo);
} else } else
cinfo->optimize_scans = FALSE; cinfo->optimize_scans = FALSE;
#endif #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_scale1 = 17.0;
cinfo->lambda_log_scale2 = 15.0; cinfo->lambda_log_scale2 = 15.0;
} }