2 * Copyright (c) 2019 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.
22 #include <tzplatform_config.h>
23 #include <image_util.h>
24 #include <image_util_private.h>
26 /* logs for testsuite */
27 #define VERSION "0.1.1 of 16 Aug 2019"
28 /* prints log of menu-queue for testsuite */
29 #define DEBUG_QUEUE 0 /* 0:disable, 1:enable */
30 /* saves the intermediate image to process name("transform" or "decode"), Not supported for encoding */
31 #define DUMP_RAW_IMAGE 0 /* 0:disable, 1:enable */
33 /* commons for testsuite */
34 #define MAX_STRING_LEN PATH_MAX
35 #define MAX_AGIF_CNT 100 /* supports MAX_AGIF_CNT agif frames */
36 #define IMAGE_UTIL_COLOR_NUM IMAGE_UTIL_COLORSPACE_NV61 + 1
38 #define SAFE_FREE(src) { if (src) {free(src); src = NULL; } }
39 #define SAFE_G_FREE(src) { if (src) {g_free(src); src = NULL; } }
41 #define IS_RAW_FILE(x) ((g_strrstr(x, ".raw")) ? TRUE : FALSE)
43 #define RETM_IF(expr, fmt, arg...) do { \
45 g_print(fmt, ##arg); \
49 #define RETVM_IF(expr, val, fmt, arg...) do { \
51 g_print(fmt, ##arg); \
57 #define FILE_FOR_DUMP_RAW_IMAGE tzplatform_mkpath(TZ_USER_CONTENT, "imgutil_test_raw")
58 #define FILE_FOR_AUTO tzplatform_mkpath(TZ_USER_CONTENT, "imgutil_test_auto")
59 #define FILE_FOR_ENCODE tzplatform_mkpath(TZ_USER_CONTENT, "imgutil_test_encode")
60 #define FILE_FOR_ENCODE_AGIF tzplatform_mkpath(TZ_USER_CONTENT, "imgutil_test_encode_agif")
62 /* parameters for testsuite */
92 test_menu_state_e menu_state;
103 /* for input path or dir */
106 /* for buffer test */
108 unsigned char *buffer;
111 /* for raw image test */
114 image_util_colorspace_e color;
116 /* intermediate or result image for test */
117 image_util_image_h image;
119 /* image count and handles for a-gif */
120 unsigned int image_cnt;
121 image_util_image_h images[MAX_AGIF_CNT];
122 } test_complex_data_s;
124 /* for decode parameters */
126 image_util_colorspace_e color;
127 image_util_scale_e downscale;
128 } test_decode_params_s;
130 /* for encode parameters */
132 image_util_type_e type;
134 image_util_png_compression_e compression;
136 } test_encode_params_s;
138 /* for encode a-gif parameters */
142 } test_encode_agif_params_s;
144 /* for transform parameters */
146 gboolean has_convert_color;
147 image_util_colorspace_e convert_color;
149 test_size_s crop_area;
152 gboolean has_rotation;
153 image_util_rotation_e rotation;
154 } test_transform_params_s;
156 /* for current menu to display */
157 static test_menu_state_e g_current_menu = MAIN_MENU;
158 /* for previous menu to go back */
159 static test_menu_state_e g_previous_menu = MAIN_MENU;
161 /* for input data to process */
162 static test_complex_data_s g_input_data;
165 static test_decode_params_s g_decode_params;
166 static test_complex_data_s g_decode_result;
168 static test_encode_params_s g_encode_params;
169 static test_complex_data_s g_encode_result;
171 static test_encode_agif_params_s g_encode_agif_params;
172 static test_complex_data_s g_encode_agif_result;
174 static test_transform_params_s g_transform_params;
175 static test_complex_data_s g_transform_result;
178 static GQueue *g_queue_menu = NULL;
179 /* for images queue to encode a-gif */
180 static GQueue *g_queue_agif_images = NULL;
181 /* for input data queue */
182 static GQueue *g_queue_data = NULL;
184 static GMainLoop *g_mainloop = NULL;
185 /* parameters for testsuite */
189 /* display menu for testsuite */
190 static void __display_set(const char *text, const char *ex)
193 g_print("\tPlease type 'b' to go back and 'q' to quit at any time.\n");
196 g_print("*** input %s [ex. %s] : ", text, ex);
198 g_print("*** input %s: ", text);
205 } test_raw_img_menu_e;
208 test_raw_img_menu_e e;
210 } test_raw_img_menu_s;
212 static const test_raw_img_menu_s g_disp_raw_img_menu[RAW_IMG_MENU_MAX] = {
213 { RAW_IMG_SET_COLOR, "set colorspace (opt. default=IMAGE_UTIL_COLORSPACE_RGBA8888)" },
214 { RAW_IMG_SET_SIZE, "set width & height" },
217 static void __display_set_raw_menu(void)
219 unsigned int idx = 0;
221 g_print("====================================================\n");
222 g_print(" image-util Core-API test: Set raw data menu v%s\n", VERSION);
223 g_print("----------------------------------------------------\n");
224 for (idx = 0; idx < RAW_IMG_MENU_MAX; idx++)
225 g_print("%u. %s\n", g_disp_raw_img_menu[idx].e, g_disp_raw_img_menu[idx].t);
226 g_print("b. back\n");
227 g_print("q. quit\n");
228 g_print("----------------------------------------------------\n");
229 g_print("====================================================\n");
233 DECODE_SET_BUFFER = 0,
235 DECODE_SET_DOWNSCALE,
242 } test_decode_menu_e;
245 test_decode_menu_e e;
247 } test_decode_menu_s;
249 static const test_decode_menu_s g_disp_decode_menu[DECODE_MENU_MAX] = {
250 { DECODE_SET_BUFFER, "set input buffer" },
251 { DECODE_SET_COLOR, "set color (mand. default=IMAGE_UTIL_COLORSPACE_RGBA8888)" },
252 { DECODE_SET_DOWNSCALE, "set downscale (opt. for jpeg only)" },
253 { DECODE_RUN, "decode run (will be deprecated)" },
254 { DECODE_RUN_ASYNC, "decode run async (will be deprecated)" },
255 { DECODE_RUN2, "decode run2" },
256 { DECODE_RUN_ASYNC2, "decode run async2" },
257 { DECODE_SAVE_TO_JPEG, "save decode result to jpg" },
260 static void __display_decode_menu(void)
262 unsigned int idx = 0;
264 g_print("====================================================\n");
265 g_print(" image-util Core-API test: Decode menu v%s\n", VERSION);
266 g_print("----------------------------------------------------\n");
267 for (idx = 0; idx < DECODE_MENU_MAX; idx++)
268 g_print("%u. %s\n", g_disp_decode_menu[idx].e, g_disp_decode_menu[idx].t);
269 g_print("b. back\n");
270 g_print("q. quit\n");
271 g_print("----------------------------------------------------\n");
272 g_print("====================================================\n");
278 ENCODE_SET_COMPRESIION,
279 ENCODE_SET_TO_BUFFER,
283 ENCODE_RUN_TO_BUFFER,
284 ENCODE_RUN_ASYNC_TO_FILE,
285 ENCODE_RUN_ASYNC_TO_BUFFER,
287 } test_encode_menu_e;
290 test_encode_menu_e e;
292 } test_encode_menu_s;
294 static const test_encode_menu_s g_disp_encode_menu[ENCODE_MENU_MAX] = {
295 { ENCODE_SET_TYPE, "set image_type (mand. default=IMAGE_UTIL_JPEG)" },
296 { ENCODE_SET_QUALITY, "set quality (opt. for jpeg only)" },
297 { ENCODE_SET_COMPRESIION, "set compression (opt. for png only)" },
298 { ENCODE_SET_TO_BUFFER, "set output buffer (opt. deprecated)" },
299 { ENCODE_RUN, "encode run (will be deprecated)" },
300 { ENCODE_RUN_ASYNC, "encode run async (will be deprecated)" },
301 { ENCODE_RUN_TO_FILE, "encode run to file" },
302 { ENCODE_RUN_TO_BUFFER, "encode run to buffer" },
303 { ENCODE_RUN_ASYNC_TO_FILE, "encode run async to file" },
304 { ENCODE_RUN_ASYNC_TO_BUFFER, "encode run async to buffer" },
307 static void __display_encode_menu(void)
309 unsigned int idx = 0;
311 g_print("====================================================\n");
312 g_print(" image-util Core-API test: Encode menu v%s\n", VERSION);
313 g_print("----------------------------------------------------\n");
314 for (idx = 0; idx < ENCODE_MENU_MAX; idx++)
315 g_print("%u. %s\n", g_disp_encode_menu[idx].e, g_disp_encode_menu[idx].t);
316 g_print("b. back\n");
317 g_print("q. quit\n");
318 g_print("----------------------------------------------------\n");
319 g_print("====================================================\n");
323 ENCODE_AGIF_SET_DIR = 0,
324 ENCODE_AGIF_SET_DELAY,
325 ENCODE_AGIF_SET_TO_BUFFER,
327 ENCODE_AGIF_RUN_ASYNC,
328 ENCODE_AGIF_SAVE_TO_FILE,
329 ENCODE_AGIF_SAVE_TO_BUFFER,
330 ENCODE_AGIF_MENU_MAX,
331 } test_encode_agif_menu_e;
334 test_encode_agif_menu_e e;
336 } test_encode_agif_menu_s;
338 static const test_encode_agif_menu_s g_disp_encode_agif_menu[ENCODE_AGIF_MENU_MAX] = {
339 { ENCODE_AGIF_SET_DIR, "set directory" },
340 { ENCODE_AGIF_SET_DELAY, "set dealy time (mand. default = 100)" },
341 { ENCODE_AGIF_SET_TO_BUFFER, "set output buffer (opt. will be deprecated)" },
342 { ENCODE_AGIF_RUN, "run agif (will be deprecated)" },
343 { ENCODE_AGIF_RUN_ASYNC, "run async agif (will be deprecated)" },
344 { ENCODE_AGIF_SAVE_TO_FILE, "add frame by frame and save to file" },
345 { ENCODE_AGIF_SAVE_TO_BUFFER, "add frame by frame and save to buffer" },
348 static void __display_encode_agif_menu(void)
350 unsigned int idx = 0;
352 g_print("====================================================\n");
353 g_print(" image-util Core-API test: Encode A-GIF menu v%s\n", VERSION);
354 g_print("----------------------------------------------------\n");
355 for (idx = 0; idx < ENCODE_AGIF_MENU_MAX; idx++)
356 g_print("%u. %s\n", g_disp_encode_agif_menu[idx].e, g_disp_encode_agif_menu[idx].t);
357 g_print("b. back\n");
358 g_print("q. quit\n");
359 g_print("----------------------------------------------------\n");
360 g_print("====================================================\n");
364 TRANSFORM_SET_CONVERT = 0,
366 TRANSFORM_SET_RESIZE,
367 TRANSFORM_SET_ROTATE,
370 TRANSFORM_RUN2_ASYNC,
372 } test_transform_menu_e;
375 test_transform_menu_e e;
377 } test_transform_menu_s;
379 static const test_transform_menu_s g_disp_transform_menu[TRANSFORM_MENU_MAX] = {
380 { TRANSFORM_SET_CONVERT, "set convert" },
381 { TRANSFORM_SET_CROP, "set crop" },
382 { TRANSFORM_SET_RESIZE, "set resize" },
383 { TRANSFORM_SET_ROTATE, "set rotate" },
384 { TRANSFORM_RUN, "transform run" },
385 { TRANSFORM_RUN2, "transform run2" },
386 { TRANSFORM_RUN2_ASYNC, "transform run2 async" },
389 static void __display_transform_menu(void)
391 unsigned int idx = 0;
393 g_print("====================================================\n");
394 g_print(" image-util Core-API test: Transform menu v%s\n", VERSION);
395 g_print("----------------------------------------------------\n");
396 for (idx = 0; idx < TRANSFORM_MENU_MAX; idx++)
397 g_print("%u. %s\n", g_disp_transform_menu[idx].e, g_disp_transform_menu[idx].t);
398 g_print("b. back\n");
399 g_print("q. quit\n");
400 g_print("----------------------------------------------------\n");
401 g_print("====================================================\n");
419 static const test_main_menu_s g_disp_main_menu[MAIN_MENU_MAX] = {
420 { TEST_AUTO, "test auto" },
421 { TEST_DECODE, "test decode" },
422 { TEST_ENCODE, "test encode" },
423 { TEST_ENCODE_AGIF, "test encode a-gif" },
424 { TEST_TRANSFORM, "test transform" },
425 { SET_PATH, "set path" },
428 static void __display_main_menu(void)
430 unsigned int idx = 0;
432 g_print("====================================================\n");
433 g_print(" image-util Core-API test: Main menu v%s\n", VERSION);
434 g_print("----------------------------------------------------\n");
435 for (idx = 0; idx < MAIN_MENU_MAX; idx++)
436 g_print("%u. %s\n", g_disp_main_menu[idx].e, g_disp_main_menu[idx].t);
437 g_print("q. quit\n");
438 g_print("----------------------------------------------------\n");
439 g_print("====================================================\n");
442 static void __display_menu(test_menu_state_e menu_state)
446 __display_decode_menu();
449 __display_encode_menu();
451 case ENCODE_AGIF_MENU:
452 __display_encode_agif_menu();
455 __display_transform_menu();
460 __display_set("path", "/home/owner/media/test.jpg");
463 __display_set("dir", "/home/owner/media/Images");
465 case SET_PATH_SUB_MENU:
466 __display_set_raw_menu();
469 case SET_BUFFER_MENU:
470 __display_set("set buffer", "yes/no");
473 case SET_RAW_COLOR_MENU:
474 case SET_CONVERT_MENU:
475 __display_set("colorspace", "i420:2, rgb:7, argb:8, rgba:10");
477 case SET_COMPRESSION_MENU:
478 __display_set("comprssion", "0(NoC/HighQ)~9(MaxC/LowQ)");
481 __display_set("crop", "(sx)x(sy)x(w)x(h) 0x0x1920x1080");
484 __display_set("delay", "20~");
486 case SET_DOWNSCALE_MENU:
487 __display_set("downscale", "0(1/1)~3(1/8)");
489 case SET_QUALITY_MENU:
490 __display_set("quality", "1(LowQ)~100(HighQ)");
492 case SET_RESIZE_MENU:
494 __display_set("size", "1920x1080");
496 case SET_ROTATE_MENU:
497 __display_set("rotation", "0:none, 1:90, 2:180, 3:270");
500 __display_set("image_type", "0:jpeg, 1:png, 2:gif, 3:bmp");
506 __display_main_menu();
510 /* display menu for testsuite */
514 /* internal functions for testsuite */
516 GMutex g_thread_mutex;
520 g_mutex_lock(&g_thread_mutex);
521 g_print("\t[__wait] waiting... until finishing\n");
522 g_cond_wait(&g_thread_cond, &g_thread_mutex);
523 g_print("\t[__wait] get signal from callback\n");
524 g_mutex_unlock(&g_thread_mutex);
529 g_mutex_lock(&g_thread_mutex);
530 g_cond_signal(&g_thread_cond);
531 g_print("\t[__signal] send signal to test proc\n");
532 g_mutex_unlock(&g_thread_mutex);
535 static gboolean __read_file(char *path, void **data, size_t *length)
540 if (!path || !data || length == 0) {
541 g_print("\t[__read_file] invalid data\n");
545 g_print("\t[__read_file] %s read\n", path);
547 fp = fopen(path, "r");
549 g_print("\t[__read_file] fopen failed (%d)\n", errno);
553 if (fseek(fp, 0, SEEK_END) < 0) {
554 g_print("\t[__read_file] fseek failed\n");
561 g_print("\t[__read_file] ftell failed\n");
567 *data = (void *)calloc(1, (size_t)len);
569 g_print("\t[__read_file] memory allocation failed\n");
574 *length = fread(*data, 1, (size_t)len, fp);
575 if (*length != (size_t)len) {
576 g_print("\t[__read_file] fread failed\n");
586 *length = (size_t)len;
588 g_print("\t[__read_file] %s %zu read DONE\n", path, *length);
593 static gboolean __write_file(const char *path, void *data, size_t length)
598 if (!path || !data || length == 0) {
599 g_print("\t[__write_file] invalid data\n");
603 g_print("\t[__write_file] %s %p %zu write\n", path, data, length);
605 fp = fopen(path, "w");
607 g_print("\t[__write_file] fopen failed (%d)\n", errno);
611 len = fwrite(data, 1, length, fp);
613 g_print("\t[__write_file] fwrite failed\n");
619 g_print("\t[__write_file] %s write DONE\n", path);
625 static int __write_jpeg(const char *name, image_util_image_h image)
627 int ret = IMAGE_UTIL_ERROR_NONE;
628 image_util_encode_h handle = NULL;
631 path = g_strdup_printf("%s_%s.jpg", FILE_FOR_DUMP_RAW_IMAGE, name);
632 RETVM_IF(!path, IMAGE_UTIL_ERROR_OUT_OF_MEMORY, "Memory allocation failed");
634 ret = image_util_encode_create(IMAGE_UTIL_JPEG, &handle);
635 if (ret != IMAGE_UTIL_ERROR_NONE) {
636 g_print("image_util_decode_create failed %d", ret);
640 ret = image_util_encode_run_to_file(handle, image, path);
641 if (ret != IMAGE_UTIL_ERROR_NONE) {
642 g_print("image_util_encode_run_to_file failed %d", ret);
647 image_util_encode_destroy(handle);
653 static void __queue_free_func(gpointer data)
658 static gboolean __safe_atoui(char *buffer, unsigned int *ui)
662 if (buffer == NULL || ui == NULL)
665 const long sl = strtol(buffer, &end, 10);
671 if ((LONG_MIN == sl || LONG_MAX == sl) && (ERANGE == errno))
676 *ui = (unsigned int)sl;
681 static void __decode_func(gpointer data, gpointer user_data)
683 int ret = IMAGE_UTIL_ERROR_NONE;
684 image_util_decode_h decoder = (image_util_decode_h)user_data;
685 char *path = (char *)data;
687 if (path == NULL || strlen(path) == 0)
690 ret = image_util_decode_set_input_path(decoder, path);
691 if (ret != IMAGE_UTIL_ERROR_NONE) {
692 g_print("image_util_decode_set_input_path failed %d\n", ret);
696 ret = image_util_decode_run2(decoder, &g_input_data.images[g_input_data.image_cnt]);
697 if (ret != IMAGE_UTIL_ERROR_NONE) {
698 g_print("image_util_decode_run2 failed %d\n", ret);
701 g_input_data.image_cnt++;
704 static gboolean __decode_file_in_dir()
706 int ret = IMAGE_UTIL_ERROR_NONE;
707 image_util_decode_h decoder = NULL;
709 ret = image_util_decode_create(&decoder);
710 if (ret != IMAGE_UTIL_ERROR_NONE) {
711 g_print("image_util_decode_create failed %d\n", ret);
715 g_queue_foreach(g_queue_agif_images, __decode_func, decoder);
717 if (g_input_data.image_cnt == 0) {
718 g_print("No valid image\n");
722 image_util_decode_destroy(decoder);
724 g_print("%u valid image have been decoded.\n", g_input_data.image_cnt);
729 static int __sort_compare(gconstpointer a, gconstpointer b, gpointer user_data)
731 const char *_a = (const char *)a;
732 const char *_b = (const char *)b;
733 if (strlen(_a) < strlen(_b))
736 if (strlen(_a) > strlen(_b))
739 return g_ascii_strcasecmp(_a, _b);
742 static gboolean __set_input_dir(const char *path)
744 struct dirent *dp = NULL;
747 if (path == NULL || strlen(path) == 0)
750 if (!g_queue_agif_images) {
751 g_queue_agif_images = g_queue_new();
752 if (!g_queue_agif_images) {
753 g_print("g_queue_new failed\n");
760 g_print("\tlistdir: can't open %s\n", path);
764 g_queue_free_full(g_queue_agif_images, __queue_free_func);
766 /* read files in dir */
767 while ((dp = readdir(fd)) != NULL) {
768 if (strlen(dp->d_name) == 0)
770 if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, ".."))
771 continue; /* skip self and parent */
773 g_queue_push_tail(g_queue_agif_images, g_strdup_printf("%s/%s", path, dp->d_name));
778 if (g_queue_get_length(g_queue_agif_images) == 0) {
779 g_print("\tNo Test File in directory(%s)!\n", path);
784 g_queue_sort(g_queue_agif_images, __sort_compare, NULL);
786 /* decode files of dir */
787 if (!__decode_file_in_dir()) {
788 g_print("Fail to decode file from dir! %s\n", path);
795 static gboolean __set_input_path(const char *path)
797 if (path == NULL || strlen(path) == 0)
800 SAFE_G_FREE(g_input_data.path);
802 g_input_data.path = g_strdup(path);
803 if (!g_input_data.path) {
804 g_print("Memory allocation failed\n");
808 if (g_file_test(path, G_FILE_TEST_IS_DIR)) {
809 g_print("file path is a directory (%s)\n", path);
810 return __set_input_dir(path);
816 static gboolean __set_input_crop_area(const char *data, test_size_s *size)
818 gchar **params = NULL;
819 gboolean ret = FALSE;
821 if (data == NULL || strlen(data) == 0)
824 params = g_strsplit(data, ",", 0);
826 if (params == NULL || params[0] == NULL || params[1] == NULL || params[2] == NULL || params[3] == NULL)
829 if (!__safe_atoui(params[0], &size->x)) {
830 g_print("wrong width! %s\n", params[0]);
833 if (!__safe_atoui(params[1], &size->y)) {
834 g_print("wrong height! %s\n", params[1]);
838 if (!__safe_atoui(params[2], &size->w)) {
839 g_print("wrong width! %s\n", params[0]);
842 if (!__safe_atoui(params[3], &size->h)) {
843 g_print("wrong height! %s\n", params[1]);
855 static gboolean __set_input_size(const char *data, test_size_s *size)
857 gchar **params = NULL;
858 gboolean ret = FALSE;
860 if (data == NULL || strlen(data) == 0)
863 params = g_strsplit(data, "x", 0);
865 if (params == NULL || params[0] == NULL || params[1] == NULL)
868 if (!__safe_atoui(params[0], &size->w)) {
869 g_print("wrong width! %s\n", params[0]);
872 if (!__safe_atoui(params[1], &size->h)) {
873 g_print("wrong height! %s\n", params[1]);
885 static int __get_raw_data(test_complex_data_s *test_data)
887 int ret = IMAGE_UTIL_ERROR_NONE;
889 size_t buffer_size = 0;
891 if (test_data->is_raw) {
892 if (!__read_file(test_data->path, &buffer, &buffer_size)) {
893 g_print("__read_file failed %s\n", test_data->path);
894 return IMAGE_UTIL_ERROR_INVALID_PARAMETER;
897 ret = image_util_create_image(test_data->size.w, test_data->size.h, test_data->color,
898 buffer, buffer_size, &test_data->image);
899 if (ret != IMAGE_UTIL_ERROR_NONE)
900 g_print("image_util_create_image failed %d\n", ret);
906 static unsigned int g_num_of_file = 0;
907 static void __set_auto_file(image_util_type_e image_type, char **path)
913 switch (image_type) {
914 case IMAGE_UTIL_JPEG:
915 snprintf(ext, 4, "%s", "jpg");
918 snprintf(ext, 4, "%s", "png");
921 snprintf(ext, 4, "%s", "gif");
924 snprintf(ext, 4, "%s", "bmp");
927 g_print("Not supported encode format!\n");
931 *path = g_strdup_printf("%s_%02d.%s", FILE_FOR_AUTO, g_num_of_file++, ext);
933 g_print("\t__set_auto_file: %s!\n", *path);
936 static void __set_encode_file(image_util_type_e image_type, const char *base, char **path)
942 switch (image_type) {
943 case IMAGE_UTIL_JPEG:
944 snprintf(ext, 4, "%s", "jpg");
947 snprintf(ext, 4, "%s", "png");
950 snprintf(ext, 4, "%s", "gif");
953 snprintf(ext, 4, "%s", "bmp");
956 g_print("Not supported encode format!\n");
960 *path = g_strdup_printf("%s.%s", base, ext);
962 /* internal functions for testsuite */
965 /* callback functions for test */
966 static void __decode_completed_cb(int error_code, void *user_data, unsigned long width, unsigned long height, unsigned long long size)
968 test_complex_data_s *result = (test_complex_data_s *)user_data;
970 g_print("\t__decode_completed_cb invoked %d\n", error_code);
972 if (error_code != IMAGE_UTIL_ERROR_NONE) {
973 g_print("Fail to decode image %d\n", error_code);
978 result->size.w = (unsigned int)width;
979 result->size.h = (unsigned int)height;
980 result->buffer_size = (size_t)size;
984 static void __decode_completed2_cb(int error_code, image_util_image_h image, void *user_data)
986 int ret = IMAGE_UTIL_ERROR_NONE;
987 test_complex_data_s *result = (test_complex_data_s *)user_data;
989 g_print("\t__decode_completed2_cb invoked %d\n", error_code);
991 if (error_code != IMAGE_UTIL_ERROR_NONE) {
992 g_print("Fail to decode image %d", error_code);
997 ret = image_util_clone_image(image, &result->image);
998 if (ret != IMAGE_UTIL_ERROR_NONE)
999 g_print("image_util_clone_image failed %d\n", ret);
1004 static void __encode_completed_cb(int error_code, void *user_data, unsigned long long size)
1006 test_complex_data_s *result = (test_complex_data_s *)user_data;
1008 g_print("\t__encode_to_file_completed_cb invoked %d\n", error_code);
1010 if (error_code != IMAGE_UTIL_ERROR_NONE)
1011 g_print("Fail to decode image %d\n", error_code);
1013 result->buffer_size = (size_t)size;
1017 static void __encode_to_file_completed_cb(image_util_error_e error_code, void *user_data)
1019 g_print("\t__encode_to_file_completed_cb invoked %d\n", error_code);
1021 if (error_code != IMAGE_UTIL_ERROR_NONE)
1022 g_print("Fail to decode image %d\n", error_code);
1027 static void __encode_to_buffer_completed_cb(image_util_error_e error_code, unsigned char *buffer, size_t buffer_size, void *user_data)
1029 test_complex_data_s *result = (test_complex_data_s *)user_data;
1031 g_print("\t__encode_to_buffer_completed_cb invoked %d\n", error_code);
1033 if (error_code != IMAGE_UTIL_ERROR_NONE) {
1034 g_print("Fail to decode image %d\n", error_code);
1039 result->buffer = calloc(1, buffer_size);
1040 if (result->buffer) {
1041 memcpy(result->buffer, buffer, buffer_size);
1042 result->buffer_size = buffer_size;
1047 static void __transform_completed_cb(media_packet_h *dst, int error_code, void *user_data)
1049 media_packet_h *result = (media_packet_h *)user_data;
1051 g_print("\t__transform_completed_cb invoked %d\n", error_code);
1053 if (error_code != IMAGE_UTIL_ERROR_NONE) {
1054 g_print("Fail to transform image %d\n", error_code);
1064 static void __transform_completed2_cb(image_util_image_h dst, int error_code, void *user_data)
1066 int ret = IMAGE_UTIL_ERROR_NONE;
1067 test_complex_data_s *result = (test_complex_data_s *)user_data;
1069 g_print("\t__transform_completed2_cb invoked %d\n", error_code);
1071 if (error_code != IMAGE_UTIL_ERROR_NONE) {
1072 g_print("Fail to transform image %d\n", error_code);
1077 ret = image_util_clone_image(dst, &result->image);
1078 if (ret != IMAGE_UTIL_ERROR_NONE)
1079 g_print("image_util_clone_image failed %d\n", ret);
1084 /* callback functions for test */
1087 /* test functions for testsuite */
1088 /* decode JPE, PNG, GIF and BMP with params
1089 * input : use path or buffer(buffer_size)
1090 * output : use image
1092 static int __run_decode(test_decode_menu_e menu, test_complex_data_s *input,
1093 test_decode_params_s *params, test_complex_data_s *result)
1095 int ret = IMAGE_UTIL_ERROR_NONE;
1096 image_util_decode_h handle = NULL;
1097 unsigned long width = 0;
1098 unsigned long height = 0;
1099 unsigned long long buffer_size = 0;
1101 if (!input || !params || !result) {
1102 g_print("invalid parameter!!! input: %p, params: %p, result: %p\n", input, params, result);
1103 return IMAGE_UTIL_ERROR_INVALID_PARAMETER;
1106 if (result->image) {
1107 image_util_destroy_image(result->image);
1108 result->image = NULL;
1111 ret = image_util_decode_create(&handle);
1112 if (ret != IMAGE_UTIL_ERROR_NONE) {
1113 g_print("image_util_decode_create failed %d\n", ret);
1117 if (input->has_buffer) {
1118 ret = image_util_decode_set_input_buffer(handle, input->buffer, input->buffer_size);
1119 if (ret != IMAGE_UTIL_ERROR_NONE) {
1120 g_print("image_util_decode_set_input_buffer failed %d\n", ret);
1124 ret = image_util_decode_set_input_path(handle, input->path);
1125 if (ret != IMAGE_UTIL_ERROR_NONE) {
1126 g_print("image_util_decode_set_input_path failed %d\n", ret);
1131 ret = image_util_decode_set_colorspace(handle, params->color);
1132 if (ret != IMAGE_UTIL_ERROR_NONE) {
1133 g_print("image_util_decode_set_colorspace failed %d\n", ret);
1139 ret = image_util_decode_set_output_buffer(handle, &result->buffer);
1140 if (ret != IMAGE_UTIL_ERROR_NONE) {
1141 g_print("image_util_decode_run failed %d\n", ret);
1145 ret = image_util_decode_run(handle, &width, &height, &buffer_size);
1146 if (ret != IMAGE_UTIL_ERROR_NONE) {
1147 g_print("image_util_decode_run failed %d\n", ret);
1151 ret = image_util_create_image((unsigned int)width, (unsigned int)height, params->color,
1152 result->buffer, buffer_size, &result->image);
1153 SAFE_FREE(result->buffer);
1154 if (ret != IMAGE_UTIL_ERROR_NONE) {
1155 g_print("image_util_create_image failed %d\n", ret);
1160 case DECODE_RUN_ASYNC:
1161 ret = image_util_decode_set_output_buffer(handle, &result->buffer);
1162 if (ret != IMAGE_UTIL_ERROR_NONE) {
1163 g_print("image_util_decode_run failed %d\n", ret);
1167 ret = image_util_decode_run_async(handle, __decode_completed_cb, result);
1168 if (ret != IMAGE_UTIL_ERROR_NONE) {
1169 g_print("image_util_decode_run failed %d\n", ret);
1174 ret = image_util_create_image(result->size.w, result->size.h, params->color,
1175 result->buffer, result->buffer_size, &result->image);
1176 SAFE_FREE(result->buffer);
1177 if (ret != IMAGE_UTIL_ERROR_NONE) {
1178 g_print("image_util_create_image failed %d\n", ret);
1184 ret = image_util_decode_run2(handle, &result->image);
1185 if (ret != IMAGE_UTIL_ERROR_NONE) {
1186 g_print("image_util_decode_run2 failed %d\n", ret);
1191 case DECODE_RUN_ASYNC2:
1192 ret = image_util_decode_run_async2(handle, __decode_completed2_cb, result);
1193 if (ret != IMAGE_UTIL_ERROR_NONE) {
1194 g_print("image_util_decode_run2 failed %d\n", ret);
1201 g_print("wrong decode menu %u\n", menu);
1206 image_util_decode_destroy(handle);
1211 /* encode JPE, PNG, GIF and BMP with params
1213 * output : use path or buffer(buffer_size)
1215 static int __run_encode(test_encode_menu_e menu, test_complex_data_s *input,
1216 test_encode_params_s *params, test_complex_data_s *result)
1218 int ret = IMAGE_UTIL_ERROR_NONE;
1219 image_util_encode_h handle = NULL;
1220 unsigned long long buffer_size = 0;
1222 if (!input || !params || !result) {
1223 g_print("invalid parameter!!! input: %p, params: %p, result: %p\n", input, params, result);
1224 return IMAGE_UTIL_ERROR_INVALID_PARAMETER;
1227 ret = __get_raw_data(input);
1228 if (ret != IMAGE_UTIL_ERROR_NONE) {
1229 g_print("__get_raw_data failed %d\n", ret);
1233 if (result->buffer) {
1234 SAFE_FREE(result->buffer);
1235 result->image = NULL;
1238 ret = image_util_encode_create(params->type, &handle);
1239 if (ret != IMAGE_UTIL_ERROR_NONE) {
1240 g_print("image_util_decode_create failed %d\n", ret);
1244 if (params->type == IMAGE_UTIL_JPEG) {
1245 ret = image_util_encode_set_quality(handle, params->quality);
1246 if (ret != IMAGE_UTIL_ERROR_NONE) {
1247 g_print("image_util_decode_set_input_buffer failed %d\n", ret);
1250 } else if (params->type == IMAGE_UTIL_PNG) {
1251 ret = image_util_encode_set_png_compression(handle, params->compression);
1252 if (ret != IMAGE_UTIL_ERROR_NONE) {
1253 g_print("image_util_decode_set_input_buffer failed %d\n", ret);
1261 SAFE_FREE(input->buffer);
1262 ret = image_util_get_image(input->image, &input->size.w, &input->size.h, &input->color, &input->buffer, &input->buffer_size);
1263 if (ret != IMAGE_UTIL_ERROR_NONE) {
1264 g_print("image_util_get_image failed %d\n", ret);
1269 ret = image_util_encode_set_resolution(handle, input->size.w, input->size.h);
1270 if (ret != IMAGE_UTIL_ERROR_NONE) {
1271 g_print("image_util_encode_set_resolution failed %d\n", ret);
1275 ret = image_util_encode_set_colorspace(handle, input->color);
1276 if (ret != IMAGE_UTIL_ERROR_NONE) {
1277 g_print("image_util_decode_run failed %d\n", ret);
1281 ret = image_util_encode_set_input_buffer(handle, input->buffer);
1282 if (ret != IMAGE_UTIL_ERROR_NONE) {
1283 g_print("image_util_encode_set_input_buffer failed %d\n", ret);
1287 if (params->use_buffer) {
1288 ret = image_util_encode_set_output_buffer(handle, &result->buffer);
1289 if (ret != IMAGE_UTIL_ERROR_NONE) {
1290 g_print("image_util_encode_set_output_buffer failed %d\n", ret);
1294 ret = image_util_encode_set_output_path(handle, result->path);
1295 if (ret != IMAGE_UTIL_ERROR_NONE) {
1296 g_print("image_util_encode_set_output_path failed %d\n", ret);
1301 ret = image_util_encode_run(handle, &buffer_size);
1302 if (ret != IMAGE_UTIL_ERROR_NONE) {
1303 g_print("image_util_encode_run failed %d\n", ret);
1306 result->buffer_size = buffer_size;
1308 if (params->use_buffer) {
1309 __write_file(result->path, result->buffer, result->buffer_size);
1310 SAFE_FREE(result->buffer);
1314 case ENCODE_RUN_ASYNC:
1316 SAFE_FREE(input->buffer);
1317 ret = image_util_get_image(input->image, &input->size.w, &input->size.h, &input->color, &input->buffer, &input->buffer_size);
1318 if (ret != IMAGE_UTIL_ERROR_NONE) {
1319 g_print("image_util_get_image failed %d\n", ret);
1324 ret = image_util_encode_set_resolution(handle, input->size.w, input->size.h);
1325 if (ret != IMAGE_UTIL_ERROR_NONE) {
1326 g_print("image_util_encode_set_resolution failed %d\n", ret);
1330 ret = image_util_encode_set_colorspace(handle, input->color);
1331 if (ret != IMAGE_UTIL_ERROR_NONE) {
1332 g_print("image_util_decode_run failed %d\n", ret);
1336 ret = image_util_encode_set_input_buffer(handle, input->buffer);
1337 if (ret != IMAGE_UTIL_ERROR_NONE) {
1338 g_print("image_util_encode_set_input_buffer failed %d\n", ret);
1342 if (params->use_buffer) {
1343 ret = image_util_encode_set_output_buffer(handle, &result->buffer);
1344 if (ret != IMAGE_UTIL_ERROR_NONE) {
1345 g_print("image_util_encode_set_output_buffer failed %d\n", ret);
1349 ret = image_util_encode_set_output_path(handle, result->path);
1350 if (ret != IMAGE_UTIL_ERROR_NONE) {
1351 g_print("image_util_encode_set_output_path failed %d\n", ret);
1356 ret = image_util_encode_run_async(handle, __encode_completed_cb, result);
1357 if (ret != IMAGE_UTIL_ERROR_NONE) {
1358 g_print("image_util_encode_run_async failed %d\n", ret);
1363 if (params->use_buffer) {
1364 __write_file(result->path, result->buffer, result->buffer_size);
1365 SAFE_FREE(result->buffer);
1369 case ENCODE_RUN_TO_FILE:
1370 ret = image_util_encode_run_to_file(handle, input->image, result->path);
1371 if (ret != IMAGE_UTIL_ERROR_NONE)
1372 g_print("image_util_encode_run_to_file failed %d\n", ret);
1374 case ENCODE_RUN_TO_BUFFER:
1375 ret = image_util_encode_run_to_buffer(handle, input->image, &result->buffer, &result->buffer_size);
1376 if (ret != IMAGE_UTIL_ERROR_NONE) {
1377 g_print("image_util_encode_run_to_buffer failed %d\n", ret);
1380 __write_file(result->path, result->buffer, result->buffer_size);
1382 case ENCODE_RUN_ASYNC_TO_FILE:
1383 ret = image_util_encode_run_async_to_file(handle, input->image, result->path,
1384 __encode_to_file_completed_cb, NULL);
1385 if (ret != IMAGE_UTIL_ERROR_NONE) {
1386 g_print("image_util_encode_run_async_to_file failed %d\n", ret);
1391 case ENCODE_RUN_ASYNC_TO_BUFFER:
1392 ret = image_util_encode_run_async_to_buffer(handle, input->image,
1393 __encode_to_buffer_completed_cb, result);
1394 if (ret != IMAGE_UTIL_ERROR_NONE) {
1395 g_print("image_util_encode_run_async_to_buffer failed %d\n", ret);
1399 __write_file(result->path, result->buffer, result->buffer_size);
1403 g_print("wrong encode menu %u", menu);
1408 image_util_encode_destroy(handle);
1413 /* encode animated GIF with deprecated APIs
1414 * input : use image_cnt & images
1415 * output : use path or buffer(buffer_size)
1417 static int __run_encode_agif_deprecated(test_encode_menu_e menu, test_complex_data_s *input,
1418 test_encode_agif_params_s *params, test_complex_data_s *result)
1420 int ret = IMAGE_UTIL_ERROR_NONE;
1421 image_util_encode_h handle = NULL;
1423 unsigned int width = 0, height = 0;
1424 unsigned char **buffer = NULL;
1425 size_t buffer_size = 0;
1426 unsigned long long size = 0;
1428 if (!input || !params || !result) {
1429 g_print("invalid parameter!!! input: %p, params: %p, result: %p\n", input, params, result);
1430 return IMAGE_UTIL_ERROR_INVALID_PARAMETER;
1433 buffer = calloc(1, sizeof(char *) * input->image_cnt);
1435 g_print("Memory allocation failed %d\n", ret);
1436 return IMAGE_UTIL_ERROR_OUT_OF_MEMORY;
1439 ret = image_util_encode_create(IMAGE_UTIL_GIF, &handle);
1440 if (ret != IMAGE_UTIL_ERROR_NONE) {
1441 g_print("image_util_encode_create failed %d\n", ret);
1446 for (i = 0; i < input->image_cnt; i++) {
1447 ret = image_util_get_image(input->images[i], &width, &height, NULL, &buffer[i], &buffer_size);
1448 if (ret != IMAGE_UTIL_ERROR_NONE) {
1449 g_print("image_util_get_image failed %d\n", ret);
1453 ret = image_util_encode_set_resolution(handle, (unsigned long) width, (unsigned long) height);
1454 if (ret != IMAGE_UTIL_ERROR_NONE) {
1455 g_print("image_util_encode_set_resolution failed %d\n", ret);
1459 ret = image_util_encode_set_gif_frame_delay_time(handle, params->delay);
1460 if (ret != IMAGE_UTIL_ERROR_NONE) {
1461 g_print("image_util_encode_set_gif_frame_delay_time failed %d\n", ret);
1465 ret = image_util_encode_set_input_buffer(handle, buffer[i]);
1466 if (ret != IMAGE_UTIL_ERROR_NONE) {
1467 g_print("image_util_encode_set_input_buffer failed %d\n", ret);
1473 case ENCODE_AGIF_RUN:
1474 if (params->use_buffer) {
1475 ret = image_util_encode_set_output_buffer(handle, &result->buffer);
1476 if (ret != IMAGE_UTIL_ERROR_NONE) {
1477 g_print("image_util_encode_set_output_buffer failed %d\n", ret);
1481 ret = image_util_encode_set_output_path(handle, result->path);
1482 if (ret != IMAGE_UTIL_ERROR_NONE) {
1483 g_print("image_util_encode_set_output_path failed %d\n", ret);
1488 ret = image_util_encode_run(handle, &size);
1489 if (ret != IMAGE_UTIL_ERROR_NONE) {
1490 g_print("image_util_encode_run failed %d\n", ret);
1494 result->buffer_size = (size_t)size;
1495 if (params->use_buffer) {
1496 __write_file(result->path, result->buffer, result->buffer_size);
1497 SAFE_FREE(result->buffer);
1501 case ENCODE_AGIF_RUN_ASYNC:
1502 if (params->use_buffer) {
1503 ret = image_util_encode_set_output_buffer(handle, &result->buffer);
1504 if (ret != IMAGE_UTIL_ERROR_NONE) {
1505 g_print("image_util_encode_set_output_buffer failed %d\n", ret);
1509 ret = image_util_encode_set_output_path(handle, result->path);
1510 if (ret != IMAGE_UTIL_ERROR_NONE) {
1511 g_print("image_util_encode_set_output_path failed %d\n", ret);
1516 ret = image_util_encode_run_async(handle, __encode_completed_cb, &result);
1517 if (ret != IMAGE_UTIL_ERROR_NONE) {
1518 g_print("image_util_encode_run_async failed %d\n", ret);
1523 if (params->use_buffer) {
1524 __write_file(result->path, result->buffer, result->buffer_size);
1525 SAFE_FREE(result->buffer);
1529 g_print("wrong encode agif menu %u", menu);
1534 image_util_encode_destroy(handle);
1536 for (i = 0; i < input->image_cnt; i++)
1537 SAFE_FREE(buffer[i]);
1544 /* encode animated GIF frame by frame
1545 * input : use image_cnt & images
1546 * output : use path or buffer(buffer_size)
1548 static int __run_encode_agif(test_encode_menu_e menu, test_complex_data_s *input,
1549 test_encode_agif_params_s *params, test_complex_data_s *result)
1551 int ret = IMAGE_UTIL_ERROR_NONE;
1552 image_util_agif_encode_h handle = NULL;
1555 if (!input || !params || !result) {
1556 g_print("invalid parameter!!! input: %p, params: %p, result: %p\n", input, params, result);
1557 return IMAGE_UTIL_ERROR_INVALID_PARAMETER;
1560 ret = image_util_agif_encode_create(&handle);
1561 if (ret != IMAGE_UTIL_ERROR_NONE) {
1562 g_print("image_util_agif_encode_create failed %d\n", ret);
1566 for (i = 0; i < input->image_cnt; i++) {
1567 ret = image_util_agif_encode_add_frame(handle, input->images[i], params->delay);
1568 if (ret != IMAGE_UTIL_ERROR_NONE) {
1569 g_print("image_util_agif_encode_add_frame failed %d\n", ret);
1575 case ENCODE_AGIF_SAVE_TO_FILE:
1576 ret = image_util_agif_encode_save_to_file(handle, result->path);
1577 if (ret != IMAGE_UTIL_ERROR_NONE) {
1578 g_print("image_util_agif_encode_save_to_file failed %d\n", ret);
1583 case ENCODE_AGIF_SAVE_TO_BUFFER:
1584 ret = image_util_agif_encode_save_to_buffer(handle, &result->buffer, &result->buffer_size);
1585 if (ret != IMAGE_UTIL_ERROR_NONE) {
1586 g_print("image_util_agif_encode_save_to_buffer failed %d\n", ret);
1589 __write_file(result->path, result->buffer, result->buffer_size);
1590 SAFE_FREE(result->buffer);
1593 g_print("wrong encode agif menu %u", menu);
1598 image_util_agif_encode_destroy(handle);
1603 /* run transform with parameters
1604 * input/output : use only image_h
1606 static int __run_transform(test_transform_menu_e menu, test_complex_data_s *input,
1607 test_transform_params_s *params, test_complex_data_s *result)
1609 int ret = IMAGE_UTIL_ERROR_NONE;
1610 transformation_h handle = NULL;
1611 media_packet_h mpacket = NULL;
1612 media_packet_h res_mpacket = NULL;
1614 if (!input || !params || !result) {
1615 g_print("invalid parameter!!! input: %p, params: %p, result: %p\n", input, params, result);
1616 return IMAGE_UTIL_ERROR_INVALID_PARAMETER;
1619 ret = __get_raw_data(input);
1620 if (ret != IMAGE_UTIL_ERROR_NONE) {
1621 g_print("__get_raw_data failed %d\n", ret);
1625 if (result->image) {
1626 image_util_destroy_image(result->image);
1627 result->image = NULL;
1630 ret = image_util_transform_create(&handle);
1631 if (ret != IMAGE_UTIL_ERROR_NONE) {
1632 g_print("image_util_transform_create failed %d\n", ret);
1636 if (params->has_convert_color) {
1637 ret = image_util_transform_set_colorspace(handle, params->convert_color);
1638 if (ret != IMAGE_UTIL_ERROR_NONE) {
1639 g_print("image_util_transform_set_colorspace failed %d\n", ret);
1644 if (params->has_crop) {
1645 ret = image_util_transform_set_crop_area(handle, params->crop_area.x, params->crop_area.y, params->crop_area.w, params->crop_area.h);
1646 if (ret != IMAGE_UTIL_ERROR_NONE) {
1647 g_print("image_util_transform_set_crop_area failed %d\n", ret);
1652 if (params->has_resize) {
1653 ret = image_util_transform_set_resolution(handle, params->resize.w, params->resize.h);
1654 if (ret != IMAGE_UTIL_ERROR_NONE) {
1655 g_print("image_util_transform_set_resolution failed %d\n", ret);
1660 if (params->has_rotation) {
1661 ret = image_util_transform_set_rotation(handle, params->rotation);
1662 if (ret != IMAGE_UTIL_ERROR_NONE) {
1663 g_print("image_util_transform_set_rotation failed %d\n", ret);
1670 ret = _image_util_image_to_packet(input->image, &mpacket);
1671 if (ret != IMAGE_UTIL_ERROR_NONE) {
1672 g_print("_image_util_image_to_packet failed %d\n", ret);
1676 ret = image_util_transform_run(handle, mpacket, __transform_completed_cb, &res_mpacket);
1677 if (ret != IMAGE_UTIL_ERROR_NONE) {
1678 g_print("image_util_transform_run failed %d\n", ret);
1683 ret = _image_util_packet_to_image(res_mpacket, &result->image);
1684 if (ret != IMAGE_UTIL_ERROR_NONE) {
1685 g_print("_image_util_packet_to_image failed %d\n", ret);
1689 case TRANSFORM_RUN2:
1690 ret = image_util_transform_run2(handle, input->image, &result->image);
1691 if (ret != IMAGE_UTIL_ERROR_NONE) {
1692 g_print("image_util_transform_run2 failed %d\n", ret);
1696 case TRANSFORM_RUN2_ASYNC:
1697 ret = image_util_transform_run2_async(handle, input->image, __transform_completed2_cb, result);
1698 if (ret != IMAGE_UTIL_ERROR_NONE) {
1699 g_print("image_util_transform_run2_async failed %d\n", ret);
1705 g_print("wrong transform menu %u\n", menu);
1710 media_packet_destroy(mpacket);
1711 media_packet_destroy(res_mpacket);
1712 image_util_transform_destroy(handle);
1717 static int __run_auto(void)
1719 int ret = IMAGE_UTIL_ERROR_NONE;
1720 image_util_type_e image_type = IMAGE_UTIL_JPEG;
1721 static test_complex_data_s encode_temp_result;
1725 g_decode_params.color = IMAGE_UTIL_COLORSPACE_RGBA8888;
1726 g_decode_params.downscale = IMAGE_UTIL_DOWNSCALE_1_1;
1728 ret = __run_decode(DECODE_RUN2, &g_input_data, &g_decode_params, &g_decode_result);
1729 if (ret == IMAGE_UTIL_ERROR_NONE)
1730 g_print("Success DECODE_RUN2!!!\n");
1732 g_print("Fail DECODE_RUN2!!!\n");
1734 g_encode_params.type = IMAGE_UTIL_JPEG;
1735 g_encode_params.quality = 100;
1736 __set_auto_file(g_encode_params.type, &g_encode_result.path);
1738 g_transform_params.crop_area.x = 0;
1739 g_transform_params.crop_area.y = 0;
1740 g_transform_params.crop_area.w = 640;
1741 g_transform_params.crop_area.h = 480;
1743 g_transform_params.resize.w = 320;
1744 g_transform_params.resize.h = 240;
1746 g_transform_params.rotation = IMAGE_UTIL_ROTATION_90;
1748 ret = __run_encode(ENCODE_RUN_TO_FILE, &g_decode_result, &g_encode_params, &g_encode_result);
1749 if (ret == IMAGE_UTIL_ERROR_NONE)
1750 g_print("Success ENCODE_RUN_TO_FILE!!!\n");
1752 g_print("Fail ENCODE_RUN_TO_FILE!!!\n");
1754 for (image_type = IMAGE_UTIL_JPEG; image_type <= IMAGE_UTIL_BMP; image_type++) {
1755 g_print("[[[ IMAGE_TYPE %d ]]]\n", image_type);
1757 ret = __run_decode(DECODE_RUN2, &g_encode_result, &g_decode_params, &g_decode_result);
1758 if (ret == IMAGE_UTIL_ERROR_NONE)
1759 g_print("Success DECODE_RUN2!!!\n");
1761 g_print("Fail DECODE_RUN2!!!\n");
1763 g_transform_params.has_crop = TRUE;
1764 __run_transform(TRANSFORM_RUN2, &g_decode_result, &g_transform_params, &g_transform_result);
1765 if (ret == IMAGE_UTIL_ERROR_NONE)
1766 g_print("Success TRANSFORM_RUN2(crop)!!!\n");
1768 g_print("Fail TRANSFORM_RUN2(crop)!!!\n");
1770 g_transform_params.has_crop = FALSE;
1772 __set_auto_file(image_type, &encode_temp_result.path);
1773 ret = __run_encode(ENCODE_RUN_TO_FILE, &g_decode_result, &g_encode_params, &encode_temp_result);
1774 if (ret == IMAGE_UTIL_ERROR_NONE)
1775 g_print("Success ENCODE_RUN_TO_FILE!!!\n");
1777 g_print("Fail ENCODE_RUN_TO_FILE!!!\n");
1779 __run_decode(DECODE_RUN_ASYNC2, &g_encode_result, &g_decode_params, &g_decode_result);
1780 if (ret == IMAGE_UTIL_ERROR_NONE)
1781 g_print("Success DECODE_RUN_ASYNC2!!!\n");
1783 g_print("Fail DECODE_RUN_ASYNC2!!!\n");
1785 g_transform_params.has_resize = TRUE;
1786 __run_transform(TRANSFORM_RUN2, &g_decode_result, &g_transform_params, &g_transform_result);
1787 if (ret == IMAGE_UTIL_ERROR_NONE)
1788 g_print("Success TRANSFORM_RUN2(resize)!!!\n");
1790 g_print("Fail TRANSFORM_RUN2(resize)!!!\n");
1792 g_transform_params.has_resize = FALSE;
1794 __set_auto_file(image_type, &encode_temp_result.path);
1795 ret = __run_encode(ENCODE_RUN_TO_BUFFER, &g_transform_result, &g_encode_params, &encode_temp_result);
1796 if (ret == IMAGE_UTIL_ERROR_NONE)
1797 g_print("Success ENCODE_RUN_TO_BUFFER!!!\n");
1799 g_print("Fail ENCODE_RUN_TO_BUFFER!!!\n");
1801 __run_decode(DECODE_RUN_ASYNC2, &g_encode_result, &g_decode_params, &g_decode_result);
1802 if (ret == IMAGE_UTIL_ERROR_NONE)
1803 g_print("Success DECODE_RUN_ASYNC2!!!\n");
1805 g_print("Fail DECODE_RUN_ASYNC2!!!\n");
1807 g_transform_params.has_rotation = TRUE;
1808 __run_transform(TRANSFORM_RUN2, &g_decode_result, &g_transform_params, &g_transform_result);
1809 if (ret == IMAGE_UTIL_ERROR_NONE)
1810 g_print("Success TRANSFORM_RUN2(rotate)!!!\n");
1812 g_print("Fail TRANSFORM_RUN2(rotate)!!!\n");
1814 g_transform_params.has_rotation = FALSE;
1816 /* change next image_type */
1817 g_encode_params.type = ((image_type + 1 > IMAGE_UTIL_BMP) ? IMAGE_UTIL_BMP : (image_type + 1));
1818 __set_auto_file(g_encode_params.type, &g_encode_result.path);
1820 ret = __run_encode(ENCODE_RUN_ASYNC_TO_BUFFER, &g_transform_result, &g_encode_params, &g_encode_result);
1821 if (ret == IMAGE_UTIL_ERROR_NONE)
1822 g_print("Success ENCODE_RUN_ASYNC_TO_BUFFER!!!\n");
1824 g_print("Fail ENCODE_RUN_ASYNC_TO_BUFFER!!!\n");
1829 /* test functions for testsuite */
1832 /* interprete menu */
1834 /* push result data-set of test to stack */
1835 static void __data_push(test_complex_data_s *comp_data)
1840 if (!g_queue_data) {
1841 g_queue_data = g_queue_new();
1842 if (!g_queue_data) {
1843 g_print("g_queue_new failed\n");
1849 g_print("[push data] %u\n", comp_data->type);
1852 g_queue_push_tail(g_queue_data, comp_data);
1855 static void __data_push_if_empty(test_complex_data_s *comp_data)
1858 if (!g_queue_is_empty(g_queue_data)) {
1859 g_print("data queue is not empty\n");
1864 __data_push(comp_data);
1867 /* pop input data-set of test from stack */
1868 static gboolean __data_pop(test_complex_data_s **comp_data)
1870 test_complex_data_s *get = NULL;
1872 if (g_queue_is_empty(g_queue_data)) {
1876 get = g_queue_pop_tail(g_queue_data);
1878 g_print("wrong data!\n\n");
1883 g_print("[pop data] %u\n", get->type);
1891 static void __menu_move(test_menu_state_e new_menu)
1893 test_queue_menu_s *data = NULL;
1895 if (!g_queue_menu) {
1896 g_queue_menu = g_queue_new();
1897 if (!g_queue_menu) {
1898 g_print("g_queue_new failed\n");
1903 data = calloc(1, sizeof(test_queue_menu_s));
1905 g_print("Memory allocation failed\n");
1910 g_print("[menu move] %u -> %u\n", g_current_menu, new_menu);
1913 /* push current menu into queue */
1914 data->menu_state = g_current_menu;
1915 g_queue_push_tail(g_queue_menu, data);
1917 g_previous_menu = g_current_menu;
1919 /* go to new menu */
1920 g_current_menu = new_menu;
1923 static void __menu_back(void)
1925 test_queue_menu_s *data = NULL;
1927 if (g_queue_is_empty(g_queue_menu)) {
1928 g_print("empty previous menu!\n\n");
1932 /* pop previous menu from queue */
1933 data = g_queue_pop_tail(g_queue_menu);
1935 g_print("wrong menu data!\n\n");
1940 g_print("[menu back] %u -> %u\n", g_current_menu, data->menu_state);
1943 g_previous_menu = g_current_menu;
1945 /* go to previous menu */
1946 g_current_menu = data->menu_state;
1951 static void __quit(void)
1954 g_main_loop_quit(g_mainloop);
1957 static void __interpret_decode(const char *cmd, unsigned int index)
1960 test_complex_data_s *input_data = NULL;
1963 case DECODE_SET_BUFFER:
1964 __menu_move(SET_BUFFER_MENU);
1966 case DECODE_SET_COLOR:
1967 __menu_move(SET_COLOR_MENU);
1969 case DECODE_SET_DOWNSCALE:
1970 __menu_move(SET_DOWNSCALE_MENU);
1973 case DECODE_RUN_ASYNC:
1975 case DECODE_RUN_ASYNC2:
1976 if (!__data_pop(&input_data)) {
1977 g_print("There is no test data for decode.\n");
1980 ret = __run_decode(index, input_data, &g_decode_params, &g_decode_result);
1981 if (ret == IMAGE_UTIL_ERROR_NONE) {
1982 g_print("Success to decode image!!!\n");
1984 __write_jpeg("decode", g_decode_result.image);
1986 __data_push(&g_decode_result);
1988 g_print("Fail to decode image!!!\n");
1989 __data_push(input_data);
1993 g_print("wrong command! %s\n\n", cmd);
1998 static void __interpret_encode(const char *cmd, unsigned int index)
2001 test_complex_data_s *input_data = NULL;
2004 case ENCODE_SET_TYPE:
2005 __menu_move(SET_TYPE_MENU);
2007 case ENCODE_SET_QUALITY:
2008 __menu_move(SET_QUALITY_MENU);
2010 case ENCODE_SET_COMPRESIION:
2011 __menu_move(SET_COMPRESSION_MENU);
2013 case ENCODE_SET_TO_BUFFER:
2014 __menu_move(SET_TO_BUFFER_MENU);
2017 case ENCODE_RUN_ASYNC:
2018 case ENCODE_RUN_TO_FILE:
2019 case ENCODE_RUN_TO_BUFFER:
2020 case ENCODE_RUN_ASYNC_TO_FILE:
2021 case ENCODE_RUN_ASYNC_TO_BUFFER:
2022 if (!__data_pop(&input_data)) {
2023 g_print("There is no test data for encode.\n");
2026 __set_encode_file(g_encode_params.type, FILE_FOR_ENCODE, &g_encode_result.path);
2027 ret = __run_encode(index, input_data, &g_encode_params, &g_encode_result);
2028 if (ret == IMAGE_UTIL_ERROR_NONE) {
2029 g_print("Success to encode image!!!\n");
2030 __data_push(&g_encode_result);
2032 g_print("Fail to encode image!!!\n");
2033 __data_push(input_data);
2037 g_print("wrong command! %s\n\n", cmd);
2042 static void __interpret_encode_agif(const char *cmd, unsigned int index)
2045 test_complex_data_s *input_data = NULL;
2048 case ENCODE_AGIF_SET_DIR:
2049 __menu_move(SET_DIR_MENU);
2051 case ENCODE_AGIF_SET_DELAY:
2052 __menu_move(SET_DELAY_MENU);
2054 case ENCODE_AGIF_SET_TO_BUFFER:
2055 __menu_move(SET_TO_BUFFER_MENU);
2057 case ENCODE_AGIF_RUN:
2058 case ENCODE_AGIF_RUN_ASYNC:
2059 if (!__data_pop(&input_data)) {
2060 g_print("There is no test data for decode.\n");
2063 __set_encode_file(IMAGE_UTIL_GIF, FILE_FOR_ENCODE_AGIF, &g_encode_agif_result.path);
2064 ret = __run_encode_agif_deprecated(index, input_data, &g_encode_agif_params, &g_encode_agif_result);
2065 if (ret == IMAGE_UTIL_ERROR_NONE) {
2066 g_print("Success to encode image!!!\n");
2067 __data_push(&g_encode_agif_result);
2069 g_print("Fail to encode image!!!\n");
2070 __data_push(input_data);
2073 case ENCODE_AGIF_SAVE_TO_FILE:
2074 case ENCODE_AGIF_SAVE_TO_BUFFER:
2075 if (!__data_pop(&input_data)) {
2076 g_print("There is no test data for decode.\n");
2079 __set_encode_file(IMAGE_UTIL_GIF, FILE_FOR_ENCODE_AGIF, &g_encode_agif_result.path);
2080 ret = __run_encode_agif(index, input_data, &g_encode_agif_params, &g_encode_agif_result);
2081 if (ret == IMAGE_UTIL_ERROR_NONE) {
2082 g_print("Success to encode image!!!\n");
2083 __data_push(&g_encode_agif_result);
2085 g_print("Fail to encode image!!!\n");
2086 __data_push(input_data);
2090 g_print("wrong command! %s\n\n", cmd);
2095 static void __interpret_transform(const char *cmd, unsigned int index)
2098 test_complex_data_s *input_data = NULL;
2101 case TRANSFORM_SET_CONVERT:
2102 __menu_move(SET_CONVERT_MENU);
2104 case TRANSFORM_SET_CROP:
2105 __menu_move(SET_CROP_MENU);
2107 case TRANSFORM_SET_RESIZE:
2108 __menu_move(SET_RESIZE_MENU);
2110 case TRANSFORM_SET_ROTATE:
2111 __menu_move(SET_ROTATE_MENU);
2114 case TRANSFORM_RUN2:
2115 case TRANSFORM_RUN2_ASYNC:
2116 if (!__data_pop(&input_data)) {
2117 g_print("There is no test data for decode.\n");
2120 ret = __run_transform(index, input_data, &g_transform_params, &g_transform_result);
2121 if (ret == IMAGE_UTIL_ERROR_NONE) {
2122 g_print("Success to transform image!!!\n");
2124 __write_jpeg("transform", g_transform_result.image);
2126 __data_push(&g_transform_result);
2128 g_print("Fail to transform image!!!\n");
2129 __data_push(input_data);
2133 g_print("wrong command! %s\n\n", cmd);
2138 static gboolean __interpret_set_menu(test_menu_state_e menu_state, const char *cmd, unsigned int index)
2140 switch(menu_state) {
2141 case SET_BUFFER_MENU:
2142 if (g_ascii_strcasecmp(cmd, "y") == 0) {
2143 SAFE_FREE(g_input_data.buffer);
2144 if (__read_file(g_input_data.path, (void **)&g_input_data.buffer, &g_input_data.buffer_size)) {
2145 g_input_data.has_buffer = TRUE;
2146 g_print("Success to read file(%s), read_size(%zu)\n", g_input_data.path, g_input_data.buffer_size);
2150 case SET_TO_BUFFER_MENU:
2151 if (g_ascii_strcasecmp(cmd, "y") == 0) {
2152 if (g_previous_menu == ENCODE_MENU) {
2153 g_encode_params.use_buffer = TRUE;
2154 g_print("Data will be encoded to buffer\n");
2155 } else if (g_previous_menu == ENCODE_AGIF_MENU) {
2156 g_encode_agif_params.use_buffer = TRUE;
2157 g_print("Data will be encoded to buffer\n");
2160 g_encode_params.use_buffer = FALSE;
2161 g_encode_agif_params.use_buffer = FALSE;
2164 case SET_RAW_COLOR_MENU:
2165 g_input_data.color = index;
2166 g_print("Success to set raw path color (%u)\n", g_input_data.color);
2168 case SET_COLOR_MENU:
2169 g_decode_params.color = index;
2170 g_print("Success to set color (%u)\n", g_decode_params.color);
2172 case SET_COMPRESSION_MENU:
2173 g_encode_params.compression = index;
2174 g_print("Success to set compression (%u)\n", g_encode_params.compression);
2176 case SET_CONVERT_MENU:
2177 g_transform_params.convert_color = index;
2178 g_transform_params.has_convert_color = TRUE;
2179 g_print("Success to set convert_color (%u)\n", g_transform_params.convert_color);
2182 if (!__set_input_crop_area(cmd, &g_transform_params.crop_area)) {
2183 g_print("wrong size! %s\n\n", cmd);
2186 g_transform_params.has_crop = TRUE;
2187 g_print("Success to set crop_area(%ux%u, %ux%u)\n", g_transform_params.crop_area.x,
2188 g_transform_params.crop_area.y, g_transform_params.crop_area.w, g_transform_params.crop_area.h);
2190 case SET_DELAY_MENU:
2191 g_encode_agif_params.delay = index;
2192 g_print("Success to set agif delay (%u)\n", g_encode_agif_params.delay);
2194 case SET_DOWNSCALE_MENU:
2195 g_decode_params.downscale = index;
2197 case SET_QUALITY_MENU:
2198 g_encode_params.quality = index;
2199 g_print("Success to set quality (%u)\n", g_encode_params.quality);
2201 case SET_RESIZE_MENU:
2202 if (!__set_input_size(cmd, &g_transform_params.resize)) {
2203 g_print("wrong size! %s\n\n", cmd);
2206 g_transform_params.has_resize = TRUE;
2207 g_print("Success to set resize (%ux%u)\n", g_transform_params.resize.w, g_transform_params.resize.h);
2209 case SET_ROTATE_MENU:
2210 g_transform_params.rotation = index;
2211 g_transform_params.has_rotation = TRUE;
2212 g_print("Success to set rotate (%u)\n", g_transform_params.rotation);
2215 if (!__set_input_size(cmd, &g_input_data.size)) {
2216 g_print("wrong size! %s\n\n", cmd);
2219 g_print("Success to set size (%ux%u)\n", g_input_data.size.w, g_input_data.size.h);
2222 g_encode_params.type = index;
2223 __set_encode_file(g_encode_params.type, FILE_FOR_ENCODE, &g_encode_result.path);
2224 g_print("Success to set image_type (%u)\n", g_encode_params.type);
2227 g_print("wrong command! %s\n\n", cmd);
2234 static void __interpret_main(const char *cmd, unsigned int index)
2236 __data_push_if_empty(&g_input_data);
2240 __menu_move(SET_PATH_MENU);
2246 __menu_move(DECODE_MENU);
2249 __menu_move(ENCODE_MENU);
2251 case TEST_ENCODE_AGIF:
2252 __menu_move(ENCODE_AGIF_MENU);
2254 case TEST_TRANSFORM:
2255 __menu_move(TRANSFORM_MENU);
2258 g_print("wrong command! %s\n\n", cmd);
2263 static void __interpret_cmd(char *cmd)
2265 unsigned int index = 0;
2267 if (cmd == NULL || strlen(cmd) == 0) {
2268 g_print("No input!\n");
2272 if (strncmp(cmd, "q", strlen(cmd)) == 0) {
2277 if (strncmp(cmd, "b", strlen(cmd)) == 0) {
2279 __display_menu(g_current_menu);
2283 if (__safe_atoui(cmd, &index))
2284 g_print("number input! %u\n", index);
2286 g_print("string input! %s\n", cmd);
2288 switch(g_current_menu) {
2291 __interpret_main(cmd, index);
2296 __interpret_decode(cmd, index);
2301 __interpret_encode(cmd, index);
2304 /* Encode A-GIF menu */
2305 case ENCODE_AGIF_MENU:
2306 __interpret_encode_agif(cmd, index);
2309 /* Transform menu */
2310 case TRANSFORM_MENU:
2311 __interpret_transform(cmd, index);
2316 if (!__set_input_path(cmd)) {
2317 g_print("[Warn] Fail to set input path! %s\n", cmd);
2322 if (IS_RAW_FILE(g_input_data.path)) {
2323 g_input_data.is_raw = TRUE;
2324 __menu_move(SET_PATH_SUB_MENU);
2327 case SET_PATH_SUB_MENU:
2329 case RAW_IMG_SET_COLOR:
2330 __menu_move(SET_RAW_COLOR_MENU);
2332 case RAW_IMG_SET_SIZE:
2333 __menu_move(SET_SIZE_MENU);
2336 g_print("wrong raw path menu! %s\n\n", cmd);
2341 if (!__set_input_path(cmd)) {
2342 g_print("[Warn] Fail to set input path! %s\n", cmd);
2348 /* Set optional parameters menu */
2349 case SET_BUFFER_MENU:
2350 case SET_TO_BUFFER_MENU:
2351 case SET_COLOR_MENU:
2352 case SET_RAW_COLOR_MENU:
2353 case SET_COMPRESSION_MENU:
2354 case SET_CONVERT_MENU:
2356 case SET_DELAY_MENU:
2357 case SET_DOWNSCALE_MENU:
2358 case SET_QUALITY_MENU:
2359 case SET_RESIZE_MENU:
2360 case SET_ROTATE_MENU:
2363 if (__interpret_set_menu(g_current_menu, cmd, index))
2368 g_print("wrong menu state\n");
2372 __display_menu(g_current_menu);
2375 /* interprete menu */
2378 /* testsuite mainloop */
2380 * This function initializes and sets default values for testsuite
2382 static void _init_data(void)
2384 memset(&g_input_data, 0, sizeof(test_complex_data_s));
2386 /* init & set default parameters */
2387 memset(&g_decode_params, 0, sizeof(test_decode_params_s));
2388 memset(&g_encode_params, 0, sizeof(test_encode_params_s));
2389 memset(&g_encode_agif_params, 0, sizeof(test_encode_agif_params_s));
2390 memset(&g_transform_params, 0, sizeof(test_transform_params_s));
2392 /* If you want to change default value, change the value here!!! */
2396 g_decode_params.color = IMAGE_UTIL_COLORSPACE_RGBA8888;
2397 g_decode_params.downscale = IMAGE_UTIL_DOWNSCALE_1_1;
2400 g_encode_params.type = IMAGE_UTIL_JPEG;
2401 g_encode_params.quality = 75;
2402 g_encode_params.compression = IMAGE_UTIL_PNG_COMPRESSION_6;
2405 g_encode_agif_params.delay = 10;
2407 /* transform, not used yet */
2408 g_transform_params.convert_color = IMAGE_UTIL_COLORSPACE_RGB888;
2409 g_transform_params.crop_area.x = g_transform_params.crop_area.y = 100;
2410 g_transform_params.crop_area.w = g_transform_params.crop_area.h = 200;
2411 g_transform_params.resize.x = g_transform_params.resize.y = 0;
2412 g_transform_params.resize.w = g_transform_params.resize.h = 100;
2413 g_transform_params.rotation = IMAGE_UTIL_ROTATION_90;
2416 memset(&g_decode_result, 0, sizeof(test_complex_data_s));
2417 memset(&g_encode_result, 0, sizeof(test_complex_data_s));
2418 memset(&g_transform_result, 0, sizeof(test_complex_data_s));
2422 * This function releases allocated memory for testsuite when program finish
2424 static void _destroy_data(void)
2428 g_queue_free_full(g_queue_menu, __queue_free_func);
2429 g_queue_free_full(g_queue_agif_images, __queue_free_func);
2431 SAFE_G_FREE(g_input_data.path);
2432 SAFE_FREE(g_input_data.buffer);
2434 for (i = 0; i < g_input_data.image_cnt; i++)
2435 image_util_destroy_image(g_input_data.images[i]);
2437 SAFE_FREE(g_decode_result.buffer);
2438 SAFE_FREE(g_transform_result.buffer);
2439 SAFE_FREE(g_encode_result.buffer);
2441 image_util_destroy_image(g_decode_result.image);
2442 image_util_destroy_image(g_transform_result.image);
2443 image_util_destroy_image(g_encode_result.image);
2447 * This function gets input
2449 static gboolean _input_func(GIOChannel *channel, GIOCondition condition, gpointer data)
2451 gchar buf[MAX_STRING_LEN];
2453 GIOStatus status = 0;
2454 GError *error = NULL;
2456 status = g_io_channel_read_chars(channel, buf, MAX_STRING_LEN, &read, &error);
2458 g_print("g_io_channel_read_chars failed : %s", error ? error->message : "none");
2459 if (error) g_error_free(error);
2466 __interpret_cmd(buf);
2472 * This function displays help
2474 static void _display_help(const char *cmd)
2476 g_print("====================================================\n");
2477 g_print("[image-util CAPI test: v%s\n", VERSION);
2478 g_print("%s {file_path} {test_mode} [for jpg/png/gif/bmp]\n", cmd);
2479 g_print("%s {directory} {test_mode} [for a-gif]\n", cmd);
2480 g_print("{test_mode} 0:auto, 1:decode, 2:encode, 3:a-gif, 4:transform\n");
2481 g_print("\n[Note]\n");
2482 g_print(" The {file_path}/{directory} are mandotary. but the {test_mode} is optional.\n");
2483 g_print("\n[usage]\n");
2484 g_print(" 1. %s test.jpg\n", cmd);
2485 g_print(" 2. %s test.jpg %d\n", cmd, TEST_AUTO);
2486 g_print(" 3. %s test_dir %d\n", cmd, TEST_ENCODE_AGIF);
2487 g_print("====================================================\n");
2493 int main(int argc, char **argv)
2495 GIOChannel *stdin_channel = NULL;
2496 stdin_channel = g_io_channel_unix_new(0);
2497 g_io_channel_set_flags(stdin_channel, G_IO_FLAG_NONBLOCK, NULL);
2498 g_io_add_watch(stdin_channel, G_IO_IN, (GIOFunc)_input_func, NULL);
2502 if (argc > 1 && argv[1]) {
2503 if ((strcmp(argv[1], "help") == 0)
2504 || (strcmp(argv[1], "-h") == 0)
2505 || (strcmp(argv[1], "-help") == 0)
2506 || (strcmp(argv[1], "--help") == 0)) {
2507 _display_help(argv[0]);
2511 __set_input_path(argv[1]);
2515 * if there is no argument for path, go to set path menu.
2516 * else if there is raw data image, go to set path sub menu.
2518 if (!g_input_data.path) {
2519 __menu_move(MAIN_MENU);
2520 __menu_move(SET_PATH_MENU);
2521 } else if (IS_RAW_FILE(g_input_data.path)) {
2522 g_input_data.is_raw = TRUE;
2523 __menu_move(MAIN_MENU);
2524 __menu_move(SET_PATH_SUB_MENU);
2528 __menu_move(MAIN_MENU);
2529 __interpret_cmd(argv[2]);
2531 __display_menu(g_current_menu);
2534 g_mainloop = g_main_loop_new(NULL, FALSE);
2536 g_main_loop_run(g_mainloop);
2537 g_main_loop_unref(g_mainloop);
2541 g_io_channel_unref(stdin_channel);