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