2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <mm_util_imgp.h>
21 #include <image_util.h>
22 #include <image_util_private.h>
25 mm_util_img_format image_format;
26 media_format_mimetype_e mimetype;
27 const char *mimetype_name;
28 } image_format_mimetype_pair_s;
30 static const image_format_mimetype_pair_s image_format_mimetype_table[MM_UTIL_IMG_FMT_NUM] = {
31 { MM_UTIL_IMG_FMT_YUV420, MEDIA_FORMAT_YV12, "MEDIA_FORMAT_YV12" },
32 { MM_UTIL_IMG_FMT_YUV422, MEDIA_FORMAT_422P, "MEDIA_FORMAT_422P" },
33 { MM_UTIL_IMG_FMT_I420, MEDIA_FORMAT_I420, "MEDIA_FORMAT_I420" },
34 { MM_UTIL_IMG_FMT_NV12, -1, "Not support" },
35 { MM_UTIL_IMG_FMT_UYVY, MEDIA_FORMAT_UYVY, "MEDIA_FORMAT_UYVY" },
36 { MM_UTIL_IMG_FMT_YUYV, MEDIA_FORMAT_YUYV, "MEDIA_FORMAT_YUYV" },
37 { MM_UTIL_IMG_FMT_RGB565, MEDIA_FORMAT_RGB565, "MEDIA_FORMAT_RGB565" },
38 { MM_UTIL_IMG_FMT_RGB888, MEDIA_FORMAT_RGB888, "MEDIA_FORMAT_RGB888" },
39 { MM_UTIL_IMG_FMT_ARGB8888, MEDIA_FORMAT_ARGB, "MEDIA_FORMAT_ARGB" },
40 { MM_UTIL_IMG_FMT_BGRA8888, MEDIA_FORMAT_BGRA, "MEDIA_FORMAT_BGRA" },
41 { MM_UTIL_IMG_FMT_RGBA8888, MEDIA_FORMAT_RGBA, "MEDIA_FORMAT_RGBA" },
42 { MM_UTIL_IMG_FMT_BGRX8888, -1, "Not support" },
43 { MM_UTIL_IMG_FMT_NV12_TILED, MEDIA_FORMAT_NV12T, "MEDIA_FORMAT_NV12T" },
44 { MM_UTIL_IMG_FMT_NV16, MEDIA_FORMAT_NV16, "MEDIA_FORMAT_NV16" },
45 { MM_UTIL_IMG_FMT_NV61, -1, "Not support" }
48 static media_format_mimetype_e __image_format_to_mimetype(mm_util_img_format format)
51 media_format_mimetype_e mimetype = -1;
53 for (i = 0; i < MM_UTIL_IMG_FMT_NUM; i++) {
54 if (image_format_mimetype_table[i].image_format == format) {
55 mimetype = image_format_mimetype_table[i].mimetype;
60 image_util_debug("imgp fmt: %d mimetype fmt: %s", format, image_format_mimetype_table[i].mimetype_name);
65 static mm_util_img_format __mimetype_to_image_format(media_format_mimetype_e mimetype)
68 mm_util_img_format format = -1;
70 for (i = 0; i < MM_UTIL_IMG_FMT_NUM; i++) {
71 if (image_format_mimetype_table[i].mimetype == mimetype) {
72 format = image_format_mimetype_table[i].image_format;
77 image_util_debug("mimetype: %s imgp fmt: %d", image_format_mimetype_table[i].mimetype_name, format);
82 static int __create_media_format(media_format_mimetype_e mimetype, unsigned int width, unsigned int height, media_format_h *new_fmt)
84 int err = MEDIA_FORMAT_ERROR_NONE;
86 image_util_retvm_if((new_fmt == NULL) || (width == 0) || (height == 0), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid parameter");
88 err = media_format_create(new_fmt);
89 if (err != MEDIA_FORMAT_ERROR_NONE) {
90 image_util_error("media_format_make_writable failed (%d)", err);
91 return IMAGE_UTIL_ERROR_INVALID_OPERATION;
94 err = media_format_set_video_mime(*new_fmt, mimetype);
95 if (err != MEDIA_FORMAT_ERROR_NONE) {
96 media_format_unref(*new_fmt);
97 image_util_error("media_format_set_video_mime failed (%d)", err);
98 return IMAGE_UTIL_ERROR_INVALID_OPERATION;
101 err = media_format_set_video_width(*new_fmt, width);
102 if (err != MEDIA_FORMAT_ERROR_NONE) {
103 media_format_unref(*new_fmt);
104 image_util_error("media_format_set_video_width failed (%d)", err);
105 return IMAGE_UTIL_ERROR_INVALID_OPERATION;
108 err = media_format_set_video_height(*new_fmt, height);
109 if (err != MEDIA_FORMAT_ERROR_NONE) {
110 media_format_unref(*new_fmt);
111 image_util_error("media_format_set_video_height failed (%d)", err);
112 return IMAGE_UTIL_ERROR_INVALID_OPERATION;
115 return IMAGE_UTIL_ERROR_NONE;
118 static int _image_util_packet_to_image(media_packet_h packet, mm_util_color_image_h *color_image)
120 int err = IMAGE_UTIL_ERROR_NONE;
121 media_format_mimetype_e mimetype = 0;
122 int width = 0, height = 0;
125 media_format_h fmt = NULL;
127 image_util_retvm_if(((packet == NULL) || (color_image == NULL)), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid parameter");
129 err = media_packet_get_format(packet, &fmt);
130 if (err != MEDIA_PACKET_ERROR_NONE) {
131 image_util_error("media_packet_get_format failed (%d)", err);
132 return IMAGE_UTIL_ERROR_INVALID_PARAMETER;
135 err = media_format_get_video_info(fmt, &mimetype, &width, &height, NULL, NULL);
136 if (err != MEDIA_FORMAT_ERROR_NONE) {
137 image_util_error("media_packet_get_format failed (%d)", err);
138 media_format_unref(fmt);
139 return IMAGE_UTIL_ERROR_INVALID_PARAMETER;
141 media_format_unref(fmt);
143 err = media_packet_get_buffer_size(packet, &size);
144 if (err != MEDIA_PACKET_ERROR_NONE) {
145 image_util_error("media_packet_get_buffer_size failed (%d)", err);
146 return IMAGE_UTIL_ERROR_INVALID_PARAMETER;
150 err = media_packet_get_buffer_data_ptr(packet, &ptr);
151 if (err != MM_UTIL_ERROR_NONE) {
152 image_util_error("media_packet_get_buffer_data_ptr failed (%d)", err);
153 return IMAGE_UTIL_ERROR_INVALID_PARAMETER;
157 image_util_debug("[Fotmat: %u] W x H : %d x %d", mimetype, width, height);
158 if ((width == 0) || (height == 0) || (size == 0) || (ptr == NULL)) {
159 image_util_error("Invalid source packet");
160 return IMAGE_UTIL_ERROR_INVALID_PARAMETER;
162 image_util_debug("_image_util_packet_to_image succeed");
164 err = mm_util_create_color_image(color_image);
165 if (err != MM_UTIL_ERROR_NONE) {
166 image_util_error("Error - Run transform (%d)", err);
167 return _image_error_capi(ERR_TYPE_TRANSFORM, err);
169 image_util_debug("_image_util_packet_to_image succeed");
171 err = mm_util_set_color_image(*color_image, width, height, __mimetype_to_image_format(mimetype), ptr, size);
172 if (err != MM_UTIL_ERROR_NONE) {
173 image_util_error("mm_util_push_request_image failed (%d)", err);
174 mm_util_destroy_color_image(*color_image);
175 return _image_error_capi(ERR_TYPE_TRANSFORM, err);
178 image_util_debug("_image_util_packet_to_image succeed");
180 return IMAGE_UTIL_ERROR_NONE;
183 static int _image_util_image_to_packet(mm_util_color_image_h image, media_packet_h *packet)
185 int err = IMAGE_UTIL_ERROR_NONE;
186 mm_util_img_format format = 0;
187 int width = 0, height = 0;
189 size_t buffer_size = 0;
190 media_format_h fmt = NULL;
191 void *packet_ptr = NULL;
192 uint64_t packet_size = 0;
195 err = mm_util_get_color_image(image, &width, &height, &format, &buffer, &buffer_size);
196 if (err != MM_UTIL_ERROR_NONE) {
197 image_util_error("mm_util_get_color_image failed (%d)", err);
198 return _image_error_capi(ERR_TYPE_TRANSFORM, err);
201 err = __create_media_format(__image_format_to_mimetype(format), width, height, &fmt);
202 if (err != IMAGE_UTIL_ERROR_NONE) {
203 image_util_error("mm_util_push_request_image failed (%d)", err);
207 err = media_packet_create_alloc(fmt, NULL, NULL, packet);
208 if (err != MEDIA_PACKET_ERROR_NONE) {
209 image_util_error("media_packet_create_alloc failed (%d)", err);
210 media_format_unref(fmt);
211 return IMAGE_UTIL_ERROR_INVALID_OPERATION;
214 err = media_packet_get_buffer_size(*packet, &packet_size);
215 if (err != MEDIA_PACKET_ERROR_NONE) {
216 image_util_error("media_packet_get_buffer_size failed (%d)", err);
217 media_packet_destroy(*packet);
218 return IMAGE_UTIL_ERROR_INVALID_OPERATION;
221 err = media_packet_get_buffer_data_ptr(*packet, &packet_ptr);
222 if (err != MEDIA_PACKET_ERROR_NONE) {
223 image_util_error("media_packet_get_buffer_data_ptr failed");
224 media_packet_destroy(*packet);
225 return IMAGE_UTIL_ERROR_INVALID_OPERATION;
228 if (packet_ptr == NULL || packet_size == 0) {
229 image_util_error("media_packet creation failed (%p, %" PRIu64 ")", packet_ptr, packet_size);
230 media_packet_destroy(*packet);
231 return IMAGE_UTIL_ERROR_INVALID_OPERATION;
233 image_util_debug("Success - media_packet is created (%p, %" PRIu64 ")", packet_ptr, packet_size);
235 if ((uint64_t)buffer_size < packet_size) {
236 size = (size_t)buffer_size;
238 size = (size_t)packet_size;
241 image_util_debug("Size: result(%u) media_packet(%" PRIu64 ") copied(%zu)", buffer_size, packet_size, size);
242 memcpy(packet_ptr, buffer, size);
244 image_util_debug("_image_util_image_to_packet succeed");
246 return IMAGE_UTIL_ERROR_NONE;
249 static void _image_util_transform_completed_cb(mm_util_color_image_h raw_image, int error, void *user_data)
251 int err = IMAGE_UTIL_ERROR_NONE;
252 image_util_cb_s *_util_cb = (image_util_cb_s *) user_data;
253 media_packet_h packet = NULL;
255 if ((_util_cb != NULL) && (_util_cb->completed_cb != NULL)) {
256 err = _image_util_image_to_packet(raw_image, &packet);
257 if (err != MM_UTIL_ERROR_NONE) {
258 image_util_error("_image_util_image_to_packet failed (%d)", err);
259 _util_cb->completed_cb(NULL, err, _util_cb->user_data);
261 _util_cb->completed_cb(&packet, _image_error_capi(ERR_TYPE_TRANSFORM, error), _util_cb->user_data);
268 static int _image_util_create_transform_handle(transformation_s * handle)
270 int err = MM_UTIL_ERROR_NONE;
271 mm_util_imgp_h image_h;
273 err = mm_util_create(&image_h);
274 if (err != MM_UTIL_ERROR_NONE) {
275 image_util_error("Error - mm_util_create");
276 return _image_error_capi(ERR_TYPE_TRANSFORM, err);
279 handle->image_h = image_h;
281 return IMAGE_UTIL_ERROR_NONE;
284 int image_util_foreach_supported_jpeg_colorspace(image_util_supported_jpeg_colorspace_cb callback, void *user_data)
288 DEPRECATION_LOGW("image_util_foreach_supported_jpeg_colorspace()", "image_util_foreach_supported_colorspace()");
290 image_util_retvm_if((callback == NULL), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "callback is null");
292 /* RGB has higher precedence than YUV */
293 for (idx = (int)(NUM_OF_COLORSPACE - 1); idx >= 0; idx--) {
294 if (is_supported_colorspace(idx, IMAGE_UTIL_JPEG))
295 if (false == callback(idx, user_data))
296 return IMAGE_UTIL_ERROR_NONE;
300 return IMAGE_UTIL_ERROR_NONE;
303 int image_util_transform_create(transformation_h * handle)
305 int err = MM_UTIL_ERROR_NONE;
307 image_util_debug("image_util_create");
309 image_util_retvm_if((handle == NULL), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid Handle");
311 transformation_s *_handle = (transformation_s *) calloc(1, sizeof(transformation_s));
312 image_util_retvm_if((_handle == NULL), IMAGE_UTIL_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
314 _handle->colorspace = _NOT_SUPPORTED_COLORSPACE;
315 _handle->_util_cb = NULL;
316 _handle->image_h = NULL;
317 _handle->set_convert = false;
318 _handle->set_resize = false;
319 _handle->set_rotate = false;
320 _handle->set_crop = false;
322 err = _image_util_create_transform_handle(_handle);
323 if (err != MM_UTIL_ERROR_NONE) {
324 image_util_error("Error - create transform handle");
325 IMAGE_UTIL_SAFE_FREE(_handle);
326 return _image_error_capi(ERR_TYPE_TRANSFORM, err);
329 *handle = (transformation_h) _handle;
331 return IMAGE_UTIL_ERROR_NONE;
334 int image_util_transform_set_hardware_acceleration(transformation_h handle, bool mode)
336 transformation_s *_handle = (transformation_s *) handle;
338 image_util_warning("DEPRECATION WARNING: image_util_transform_set_hardware_acceleration() is deprecated and will be removed from next release.");
339 image_util_debug("Set hardware_acceleration %d", mode);
341 image_util_retvm_if((_handle == NULL), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid Handle");
342 #ifndef ENABLE_HW_ACCELERATION
343 image_util_retvm_if((mode == true), IMAGE_UTIL_ERROR_NOT_SUPPORTED, "hardware acceleration is not supported");
346 image_util_debug("Set hardware_acceleration %d", mode);
348 return IMAGE_UTIL_ERROR_NONE;
351 int image_util_transform_set_colorspace(transformation_h handle, image_util_colorspace_e colorspace)
353 int err = MM_UTIL_ERROR_NONE;
354 transformation_s *_handle = (transformation_s *) handle;
356 image_util_debug("Set colorspace_convert_info [%d]", colorspace);
358 image_util_retvm_if((_handle == NULL), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid Handle");
360 err = mm_util_set_colorspace_convert(_handle->image_h, colorspace);
361 if (err != MM_UTIL_ERROR_NONE) {
362 image_util_error("Error - Set colorspace convert");
363 return _image_error_capi(ERR_TYPE_TRANSFORM, err);
366 _handle->colorspace = colorspace;
367 _handle->set_convert = true;
369 return IMAGE_UTIL_ERROR_NONE;
372 int image_util_transform_set_resolution(transformation_h handle, unsigned int width, unsigned int height)
374 int err = MM_UTIL_ERROR_NONE;
375 transformation_s *_handle = (transformation_s *) handle;
377 image_util_debug("Set resize_info w[%d] h[%d]", width, height);
379 image_util_retvm_if((_handle == NULL), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid Handle");
380 image_util_retvm_if((_handle->set_crop), IMAGE_UTIL_ERROR_INVALID_OPERATION, "Crop and Resize can't do at the same time");
381 image_util_retvm_if((_image_util_check_resolution(width, height) == false), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid resolution");
383 err = mm_util_set_resolution(_handle->image_h, width, height);
384 if (err != MM_UTIL_ERROR_NONE) {
385 image_util_error("Error - Set resolution");
386 return _image_error_capi(ERR_TYPE_TRANSFORM, err);
388 _handle->width = width;
389 _handle->height = height;
390 _handle->set_resize = true;
392 return IMAGE_UTIL_ERROR_NONE;
395 int image_util_transform_set_rotation(transformation_h handle, image_util_rotation_e rotation)
397 int err = MM_UTIL_ERROR_NONE;
398 transformation_s *_handle = (transformation_s *) handle;
400 image_util_debug("Set rotate_info [%d]", rotation);
402 image_util_retvm_if((_handle == NULL), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid Handle");
404 err = mm_util_set_rotation(_handle->image_h, rotation);
405 if (err != MM_UTIL_ERROR_NONE) {
406 image_util_error("Error - Set rotation");
407 return _image_error_capi(ERR_TYPE_TRANSFORM, err);
409 _handle->rotation = rotation;
410 _handle->set_rotate = true;
412 return IMAGE_UTIL_ERROR_NONE;
415 int image_util_transform_set_crop_area(transformation_h handle, unsigned int start_x, unsigned int start_y, unsigned int end_x, unsigned int end_y)
417 int err = MM_UTIL_ERROR_NONE;
418 transformation_s *_handle = (transformation_s *) handle;
422 image_util_retvm_if((_handle == NULL), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid Handle");
423 image_util_retvm_if((_handle->set_resize), IMAGE_UTIL_ERROR_INVALID_OPERATION, "Crop and Resize can't do at the same time");
425 dest_width = end_x - start_x;
426 dest_height = end_y - start_y;
428 image_util_debug("Set crop_info x[%d] y[%d] w[%d] h[%d]", start_x, start_y, dest_width, dest_height);
430 image_util_retvm_if((_image_util_check_resolution(dest_width, dest_height) == false), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid dest resolution");
431 err = mm_util_set_crop_area(_handle->image_h, start_x, start_y, end_x, end_y);
432 if (err != MM_UTIL_ERROR_NONE) {
433 image_util_error("Error - Set crop area");
434 return _image_error_capi(ERR_TYPE_TRANSFORM, err);
436 _handle->start_x = start_x;
437 _handle->start_y = start_y;
438 _handle->end_x = end_x;
439 _handle->end_y = end_y;
440 _handle->set_crop = true;
442 return IMAGE_UTIL_ERROR_NONE;
445 int image_util_transform_get_colorspace(transformation_h handle, image_util_colorspace_e * colorspace)
447 transformation_s *_handle = (transformation_s *) handle;
449 image_util_retvm_if((_handle == NULL), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid Handle");
450 image_util_retvm_if((colorspace == NULL), IMAGE_UTIL_ERROR_INVALID_OPERATION, "colorspace parameter error");
452 if (!_handle->set_convert) {
453 image_util_error("Did not set colorspace before");
454 return IMAGE_UTIL_ERROR_INVALID_OPERATION;
457 image_util_debug("Get colorspace_convert_info [%d]", _handle->colorspace);
459 *colorspace = _handle->colorspace;
461 return IMAGE_UTIL_ERROR_NONE;
464 int image_util_transform_get_resolution(transformation_h handle, unsigned int *width, unsigned int *height)
466 transformation_s *_handle = (transformation_s *) handle;
468 image_util_retvm_if((_handle == NULL), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid Handle");
469 image_util_retvm_if((width == NULL || height == NULL), IMAGE_UTIL_ERROR_INVALID_OPERATION, "width or height parameter error");
471 if (!_handle->set_resize) {
472 image_util_error("Did not set resolution before");
473 return IMAGE_UTIL_ERROR_INVALID_OPERATION;
476 image_util_debug("Get resize_info w[%ui] h[%ui]", _handle->width, _handle->height);
478 *width = _handle->width;
479 *height = _handle->height;
481 return IMAGE_UTIL_ERROR_NONE;
484 int image_util_transform_get_rotation(transformation_h handle, image_util_rotation_e * rotation)
486 transformation_s *_handle = (transformation_s *) handle;
488 image_util_retvm_if((_handle == NULL), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid Handle");
489 image_util_retvm_if((rotation == NULL), IMAGE_UTIL_ERROR_INVALID_OPERATION, "rotation parameter error");
491 if (!_handle->set_rotate) {
492 image_util_error("Did not set rotation before");
493 return IMAGE_UTIL_ERROR_INVALID_OPERATION;
496 image_util_debug("Get rotate_info [%d]", _handle->rotation);
498 *rotation = _handle->rotation;
500 return IMAGE_UTIL_ERROR_NONE;
503 int image_util_transform_get_crop_area(transformation_h handle, unsigned int *start_x, unsigned int *start_y, unsigned int *end_x, unsigned int *end_y)
505 transformation_s *_handle = (transformation_s *) handle;
507 image_util_retvm_if((_handle == NULL), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid Handle");
508 image_util_retvm_if((start_x == NULL || start_y == NULL || end_x == NULL || end_y == NULL), IMAGE_UTIL_ERROR_INVALID_OPERATION, "crop area parameter error");
510 if (!_handle->set_crop) {
511 image_util_error("Did not set crop area before");
512 return IMAGE_UTIL_ERROR_INVALID_OPERATION;
515 *start_x = _handle->start_x;
516 *start_y = _handle->start_y;
517 *end_x = _handle->end_x;
518 *end_y = _handle->end_y;
520 return IMAGE_UTIL_ERROR_NONE;
523 int image_util_transform_run(transformation_h handle, media_packet_h src, image_util_transform_completed_cb completed_cb, void *user_data)
525 int err = MM_UTIL_ERROR_NONE;
526 transformation_s *_handle = (transformation_s *) handle;
528 image_util_debug("image_util_transform");
530 image_util_retvm_if((_handle == NULL), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid Handle");
531 image_util_retvm_if((completed_cb == NULL), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid callback");
532 image_util_retvm_if((src == NULL), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid source");
533 image_util_retvm_if((!_handle->set_convert && !_handle->set_resize && !_handle->set_rotate && !_handle->set_crop), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid transform");
535 mm_util_color_image_h color_image = NULL;
537 err = _image_util_packet_to_image(src, &color_image);
538 image_util_retvm_if((err != IMAGE_UTIL_ERROR_NONE), err, "_image_util_packet_to_image failed");
540 _handle->_util_cb = (image_util_cb_s *) calloc(1, sizeof(image_util_cb_s));
541 if (_handle->_util_cb == NULL) {
542 image_util_error("Memory allocation failed");
543 mm_util_destroy_color_image(color_image);
544 return IMAGE_UTIL_ERROR_OUT_OF_MEMORY;
546 _handle->_util_cb->user_data = user_data;
547 _handle->_util_cb->completed_cb = completed_cb;
549 err = mm_util_transform(_handle->image_h, color_image, (mm_util_completed_callback) _image_util_transform_completed_cb, (void *)_handle->_util_cb);
550 if (err != MM_UTIL_ERROR_NONE) {
551 image_util_error("Error - Run transform (%d)", err);
552 mm_util_destroy_color_image(color_image);
553 return _image_error_capi(ERR_TYPE_TRANSFORM, err);
556 return IMAGE_UTIL_ERROR_NONE;
559 int image_util_transform_destroy(transformation_h handle)
561 int err = MM_UTIL_ERROR_NONE;
562 transformation_s *_handle = (transformation_s *) handle;
564 image_util_debug("image_util_destroy");
566 if (_handle == NULL) {
567 image_util_error("Invalid Handle");
568 return IMAGE_UTIL_ERROR_INVALID_PARAMETER;
571 err = mm_util_destroy(_handle->image_h);
573 IMAGE_UTIL_SAFE_FREE(_handle->_util_cb);
574 IMAGE_UTIL_SAFE_FREE(_handle);
576 return _image_error_capi(ERR_TYPE_TRANSFORM, err);
579 int image_util_calculate_buffer_size(int width, int height, image_util_colorspace_e colorspace, unsigned int *size)
581 int err = MM_UTIL_ERROR_NONE;
583 image_util_retvm_if((is_valid_colorspace(colorspace) == FALSE), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid colorspace");
584 image_util_retvm_if((width <= 0 || height <= 0), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid width or Invalid height");
585 image_util_retvm_if((size == NULL), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "size is null");
587 err = mm_util_get_image_size(TYPECAST_COLOR(colorspace), width, height, size);
589 return _image_error_capi(ERR_TYPE_COMMON, err);
592 int image_util_extract_color_from_memory(const unsigned char *image_buffer, int width, int height, unsigned char *rgb_r, unsigned char *rgb_g, unsigned char *rgb_b)
594 int ret = MM_UTIL_ERROR_NONE;
596 image_util_retvm_if((image_buffer == NULL), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "image_buffer is null");
598 GModule *module = NULL;
599 ModuleFunc mmutil_imgcv_module_func = NULL;
600 module = g_module_open(PATH_MMUTIL_IMGCV_LIB, G_MODULE_BIND_LAZY);
601 image_util_retvm_if((module == NULL), IMAGE_UTIL_ERROR_NO_SUCH_FILE, "fail to open module");
603 g_module_symbol(module, IMGCV_FUNC_NAME, (gpointer *)&mmutil_imgcv_module_func);
604 if (!mmutil_imgcv_module_func)
605 g_module_close(module);
607 image_util_retvm_if((mmutil_imgcv_module_func == NULL), IMAGE_UTIL_ERROR_INVALID_OPERATION, "fail to get symbol");
609 unsigned char r_color, g_color, b_color;
610 ret = mmutil_imgcv_module_func((void *)image_buffer, width, height, &r_color, &g_color, &b_color);
617 g_module_close(module);
621 return _image_error_capi(ERR_TYPE_COMMON, ret);
624 int image_util_foreach_supported_colorspace(image_util_type_e image_type, image_util_supported_colorspace_cb callback, void *user_data)
628 IMAGE_UTIL_TYPE_CHECK(image_type);
629 image_util_retvm_if((callback == NULL), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "callback is null");
631 for (idx = (int)(NUM_OF_COLORSPACE - 1); idx >= 0; idx--) {
632 if (is_supported_colorspace(idx, image_type))
633 if (false == callback(idx, user_data))
634 return IMAGE_UTIL_ERROR_NONE;
638 return IMAGE_UTIL_ERROR_NONE;