From 5c36aeeae6dcf5591a8753ac264a23fa1aac1899 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Thu, 18 Apr 2024 01:31:38 +0200 Subject: [PATCH] HDF5 multidim: implement GDALMDArray::GetBlockSize() and GetStructuralInfo() --- autotest/gdrivers/data/hdf5/deflate.h5 | Bin 0 -> 26420 bytes autotest/gdrivers/hdf5multidim.py | 13 ++++ frmts/hdf5/hdf5multidim.cpp | 84 +++++++++++++++++++++++++ 3 files changed, 97 insertions(+) create mode 100644 autotest/gdrivers/data/hdf5/deflate.h5 diff --git a/autotest/gdrivers/data/hdf5/deflate.h5 b/autotest/gdrivers/data/hdf5/deflate.h5 new file mode 100644 index 0000000000000000000000000000000000000000..f32e29f9c80f23c02829e979d361c415d27d026f GIT binary patch literal 26420 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 m_poSRS{}; haddr_t m_nOffset; + mutable CPLStringList m_aosStructuralInfo{}; HDF5Array(const std::string &osParentName, const std::string &osName, const std::shared_ptr &poShared, @@ -365,6 +366,10 @@ class HDF5Array final : public GDALMDArray std::vector> GetAttributes(CSLConstList papszOptions = nullptr) const override; + std::vector GetBlockSize() const override; + + CSLConstList GetStructuralInfo() const override; + const void *GetRawNoDataValue() const override { return m_abyNoData.empty() ? nullptr : m_abyNoData.data(); @@ -1808,6 +1813,85 @@ HDF5Array::GetAttributes(CSLConstList papszOptions) const return m_oListAttributes; } +/************************************************************************/ +/* GetBlockSize() */ +/************************************************************************/ + +std::vector HDF5Array::GetBlockSize() const +{ + HDF5_GLOBAL_LOCK(); + + const auto nDimCount = GetDimensionCount(); + std::vector res(nDimCount); + if (res.empty()) + return res; + + const hid_t nListId = H5Dget_create_plist(m_hArray); + if (nListId > 0) + { + if (H5Pget_layout(nListId) == H5D_CHUNKED) + { + std::vector anChunkDims(nDimCount); + const int nDimSize = + H5Pget_chunk(nListId, nDimCount, &anChunkDims[0]); + if (static_cast(nDimSize) == nDimCount) + { + for (size_t i = 0; i < nDimCount; ++i) + { + res[i] = anChunkDims[i]; + } + } + } + + H5Pclose(nListId); + } + + return res; +} + +/************************************************************************/ +/* GetStructuralInfo() */ +/************************************************************************/ + +CSLConstList HDF5Array::GetStructuralInfo() const +{ + if (m_aosStructuralInfo.empty()) + { + HDF5_GLOBAL_LOCK(); + const hid_t nListId = H5Dget_create_plist(m_hArray); + if (nListId > 0) + { + const int nFilters = H5Pget_nfilters(nListId); + for (int i = 0; i < nFilters; ++i) + { + unsigned int flags = 0; + size_t cd_nelmts = 0; + char szName[64 + 1] = {0}; + const auto eFilter = H5Pget_filter( + nListId, i, &flags, &cd_nelmts, nullptr, 64, szName); + if (eFilter == H5Z_FILTER_DEFLATE) + { + m_aosStructuralInfo.SetNameValue("COMPRESSION", "DEFLATE"); + } + else if (eFilter == H5Z_FILTER_SZIP) + { + m_aosStructuralInfo.SetNameValue("COMPRESSION", "SZIP"); + } + else if (eFilter == H5Z_FILTER_SHUFFLE) + { + m_aosStructuralInfo.SetNameValue("FILTER", "SHUFFLE"); + } + else + { + CPLDebug("HDF5", "Filter used: %s", szName); + } + } + H5Pclose(nListId); + } + } + return m_aosStructuralInfo.List(); +} + /************************************************************************/ /* CopyBuffer() */ /************************************************************************/