1// Copyright 2011 Google Inc.
2//
3// This code is licensed under the same terms as WebM:
4//  Software License Agreement:  http://www.webmproject.org/license/software/
5//  Additional IP Rights Grant:  http://www.webmproject.org/license/additional/
6// -----------------------------------------------------------------------------
7//
8// Coding tools configuration
9//
10// Author: Skal (pascal.massimino@gmail.com)
11
12#include <assert.h>
13#include "webp/encode.h"
14
15//-----------------------------------------------------------------------------
16// WebPConfig
17//-----------------------------------------------------------------------------
18
19int WebPConfigInitInternal(WebPConfig* const config,
20                           WebPPreset preset, float quality, int version) {
21  if (version != WEBP_ENCODER_ABI_VERSION) {
22    return 0;   // caller/system version mismatch!
23  }
24  if (config == NULL) return 0;
25
26  config->quality = quality;
27  config->target_size = 0;
28  config->target_PSNR = 0.;
29  config->method = 4;
30  config->sns_strength = 50;
31  config->filter_strength = 20;   // default: light filtering
32  config->filter_sharpness = 0;
33  config->filter_type = 0;        // default: simple
34  config->partitions = 0;
35  config->segments = 4;
36  config->pass = 1;
37  config->show_compressed = 0;
38  config->preprocessing = 0;
39  config->autofilter = 0;
40
41  // TODO(skal): tune.
42  switch (preset) {
43    case WEBP_PRESET_PICTURE:
44      config->sns_strength = 80;
45      config->filter_sharpness = 4;
46      config->filter_strength = 35;
47      break;
48    case WEBP_PRESET_PHOTO:
49      config->sns_strength = 80;
50      config->filter_sharpness = 3;
51      config->filter_strength = 30;
52      break;
53    case WEBP_PRESET_DRAWING:
54      config->sns_strength = 25;
55      config->filter_sharpness = 6;
56      config->filter_strength = 10;
57      break;
58    case WEBP_PRESET_ICON:
59      config->sns_strength = 0;
60      config->filter_strength = 0;   // disable filtering to retain sharpness
61      break;
62    case WEBP_PRESET_TEXT:
63      config->sns_strength = 0;
64      config->filter_strength = 0;   // disable filtering to retain sharpness
65      config->segments = 2;
66      break;
67    case WEBP_PRESET_DEFAULT:
68    default:
69      break;
70  }
71  return WebPValidateConfig(config);
72}
73
74int WebPValidateConfig(const WebPConfig* const config) {
75  if (config == NULL) return 0;
76  if (config->quality < 0 || config->quality > 100)
77    return 0;
78  if (config->target_size < 0)
79    return 0;
80  if (config->target_PSNR < 0)
81    return 0;
82  if (config->method < 0 || config->method > 6)
83    return 0;
84  if (config->segments < 1 || config->segments > 4)
85    return 0;
86  if (config->sns_strength < 0 || config->sns_strength > 100)
87    return 0;
88  if (config->filter_strength < 0 || config->filter_strength > 100)
89    return 0;
90  if (config->filter_sharpness < 0 || config->filter_sharpness > 7)
91    return 0;
92  if (config->filter_type < 0 || config->filter_type > 1)
93    return 0;
94  if (config->autofilter < 0 || config->autofilter > 1)
95    return 0;
96  if (config->pass < 1 || config->pass > 10)
97    return 0;
98  if (config->show_compressed < 0 || config->show_compressed > 1)
99    return 0;
100  if (config->preprocessing < 0 || config->preprocessing > 1)
101    return 0;
102  if (config->partitions < 0 || config->partitions > 3)
103    return 0;
104  return 1;
105}
106
107//-----------------------------------------------------------------------------
108