imageutil: Add support for BMP image 30/53130/1
authorVineeth TM <vineeth.tm@samsung.com>
Wed, 2 Dec 2015 05:01:23 +0000 (14:01 +0900)
committerVineeth TM <vineeth.tm@samsung.com>
Wed, 2 Dec 2015 05:01:51 +0000 (14:01 +0900)
Change-Id: Ib4184da82d19c885feb44818ef6779853b0c2263
Signed-off-by: Vineeth TM <vineeth.tm@samsung.com>
CMakeLists.txt
decode-test/image_util_decode_encode_testsuite.c
include/image_util_type.h
packaging/capi-media-image-util.spec
src/image_util.c

index 748afa4..7d2e035 100755 (executable)
@@ -24,7 +24,7 @@ SET(service "media")
 SET(submodule "image-util")
 
 # for package file
-SET(dependents "dlog mmutil-gif mmutil-png mmutil-jpeg mmutil-imgp mmutil-imgcv capi-base-common capi-media-tool")
+SET(dependents "dlog mmutil-bmp mmutil-gif mmutil-png mmutil-jpeg mmutil-imgp mmutil-imgcv capi-base-common capi-media-tool")
 SET(pc_dependents "dlog capi-base-common capi-media-tool")
 
 SET(fw_name "${project_prefix}-${service}-${submodule}")
index ceb2d04..c89b56d 100755 (executable)
@@ -243,6 +243,9 @@ int main(int argc, char *argv[])
                        case IMAGE_UTIL_GIF:
                                snprintf(type, 4, "%s", "gif");
                                break;
+                       case IMAGE_UTIL_BMP:
+                               snprintf(type, 4, "%s", "bmp");
+                               break;
                        default:
                                break;
                        }
