#include <stdio.h>
#include <glib.h>
+#include <heif.h>
#include "mm_util_private.h"
#include "mm_util_magick.h"
static unsigned char gIfegGIFHeader[] = { "GIF" };
static unsigned char gIfegBMPHeader[] = { 0x42, 0x4D };
static unsigned char gIfegWBMPHeader[] = { 0x00, 0x00 };
+static unsigned char gIfegHEIFHeader[] = { 'f', 't', 'y', 'p' };
static const image_signature_t signature_info[] = {
{ IMG_CODEC_JPEG, gIfegJPEGHeader, 2, 0},
{ IMG_CODEC_PNG, gIfegPNGHeader, 8, 0},
{ IMG_CODEC_GIF, gIfegGIFHeader, 3, 0},
{ IMG_CODEC_BMP, gIfegBMPHeader, 2, 0},
- { IMG_CODEC_WBMP, gIfegWBMPHeader, 2, 0}
+ { IMG_CODEC_HEIF, gIfegHEIFHeader, 4, 4},
+ { IMG_CODEC_WBMP, gIfegWBMPHeader, 2, 0},
};
static const unsigned int signature_info_num = sizeof(signature_info) / sizeof(image_signature_t);
return MM_UTIL_ERROR_NONE;
}
+static int __mm_util_info_get_heif_size(const char *path, unsigned int *width, unsigned int *height)
+{
+ int ret = LIBHEIF_ERROR_NONE;
+ heif_image_info_h image_info = NULL;
+ int _width, _height = 0;
+ const gchar *extension = g_strrstr(path, ".");
+
+ mm_util_retvm_if(!path, MM_UTIL_ERROR_INVALID_PARAMETER, "invalid path");
+ mm_util_retvm_if(!width, MM_UTIL_ERROR_INVALID_PARAMETER, "invalid width");
+ mm_util_retvm_if(!height, MM_UTIL_ERROR_INVALID_PARAMETER, "invalid height");
+
+ // heif valid check
+ if (!extension || (g_ascii_strcasecmp(extension, ".heic") != 0)) {
+ mm_util_warn("invalid HEIF");
+ return MM_UTIL_ERROR_INVALID_PARAMETER;
+ }
+
+ ret = heif_get_image_info_from_file(path, &image_info);
+ if (ret != LIBHEIF_ERROR_NONE) {
+ mm_util_warn("Failed to get image info from %s file [%d]", path, ret);
+ return MM_UTIL_ERROR_INVALID_OPERATION;
+ }
+
+ ret = heif_image_info_get_attrs(image_info, HEIF_IMAGE_WIDTH, &_width, HEIF_IMAGE_HEIGHT, &_height, NULL);
+ heif_image_info_free(image_info);
+
+ if (ret != LIBHEIF_ERROR_NONE) {
+ mm_util_sec_debug("Failed to get width & height for %s file [%d]", path, ret);
+ return MM_UTIL_ERROR_INVALID_OPERATION;
+ }
+
+ *width = _width;
+ *height = _height;
+
+ return MM_UTIL_ERROR_NONE;
+}
+
static int __mm_util_info_get_wbmp_size(const unsigned char *data, unsigned int data_len, const char *path, unsigned int *width, unsigned int *height)
{
const gchar *extension = g_strrstr(path, ".");
case IMG_CODEC_GIF:
ret = __mm_util_info_get_gif_size(data, MINIMUM_HEADER_BYTES, &_width, &_height);
break;
+ case IMG_CODEC_HEIF:
+ ret = __mm_util_info_get_heif_size(path, &_width, &_height);
+ break;
case IMG_CODEC_WBMP:
ret = __mm_util_info_get_wbmp_size(data, MINIMUM_HEADER_BYTES, path, &_width, &_height);
break;