diff options
Diffstat (limited to 'src/media-thumb-internal.c')
-rwxr-xr-x | src/media-thumb-internal.c | 674 |
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 +} |