Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: GDAL 4 : * Purpose: MrSID driver 5 : * Author: Even Rouault, <even.rouault at spatialys.com> 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) 2023, Even Rouault, <even.rouault at spatialys.com> 9 : * 10 : * SPDX-License-Identifier: MIT 11 : ****************************************************************************/ 12 : 13 : #include "mrsiddrivercore.h" 14 : 15 : #ifdef PLUGIN_FILENAME 16 : #include "gdalplugindriverproxy.h" 17 : #endif 18 : #include "gdal_frmts.h" 19 : 20 : #include "mrsiddataset_headers_include.h" 21 : 22 : /************************************************************************/ 23 : /* MrSIDIdentify() */ 24 : /* */ 25 : /* Identify method that only supports MrSID files. */ 26 : /************************************************************************/ 27 : 28 60863 : int MrSIDIdentify(GDALOpenInfo *poOpenInfo) 29 : { 30 60863 : if (poOpenInfo->nHeaderBytes < 32) 31 56159 : return FALSE; 32 : 33 4704 : if (!STARTS_WITH_CI((const char *)poOpenInfo->pabyHeader, "msid")) 34 4680 : return FALSE; 35 : 36 24 : return TRUE; 37 : } 38 : 39 : #ifdef MRSID_J2K 40 : 41 : static const unsigned char jpc_header[] = {0xff, 0x4f}; 42 : 43 : /************************************************************************/ 44 : /* JP2Identify() */ 45 : /* */ 46 : /* Identify method that only supports JPEG2000 files. */ 47 : /************************************************************************/ 48 : 49 : int MrSIDJP2Identify(GDALOpenInfo *poOpenInfo) 50 : { 51 : if (poOpenInfo->nHeaderBytes < 32) 52 : return FALSE; 53 : 54 : if (memcmp(poOpenInfo->pabyHeader, jpc_header, sizeof(jpc_header)) == 0) 55 : { 56 : const char *pszExtension = poOpenInfo->osExtension.c_str(); 57 : 58 : if (!EQUAL(pszExtension, "jpc") && !EQUAL(pszExtension, "j2k") && 59 : !EQUAL(pszExtension, "jp2") && !EQUAL(pszExtension, "jpx") && 60 : !EQUAL(pszExtension, "j2c") && !EQUAL(pszExtension, "ntf")) 61 : return FALSE; 62 : } 63 : else if (!STARTS_WITH_CI((const char *)poOpenInfo->pabyHeader + 4, "jP ")) 64 : return FALSE; 65 : 66 : return TRUE; 67 : } 68 : 69 : #endif 70 : 71 : /************************************************************************/ 72 : /* MrSIDDriverSetCommonMetadata() */ 73 : /************************************************************************/ 74 : 75 1755 : void MrSIDDriverSetCommonMetadata(GDALDriver *poDriver) 76 : { 77 1755 : poDriver->SetDescription(MRSID_DRIVER_NAME); 78 1755 : poDriver->SetMetadataItem(GDAL_DCAP_RASTER, "YES"); 79 1755 : poDriver->SetMetadataItem(GDAL_DMD_LONGNAME, 80 : "Multi-resolution Seamless Image Database " 81 1755 : "(MrSID)"); 82 1755 : poDriver->SetMetadataItem(GDAL_DMD_HELPTOPIC, "drivers/raster/mrsid.html"); 83 1755 : poDriver->SetMetadataItem(GDAL_DMD_EXTENSION, "sid"); 84 : 85 : #ifdef MRSID_ESDK 86 : poDriver->SetMetadataItem(GDAL_DMD_CREATIONDATATYPES, 87 : "Byte Int16 UInt16 Int32 UInt32 " 88 : "Float32 Float64"); 89 : poDriver->SetMetadataItem( 90 : GDAL_DMD_CREATIONOPTIONLIST, 91 : "<CreationOptionList>" 92 : // Version 2 Options 93 : " <Option name='COMPRESSION' type='double' description='Set " 94 : "compression ratio (0.0 default is meant to be lossless)'/>" 95 : // Version 3 Options 96 : " <Option name='TWOPASS' type='int' description='Use twopass " 97 : "optimizer algorithm'/>" 98 : " <Option name='FILESIZE' type='int' description='Set target file " 99 : "size (0 implies lossless compression)'/>" 100 : // Version 2 and 3 Option 101 : " <Option name='WORLDFILE' type='boolean' description='Write out " 102 : "world file'/>" 103 : // Version Type 104 : " <Option name='VERSION' type='int' description='Valid versions are " 105 : "2 and 3, default = 3'/>" 106 : "</CreationOptionList>"); 107 : 108 : poDriver->SetMetadataItem(GDAL_DCAP_CREATECOPY, "YES"); 109 : #else 110 : // In read-only mode, we support VirtualIO. I don't think this is the case 111 : // for MrSIDCreateCopy(). 112 1755 : poDriver->SetMetadataItem(GDAL_DCAP_VIRTUALIO, "YES"); 113 : #endif 114 1755 : poDriver->pfnIdentify = MrSIDIdentify; 115 1755 : poDriver->SetMetadataItem(GDAL_DCAP_OPEN, "YES"); 116 1755 : } 117 : 118 : /************************************************************************/ 119 : /* JP2MrSIDDriverSetCommonMetadata() */ 120 : /************************************************************************/ 121 : 122 : #ifdef MRSID_J2K 123 : 124 : void JP2MrSIDDriverSetCommonMetadata(GDALDriver *poDriver) 125 : { 126 : poDriver->SetDescription(JP2MRSID_DRIVER_NAME); 127 : poDriver->SetMetadataItem(GDAL_DCAP_RASTER, "YES"); 128 : poDriver->SetMetadataItem(GDAL_DMD_LONGNAME, "MrSID JPEG2000"); 129 : poDriver->SetMetadataItem(GDAL_DMD_HELPTOPIC, 130 : "drivers/raster/jp2mrsid.html"); 131 : poDriver->SetMetadataItem(GDAL_DMD_EXTENSION, "jp2"); 132 : 133 : #ifdef MRSID_ESDK 134 : poDriver->SetMetadataItem(GDAL_DMD_CREATIONDATATYPES, "Byte Int16 UInt16"); 135 : poDriver->SetMetadataItem( 136 : GDAL_DMD_CREATIONOPTIONLIST, 137 : "<CreationOptionList>" 138 : " <Option name='COMPRESSION' type='double' description='Set " 139 : "compression ratio (0.0 default is meant to be lossless)'/>" 140 : " <Option name='WORLDFILE' type='boolean' description='Write out " 141 : "world file'/>" 142 : " <Option name='XMLPROFILE' type='string' description='Use named xml " 143 : "profile file'/>" 144 : "</CreationOptionList>"); 145 : 146 : poDriver->SetMetadataItem(GDAL_DCAP_CREATECOPY, "YES"); 147 : #else 148 : /* In read-only mode, we support VirtualIO. I don't think this is the case 149 : */ 150 : /* for JP2CreateCopy() */ 151 : poDriver->SetMetadataItem(GDAL_DCAP_VIRTUALIO, "YES"); 152 : #endif 153 : poDriver->pfnIdentify = MrSIDJP2Identify; 154 : poDriver->SetMetadataItem(GDAL_DCAP_OPEN, "YES"); 155 : } 156 : 157 : #endif 158 : 159 : /************************************************************************/ 160 : /* DeclareDeferredMrSIDPlugin() */ 161 : /************************************************************************/ 162 : 163 : #ifdef PLUGIN_FILENAME 164 : void DeclareDeferredMrSIDPlugin() 165 : { 166 : if (GDALGetDriverByName(MRSID_DRIVER_NAME) != nullptr) 167 : { 168 : return; 169 : } 170 : { 171 : auto poDriver = new GDALPluginDriverProxy(PLUGIN_FILENAME); 172 : #ifdef PLUGIN_INSTALLATION_MESSAGE 173 : poDriver->SetMetadataItem(GDAL_DMD_PLUGIN_INSTALLATION_MESSAGE, 174 : PLUGIN_INSTALLATION_MESSAGE); 175 : #endif 176 : MrSIDDriverSetCommonMetadata(poDriver); 177 : GetGDALDriverManager()->DeclareDeferredPluginDriver(poDriver); 178 : } 179 : #ifdef MRSID_J2K 180 : { 181 : auto poDriver = new GDALPluginDriverProxy(PLUGIN_FILENAME); 182 : #ifdef PLUGIN_INSTALLATION_MESSAGE 183 : poDriver->SetMetadataItem(GDAL_DMD_PLUGIN_INSTALLATION_MESSAGE, 184 : PLUGIN_INSTALLATION_MESSAGE); 185 : #endif 186 : JP2MrSIDDriverSetCommonMetadata(poDriver); 187 : GetGDALDriverManager()->DeclareDeferredPluginDriver(poDriver); 188 : } 189 : #endif 190 : } 191 : #endif