00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #define JPEG_INTERNALS
00015 #include "jinclude.h"
00016 #include "jpeglib.h"
00017
00018
00019
00020
00021
00022
00023 GLOBAL(void)
00024 jpeg_add_quant_table (j_compress_ptr cinfo, int which_tbl,
00025 const unsigned int *basic_table,
00026 int scale_factor, boolean force_baseline)
00027
00028
00029
00030
00031
00032 {
00033 JQUANT_TBL ** qtblptr;
00034 int i;
00035 long temp;
00036
00037
00038 if (cinfo->global_state != CSTATE_START)
00039 ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
00040
00041 if (which_tbl < 0 || which_tbl >= NUM_QUANT_TBLS)
00042 ERREXIT1(cinfo, JERR_DQT_INDEX, which_tbl);
00043
00044 qtblptr = & cinfo->quant_tbl_ptrs[which_tbl];
00045
00046 if (*qtblptr == NULL)
00047 *qtblptr = jpeg_alloc_quant_table((j_common_ptr) cinfo);
00048
00049 for (i = 0; i < DCTSIZE2; i++) {
00050 temp = ((long) basic_table[i] * scale_factor + 50L) / 100L;
00051
00052 if (temp <= 0L) temp = 1L;
00053 if (temp > 32767L) temp = 32767L;
00054 if (force_baseline && temp > 255L)
00055 temp = 255L;
00056 (*qtblptr)->quantval[i] = (UINT16) temp;
00057 }
00058
00059
00060 (*qtblptr)->sent_table = FALSE;
00061 }
00062
00063
00064
00065
00066
00067
00068 static const unsigned int std_luminance_quant_tbl[DCTSIZE2] = {
00069 16, 11, 10, 16, 24, 40, 51, 61,
00070 12, 12, 14, 19, 26, 58, 60, 55,
00071 14, 13, 16, 24, 40, 57, 69, 56,
00072 14, 17, 22, 29, 51, 87, 80, 62,
00073 18, 22, 37, 56, 68, 109, 103, 77,
00074 24, 35, 55, 64, 81, 104, 113, 92,
00075 49, 64, 78, 87, 103, 121, 120, 101,
00076 72, 92, 95, 98, 112, 100, 103, 99
00077 };
00078 static const unsigned int std_chrominance_quant_tbl[DCTSIZE2] = {
00079 17, 18, 24, 47, 99, 99, 99, 99,
00080 18, 21, 26, 66, 99, 99, 99, 99,
00081 24, 26, 56, 99, 99, 99, 99, 99,
00082 47, 66, 99, 99, 99, 99, 99, 99,
00083 99, 99, 99, 99, 99, 99, 99, 99,
00084 99, 99, 99, 99, 99, 99, 99, 99,
00085 99, 99, 99, 99, 99, 99, 99, 99,
00086 99, 99, 99, 99, 99, 99, 99, 99
00087 };
00088
00089
00090 GLOBAL(void)
00091 jpeg_default_qtables (j_compress_ptr cinfo, boolean force_baseline)
00092
00093
00094
00095
00096 {
00097
00098 jpeg_add_quant_table(cinfo, 0, std_luminance_quant_tbl,
00099 cinfo->q_scale_factor[0], force_baseline);
00100 jpeg_add_quant_table(cinfo, 1, std_chrominance_quant_tbl,
00101 cinfo->q_scale_factor[1], force_baseline);
00102 }
00103
00104
00105 GLOBAL(void)
00106 jpeg_set_linear_quality (j_compress_ptr cinfo, int scale_factor,
00107 boolean force_baseline)
00108
00109
00110
00111
00112
00113 {
00114
00115 jpeg_add_quant_table(cinfo, 0, std_luminance_quant_tbl,
00116 scale_factor, force_baseline);
00117 jpeg_add_quant_table(cinfo, 1, std_chrominance_quant_tbl,
00118 scale_factor, force_baseline);
00119 }
00120
00121
00122 GLOBAL(int)
00123 jpeg_quality_scaling (int quality)
00124
00125
00126
00127
00128 {
00129
00130 if (quality <= 0) quality = 1;
00131 if (quality > 100) quality = 100;
00132
00133
00134
00135
00136
00137
00138
00139 if (quality < 50)
00140 quality = 5000 / quality;
00141 else
00142 quality = 200 - quality*2;
00143
00144 return quality;
00145 }
00146
00147
00148 GLOBAL(void)
00149 jpeg_set_quality (j_compress_ptr cinfo, int quality, boolean force_baseline)
00150
00151
00152
00153
00154
00155 {
00156
00157 quality = jpeg_quality_scaling(quality);
00158
00159
00160 jpeg_set_linear_quality(cinfo, quality, force_baseline);
00161 }
00162
00163
00164
00165
00166
00167
00168 LOCAL(void)
00169 add_huff_table (j_compress_ptr cinfo,
00170 JHUFF_TBL **htblptr, const UINT8 *bits, const UINT8 *val)
00171
00172 {
00173 int nsymbols, len;
00174
00175 if (*htblptr == NULL)
00176 *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
00177
00178
00179 MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits));
00180
00181
00182
00183
00184
00185 nsymbols = 0;
00186 for (len = 1; len <= 16; len++)
00187 nsymbols += bits[len];
00188 if (nsymbols < 1 || nsymbols > 256)
00189 ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
00190
00191 MEMCOPY((*htblptr)->huffval, val, nsymbols * SIZEOF(UINT8));
00192
00193
00194 (*htblptr)->sent_table = FALSE;
00195 }
00196
00197
00198 LOCAL(void)
00199 std_huff_tables (j_compress_ptr cinfo)
00200
00201
00202 {
00203 static const UINT8 bits_dc_luminance[17] =
00204 { 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };
00205 static const UINT8 val_dc_luminance[] =
00206 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
00207
00208 static const UINT8 bits_dc_chrominance[17] =
00209 { 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 };
00210 static const UINT8 val_dc_chrominance[] =
00211 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
00212
00213 static const UINT8 bits_ac_luminance[17] =
00214 { 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d };
00215 static const UINT8 val_ac_luminance[] =
00216 { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
00217 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
00218 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
00219 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
00220 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
00221 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
00222 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
00223 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
00224 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
00225 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
00226 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
00227 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
00228 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
00229 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
00230 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
00231 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
00232 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
00233 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
00234 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
00235 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
00236 0xf9, 0xfa };
00237
00238 static const UINT8 bits_ac_chrominance[17] =
00239 { 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 };
00240 static const UINT8 val_ac_chrominance[] =
00241 { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
00242 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
00243 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
00244 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
00245 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
00246 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
00247 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
00248 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
00249 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
00250 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
00251 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
00252 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
00253 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
00254 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
00255 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
00256 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
00257 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
00258 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
00259 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
00260 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
00261 0xf9, 0xfa };
00262
00263 add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[0],
00264 bits_dc_luminance, val_dc_luminance);
00265 add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[0],
00266 bits_ac_luminance, val_ac_luminance);
00267 add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[1],
00268 bits_dc_chrominance, val_dc_chrominance);
00269 add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[1],
00270 bits_ac_chrominance, val_ac_chrominance);
00271 }
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284 GLOBAL(void)
00285 jpeg_set_defaults (j_compress_ptr cinfo)
00286 {
00287 int i;
00288
00289
00290 if (cinfo->global_state != CSTATE_START)
00291 ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
00292
00293
00294
00295
00296
00297 if (cinfo->comp_info == NULL)
00298 cinfo->comp_info = (jpeg_component_info *)
00299 (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
00300 MAX_COMPONENTS * SIZEOF(jpeg_component_info));
00301
00302
00303
00304 cinfo->scale_num = 1;
00305 cinfo->scale_denom = 1;
00306 cinfo->data_precision = BITS_IN_JSAMPLE;
00307
00308 jpeg_set_quality(cinfo, 75, TRUE);
00309
00310 std_huff_tables(cinfo);
00311
00312
00313 for (i = 0; i < NUM_ARITH_TBLS; i++) {
00314 cinfo->arith_dc_L[i] = 0;
00315 cinfo->arith_dc_U[i] = 1;
00316 cinfo->arith_ac_K[i] = 5;
00317 }
00318
00319
00320 cinfo->scan_info = NULL;
00321 cinfo->num_scans = 0;
00322
00323
00324 cinfo->raw_data_in = FALSE;
00325
00326
00327 cinfo->arith_code = FALSE;
00328
00329
00330 cinfo->optimize_coding = FALSE;
00331
00332
00333
00334
00335
00336 if (cinfo->data_precision > 8)
00337 cinfo->optimize_coding = TRUE;
00338
00339
00340 cinfo->CCIR601_sampling = FALSE;
00341
00342
00343 cinfo->do_fancy_downsampling = TRUE;
00344
00345
00346 cinfo->smoothing_factor = 0;
00347
00348
00349 cinfo->dct_method = JDCT_DEFAULT;
00350
00351
00352 cinfo->restart_interval = 0;
00353 cinfo->restart_in_rows = 0;
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364 cinfo->JFIF_major_version = 1;
00365 cinfo->JFIF_minor_version = 1;
00366 cinfo->density_unit = 0;
00367 cinfo->X_density = 1;
00368 cinfo->Y_density = 1;
00369
00370
00371
00372 jpeg_default_colorspace(cinfo);
00373 }
00374
00375
00376
00377
00378
00379
00380 GLOBAL(void)
00381 jpeg_default_colorspace (j_compress_ptr cinfo)
00382 {
00383 switch (cinfo->in_color_space) {
00384 case JCS_GRAYSCALE:
00385 jpeg_set_colorspace(cinfo, JCS_GRAYSCALE);
00386 break;
00387 case JCS_RGB:
00388 jpeg_set_colorspace(cinfo, JCS_YCbCr);
00389 break;
00390 case JCS_YCbCr:
00391 jpeg_set_colorspace(cinfo, JCS_YCbCr);
00392 break;
00393 case JCS_CMYK:
00394 jpeg_set_colorspace(cinfo, JCS_CMYK);
00395 break;
00396 case JCS_YCCK:
00397 jpeg_set_colorspace(cinfo, JCS_YCCK);
00398 break;
00399 case JCS_UNKNOWN:
00400 jpeg_set_colorspace(cinfo, JCS_UNKNOWN);
00401 break;
00402 default:
00403 ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
00404 }
00405 }
00406
00407
00408
00409
00410
00411
00412 GLOBAL(void)
00413 jpeg_set_colorspace (j_compress_ptr cinfo, J_COLOR_SPACE colorspace)
00414 {
00415 jpeg_component_info * compptr;
00416 int ci;
00417
00418 #define SET_COMP(index,id,hsamp,vsamp,quant,dctbl,actbl) \
00419 (compptr = &cinfo->comp_info[index], \
00420 compptr->component_id = (id), \
00421 compptr->h_samp_factor = (hsamp), \
00422 compptr->v_samp_factor = (vsamp), \
00423 compptr->quant_tbl_no = (quant), \
00424 compptr->dc_tbl_no = (dctbl), \
00425 compptr->ac_tbl_no = (actbl) )
00426
00427
00428 if (cinfo->global_state != CSTATE_START)
00429 ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
00430
00431
00432
00433
00434
00435 cinfo->jpeg_color_space = colorspace;
00436
00437 cinfo->write_JFIF_header = FALSE;
00438 cinfo->write_Adobe_marker = FALSE;
00439
00440 switch (colorspace) {
00441 case JCS_GRAYSCALE:
00442 cinfo->write_JFIF_header = TRUE;
00443 cinfo->num_components = 1;
00444
00445 SET_COMP(0, 1, 1,1, 0, 0,0);
00446 break;
00447 case JCS_RGB:
00448 cinfo->write_Adobe_marker = TRUE;
00449 cinfo->num_components = 3;
00450 SET_COMP(0, 0x52 , 1,1, 0, 0,0);
00451 SET_COMP(1, 0x47 , 1,1, 0, 0,0);
00452 SET_COMP(2, 0x42 , 1,1, 0, 0,0);
00453 break;
00454 case JCS_YCbCr:
00455 cinfo->write_JFIF_header = TRUE;
00456 cinfo->num_components = 3;
00457
00458
00459 SET_COMP(0, 1, 2,2, 0, 0,0);
00460 SET_COMP(1, 2, 1,1, 1, 1,1);
00461 SET_COMP(2, 3, 1,1, 1, 1,1);
00462 break;
00463 case JCS_CMYK:
00464 cinfo->write_Adobe_marker = TRUE;
00465 cinfo->num_components = 4;
00466 SET_COMP(0, 0x43 , 1,1, 0, 0,0);
00467 SET_COMP(1, 0x4D , 1,1, 0, 0,0);
00468 SET_COMP(2, 0x59 , 1,1, 0, 0,0);
00469 SET_COMP(3, 0x4B , 1,1, 0, 0,0);
00470 break;
00471 case JCS_YCCK:
00472 cinfo->write_Adobe_marker = TRUE;
00473 cinfo->num_components = 4;
00474 SET_COMP(0, 1, 2,2, 0, 0,0);
00475 SET_COMP(1, 2, 1,1, 1, 1,1);
00476 SET_COMP(2, 3, 1,1, 1, 1,1);
00477 SET_COMP(3, 4, 2,2, 0, 0,0);
00478 break;
00479 case JCS_UNKNOWN:
00480 cinfo->num_components = cinfo->input_components;
00481 if (cinfo->num_components < 1 || cinfo->num_components > MAX_COMPONENTS)
00482 ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,
00483 MAX_COMPONENTS);
00484 for (ci = 0; ci < cinfo->num_components; ci++) {
00485 SET_COMP(ci, ci, 1,1, 0, 0,0);
00486 }
00487 break;
00488 default:
00489 ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
00490 }
00491 }
00492
00493
00494 #ifdef C_PROGRESSIVE_SUPPORTED
00495
00496 LOCAL(jpeg_scan_info *)
00497 fill_a_scan (jpeg_scan_info * scanptr, int ci,
00498 int Ss, int Se, int Ah, int Al)
00499
00500 {
00501 scanptr->comps_in_scan = 1;
00502 scanptr->component_index[0] = ci;
00503 scanptr->Ss = Ss;
00504 scanptr->Se = Se;
00505 scanptr->Ah = Ah;
00506 scanptr->Al = Al;
00507 scanptr++;
00508 return scanptr;
00509 }
00510
00511 LOCAL(jpeg_scan_info *)
00512 fill_scans (jpeg_scan_info * scanptr, int ncomps,
00513 int Ss, int Se, int Ah, int Al)
00514
00515 {
00516 int ci;
00517
00518 for (ci = 0; ci < ncomps; ci++) {
00519 scanptr->comps_in_scan = 1;
00520 scanptr->component_index[0] = ci;
00521 scanptr->Ss = Ss;
00522 scanptr->Se = Se;
00523 scanptr->Ah = Ah;
00524 scanptr->Al = Al;
00525 scanptr++;
00526 }
00527 return scanptr;
00528 }
00529
00530 LOCAL(jpeg_scan_info *)
00531 fill_dc_scans (jpeg_scan_info * scanptr, int ncomps, int Ah, int Al)
00532
00533 {
00534 int ci;
00535
00536 if (ncomps <= MAX_COMPS_IN_SCAN) {
00537
00538 scanptr->comps_in_scan = ncomps;
00539 for (ci = 0; ci < ncomps; ci++)
00540 scanptr->component_index[ci] = ci;
00541 scanptr->Ss = scanptr->Se = 0;
00542 scanptr->Ah = Ah;
00543 scanptr->Al = Al;
00544 scanptr++;
00545 } else {
00546
00547 scanptr = fill_scans(scanptr, ncomps, 0, 0, Ah, Al);
00548 }
00549 return scanptr;
00550 }
00551
00552
00553
00554
00555
00556
00557
00558 GLOBAL(void)
00559 jpeg_simple_progression (j_compress_ptr cinfo)
00560 {
00561 int ncomps = cinfo->num_components;
00562 int nscans;
00563 jpeg_scan_info * scanptr;
00564
00565
00566 if (cinfo->global_state != CSTATE_START)
00567 ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
00568
00569
00570 if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) {
00571
00572 nscans = 10;
00573 } else {
00574
00575 if (ncomps > MAX_COMPS_IN_SCAN)
00576 nscans = 6 * ncomps;
00577 else
00578 nscans = 2 + 4 * ncomps;
00579 }
00580
00581
00582
00583
00584
00585
00586
00587
00588 if (cinfo->script_space == NULL || cinfo->script_space_size < nscans) {
00589 cinfo->script_space_size = MAX(nscans, 10);
00590 cinfo->script_space = (jpeg_scan_info *)
00591 (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
00592 cinfo->script_space_size * SIZEOF(jpeg_scan_info));
00593 }
00594 scanptr = cinfo->script_space;
00595 cinfo->scan_info = scanptr;
00596 cinfo->num_scans = nscans;
00597
00598 if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) {
00599
00600
00601 scanptr = fill_dc_scans(scanptr, ncomps, 0, 1);
00602
00603 scanptr = fill_a_scan(scanptr, 0, 1, 5, 0, 2);
00604
00605 scanptr = fill_a_scan(scanptr, 2, 1, 63, 0, 1);
00606 scanptr = fill_a_scan(scanptr, 1, 1, 63, 0, 1);
00607
00608 scanptr = fill_a_scan(scanptr, 0, 6, 63, 0, 2);
00609
00610 scanptr = fill_a_scan(scanptr, 0, 1, 63, 2, 1);
00611
00612 scanptr = fill_dc_scans(scanptr, ncomps, 1, 0);
00613
00614 scanptr = fill_a_scan(scanptr, 2, 1, 63, 1, 0);
00615 scanptr = fill_a_scan(scanptr, 1, 1, 63, 1, 0);
00616
00617 scanptr = fill_a_scan(scanptr, 0, 1, 63, 1, 0);
00618 } else {
00619
00620
00621 scanptr = fill_dc_scans(scanptr, ncomps, 0, 1);
00622 scanptr = fill_scans(scanptr, ncomps, 1, 5, 0, 2);
00623 scanptr = fill_scans(scanptr, ncomps, 6, 63, 0, 2);
00624
00625 scanptr = fill_scans(scanptr, ncomps, 1, 63, 2, 1);
00626
00627 scanptr = fill_dc_scans(scanptr, ncomps, 1, 0);
00628 scanptr = fill_scans(scanptr, ncomps, 1, 63, 1, 0);
00629 }
00630 }
00631
00632 #endif