From 5f606a6207f105bc8c21c8a1b87fbb3ea92cce9b Mon Sep 17 00:00:00 2001 From: Dirk Farin Date: Tue, 11 Jun 2024 00:52:04 +0200 Subject: [PATCH] deduplicate hvcC box (#1175) --- libheif/context.cc | 16 ++++++----- libheif/file.cc | 67 +--------------------------------------------- libheif/file.h | 8 ------ 3 files changed, 10 insertions(+), 81 deletions(-) diff --git a/libheif/context.cc b/libheif/context.cc index c6001ef45f..71475f7964 100644 --- a/libheif/context.cc +++ b/libheif/context.cc @@ -2146,7 +2146,7 @@ create_alpha_image_from_image_alpha_channel(const std::shared_ptr& data) { - m_heif_context->m_heif_file->add_hvcC_property(m_id); + auto hvcC = std::make_shared(); // --- parse the h265 stream and set hvcC headers and compressed image data @@ -2209,8 +2209,7 @@ void HeifContext::Image::set_preencoded_hevc_image(const std::vector& d case 0x20: case 0x21: case 0x22: - m_heif_context->m_heif_file->append_hvcC_nal_data(m_id, nal_data); - /*hvcC->append_nal_data(nal_data);*/ + hvcC->append_nal_data(nal_data); break; default: { @@ -2236,6 +2235,8 @@ void HeifContext::Image::set_preencoded_hevc_image(const std::vector& d break; } } + + m_heif_context->m_heif_file->add_property(m_id, hvcC, true); } @@ -2499,8 +2500,7 @@ Error HeifContext::encode_image_as_hevc(const std::shared_ptr& i out_image->set_size(input_width, input_height); - m_heif_file->add_hvcC_property(image_id); - + auto hvcC = std::make_shared(); heif_image c_api_image; c_api_image.image = src_image; @@ -2533,14 +2533,14 @@ Error HeifContext::encode_image_as_hevc(const std::shared_ptr& i parse_sps_for_hvcC_configuration(data, size, &config, &encoded_width, &encoded_height); - m_heif_file->set_hvcC_configuration(image_id, config); + hvcC->set_configuration(config); } switch (data[0] >> 1) { case 0x20: case 0x21: case 0x22: - m_heif_file->append_hvcC_nal_data(image_id, data, size); + hvcC->append_nal_data(data, size); break; default: @@ -2553,6 +2553,8 @@ Error HeifContext::encode_image_as_hevc(const std::shared_ptr& i heif_suberror_Invalid_image_size); } + m_heif_file->add_property(image_id, hvcC, true); + if (encoder->plugin->plugin_api_version >= 3 && encoder->plugin->query_encoded_size != nullptr) { uint32_t check_encoded_width = input_width, check_encoded_height = input_height; diff --git a/libheif/file.cc b/libheif/file.cc index c40329d1d0..f3626075d7 100644 --- a/libheif/file.cc +++ b/libheif/file.cc @@ -988,7 +988,7 @@ void HeifFile::add_clap_property(heif_item_id id, uint32_t clap_width, uint32_t heif_property_id HeifFile::add_property(heif_item_id id, std::shared_ptr property, bool essential) { - int index = m_ipco_box->append_child_box(property); + int index = m_ipco_box->find_or_append_child_box(property); m_ipma_box->add_property_for_item_ID(id, Box_ipma::PropertyAssociation{essential, uint16_t(index + 1)}); @@ -1073,71 +1073,6 @@ void HeifFile::add_pixi_property(heif_item_id id, uint8_t c1, uint8_t c2, uint8_ } -void HeifFile::add_hvcC_property(heif_item_id id) -{ - auto hvcC = std::make_shared(); - int index = m_ipco_box->append_child_box(hvcC); - - m_ipma_box->add_property_for_item_ID(id, Box_ipma::PropertyAssociation{true, uint16_t(index + 1)}); -} - - -Error HeifFile::append_hvcC_nal_data(heif_item_id id, const std::vector& nal_data) -{ - auto hvcC = std::dynamic_pointer_cast(m_ipco_box->get_property_for_item_ID(id, - m_ipma_box, - fourcc("hvcC"))); - - if (hvcC) { - hvcC->append_nal_data(nal_data); - return Error::Ok; - } - else { - // Should always have an hvcC box, because we are checking this in - // heif_context::interpret_heif_file() - assert(false); - return Error(heif_error_Usage_error, - heif_suberror_No_hvcC_box); - } -} - - -Error HeifFile::set_hvcC_configuration(heif_item_id id, const Box_hvcC::configuration& config) -{ - auto hvcC = std::dynamic_pointer_cast(m_ipco_box->get_property_for_item_ID(id, - m_ipma_box, - fourcc("hvcC"))); - - if (hvcC) { - hvcC->set_configuration(config); - return Error::Ok; - } - else { - return Error(heif_error_Usage_error, - heif_suberror_No_hvcC_box); - } -} - - -Error HeifFile::append_hvcC_nal_data(heif_item_id id, const uint8_t* data, size_t size) -{ - std::vector> properties; - - auto hvcC = std::dynamic_pointer_cast(m_ipco_box->get_property_for_item_ID(id, - m_ipma_box, - fourcc("hvcC"))); - - if (hvcC) { - hvcC->append_nal_data(data, size); - return Error::Ok; - } - else { - return Error(heif_error_Usage_error, - heif_suberror_No_hvcC_box); - } -} - - void HeifFile::add_av1C_property(heif_item_id id) { auto av1C = std::make_shared(); diff --git a/libheif/file.h b/libheif/file.h index 3715bab98c..23203bcfa8 100644 --- a/libheif/file.h +++ b/libheif/file.h @@ -143,14 +143,6 @@ class HeifFile std::shared_ptr add_new_infe_box(const char* item_type); - void add_hvcC_property(heif_item_id id); - - Error append_hvcC_nal_data(heif_item_id id, const std::vector& data); - - Error append_hvcC_nal_data(heif_item_id id, const uint8_t* data, size_t size); - - Error set_hvcC_configuration(heif_item_id id, const Box_hvcC::configuration& config); - void add_av1C_property(heif_item_id id); Error set_av1C_configuration(heif_item_id id, const Box_av1C::configuration& config);