@@ -267,7 +270,10 @@ int main(int argc, char *argv[])
                                return 0;
 
                        if (!strcmp("decode-mem", argv[1])) {
-                               ret = image_util_encode_set_output_buffer(encoded, &dst);
+                               if (encode_image_type == IMAGE_UTIL_BMP)
+                                       ret = image_util_encode_set_output_path(encoded, filename);
+                               else
+                                       ret = image_util_encode_set_output_buffer(encoded, &dst);
                                if (ret != IMAGE_UTIL_ERROR_NONE)
                                        return 0;
                        } else {
@@ -286,7 +292,7 @@ int main(int argc, char *argv[])
                        if (ret != IMAGE_UTIL_ERROR_NONE)
                                return 0;
 
-                       if (!strcmp("decode-mem", argv[1])) {
+                       if (!strcmp("decode-mem", argv[1]) && (encode_image_type != IMAGE_UTIL_BMP)) {
                                _write_file(filename, (void *)dst, image_size);
                                free(dst);
                        }
index 540cc66..32ef371 100755 (executable)
@@ -132,6 +132,7 @@ typedef enum {
        IMAGE_UTIL_JPEG,         /**< Image format JPEG */
        IMAGE_UTIL_PNG,          /**< Image format PNG */
        IMAGE_UTIL_GIF,          /**< Image format GIF */
+       IMAGE_UTIL_BMP,          /**< Image format BMP */
 } image_util_type_e;
 
 /**
index 10c6d3f..bd7bde0 100755 (executable)
@@ -12,11 +12,14 @@ BuildRequires:  pkgconfig(mmutil-imgp)
 BuildRequires:  pkgconfig(mmutil-imgcv)
 BuildRequires:  pkgconfig(mmutil-png)
 BuildRequires:  pkgconfig(mmutil-gif)
+BuildRequires:  pkgconfig(mmutil-bmp)
 BuildRequires:  pkgconfig(capi-base-common)
 BuildRequires:  pkgconfig(capi-media-tool)
 BuildRequires:  cmake
 BuildRequires:  libpng-devel
 BuildRequires:  giflib-devel
+BuildRequires:  libbmp-devel
+BuildRequires:  libnsbmp-devel
 
 %description
 A Image Utility library in Tizen Native API package
@@ -32,6 +35,7 @@ Requires:  pkgconfig(mmutil-imgp)
 Requires:  pkgconfig(mmutil-imgcv)
 Requires:  pkgconfig(mmutil-png)
 Requires:  pkgconfig(mmutil-gif)
+Requires:  pkgconfig(mmutil-bmp)
 Requires:  pkgconfig(capi-base-common)
 
 %description devel
index 469949c..d4e622d 100755 (executable)
@@ -21,6 +21,7 @@
 #include <mm_util_imgcv.h>
 #include <mm_util_png.h>
 #include <mm_util_gif.h>
+#include <mm_util_bmp.h>
 #include <image_util.h>
 #include <image_util_private.h>
 #include <stdio.h>
@@ -122,6 +123,24 @@ static int _convert_gif_colorspace_tbl[] = {
        -1                                      ,       /* IMAGE_UTIL_COLORSPACE_NV61 */
 };
 
+static int _convert_bmp_colorspace_tbl[] = {
+       -1                                      ,       /* IMAGE_UTIL_COLORSPACE_YUV420 */
+       -1                                      ,       /* IMAGE_UTIL_COLORSPACE_YUV422 */
+       -1                                      ,       /* IMAGE_UTIL_COLORSPACE_I420 */
+       -1                                      ,       /* IMAGE_UTIL_COLORSPACE_NV12 */
+       -1                                      ,       /* IMAGE_UTIL_COLORSPACE_UYVY */
+       -1                                      ,       /* IMAGE_UTIL_COLORSPACE_YUYV */
+       -1                                      ,       /* IMAGE_UTIL_COLORSPACE_RGB565 */
+       -1                                      ,       /* IMAGE_UTIL_COLORSPACE_RGB888 */
+       -1                                      ,       /* IMAGE_UTIL_COLORSPACE_ARGB8888 */
+       -1                                      ,       /* IMAGE_UTIL_COLORSPACE_BGRA8888 */
+       MM_UTIL_BMP_FMT_RGBA8888                ,       /* IMAGE_UTIL_COLORSPACE_RGBA8888 */
+       -1                                      ,       /* IMAGE_UTIL_COLORSPACE_BGRX8888 */
+       -1                                      ,       /* IMAGE_UTIL_COLORSPACE_NV21 */
+       -1                                      ,       /* IMAGE_UTIL_COLORSPACE_NV16 */
+       -1                                      ,       /* IMAGE_UTIL_COLORSPACE_NV61 */
+};
+
 static int _convert_decode_scale_tbl[] = {
        MM_UTIL_JPEG_DECODE_DOWNSCALE_1_1,
        MM_UTIL_JPEG_DECODE_DOWNSCALE_1_2,
@@ -839,6 +858,14 @@ int image_util_foreach_supported_colorspace(image_util_type_e image_type, image_
 
        }
                break;
+       case IMAGE_UTIL_BMP:
+       for (i = sizeof(_convert_bmp_colorspace_tbl) / sizeof(int) - 1; i >= 0; i--) {
+               if (_convert_bmp_colorspace_tbl[i] != -1)
+                       if (false == callback(i, user_data))
+                               return IMAGE_UTIL_ERROR_NONE;
+
+       }
+               break;
        default:
                return MM_UTIL_ERROR_INVALID_PARAMETER;
        }
@@ -892,6 +919,20 @@ static int _image_util_decode_create_gif_handle(decode_encode_s * handle)
        return err;
 }
 
