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.
18 #include <glib/gprintf.h>
22 #include <image_util.h>
23 #include <image_util_type.h>
25 #define MAX_STRING_LEN 128
26 #define IMAGE_FORMAT_LABEL_BUFFER_SIZE 4
27 #define IMAGE_TEST_MAX_REPEAT_COUNT 100
29 #define IMAGE_UTIL_SAFE_FREE(src) { if (src) {free(src); src = NULL; } }
32 GMainLoop *g_loop = NULL;
33 transformation_h g_handle = NULL;
34 media_packet_h g_src = NULL;
36 unsigned int g_width = 0;
37 unsigned int g_height = 0;
41 GMutex g_thread_mutex;
44 CURRENT_STATE_MAIN_MENU,
45 CURRENT_STATE_SET_IMAGE_MENU,
49 CURRENT_STATE_SET_IMAGE_NONE,
50 CURRENT_STATE_SET_IMAGE_PATH,
51 CURRENT_STATE_SET_IMAGE_WIDTH,
52 CURRENT_STATE_SET_IMAGE_HEIGHT,
53 CURRENT_STATE_SET_IMAGE_FORMAT,
56 int g_menu_state = CURRENT_STATE_MAIN_MENU;
57 int g_menu_set_image_state = CURRENT_STATE_SET_IMAGE_NONE;
61 g_mutex_lock(&g_thread_mutex);
62 g_printf("waiting... untill finishing transform \n");
63 g_cond_wait(&g_thread_cond, &g_thread_mutex);
64 g_printf("<=== get signal from callback \n");
65 g_mutex_unlock(&g_thread_mutex);
70 g_mutex_lock(&g_thread_mutex);
71 g_cond_signal(&g_thread_cond);
72 g_printf("===> send signal to test proc \n");
73 g_mutex_unlock(&g_thread_mutex);
76 media_format_mimetype_e
77 _image_util_mapping_imgp_format_to_mime(image_util_colorspace_e colorspace)
79 media_format_mimetype_e mimetype = -1;
82 case IMAGE_UTIL_COLORSPACE_NV12:
83 mimetype = MEDIA_FORMAT_NV12;
85 case IMAGE_UTIL_COLORSPACE_NV16:
86 mimetype = MEDIA_FORMAT_NV16;
88 case IMAGE_UTIL_COLORSPACE_YUYV:
89 mimetype = MEDIA_FORMAT_YUYV;
91 case IMAGE_UTIL_COLORSPACE_UYVY:
92 mimetype = MEDIA_FORMAT_UYVY;
94 case IMAGE_UTIL_COLORSPACE_YUV422:
95 mimetype = MEDIA_FORMAT_422P;
97 case IMAGE_UTIL_COLORSPACE_I420:
98 mimetype = MEDIA_FORMAT_I420;
100 case IMAGE_UTIL_COLORSPACE_NV21:
101 mimetype = MEDIA_FORMAT_YV12;
103 case IMAGE_UTIL_COLORSPACE_RGB565:
104 mimetype = MEDIA_FORMAT_RGB565;
106 case IMAGE_UTIL_COLORSPACE_RGB888:
107 mimetype = MEDIA_FORMAT_RGB888;
109 case IMAGE_UTIL_COLORSPACE_RGBA8888:
110 mimetype = MEDIA_FORMAT_RGBA;
112 case IMAGE_UTIL_COLORSPACE_ARGB8888:
113 mimetype = MEDIA_FORMAT_ARGB;
115 case IMAGE_UTIL_COLORSPACE_BGRA8888:
116 case IMAGE_UTIL_COLORSPACE_BGRX8888:
117 case IMAGE_UTIL_COLORSPACE_NV61:
120 g_printf("Not Supported Format");
124 g_printf("imgp fmt: %d mimetype fmt: %d", colorspace, mimetype);
128 bool test_transform_completed_cb(media_packet_h *packet, image_util_error_e error, void *user_data)
131 char output_file[25] = {};
133 media_format_h dst_fmt;
134 media_format_mimetype_e dst_mimetype;
135 int dst_width, dst_height, dst_avg_bps, dst_max_bps;
136 char *output_fmt = NULL;
138 g_printf("test_transform_completed_cb============= [%d] \n", error);
139 if (error == IMAGE_UTIL_ERROR_NONE) {
140 g_printf("<<<<< SUCCESS >>>>>");
141 output_fmt = (char *)malloc(sizeof(char) * IMAGE_FORMAT_LABEL_BUFFER_SIZE);
143 if (media_packet_get_format(*packet, &dst_fmt) != MEDIA_PACKET_ERROR_NONE) {
144 g_printf("Imedia_packet_get_format");
149 if (media_format_get_video_info(dst_fmt, &dst_mimetype, &dst_width, &dst_height, &dst_avg_bps, &dst_max_bps) == MEDIA_FORMAT_ERROR_NONE) {
150 memset(output_fmt, 0, IMAGE_FORMAT_LABEL_BUFFER_SIZE);
151 if (dst_mimetype == MEDIA_FORMAT_YV12 || dst_mimetype == MEDIA_FORMAT_422P || dst_mimetype == MEDIA_FORMAT_I420
152 || dst_mimetype == MEDIA_FORMAT_NV12 || dst_mimetype == MEDIA_FORMAT_UYVY || dst_mimetype == MEDIA_FORMAT_YUYV) {
153 strncpy(output_fmt, "yuv", strlen("yuv"));
155 strncpy(output_fmt, "rgb", strlen("rgb"));
157 g_printf("[mimetype: %d] W x H : %d x %d \n", dst_mimetype, dst_width, dst_height);
158 snprintf(output_file, 25, "result_%dx%d.%s", dst_width, dst_height, output_fmt);
162 FILE *fpout = fopen(output_file, "w");
164 media_packet_get_buffer_size(*packet, &size);
166 if (media_packet_get_buffer_data_ptr(*packet, &dst) != MEDIA_PACKET_ERROR_NONE) {
167 IMAGE_UTIL_SAFE_FREE(dst);
168 IMAGE_UTIL_SAFE_FREE(output_fmt);
170 g_printf("[dst] media_packet_get_extra \n");
174 //g_printf("dst: %p [%llu] \n", dst, size);
175 fwrite(dst, 1, size, fpout);
180 g_printf("write result \n");
181 g_printf("Free (output_fmt) \n");
182 IMAGE_UTIL_SAFE_FREE(output_fmt);
184 g_printf("<<<<< ERROR >>>>> complete cb");
189 media_packet_destroy(*packet);
197 create_media_packet()
203 if (media_format_create(&fmt) == MEDIA_FORMAT_ERROR_NONE) {
204 if (media_format_set_video_mime(fmt, _image_util_mapping_imgp_format_to_mime(g_format)) != MEDIA_FORMAT_ERROR_NONE) {
205 media_format_unref(fmt);
206 g_printf("[Error] Set - video mime\n");
207 return IMAGE_UTIL_ERROR_INVALID_PARAMETER;
210 if (media_format_set_video_width(fmt, g_width) != MEDIA_FORMAT_ERROR_NONE) {
211 media_format_unref(fmt);
212 g_printf("[Error] Set - video width\n");
213 return IMAGE_UTIL_ERROR_INVALID_PARAMETER;
216 if (media_format_set_video_height(fmt, g_height) != MEDIA_FORMAT_ERROR_NONE) {
217 media_format_unref(fmt);
218 g_printf("[Error] Set - video heigh\nt");
219 return IMAGE_UTIL_ERROR_INVALID_PARAMETER;
222 if (media_format_set_video_avg_bps(fmt, 2000000) != MEDIA_FORMAT_ERROR_NONE) {
223 media_format_unref(fmt);
224 g_printf("[Error] Set - video avg bps\n");
225 return IMAGE_UTIL_ERROR_INVALID_PARAMETER;
228 if (media_format_set_video_max_bps(fmt, 15000000) != MEDIA_FORMAT_ERROR_NONE) {
229 media_format_unref(fmt);
230 g_printf("[Error] Set - video max bps\n");
231 return IMAGE_UTIL_ERROR_INVALID_PARAMETER;
234 g_printf("media_format_set_video_info success! file:%s, w:%d, h:%d, %d\n", g_path, g_width, g_height, _image_util_mapping_imgp_format_to_mime(g_format));
236 g_printf("media_format_create failed...");
239 ret = media_packet_create_alloc(fmt, NULL, NULL, &g_src);
240 if (ret == MEDIA_PACKET_ERROR_NONE) {
241 g_printf("Success - media_packet_create_alloc\n");
243 if (media_packet_get_buffer_size(g_src, &size) == MEDIA_PACKET_ERROR_NONE) {
246 g_printf("\tmemory allocation failed\n");
247 return IMAGE_UTIL_ERROR_OUT_OF_MEMORY;
249 if (media_packet_get_buffer_data_ptr(g_src, &ptr) == MEDIA_PACKET_ERROR_NONE) {
250 FILE *fp = fopen(g_path, "r");
252 g_printf("\tfile open failed %d\n", errno);
253 return IMAGE_UTIL_ERROR_NO_SUCH_FILE;
257 g_printf("\tmemory allocation failed\n");
259 return IMAGE_UTIL_ERROR_NO_SUCH_FILE;
261 if (fread(src, 1, (int)size, fp) == size) {
262 g_printf("#Success# fread\n");
263 memcpy(ptr, src, (int)size);
264 g_printf("memcpy\n");
266 g_printf("#Error# fread\n");
272 media_format_unref(fmt);
273 g_printf("ERROR - media_packet_create_alloc");
276 media_format_unref(fmt);
280 static void _create()
283 if (g_handle != NULL) {
284 ret = image_util_transform_destroy(g_handle);
285 if (ret != IMAGE_UTIL_ERROR_NONE)
286 g_printf("[%d]Error image_util_transform_destroy [%d]\n", __LINE__, ret);
288 g_printf("[%d]Success image_util_transform_destroy [%d]\n", __LINE__, ret);
290 ret = image_util_transform_create(&g_handle);
291 if (ret != IMAGE_UTIL_ERROR_NONE)
292 g_printf("[%d]Error image_util_transform_create [%d]\n", __LINE__, ret);
294 g_printf("[%d]Success image_util_transform_create [%d]\n", __LINE__, ret);
297 static void _set_image()
301 media_packet_destroy(g_src);
302 g_printf("[%d]Success source packet is destroyed \n", __LINE__);
304 ret = create_media_packet();
305 if (ret == MEDIA_PACKET_ERROR_NONE)
306 g_printf("Success - Create_media_packet\n");
308 g_printf("Error - Create_media_packet\n");
311 static void _destroy()
316 ret = image_util_transform_destroy(g_handle);
317 if (ret != IMAGE_UTIL_ERROR_NONE)
318 g_printf("[%d]Error image_util_transform_destroy [%d]\n", __LINE__, ret);
320 g_printf("[%d]Success image_util_transform_destroy [%d]\n", __LINE__, ret);
322 g_printf("[%d]Error handle was already destroyed \n", __LINE__);
327 static void _transform(const char *cmd)
330 unsigned int width = 0;
331 unsigned int height = 0;
332 image_util_colorspace_e colorspace = IMAGE_UTIL_COLORSPACE_RGB888;
333 image_util_rotation_e angle;
339 if (!strcmp("convert", cmd)) {
340 colorspace = IMAGE_UTIL_COLORSPACE_I420;
342 ret = image_util_transform_set_colorspace(g_handle, colorspace);
343 if (ret != IMAGE_UTIL_ERROR_NONE) {
344 g_printf("[%d]error image_util_set colorspace [%d]\n", __LINE__, ret);
349 if (!strcmp("resize", cmd)) {
353 ret = image_util_transform_set_resolution(g_handle, width, height);
354 if (ret != IMAGE_UTIL_ERROR_NONE) {
355 g_printf("[%d]Error image_util_set resolution [%d]\n", __LINE__, ret);
360 if (!strcmp("rotate", cmd)) {
363 ret = image_util_transform_set_rotation(g_handle, angle);
364 if (ret != IMAGE_UTIL_ERROR_NONE) {
365 g_printf("[%d]Error image_util_set colorspace [%d]\n", __LINE__, ret);
370 if (!strcmp("crop", cmd)) {
376 ret = image_util_transform_set_crop_area(g_handle, start_x, start_y, end_x, end_y);
377 if (ret != IMAGE_UTIL_ERROR_NONE) {
378 g_printf("[%d]Error image_util_set colorspace [%d]\n", __LINE__, ret);
383 if (!strcmp("run", cmd)) {
384 ret = image_util_transform_run(g_handle, g_src, (image_util_transform_completed_cb)test_transform_completed_cb, NULL);
385 if (ret != IMAGE_UTIL_ERROR_NONE) {
386 g_printf("[%d]Error image_util_transform [%d]\n", __LINE__, ret);
394 static void _loop_test(const int count)
397 for (i = 0; i < count; i++) {
400 g_printf("<<<<< %03d >>>>>\n", i);
407 g_main_loop_quit(g_loop);
410 void reset_current_menu_state()
412 g_menu_state = CURRENT_STATE_MAIN_MENU;
416 static void display_set_image_menu(void)
419 g_print("====================================================\n");
420 g_print(" image-util Core-API test: Main menu v0.2\n");
421 g_print("----------------------------------------------------\n");
422 g_print("1. set image path \n");
423 g_print("2. set image width \n");
424 g_print("3. set image height \n");
425 g_print("4. set image format \n");
426 g_print("0. back \n");
427 g_print("----------------------------------------------------\n");
428 g_print("====================================================\n");
432 static void display_menu(void)
435 g_print("====================================================\n");
436 g_print(" image-util Core-API test: Main menu v0.2\n");
437 g_print("----------------------------------------------------\n");
438 g_print("1. create handle \n");
439 g_print("2. set image \n");
440 g_print("3. set convert \n");
441 g_print("4. set crop \n");
442 g_print("5. set resize \n");
443 g_print("6. set rotate \n");
444 g_print("7. run \n");
445 g_print("8. run repeatly \n");
446 g_print("9. destroy handle \n");
447 g_print("0. quit \n");
448 g_print("----------------------------------------------------\n");
449 g_print("====================================================\n");
453 static void interpret_set_image_cmd(char *cmd)
455 int len = strlen(cmd);
456 if (g_menu_set_image_state == CURRENT_STATE_SET_IMAGE_NONE) {
458 if (!strncmp(cmd, "1", len)) {
459 g_menu_set_image_state = CURRENT_STATE_SET_IMAGE_PATH;
461 } else if (!strncmp(cmd, "2", len)) {
462 g_menu_set_image_state = CURRENT_STATE_SET_IMAGE_WIDTH;
464 } else if (!strncmp(cmd, "3", len)) {
465 g_menu_set_image_state = CURRENT_STATE_SET_IMAGE_HEIGHT;
467 } else if (!strncmp(cmd, "4", len)) {
468 g_menu_set_image_state = CURRENT_STATE_SET_IMAGE_FORMAT;
470 } else if (!strncmp(cmd, "0", len)) {
472 reset_current_menu_state();
476 g_print("wrong command\n");
477 display_set_image_menu();
479 } else if (g_menu_set_image_state == CURRENT_STATE_SET_IMAGE_PATH) {
480 IMAGE_UTIL_SAFE_FREE(g_path);
481 g_path = (char *)g_malloc(MAX_STRING_LEN * sizeof(char *));
482 memset(g_path, 0x00, MAX_STRING_LEN);
483 snprintf(g_path, MAX_STRING_LEN, "%s", cmd);
484 g_menu_set_image_state = CURRENT_STATE_SET_IMAGE_NONE;
485 display_set_image_menu();
486 } else if (g_menu_set_image_state == CURRENT_STATE_SET_IMAGE_WIDTH) {
488 g_menu_set_image_state = CURRENT_STATE_SET_IMAGE_NONE;
489 display_set_image_menu();
490 } else if (g_menu_set_image_state == CURRENT_STATE_SET_IMAGE_HEIGHT) {
491 g_height = atoi(cmd);
492 g_menu_set_image_state = CURRENT_STATE_SET_IMAGE_NONE;
493 display_set_image_menu();
494 } else if (g_menu_set_image_state == CURRENT_STATE_SET_IMAGE_FORMAT) {
495 g_format = atoi(cmd);
496 g_menu_set_image_state = CURRENT_STATE_SET_IMAGE_NONE;
497 display_set_image_menu();
501 static void interpret_cmd(char *cmd)
503 int len = strlen(cmd);
504 if (g_menu_state == CURRENT_STATE_MAIN_MENU) {
506 if (!strncmp(cmd, "1", len)) {
508 } else if (!strncmp(cmd, "2", len)) {
509 g_menu_state = CURRENT_STATE_SET_IMAGE_MENU;
510 g_menu_set_image_state = CURRENT_STATE_SET_IMAGE_NONE;
511 display_set_image_menu();
513 } else if (!strncmp(cmd, "3", len)) {
514 _transform("convert");
515 } else if (!strncmp(cmd, "4", len)) {
517 } else if (!strncmp(cmd, "5", len)) {
518 _transform("resize");
519 } else if (!strncmp(cmd, "6", len)) {
520 _transform("rotate");
521 } else if (!strncmp(cmd, "7", len)) {
523 } else if (!strncmp(cmd, "8", len)) {
524 _loop_test(IMAGE_TEST_MAX_REPEAT_COUNT);
525 } else if (!strncmp(cmd, "9", len)) {
527 } else if (!strncmp(cmd, "0", len)) {
531 g_print("wrong command\n");
535 } else if (g_menu_state == CURRENT_STATE_SET_IMAGE_MENU) {
536 interpret_set_image_cmd(cmd);
538 g_print("wrong menu state\n");
542 gboolean input(GIOChannel *channel)
544 gchar buf[MAX_STRING_LEN];
546 GError *error = NULL;
548 g_io_channel_read_chars(channel, buf, MAX_STRING_LEN, &read, &error);
557 int main(int argc, char **argv)
559 int ret = IMAGE_UTIL_ERROR_NONE;
561 GIOChannel *stdin_channel = NULL;
562 stdin_channel = g_io_channel_unix_new(0);
563 g_io_channel_set_flags(stdin_channel, G_IO_FLAG_NONBLOCK, NULL);
564 g_io_add_watch(stdin_channel, G_IO_IN, (GIOFunc)input, NULL);
567 g_printf("Usage: image_utl_test filename width height format \n");
573 g_path = (char *)g_malloc(MAX_STRING_LEN * sizeof(char *));
574 memset(g_path, 0x00, MAX_STRING_LEN);
575 snprintf(g_path, MAX_STRING_LEN, "%s", argv[1]);
576 g_width = atoi(argv[2]);
577 g_height = atoi(argv[3]);
578 g_format = atoi(argv[4]);
580 g_mutex_init(&g_thread_mutex);
581 g_cond_init(&g_thread_cond);
583 ret = image_util_transform_create(&g_handle);
584 if (ret != IMAGE_UTIL_ERROR_NONE) {
585 g_printf("[%d]Error image_util_transform_create [%d]\n", __LINE__, ret);
589 ret = create_media_packet();
590 if (ret == MEDIA_PACKET_ERROR_NONE) {
591 g_printf("Success - Create_media_packet\n");
593 g_printf("Error - Create_media_packet\n");
597 ret = image_util_transform_set_hardware_acceleration(g_handle, FALSE);
598 if (ret != IMAGE_UTIL_ERROR_NONE) {
599 g_printf("[%d]Error image_util_transform_set_hardware_acceleration condition [%d]\n", __LINE__, ret);
605 g_loop = g_main_loop_new(NULL, FALSE);
607 g_main_loop_run(g_loop);
608 g_main_loop_unref(g_loop);
611 g_mutex_clear(&g_thread_mutex);
612 g_cond_clear(&g_thread_cond);
614 IMAGE_UTIL_SAFE_FREE(g_path);
615 g_printf("[%d]Success file path is destroyed \n", __LINE__);
617 g_printf("[%d]Error file path was already destroyed \n", __LINE__);
620 media_packet_destroy(g_src);
621 g_printf("[%d]Success source packet is destroyed \n", __LINE__);
623 g_printf("[%d]Error source packet was already destroyed \n", __LINE__);