Enable combination of trellis quantization and scan optimization
This commit is contained in:
27
jcmaster.c
27
jcmaster.c
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user