LCOV - code coverage report
Current view: top level - frmts/heif - heifdrivercore.cpp (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 39 40 97.5 %
Date: 2026-10-07 02:07:28 Functions: 5 5 100.0 %

          Line data    Source code
       1             : /******************************************************************************
       2             :  *
       3             :  * Project:  HEIF Driver
       4             :  * Author:   Even Rouault <even.rouault at spatialys.com>
       5             :  *
       6             :  ******************************************************************************
       7             :  * Copyright (c) 2020, Even Rouault <even.rouault at spatialys.com>
       8             :  *
       9             :  * SPDX-License-Identifier: MIT
      10             :  ****************************************************************************/
      11             : 
      12             : #include "gdal_frmts.h"
      13             : #include "gdalplugindriverproxy.h"
      14             : 
      15             : #include "include_libheif.h"
      16             : 
      17             : #include "heifdrivercore.h"
      18             : 
      19             : /************************************************************************/
      20             : /*                    HEIFDriverIdentifySimplified()                    */
      21             : /************************************************************************/
      22             : 
      23             : static const GByte FTYP_4CC[] = {'f', 't', 'y', 'p'};
      24             : static const GByte supportedBrands[][4]{
      25             :     {'a', 'v', 'i', 'f'}, {'h', 'e', 'i', 'c'}, {'h', 'e', 'i', 'x'},
      26             :     {'j', '2', 'k', 'i'}, {'j', 'p', 'e', 'g'}, {'m', 'i', 'a', 'f'},
      27             :     {'m', 'i', 'f', '1'}, {'m', 'i', 'f', '2'}, {'v', 'v', 'i', 'c'}};
      28             : 
      29       62529 : int HEIFDriverIdentifySimplified(GDALOpenInfo *poOpenInfo)
      30             : {
      31       62529 :     if (STARTS_WITH_CI(poOpenInfo->pszFilename, "HEIF:"))
      32             :     {
      33           9 :         return true;
      34             :     }
      35       62520 :     if (poOpenInfo->nHeaderBytes < 16 || poOpenInfo->fpL == nullptr)
      36             :     {
      37       57759 :         return false;
      38             :     }
      39        4761 :     if (memcmp(poOpenInfo->pabyHeader + 4, FTYP_4CC, sizeof(FTYP_4CC)) != 0)
      40             :     {
      41        4728 :         return false;
      42             :     }
      43             :     uint32_t lengthBigEndian;
      44          33 :     memcpy(&lengthBigEndian, poOpenInfo->pabyHeader, sizeof(uint32_t));
      45          33 :     uint32_t lengthHostEndian = CPL_MSBWORD32(lengthBigEndian);
      46          33 :     if (lengthHostEndian > static_cast<uint32_t>(poOpenInfo->nHeaderBytes))
      47             :     {
      48           0 :         lengthHostEndian = static_cast<uint32_t>(poOpenInfo->nHeaderBytes);
      49             :     }
      50         225 :     for (const GByte *supportedBrand : supportedBrands)
      51             :     {
      52         208 :         if (memcmp(poOpenInfo->pabyHeader + 8, supportedBrand, 4) == 0)
      53             :         {
      54          16 :             return true;
      55             :         }
      56             :     }
      57          31 :     for (uint32_t offset = 16; offset + 4 <= lengthHostEndian; offset += 4)
      58             :     {
      59         155 :         for (const GByte *supportedBrand : supportedBrands)
      60             :         {
      61         141 :             if (memcmp(poOpenInfo->pabyHeader + offset, supportedBrand, 4) == 0)
      62             :             {
      63           3 :                 return true;
      64             :             }
      65             :         }
      66             :     }
      67          14 :     return false;
      68             : }
      69             : 
      70             : /************************************************************************/
      71             : /*                    HEIFDriverSetCommonMetadata()                     */
      72             : /************************************************************************/
      73             : 
      74        1808 : void HEIFDriverSetCommonMetadata(GDALDriver *poDriver)
      75             : {
      76        1808 :     poDriver->SetDescription(DRIVER_NAME);
      77        1808 :     poDriver->SetMetadataItem(GDAL_DCAP_RASTER, "YES");
      78        1808 :     poDriver->SetMetadataItem(
      79             :         GDAL_DMD_LONGNAME,
      80        1808 :         "ISO/IEC 23008-12:2017 High Efficiency Image File Format");
      81        1808 :     poDriver->SetMetadataItem(GDAL_DMD_MIMETYPE, "image/heic");
      82        1808 :     poDriver->SetMetadataItem(GDAL_DMD_HELPTOPIC, "drivers/raster/heif.html");
      83        1808 :     poDriver->SetMetadataItem(GDAL_DMD_EXTENSION, "heic");
      84        1808 :     poDriver->SetMetadataItem(GDAL_DMD_EXTENSIONS, "heic heif");
      85             : #ifdef HAS_CUSTOM_FILE_READER
      86        1808 :     poDriver->SetMetadataItem(GDAL_DCAP_VIRTUALIO, "YES");
      87             : #endif
      88             : 
      89        1808 :     poDriver->SetMetadataItem("LIBHEIF_VERSION", LIBHEIF_VERSION);
      90             : 
      91        1808 :     poDriver->pfnIdentify = HEIFDriverIdentifySimplified;
      92        1808 :     poDriver->SetMetadataItem(GDAL_DCAP_OPEN, "YES");
      93             : #ifdef HAS_CUSTOM_FILE_WRITER
      94        1808 :     poDriver->SetMetadataItem(GDAL_DCAP_CREATECOPY, "YES");
      95             : #endif
      96        1808 : }
      97             : 
      98             : /************************************************************************/
      99             : /*                     DeclareDeferredHEIFPlugin()                      */
     100             : /************************************************************************/
     101             : 
     102             : #ifdef PLUGIN_FILENAME
     103        2062 : void DeclareDeferredHEIFPlugin()
     104             : {
     105        2062 :     if (GDALGetDriverByName(DRIVER_NAME) != nullptr)
     106             :     {
     107         263 :         return;
     108             :     }
     109        1799 :     auto poDriver = new GDALPluginDriverProxy(PLUGIN_FILENAME);
     110             : #ifdef PLUGIN_INSTALLATION_MESSAGE
     111             :     poDriver->SetMetadataItem(GDAL_DMD_PLUGIN_INSTALLATION_MESSAGE,
     112             :                               PLUGIN_INSTALLATION_MESSAGE);
     113             : #endif
     114        1799 :     HEIFDriverSetCommonMetadata(poDriver);
     115        1799 :     GetGDALDriverManager()->DeclareDeferredPluginDriver(poDriver);
     116             : }
     117             : #endif

Generated by: LCOV version 1.14