From 858d8a09aa3f7103215bb53ac78b063d0f1c1414 Mon Sep 17 00:00:00 2001 From: Dirk Farin Date: Tue, 17 Sep 2024 18:30:26 +0200 Subject: [PATCH] heif-dec: show parsing warnings (#1306) --- libheif/box.cc | 5 +++++ libheif/box.h | 4 ++++ libheif/codecs/image_item.h | 6 ++++++ libheif/context.cc | 14 +++++++++++++- libheif/pixelimage.h | 2 ++ 5 files changed, 30 insertions(+), 1 deletion(-) diff --git a/libheif/box.cc b/libheif/box.cc index 8451427ac2..b199d743c3 100644 --- a/libheif/box.cc +++ b/libheif/box.cc @@ -1059,6 +1059,11 @@ std::string Box_Error::dump(Indent& indent) const return sstr.str(); } +parse_error_fatality Box_Error::get_parse_error_fatality() const +{ + return m_fatality; +} + Error Box_ftyp::parse(BitstreamRange& range) { diff --git a/libheif/box.h b/libheif/box.h index 5fa515b0f5..1a86ec44bd 100644 --- a/libheif/box.h +++ b/libheif/box.h @@ -348,6 +348,10 @@ class Box_Error : public Box std::string dump(Indent&) const override; + [[nodiscard]] parse_error_fatality get_parse_error_fatality() const override; + + [[nodiscard]] Error get_error() const { return m_error; } + protected: Error parse(BitstreamRange& range) override { assert(false); return Error::Ok; } diff --git a/libheif/codecs/image_item.h b/libheif/codecs/image_item.h index 8c2271146e..0f8518e91f 100644 --- a/libheif/codecs/image_item.h +++ b/libheif/codecs/image_item.h @@ -342,6 +342,10 @@ class ImageItem : public ErrorBuffer const std::vector& get_region_item_ids() const { return m_region_item_ids; } + void add_decoding_warning(Error err) { m_decoding_warnings.emplace_back(std::move(err)); } + + const std::vector& get_decoding_warnings() const { return m_decoding_warnings; } + private: HeifContext* m_heif_context; @@ -382,6 +386,8 @@ class ImageItem : public ErrorBuffer bool m_has_extrinsic_matrix = false; Box_cmex::ExtrinsicMatrix m_extrinsic_matrix{}; + std::vector m_decoding_warnings; + protected: static Result> decode_from_compressed_data(heif_compression_format compression_format, const struct heif_decoding_options& options, diff --git a/libheif/context.cc b/libheif/context.cc index f7c769902d..e239555405 100644 --- a/libheif/context.cc +++ b/libheif/context.cc @@ -331,7 +331,6 @@ Error HeifContext::interpret_heif_file() // --- are there any 'essential' properties that we did not parse? - for (const auto& prop : properties) { if (std::dynamic_pointer_cast(prop) && get_heif_file()->get_ipco_box()->is_property_essential_for_item(pair.first, prop, get_heif_file()->get_ipma_box())) { @@ -343,6 +342,17 @@ Error HeifContext::interpret_heif_file() } + // --- Are there any parse errors in optional properties? Attach the errors as warnings to the images. + + for (const auto& prop : properties) { + if (auto errorbox = std::dynamic_pointer_cast(prop)) { + if (errorbox->get_parse_error_fatality() == parse_error_fatality::optional) { + image->add_decoding_warning(errorbox->get_error()); + } + } + } + + // --- extract image resolution bool ispe_read = false; @@ -997,6 +1007,8 @@ Result> HeifContext::decode_image(heif_item_id I } } + img->add_warnings(imginfo->get_decoding_warnings()); + return img; } diff --git a/libheif/pixelimage.h b/libheif/pixelimage.h index 24936e868c..97b7fdf1a0 100644 --- a/libheif/pixelimage.h +++ b/libheif/pixelimage.h @@ -233,6 +233,8 @@ class HeifPixelImage : public std::enable_shared_from_this, void add_warning(Error warning) { m_warnings.emplace_back(std::move(warning)); } + void add_warnings(const std::vector& warning) { for (const auto& err : warning) m_warnings.emplace_back(err); } + const std::vector& get_warnings() const { return m_warnings; } private: