libheif/error.cc (259 lines of code) (raw):

/* * HEIF codec. * Copyright (c) 2017 Dirk Farin <dirk.farin@gmail.com> * * This file is part of libheif. * * libheif is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of * the License, or (at your option) any later version. * * libheif is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with libheif. If not, see <http://www.gnu.org/licenses/>. */ #include "error.h" #include <cassert> // static const char Error::kSuccess[] = "Success"; const char* cUnknownError = "Unknown error"; Error Error::Ok(heif_error_Ok); Error::Error() = default; Error::Error(heif_error_code c, heif_suberror_code sc, const std::string& msg) : error_code(c), sub_error_code(sc), message(msg) { } const char* Error::get_error_string(heif_error_code err) { switch (err) { case heif_error_Ok: return "Success"; case heif_error_Input_does_not_exist: return "Input file does not exist"; case heif_error_Invalid_input: return "Invalid input"; case heif_error_Unsupported_filetype: return "Unsupported file-type"; case heif_error_Unsupported_feature: return "Unsupported feature"; case heif_error_Usage_error: return "Usage error"; case heif_error_Memory_allocation_error: return "Memory allocation error"; case heif_error_Decoder_plugin_error: return "Decoder plugin generated an error"; case heif_error_Encoder_plugin_error: return "Encoder plugin generated an error"; case heif_error_Encoding_error: return "Error during encoding or writing output file"; case heif_error_Color_profile_does_not_exist: return "Color profile does not exist"; case heif_error_Plugin_loading_error: return "Error while loading plugin"; } assert(false); return "Unknown error"; } const char* Error::get_error_string(heif_suberror_code err) { switch (err) { case heif_suberror_Unspecified: return "Unspecified"; // --- Invalid_input --- case heif_suberror_End_of_data: return "Unexpected end of file"; case heif_suberror_Invalid_box_size: return "Invalid box size"; case heif_suberror_Invalid_grid_data: return "Invalid grid data"; case heif_suberror_Missing_grid_images: return "Missing grid images"; case heif_suberror_No_ftyp_box: return "No 'ftyp' box"; case heif_suberror_No_idat_box: return "No 'idat' box"; case heif_suberror_No_meta_box: return "No 'meta' box"; case heif_suberror_No_hdlr_box: return "No 'hdlr' box"; case heif_suberror_No_hvcC_box: return "No 'hvcC' box"; case heif_suberror_No_vvcC_box: return "No 'vvcC' box"; case heif_suberror_No_av1C_box: return "No 'av1C' box"; case heif_suberror_No_pitm_box: return "No 'pitm' box"; case heif_suberror_No_ipco_box: return "No 'ipco' box"; case heif_suberror_No_ipma_box: return "No 'ipma' box"; case heif_suberror_No_iloc_box: return "No 'iloc' box"; case heif_suberror_No_iinf_box: return "No 'iinf' box"; case heif_suberror_No_iprp_box: return "No 'iprp' box"; case heif_suberror_No_iref_box: return "No 'iref' box"; case heif_suberror_No_infe_box: return "No 'infe' box"; case heif_suberror_No_pict_handler: return "Not a 'pict' handler"; case heif_suberror_Ipma_box_references_nonexisting_property: return "'ipma' box references a non-existing property"; case heif_suberror_No_properties_assigned_to_item: return "No properties assigned to item"; case heif_suberror_No_item_data: return "Item has no data"; case heif_suberror_Invalid_clean_aperture: return "Invalid clean-aperture specification"; case heif_suberror_Invalid_overlay_data: return "Invalid overlay data"; case heif_suberror_Overlay_image_outside_of_canvas: return "Overlay image outside of canvas area"; case heif_suberror_Auxiliary_image_type_unspecified: return "Type of auxiliary image unspecified"; case heif_suberror_No_or_invalid_primary_item: return "No or invalid primary item"; case heif_suberror_Unknown_color_profile_type: return "Unknown color profile type"; case heif_suberror_Wrong_tile_image_chroma_format: return "Wrong tile image chroma format"; case heif_suberror_Invalid_fractional_number: return "Invalid fractional number"; case heif_suberror_Invalid_image_size: return "Invalid image size"; case heif_suberror_Invalid_pixi_box: return "Invalid pixi box"; case heif_suberror_Wrong_tile_image_pixel_depth: return "Wrong tile image pixel depth"; case heif_suberror_Unknown_NCLX_color_primaries: return "Unknown NCLX color primaries"; case heif_suberror_Unknown_NCLX_transfer_characteristics: return "Unknown NCLX transfer characteristics"; case heif_suberror_Unknown_NCLX_matrix_coefficients: return "Unknown NCLX matrix coefficients"; case heif_suberror_No_mvhd_box: return "No 'mvhd' box"; case heif_suberror_No_trak_box: return "No 'trak' box"; case heif_suberror_No_tkhd_box: return "No 'tkhd' box"; case heif_suberror_No_mdia_box: return "No 'mdia' box"; case heif_suberror_No_mdhd_box: return "No 'mdhd' box"; case heif_suberror_No_minf_box: return "No 'minf' box"; case heif_suberror_No_vmhd_box: return "No 'vmhd' box"; case heif_suberror_No_stbl_box: return "No 'stbl' box"; case heif_suberror_No_stsd_box: return "No 'stsd' box"; case heif_suberror_No_hvc1_box: return "No 'hvc1' box"; case heif_suberror_No_hvcC_moov_box: return "No 'hvcC moov' box"; case heif_suberror_No_ccst_box: return "No 'hvcC ccst' box"; case heif_suberror_No_stsz_box: return "No 'hvcC stsz' box"; case heif_suberror_No_stts_box: return "No 'hvcC stts' box"; case heif_suberror_No_stsc_box: return "No 'hvcC stsc' box"; case heif_suberror_No_stco_box: return "No 'hvcC stco' box"; case heif_suberror_No_stss_box: return "No 'hvcC stss' box"; case heif_suberror_Invalid_region_data: return "Invalid region item data"; case heif_suberror_No_ispe_property: return "No ispe property"; case heif_suberror_Camera_intrinsic_matrix_undefined: return "Camera intrinsic matrix undefined"; case heif_suberror_Camera_extrinsic_matrix_undefined: return "Camera extrinsic matrix undefined"; case heif_suberror_Invalid_J2K_codestream: return "Invalid JPEG 2000 codestream"; case heif_suberror_Decompression_invalid_data: return "Invalid data in generic compression inflation"; case heif_suberror_No_icbr_box: return "No 'icbr' box"; // --- Memory_allocation_error --- case heif_suberror_Security_limit_exceeded: return "Security limit exceeded"; case heif_suberror_Compression_initialisation_error: return "Compression initialisation method error"; // --- Usage_error --- case heif_suberror_Nonexisting_item_referenced: return "Non-existing item ID referenced"; case heif_suberror_Null_pointer_argument: return "NULL argument received"; case heif_suberror_Nonexisting_image_channel_referenced: return "Non-existing image channel referenced"; case heif_suberror_Unsupported_plugin_version: return "The version of the passed plugin is not supported"; case heif_suberror_Unsupported_writer_version: return "The version of the passed writer is not supported"; case heif_suberror_Unsupported_parameter: return "Unsupported parameter"; case heif_suberror_Invalid_parameter_value: return "Invalid parameter value"; case heif_suberror_Invalid_property: return "Invalid property"; case heif_suberror_Item_reference_cycle: return "Image reference cycle"; // --- Unsupported_feature --- case heif_suberror_Unsupported_codec: return "Unsupported codec"; case heif_suberror_Unsupported_image_type: return "Unsupported image type"; case heif_suberror_Unsupported_data_version: return "Unsupported data version"; case heif_suberror_Unsupported_color_conversion: return "Unsupported color conversion"; case heif_suberror_Unsupported_item_construction_method: return "Unsupported item construction method"; case heif_suberror_Unsupported_header_compression_method: return "Unsupported header compression method"; case heif_suberror_Unsupported_generic_compression_method: return "Unsupported generic compression method"; // --- Encoder_plugin_error -- case heif_suberror_Unsupported_bit_depth: return "Unsupported bit depth"; // --- Encoding_error -- case heif_suberror_Cannot_write_output_data: return "Cannot write output data"; case heif_suberror_Encoder_initialization: return "Initialization problem"; case heif_suberror_Encoder_encoding: return "Encoding problem"; case heif_suberror_Encoder_cleanup: return "Cleanup problem"; case heif_suberror_Too_many_regions: return "Too many regions (>255) in an 'rgan' item."; // --- Plugin_loading_error --- case heif_suberror_Plugin_loading_error: return "Plugin file cannot be loaded"; case heif_suberror_Plugin_is_not_loaded: return "Trying to remove a plugin that is not loaded"; case heif_suberror_Cannot_read_plugin_directory: return "Error while scanning the directory for plugins"; case heif_suberror_No_matching_decoder_installed: return "No decoding plugin installed for this compression format"; } assert(false); return cUnknownError; } heif_error Error::error_struct(ErrorBuffer* error_buffer) const { if (error_buffer) { if (error_code == heif_error_Ok) { error_buffer->set_success(); } else { std::stringstream sstr; sstr << get_error_string(error_code) << ": " << get_error_string(sub_error_code); if (!message.empty()) { sstr << ": " << message; } error_buffer->set_error(sstr.str()); } } heif_error err; err.code = error_code; err.subcode = sub_error_code; if (error_buffer) { err.message = error_buffer->get_error(); } else { err.message = cUnknownError; } return err; }