Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: GDAL WEBP Driver 4 : * Purpose: Implement GDAL WEBP Support based on libwebp 5 : * Author: Even Rouault, <even dot rouault at spatialys.com> 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) 2011-2013, Even Rouault <even dot rouault at spatialys.com> 9 : * 10 : * Permission is hereby granted, free of charge, to any person obtaining a 11 : * copy of this software and associated documentation files (the "Software"), 12 : * to deal in the Software without restriction, including without limitation 13 : * the rights to use, copy, modify, merge, publish, distribute, sublicense, 14 : * and/or sell copies of the Software, and to permit persons to whom the 15 : * Software is furnished to do so, subject to the following conditions: 16 : * 17 : * The above copyright notice and this permission notice shall be included 18 : * in all copies or substantial portions of the Software. 19 : * 20 : * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 21 : * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22 : * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 23 : * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24 : * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 : * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 26 : * DEALINGS IN THE SOFTWARE. 27 : ****************************************************************************/ 28 : 29 : #include "webp_headers.h" 30 : #include "webpdrivercore.h" 31 : 32 : /************************************************************************/ 33 : /* WEBPDriverIdentify() */ 34 : /************************************************************************/ 35 : 36 48425 : int WEBPDriverIdentify(GDALOpenInfo *poOpenInfo) 37 : 38 : { 39 48425 : const int nHeaderBytes = poOpenInfo->nHeaderBytes; 40 48425 : const GByte *pabyHeader = poOpenInfo->pabyHeader; 41 : 42 48425 : if (nHeaderBytes < 20) 43 45352 : return FALSE; 44 : 45 3748 : return memcmp(pabyHeader, "RIFF", 4) == 0 && 46 3748 : memcmp(pabyHeader + 8, "WEBP", 4) == 0 && 47 675 : (memcmp(pabyHeader + 12, "VP8 ", 4) == 0 || 48 562 : memcmp(pabyHeader + 12, "VP8L", 4) == 0 || 49 3596 : memcmp(pabyHeader + 12, "VP8X", 4) == 0); 50 : } 51 : 52 : /************************************************************************/ 53 : /* WEBPDriverSetCommonMetadata() */ 54 : /************************************************************************/ 55 : 56 1223 : void WEBPDriverSetCommonMetadata(GDALDriver *poDriver) 57 : { 58 1223 : poDriver->SetDescription(DRIVER_NAME); 59 1223 : poDriver->SetMetadataItem(GDAL_DCAP_RASTER, "YES"); 60 1223 : poDriver->SetMetadataItem(GDAL_DMD_LONGNAME, "WEBP"); 61 1223 : poDriver->SetMetadataItem(GDAL_DMD_HELPTOPIC, "drivers/raster/webp.html"); 62 1223 : poDriver->SetMetadataItem(GDAL_DMD_EXTENSION, "webp"); 63 1223 : poDriver->SetMetadataItem(GDAL_DMD_MIMETYPE, "image/webp"); 64 1223 : poDriver->SetMetadataItem(GDAL_DMD_CREATIONDATATYPES, "Byte"); 65 : 66 1223 : poDriver->SetMetadataItem( 67 : GDAL_DMD_CREATIONOPTIONLIST, 68 : "<CreationOptionList>\n" 69 : " <Option name='QUALITY' type='float' description='good=100, bad=0' " 70 : "default='75'/>\n" 71 : #if WEBP_ENCODER_ABI_VERSION >= 0x0100 72 : " <Option name='LOSSLESS' type='boolean' description='Whether " 73 : "lossless compression should be used' default='FALSE'/>\n" 74 : #endif 75 : " <Option name='LOSSLESS_COPY' type='string-select' " 76 : "description='Whether conversion should be lossless' default='AUTO'>" 77 : " <Value>AUTO</Value>" 78 : " <Value>YES</Value>" 79 : " <Value>NO</Value>" 80 : " </Option>" 81 : " <Option name='PRESET' type='string-select' description='kind of " 82 : "image' default='DEFAULT'>\n" 83 : " <Value>DEFAULT</Value>\n" 84 : " <Value>PICTURE</Value>\n" 85 : " <Value>PHOTO</Value>\n" 86 : " <Value>DRAWING</Value>\n" 87 : " <Value>ICON</Value>\n" 88 : " <Value>TEXT</Value>\n" 89 : " </Option>\n" 90 : " <Option name='TARGETSIZE' type='int' description='if non-zero, " 91 : "desired target size in bytes. Has precedence over QUALITY'/>\n" 92 : " <Option name='PSNR' type='float' description='if non-zero, minimal " 93 : "distortion to to achieve. Has precedence over TARGETSIZE'/>\n" 94 : " <Option name='METHOD' type='int' description='quality/speed " 95 : "trade-off. fast=0, slower-better=6' default='4'/>\n" 96 : " <Option name='SEGMENTS' type='int' description='maximum number of " 97 : "segments [1-4]' default='4'/>\n" 98 : " <Option name='SNS_STRENGTH' type='int' description='Spatial Noise " 99 : "Shaping. off=0, maximum=100' default='50'/>\n" 100 : " <Option name='FILTER_STRENGTH' type='int' description='Filter " 101 : "strength. off=0, strongest=100' default='20'/>\n" 102 : " <Option name='FILTER_SHARPNESS' type='int' description='Filter " 103 : "sharpness. off=0, least sharp=7' default='0'/>\n" 104 : " <Option name='FILTER_TYPE' type='int' description='Filtering type. " 105 : "simple=0, strong=1' default='0'/>\n" 106 : " <Option name='AUTOFILTER' type='int' description=\"Auto adjust " 107 : "filter's strength. off=0, on=1\" default='0'/>\n" 108 : " <Option name='PASS' type='int' description='Number of entropy " 109 : "analysis passes [1-10]' default='1'/>\n" 110 : " <Option name='PREPROCESSING' type='int' description='Preprocessing " 111 : "filter. none=0, segment-smooth=1' default='0'/>\n" 112 : " <Option name='PARTITIONS' type='int' description='log2(number of " 113 : "token partitions) in [0..3]' default='0'/>\n" 114 : #if WEBP_ENCODER_ABI_VERSION >= 0x0002 115 : " <Option name='PARTITION_LIMIT' type='int' description='quality " 116 : "degradation allowed to fit the 512k limit on prediction modes coding " 117 : "(0=no degradation, 100=full)' default='0'/>\n" 118 : #endif 119 : #if WEBP_ENCODER_ABI_VERSION >= 0x0209 120 : " <Option name='EXACT' type='int' description='preserve the exact " 121 : "RGB values under transparent area. off=0, on=1' default='0'/>\n" 122 : #endif 123 1223 : "</CreationOptionList>\n"); 124 : 125 1223 : poDriver->SetMetadataItem(GDAL_DCAP_VIRTUALIO, "YES"); 126 : 127 1223 : poDriver->pfnIdentify = WEBPDriverIdentify; 128 : 129 1223 : poDriver->SetMetadataItem(GDAL_DCAP_OPEN, "YES"); 130 1223 : poDriver->SetMetadataItem(GDAL_DCAP_CREATECOPY, "YES"); 131 1223 : } 132 : 133 : /************************************************************************/ 134 : /* DeclareDeferredWEBPPlugin() */ 135 : /************************************************************************/ 136 : 137 : #ifdef PLUGIN_FILENAME 138 1509 : void DeclareDeferredWEBPPlugin() 139 : { 140 1509 : if (GDALGetDriverByName(DRIVER_NAME) != nullptr) 141 : { 142 295 : return; 143 : } 144 1214 : auto poDriver = new GDALPluginDriverProxy(PLUGIN_FILENAME); 145 : #ifdef PLUGIN_INSTALLATION_MESSAGE 146 : poDriver->SetMetadataItem(GDAL_DMD_PLUGIN_INSTALLATION_MESSAGE, 147 : PLUGIN_INSTALLATION_MESSAGE); 148 : #endif 149 1214 : WEBPDriverSetCommonMetadata(poDriver); 150 1214 : GetGDALDriverManager()->DeclareDeferredPluginDriver(poDriver); 151 : } 152 : #endif