config.c revision 466727975bcc57c0c5597bcd0747a2fe4777b303
17c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// Copyright 2011 Google Inc. 27c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// 37c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// This code is licensed under the same terms as WebM: 47c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// Software License Agreement: http://www.webmproject.org/license/software/ 57c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// Additional IP Rights Grant: http://www.webmproject.org/license/additional/ 67c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// ----------------------------------------------------------------------------- 77c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// 87c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// Coding tools configuration 97c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// 107c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// Author: Skal (pascal.massimino@gmail.com) 117c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora 127c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#include <assert.h> 137c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#include "webp/encode.h" 147c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora 157c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#if defined(__cplusplus) || defined(c_plusplus) 167c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroraextern "C" { 177c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#endif 187c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora 197c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//----------------------------------------------------------------------------- 207c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// WebPConfig 217c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//----------------------------------------------------------------------------- 227c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora 237c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroraint WebPConfigInitInternal(WebPConfig* const config, 247c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora WebPPreset preset, float quality, int version) { 257c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora if (version != WEBP_ENCODER_ABI_VERSION) { 267c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora return 0; // caller/system version mismatch! 277c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora } 287c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora if (config == NULL) return 0; 297c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora 307c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->quality = quality; 317c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->target_size = 0; 327c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->target_PSNR = 0.; 337c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->method = 4; 347c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->sns_strength = 50; 357c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->filter_strength = 20; // default: light filtering 367c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->filter_sharpness = 0; 377c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->filter_type = 0; // default: simple 387c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->partitions = 0; 397c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->segments = 4; 407c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->pass = 1; 417c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->show_compressed = 0; 427c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->preprocessing = 0; 437c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->autofilter = 0; 44466727975bcc57c0c5597bcd0747a2fe4777b303Vikas Arora config->alpha_compression = 0; 457c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora 467c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora // TODO(skal): tune. 477c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora switch (preset) { 487c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora case WEBP_PRESET_PICTURE: 497c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->sns_strength = 80; 507c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->filter_sharpness = 4; 517c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->filter_strength = 35; 527c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora break; 537c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora case WEBP_PRESET_PHOTO: 547c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->sns_strength = 80; 557c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->filter_sharpness = 3; 567c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->filter_strength = 30; 577c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora break; 587c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora case WEBP_PRESET_DRAWING: 597c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->sns_strength = 25; 607c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->filter_sharpness = 6; 617c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->filter_strength = 10; 627c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora break; 637c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora case WEBP_PRESET_ICON: 647c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->sns_strength = 0; 657c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->filter_strength = 0; // disable filtering to retain sharpness 667c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora break; 677c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora case WEBP_PRESET_TEXT: 687c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->sns_strength = 0; 697c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->filter_strength = 0; // disable filtering to retain sharpness 707c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->segments = 2; 717c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora break; 727c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora case WEBP_PRESET_DEFAULT: 737c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora default: 747c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora break; 757c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora } 767c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora return WebPValidateConfig(config); 777c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora} 787c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora 797c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroraint WebPValidateConfig(const WebPConfig* const config) { 807c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora if (config == NULL) return 0; 817c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora if (config->quality < 0 || config->quality > 100) 827c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora return 0; 837c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora if (config->target_size < 0) 847c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora return 0; 857c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora if (config->target_PSNR < 0) 867c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora return 0; 877c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora if (config->method < 0 || config->method > 6) 887c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora return 0; 897c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora if (config->segments < 1 || config->segments > 4) 907c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora return 0; 917c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora if (config->sns_strength < 0 || config->sns_strength > 100) 927c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora return 0; 937c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora if (config->filter_strength < 0 || config->filter_strength > 100) 947c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora return 0; 957c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora if (config->filter_sharpness < 0 || config->filter_sharpness > 7) 967c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora return 0; 977c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora if (config->filter_type < 0 || config->filter_type > 1) 987c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora return 0; 997c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora if (config->autofilter < 0 || config->autofilter > 1) 1007c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora return 0; 1017c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora if (config->pass < 1 || config->pass > 10) 1027c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora return 0; 1037c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora if (config->show_compressed < 0 || config->show_compressed > 1) 1047c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora return 0; 1057c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora if (config->preprocessing < 0 || config->preprocessing > 1) 1067c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora return 0; 1077c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora if (config->partitions < 0 || config->partitions > 3) 1087c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora return 0; 109466727975bcc57c0c5597bcd0747a2fe4777b303Vikas Arora if (config->alpha_compression < 0) 110466727975bcc57c0c5597bcd0747a2fe4777b303Vikas Arora return 0; 1117c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora return 1; 1127c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora} 1137c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora 1147c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//----------------------------------------------------------------------------- 1157c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora 1167c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#if defined(__cplusplus) || defined(c_plusplus) 1177c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora} // extern "C" 1187c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#endif 119