Add option to have single DC scan
Add option to have a single DC scan wherein all components are interleaved when using progressive mode. This may resolve compatibility issues raised in #29 and #48. This option is available through -onedcscan in cjpeg
This commit is contained in:
4
cjpeg.c
4
cjpeg.c
@@ -170,6 +170,7 @@ usage (void)
|
|||||||
#endif
|
#endif
|
||||||
fprintf(stderr, " -revert Revert to standard defaults (instead of mozjpeg defaults)\n");
|
fprintf(stderr, " -revert Revert to standard defaults (instead of mozjpeg defaults)\n");
|
||||||
fprintf(stderr, " -fastcrush Disable progressive scan optimization\n");
|
fprintf(stderr, " -fastcrush Disable progressive scan optimization\n");
|
||||||
|
fprintf(stderr, " -onedcscan Use a single DC scan containing all components\n");
|
||||||
fprintf(stderr, " -notrellis Disable trellis optimization\n");
|
fprintf(stderr, " -notrellis Disable trellis optimization\n");
|
||||||
fprintf(stderr, " -tune-psnr Tune trellis optimization for PSNR\n");
|
fprintf(stderr, " -tune-psnr Tune trellis optimization for PSNR\n");
|
||||||
fprintf(stderr, " -tune-hvs-psnr Tune trellis optimization for PSNR-HVS (default)\n");
|
fprintf(stderr, " -tune-hvs-psnr Tune trellis optimization for PSNR-HVS (default)\n");
|
||||||
@@ -342,6 +343,9 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv,
|
|||||||
lval *= 1000L;
|
lval *= 1000L;
|
||||||
cinfo->mem->max_memory_to_use = lval * 1000L;
|
cinfo->mem->max_memory_to_use = lval * 1000L;
|
||||||
|
|
||||||
|
} else if (keymatch(arg, "onedcscan", 3)) {
|
||||||
|
cinfo->one_dc_scan = TRUE;
|
||||||
|
|
||||||
} else if (keymatch(arg, "optimize", 1) || keymatch(arg, "optimise", 1)) {
|
} else if (keymatch(arg, "optimize", 1) || keymatch(arg, "optimise", 1)) {
|
||||||
/* Enable entropy parm optimization. */
|
/* Enable entropy parm optimization. */
|
||||||
#ifdef ENTROPY_OPT_SUPPORTED
|
#ifdef ENTROPY_OPT_SUPPORTED
|
||||||
|
|||||||
@@ -754,7 +754,7 @@ select_scans (j_compress_ptr cinfo, int next_scan_number)
|
|||||||
|
|
||||||
copy_buffer(cinfo, 0);
|
copy_buffer(cinfo, 0);
|
||||||
|
|
||||||
if (cinfo->num_scans > cinfo->num_scans_luma) {
|
if (cinfo->num_scans > cinfo->num_scans_luma && !cinfo->one_dc_scan) {
|
||||||
base_scan_idx = cinfo->num_scans_luma;
|
base_scan_idx = cinfo->num_scans_luma;
|
||||||
|
|
||||||
if (master->interleave_chroma_dc)
|
if (master->interleave_chroma_dc)
|
||||||
|
|||||||
@@ -702,6 +702,9 @@ jpeg_search_progression (j_compress_ptr cinfo)
|
|||||||
/* last 4 done conditionally */
|
/* last 4 done conditionally */
|
||||||
|
|
||||||
/* luma DC by itself */
|
/* luma DC by itself */
|
||||||
|
if (cinfo->one_dc_scan)
|
||||||
|
scanptr = fill_dc_scans(scanptr, ncomps, 0, 0);
|
||||||
|
else
|
||||||
scanptr = fill_dc_scans(scanptr, 1, 0, 0);
|
scanptr = fill_dc_scans(scanptr, 1, 0, 0);
|
||||||
|
|
||||||
scanptr = fill_a_scan(scanptr, 0, 1, 8, 0, 0);
|
scanptr = fill_a_scan(scanptr, 0, 1, 8, 0, 0);
|
||||||
@@ -824,8 +827,12 @@ jpeg_simple_progression (j_compress_ptr cinfo)
|
|||||||
if (cinfo->use_moz_defaults == TRUE) {
|
if (cinfo->use_moz_defaults == TRUE) {
|
||||||
/* scan defined in jpeg_scan_rgb.txt in jpgcrush */
|
/* scan defined in jpeg_scan_rgb.txt in jpgcrush */
|
||||||
/* Initial DC scan */
|
/* Initial DC scan */
|
||||||
|
if (cinfo->one_dc_scan)
|
||||||
|
scanptr = fill_dc_scans(scanptr, ncomps, 0, 0);
|
||||||
|
else {
|
||||||
scanptr = fill_dc_scans(scanptr, 1, 0, 0);
|
scanptr = fill_dc_scans(scanptr, 1, 0, 0);
|
||||||
scanptr = fill_a_scan_pair(scanptr, 1, 0, 0, 0, 0);
|
scanptr = fill_a_scan_pair(scanptr, 1, 0, 0, 0, 0);
|
||||||
|
}
|
||||||
/* Low frequency AC scans */
|
/* Low frequency AC scans */
|
||||||
scanptr = fill_a_scan(scanptr, 0, 1, 8, 0, 2);
|
scanptr = fill_a_scan(scanptr, 0, 1, 8, 0, 2);
|
||||||
scanptr = fill_a_scan(scanptr, 1, 1, 8, 0, 0);
|
scanptr = fill_a_scan(scanptr, 1, 1, 8, 0, 0);
|
||||||
|
|||||||
@@ -378,6 +378,7 @@ struct jpeg_compress_struct {
|
|||||||
|
|
||||||
boolean use_moz_defaults; /* TRUE=use Mozilla defaults */
|
boolean use_moz_defaults; /* TRUE=use Mozilla defaults */
|
||||||
boolean optimize_scans; /* TRUE=optimize progressive coding scans */
|
boolean optimize_scans; /* TRUE=optimize progressive coding scans */
|
||||||
|
boolean one_dc_scan; /* TRUE=use a single DC scan interleaving all components */
|
||||||
boolean trellis_quant; /* TRUE=use trellis quantization */
|
boolean trellis_quant; /* TRUE=use trellis quantization */
|
||||||
boolean trellis_eob_opt; /* TRUE=optimize for sequences of EOB */
|
boolean trellis_eob_opt; /* TRUE=optimize for sequences of EOB */
|
||||||
boolean use_flat_quant_tbl; /* TRUE=use flat quantization table */
|
boolean use_flat_quant_tbl; /* TRUE=use flat quantization table */
|
||||||
|
|||||||
Reference in New Issue
Block a user