+static int _image_util_decode_create_bmp_handle(decode_encode_s * handle)
+{
+       int err = MM_UTIL_ERROR_NONE;
+
+       image_util_retvm_if((handle == NULL), MM_UTIL_ERROR_INVALID_PARAMETER, "Invalid Handle");
+
+       mm_util_bmp_data *_handle = (mm_util_bmp_data *) calloc(1, sizeof(mm_util_bmp_data));
+       image_util_retvm_if((_handle == NULL), MM_UTIL_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY(0x%08x)", MM_UTIL_ERROR_OUT_OF_MEMORY);
+
+       handle->image_h = (MMHandleType) _handle;
+
+       return err;
+}
+
 int image_util_decode_create(image_util_type_e image_type, image_util_decode_h * handle)
 {
        int err = MM_UTIL_ERROR_NONE;
@@ -920,6 +961,9 @@ int image_util_decode_create(image_util_type_e image_type, image_util_decode_h *
        case IMAGE_UTIL_GIF:
                err = _image_util_decode_create_gif_handle(_handle);
                break;
+       case IMAGE_UTIL_BMP:
+               err = _image_util_decode_create_bmp_handle(_handle);
+               break;
        default:
                err = MM_UTIL_ERROR_INVALID_PARAMETER;
                break;
@@ -1018,6 +1062,9 @@ int image_util_decode_set_colorspace(image_util_encode_h handle, image_util_colo
        case IMAGE_UTIL_GIF:
        image_util_retvm_if((_convert_gif_colorspace_tbl[colorspace] == -1), IMAGE_UTIL_ERROR_NOT_SUPPORTED_FORMAT, "not supported format");
                break;
+       case IMAGE_UTIL_BMP:
+       image_util_retvm_if((_convert_bmp_colorspace_tbl[colorspace] == -1), IMAGE_UTIL_ERROR_NOT_SUPPORTED_FORMAT, "not supported format");
+               break;
        default:
                image_util_error("Invalid image type");
                return MM_UTIL_ERROR_INVALID_PARAMETER;
@@ -1130,6 +1177,29 @@ static int _image_util_decode_internal(decode_encode_s * _handle)
                        }
                }
                break;
+       case IMAGE_UTIL_BMP:
+               {
+                       mm_util_bmp_data *bmp_data;
+
+                       bmp_data = (mm_util_bmp_data *) _handle->image_h;
+                       if (bmp_data == NULL) {
+                               image_util_error("Invalid bmp data");
+                               return MM_UTIL_ERROR_INVALID_PARAMETER;
+                       }
+
+                       if (_handle->path)
+                               err = mm_util_decode_from_bmp_file(bmp_data, _handle->path);
+                       else
+                               err = mm_util_decode_from_bmp_memory(bmp_data, &_handle->src_buffer, _handle->src_size);
+
+                       if (err == MM_UTIL_ERROR_NONE) {
+                               *(_handle->dst_buffer) = bmp_data->data;
+                               _handle->dst_size = bmp_data->size;
+                               _handle->width = bmp_data->width;
+                               _handle->height = bmp_data->height;
+                       }
+               }
+               break;
        default:
                err = MM_UTIL_ERROR_INVALID_PARAMETER;
                break;
@@ -1313,6 +1383,18 @@ int image_util_decode_destroy(image_util_decode_h handle)
                        IMAGE_UTIL_SAFE_FREE(gif_data);
                }
                break;
+       case IMAGE_UTIL_BMP:
+               {
+                       mm_util_bmp_data *bmp_data;
+
+                       bmp_data = (mm_util_bmp_data *) _handle->image_h;
+                       if (bmp_data == NULL) {
+                               image_util_error("Invalid bmp data");
+                               return IMAGE_UTIL_ERROR_INVALID_PARAMETER;
+                       }
+                       IMAGE_UTIL_SAFE_FREE(bmp_data);
+               }
+               break;
        default:
                err = IMAGE_UTIL_ERROR_INVALID_PARAMETER;
                break;
@@ -1388,6 +1470,20 @@ static int _image_util_encode_create_gif_handle(decode_encode_s * handle)
        return err;
 }
 
