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.
17 #include <mm_util_imgp.h>
19 #include <image_util.h>
20 #include <image_util_private.h>
22 static void _image_util_transform_completed_cb(media_packet_h * dst, int error, void *user_data)
24 int error_value = IMAGE_UTIL_ERROR_NONE;
25 image_util_cb_s *_util_cb = (image_util_cb_s *) user_data;
27 if ((_util_cb != NULL) && (_util_cb->image_processing_completed_cb != NULL)) {
28 error_value = _image_util_error_convert(error);
29 _util_cb->image_processing_completed_cb(dst, error_value, _util_cb->user_data);
35 static int _image_util_create_transform_handle(transformation_s * handle)
37 int err = MM_UTIL_ERROR_NONE;
38 mm_util_imgp_h image_h;
40 err = mm_util_create(&image_h);
41 if (err != MM_UTIL_ERROR_NONE) {
42 image_util_error("Error - mm_util_create");
43 return _convert_image_util_error_code(__func__, err);
46 handle->image_h = image_h;
48 return _convert_image_util_error_code(__func__, err);
51 int image_util_foreach_supported_jpeg_colorspace(image_util_supported_jpeg_colorspace_cb callback, void *user_data)
55 DEPRECATION_LOGW("image_util_foreach_supported_jpeg_colorspace()", "image_util_foreach_supported_colorspace()");
57 image_util_retvm_if((callback == NULL), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "callback is null");
59 /* RGB has higher precedence than YUV */
60 for (idx = (int)(NUM_OF_COLORSPACE - 1); idx >= 0; idx--) {
61 if (is_supported_colorspace(idx, IMAGE_UTIL_JPEG))
62 if (false == callback(idx, user_data))
63 return IMAGE_UTIL_ERROR_NONE;
67 return IMAGE_UTIL_ERROR_NONE;
70 int image_util_transform_create(transformation_h * handle)
72 int err = MM_UTIL_ERROR_NONE;
74 image_util_debug("image_util_create");
76 image_util_retvm_if((handle == NULL), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid Handle");
78 transformation_s *_handle = (transformation_s *) calloc(1, sizeof(transformation_s));
79 image_util_retvm_if((_handle == NULL), IMAGE_UTIL_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY(0x%08x)", IMAGE_UTIL_ERROR_OUT_OF_MEMORY);
81 _handle->colorspace = _NOT_SUPPORTED_COLORSPACE;
82 _handle->_util_cb = NULL;
84 _handle->hardware_acceleration = false;
85 _handle->set_convert = false;
86 _handle->set_resize = false;
87 _handle->set_rotate = false;
88 _handle->set_crop = false;
90 err = _image_util_create_transform_handle(_handle);
91 if (err != MM_UTIL_ERROR_NONE) {
92 image_util_error("Error - create transform handle");
93 IMAGE_UTIL_SAFE_FREE(_handle);
94 return _convert_image_util_error_code(__func__, err);
97 *handle = (transformation_h) _handle;
99 return _convert_image_util_error_code(__func__, err);
102 int image_util_transform_set_hardware_acceleration(transformation_h handle, bool mode)
104 int err = MM_UTIL_ERROR_NONE;
105 transformation_s *_handle = (transformation_s *) handle;
107 image_util_debug("Set hardware_acceleration %d", mode);
109 image_util_retvm_if((_handle == NULL), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid Handle");
110 #ifndef ENABLE_HW_ACCELERATION
111 image_util_retvm_if((mode == true), IMAGE_UTIL_ERROR_NOT_SUPPORTED, "hardware acceleration is not supported");
114 err = mm_util_set_hardware_acceleration(_handle->image_h, mode);
115 if (err != MM_UTIL_ERROR_NONE) {
116 image_util_error("Error - Set hardware_acceleration");
117 return _convert_image_util_error_code(__func__, err);
120 image_util_debug("Set hardware_acceleration %d", mode);
121 _handle->hardware_acceleration = mode;
123 return _convert_image_util_error_code(__func__, err);
126 int image_util_transform_set_colorspace(transformation_h handle, image_util_colorspace_e colorspace)
128 int err = MM_UTIL_ERROR_NONE;
129 transformation_s *_handle = (transformation_s *) handle;
131 image_util_debug("Set colorspace_convert_info [%d]", colorspace);
133 image_util_retvm_if((_handle == NULL), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid Handle");
135 err = mm_util_set_colorspace_convert(_handle->image_h, colorspace);
136 if (err != MM_UTIL_ERROR_NONE) {
137 image_util_error("Error - Set colorspace convert");
138 return _convert_image_util_error_code(__func__, err);
141 _handle->colorspace = colorspace;
142 _handle->set_convert = true;
144 return _convert_image_util_error_code(__func__, err);
147 int image_util_transform_set_resolution(transformation_h handle, unsigned int width, unsigned int height)
149 int err = MM_UTIL_ERROR_NONE;
150 transformation_s *_handle = (transformation_s *) handle;
152 image_util_debug("Set resize_info w[%d] h[%d]", width, height);
154 image_util_retvm_if((_handle == NULL), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid Handle");
155 image_util_retvm_if((_handle->set_crop), IMAGE_UTIL_ERROR_INVALID_OPERATION, "Crop and Resize can't do at the same time");
156 image_util_retvm_if((_image_util_check_resolution(width, height) == false), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid resolution");
158 err = mm_util_set_resolution(_handle->image_h, width, height);
159 if (err != MM_UTIL_ERROR_NONE) {
160 image_util_error("Error - Set resolution");
161 return _convert_image_util_error_code(__func__, err);
163 _handle->width = width;
164 _handle->height = height;
165 _handle->set_resize = true;
167 return _convert_image_util_error_code(__func__, err);
170 int image_util_transform_set_rotation(transformation_h handle, image_util_rotation_e rotation)
172 int err = MM_UTIL_ERROR_NONE;
173 transformation_s *_handle = (transformation_s *) handle;
175 image_util_debug("Set rotate_info [%d]", rotation);
177 image_util_retvm_if((_handle == NULL), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid Handle");
179 err = mm_util_set_rotation(_handle->image_h, rotation);
180 if (err != MM_UTIL_ERROR_NONE) {
181 image_util_error("Error - Set rotation");
182 return _convert_image_util_error_code(__func__, err);
184 _handle->rotation = rotation;
185 _handle->set_rotate = true;
187 return _convert_image_util_error_code(__func__, err);
190 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)
192 int err = MM_UTIL_ERROR_NONE;
193 transformation_s *_handle = (transformation_s *) handle;
197 image_util_retvm_if((_handle == NULL), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid Handle");
198 image_util_retvm_if((_handle->set_resize), IMAGE_UTIL_ERROR_INVALID_OPERATION, "Crop and Resize can't do at the same time");
200 dest_width = end_x - start_x;
201 dest_height = end_y - start_y;
203 image_util_debug("Set crop_info x[%d] y[%d] w[%d] h[%d]", start_x, start_y, dest_width, dest_height);
205 image_util_retvm_if((_image_util_check_resolution(dest_width, dest_height) == false), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid dest resolution");
206 err = mm_util_set_crop_area(_handle->image_h, start_x, start_y, end_x, end_y);
207 if (err != MM_UTIL_ERROR_NONE) {
208 image_util_error("Error - Set crop area");
209 return _convert_image_util_error_code(__func__, err);
211 _handle->start_x = start_x;
212 _handle->start_y = start_y;
213 _handle->end_x = end_x;
214 _handle->end_y = end_y;
215 _handle->set_crop = true;
217 return _convert_image_util_error_code(__func__, err);
220 int image_util_transform_get_colorspace(transformation_h handle, image_util_colorspace_e * colorspace)
222 int ret = IMAGE_UTIL_ERROR_NONE;
223 transformation_s *_handle = (transformation_s *) handle;
225 if (_handle == NULL) {
226 image_util_error("Invalid Handle");
227 return IMAGE_UTIL_ERROR_INVALID_PARAMETER;
231 image_util_error("colorspace area parameter error");
232 return IMAGE_UTIL_ERROR_INVALID_OPERATION;
235 if (!_handle->set_convert) {
236 image_util_error("Did not set colorspace before");
237 return IMAGE_UTIL_ERROR_INVALID_OPERATION;
240 image_util_debug("Get colorspace_convert_info [%d]", _handle->colorspace);
242 *colorspace = _handle->colorspace;
247 int image_util_transform_get_resolution(transformation_h handle, unsigned int *width, unsigned int *height)
249 int ret = IMAGE_UTIL_ERROR_NONE;
250 transformation_s *_handle = (transformation_s *) handle;
252 if (_handle == NULL) {
253 image_util_error("Invalid Handle");
254 return IMAGE_UTIL_ERROR_INVALID_PARAMETER;
257 if (!width || !height) {
258 image_util_error("resolution area parameter error");
259 return IMAGE_UTIL_ERROR_INVALID_OPERATION;
262 if (!_handle->set_resize) {
263 image_util_error("Did not set resolution before");
264 return IMAGE_UTIL_ERROR_INVALID_OPERATION;
267 image_util_debug("Get resize_info w[%ui] h[%ui]", _handle->width, _handle->height);
269 *width = _handle->width;
270 *height = _handle->height;
275 int image_util_transform_get_rotation(transformation_h handle, image_util_rotation_e * rotation)
277 int ret = IMAGE_UTIL_ERROR_NONE;
278 transformation_s *_handle = (transformation_s *) handle;
280 if (_handle == NULL) {
281 image_util_error("Invalid Handle");
282 return IMAGE_UTIL_ERROR_INVALID_PARAMETER;
286 image_util_error("rotation area parameter error");
287 return IMAGE_UTIL_ERROR_INVALID_OPERATION;
290 if (!_handle->set_rotate) {
291 image_util_error("Did not set rotation before");
292 return IMAGE_UTIL_ERROR_INVALID_OPERATION;
295 image_util_debug("Get rotate_info [%d]", _handle->rotation);
297 *rotation = _handle->rotation;
302 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)
304 int ret = IMAGE_UTIL_ERROR_NONE;
305 transformation_s *_handle = (transformation_s *) handle;
307 if (_handle == NULL) {
308 image_util_error("Invalid Handle");
309 return IMAGE_UTIL_ERROR_INVALID_PARAMETER;
312 if (!start_x || !start_y || !end_x || !end_y) {
313 image_util_error("crop area parameter error");
314 return IMAGE_UTIL_ERROR_INVALID_OPERATION;
317 if (!_handle->set_crop) {
318 image_util_error("Did not set crop area before");
319 return IMAGE_UTIL_ERROR_INVALID_OPERATION;
322 *start_x = _handle->start_x;
323 *start_y = _handle->start_y;
324 *end_x = _handle->end_x;
325 *end_y = _handle->end_y;
330 int image_util_transform_run(transformation_h handle, media_packet_h src, image_util_transform_completed_cb completed_cb, void *user_data)
332 int err = MM_UTIL_ERROR_NONE;
333 transformation_s *_handle = (transformation_s *) handle;
335 image_util_debug("image_util_transform");
337 image_util_retvm_if((_handle == NULL), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid Handle");
338 image_util_retvm_if((completed_cb == NULL), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid callback");
339 image_util_retvm_if((src == NULL), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid source");
340 image_util_retvm_if((!_handle->set_convert && !_handle->set_resize && !_handle->set_rotate && !_handle->set_crop), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid transform");
342 if (_handle->_util_cb != NULL) {
343 IMAGE_UTIL_SAFE_FREE(_handle->_util_cb);
344 _handle->_util_cb = NULL;
346 _handle->_util_cb = (image_util_cb_s *) calloc(1, sizeof(image_util_cb_s));
347 image_util_retvm_if((_handle->_util_cb == NULL), IMAGE_UTIL_ERROR_OUT_OF_MEMORY, "Out of memory");
349 _handle->_util_cb->user_data = user_data;
350 _handle->_util_cb->image_processing_completed_cb = completed_cb;
352 if (_handle->_util_cb)
353 err = mm_util_transform(_handle->image_h, src, (mm_util_completed_callback) _image_util_transform_completed_cb, (void *)_handle->_util_cb);
355 return _convert_image_util_error_code(__func__, err);
358 int image_util_transform_destroy(transformation_h handle)
360 int err = MM_UTIL_ERROR_NONE;
361 transformation_s *_handle = (transformation_s *) handle;
363 image_util_debug("image_util_destroy");
365 if (_handle == NULL) {
366 image_util_error("Invalid Handle");
367 return IMAGE_UTIL_ERROR_INVALID_PARAMETER;
370 err = mm_util_destroy(_handle->image_h);
372 IMAGE_UTIL_SAFE_FREE(_handle->_util_cb);
373 IMAGE_UTIL_SAFE_FREE(_handle);
375 return _convert_image_util_error_code(__func__, err);
378 int image_util_calculate_buffer_size(int width, int height, image_util_colorspace_e colorspace, unsigned int *size)
380 int err = MM_UTIL_ERROR_NONE;
382 image_util_retvm_if((is_valid_colorspace(colorspace) == FALSE), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid colorspace");
383 image_util_retvm_if((width <= 0 || height <= 0), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid width or Invalid height");
384 image_util_retvm_if((size == NULL), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "size is null");
386 err = mm_util_get_image_size(TYPECAST_COLOR(colorspace), width, height, size);
387 return _convert_image_util_error_code(__func__, err);
390 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)
392 int ret = MM_UTIL_ERROR_NONE;
394 image_util_retvm_if((image_buffer == NULL), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "image_buffer is null");
396 GModule *module = NULL;
397 ModuleFunc mmutil_imgcv_module_func = NULL;
398 module = g_module_open(PATH_MMUTIL_IMGCV_LIB, G_MODULE_BIND_LAZY);
399 image_util_retvm_if((module == NULL), IMAGE_UTIL_ERROR_NO_SUCH_FILE, "fail to open module");
401 g_module_symbol(module, IMGCV_FUNC_NAME, (gpointer *)&mmutil_imgcv_module_func);
402 if (!mmutil_imgcv_module_func)
403 g_module_close(module);
405 image_util_retvm_if((mmutil_imgcv_module_func == NULL), IMAGE_UTIL_ERROR_INVALID_OPERATION, "fail to get symbol");
407 unsigned char r_color, g_color, b_color;
408 ret = mmutil_imgcv_module_func((void *)image_buffer, width, height, &r_color, &g_color, &b_color);
415 g_module_close(module);
419 return _convert_image_util_error_code(__func__, ret);
422 int image_util_foreach_supported_colorspace(image_util_type_e image_type, image_util_supported_colorspace_cb callback, void *user_data)
426 image_util_retvm_if((callback == NULL), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "callback is null");
428 if ((image_type == IMAGE_UTIL_JPEG) || (image_type == IMAGE_UTIL_PNG)
429 || (image_type == IMAGE_UTIL_GIF) || (image_type == IMAGE_UTIL_BMP)) {
430 for (idx = (int)(NUM_OF_COLORSPACE - 1); idx >= 0; idx--) {
431 if (is_supported_colorspace(idx, image_type))
432 if (false == callback(idx, user_data))
433 return IMAGE_UTIL_ERROR_NONE;
437 return IMAGE_UTIL_ERROR_INVALID_PARAMETER;
440 return IMAGE_UTIL_ERROR_NONE;