int heif_extractor_extract(heif_source_h source, heif_itemtable_h *item_table)
{
int ret = LIBHEIF_ERROR_NONE;
- heif_extractor_t *_extractor = NULL;
+ g_autofree heif_extractor_t *_extractor = NULL;
heif_retvm_if_failed(source, LIBHEIF_ERROR_INVALID_PARAMETER, "invalid source");
heif_retvm_if_failed(item_table, LIBHEIF_ERROR_INVALID_PARAMETER, "invalid item_table");
ret = __extractor_read_metadata(_extractor);
if (ret != LIBHEIF_ERROR_NONE) {
heif_error("__extractor_read_metadata fail %d", ret);
- g_free(_extractor);
return ret;
}
- if (_extractor->is_heic) {
- *item_table = _extractor->item_table;
- } else {
- heif_itemtable_destroy(_extractor->item_table);
- ret = LIBHEIF_ERROR_INVALID_PARAMETER;
- }
+ *item_table = _extractor->item_table;
- g_free(_extractor);
-
- return ret;
+ return LIBHEIF_ERROR_NONE;
}
static gint __extractor_compare_brand(gconstpointer data, gconstpointer user_data)
ret = heif_itemtable_parse(extractor->item_table, chunk_type, data_offset, chunk_data_size);
if (ret != LIBHEIF_ERROR_NONE) {
heif_error("heif_itemtable_parse fail %d", ret);
- heif_itemtable_destroy(extractor->item_table);
- extractor->item_table = NULL;
return ret;
}
}
}
+ if (ret != LIBHEIF_ERROR_NONE) {
+ heif_itemtable_destroy(extractor->item_table);
+ extractor->item_table = NULL;
+ }
+
heif_debug_fleave();
return ret;
static int __heif_itemtable_parse_pitm_box(heif_itemtable_t *item_table, off_t offset, size_t size);
static int __heif_itemtable_parse_idat_box(heif_itemtable_t *item_table, off_t offset, size_t size);
static int __heif_itemtable_parse_iref_box(heif_itemtable_t *item_table, off_t offset, size_t size);
+static void __free_image_item(gpointer data);
int heif_itemtable_create(heif_itemtable_h *handle, heif_source_h source)
// release item table resource
g_slist_free(item_table->displayables);
- g_slist_free_full(item_table->image_items, g_free);
+ g_slist_free_full(item_table->image_items, __free_image_item);
g_slist_free_full(item_table->exif_items, g_free);
g_free(handle);
return __build_image_if_possible(item_table);
}
+
+static void __free_image_item(gpointer data)
+{
+ _image_item_t *image_item = (_image_item_t *)data;
+
+ heif_retm_if_failed(data);
+
+ g_free(image_item->hvc_config.nal_unit.data);
+ g_free(image_item);
+}