From 2d0da65458705104042ca45cbd9797de32f2b3b0 Mon Sep 17 00:00:00 2001 From: zhouliang3 Date: Mon, 22 Jun 2020 18:38:29 +0800 Subject: [PATCH] remove rtti and exception --- libheif/heif.cc | 22 ++++--- libheif/heif_colorconversion.cc | 34 +++++++++- libheif/heif_colorconversion.h | 1 + libheif/heif_context.cc | 42 ++++++------- libheif/heif_file.cc | 107 ++++++++++++++++++++------------ libheif/heif_hevc.h | 2 + libheif/heif_image.cc | 10 +-- 7 files changed, 142 insertions(+), 76 deletions(-) diff --git a/libheif/heif.cc b/libheif/heif.cc index c1a2f1efa6..66d8c48221 100644 --- a/libheif/heif.cc +++ b/libheif/heif.cc @@ -1000,8 +1000,8 @@ heif_color_profile_type heif_image_handle_get_color_profile_type(const struct he size_t heif_image_handle_get_raw_color_profile_size(const struct heif_image_handle* handle) { auto profile = handle->image->get_color_profile(); - auto raw_profile = std::dynamic_pointer_cast(profile); - if (raw_profile) { + if (profile && profile->get_type() != fourcc("nclx")) { + auto raw_profile = std::static_pointer_cast(profile); return raw_profile->get_data().size(); } else { @@ -1076,7 +1076,8 @@ struct heif_error heif_image_handle_get_nclx_color_profile(const struct heif_ima } auto profile = handle->image->get_color_profile(); - auto nclx_profile = std::dynamic_pointer_cast(profile); + auto nclx_profile = profile->get_type() == fourcc("nclx") ? + std::static_pointer_cast(profile) : nullptr; Error err = get_nclx_color_profile(nclx_profile, out_data); return err.error_struct(handle->image.get()); @@ -1093,8 +1094,8 @@ struct heif_error heif_image_handle_get_raw_color_profile(const struct heif_imag } auto profile = handle->image->get_color_profile(); - auto raw_profile = std::dynamic_pointer_cast(profile); - if (raw_profile) { + if (profile && profile->get_type() != fourcc("nclx")) { + auto raw_profile = std::static_pointer_cast(profile); memcpy(out_data, raw_profile->get_data().data(), raw_profile->get_data().size()); @@ -1120,8 +1121,8 @@ enum heif_color_profile_type heif_image_get_color_profile_type(const struct heif size_t heif_image_get_raw_color_profile_size(const struct heif_image* image) { auto profile = image->image->get_color_profile(); - auto raw_profile = std::dynamic_pointer_cast(profile); - if (raw_profile) { + if (profile && profile->get_type() != fourcc("nclx")) { + auto raw_profile = std::static_pointer_cast(profile); return raw_profile->get_data().size(); } else { @@ -1140,8 +1141,8 @@ struct heif_error heif_image_get_raw_color_profile(const struct heif_image* imag } auto profile = image->image->get_color_profile(); - auto raw_profile = std::dynamic_pointer_cast(profile); - if (raw_profile) { + if (profile && profile->get_type() != fourcc("nclx")) { + auto raw_profile = std::static_pointer_cast(profile); memcpy(out_data, raw_profile->get_data().data(), raw_profile->get_data().size()); @@ -1161,7 +1162,8 @@ struct heif_error heif_image_get_nclx_color_profile(const struct heif_image* ima } auto profile = image->image->get_color_profile(); - auto nclx_profile = std::dynamic_pointer_cast(profile); + auto nclx_profile = profile->get_type() == fourcc("nclx") ? + std::static_pointer_cast(profile) : nullptr; Error err = get_nclx_color_profile(nclx_profile, out_data); return err.error_struct(image->image.get()); diff --git a/libheif/heif_colorconversion.cc b/libheif/heif_colorconversion.cc index 5bb730321a..579ea9b248 100644 --- a/libheif/heif_colorconversion.cc +++ b/libheif/heif_colorconversion.cc @@ -52,6 +52,8 @@ class Op_RGB_to_RGB24_32 : public ColorConversionOperation convert_colorspace(const std::shared_ptr& input, ColorState target_state, ColorConversionOptions options) override; + + const char* name() const override { return "Op_RGB_to_RGB24_32"; } }; @@ -218,6 +220,8 @@ class Op_YCbCr_to_RGB : public ColorConversionOperation convert_colorspace(const std::shared_ptr& input, ColorState target_state, ColorConversionOptions options) override; + + const char* name() const override { return "Op_YCbCr_to_RGB"; } }; @@ -396,6 +400,8 @@ class Op_RGB_to_YCbCr : public ColorConversionOperation convert_colorspace(const std::shared_ptr& input, ColorState target_state, ColorConversionOptions options) override; + + const char* name() const override { return "Op_RGB_to_YCbCr"; } }; @@ -562,6 +568,8 @@ class Op_YCbCr420_to_RGB24 : public ColorConversionOperation convert_colorspace(const std::shared_ptr& input, ColorState target_state, ColorConversionOptions options) override; + + const char* name() const override { return "Op_YCbCr420_to_RGB24"; } }; @@ -661,6 +669,8 @@ class Op_YCbCr420_to_RGB32 : public ColorConversionOperation convert_colorspace(const std::shared_ptr& input, ColorState target_state, ColorConversionOptions options) override; + + const char* name() const override { return "Op_YCbCr420_to_RGB32"; } }; @@ -775,6 +785,8 @@ class Op_RGB_HDR_to_RRGGBBaa_BE : public ColorConversionOperation convert_colorspace(const std::shared_ptr& input, ColorState target_state, ColorConversionOptions options) override; + + const char* name() const override { return "Op_RGB_HDR_to_RRGGBBaa_BE"; } }; @@ -927,6 +939,8 @@ class Op_RRGGBBaa_BE_to_RGB_HDR : public ColorConversionOperation convert_colorspace(const std::shared_ptr& input, ColorState target_state, ColorConversionOptions options) override; + + const char* name() const override { return "Op_RRGGBBaa_BE_to_RGB_HDR"; } }; @@ -1052,6 +1066,8 @@ class Op_RRGGBBaa_swap_endianness : public ColorConversionOperation convert_colorspace(const std::shared_ptr& input, ColorState target_state, ColorConversionOptions options) override; + + const char* name() const override { return "Op_RRGGBBaa_swap_endianness"; } }; @@ -1191,6 +1207,8 @@ class Op_mono_to_YCbCr420 : public ColorConversionOperation convert_colorspace(const std::shared_ptr& input, ColorState target_state, ColorConversionOptions options) override; + + const char* name() const override { return "Op_mono_to_YCbCr420"; } }; @@ -1305,6 +1323,8 @@ class Op_mono_to_RGB24_32 : public ColorConversionOperation convert_colorspace(const std::shared_ptr& input, ColorState target_state, ColorConversionOptions options) override; + + const char* name() const override { return "Op_mono_to_RGB24_32"; } }; @@ -1441,6 +1461,8 @@ class Op_RGB24_32_to_YCbCr420 : public ColorConversionOperation convert_colorspace(const std::shared_ptr& input, ColorState target_state, ColorConversionOptions options) override; + + const char* name() const override { return "Op_RGB24_32_to_YCbCr420"; } }; @@ -1607,6 +1629,8 @@ class Op_drop_alpha_plane : public ColorConversionOperation convert_colorspace(const std::shared_ptr& input, ColorState target_state, ColorConversionOptions options) override; + + const char* name() const override { return "Op_drop_alpha_plane"; } }; @@ -1685,6 +1709,8 @@ class Op_to_hdr_planes : public ColorConversionOperation convert_colorspace(const std::shared_ptr& input, ColorState target_state, ColorConversionOptions options) override; + + const char* name() const override { return "Op_to_hdr_planes"; } }; @@ -1790,6 +1816,8 @@ class Op_to_sdr_planes : public ColorConversionOperation convert_colorspace(const std::shared_ptr& input, ColorState target_state, ColorConversionOptions options) override; + + const char* name() const override { return "Op_to_sdr_planes"; } }; @@ -1893,6 +1921,8 @@ class Op_RRGGBBxx_HDR_to_YCbCr420 : public ColorConversionOperation convert_colorspace(const std::shared_ptr& input, ColorState target_state, ColorConversionOptions options) override; + + const char* name() const override { return "Op_RRGGBBxx_HDR_to_YCbCr420"; } }; @@ -2037,6 +2067,8 @@ class Op_YCbCr420_to_RRGGBBaa : public ColorConversionOperation convert_colorspace(const std::shared_ptr& input, ColorState target_state, ColorConversionOptions options) override; + + const char* name() const override { return "Op_YCbCr420_to_RRGGBBaa"; } }; @@ -2319,7 +2351,7 @@ bool ColorConversionPipeline::construct_pipeline(ColorState input_state, void ColorConversionPipeline::debug_dump_pipeline() const { for (const auto& op : m_operations) { - std::cerr << "> " << typeid(*op).name() << "\n"; + std::cerr << "> " << op->name() << "\n"; } } diff --git a/libheif/heif_colorconversion.h b/libheif/heif_colorconversion.h index cf0eceb933..233df4a993 100644 --- a/libheif/heif_colorconversion.h +++ b/libheif/heif_colorconversion.h @@ -105,6 +105,7 @@ class ColorConversionOperation convert_colorspace(const std::shared_ptr& input, ColorState target_state, ColorConversionOptions options = ColorConversionOptions()) = 0; + virtual const char* name() const = 0; }; diff --git a/libheif/heif_context.cc b/libheif/heif_context.cc index ba85891e44..d06632071a 100644 --- a/libheif/heif_context.cc +++ b/libheif/heif_context.cc @@ -558,9 +558,8 @@ Error HeifContext::interpret_heif_file() std::shared_ptr auxC_property; for (const auto& property : properties) { - auto auxC = std::dynamic_pointer_cast(property.property); - if (auxC) { - auxC_property = auxC; + if (property.property->get_short_type() == fourcc("auxC")) { + auxC_property = std::static_pointer_cast(property.property); } } @@ -625,8 +624,8 @@ Error HeifContext::interpret_heif_file() Error err = decode_hevc_aux_sei_messages(subtypes, sei_messages); for (auto& msg : sei_messages) { - auto depth_msg = std::dynamic_pointer_cast(msg); - if (depth_msg) { + if (msg->is_depth_representation_info()) { + auto depth_msg = std::static_pointer_cast(msg); image->set_depth_representation_info(*depth_msg); } } @@ -677,8 +676,8 @@ Error HeifContext::interpret_heif_file() bool ispe_read = false; bool primary_colr_set = false; for (const auto& prop : properties) { - auto ispe = std::dynamic_pointer_cast(prop.property); - if (ispe) { + if (prop.property->get_short_type() == fourcc("ispe")) { + auto ispe = std::static_pointer_cast(prop.property); uint32_t width = ispe->get_width(); uint32_t height = ispe->get_height(); @@ -702,14 +701,14 @@ Error HeifContext::interpret_heif_file() } if (ispe_read) { - auto clap = std::dynamic_pointer_cast(prop.property); - if (clap) { + if (prop.property->get_short_type() == fourcc("clap")) { + auto clap = std::static_pointer_cast(prop.property); image->set_resolution( clap->get_width_rounded(), clap->get_height_rounded() ); } - auto irot = std::dynamic_pointer_cast(prop.property); - if (irot) { + if (prop.property->get_short_type() == fourcc("irot")) { + auto irot = std::static_pointer_cast(prop.property); if (irot->get_rotation()==90 || irot->get_rotation()==270) { // swap width and height @@ -719,8 +718,8 @@ Error HeifContext::interpret_heif_file() } } - auto colr = std::dynamic_pointer_cast(prop.property); - if (colr) { + if (prop.property->get_short_type() == fourcc("colr")) { + auto colr = std::static_pointer_cast(prop.property); auto profile = colr->get_color_profile(); image->set_color_profile(profile); @@ -1090,8 +1089,8 @@ Error HeifContext::decode_image_planar(heif_item_id ID, error = ipco_box->get_properties_for_item_ID(ID, ipma_box, properties); for (const auto& property : properties) { - auto rot = std::dynamic_pointer_cast(property.property); - if (rot) { + if (property.property->get_short_type() == fourcc("irot")) { + auto rot = std::static_pointer_cast(property.property); std::shared_ptr rotated_img; error = img->rotate_ccw(rot->get_rotation(), rotated_img); if (error) { @@ -1102,8 +1101,8 @@ Error HeifContext::decode_image_planar(heif_item_id ID, } - auto mirror = std::dynamic_pointer_cast(property.property); - if (mirror) { + if (property.property->get_short_type() == fourcc("imir")) { + auto mirror = std::static_pointer_cast(property.property); error = img->mirror_inplace(mirror->get_mirror_axis() == Box_imir::MirrorAxis::Horizontal); if (error) { return error; @@ -1111,8 +1110,8 @@ Error HeifContext::decode_image_planar(heif_item_id ID, } - auto clap = std::dynamic_pointer_cast(property.property); - if (clap) { + if (property.property->get_short_type() == fourcc("clap")) { + auto clap = std::static_pointer_cast(property.property); std::shared_ptr clap_img; int img_width = img->get_width(); @@ -1205,7 +1204,8 @@ Error HeifContext::decode_full_grid_image(heif_item_id ID, auto ipma = m_heif_file->get_ipma_box(); auto ipco = m_heif_file->get_ipco_box(); auto pixi_box = ipco->get_property_for_item_ID(ID, ipma, fourcc("pixi")); - auto pixi = std::dynamic_pointer_cast(pixi_box); + auto pixi = pixi_box->get_short_type() == fourcc("pixi") ? + std::static_pointer_cast(pixi_box) : nullptr; const uint32_t w = grid.get_width(); const uint32_t h = grid.get_height(); @@ -1931,7 +1931,7 @@ Error HeifContext::Image::encode_image_as_av1(std::shared_ptr im m_heif_context->m_heif_file->add_av1C_property(m_id); m_heif_context->m_heif_file->set_av1C_configuration(m_id, config); - + heif_image c_api_image; c_api_image.image = image; diff --git a/libheif/heif_file.cc b/libheif/heif_file.cc index 3a5189c068..30e4aa3ab7 100644 --- a/libheif/heif_file.cc +++ b/libheif/heif_file.cc @@ -198,11 +198,11 @@ Error HeifFile::parse_heif_file(BitstreamRange& range) // extract relevant boxes (ftyp, meta) if (box->get_short_type() == fourcc("meta")) { - m_meta_box = std::dynamic_pointer_cast(box); + m_meta_box = std::static_pointer_cast(box); } if (box->get_short_type() == fourcc("ftyp")) { - m_ftyp_box = std::dynamic_pointer_cast(box); + m_ftyp_box = std::static_pointer_cast(box); } } @@ -232,8 +232,10 @@ Error HeifFile::parse_heif_file(BitstreamRange& range) heif_suberror_No_meta_box); } - - m_hdlr_box = std::dynamic_pointer_cast(m_meta_box->get_child_box(fourcc("hdlr"))); + auto hdlr = m_meta_box->get_child_box(fourcc("hdlr")); + if (hdlr && hdlr->get_short_type() == fourcc("hdlr")) { + m_hdlr_box = std::static_pointer_cast(hdlr); + } if (!m_hdlr_box) { return Error(heif_error_Invalid_input, heif_suberror_No_hdlr_box); @@ -247,41 +249,65 @@ Error HeifFile::parse_heif_file(BitstreamRange& range) // --- find mandatory boxes needed for image decoding - m_pitm_box = std::dynamic_pointer_cast(m_meta_box->get_child_box(fourcc("pitm"))); + auto pitm = m_meta_box->get_child_box(fourcc("pitm")); + if (pitm && pitm->get_short_type() == fourcc("pitm")) { + m_pitm_box = std::static_pointer_cast(pitm); + } if (!m_pitm_box) { return Error(heif_error_Invalid_input, heif_suberror_No_pitm_box); } - m_iprp_box = std::dynamic_pointer_cast(m_meta_box->get_child_box(fourcc("iprp"))); + auto iprp = m_meta_box->get_child_box(fourcc("iprp")); + if (iprp && iprp->get_short_type() == fourcc("iprp")) { + m_iprp_box = std::static_pointer_cast(iprp); + } if (!m_iprp_box) { return Error(heif_error_Invalid_input, heif_suberror_No_iprp_box); } - m_ipco_box = std::dynamic_pointer_cast(m_iprp_box->get_child_box(fourcc("ipco"))); + auto ipco = m_iprp_box->get_child_box(fourcc("ipco")); + if (ipco && ipco->get_short_type() == fourcc("ipco")) { + m_ipco_box = std::static_pointer_cast(ipco); + } if (!m_ipco_box) { return Error(heif_error_Invalid_input, heif_suberror_No_ipco_box); } - m_ipma_box = std::dynamic_pointer_cast(m_iprp_box->get_child_box(fourcc("ipma"))); + auto ipma = m_iprp_box->get_child_box(fourcc("ipma")); + if (ipma && ipma->get_short_type() == fourcc("ipma")) { + m_ipma_box = std::static_pointer_cast(ipma); + } if (!m_ipma_box) { return Error(heif_error_Invalid_input, heif_suberror_No_ipma_box); } - m_iloc_box = std::dynamic_pointer_cast(m_meta_box->get_child_box(fourcc("iloc"))); + auto iloc = m_meta_box->get_child_box(fourcc("iloc")); + if (iloc && iloc->get_short_type() == fourcc("iloc")) { + m_iloc_box = std::static_pointer_cast(iloc); + } if (!m_iloc_box) { return Error(heif_error_Invalid_input, heif_suberror_No_iloc_box); } - m_idat_box = std::dynamic_pointer_cast(m_meta_box->get_child_box(fourcc("idat"))); + auto idat = m_meta_box->get_child_box(fourcc("idat")); + if (idat && idat->get_short_type() == fourcc("idat")) { + m_idat_box = std::static_pointer_cast(idat); + } - m_iref_box = std::dynamic_pointer_cast(m_meta_box->get_child_box(fourcc("iref"))); + auto iref = m_meta_box->get_child_box(fourcc("iref")); + if (iref && iref->get_short_type() == fourcc("iref")) { + m_iref_box = std::static_pointer_cast(iref); + } - m_iinf_box = std::dynamic_pointer_cast(m_meta_box->get_child_box(fourcc("iinf"))); + auto iinf = m_meta_box->get_child_box(fourcc("iinf")); + if (iinf && iinf->get_short_type() == fourcc("iinf")) { + m_iinf_box = std::static_pointer_cast(iinf); + } if (!m_iinf_box) { return Error(heif_error_Invalid_input, heif_suberror_No_iinf_box); @@ -294,7 +320,8 @@ Error HeifFile::parse_heif_file(BitstreamRange& range) std::vector> infe_boxes = m_iinf_box->get_child_boxes(fourcc("infe")); for (auto& box : infe_boxes) { - std::shared_ptr infe_box = std::dynamic_pointer_cast(box); + std::shared_ptr infe_box = box->get_short_type() == fourcc("infe") ? + std::static_pointer_cast(box) : nullptr; if (!infe_box) { return Error(heif_error_Invalid_input, heif_suberror_No_infe_box); @@ -369,7 +396,8 @@ heif_chroma HeifFile::get_image_chroma_from_configuration(heif_item_id imageID) // HEVC auto box = m_ipco_box->get_property_for_item_ID(imageID, m_ipma_box, fourcc("hvcC")); - std::shared_ptr hvcC_box = std::dynamic_pointer_cast(box); + std::shared_ptr hvcC_box = box && box->get_short_type() == fourcc("hvcC") ? + std::static_pointer_cast(box) : nullptr; if (hvcC_box) { return (heif_chroma)(hvcC_box->get_configuration().chroma_format); } @@ -378,7 +406,8 @@ heif_chroma HeifFile::get_image_chroma_from_configuration(heif_item_id imageID) // AV1 box = m_ipco_box->get_property_for_item_ID(imageID, m_ipma_box, fourcc("av1C")); - std::shared_ptr av1C_box = std::dynamic_pointer_cast(box); + std::shared_ptr av1C_box = box && box->get_short_type() == fourcc("av1C") ? + std::static_pointer_cast(box) : nullptr; if (av1C_box) { Box_av1C::configuration config = av1C_box->get_configuration(); if (config.chroma_subsampling_x == 1 && @@ -409,7 +438,8 @@ int HeifFile::get_luma_bits_per_pixel_from_configuration(heif_item_id imageID) c // HEVC auto box = m_ipco_box->get_property_for_item_ID(imageID, m_ipma_box, fourcc("hvcC")); - std::shared_ptr hvcC_box = std::dynamic_pointer_cast(box); + std::shared_ptr hvcC_box = box && box->get_short_type() == fourcc("hvcC") ? + std::static_pointer_cast(box) : nullptr; if (hvcC_box) { return hvcC_box->get_configuration().bit_depth_luma; } @@ -417,7 +447,8 @@ int HeifFile::get_luma_bits_per_pixel_from_configuration(heif_item_id imageID) c // AV1 box = m_ipco_box->get_property_for_item_ID(imageID, m_ipma_box, fourcc("av1C")); - std::shared_ptr av1C_box = std::dynamic_pointer_cast(box); + std::shared_ptr av1C_box = box && box->get_short_type() == fourcc("av1C") ? + std::static_pointer_cast(box) : nullptr; if (av1C_box) { Box_av1C::configuration config = av1C_box->get_configuration(); if (!config.high_bitdepth) { @@ -441,7 +472,8 @@ int HeifFile::get_chroma_bits_per_pixel_from_configuration(heif_item_id imageID) // HEVC auto box = m_ipco_box->get_property_for_item_ID(imageID, m_ipma_box, fourcc("hvcC")); - std::shared_ptr hvcC_box = std::dynamic_pointer_cast(box); + std::shared_ptr hvcC_box = box && box->get_short_type() == fourcc("hvcC") ? + std::static_pointer_cast(box) : nullptr; if (hvcC_box) { return hvcC_box->get_configuration().bit_depth_chroma; } @@ -449,7 +481,8 @@ int HeifFile::get_chroma_bits_per_pixel_from_configuration(heif_item_id imageID) // AV1 box = m_ipco_box->get_property_for_item_ID(imageID, m_ipma_box, fourcc("av1C")); - std::shared_ptr av1C_box = std::dynamic_pointer_cast(box); + std::shared_ptr av1C_box = box && box->get_short_type() == fourcc("av1C") ? + std::static_pointer_cast(box) : nullptr; if (av1C_box) { Box_av1C::configuration config = av1C_box->get_configuration(); if (!config.high_bitdepth) { @@ -526,10 +559,8 @@ Error HeifFile::get_compressed_image_data(heif_item_id ID, std::vector* std::shared_ptr hvcC_box; for (auto& prop : properties) { if (prop.property->get_short_type() == fourcc("hvcC")) { - hvcC_box = std::dynamic_pointer_cast(prop.property); - if (hvcC_box) { - break; - } + hvcC_box = std::static_pointer_cast(prop.property); + break; } } @@ -561,10 +592,8 @@ Error HeifFile::get_compressed_image_data(heif_item_id ID, std::vector* std::shared_ptr av1C_box; for (auto& prop : properties) { if (prop.property->get_short_type() == fourcc("av1C")) { - av1C_box = std::dynamic_pointer_cast(prop.property); - if (av1C_box) { - break; - } + av1C_box = std::static_pointer_cast(prop.property); + break; } } @@ -665,9 +694,9 @@ void HeifFile::add_hvcC_property(heif_item_id id) 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"))); + auto box = m_ipco_box->get_property_for_item_ID(id, m_ipma_box, fourcc("hvcC")); + auto hvcC = box && box->get_short_type() == fourcc("hvcC") ? + std::static_pointer_cast(box) : nullptr; if (hvcC) { hvcC->append_nal_data(nal_data); @@ -685,9 +714,9 @@ Error HeifFile::append_hvcC_nal_data(heif_item_id id, const std::vector 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"))); + auto box = m_ipco_box->get_property_for_item_ID(id, m_ipma_box, fourcc("hvcC")); + auto hvcC = box && box->get_short_type() == fourcc("hvcC") ? + std::static_pointer_cast(box) : nullptr; if (hvcC) { hvcC->set_configuration(config); @@ -705,9 +734,9 @@ Error HeifFile::append_hvcC_nal_data(heif_item_id id, const uint8_t* data, size_ { std::vector properties; - auto hvcC = std::dynamic_pointer_cast(m_ipco_box->get_property_for_item_ID(id, - m_ipma_box, - fourcc("hvcC"))); + auto box = m_ipco_box->get_property_for_item_ID(id, m_ipma_box, fourcc("hvcC")); + auto hvcC = box && box->get_short_type() == fourcc("hvcC") ? + std::static_pointer_cast(box) : nullptr; if (hvcC) { hvcC->append_nal_data(data,size); @@ -731,9 +760,9 @@ void HeifFile::add_av1C_property(heif_item_id id) Error HeifFile::set_av1C_configuration(heif_item_id id, const Box_av1C::configuration& config) { - auto av1C = std::dynamic_pointer_cast(m_ipco_box->get_property_for_item_ID(id, - m_ipma_box, - fourcc("av1C"))); + auto box = m_ipco_box->get_property_for_item_ID(id, m_ipma_box, fourcc("av1C")); + auto av1C = box && box->get_short_type() == fourcc("av1C") ? + std::static_pointer_cast(box) : nullptr; if (av1C) { av1C->set_configuration(config); diff --git a/libheif/heif_hevc.h b/libheif/heif_hevc.h index 4537125a82..92df191cd7 100644 --- a/libheif/heif_hevc.h +++ b/libheif/heif_hevc.h @@ -38,6 +38,7 @@ class SEIMessage { public: virtual ~SEIMessage() { } + virtual bool is_depth_representation_info() const { return false; } }; @@ -45,6 +46,7 @@ class SEIMessage_depth_representation_info : public SEIMessage, public heif_depth_representation_info { public: + bool is_depth_representation_info() const override { return true; } }; diff --git a/libheif/heif_image.cc b/libheif/heif_image.cc index 12a3fd85cb..c1dc4557cd 100644 --- a/libheif/heif_image.cc +++ b/libheif/heif_image.cc @@ -164,9 +164,12 @@ bool HeifPixelImage::add_plane(heif_channel channel, int width, int height, int plane.stride = width * bytes_per_pixel; plane.stride = (plane.stride+alignment-1) & ~(alignment-1); - try { - plane.allocated_mem = new uint8_t[height * plane.stride + alignment-1]; + { + plane.allocated_mem = new (std::nothrow) uint8_t[height * plane.stride + alignment-1]; plane.mem = plane.allocated_mem; + if (!plane.mem) { + return false; + } // shift beginning of image data to aligned memory position @@ -178,9 +181,6 @@ bool HeifPixelImage::add_plane(heif_channel channel, int width, int height, int m_planes.insert(std::make_pair(channel, std::move(plane))); } - catch (const std::bad_alloc& excpt) { - return false; - } return true; }