LCOV - code coverage report
Current view: top level - frmts/opjlike - jp2opjlikedataset.h (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 9 12 75.0 %
Date: 2024-11-21 22:18:42 Functions: 1 1 100.0 %

          Line data    Source code
       1             : /******************************************************************************
       2             :  *
       3             :  * Project:  JPEG2000 driver based on OpenJPEG or Grok library
       4             :  * Purpose:  JPEG2000 driver based on OpenJPEG or Grok library
       5             :  * Authors:  Even Rouault, <even dot rouault at spatialys dot com>
       6             :  *           Aaron Boxer, <boxerab at protonmail dot com>
       7             :  *
       8             :  ******************************************************************************
       9             :  * Copyright (c) 2010-2014, Even Rouault <even dot rouault at spatialys dot com>
      10             :  * Copyright (c) 2015, European Union (European Environment Agency)
      11             :  * Copyright (c) 2023, Grok Image Compression Inc.
      12             :  *
      13             :  * SPDX-License-Identifier: MIT
      14             :  ****************************************************************************/
      15             : 
      16             : #pragma once
      17             : 
      18             : #include "cpl_atomic_ops.h"
      19             : #include "cpl_multiproc.h"
      20             : #include "cpl_string.h"
      21             : #include "cpl_worker_thread_pool.h"
      22             : #include "gdaljp2abstractdataset.h"
      23             : #include "gdaljp2metadata.h"
      24             : 
      25             : typedef int JP2_COLOR_SPACE;
      26             : typedef int JP2_PROG_ORDER;
      27             : 
      28             : #define JP2_LRCP 0
      29             : #define JP2_RLCP 1
      30             : #define JP2_RPCL 2
      31             : #define JP2_PCRL 3
      32             : #define JP2_CPRL 4
      33             : 
      34             : enum JP2_ENUM
      35             : {
      36             :     JP2_CLRSPC_UNKNOWN,
      37             :     JP2_CLRSPC_SRGB,
      38             :     JP2_CLRSPC_GRAY,
      39             :     JP2_CLRSPC_SYCC,
      40             :     JP2_CODEC_J2K,
      41             :     JP2_CODEC_JP2
      42             : };
      43             : 
      44             : typedef struct
      45             : {
      46             :     VSILFILE *fp_;
      47             :     vsi_l_offset nBaseOffset;
      48             : } JP2File;
      49             : 
      50             : /************************************************************************/
      51             : /* ==================================================================== */
      52             : /*                           JP2DatasetBase                             */
      53             : /* ==================================================================== */
      54             : /************************************************************************/
      55             : 
      56             : struct JP2DatasetBase
      57             : {
      58        1657 :     int GetNumThreads()
      59             :     {
      60        1657 :         if (nThreads >= 1)
      61         446 :             return nThreads;
      62             : 
      63             :         const char *pszThreads =
      64        1211 :             CPLGetConfigOption("GDAL_NUM_THREADS", "ALL_CPUS");
      65        1211 :         if (EQUAL(pszThreads, "ALL_CPUS"))
      66        1211 :             nThreads = CPLGetNumCPUs();
      67             :         else
      68           0 :             nThreads = atoi(pszThreads);
      69        1211 :         if (nThreads > 128)
      70           0 :             nThreads = 128;
      71        1211 :         if (nThreads <= 0)
      72           0 :             nThreads = 1;
      73        1211 :         return nThreads;
      74             :     }
      75             : 
      76             :     std::string m_osFilename;
      77             :     VSILFILE *fp_ = nullptr; /* Large FILE API */
      78             :     vsi_l_offset nCodeStreamStart = 0;
      79             :     vsi_l_offset nCodeStreamLength = 0;
      80             : 
      81             :     int nRedIndex = 0;
      82             :     int nGreenIndex = 1;
      83             :     int nBlueIndex = 2;
      84             :     int nAlphaIndex = -1;
      85             : 
      86             :     int bIs420 = FALSE;
      87             : 
      88             :     int nParentXSize = 0;
      89             :     int nParentYSize = 0;
      90             :     int iLevel = 0;
      91             :     int nOverviewCount = 0;
      92             : 
      93             :     int bEnoughMemoryToLoadOtherBands = TRUE;
      94             :     int bRewrite = FALSE;
      95             :     int bHasGeoreferencingAtOpening = FALSE;
      96             : 
      97             :     int nThreads = -1;
      98             :     bool bUseSetDecodeArea = false;
      99             :     bool bSingleTiled = false;
     100             :     int m_nBlocksToLoad = 0;
     101             :     int m_nX0 = 0;
     102             :     int m_nY0 = 0;
     103             :     uint32_t m_nTileWidth = 0;
     104             :     uint32_t m_nTileHeight = 0;
     105             : };
     106             : 
     107             : /************************************************************************/
     108             : /* ==================================================================== */
     109             : /*                           JP2OPJLikeDataset                          */
     110             : /* ==================================================================== */
     111             : /************************************************************************/
     112             : template <typename CODEC, typename BASE> class JP2OPJLikeRasterBand;
     113             : 
     114             : template <typename CODEC, typename BASE>
     115             : class JP2OPJLikeDataset final : public GDALJP2AbstractDataset, public BASE
     116             : {
     117             :     friend class JP2OPJLikeRasterBand<CODEC, BASE>;
     118             :     JP2OPJLikeDataset **papoOverviewDS = nullptr;
     119             : 
     120             :   protected:
     121             :     virtual int CloseDependentDatasets() override;
     122             :     virtual VSILFILE *GetFileHandle() override;
     123             :     CPLErr Close() override;
     124             : 
     125             :   public:
     126             :     JP2OPJLikeDataset();
     127             :     virtual ~JP2OPJLikeDataset();
     128             : 
     129             :     static int Identify(GDALOpenInfo *poOpenInfo);
     130             :     static GDALDataset *Open(GDALOpenInfo *);
     131             :     static GDALDataset *CreateCopy(const char *pszFilename,
     132             :                                    GDALDataset *poSrcDS, int bStrict,
     133             :                                    char **papszOptions,
     134             :                                    GDALProgressFunc pfnProgress,
     135             :                                    void *pProgressData);
     136             : 
     137             :     CPLErr SetSpatialRef(const OGRSpatialReference *poSRS) override;
     138             : 
     139             :     virtual CPLErr SetGeoTransform(double *) override;
     140             : 
     141             :     CPLErr SetGCPs(int nGCPCountIn, const GDAL_GCP *pasGCPListIn,
     142             :                    const OGRSpatialReference *poSRS) override;
     143             : 
     144             :     virtual CPLErr SetMetadata(char **papszMetadata,
     145             :                                const char *pszDomain = "") override;
     146             :     virtual CPLErr SetMetadataItem(const char *pszName, const char *pszValue,
     147             :                                    const char *pszDomain = "") override;
     148             : 
     149             :     virtual CPLErr IRasterIO(GDALRWFlag eRWFlag, int nXOff, int nYOff,
     150             :                              int nXSize, int nYSize, void *pData, int nBufXSize,
     151             :                              int nBufYSize, GDALDataType eBufType,
     152             :                              int nBandCount, BANDMAP_TYPE panBandMap,
     153             :                              GSpacing nPixelSpace, GSpacing nLineSpace,
     154             :                              GSpacing nBandSpace,
     155             :                              GDALRasterIOExtraArg *psExtraArg) override;
     156             : 
     157             :     virtual GIntBig GetEstimatedRAMUsage() override;
     158             : 
     159             :     CPLErr IBuildOverviews(const char *pszResampling, int nOverviews,
     160             :                            const int *panOverviewList, int nListBands,
     161             :                            const int *panBandList, GDALProgressFunc pfnProgress,
     162             :                            void *pProgressData,
     163             :                            CSLConstList papszOptions) override;
     164             : 
     165             :     static bool WriteBox(VSILFILE *fp, GDALJP2Box *poBox);
     166             :     static bool WriteGDALMetadataBox(VSILFILE *fp, GDALDataset *poSrcDS,
     167             :                                      char **papszOptions);
     168             :     static bool WriteXMLBoxes(VSILFILE *fp, GDALDataset *poSrcDS);
     169             :     static bool WriteXMPBox(VSILFILE *fp, GDALDataset *poSrcDS);
     170             :     static bool WriteIPRBox(VSILFILE *fp, GDALDataset *poSrcDS);
     171             : 
     172             :     CPLErr ReadBlock(int nBand, VSILFILE *fp, int nBlockXOff, int nBlockYOff,
     173             :                      void *pImage, int nBandCount, const int *panBandMap);
     174             : 
     175             :     int PreloadBlocks(JP2OPJLikeRasterBand<CODEC, BASE> *poBand, int nXOff,
     176             :                       int nYOff, int nXSize, int nYSize, int nBandCount,
     177             :                       const int *panBandMap);
     178             : 
     179             :     static void ReadBlockInThread(void *userdata);
     180             : };
     181             : 
     182             : /************************************************************************/
     183             : /* ==================================================================== */
     184             : /*                         JP2OPJLikeRasterBand                         */
     185             : /* ==================================================================== */
     186             : /************************************************************************/
     187             : 
     188             : template <typename CODEC, typename BASE>
     189             : class JP2OPJLikeRasterBand final : public GDALPamRasterBand
     190             : {
     191             :     friend class JP2OPJLikeDataset<CODEC, BASE>;
     192             :     int bPromoteTo8Bit;
     193             :     GDALColorTable *poCT;
     194             : 
     195             :   public:
     196             :     JP2OPJLikeRasterBand(JP2OPJLikeDataset<CODEC, BASE> *poDSIn, int nBandIn,
     197             :                          GDALDataType eDataTypeIn, int nBits,
     198             :                          int bPromoteTo8BitIn, int nBlockXSizeIn,
     199             :                          int nBlockYSizeIn);
     200             :     virtual ~JP2OPJLikeRasterBand();
     201             : 
     202             :     virtual CPLErr IReadBlock(int, int, void *) override;
     203             :     virtual CPLErr IRasterIO(GDALRWFlag eRWFlag, int nXOff, int nYOff,
     204             :                              int nXSize, int nYSize, void *pData, int nBufXSize,
     205             :                              int nBufYSize, GDALDataType eBufType,
     206             :                              GSpacing nPixelSpace, GSpacing nLineSpace,
     207             :                              GDALRasterIOExtraArg *psExtraArg) override;
     208             : 
     209             :     virtual GDALColorInterp GetColorInterpretation() override;
     210             :     virtual GDALColorTable *GetColorTable() override;
     211             : 
     212             :     virtual int GetOverviewCount() override;
     213             :     virtual GDALRasterBand *GetOverview(int iOvrLevel) override;
     214             : 
     215             :     virtual int HasArbitraryOverviews() override;
     216             : };
     217             : 
     218             : #ifdef unused
     219             : void GDALRegisterJP2();
     220             : #endif

Generated by: LCOV version 1.14