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 : * SPDX-License-Identifier: MIT 11 : ****************************************************************************/ 12 : 13 : #include "gdal_frmts.h" 14 : #include "gdalplugindriverproxy.h" 15 : 16 : #include "webp_headers.h" 17 : #include "webpdrivercore.h" 18 : 19 : /************************************************************************/ 20 : /* WEBPDriverIdentify() */ 21 : /************************************************************************/ 22 : 23 58195 : int WEBPDriverIdentify(GDALOpenInfo *poOpenInfo) 24 : 25 : { 26 58195 : const int nHeaderBytes = poOpenInfo->nHeaderBytes; 27 58195 : const GByte *pabyHeader = poOpenInfo->pabyHeader; 28 : 29 58195 : if (nHeaderBytes < 20) 30 54518 : return FALSE; 31 : 32 4556 : return memcmp(pabyHeader, "RIFF", 4) == 0 && 33 4556 : memcmp(pabyHeader + 8, "WEBP", 4) == 0 && 34 879 : (memcmp(pabyHeader + 12, "VP8 ", 4) == 0 || 35 747 : memcmp(pabyHeader + 12, "VP8L", 4) == 0 || 36 4200 : memcmp(pabyHeader + 12, "VP8X", 4) == 0); 37 : } 38 : 39 : /************************************************************************/ 40 : /* WEBPDriverSetCommonMetadata() */ 41 : /************************************************************************/ 42 : 43 1762 : void WEBPDriverSetCommonMetadata(GDALDriver *poDriver) 44 : { 45 1762 : poDriver->SetDescription(DRIVER_NAME); 46 1762 : poDriver->SetMetadataItem(GDAL_DCAP_RASTER, "YES"); 47 1762 : poDriver->SetMetadataItem(GDAL_DMD_LONGNAME, "WEBP"); 48 1762 : poDriver->SetMetadataItem(GDAL_DMD_HELPTOPIC, "drivers/raster/webp.html"); 49 1762 : poDriver->SetMetadataItem(GDAL_DMD_EXTENSION, "webp"); 50 1762 : poDriver->SetMetadataItem(GDAL_DMD_MIMETYPE, "image/webp"); 51 1762 : poDriver->SetMetadataItem(GDAL_DMD_CREATIONDATATYPES, "Byte"); 52 : 53 1762 : poDriver->SetMetadataItem( 54 : GDAL_DMD_CREATIONOPTIONLIST, 55 : "<CreationOptionList>\n" 56 : " <Option name='QUALITY' type='float' description='good=100, bad=0' " 57 : "default='75'/>\n" 58 : #if WEBP_ENCODER_ABI_VERSION >= 0x0100 59 : " <Option name='LOSSLESS' type='boolean' description='Whether " 60 : "lossless compression should be used' default='FALSE'/>\n" 61 : #endif 62 : " <Option name='LOSSLESS_COPY' type='string-select' " 63 : "description='Whether conversion should be lossless' default='AUTO'>" 64 : " <Value>AUTO</Value>" 65 : " <Value>YES</Value>" 66 : " <Value>NO</Value>" 67 : " </Option>" 68 : " <Option name='PRESET' type='string-select' description='kind of " 69 : "image' default='DEFAULT'>\n" 70 : " <Value>DEFAULT</Value>\n" 71 : " <Value>PICTURE</Value>\n" 72 : " <Value>PHOTO</Value>\n" 73 : " <Value>DRAWING</Value>\n" 74 : " <Value>ICON</Value>\n" 75 : " <Value>TEXT</Value>\n" 76 : " </Option>\n" 77 : " <Option name='TARGETSIZE' type='int' description='if non-zero, " 78 : "desired target size in bytes. Has precedence over QUALITY'/>\n" 79 : " <Option name='PSNR' type='float' description='if non-zero, minimal " 80 : "distortion to to achieve. Has precedence over TARGETSIZE'/>\n" 81 : " <Option name='METHOD' type='int' description='quality/speed " 82 : "trade-off. fast=0, slower-better=6' default='4'/>\n" 83 : " <Option name='SEGMENTS' type='int' description='maximum number of " 84 : "segments [1-4]' default='4'/>\n" 85 : " <Option name='SNS_STRENGTH' type='int' description='Spatial Noise " 86 : "Shaping. off=0, maximum=100' default='50'/>\n" 87 : " <Option name='FILTER_STRENGTH' type='int' description='Filter " 88 : "strength. off=0, strongest=100' default='20'/>\n" 89 : " <Option name='FILTER_SHARPNESS' type='int' description='Filter " 90 : "sharpness. off=0, least sharp=7' default='0'/>\n" 91 : " <Option name='FILTER_TYPE' type='int' description='Filtering type. " 92 : "simple=0, strong=1' default='0'/>\n" 93 : " <Option name='AUTOFILTER' type='int' description=\"Auto adjust " 94 : "filter's strength. off=0, on=1\" default='0'/>\n" 95 : " <Option name='PASS' type='int' description='Number of entropy " 96 : "analysis passes [1-10]' default='1'/>\n" 97 : " <Option name='PREPROCESSING' type='int' description='Preprocessing " 98 : "filter. none=0, segment-smooth=1' default='0'/>\n" 99 : " <Option name='PARTITIONS' type='int' description='log2(number of " 100 : "token partitions) in [0..3]' default='0'/>\n" 101 : #if WEBP_ENCODER_ABI_VERSION >= 0x0002 102 : " <Option name='PARTITION_LIMIT' type='int' description='quality " 103 : "degradation allowed to fit the 512k limit on prediction modes coding " 104 : "(0=no degradation, 100=full)' default='0'/>\n" 105 : #endif 106 : #if WEBP_ENCODER_ABI_VERSION >= 0x0209 107 : " <Option name='EXACT' type='int' description='preserve the exact " 108 : "RGB values under transparent area. off=0, on=1' default='0'/>\n" 109 : #endif 110 : "<Option name='WORLDFILE' type='boolean' description='whether " 111 : "to generate a worldfile' default='NO'/>\n" 112 1762 : "</CreationOptionList>\n"); 113 : 114 1762 : poDriver->SetMetadataItem(GDAL_DCAP_VIRTUALIO, "YES"); 115 1762 : poDriver->SetMetadataItem(GDAL_DCAP_CREATE_ONLY_VISIBLE_AT_CLOSE_TIME, 116 1762 : "YES"); 117 : 118 1762 : poDriver->pfnIdentify = WEBPDriverIdentify; 119 : 120 1762 : poDriver->SetMetadataItem(GDAL_DCAP_OPEN, "YES"); 121 1762 : poDriver->SetMetadataItem(GDAL_DCAP_CREATECOPY, "YES"); 122 1762 : } 123 : 124 : /************************************************************************/ 125 : /* DeclareDeferredWEBPPlugin() */ 126 : /************************************************************************/ 127 : 128 : #ifdef PLUGIN_FILENAME 129 2033 : void DeclareDeferredWEBPPlugin() 130 : { 131 2033 : if (GDALGetDriverByName(DRIVER_NAME) != nullptr) 132 : { 133 283 : return; 134 : } 135 1750 : auto poDriver = new GDALPluginDriverProxy(PLUGIN_FILENAME); 136 : #ifdef PLUGIN_INSTALLATION_MESSAGE 137 : poDriver->SetMetadataItem(GDAL_DMD_PLUGIN_INSTALLATION_MESSAGE, 138 : PLUGIN_INSTALLATION_MESSAGE); 139 : #endif 140 1750 : WEBPDriverSetCommonMetadata(poDriver); 141 1750 : GetGDALDriverManager()->DeclareDeferredPluginDriver(poDriver); 142 : } 143 : #endif