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