+static int _image_util_encode_create_bmp_handle(decode_encode_s * handle)
+{
+       int err = MM_UTIL_ERROR_NONE;
+
+       image_util_retvm_if((handle == NULL), MM_UTIL_ERROR_INVALID_PARAMETER, "Invalid Handle");
+
+       mm_util_bmp_data *_handle = (mm_util_bmp_data *) calloc(1, sizeof(mm_util_bmp_data));
+       image_util_retvm_if((_handle == NULL), MM_UTIL_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY(0x%08x)", MM_UTIL_ERROR_OUT_OF_MEMORY);
+
+       handle->image_h = (MMHandleType) _handle;
+
+       return err;
+}
+
 int image_util_encode_create(image_util_type_e image_type, image_util_encode_h * handle)
 {
        int err = MM_UTIL_ERROR_NONE;
@@ -1416,6 +1512,9 @@ int image_util_encode_create(image_util_type_e image_type, image_util_encode_h *
        case IMAGE_UTIL_GIF:
                err = _image_util_encode_create_gif_handle(_handle);
                break;
+       case IMAGE_UTIL_BMP:
+               err = _image_util_encode_create_bmp_handle(_handle);
+               break;
        default:
                err = MM_UTIL_ERROR_INVALID_PARAMETER;
                break;
@@ -1483,6 +1582,19 @@ int image_util_encode_set_resolution(image_util_encode_h handle, unsigned long w
                        mm_util_gif_encode_set_height(gif_data, height);
                }
                break;
+       case IMAGE_UTIL_BMP:
+               {
+                       mm_util_bmp_data *bmp_data;
+
+                       bmp_data = (mm_util_bmp_data *) _handle->image_h;
+                       if (bmp_data == NULL) {
+                               image_util_error("Invalid bmp data");
+                               return IMAGE_UTIL_ERROR_INVALID_PARAMETER;
+                       }
+                       mm_util_bmp_encode_set_width(bmp_data, width);
+                       mm_util_bmp_encode_set_height(bmp_data, height);
+               }
+               break;
        default:
                err = IMAGE_UTIL_ERROR_INVALID_PARAMETER;
                break;
@@ -1515,6 +1627,9 @@ int image_util_encode_set_colorspace(image_util_encode_h handle, image_util_colo
        case IMAGE_UTIL_GIF:
        image_util_retvm_if((_convert_gif_colorspace_tbl[colorspace] == -1), IMAGE_UTIL_ERROR_NOT_SUPPORTED_FORMAT, "not supported format");
                break;
+       case IMAGE_UTIL_BMP:
+       image_util_retvm_if((_convert_bmp_colorspace_tbl[colorspace] == -1), IMAGE_UTIL_ERROR_NOT_SUPPORTED_FORMAT, "not supported format");
+               break;
        default:
                image_util_error("Invalid image type");
                return MM_UTIL_ERROR_INVALID_PARAMETER;
@@ -1695,6 +1810,33 @@ static int _image_util_encode_internal(decode_encode_s * _handle)
                        }
                }
                break;
+       case IMAGE_UTIL_BMP:
+               {
+                       mm_util_bmp_data *bmp_data;
+
+                       bmp_data = (mm_util_bmp_data *) _handle->image_h;
+                       if (bmp_data == NULL) {
+                               image_util_error("Invalid bmp data");
+                               return MM_UTIL_ERROR_INVALID_PARAMETER;
+                       }
+
+                       bmp_data->data = _handle->src_buffer;
+                       if (_handle->path)
+                               err = mm_util_encode_bmp_to_file(bmp_data, _handle->path);
+                       else {
+                               fprintf(stderr, "\tNot yet implemented\n");
+                               return MM_UTIL_ERROR_INVALID_PARAMETER;
+                       }
+
+                       if (err == MM_UTIL_ERROR_NONE) {
+                               if (_handle->dst_buffer)
+                                       *(_handle->dst_buffer) = bmp_data->data;
+                               _handle->dst_size = bmp_data->size;
+                               _handle->width = bmp_data->width;
+                               _handle->height = bmp_data->height;
+                       }
+               }
+               break;
        default:
                err = MM_UTIL_ERROR_INVALID_PARAMETER;
                break;
@@ -1877,6 +2019,18 @@ int image_util_encode_destroy(image_util_encode_h handle)
                        IMAGE_UTIL_SAFE_FREE(gif_data);
                }
                break;
+       case IMAGE_UTIL_BMP:
+               {
+                       mm_util_bmp_data *bmp_data;
+
+                       bmp_data = (mm_util_bmp_data *) _handle->image_h;
+                       if (bmp_data == NULL) {
+                               image_util_error("Invalid bmp data");
+                               return IMAGE_UTIL_ERROR_INVALID_PARAMETER;
+                       }
+                       IMAGE_UTIL_SAFE_FREE(bmp_data);
+               }
+               break;
        default:
                err = IMAGE_UTIL_ERROR_INVALID_PARAMETER;
                break;