Doxygen Source Code Documentation
djpeg.c File Reference
#include "cdjpeg.h"
#include "jversion.h"
#include <ctype.h>
#include "cderror.h"
Go to the source code of this file.
Defines | |
#define | JMESSAGE(code, string) string , |
#define | DEFAULT_FMT FMT_PPM |
Enumerations | |
enum | IMAGE_FORMATS { FMT_BMP, FMT_GIF, FMT_OS2, FMT_PPM, FMT_RLE, FMT_TARGA, FMT_TIFF } |
Functions | |
usage (void) | |
parse_switches (j_decompress_ptr cinfo, int argc, char **argv, int last_file_arg_seen, boolean for_real) | |
jpeg_getc (j_decompress_ptr cinfo) | |
print_text_marker (j_decompress_ptr cinfo) | |
int | main (int argc, char **argv) |
Variables | |
const char *const | cdjpeg_message_table [] |
IMAGE_FORMATS | requested_fmt |
const char * | progname |
char * | outfilename |
Define Documentation
|
|
|
|
Enumeration Type Documentation
|
Definition at line 191 of file djpeg.c.
|
Function Documentation
|
Definition at line 486 of file djpeg.c. References outfilename.
00487 { 00488 if (file_index != argc-1) { 00489 fprintf(stderr, "%s: must name one input and one output file\n", 00490 progname); 00491 usage(); 00492 } 00493 } 00494 #else 00495 /* Unix style: expect zero or one file name */ 00496 if (file_index < argc-1) { 00497 fprintf(stderr, "%s: only one input file\n", progname); |
|
Definition at line 556 of file djpeg.c. References FMT_RLE, and FMT_TARGA.
00560 : 00561 dest_mgr = jinit_write_rle(&cinfo); 00562 break; 00563 #endif 00564 #ifdef TARGA_SUPPORTED 00565 case FMT_TARGA: 00566 dest_mgr = jinit_write_targa(&cinfo); 00567 break; 00568 #endif 00569 default: 00570 ERREXIT(&cinfo, JERR_UNSUPPORTED_FORMAT); 00571 break; 00572 } 00573 dest_mgr->output_file = output_file; 00574 00575 /* Start decompressor */ 00576 (void) jpeg_start_decompress(&cinfo); 00577 00578 /* Write output file header */ 00579 (*dest_mgr->start_output) (&cinfo, dest_mgr); 00580 00581 /* Process data */ 00582 while (cinfo.output_scanline < cinfo.output_height) { 00583 num_scanlines = jpeg_read_scanlines(&cinfo, dest_mgr->buffer, 00584 dest_mgr->buffer_height); 00585 (*dest_mgr->put_pixel_rows) (&cinfo, dest_mgr, num_scanlines); 00586 } 00587 00588 #ifdef PROGRESS_REPORT 00589 /* Hack: count final pass as done in case finish_output does an extra pass. 00590 * The library won't have updated completed_passes. 00591 */ 00592 progress.pub.completed_passes = progress.pub.total_passes; 00593 #endif 00594 00595 /* Finish decompression and release memory. 00596 * I must do it in this order because output module has allocated memory 00597 * of lifespan JPOOL_IMAGE; it needs to finish before releasing memory. 00598 */ 00599 (*dest_mgr->finish_output) (&cinfo, dest_mgr); 00600 (void) jpeg_finish_decompress(&cinfo); 00601 jpeg_destroy_decompress(&cinfo); 00602 00603 /* Close files, if we opened them */ 00604 if (input_file != stdin) 00605 fclose(input_file); 00606 if (output_file != stdout) 00607 fclose(output_file); 00608 00609 #ifdef PROGRESS_REPORT 00610 end_progress_monitor((j_common_ptr) &cinfo); 00611 #endif 00612 00613 /* All done. */ 00614 exit(jerr.num_warnings ? EXIT_WARNING : EXIT_SUCCESS); 00615 return 0; /* suppress no-return-value warnings */ } |
|
Definition at line 294 of file djpeg.c. References L.
00299 { 00300 /* Suppress fancy upsampling */ 00301 cinfo->do_fancy_upsampling = FALSE; 00302 00303 } else if (keymatch(arg, "onepass", 3)) { 00304 /* Use fast one-pass quantization. */ 00305 cinfo->two_pass_quantize = FALSE; 00306 00307 } else if (keymatch(arg, "os2", 3)) { 00308 /* BMP output format (OS/2 flavor). */ 00309 requested_fmt = FMT_OS2; 00310 00311 } else if (keymatch(arg, "outfile", 4)) { 00312 /* Set output file name. */ 00313 if (++argn >= argc) /* advance to next argument */ 00314 usage(); 00315 outfilename = argv[argn]; /* save it away for later use */ 00316 00317 } else if (keymatch(arg, "pnm", 1) || keymatch(arg, "ppm", 1)) { 00318 /* PPM/PGM output format. */ 00319 requested_fmt = FMT_PPM; 00320 00321 } else if (keymatch(arg, "rle", 1)) { 00322 /* RLE output format. */ 00323 requested_fmt = FMT_RLE; 00324 00325 } else if (keymatch(arg, "scale", 1)) { 00326 /* Scale the output image by a fraction M/N. */ 00327 if (++argn >= argc) /* advance to next argument */ 00328 usage(); 00329 if (sscanf(argv[argn], "%d/%d", 00330 &cinfo->scale_num, &cinfo->scale_denom) != 2) 00331 usage(); 00332 00333 } else if (keymatch(arg, "targa", 1)) { 00334 /* Targa output format. */ 00335 requested_fmt = FMT_TARGA; 00336 00337 } else { 00338 usage(); /* bogus switch */ 00339 } 00340 } 00341 00342 return argn; /* return index of next arg (file name) */ 00343 } 00344 00345 00346 /* 00347 * Marker processor for COM and interesting APPn markers. 00348 * This replaces the library's built-in processor, which just skips the marker. 00349 * We want to print out the marker as text, to the extent possible. 00350 * Note this code relies on a non-suspending data source. 00351 */ 00352 00353 LOCAL(unsigned int) 00354 jpeg_getc (j_decompress_ptr cinfo) 00355 /* Read next byte */ 00356 { 00357 struct jpeg_source_mgr * datasrc = cinfo->src; 00358 00359 if (datasrc->bytes_in_buffer == 0) { 00360 if (! (*datasrc->fill_input_buffer) (cinfo)) 00361 ERREXIT(cinfo, JERR_CANT_SUSPEND); 00362 } 00363 datasrc->bytes_in_buffer--; 00364 return GETJOCTET(*datasrc->next_input_byte++); 00365 } 00366 00367 00368 METHODDEF(boolean) 00369 print_text_marker (j_decompress_ptr cinfo) 00370 { 00371 boolean traceit = (cinfo->err->trace_level >= 1); 00372 INT32 length; 00373 unsigned int ch; 00374 unsigned int lastch = 0; 00375 00376 length = jpeg_getc(cinfo) << 8; 00377 length += jpeg_getc(cinfo); 00378 length -= 2; /* discount the length word itself */ 00379 00380 if (traceit) { 00381 if (cinfo->unread_marker == JPEG_COM) 00382 fprintf(stderr, "Comment, length %ld:\n", (long) length); 00383 else /* assume it is an APPn otherwise */ 00384 fprintf(stderr, "APP%d, length %ld:\n", 00385 cinfo->unread_marker - JPEG_APP0, (long) length); 00386 } 00387 00388 while (--length >= 0) { 00389 ch = jpeg_getc(cinfo); 00390 if (traceit) { 00391 /* Emit the character in a readable form. 00392 * Nonprintables are converted to \nnn form, 00393 * while \ is converted to \\. 00394 * Newlines in CR, CR/LF, or LF form will be printed as one newline. 00395 */ 00396 if (ch == '\r') { 00397 fprintf(stderr, "\n"); 00398 } else if (ch == '\n') { 00399 if (lastch != '\r') 00400 fprintf(stderr, "\n"); 00401 } else if (ch == '\\') { 00402 fprintf(stderr, "\\\\"); 00403 } else if (isprint(ch)) { 00404 putc(ch, stderr); 00405 } else { 00406 fprintf(stderr, "\\%03o", ch); 00407 } 00408 lastch = ch; 00409 } 00410 } 00411 00412 if (traceit) 00413 fprintf(stderr, "\n"); 00414 00415 return TRUE; 00416 } 00417 00418 00419 /* 00420 * The main program. 00421 */ 00422 00423 int 00424 main (int argc, char **argv) 00425 { 00426 struct jpeg_decompress_struct cinfo; 00427 struct jpeg_error_mgr jerr; 00428 #ifdef PROGRESS_REPORT 00429 struct cdjpeg_progress_mgr progress; 00430 #endif 00431 int file_index; 00432 djpeg_dest_ptr dest_mgr = NULL; 00433 FILE * input_file; 00434 FILE * output_file; 00435 JDIMENSION num_scanlines; 00436 00437 /* On Mac, fetch a command line. */ 00438 #ifdef USE_CCOMMAND 00439 argc = ccommand(&argv); 00440 #endif 00441 00442 progname = argv[0]; 00443 if (progname == NULL || progname[0] == 0) 00444 progname = "djpeg"; /* in case C library doesn't provide it */ 00445 00446 /* Initialize the JPEG decompression object with default error handling. */ 00447 cinfo.err = jpeg_std_error(&jerr); 00448 jpeg_create_decompress(&cinfo); 00449 /* Add some application-specific error messages (from cderror.h) */ 00450 jerr.addon_message_table = cdjpeg_message_table; 00451 jerr.first_addon_message = JMSG_FIRSTADDONCODE; 00452 jerr.last_addon_message = JMSG_LASTADDONCODE; 00453 00454 /* Insert custom marker processor for COM and APP12. 00455 * APP12 is used by some digital camera makers for textual info, 00456 * so we provide the ability to display it as text. 00457 * If you like, additional APPn marker types can be selected for display, 00458 * but don't try to override APP0 or APP14 this way (see libjpeg.doc). 00459 */ 00460 jpeg_set_marker_processor(&cinfo, JPEG_COM, print_text_marker); 00461 jpeg_set_marker_processor(&cinfo, JPEG_APP0+12, print_text_marker); 00462 00463 /* Now safe to enable signal catcher. */ 00464 #ifdef NEED_SIGNAL_CATCHER 00465 enable_signal_catcher((j_common_ptr) &cinfo); 00466 #endif 00467 00468 /* Scan command line to find file names. */ 00469 /* It is convenient to use just one switch-parsing routine, but the switch 00470 * values read here are ignored; we will rescan the switches after opening 00471 * the input file. 00472 * (Exception: tracing level set here controls verbosity for COM markers 00473 * found during jpeg_read_header...) 00474 */ 00475 |
|
Definition at line 501 of file djpeg.c. References argc, and progname.
00503 { 00504 if ((input_file = fopen(argv[file_index], READ_BINARY)) == NULL) { 00505 fprintf(stderr, "%s: can't open %s\n", progname, argv[file_index]); 00506 exit(EXIT_FAILURE); 00507 } 00508 } else { 00509 /* default input file is stdin */ 00510 input_file = read_stdin(); 00511 } 00512 00513 /* Open the output file. */ 00514 if (outfilename != NULL) { 00515 if ((output_file = fopen(outfilename, WRITE_BINARY)) == NULL) { 00516 fprintf(stderr, "%s: can't open %s\n", progname, outfilename); 00517 exit(EXIT_FAILURE); 00518 } 00519 } else { 00520 /* default output file is stdout */ 00521 output_file = write_stdout(); 00522 } 00523 00524 #ifdef PROGRESS_REPORT 00525 start_progress_monitor((j_common_ptr) &cinfo, &progress); 00526 #endif 00527 00528 /* Specify data source for decompression */ 00529 jpeg_stdio_src(&cinfo, input_file); 00530 00531 /* Read file header, set default decompression parameters */ 00532 (void) jpeg_read_header(&cinfo, TRUE); 00533 00534 /* Adjust default decompression parameters by re-parsing the options */ 00535 file_index = parse_switches(&cinfo, argc, argv, 0, TRUE); 00536 00537 /* Initialize the output module now to let it override any crucial 00538 * option settings (for instance, GIF wants to force color quantization). 00539 */ 00540 switch (requested_fmt) { 00541 #ifdef BMP_SUPPORTED 00542 case FMT_BMP: 00543 dest_mgr = jinit_write_bmp(&cinfo, FALSE); 00544 break; 00545 case FMT_OS2: 00546 dest_mgr = jinit_write_bmp(&cinfo, TRUE); 00547 break; 00548 #endif |
|
Definition at line 222 of file djpeg.c.
00224 { 00225 /* Select dithering algorithm. */ 00226 if (++argn >= argc) /* advance to next argument */ 00227 usage(); 00228 if (keymatch(argv[argn], "fs", 2)) { 00229 cinfo->dither_mode = JDITHER_FS; 00230 } else if (keymatch(argv[argn], "none", 2)) { 00231 cinfo->dither_mode = JDITHER_NONE; 00232 } else if (keymatch(argv[argn], "ordered", 2)) { 00233 cinfo->dither_mode = JDITHER_ORDERED; 00234 } else 00235 usage(); 00236 00237 } else if (keymatch(arg, "debug", 1) || keymatch(arg, "verbose", 1)) { 00238 /* Enable debug printouts. */ 00239 /* On first -d, print version identification */ 00240 static boolean printed_version = FALSE; 00241 00242 if (! printed_version) { 00243 fprintf(stderr, "Independent JPEG Group's DJPEG, version %s\n%s\n", 00244 JVERSION, JCOPYRIGHT); 00245 printed_version = TRUE; 00246 } 00247 cinfo->err->trace_level++; 00248 00249 } else if (keymatch(arg, "fast", 1)) { 00250 /* Select recommended processing options for quick-and-dirty output. */ 00251 cinfo->two_pass_quantize = FALSE; 00252 cinfo->dither_mode = JDITHER_ORDERED; 00253 if (! cinfo->quantize_colors) /* don't override an earlier -colors */ 00254 cinfo->desired_number_of_colors = 216; 00255 cinfo->dct_method = JDCT_FASTEST; 00256 cinfo->do_fancy_upsampling = FALSE; 00257 00258 } else if (keymatch(arg, "gif", 1)) { 00259 /* GIF output format. */ 00260 requested_fmt = FMT_GIF; 00261 00262 } else if (keymatch(arg, "grayscale", 2) || keymatch(arg, "greyscale",2)) { 00263 /* Force monochrome output. */ 00264 cinfo->out_color_space = JCS_GRAYSCALE; 00265 00266 } else if (keymatch(arg, "map", 3)) { 00267 /* Quantize to a color map taken from an input file. */ 00268 if (++argn >= argc) /* advance to next argument */ 00269 usage(); 00270 if (for_real) { /* too expensive to do twice! */ 00271 #ifdef QUANT_2PASS_SUPPORTED /* otherwise can't quantize to supplied map */ 00272 FILE * mapfile; 00273 00274 if ((mapfile = fopen(argv[argn], READ_BINARY)) == NULL) { 00275 fprintf(stderr, "%s: can't open %s\n", progname, argv[argn]); 00276 exit(EXIT_FAILURE); 00277 } 00278 read_color_map(cinfo, mapfile); 00279 fclose(mapfile); 00280 cinfo->quantize_colors = TRUE; 00281 #else 00282 ERREXIT(cinfo, JERR_NOT_COMPILED); 00283 #endif 00284 } 00285 00286 } else if (keymatch(arg, "maxmemory", 3)) { 00287 /* Maximum memory in Kb (or Mb with 'm'). */ 00288 long lval; 00289 char ch = 'x'; 00290 |
Variable Documentation
|
|
|
Definition at line 218 of file djpeg.c. Referenced by jpeg_getc(). |
|
Definition at line 217 of file djpeg.c. Referenced by print_text_marker(). |
|
|