char *iw_get_libwebp_enc_version_string(char *s, int s_len) { int v; v=WebPGetEncoderVersion(); iw_snprintf(s,s_len,"%d.%d.%d",(v&0xff0000)>>16, (v&0xff00)>>8,v&0xff); return s; }
int main(int argc, const char *argv[]) { int return_value = -1; const char *in_file = NULL, *out_file = NULL, *dump_file = NULL; FILE *out = NULL; int c; int short_output = 0; int quiet = 0; int keep_alpha = 1; int blend_alpha = 0; uint32_t background_color = 0xffffffu; int crop = 0, crop_x = 0, crop_y = 0, crop_w = 0, crop_h = 0; int resize_w = 0, resize_h = 0; int lossless_preset = 6; int use_lossless_preset = -1; // -1=unset, 0=don't use, 1=use it int show_progress = 0; int keep_metadata = 0; int metadata_written = 0; WebPPicture picture; int print_distortion = -1; // -1=off, 0=PSNR, 1=SSIM, 2=LSIM WebPPicture original_picture; // when PSNR or SSIM is requested WebPConfig config; WebPAuxStats stats; WebPMemoryWriter memory_writer; Metadata metadata; Stopwatch stop_watch; MetadataInit(&metadata); WebPMemoryWriterInit(&memory_writer); if (!WebPPictureInit(&picture) || !WebPPictureInit(&original_picture) || !WebPConfigInit(&config)) { fprintf(stderr, "Error! Version mismatch!\n"); return -1; } if (argc == 1) { HelpShort(); return 0; } for (c = 1; c < argc; ++c) { if (!strcmp(argv[c], "-h") || !strcmp(argv[c], "-help")) { HelpShort(); return 0; } else if (!strcmp(argv[c], "-H") || !strcmp(argv[c], "-longhelp")) { HelpLong(); return 0; } else if (!strcmp(argv[c], "-o") && c < argc - 1) { out_file = argv[++c]; } else if (!strcmp(argv[c], "-d") && c < argc - 1) { dump_file = argv[++c]; config.show_compressed = 1; } else if (!strcmp(argv[c], "-print_psnr")) { config.show_compressed = 1; print_distortion = 0; } else if (!strcmp(argv[c], "-print_ssim")) { config.show_compressed = 1; print_distortion = 1; } else if (!strcmp(argv[c], "-print_lsim")) { config.show_compressed = 1; print_distortion = 2; } else if (!strcmp(argv[c], "-short")) { ++short_output; } else if (!strcmp(argv[c], "-s") && c < argc - 2) { picture.width = strtol(argv[++c], NULL, 0); picture.height = strtol(argv[++c], NULL, 0); } else if (!strcmp(argv[c], "-m") && c < argc - 1) { config.method = strtol(argv[++c], NULL, 0); use_lossless_preset = 0; // disable -z option } else if (!strcmp(argv[c], "-q") && c < argc - 1) { config.quality = (float)strtod(argv[++c], NULL); use_lossless_preset = 0; // disable -z option } else if (!strcmp(argv[c], "-z") && c < argc - 1) { lossless_preset = strtol(argv[++c], NULL, 0); if (use_lossless_preset != 0) use_lossless_preset = 1; } else if (!strcmp(argv[c], "-alpha_q") && c < argc - 1) { config.alpha_quality = strtol(argv[++c], NULL, 0); } else if (!strcmp(argv[c], "-alpha_method") && c < argc - 1) { config.alpha_compression = strtol(argv[++c], NULL, 0); } else if (!strcmp(argv[c], "-alpha_cleanup")) { keep_alpha = keep_alpha ? 2 : 0; } else if (!strcmp(argv[c], "-blend_alpha") && c < argc - 1) { blend_alpha = 1; background_color = strtol(argv[++c], NULL, 16); // <- parses '0x' prefix background_color = background_color & 0x00ffffffu; } else if (!strcmp(argv[c], "-alpha_filter") && c < argc - 1) { ++c; if (!strcmp(argv[c], "none")) { config.alpha_filtering = 0; } else if (!strcmp(argv[c], "fast")) { config.alpha_filtering = 1; } else if (!strcmp(argv[c], "best")) { config.alpha_filtering = 2; } else { fprintf(stderr, "Error! Unrecognized alpha filter: %s\n", argv[c]); goto Error; } } else if (!strcmp(argv[c], "-noalpha")) { keep_alpha = 0; } else if (!strcmp(argv[c], "-lossless")) { config.lossless = 1; } else if (!strcmp(argv[c], "-hint") && c < argc - 1) { ++c; if (!strcmp(argv[c], "photo")) { config.image_hint = WEBP_HINT_PHOTO; } else if (!strcmp(argv[c], "picture")) { config.image_hint = WEBP_HINT_PICTURE; } else if (!strcmp(argv[c], "graph")) { config.image_hint = WEBP_HINT_GRAPH; } else { fprintf(stderr, "Error! Unrecognized image hint: %s\n", argv[c]); goto Error; } } else if (!strcmp(argv[c], "-size") && c < argc - 1) { config.target_size = strtol(argv[++c], NULL, 0); } else if (!strcmp(argv[c], "-psnr") && c < argc - 1) { config.target_PSNR = (float)strtod(argv[++c], NULL); } else if (!strcmp(argv[c], "-sns") && c < argc - 1) { config.sns_strength = strtol(argv[++c], NULL, 0); } else if (!strcmp(argv[c], "-f") && c < argc - 1) { config.filter_strength = strtol(argv[++c], NULL, 0); } else if (!strcmp(argv[c], "-af")) { config.autofilter = 1; } else if (!strcmp(argv[c], "-jpeg_like")) { config.emulate_jpeg_size = 1; } else if (!strcmp(argv[c], "-mt")) { ++config.thread_level; // increase thread level } else if (!strcmp(argv[c], "-low_memory")) { config.low_memory = 1; } else if (!strcmp(argv[c], "-strong")) { config.filter_type = 1; } else if (!strcmp(argv[c], "-nostrong")) { config.filter_type = 0; } else if (!strcmp(argv[c], "-sharpness") && c < argc - 1) { config.filter_sharpness = strtol(argv[++c], NULL, 0); } else if (!strcmp(argv[c], "-pass") && c < argc - 1) { config.pass = strtol(argv[++c], NULL, 0); } else if (!strcmp(argv[c], "-pre") && c < argc - 1) { config.preprocessing = strtol(argv[++c], NULL, 0); } else if (!strcmp(argv[c], "-segments") && c < argc - 1) { config.segments = strtol(argv[++c], NULL, 0); } else if (!strcmp(argv[c], "-partition_limit") && c < argc - 1) { config.partition_limit = strtol(argv[++c], NULL, 0); } else if (!strcmp(argv[c], "-map") && c < argc - 1) { picture.extra_info_type = strtol(argv[++c], NULL, 0); #ifdef WEBP_EXPERIMENTAL_FEATURES } else if (!strcmp(argv[c], "-444")) { picture.colorspace = WEBP_YUV444; } else if (!strcmp(argv[c], "-422")) { picture.colorspace = WEBP_YUV422; } else if (!strcmp(argv[c], "-gray")) { picture.colorspace = WEBP_YUV400; #endif } else if (!strcmp(argv[c], "-crop") && c < argc - 4) { crop = 1; crop_x = strtol(argv[++c], NULL, 0); crop_y = strtol(argv[++c], NULL, 0); crop_w = strtol(argv[++c], NULL, 0); crop_h = strtol(argv[++c], NULL, 0); } else if (!strcmp(argv[c], "-resize") && c < argc - 2) { resize_w = strtol(argv[++c], NULL, 0); resize_h = strtol(argv[++c], NULL, 0); #ifndef WEBP_DLL } else if (!strcmp(argv[c], "-noasm")) { VP8GetCPUInfo = NULL; #endif } else if (!strcmp(argv[c], "-version")) { const int version = WebPGetEncoderVersion(); printf("%d.%d.%d\n", (version >> 16) & 0xff, (version >> 8) & 0xff, version & 0xff); return 0; } else if (!strcmp(argv[c], "-progress")) { show_progress = 1; } else if (!strcmp(argv[c], "-quiet")) { quiet = 1; } else if (!strcmp(argv[c], "-preset") && c < argc - 1) { WebPPreset preset; ++c; if (!strcmp(argv[c], "default")) { preset = WEBP_PRESET_DEFAULT; } else if (!strcmp(argv[c], "photo")) { preset = WEBP_PRESET_PHOTO; } else if (!strcmp(argv[c], "picture")) { preset = WEBP_PRESET_PICTURE; } else if (!strcmp(argv[c], "drawing")) { preset = WEBP_PRESET_DRAWING; } else if (!strcmp(argv[c], "icon")) { preset = WEBP_PRESET_ICON; } else if (!strcmp(argv[c], "text")) { preset = WEBP_PRESET_TEXT; } else { fprintf(stderr, "Error! Unrecognized preset: %s\n", argv[c]); goto Error; } if (!WebPConfigPreset(&config, preset, config.quality)) { fprintf(stderr, "Error! Could initialize configuration with preset.\n"); goto Error; } } else if (!strcmp(argv[c], "-metadata") && c < argc - 1) { static const struct { const char* option; int flag; } kTokens[] = { { "all", METADATA_ALL }, { "none", 0 }, { "exif", METADATA_EXIF }, { "icc", METADATA_ICC }, { "xmp", METADATA_XMP }, }; const size_t kNumTokens = sizeof(kTokens) / sizeof(kTokens[0]); const char* start = argv[++c]; const char* const end = start + strlen(start); while (start < end) { size_t i; const char* token = strchr(start, ','); if (token == NULL) token = end; for (i = 0; i < kNumTokens; ++i) { if ((size_t)(token - start) == strlen(kTokens[i].option) && !strncmp(start, kTokens[i].option, strlen(kTokens[i].option))) { if (kTokens[i].flag != 0) { keep_metadata |= kTokens[i].flag; } else { keep_metadata = 0; } break; } } if (i == kNumTokens) { fprintf(stderr, "Error! Unknown metadata type '%.*s'\n", (int)(token - start), start); HelpLong(); return -1; } start = token + 1; } #ifdef HAVE_WINCODEC_H if (keep_metadata != 0 && keep_metadata != METADATA_ICC) { // TODO(jzern): remove when -metadata is supported on all platforms. fprintf(stderr, "Warning: only ICC profile extraction is currently" " supported on this platform!\n"); } #endif } else if (!strcmp(argv[c], "-v")) { verbose = 1; } else if (!strcmp(argv[c], "--")) { if (c < argc - 1) in_file = argv[++c]; break; } else if (argv[c][0] == '-') { fprintf(stderr, "Error! Unknown option '%s'\n", argv[c]); HelpLong(); return -1; } else { in_file = argv[c]; } }
/*! * getImagelibVersions() * * Return: string of version numbers; e.g., * libgif 5.0.3 * libjpeg 8b * libpng 1.4.3 * libtiff 3.9.5 * zlib 1.2.5 * libwebp 0.3.0 * libopenjp2 2.1.0 * * Notes: * (1) The caller has responsibility to free the memory. */ char * getImagelibVersions() { char buf[128]; l_int32 first = TRUE; #if HAVE_LIBJPEG struct jpeg_compress_struct cinfo; struct jpeg_error_mgr err; char buffer[JMSG_LENGTH_MAX]; #endif char *tempStrP; char *versionNumP; char *nextTokenP; char *versionStrP = stringNew(""); #if HAVE_LIBGIF first = FALSE; stringJoinInPlace(versionStrP, "libgif "); #ifdef GIFLIB_MAJOR snprintf(buf, sizeof(buf), "%d.%d.%d", GIFLIB_MAJOR, GIFLIB_MINOR, GIFLIB_RELEASE); #else stringCopy(buf, "4.1.6(?)", sizeof(buf)); #endif stringJoinInPlace(versionStrP, buf); #endif #if HAVE_LIBJPEG cinfo.err = jpeg_std_error(&err); err.msg_code = JMSG_VERSION; (*err.format_message) ((j_common_ptr ) &cinfo, buffer); if (!first) stringJoinInPlace(versionStrP, " : "); first = FALSE; stringJoinInPlace(versionStrP, "libjpeg "); versionNumP = strtokSafe(buffer, " ", &nextTokenP); stringJoinInPlace(versionStrP, versionNumP); FREE(versionNumP); #endif #if HAVE_LIBPNG if (!first) stringJoinInPlace(versionStrP, " : "); first = FALSE; stringJoinInPlace(versionStrP, "libpng "); stringJoinInPlace(versionStrP, png_get_libpng_ver(NULL)); #endif #if HAVE_LIBTIFF if (!first) stringJoinInPlace(versionStrP, " : "); first = FALSE; stringJoinInPlace(versionStrP, "libtiff "); versionNumP = strtokSafe((char *)TIFFGetVersion(), " \n", &nextTokenP); FREE(versionNumP); versionNumP = strtokSafe(NULL, " \n", &nextTokenP); FREE(versionNumP); versionNumP = strtokSafe(NULL, " \n", &nextTokenP); stringJoinInPlace(versionStrP, versionNumP); FREE(versionNumP); #endif #if HAVE_LIBZ if (!first) stringJoinInPlace(versionStrP, " : "); first = FALSE; stringJoinInPlace(versionStrP, "zlib "); stringJoinInPlace(versionStrP, zlibVersion()); #endif #if HAVE_LIBWEBP { l_int32 val; char buf[32]; if (!first) stringJoinInPlace(versionStrP, " : "); first = FALSE; stringJoinInPlace(versionStrP, "libwebp "); val = WebPGetEncoderVersion(); snprintf(buf, sizeof(buf), "%d.%d.%d", val >> 16, (val >> 8) & 0xff, val & 0xff); stringJoinInPlace(versionStrP, buf); } #endif #if HAVE_LIBJP2K { const char *version; if (!first) stringJoinInPlace(versionStrP, " : "); first = FALSE; stringJoinInPlace(versionStrP, "libopenjp2 "); version = opj_version(); stringJoinInPlace(versionStrP, version); } #endif stringJoinInPlace(versionStrP, "\n"); return versionStrP; }
int main(int argc, const char *argv[]) { int verbose = 0; int gif_error = GIF_ERROR; WebPMuxError err = WEBP_MUX_OK; int ok = 0; const char *in_file = NULL, *out_file = NULL; FILE* out = NULL; GifFileType* gif = NULL; int frame_duration = 0; int frame_timestamp = 0; GIFDisposeMethod orig_dispose = GIF_DISPOSE_NONE; WebPPicture frame; // Frame rectangle only (not disposed). WebPPicture curr_canvas; // Not disposed. WebPPicture prev_canvas; // Disposed. WebPPicture prev_to_prev_canvas; // Disposed. WebPAnimEncoder* enc = NULL; WebPAnimEncoderOptions enc_options; WebPConfig config; int is_first_frame = 1; // Whether we are processing the first frame. int done; int c; int quiet = 0; WebPData webp_data; int keep_metadata = METADATA_XMP; // ICC not output by default. WebPData icc_data; int stored_icc = 0; // Whether we have already stored an ICC profile. WebPData xmp_data; int stored_xmp = 0; // Whether we have already stored an XMP profile. int loop_count = 0; int stored_loop_count = 0; // Whether we have found an explicit loop count. WebPMux* mux = NULL; int default_kmin = 1; // Whether to use default kmin value. int default_kmax = 1; if (!WebPConfigInit(&config) || !WebPAnimEncoderOptionsInit(&enc_options) || !WebPPictureInit(&frame) || !WebPPictureInit(&curr_canvas) || !WebPPictureInit(&prev_canvas) || !WebPPictureInit(&prev_to_prev_canvas)) { fprintf(stderr, "Error! Version mismatch!\n"); return -1; } config.lossless = 1; // Use lossless compression by default. WebPDataInit(&webp_data); WebPDataInit(&icc_data); WebPDataInit(&xmp_data); if (argc == 1) { Help(); return 0; } for (c = 1; c < argc; ++c) { int parse_error = 0; if (!strcmp(argv[c], "-h") || !strcmp(argv[c], "-help")) { Help(); return 0; } else if (!strcmp(argv[c], "-o") && c < argc - 1) { out_file = argv[++c]; } else if (!strcmp(argv[c], "-lossy")) { config.lossless = 0; } else if (!strcmp(argv[c], "-mixed")) { enc_options.allow_mixed = 1; config.lossless = 0; } else if (!strcmp(argv[c], "-q") && c < argc - 1) { config.quality = ExUtilGetFloat(argv[++c], &parse_error); } else if (!strcmp(argv[c], "-m") && c < argc - 1) { config.method = ExUtilGetInt(argv[++c], 0, &parse_error); } else if (!strcmp(argv[c], "-min_size")) { enc_options.minimize_size = 1; } else if (!strcmp(argv[c], "-kmax") && c < argc - 1) { enc_options.kmax = ExUtilGetInt(argv[++c], 0, &parse_error); default_kmax = 0; } else if (!strcmp(argv[c], "-kmin") && c < argc - 1) { enc_options.kmin = ExUtilGetInt(argv[++c], 0, &parse_error); default_kmin = 0; } else if (!strcmp(argv[c], "-f") && c < argc - 1) { config.filter_strength = ExUtilGetInt(argv[++c], 0, &parse_error); } else if (!strcmp(argv[c], "-metadata") && c < argc - 1) { static const struct { const char* option; int flag; } kTokens[] = { { "all", METADATA_ALL }, { "none", 0 }, { "icc", METADATA_ICC }, { "xmp", METADATA_XMP }, }; const size_t kNumTokens = sizeof(kTokens) / sizeof(*kTokens); const char* start = argv[++c]; const char* const end = start + strlen(start); keep_metadata = 0; while (start < end) { size_t i; const char* token = strchr(start, ','); if (token == NULL) token = end; for (i = 0; i < kNumTokens; ++i) { if ((size_t)(token - start) == strlen(kTokens[i].option) && !strncmp(start, kTokens[i].option, strlen(kTokens[i].option))) { if (kTokens[i].flag != 0) { keep_metadata |= kTokens[i].flag; } else { keep_metadata = 0; } break; } } if (i == kNumTokens) { fprintf(stderr, "Error! Unknown metadata type '%.*s'\n", (int)(token - start), start); Help(); return -1; } start = token + 1; } } else if (!strcmp(argv[c], "-mt")) { ++config.thread_level; } else if (!strcmp(argv[c], "-version")) { const int enc_version = WebPGetEncoderVersion(); const int mux_version = WebPGetMuxVersion(); printf("WebP Encoder version: %d.%d.%d\nWebP Mux version: %d.%d.%d\n", (enc_version >> 16) & 0xff, (enc_version >> 8) & 0xff, enc_version & 0xff, (mux_version >> 16) & 0xff, (mux_version >> 8) & 0xff, mux_version & 0xff); return 0; } else if (!strcmp(argv[c], "-quiet")) { quiet = 1; } else if (!strcmp(argv[c], "-v")) { verbose = 1; enc_options.verbose = 1; } else if (!strcmp(argv[c], "--")) { if (c < argc - 1) in_file = argv[++c]; break; } else if (argv[c][0] == '-') { fprintf(stderr, "Error! Unknown option '%s'\n", argv[c]); Help(); return -1; } else { in_file = argv[c]; } if (parse_error) { Help(); return -1; } }
int main(int argc, const char *argv[]) { int verbose = 0; int gif_error = GIF_ERROR; WebPMuxError err = WEBP_MUX_OK; int ok = 0; const char *in_file = NULL, *out_file = NULL; FILE* out = NULL; GifFileType* gif = NULL; WebPPicture picture; WebPPicture view; WebPMemoryWriter memory; WebPMuxFrameInfo frame; WebPMuxAnimParams anim = { WHITE_COLOR, 0 }; int is_first_frame = 1; int done; int c; int quiet = 0; WebPConfig config; WebPMux* mux = NULL; WebPData webp_data = { NULL, 0 }; int stored_icc = 0; // Whether we have already stored an ICC profile. int stored_xmp = 0; memset(&frame, 0, sizeof(frame)); frame.id = WEBP_CHUNK_ANMF; frame.dispose_method = WEBP_MUX_DISPOSE_BACKGROUND; if (!WebPConfigInit(&config) || !WebPPictureInit(&picture)) { fprintf(stderr, "Error! Version mismatch!\n"); return -1; } config.lossless = 1; // Use lossless compression by default. if (argc == 1) { Help(); return 0; } for (c = 1; c < argc; ++c) { if (!strcmp(argv[c], "-h") || !strcmp(argv[c], "-help")) { Help(); return 0; } else if (!strcmp(argv[c], "-o") && c < argc - 1) { out_file = argv[++c]; } else if (!strcmp(argv[c], "-lossy")) { config.lossless = 0; } else if (!strcmp(argv[c], "-q") && c < argc - 1) { config.quality = (float)strtod(argv[++c], NULL); } else if (!strcmp(argv[c], "-m") && c < argc - 1) { config.method = strtol(argv[++c], NULL, 0); } else if (!strcmp(argv[c], "-f") && c < argc - 1) { config.filter_strength = strtol(argv[++c], NULL, 0); } else if (!strcmp(argv[c], "-version")) { const int enc_version = WebPGetEncoderVersion(); const int mux_version = WebPGetMuxVersion(); printf("WebP Encoder version: %d.%d.%d\nWebP Mux version: %d.%d.%d\n", (enc_version >> 16) & 0xff, (enc_version >> 8) & 0xff, enc_version & 0xff, (mux_version >> 16) & 0xff, (mux_version >> 8) & 0xff, mux_version & 0xff); return 0; } else if (!strcmp(argv[c], "-quiet")) { quiet = 1; } else if (!strcmp(argv[c], "-v")) { verbose = 1; } else if (argv[c][0] == '-') { fprintf(stderr, "Error! Unknown option '%s'\n", argv[c]); Help(); return -1; } else { in_file = argv[c]; } }
void encoder_version(char *version) { int v = WebPGetEncoderVersion(); sprintf(version, "%d.%d.%d", (v >> 16) & 0xff, (v >> 8) & 0xff, v & 0xff); }
/*! * getImagelibVersions() * * Return: string of version numbers; e.g., * libgif 5.0.3 * libjpeg 8b (libjpeg-turbo 1.3.0) * libpng 1.4.3 * libtiff 3.9.5 * zlib 1.2.5 * libwebp 0.3.0 * libopenjp2 2.1.0 * * Notes: * (1) The caller must free the memory. */ char * getImagelibVersions() { char buf[128]; l_int32 first = TRUE; char *versionNumP; char *nextTokenP; char *versionStrP = NULL; #if HAVE_LIBGIF first = FALSE; stringJoinIP(&versionStrP, "libgif "); #ifdef GIFLIB_MAJOR snprintf(buf, sizeof(buf), "%d.%d.%d", GIFLIB_MAJOR, GIFLIB_MINOR, GIFLIB_RELEASE); #else stringCopy(buf, "4.1.6(?)", sizeof(buf)); #endif stringJoinIP(&versionStrP, buf); #endif /* HAVE_LIBGIF */ #if HAVE_LIBJPEG { struct jpeg_compress_struct cinfo; struct jpeg_error_mgr err; char buffer[JMSG_LENGTH_MAX]; cinfo.err = jpeg_std_error(&err); err.msg_code = JMSG_VERSION; (*err.format_message) ((j_common_ptr ) &cinfo, buffer); if (!first) stringJoinIP(&versionStrP, " : "); first = FALSE; stringJoinIP(&versionStrP, "libjpeg "); versionNumP = strtokSafe(buffer, " ", &nextTokenP); stringJoinIP(&versionStrP, versionNumP); FREE(versionNumP); #if defined(LIBJPEG_TURBO_VERSION) /* To stringify the result of expansion of a macro argument, * you must use two levels of macros. See: * https://gcc.gnu.org/onlinedocs/cpp/Stringification.html */ #define l_xstr(s) l_str(s) #define l_str(s) #s snprintf(buf, sizeof(buf), " (libjpeg-turbo %s)", l_xstr(LIBJPEG_TURBO_VERSION)); stringJoinIP(&versionStrP, buf); #endif /* LIBJPEG_TURBO_VERSION */ } #endif /* HAVE_LIBJPEG */ #if HAVE_LIBPNG if (!first) stringJoinIP(&versionStrP, " : "); first = FALSE; stringJoinIP(&versionStrP, "libpng "); stringJoinIP(&versionStrP, png_get_libpng_ver(NULL)); #endif /* HAVE_LIBPNG */ #if HAVE_LIBTIFF if (!first) stringJoinIP(&versionStrP, " : "); first = FALSE; stringJoinIP(&versionStrP, "libtiff "); versionNumP = strtokSafe((char *)TIFFGetVersion(), " \n", &nextTokenP); FREE(versionNumP); versionNumP = strtokSafe(NULL, " \n", &nextTokenP); FREE(versionNumP); versionNumP = strtokSafe(NULL, " \n", &nextTokenP); stringJoinIP(&versionStrP, versionNumP); FREE(versionNumP); #endif /* HAVE_LIBTIFF */ #if HAVE_LIBZ if (!first) stringJoinIP(&versionStrP, " : "); first = FALSE; stringJoinIP(&versionStrP, "zlib "); stringJoinIP(&versionStrP, zlibVersion()); #endif /* HAVE_LIBZ */ #if HAVE_LIBWEBP { l_int32 val; char buf[32]; if (!first) stringJoinIP(&versionStrP, " : "); first = FALSE; stringJoinIP(&versionStrP, "libwebp "); val = WebPGetEncoderVersion(); snprintf(buf, sizeof(buf), "%d.%d.%d", val >> 16, (val >> 8) & 0xff, val & 0xff); stringJoinIP(&versionStrP, buf); } #endif /* HAVE_LIBWEBP */ #if HAVE_LIBJP2K { const char *version; if (!first) stringJoinIP(&versionStrP, " : "); first = FALSE; stringJoinIP(&versionStrP, "libopenjp2 "); version = opj_version(); stringJoinIP(&versionStrP, version); } #endif /* HAVE_LIBJP2K */ stringJoinIP(&versionStrP, "\n"); return versionStrP; }
int main(int argc, const char *argv[]) { int verbose = 0; int gif_error = GIF_ERROR; WebPMuxError err = WEBP_MUX_OK; int ok = 0; const char *in_file = NULL, *out_file = NULL; FILE* out = NULL; GifFileType* gif = NULL; WebPConfig config; WebPPicture frame; WebPMuxFrameInfo info; WebPMuxAnimParams anim = { WHITE_COLOR, 0 }; WebPFrameCache* cache = NULL; int is_first_frame = 1; // Whether we are processing the first frame. int done; int c; int quiet = 0; WebPMux* mux = NULL; WebPData webp_data = { NULL, 0 }; int keep_metadata = METADATA_XMP; // ICC not output by default. int stored_icc = 0; // Whether we have already stored an ICC profile. int stored_xmp = 0; int default_kmin = 1; // Whether to use default kmin value. int default_kmax = 1; size_t kmin = 0; size_t kmax = 0; int allow_mixed = 0; // If true, each frame can be lossy or lossless. ResetFrameInfo(&info); if (!WebPConfigInit(&config) || !WebPPictureInit(&frame)) { fprintf(stderr, "Error! Version mismatch!\n"); return -1; } config.lossless = 1; // Use lossless compression by default. config.image_hint = WEBP_HINT_GRAPH; // always low-color if (argc == 1) { Help(); return 0; } for (c = 1; c < argc; ++c) { int parse_error = 0; if (!strcmp(argv[c], "-h") || !strcmp(argv[c], "-help")) { Help(); return 0; } else if (!strcmp(argv[c], "-o") && c < argc - 1) { out_file = argv[++c]; } else if (!strcmp(argv[c], "-lossy")) { config.lossless = 0; } else if (!strcmp(argv[c], "-mixed")) { allow_mixed = 1; config.lossless = 0; } else if (!strcmp(argv[c], "-q") && c < argc - 1) { config.quality = ExUtilGetFloat(argv[++c], &parse_error); } else if (!strcmp(argv[c], "-m") && c < argc - 1) { config.method = ExUtilGetInt(argv[++c], 0, &parse_error); } else if (!strcmp(argv[c], "-kmax") && c < argc - 1) { kmax = ExUtilGetUInt(argv[++c], 0, &parse_error); default_kmax = 0; } else if (!strcmp(argv[c], "-kmin") && c < argc - 1) { kmin = ExUtilGetUInt(argv[++c], 0, &parse_error); default_kmin = 0; } else if (!strcmp(argv[c], "-f") && c < argc - 1) { config.filter_strength = ExUtilGetInt(argv[++c], 0, &parse_error); } else if (!strcmp(argv[c], "-metadata") && c < argc - 1) { static const struct { const char* option; int flag; } kTokens[] = { { "all", METADATA_ALL }, { "none", 0 }, { "icc", METADATA_ICC }, { "xmp", METADATA_XMP }, }; const size_t kNumTokens = sizeof(kTokens) / sizeof(*kTokens); const char* start = argv[++c]; const char* const end = start + strlen(start); keep_metadata = 0; while (start < end) { size_t i; const char* token = strchr(start, ','); if (token == NULL) token = end; for (i = 0; i < kNumTokens; ++i) { if ((size_t)(token - start) == strlen(kTokens[i].option) && !strncmp(start, kTokens[i].option, strlen(kTokens[i].option))) { if (kTokens[i].flag != 0) { keep_metadata |= kTokens[i].flag; } else { keep_metadata = 0; } break; } } if (i == kNumTokens) { fprintf(stderr, "Error! Unknown metadata type '%.*s'\n", (int)(token - start), start); Help(); return -1; } start = token + 1; } } else if (!strcmp(argv[c], "-mt")) { ++config.thread_level; } else if (!strcmp(argv[c], "-version")) { const int enc_version = WebPGetEncoderVersion(); const int mux_version = WebPGetMuxVersion(); printf("WebP Encoder version: %d.%d.%d\nWebP Mux version: %d.%d.%d\n", (enc_version >> 16) & 0xff, (enc_version >> 8) & 0xff, enc_version & 0xff, (mux_version >> 16) & 0xff, (mux_version >> 8) & 0xff, mux_version & 0xff); return 0; } else if (!strcmp(argv[c], "-quiet")) { quiet = 1; } else if (!strcmp(argv[c], "-v")) { verbose = 1; } else if (!strcmp(argv[c], "--")) { if (c < argc - 1) in_file = argv[++c]; break; } else if (argv[c][0] == '-') { fprintf(stderr, "Error! Unknown option '%s'\n", argv[c]); Help(); return -1; } else { in_file = argv[c]; } if (parse_error) { Help(); return -1; } }
int main(int argc, const char *argv[]) { const char *in_file = NULL, *out_file = NULL, *dump_file = NULL; FILE *out = NULL; int c; int short_output = 0; int quiet = 0; int keep_alpha = 0; int crop = 0, crop_x = 0, crop_y = 0, crop_w = 0, crop_h = 0; int resize_w = 0, resize_h = 0; WebPPicture picture; WebPConfig config; WebPAuxStats stats; Stopwatch stop_watch; #ifdef WEBP_EXPERIMENTAL_FEATURES keep_alpha = 1; #endif if (!WebPPictureInit(&picture) || !WebPConfigInit(&config)) { fprintf(stderr, "Error! Version mismatch!\n"); goto Error; } if (argc == 1) { HelpShort(); return 0; } for (c = 1; c < argc; ++c) { if (!strcmp(argv[c], "-h") || !strcmp(argv[c], "-help")) { HelpShort(); return 0; } else if (!strcmp(argv[c], "-H") || !strcmp(argv[c], "-longhelp")) { HelpLong(); return 0; } else if (!strcmp(argv[c], "-o") && c < argc - 1) { out_file = argv[++c]; } else if (!strcmp(argv[c], "-d") && c < argc - 1) { dump_file = argv[++c]; config.show_compressed = 1; } else if (!strcmp(argv[c], "-short")) { short_output++; } else if (!strcmp(argv[c], "-s") && c < argc - 2) { picture.width = strtol(argv[++c], NULL, 0); picture.height = strtol(argv[++c], NULL, 0); } else if (!strcmp(argv[c], "-m") && c < argc - 1) { config.method = strtol(argv[++c], NULL, 0); } else if (!strcmp(argv[c], "-q") && c < argc - 1) { config.quality = (float)strtod(argv[++c], NULL); } else if (!strcmp(argv[c], "-size") && c < argc - 1) { config.target_size = strtol(argv[++c], NULL, 0); } else if (!strcmp(argv[c], "-psnr") && c < argc - 1) { config.target_PSNR = (float)strtod(argv[++c], NULL); } else if (!strcmp(argv[c], "-sns") && c < argc - 1) { config.sns_strength = strtol(argv[++c], NULL, 0); } else if (!strcmp(argv[c], "-f") && c < argc - 1) { config.filter_strength = strtol(argv[++c], NULL, 0); } else if (!strcmp(argv[c], "-af")) { config.autofilter = 1; } else if (!strcmp(argv[c], "-strong")) { config.filter_type = 1; } else if (!strcmp(argv[c], "-sharpness") && c < argc - 1) { config.filter_sharpness = strtol(argv[++c], NULL, 0); } else if (!strcmp(argv[c], "-pass") && c < argc - 1) { config.pass = strtol(argv[++c], NULL, 0); } else if (!strcmp(argv[c], "-pre") && c < argc - 1) { config.preprocessing = strtol(argv[++c], NULL, 0); } else if (!strcmp(argv[c], "-segments") && c < argc - 1) { config.segments = strtol(argv[++c], NULL, 0); } else if (!strcmp(argv[c], "-partition_limit") && c < argc - 1) { config.partition_limit = strtol(argv[++c], NULL, 0); #ifdef WEBP_EXPERIMENTAL_FEATURES } else if (!strcmp(argv[c], "-alpha_comp") && c < argc - 1) { config.alpha_compression = strtol(argv[++c], NULL, 0); } else if (!strcmp(argv[c], "-noalpha")) { keep_alpha = 0; #endif } else if (!strcmp(argv[c], "-map") && c < argc - 1) { picture.extra_info_type = strtol(argv[++c], NULL, 0); #ifdef WEBP_EXPERIMENTAL_FEATURES } else if (!strcmp(argv[c], "-444")) { picture.colorspace = WEBP_YUV444; } else if (!strcmp(argv[c], "-422")) { picture.colorspace = WEBP_YUV422; } else if (!strcmp(argv[c], "-gray")) { picture.colorspace = WEBP_YUV400; #endif } else if (!strcmp(argv[c], "-crop") && c < argc - 4) { crop = 1; crop_x = strtol(argv[++c], NULL, 0); crop_y = strtol(argv[++c], NULL, 0); crop_w = strtol(argv[++c], NULL, 0); crop_h = strtol(argv[++c], NULL, 0); } else if (!strcmp(argv[c], "-resize") && c < argc - 2) { resize_w = strtol(argv[++c], NULL, 0); resize_h = strtol(argv[++c], NULL, 0); #ifndef WEBP_DLL } else if (!strcmp(argv[c], "-noasm")) { VP8GetCPUInfo = NULL; #endif } else if (!strcmp(argv[c], "-version")) { const int version = WebPGetEncoderVersion(); printf("%d.%d.%d\n", (version >> 16) & 0xff, (version >> 8) & 0xff, version & 0xff); return 0; } else if (!strcmp(argv[c], "-quiet")) { quiet = 1; } else if (!strcmp(argv[c], "-preset") && c < argc - 1) { WebPPreset preset; ++c; if (!strcmp(argv[c], "default")) { preset = WEBP_PRESET_DEFAULT; } else if (!strcmp(argv[c], "photo")) { preset = WEBP_PRESET_PHOTO; } else if (!strcmp(argv[c], "picture")) { preset = WEBP_PRESET_PICTURE; } else if (!strcmp(argv[c], "drawing")) { preset = WEBP_PRESET_DRAWING; } else if (!strcmp(argv[c], "icon")) { preset = WEBP_PRESET_ICON; } else if (!strcmp(argv[c], "text")) { preset = WEBP_PRESET_TEXT; } else { fprintf(stderr, "Error! Unrecognized preset: %s\n", argv[c]); goto Error; } if (!WebPConfigPreset(&config, preset, config.quality)) { fprintf(stderr, "Error! Could initialize configuration with preset.\n"); goto Error; } } else if (!strcmp(argv[c], "-v")) { verbose = 1; } else if (argv[c][0] == '-') { fprintf(stderr, "Error! Unknown option '%s'\n", argv[c]); HelpLong(); return -1; } else { in_file = argv[c]; } }