config_enc.c (5696B)
1 // Copyright 2011 Google Inc. All Rights Reserved. 2 // 3 // Use of this source code is governed by a BSD-style license 4 // that can be found in the COPYING file in the root of the source 5 // tree. An additional intellectual property rights grant can be found 6 // in the file PATENTS. All contributing project authors may 7 // be found in the AUTHORS file in the root of the source tree. 8 // ----------------------------------------------------------------------------- 9 // 10 // Coding tools configuration 11 // 12 // Author: Skal (pascal.massimino@gmail.com) 13 14 #ifdef HAVE_CONFIG_H 15 #include "src/webp/config.h" 16 #endif 17 18 #include <stddef.h> 19 20 #include "src/webp/encode.h" 21 #include "src/webp/types.h" 22 23 //------------------------------------------------------------------------------ 24 // WebPConfig 25 //------------------------------------------------------------------------------ 26 27 int WebPConfigInitInternal(WebPConfig* config, 28 WebPPreset preset, float quality, int version) { 29 if (WEBP_ABI_IS_INCOMPATIBLE(version, WEBP_ENCODER_ABI_VERSION)) { 30 return 0; // caller/system version mismatch! 31 } 32 if (config == NULL) return 0; 33 34 config->quality = quality; 35 config->target_size = 0; 36 config->target_PSNR = 0.; 37 config->method = 4; 38 config->sns_strength = 50; 39 config->filter_strength = 60; // mid-filtering 40 config->filter_sharpness = 0; 41 config->filter_type = 1; // default: strong (so U/V is filtered too) 42 config->partitions = 0; 43 config->segments = 4; 44 config->pass = 1; 45 config->qmin = 0; 46 config->qmax = 100; 47 config->show_compressed = 0; 48 config->preprocessing = 0; 49 config->autofilter = 0; 50 config->partition_limit = 0; 51 config->alpha_compression = 1; 52 config->alpha_filtering = 1; 53 config->alpha_quality = 100; 54 config->lossless = 0; 55 config->exact = 0; 56 config->image_hint = WEBP_HINT_DEFAULT; 57 config->emulate_jpeg_size = 0; 58 config->thread_level = 0; 59 config->low_memory = 0; 60 config->near_lossless = 100; 61 config->use_sharp_yuv = 0; 62 63 // TODO(skal): tune. 64 switch (preset) { 65 case WEBP_PRESET_PICTURE: 66 config->sns_strength = 80; 67 config->filter_sharpness = 4; 68 config->filter_strength = 35; 69 config->preprocessing &= ~2; // no dithering 70 break; 71 case WEBP_PRESET_PHOTO: 72 config->sns_strength = 80; 73 config->filter_sharpness = 3; 74 config->filter_strength = 30; 75 config->preprocessing |= 2; 76 break; 77 case WEBP_PRESET_DRAWING: 78 config->sns_strength = 25; 79 config->filter_sharpness = 6; 80 config->filter_strength = 10; 81 break; 82 case WEBP_PRESET_ICON: 83 config->sns_strength = 0; 84 config->filter_strength = 0; // disable filtering to retain sharpness 85 config->preprocessing &= ~2; // no dithering 86 break; 87 case WEBP_PRESET_TEXT: 88 config->sns_strength = 0; 89 config->filter_strength = 0; // disable filtering to retain sharpness 90 config->preprocessing &= ~2; // no dithering 91 config->segments = 2; 92 break; 93 case WEBP_PRESET_DEFAULT: 94 default: 95 break; 96 } 97 return WebPValidateConfig(config); 98 } 99 100 int WebPValidateConfig(const WebPConfig* config) { 101 if (config == NULL) return 0; 102 if (config->quality < 0 || config->quality > 100) return 0; 103 if (config->target_size < 0) return 0; 104 if (config->target_PSNR < 0) return 0; 105 if (config->method < 0 || config->method > 6) return 0; 106 if (config->segments < 1 || config->segments > 4) return 0; 107 if (config->sns_strength < 0 || config->sns_strength > 100) return 0; 108 if (config->filter_strength < 0 || config->filter_strength > 100) return 0; 109 if (config->filter_sharpness < 0 || config->filter_sharpness > 7) return 0; 110 if (config->filter_type < 0 || config->filter_type > 1) return 0; 111 if (config->autofilter < 0 || config->autofilter > 1) return 0; 112 if (config->pass < 1 || config->pass > 10) return 0; 113 if (config->qmin < 0 || config->qmax > 100 || config->qmin > config->qmax) { 114 return 0; 115 } 116 if (config->show_compressed < 0 || config->show_compressed > 1) return 0; 117 if (config->preprocessing < 0 || config->preprocessing > 7) return 0; 118 if (config->partitions < 0 || config->partitions > 3) return 0; 119 if (config->partition_limit < 0 || config->partition_limit > 100) return 0; 120 if (config->alpha_compression < 0) return 0; 121 if (config->alpha_filtering < 0) return 0; 122 if (config->alpha_quality < 0 || config->alpha_quality > 100) return 0; 123 if (config->lossless < 0 || config->lossless > 1) return 0; 124 if (config->near_lossless < 0 || config->near_lossless > 100) return 0; 125 if (config->image_hint >= WEBP_HINT_LAST) return 0; 126 if (config->emulate_jpeg_size < 0 || config->emulate_jpeg_size > 1) return 0; 127 if (config->thread_level < 0 || config->thread_level > 1) return 0; 128 if (config->low_memory < 0 || config->low_memory > 1) return 0; 129 if (config->exact < 0 || config->exact > 1) return 0; 130 if (config->use_sharp_yuv < 0 || config->use_sharp_yuv > 1) return 0; 131 132 return 1; 133 } 134 135 //------------------------------------------------------------------------------ 136 137 #define MAX_LEVEL 9 138 139 // Mapping between -z level and -m / -q parameter settings. 140 static const struct { 141 uint8_t method; 142 uint8_t quality; 143 } kLosslessPresets[MAX_LEVEL + 1] = { 144 { 0, 0 }, { 1, 20 }, { 2, 25 }, { 3, 30 }, { 3, 50 }, 145 { 4, 50 }, { 4, 75 }, { 4, 90 }, { 5, 90 }, { 6, 100 } 146 }; 147 148 int WebPConfigLosslessPreset(WebPConfig* config, int level) { 149 if (config == NULL || level < 0 || level > MAX_LEVEL) return 0; 150 config->lossless = 1; 151 config->method = kLosslessPresets[level].method; 152 config->quality = kLosslessPresets[level].quality; 153 return 1; 154 } 155 156 //------------------------------------------------------------------------------