LCOV - code coverage report
Current view: top level - frmts/mrsid - mrsiddrivercore.cpp (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 17 17 100.0 %
Date: 2025-10-25 23:36:32 Functions: 2 2 100.0 %

          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

Generated by: LCOV version 1.14