summaryrefslogtreecommitdiff
path: root/src/media-thumb-internal.c
diff options
context:
space:
mode:
authorMinje Ahn <minje.ahn@samsung.com>2015-08-07 09:40:46 +0900
committerMinje Ahn <minje.ahn@samsung.com>2015-08-07 10:10:15 +0900
commit7adbb6954d7f05fd02b9cded3741ce6ed2c9226b (patch)
tree5315a9e75f2283f559b18a8375f093b6eca10a3e /src/media-thumb-internal.c
parent41f405edc8f31d877615c580ed6eb308d7eaebec (diff)
downloadlibmedia-thumbnail-7adbb6954d7f05fd02b9cded3741ce6ed2c9226b.tar.gz
libmedia-thumbnail-7adbb6954d7f05fd02b9cded3741ce6ed2c9226b.tar.bz2
libmedia-thumbnail-7adbb6954d7f05fd02b9cded3741ce6ed2c9226b.zip
Separate CMakeFiles for apply fPIE option Remove unused code Remove thumb_type Modify jpeg thumbnail creation logic when exif thumbnail is smaller than request thumbnail size Add scale down logic when request huge size image Fix bugs, memory leaks Remove unused parameters in function Change thumb path creation API position Remove thumbnail folder creation API Rename some functions Change-Id: I0e13d393dd524b61bcf44722c33b6f270649b732 Signed-off-by: Minje Ahn <minje.ahn@samsung.com>
Diffstat (limited to 'src/media-thumb-internal.c')
-rwxr-xr-xsrc/media-thumb-internal.c674
1 files changed, 327 insertions, 347 deletions
diff --git a/src/media-thumb-internal.c b/src/media-thumb-internal.c
index 5ed752d..04c92c4 100755
--- a/src/media-thumb-internal.c
+++ b/src/media-thumb-internal.c
@@ -52,12 +52,17 @@
#define GLOBAL_USER 0 //#define tzplatform_getenv(TZ_GLOBAL) //TODO
#define MEDIA_THUMB_ROUND_UP_8(num) (((num)+7)&~7)
-int _media_thumb_get_proper_thumb_size(media_thumb_type thumb_type,
- int orig_w, int orig_h,
+int _media_thumb_resize_data(unsigned char *src_data,
+ int src_width,
+ int src_height,
+ mm_util_img_format src_format,
+ media_thumb_info *thumb_info,
+ int dst_width,
+ int dst_height);
+
+int _media_thumb_get_proper_thumb_size(int orig_w, int orig_h,
int *thumb_w, int *thumb_h)
{
- thumb_dbg("orig w: %d orig h: %d thumb type: %d", orig_w, orig_h, thumb_type);
-
BOOL portrait = FALSE;
double ratio;
@@ -67,23 +72,13 @@ int _media_thumb_get_proper_thumb_size(media_thumb_type thumb_type,
/* Set smaller length to default size */
if (portrait) {
- if (orig_w < _media_thumb_get_width(thumb_type)) {
+ if (orig_w < *thumb_w)
*thumb_w = orig_w;
- } else {
- *thumb_w = _media_thumb_get_width(thumb_type);
- }
-
ratio = (double)orig_h / (double)orig_w;
*thumb_h = *thumb_w * ratio;
-
} else {
-
- if (orig_h < _media_thumb_get_width(thumb_type)) {
+ if (orig_h < *thumb_h)
*thumb_h = orig_h;
- } else {
- *thumb_h = _media_thumb_get_width(thumb_type);
- }
-
ratio = (double)orig_w / (double)orig_h;
*thumb_w = *thumb_h * ratio;
}
@@ -138,27 +133,18 @@ int _media_thumb_get_exif_info(ExifData *ed, char *buf, int max_size, int *value
return MS_MEDIA_ERR_NONE;
}
-int _media_thumb_get_thumb_from_exif(ExifData *ed,
- const char *file_full_path,
- int orientation,
- int required_width,
- int required_height,
- media_thumb_info *thumb_info, uid_t uid)
+static int _media_thumb_get_data_from_exif(ExifData *ed,
+ void **thumb_data,
+ int *thumb_size,
+ int *thumb_width,
+ int *thumb_height,
+ int *origin_width,
+ int *origin_height)
{
ExifEntry *entry;
ExifIfd ifd;
ExifTag tag;
- int err = -1;
- int size = 0;
- int thumb_width = 0;
- int thumb_height = 0;
- void *thumb = NULL;
-
- if (ed == NULL) {
- return -1;
- }
-
ExifByteOrder byte_order = exif_data_get_byte_order(ed);
ifd = EXIF_IFD_1;
@@ -182,241 +168,239 @@ int _media_thumb_get_thumb_from_exif(ExifData *ed,
return MS_MEDIA_ERR_INVALID_PARAMETER;
}
+ /* copy the real thumbnail data from exif data */
+ if (ed->data && ed->size) {
+ //thumb_dbg("Size: %d, thumb: 0x%x", ed->size, ed->data);
+ *thumb_data = (char *)malloc(ed->size);
+
+ if (*thumb_data == NULL) {
+ thumb_dbg("malloc failed!");
+ return MS_MEDIA_ERR_INVALID_PARAMETER;
+ }
+
+ memcpy(*thumb_data, (void *)ed->data, ed->size);
+ *thumb_size = ed->size;
+ } else {
+ thumb_dbg("data is NULL");
+ return MS_MEDIA_ERR_INVALID_PARAMETER;
+ }
+
/* Get width and height of thumbnail */
tag = EXIF_TAG_IMAGE_WIDTH;
entry = exif_content_get_entry(ed->ifd[ifd], tag);
if (entry) {
/* Get the contents of the tag in human-readable form */
- ExifShort value = exif_get_short(entry->data, byte_order);
- //thumb_dbg("%s: %d\n", exif_tag_get_name_in_ifd(tag,ifd), value);
+ char width[10] = {0,};
+ exif_entry_get_value(entry,width,10);
- thumb_width = value;
+ *thumb_width = atoi(width);
+ } else {
+ thumb_warn("EXIF_TAG_IMAGE_WIDTH does not exist");
+ *thumb_width = 0;
}
tag = EXIF_TAG_IMAGE_LENGTH;
entry = exif_content_get_entry(ed->ifd[ifd], tag);
if (entry) {
/* Get the contents of the tag in human-readable form */
- ExifShort value = exif_get_short(entry->data, byte_order);
- //thumb_dbg("%s: %d\n", exif_tag_get_name_in_ifd(tag,ifd), value);
-
- thumb_height = value;
- }
+ char height[10] = {0,};
+ exif_entry_get_value(entry,height,10);
- if (ed->data && ed->size) {
- //thumb_dbg("Size: %d, thumb: 0x%x\n", ed->size, ed->data);
- thumb = (char *)malloc(ed->size);
-
- if (thumb == NULL) {
- thumb_dbg("malloc failed!");
- return -1;
- }
-
- memcpy(thumb, (void *)ed->data, ed->size);
- size = ed->size;
+ *thumb_height = atoi(height);
} else {
- thumb_dbg("data is NULL");
- return -1;
+ thumb_warn("EXIF_TAG_IMAGE_LENGTH does not exist");
+ *thumb_height = 0;
}
+ thumb_dbg("thumb width : height [%d:%d]", *thumb_width, *thumb_height);
+
/* Get width and height of original image from exif */
ifd = EXIF_IFD_EXIF;
tag = EXIF_TAG_PIXEL_X_DIMENSION;
entry = exif_content_get_entry(ed->ifd[ifd], tag);
if (entry) {
- ExifShort value = exif_get_short(entry->data, byte_order);
- //thumb_dbg("%s: %d\n", exif_tag_get_name_in_ifd(tag,ifd), value);
- thumb_info->origin_width = value;
+ char width[10] = {0,};
+ exif_entry_get_value(entry,width,10);
+
+ *origin_width = atoi(width);
} else {
- thumb_dbg("entry is NULL");
+ thumb_warn("EXIF_TAG_PIXEL_X_DIMENSION does not exist");
+ *origin_width = 0;
}
tag = EXIF_TAG_PIXEL_Y_DIMENSION;
entry = exif_content_get_entry(ed->ifd[ifd], tag);
if (entry) {
- ExifShort value = exif_get_short(entry->data, byte_order);
- //thumb_dbg("%s: %d\n", exif_tag_get_name_in_ifd(tag,ifd), value);
- thumb_info->origin_height = value;
- } else {
- thumb_dbg("entry is NULL");
- }
-
- char thumb_path[1024];
+ char height[10] = {0,};
+ exif_entry_get_value(entry,height,10);
- err =
- _media_thumb_get_hash_name(file_full_path,
- thumb_path,
- sizeof(thumb_path), uid);
- if (err < 0) {
- thumb_dbg("_media_thumb_get_hash_name failed\n");
- SAFE_FREE(thumb);
- return err;
- }
-
- thumb_dbg("Thumb is :%s", thumb_path);
-
- int nwrite;
- int fd = open(thumb_path, O_RDWR | O_CREAT | O_EXCL | O_SYNC, 0644);
- if (fd < 0) {
- if (errno == EEXIST) {
- thumb_dbg("thumb alread exist!");
- } else {
- thumb_dbg("open failed\n");
- SAFE_FREE(thumb);
- return -1;
- }
+ *origin_height = atoi(height);
} else {
- nwrite = write(fd, thumb, size);
- if (nwrite < 0) {
- thumb_dbg("write failed\n");
- close(fd);
-
- SAFE_FREE(thumb);
- return -1;
- }
- close(fd);
+ thumb_warn("EXIF_TAG_PIXEL_Y_DIMENSION does not exist");
+ *origin_height = 0;
}
- SAFE_FREE(thumb);
+ return MS_MEDIA_ERR_NONE;
+}
+int _media_thumb_get_thumb_from_exif(ExifData *ed,
+ const char *file_full_path,
+ const char *thumb_path,
+ int orientation,
+ int required_width,
+ int required_height,
+ media_thumb_info *thumb_info)
+{
+ int err = MS_MEDIA_ERR_NONE;
+ int size = 0;
+ int thumb_width = 0;
+ int thumb_height = 0;
+ int origin_width = 0;
+ int origin_height = 0;
+ void *thumb = NULL;
+ bool is_rotated = (orientation == ROT_90 || orientation == ROT_180 || orientation == ROT_270) ? TRUE : FALSE;
mm_util_jpeg_yuv_data decoded = {0,};
- err = mm_util_decode_from_jpeg_file(&decoded, thumb_path, MM_UTIL_JPEG_FMT_RGB888);
- if (err < 0) {
- thumb_dbg("mm_util_decode_from_jpeg_turbo_memory failed : %d", err);
- return err;
+ if (ed == NULL) {
+ return MS_MEDIA_ERR_INVALID_PARAMETER;
}
- //thumb_dbg("size:%d, w:%d, h:%d\n", decoded.size, decoded.width, decoded.height);
-
- thumb_width = decoded.width;
- thumb_height = decoded.height;
-
- media_thumb_type thumb_type;
- int need_resize = 0;
- unsigned int buf_size = decoded.size;
-
- if (required_width == _media_thumb_get_width(MEDIA_THUMB_LARGE)) {
- thumb_type = MEDIA_THUMB_LARGE;
- } else {
- thumb_type = MEDIA_THUMB_SMALL;
- }
+ err = _media_thumb_get_data_from_exif(ed,
+ &thumb,
+ &size,
+ &thumb_width,
+ &thumb_height,
+ &origin_width,
+ &origin_height);
- if (thumb_type == MEDIA_THUMB_LARGE) {
- if (thumb_width < _media_thumb_get_width(MEDIA_THUMB_LARGE)) {
- thumb_dbg("Thumb data in exif is too small for MEDIA_THUMB_LARGE");
- SAFE_FREE(decoded.data);
- return -1;
- }
- } else {
- if (thumb_width > _media_thumb_get_width(MEDIA_THUMB_SMALL)) {
- need_resize = 1;
- }
+ if (err != MS_MEDIA_ERR_NONE) {
+ thumb_err("There is no exif data");
+ return err;
}
- if (need_resize == 1) {
- int resized_w = _media_thumb_get_width(MEDIA_THUMB_LARGE);
- int resized_h = _media_thumb_get_height(MEDIA_THUMB_LARGE);
+ thumb_dbg("thumb width : height [%d:%d]", thumb_width, thumb_height);
+ thumb_dbg("origin width : height [%d:%d]", origin_width, origin_height);
+ thumb_info->origin_height = origin_height;
+ thumb_info->origin_width = origin_width;
- err = mm_util_get_image_size(MM_UTIL_IMG_FMT_RGB888, resized_w, resized_h, &buf_size);
- if (err < 0) {
- thumb_dbg("mm_util_get_image_size failed : %d", err);
+ if (thumb_width < required_width) {
+ thumb_err("Thumb data in exif is too small");
+ SAFE_FREE(thumb);
+ return MS_MEDIA_ERR_INVALID_PARAMETER;
+ }
- SAFE_FREE(decoded.data);
+ if (is_rotated) {
+ err = mm_util_decode_from_jpeg_memory(&decoded, thumb, size, MM_UTIL_JPEG_FMT_RGB888);
+ SAFE_FREE(thumb);
+ if (err != MS_MEDIA_ERR_NONE) {
+ thumb_err("mm_util_decode_from_jpeg_turbo_memory failed : %d", err);
return err;
}
- //thumb_dbg("size(RGB888) : %d", buf_size);
-
- unsigned char *dst = (unsigned char *)malloc(buf_size);
- if (dst == NULL) {
- thumb_err("Failed to allocate memory!");
- SAFE_FREE(decoded.data);
- return -1;
- }
+ thumb_width = decoded.width;
+ thumb_height = decoded.height;
- if (mm_util_resize_image(decoded.data, thumb_width,
- thumb_height, MM_UTIL_IMG_FMT_RGB888,
- dst, (unsigned int *)&resized_w,
- (unsigned int *)&resized_h) < 0) {
- thumb_err("Failed to resize the thumbnails");
+ if (is_rotated) {
+ /* Start to decode to rotate */
+ unsigned char *rotated = NULL;
+ unsigned int r_w = decoded.height;
+ unsigned int r_h = decoded.width;
+ unsigned int r_size = 0;
+ mm_util_img_rotate_type rot_type = MM_UTIL_ROTATE_0;
- SAFE_FREE(decoded.data);
- SAFE_FREE(dst);
+ int i, rotate_cnt = 0;
- return -1;
- }
+ rot_type = MM_UTIL_ROTATE_90;
+ if (orientation == ROT_90) {
+ rotate_cnt = 1;
+ } else if (orientation == ROT_180) {
+ rotate_cnt = 2;
+ } else if (orientation == ROT_270) {
+ rotate_cnt = 3;
+ }
- SAFE_FREE(decoded.data);
- decoded.data = dst;
- decoded.width = thumb_width = resized_w;
- decoded.height = thumb_height = resized_h;
- }
+ for (i = 0; i < rotate_cnt; i++) {
+ if (i == 1) {
+ r_w = decoded.width;
+ r_h = decoded.height;
+ }
- if (orientation == ROT_90 || orientation == ROT_180 || orientation == ROT_270) {
- /* Start to decode to rotate */
- unsigned char *rotated = NULL;
- unsigned int r_w = decoded.height;
- unsigned int r_h = decoded.width;
- unsigned int r_size = 0;
- mm_util_img_rotate_type rot_type = MM_UTIL_ROTATE_0;
+ err = mm_util_get_image_size(MM_UTIL_IMG_FMT_RGB888, r_w, r_h, &r_size);
+ if (err != MS_MEDIA_ERR_NONE) {
+ thumb_err("mm_util_get_image_size failed : %d", err);
+ SAFE_FREE(decoded.data);
+ return err;
+ }
- if (orientation == ROT_90) {
- rot_type = MM_UTIL_ROTATE_90;
- } else if (orientation == ROT_180) {
- rot_type = MM_UTIL_ROTATE_180;
- r_w = decoded.width;
- r_h = decoded.height;
- } else if (orientation == ROT_270) {
- rot_type = MM_UTIL_ROTATE_270;
- }
+ rotated = (unsigned char *)malloc(r_size);
+ err = mm_util_rotate_image(decoded.data, decoded.width, decoded.height,
+ MM_UTIL_IMG_FMT_RGB888,
+ rotated, &r_w, &r_h,
+ rot_type);
- err = mm_util_get_image_size(MM_UTIL_IMG_FMT_RGB888, r_w, r_h, &r_size);
- if (err < 0) {
- thumb_dbg("mm_util_get_image_size failed : %d", err);
- SAFE_FREE(decoded.data);
- return err;
- }
+ if (err != MS_MEDIA_ERR_NONE) {
+ thumb_err("mm_util_rotate_image failed : %d", err);
+ SAFE_FREE(decoded.data);
+ SAFE_FREE(rotated);
+ return err;
+ } else {
+ thumb_err("mm_util_rotate_image succeed");
+ }
- //thumb_dbg("Size of Rotated : %d", r_size);
+ SAFE_FREE(decoded.data);
+ decoded.data = rotated;
+ decoded.width = r_w;
+ decoded.height = r_h;
+ }
- rotated = (unsigned char *)malloc(r_size);
- err = mm_util_rotate_image(decoded.data, decoded.width, decoded.height,
- MM_UTIL_IMG_FMT_RGB888,
- rotated, &r_w, &r_h,
- rot_type);
-
- if (err < 0) {
- thumb_err("mm_util_rotate_image failed : %d", err);
- SAFE_FREE(decoded.data);
- SAFE_FREE(rotated);
- return err;
+ //thumb_dbg("Width : %d, Height : %d", r_w, r_h);
+ thumb_info->data = rotated;
+ thumb_info->size = r_size;
+ thumb_info->width = r_w;
+ thumb_info->height = r_h;
} else {
- thumb_dbg("mm_util_rotate_image succeed");
+ thumb_warn("Unknown orientation");
+ SAFE_FREE(decoded.data);
+ return MS_MEDIA_ERR_INVALID_PARAMETER;
}
+ }else {
+ /*in this case, just write raw data in file */
+ thumb_dbg_slog("Thumb is :%s", thumb_path);
+
+ int nwrite;
+ int fd = open(thumb_path, O_RDWR | O_CREAT | O_EXCL | O_SYNC, 0644);
+ if (fd < 0) {
+ if (errno == EEXIST) {
+ thumb_err("thumb alread exist!");
+ } else {
+ thumb_err("open failed");
+ SAFE_FREE(thumb);
+ return MS_MEDIA_ERR_INVALID_PARAMETER;
+ }
+ } else {
+ nwrite = write(fd, thumb, size);
+ if (nwrite < 0) {
+ thumb_err("write failed");
+ close(fd);
- SAFE_FREE(decoded.data);
+ SAFE_FREE(thumb);
+ return MS_MEDIA_ERR_INVALID_PARAMETER;
+ }
+ close(fd);
+ }
- //thumb_dbg("Width : %d, Height : %d", r_w, r_h);
- thumb_info->data = rotated;
- thumb_info->size = r_size;
- thumb_info->width = r_w;
- thumb_info->height = r_h;
- } else if (orientation == NORMAL) {
- thumb_info->data = decoded.data;
- thumb_info->size = buf_size;
+ SAFE_FREE(thumb);
+ thumb_info->data = NULL;
+ thumb_info->size = size;
thumb_info->width = thumb_width;
thumb_info->height = thumb_height;
- } else {
- thumb_warn("Unknown orientation");
- SAFE_FREE(decoded.data);
- return -1;
+ thumb_info->is_saved = TRUE;
}
- return 0;
+ return err;
}
int _media_thumb_resize_data(unsigned char *src_data,
@@ -455,8 +439,12 @@ int _media_thumb_resize_data(unsigned char *src_data,
thumb_info->width = thumb_width;
thumb_info->height = thumb_height;
thumb_info->data = malloc(buf_size);
- memcpy(thumb_info->data, dst, buf_size);
-
+ if(thumb_info->data != NULL) {
+ memcpy(thumb_info->data, dst, buf_size);
+ } else {
+ thumb_err("malloc fails");
+ return MS_MEDIA_ERR_OUT_OF_MEMORY;
+ }
SAFE_FREE(dst);
return MS_MEDIA_ERR_NONE;
@@ -553,17 +541,8 @@ int _media_thumb_decode_with_evas(const char *origin_path,
//thumb_dbg("rotated - origin width:%d, origin height:%d", rotated_orig_w, rotated_orig_h);
int err = MS_MEDIA_ERR_NONE;
- media_thumb_type thumb_type;
-
- if (thumb_width == _media_thumb_get_width(MEDIA_THUMB_LARGE)) {
- thumb_type = MEDIA_THUMB_LARGE;
- } else {
- thumb_type = MEDIA_THUMB_SMALL;
- }
- err = _media_thumb_get_proper_thumb_size(thumb_type,
- rotated_orig_w, rotated_orig_h,
- &thumb_width, &thumb_height);
+ err = _media_thumb_get_proper_thumb_size(rotated_orig_w, rotated_orig_h, &thumb_width, &thumb_height);
if (err != MS_MEDIA_ERR_NONE) {
thumb_err("_media_thumb_get_proper_thumb_size failed: %d", err);
ecore_evas_free(resize_img_ee);
@@ -755,7 +734,8 @@ int _media_thumb_convert_format(media_thumb_info *thumb_info,
}
int _media_thumb_agif(const char *origin_path,
- ImgImageInfo *image_info,
+ int image_width,
+ int image_height,
int thumb_width,
int thumb_height,
media_thumb_format format,
@@ -763,24 +743,15 @@ int _media_thumb_agif(const char *origin_path,
{
int err = MS_MEDIA_ERR_NONE;
unsigned int *thumb = NULL;
- media_thumb_type thumb_type;
- thumb = ImgGetFirstFrameAGIFAtSize(origin_path, image_info);
+ thumb = ImgGetFirstFrameAGIFAtSize(origin_path, image_width, image_height);
if (!thumb) {
thumb_err("Frame data is NULL!!");
return MS_MEDIA_ERR_INTERNAL;
}
- if (thumb_width == _media_thumb_get_width(MEDIA_THUMB_LARGE)) {
- thumb_type = MEDIA_THUMB_LARGE;
- } else {
- thumb_type = MEDIA_THUMB_SMALL;
- }
-
- err = _media_thumb_get_proper_thumb_size(thumb_type,
- thumb_info->origin_width, thumb_info->origin_height,
- &thumb_width, &thumb_height);
+ err = _media_thumb_get_proper_thumb_size(thumb_info->origin_width, thumb_info->origin_height, &thumb_width, &thumb_height);
if (err != MS_MEDIA_ERR_NONE) {
thumb_err("_media_thumb_get_proper_thumb_size failed: %d", err);
SAFE_FREE(thumb);
@@ -788,8 +759,8 @@ int _media_thumb_agif(const char *origin_path,
}
err = _media_thumb_resize_data((unsigned char *)thumb,
- image_info->width,
- image_info->height,
+ image_width,
+ image_height,
MM_UTIL_IMG_FMT_RGB888,
thumb_info,
thumb_width,
@@ -910,11 +881,11 @@ int _media_thumb_gif(const char *origin_path,
}
int _media_thumb_jpeg(const char *origin_path,
+ const char *thumb_path,
int thumb_width,
int thumb_height,
media_thumb_format format,
- media_thumb_info *thumb_info,
- uid_t uid)
+ media_thumb_info *thumb_info)
{
int err = MS_MEDIA_ERR_NONE;
ExifData *ed = NULL;
@@ -933,7 +904,7 @@ int _media_thumb_jpeg(const char *origin_path,
}
/* Second, Get thumb from exif */
- err = _media_thumb_get_thumb_from_exif(ed, origin_path, orientation, thumb_width, thumb_height, thumb_info, uid);
+ err = _media_thumb_get_thumb_from_exif(ed, origin_path, thumb_path, orientation, thumb_width, thumb_height, thumb_info);
if (err != MS_MEDIA_ERR_NONE) {
thumb_dbg("_media_thumb_get_thumb_from_exif failed");
@@ -941,18 +912,31 @@ int _media_thumb_jpeg(const char *origin_path,
thumb_done = 1;
thumb_dbg("_media_thumb_get_thumb_from_exif succeed");
- mm_util_img_format dst_format = _media_thumb_get_format(format);
+ /* The case that original image's size is not in exif header. Use evas to get w/h */
+ if (thumb_info->origin_width == 0 || thumb_info->origin_height == 0) {
+ thumb_warn("original image's size is not in exif header. Use evas to get w/h");
+ err = _media_thumb_get_wh_with_evas(origin_path, &(thumb_info->origin_width), &(thumb_info->origin_height));
+ if (err != MS_MEDIA_ERR_NONE) {
+ thumb_err("Couldn't get w/h using evas : %s", origin_path);
+ } else {
+ thumb_dbg("origin w : %d, origin h : %d", thumb_info->origin_width, thumb_info->origin_height);
+ }
+ }
+
+ if (thumb_info->is_saved == FALSE) {
+ mm_util_img_format dst_format = _media_thumb_get_format(format);
- err = _media_thumb_convert_data(thumb_info,
- thumb_info->width,
- thumb_info->height,
- MM_UTIL_IMG_FMT_RGB888,
- dst_format);
+ err = _media_thumb_convert_data(thumb_info,
+ thumb_info->width,
+ thumb_info->height,
+ MM_UTIL_IMG_FMT_RGB888,
+ dst_format);
- if (err != MS_MEDIA_ERR_NONE) {
- thumb_err("_media_thumb_convert_data failed : %d", err);
- exif_data_unref(ed);
- return err;
+ if (err != MS_MEDIA_ERR_NONE) {
+ thumb_err("_media_thumb_convert_data failed : %d", err);
+ exif_data_unref(ed);
+ return err;
+ }
}
}
@@ -980,11 +964,11 @@ int _media_thumb_jpeg(const char *origin_path,
}
int _media_thumb_jpeg_for_raw(const char *origin_path,
+ const char *thumb_path,
int thumb_width,
int thumb_height,
media_thumb_format format,
- media_thumb_info *thumb_info,
- uid_t uid)
+ media_thumb_info *thumb_info)
{
int err = MS_MEDIA_ERR_NONE;
int orientation = NORMAL;
@@ -1006,23 +990,26 @@ int _media_thumb_jpeg_for_raw(const char *origin_path,
}
int _media_thumb_image(const char *origin_path,
+ const char *thumb_path,
int thumb_width,
int thumb_height,
media_thumb_format format,
media_thumb_info *thumb_info,
- bool is_raw,
- uid_t uid)
+ bool is_req_raw)
{
int err = MS_MEDIA_ERR_NONE;
- int image_type = 0;
- int origin_w = 0;
- int origin_h = 0;
- ImgImageInfo image_info = { 0 };
+ ImgCodecType image_type = 0;
+ unsigned int origin_w = 0;
+ unsigned int origin_h = 0;
- image_type = ImgGetInfoFile(origin_path, &image_info);
+ err = ImgGetImageInfoForThumb(origin_path, &image_type, &origin_w, &origin_h);
+
+ if (err != MS_MEDIA_ERR_NONE){
+ thumb_warn("Getting image info is failed err: %d", err);
+ }
- thumb_info->origin_width = origin_w = image_info.width;
- thumb_info->origin_height = origin_h = image_info.height;
+ thumb_info->origin_width = origin_w;
+ thumb_info->origin_height = origin_h;
//thumb_dbg("image type is %d, width:%d, height:%d", image_type, origin_w, origin_h);
@@ -1033,12 +1020,12 @@ int _media_thumb_image(const char *origin_path,
}
if (image_type == IMG_CODEC_AGIF) {
- err = _media_thumb_agif(origin_path, &image_info, thumb_width, thumb_height, format, thumb_info);
+ err = _media_thumb_agif(origin_path, origin_w, origin_h, thumb_width, thumb_height, format, thumb_info);
} else if (image_type == IMG_CODEC_JPEG) {
- if(is_raw) {
- err = _media_thumb_jpeg_for_raw(origin_path, thumb_width, thumb_height, format, thumb_info, uid);
+ if(is_req_raw == TRUE) {
+ err = _media_thumb_jpeg_for_raw(origin_path, thumb_path, thumb_width, thumb_height, format, thumb_info);
} else {
- err = _media_thumb_jpeg(origin_path, thumb_width, thumb_height, format, thumb_info, uid);
+ err = _media_thumb_jpeg(origin_path, thumb_path, thumb_width, thumb_height, format, thumb_info);
}
} else if (image_type == IMG_CODEC_PNG) {
err = _media_thumb_png(origin_path, thumb_width, thumb_height, format, thumb_info);
@@ -1088,8 +1075,7 @@ int _media_thumb_video(const char *origin_path,
int thumb_width,
int thumb_height,
media_thumb_format format,
- media_thumb_info *thumb_info,
- uid_t uid)
+ media_thumb_info *thumb_info)
{
int err = MS_MEDIA_ERR_NONE;
@@ -1104,7 +1090,59 @@ int _media_thumb_video(const char *origin_path,
bool drm_type = FALSE;
is_drm = drm_type;
- err = mm_file_create_content_attrs(&content, origin_path);
+
+ /* Get Content Tag attribute for orientatin */
+ MMHandleType tag = (MMHandleType) NULL;
+ char *p = NULL;
+ int cdis_value = 0;
+ err = mm_file_create_tag_attrs(&tag, origin_path);
+ mm_util_img_rotate_type rot_type = MM_UTIL_ROTATE_0;
+
+ if (err == MM_ERROR_NONE) {
+ err = mm_file_get_attrs(tag, &err_msg, MM_FILE_TAG_ROTATE, &p, &size, NULL);
+ if (err == MM_ERROR_NONE && size >= 0) {
+ if (p == NULL) {
+ rot_type = MM_UTIL_ROTATE_0;
+ } else {
+ if (strncmp(p, "90", size) == 0) {
+ rot_type = MM_UTIL_ROTATE_90;
+ } else if(strncmp(p, "180", size) == 0) {
+ rot_type = MM_UTIL_ROTATE_180;
+ } else if(strncmp(p, "270", size) == 0) {
+ rot_type = MM_UTIL_ROTATE_270;
+ } else {
+ rot_type = MM_UTIL_ROTATE_0;
+ }
+ }
+ thumb_dbg("There is tag rotate : %d", rot_type);
+ } else {
+ thumb_dbg("There is NOT tag rotate");
+ rot_type = MM_UTIL_ROTATE_0;
+ SAFE_FREE(err_msg);
+ }
+
+ err = mm_file_get_attrs(tag, &err_msg, MM_FILE_TAG_CDIS, &cdis_value, NULL);
+ if (err != MM_ERROR_NONE) {
+ cdis_value = 0;
+ SAFE_FREE(err_msg);
+ }
+
+ } else {
+ rot_type = MM_UTIL_ROTATE_0;
+ cdis_value = 0;
+ }
+
+ err = mm_file_destroy_tag_attrs(tag);
+ if (err != MM_ERROR_NONE) {
+ thumb_err("fail to free tag attr - err(%x)", err);
+ }
+
+ if (cdis_value == 1) {
+ thumb_warn("This is CDIS vlaue 1");
+ err = mm_file_create_content_attrs_safe(&content, origin_path);
+ } else {
+ err = mm_file_create_content_attrs(&content, origin_path);
+ }
if (err != MM_ERROR_NONE) {
thumb_err("mm_file_create_content_attrs fails : %d", err);
@@ -1148,17 +1186,10 @@ int _media_thumb_video(const char *origin_path,
return MS_MEDIA_ERR_INTERNAL;
}
- media_thumb_type thumb_type;
- if (thumb_width == _media_thumb_get_width(MEDIA_THUMB_LARGE)) {
- thumb_type = MEDIA_THUMB_LARGE;
- } else {
- thumb_type = MEDIA_THUMB_SMALL;
- }
-
thumb_info->origin_width = width;
thumb_info->origin_height = height;
- err = _media_thumb_get_proper_thumb_size(thumb_type, width, height, &thumb_width, &thumb_height);
+ err = _media_thumb_get_proper_thumb_size(width, height, &thumb_width, &thumb_height);
if (width > thumb_width || height > thumb_height) {
err = _media_thumb_resize_data(frame,
@@ -1180,48 +1211,15 @@ int _media_thumb_video(const char *origin_path,
thumb_info->width = width;
thumb_info->height = height;
thumb_info->data = malloc(size);
+ if (thumb_info->data == NULL) {
+ thumb_err("memory allcation failed" );
+ mm_file_destroy_content_attrs(content);
+ return MS_MEDIA_ERR_OUT_OF_MEMORY;
+ }
memcpy(thumb_info->data, frame, size);
}
mm_file_destroy_content_attrs(content);
-
- /* Get Content Tag attribute for orientatin */
- MMHandleType tag = (MMHandleType) NULL;
- char *p = NULL;
- int size = -1;
- err = mm_file_create_tag_attrs(&tag, origin_path);
- mm_util_img_rotate_type rot_type = MM_UTIL_ROTATE_0;
-
- if (err == MM_ERROR_NONE) {
- err = mm_file_get_attrs(tag, &err_msg, MM_FILE_TAG_ROTATE, &p, &size, NULL);
- if (err == MM_ERROR_NONE && size >= 0) {
-
- if (p == NULL) {
- rot_type = MM_UTIL_ROTATE_0;
- } else {
- if (strncmp(p, "90", size) == 0) {
- rot_type = MM_UTIL_ROTATE_90;
- } else if(strncmp(p, "180", size) == 0) {
- rot_type = MM_UTIL_ROTATE_180;
- } else if(strncmp(p, "270", size) == 0) {
- rot_type = MM_UTIL_ROTATE_270;
- } else {
- rot_type = MM_UTIL_ROTATE_0;
- }
- }
- } else {
- rot_type = MM_UTIL_ROTATE_0;
- SAFE_FREE(err_msg);
- }
- } else {
- rot_type = MM_UTIL_ROTATE_0;
- }
-
- err = mm_file_destroy_tag_attrs(tag);
- if (err != MM_ERROR_NONE) {
- thumb_err("fail to free tag attr - err(%x)", err);
- }
-
if (rot_type == MM_UTIL_ROTATE_90 || rot_type == MM_UTIL_ROTATE_180 || rot_type == MM_UTIL_ROTATE_270) {
/* Start to decode to rotate */
unsigned char *rotated = NULL;
@@ -1281,24 +1279,6 @@ int _media_thumb_video(const char *origin_path,
return err;
}
-static int _mkdir(const char *dir, mode_t mode) {
- char tmp[256];
- char *p = NULL;
- size_t len;
-
- snprintf(tmp, sizeof(tmp),"%s",dir);
- len = strlen(tmp);
- if(tmp[len - 1] == '/')
- tmp[len - 1] = 0;
- for(p = tmp + 1; *p; p++)
- if(*p == '/') {
- *p = 0;
- mkdir(tmp, mode);
- *p = '/';
- }
- return mkdir(tmp, mode);
-}
-
static char* _media_thumb_mmc_get_path(uid_t uid)
{
char *result_psswd = NULL;
@@ -1333,8 +1313,6 @@ static char* _media_thumb_mmc_get_path(uid_t uid)
}
asprintf(&result_psswd, "%s/data/file-manager-service/.thumb/mmc", userinfo->pw_dir);
}
-
- _mkdir(result_psswd,S_IRWXU | S_IRWXG | S_IRWXO);
return result_psswd;
}
@@ -1374,56 +1352,58 @@ static char* _media_thumb_phone_get_path(uid_t uid)
asprintf(&result_psswd, "%s/data/file-manager-service/.thumb/phone", userinfo->pw_dir);
}
- _mkdir(result_psswd,S_IRWXU | S_IRWXG | S_IRWXO);
-
return result_psswd;
}
int _media_thumb_get_hash_name(const char *file_full_path,
char *thumb_hash_path, size_t max_thumb_path, uid_t uid)
{
- char *hash_name;
- char *thumb_dir = NULL;
+ char *hash_name = NULL;
+ /*char *thumb_dir = NULL;*/
char file_ext[255] = { 0 };
+ int ret_len = 0;
media_thumb_store_type store_type = -1;
if (file_full_path == NULL || thumb_hash_path == NULL
|| max_thumb_path <= 0) {
thumb_err
("file_full_path==NULL || thumb_hash_path == NULL || max_thumb_path <= 0");
- return -1;
+ return MS_MEDIA_ERR_INVALID_PARAMETER;
}
_media_thumb_get_file_ext(file_full_path, file_ext, sizeof(file_ext));
store_type = _media_thumb_get_store_type_by_path(file_full_path);
- if (store_type == THUMB_PHONE) {
+ /*if (store_type == THUMB_PHONE) {
thumb_dir = _media_thumb_phone_get_path(uid);
} else if (store_type == THUMB_MMC) {
thumb_dir = _media_thumb_mmc_get_path(uid);
} else {
thumb_dir = _media_thumb_phone_get_path(uid);
- }
+ }*/
hash_name = _media_thumb_generate_hash_name(file_full_path);
+ if(hash_name == NULL)
+ {
+ thumb_err("_media_thumb_generate_hash_name fail");
+ return MS_MEDIA_ERR_INTERNAL;
+ }
- int ret_len;
- ret_len =
- snprintf(thumb_hash_path, max_thumb_path - 1, "%s/.%s-%s.jpg",
- thumb_dir, file_ext, hash_name);
- if(thumb_dir)
- free(thumb_dir);
- if (ret_len < 0) {
- thumb_err("Error when snprintf");
- return -1;
- } else if (ret_len > max_thumb_path) {
- thumb_err("Error for the length of thumb pathname");
- return -1;
+ if (store_type == THUMB_PHONE) {
+ ret_len = snprintf(thumb_hash_path, max_thumb_path - 1, "%s/.%s-%s.jpg", _media_thumb_phone_get_path(uid), file_ext, hash_name);
+ } else if (store_type == THUMB_MMC) {
+ ret_len = snprintf(thumb_hash_path, max_thumb_path - 1, "%s/.%s-%s.jpg", _media_thumb_mmc_get_path(uid), file_ext, hash_name);
+ } else {
+ ret_len = snprintf(thumb_hash_path, max_thumb_path - 1, "%s/.%s-%s.jpg", _media_thumb_phone_get_path(uid), file_ext, hash_name);
}
+ if ((ret_len < 0) || (ret_len > (int)max_thumb_path)) {
+ thumb_err("invalid hash path ret_len[%d]", ret_len);
+ return MS_MEDIA_ERR_INTERNAL;
+ }
//thumb_dbg("thumb hash : %s", thumb_hash_path);
- return 0;
+ return MS_MEDIA_ERR_NONE;
}
@@ -1474,4 +1454,4 @@ int _media_thumb_save_to_file_with_evas(unsigned char *data,
ecore_evas_free(ee);
return MS_MEDIA_ERR_INTERNAL;
}
-} \ No newline at end of file
+}