1a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Copyright 2011 Google Inc. All Rights Reserved. 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 "webp/encode.h" 137c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora 147c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#if defined(__cplusplus) || defined(c_plusplus) 157c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroraextern "C" { 167c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#endif 177c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora 18a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora//------------------------------------------------------------------------------ 197c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// WebPConfig 20a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora//------------------------------------------------------------------------------ 217c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora 22a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraint WebPConfigInitInternal(WebPConfig* config, 237c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora WebPPreset preset, float quality, int version) { 24a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora if (WEBP_ABI_IS_INCOMPATIBLE(version, WEBP_ENCODER_ABI_VERSION)) { 257c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora return 0; // caller/system version mismatch! 267c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora } 277c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora if (config == NULL) return 0; 287c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora 297c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->quality = quality; 307c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->target_size = 0; 317c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->target_PSNR = 0.; 327c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->method = 4; 337c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->sns_strength = 50; 341e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora config->filter_strength = 60; // rather high filtering, helps w/ gradients. 357c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->filter_sharpness = 0; 361e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora config->filter_type = 1; // default: strong (so U/V is filtered too) 377c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->partitions = 0; 387c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->segments = 4; 397c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->pass = 1; 407c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->show_compressed = 0; 417c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->preprocessing = 0; 427c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->autofilter = 0; 43a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora config->partition_limit = 0; 44a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora config->alpha_compression = 1; 45a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora config->alpha_filtering = 1; 46a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora config->alpha_quality = 100; 47a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora config->lossless = 0; 48a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora config->image_hint = WEBP_HINT_DEFAULT; 491e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora config->emulate_jpeg_size = 0; 501e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora config->thread_level = 0; 511e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora config->low_memory = 0; 527c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora 537c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora // TODO(skal): tune. 547c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora switch (preset) { 557c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora case WEBP_PRESET_PICTURE: 567c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->sns_strength = 80; 577c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->filter_sharpness = 4; 587c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->filter_strength = 35; 597c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora break; 607c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora case WEBP_PRESET_PHOTO: 617c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->sns_strength = 80; 627c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->filter_sharpness = 3; 637c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->filter_strength = 30; 647c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora break; 657c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora case WEBP_PRESET_DRAWING: 667c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->sns_strength = 25; 677c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->filter_sharpness = 6; 687c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->filter_strength = 10; 697c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora break; 707c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora case WEBP_PRESET_ICON: 717c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->sns_strength = 0; 727c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->filter_strength = 0; // disable filtering to retain sharpness 737c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora break; 747c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora case WEBP_PRESET_TEXT: 757c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->sns_strength = 0; 767c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->filter_strength = 0; // disable filtering to retain sharpness 777c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora config->segments = 2; 787c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora break; 797c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora case WEBP_PRESET_DEFAULT: 807c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora default: 817c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora break; 827c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora } 837c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora return WebPValidateConfig(config); 847c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora} 857c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora 86a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraint WebPValidateConfig(const WebPConfig* config) { 877c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora if (config == NULL) return 0; 887c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora if (config->quality < 0 || config->quality > 100) 897c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora return 0; 907c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora if (config->target_size < 0) 917c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora return 0; 927c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora if (config->target_PSNR < 0) 937c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora return 0; 947c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora if (config->method < 0 || config->method > 6) 957c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora return 0; 967c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora if (config->segments < 1 || config->segments > 4) 977c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora return 0; 987c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora if (config->sns_strength < 0 || config->sns_strength > 100) 997c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora return 0; 1007c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora if (config->filter_strength < 0 || config->filter_strength > 100) 1017c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora return 0; 1027c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora if (config->filter_sharpness < 0 || config->filter_sharpness > 7) 1037c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora return 0; 1047c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora if (config->filter_type < 0 || config->filter_type > 1) 1057c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora return 0; 1067c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora if (config->autofilter < 0 || config->autofilter > 1) 1077c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora return 0; 1087c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora if (config->pass < 1 || config->pass > 10) 1097c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora return 0; 1107c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora if (config->show_compressed < 0 || config->show_compressed > 1) 1117c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora return 0; 1127c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora if (config->preprocessing < 0 || config->preprocessing > 1) 1137c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora return 0; 1147c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora if (config->partitions < 0 || config->partitions > 3) 1157c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora return 0; 116a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora if (config->partition_limit < 0 || config->partition_limit > 100) 117a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora return 0; 118466727975bcc57c0c5597bcd0747a2fe4777b303Vikas Arora if (config->alpha_compression < 0) 119466727975bcc57c0c5597bcd0747a2fe4777b303Vikas Arora return 0; 120a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora if (config->alpha_filtering < 0) 121a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora return 0; 122a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora if (config->alpha_quality < 0 || config->alpha_quality > 100) 123a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora return 0; 124a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora if (config->lossless < 0 || config->lossless > 1) 125a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora return 0; 126a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora if (config->image_hint >= WEBP_HINT_LAST) 127a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora return 0; 1281e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora if (config->emulate_jpeg_size < 0 || config->emulate_jpeg_size > 1) 1291e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora return 0; 1301e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora if (config->thread_level < 0 || config->thread_level > 1) 1311e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora return 0; 1321e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora if (config->low_memory < 0 || config->low_memory > 1) 1331e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora return 0; 1347c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora return 1; 1357c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora} 1367c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora 137a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora//------------------------------------------------------------------------------ 1387c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora 1397c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#if defined(__cplusplus) || defined(c_plusplus) 1407c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora} // extern "C" 1417c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#endif 142