From 7f5a06155d5a5c31da8a08ece04044cb56cd8d80 Mon Sep 17 00:00:00 2001 From: "jiyong.min" Date: Thu, 30 May 2019 09:43:52 +0900 Subject: [PATCH] Add unified image-util-testsuite and remove old tests - This supports all CAPIs in image-util SYNOPSIS capi-image-util-test [file | directory] [test_mode] ex ./capi-image-util-test test.jpg 0 DESCRIPTION 'capi-image-util-test' is testsuites for image-util. It can test all kind of CAPI in image-util. Most often capi-image-util-test is started to test a single file with the command ./capi-image-util-test [file] If the file is missing, the program will start with set path menu. help Give a help message and exit, just like "-h", "-help" and "--help" [file] A file to test. The test file should be jpg/png/gif/bmp or raw data. If the file is raw data, the program will request another information , size & color, of the raw data. [directory] A directory that has lots of images to encode a-gif. [test_mode] A mode to test. This is optional. If the mode is missing, the program will give the select message. 0: Auto, 1: decode, 2: encode, 3: encode a-gif, 4: transform Change-Id: If8b3d288cc75c27c9d2312296c6cb9623a2a6b52 --- CMakeLists.txt | 5 +- decode-test/CMakeLists.txt | 21 - decode-test/image_util_decode_encode_testsuite.c | 918 ------- test/CMakeLists.txt | 2 +- test/image_util_test.c | 762 ------ test/image_util_testsuite.c | 2813 ++++++++++++++++++++++ 6 files changed, 2816 insertions(+), 1705 deletions(-) delete mode 100755 decode-test/CMakeLists.txt delete mode 100755 decode-test/image_util_decode_encode_testsuite.c delete mode 100644 test/image_util_test.c create mode 100644 test/image_util_testsuite.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 1614416..97543c6 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -65,16 +65,15 @@ CONFIGURE_FILE( INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${fw_name}.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig) ADD_SUBDIRECTORY(test) -ADD_SUBDIRECTORY(decode-test) IF(UNIX) ADD_CUSTOM_TARGET (distclean @echo cleaning for source distribution) ADD_CUSTOM_COMMAND( - DEPENDS clean + DEPENDS clean COMMENT "distribution clean" COMMAND find - ARGS . + ARGS . -not -name config.cmake -and \( -name tester.c -or -name Testing -or diff --git a/decode-test/CMakeLists.txt b/decode-test/CMakeLists.txt deleted file mode 100755 index 8ced48c..0000000 --- a/decode-test/CMakeLists.txt +++ /dev/null @@ -1,21 +0,0 @@ -SET(fw_test "${fw_name}-decode-test") - -INCLUDE(FindPkgConfig) -pkg_check_modules(${fw_test} REQUIRED glib-2.0 libtzplatform-config) - -FOREACH(flag ${${fw_test}_CFLAGS}) - SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") - MESSAGE(${flag}) -ENDFOREACH() - -SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -pie -Wall") - -aux_source_directory(. sources) -FOREACH(src ${sources}) - GET_FILENAME_COMPONENT(src_name ${src} NAME_WE) - MESSAGE("${src_name}") - ADD_EXECUTABLE(${fw_test} ${src}) - TARGET_LINK_LIBRARIES(${fw_test} ${fw_name} ${${fw_test}_LDFLAGS}) -ENDFOREACH() - -INSTALL(TARGETS ${fw_test} DESTINATION bin) diff --git a/decode-test/image_util_decode_encode_testsuite.c b/decode-test/image_util_decode_encode_testsuite.c deleted file mode 100755 index a1a2235..0000000 --- a/decode-test/image_util_decode_encode_testsuite.c +++ /dev/null @@ -1,918 +0,0 @@ -/* - * image-utility - * - * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Vineeth T M - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define DECODE_RESULT_PATH tzplatform_mkpath(TZ_USER_CONTENT, "decode_test.") -#define ENCODE_RESULT_PATH tzplatform_mkpath(TZ_USER_CONTENT, "encode_test.") - -#define ARGC_MIN 3 -#define CMD_MAX 30 -#define TEST_FILE_MAX 100 - -typedef enum { - TEST_DECODE_FILE = 0, - TEST_DECODE_MEM, - TEST_DECODE_ASYNC, - TEST_DECODE_MEM_ASYNC, - LAST_DECODE_TEST = TEST_DECODE_MEM_ASYNC, - FIRST_GIF_TEST, - GIFTEST_ENCODE_FILE = FIRST_GIF_TEST, - GIFTEST_ENCODE_MEM, - TEST_COMMAND_NUM, -} test_command_e; - -typedef struct { - test_command_e cmd; - char *path; - unsigned int image_type; - void *buffer; - unsigned long long buffer_size; -} test_inputs_s; - -typedef struct { - gboolean decode_result; - char filepath[PATH_MAX]; - unsigned long width; - unsigned long height; - unsigned char *decoded; - unsigned long long decode_size; -} test_decode_s; - -typedef struct { - char out_path[PATH_MAX]; - unsigned char *encoded; - unsigned long long encode_size; -} test_encode_s; - -static unsigned int g_num_of_files; //only for agif -static unsigned int g_num_of_decoded; - -static test_inputs_s g_test_input; -static test_decode_s g_test_decode[TEST_FILE_MAX]; -static test_encode_s g_test_encode; -image_util_image_h g_decoded_image = NULL; - -static char TEST_CMD[][CMD_MAX] = { - "decode", - "decode-mem", - "decode-async", - "decode-mem-async", - "encode-gif", - "encode-gif-mem", - "encode-gif-frame", /* internal */ - "encode-gif-frame-mem", /* internal */ -}; - -GCond g_thread_cond; -GMutex g_thread_mutex; - -void _wait() -{ - g_mutex_lock(&g_thread_mutex); - fprintf(stderr, "waiting... until finishing \n"); - g_cond_wait(&g_thread_cond, &g_thread_mutex); - fprintf(stderr, "<=== get signal from callback \n"); - g_mutex_unlock(&g_thread_mutex); -} - -void _signal() -{ - g_mutex_lock(&g_thread_mutex); - g_cond_signal(&g_thread_cond); - fprintf(stderr, "===> send signal to test proc \n"); - g_mutex_unlock(&g_thread_mutex); -} - -static inline void flush_stdin() -{ - int ch; - while ((ch = getchar()) != EOF && ch != '\n') ; -} - -static gboolean _read_file(const char *file_name, void **data, size_t *data_size) -{ - FILE *fp = NULL; - long file_size = 0; - - if (!file_name || !data || !data_size) { - fprintf(stderr, "\tNULL pointer\n"); - return FALSE; - } - - fprintf(stderr, "\tTry to open %s to read\n", file_name); - - fp = fopen(file_name, "r"); - if (fp == NULL) { - fprintf(stderr, "\tfile open failed %d\n", errno); - return FALSE; - } - - if (fseek(fp, 0, SEEK_END) < 0) { - fprintf(stderr, "\t[JPEG_testsuite] fseek failed \n"); - fclose(fp); - fp = NULL; - return FALSE; - } - - file_size = ftell(fp); - if (file_size < 0) { - fprintf(stderr, "\t[JPEG_testsuite] ftell failed \n"); - fclose(fp); - fp = NULL; - return FALSE; - } - - rewind(fp); - *data = (void *)malloc(file_size); - if (*data == NULL) { - fprintf(stderr, "\tmalloc failed %d\n", errno); - fclose(fp); - fp = NULL; - return FALSE; - } - - *data_size = fread(*data, 1, file_size, fp); - if (*data_size != (size_t)file_size) { - fprintf(stderr, "#Error# fread\n"); - fclose(fp); - fp = NULL; - free(*data); - *data = NULL; - *data_size = 0; - return FALSE; - } - - fprintf(stderr, "#Success# fread\n"); - - fclose(fp); - fp = NULL; - - return TRUE; -} - -static gboolean _write_file(const char *file_name, void *data, size_t data_size) -{ - FILE *fp = NULL; - - if (!file_name || !data || data_size == 0) { - fprintf(stderr, "\tinvalid data %s %p size:%zu\n", file_name, data, data_size); - return FALSE; - } - - fprintf(stderr, "\tTry to open %s to write\n", file_name); - - fp = fopen(file_name, "w"); - if (fp == NULL) { - fprintf(stderr, "\tfile open failed %d\n", errno); - return FALSE; - } - - fwrite(data, 1, data_size, fp); - fclose(fp); - fp = NULL; - - fprintf(stderr, "\tfile [%s] write DONE\n", file_name); - - return TRUE; -} - -bool decode_completed_cb(int error, void *user_param, unsigned long width, unsigned long height, unsigned long long size) -{ - test_decode_s *user_data = (test_decode_s *)user_param; - user_data->width = width; - user_data->height = height; - user_data->decode_size = size; - _signal(); - - return TRUE; -} - -bool encode_completed_cb(int error, void *user_param, unsigned long long size) -{ - test_encode_s *user_data = (test_encode_s *)user_param; - user_data->encode_size = size; - _signal(); - - return TRUE; -} - -void _free_inputs() -{ - if (g_test_input.path != NULL) { - g_free(g_test_input.path); - g_test_input.path = NULL; - } - if (g_test_input.buffer != NULL) { - g_free(g_test_input.buffer); - g_test_input.buffer = NULL; - } -} - -void _free_decode() -{ - unsigned int i = 0; - - for (i = 0; i < g_num_of_files; i++) { - if (g_test_decode[i].decoded != NULL) { - free(g_test_decode[i].decoded); - g_test_decode[i].decoded = NULL; - } - } -} - -void _free_encode() -{ - if (g_test_encode.encoded != NULL) { - free(g_test_encode.encoded); - g_test_encode.encoded = NULL; - } -} - -void _free_datas() -{ - _free_inputs(); - _free_decode(); - _free_encode(); - image_util_destroy_image(g_decoded_image); -} - -gboolean _init_datas() -{ - memset(&g_test_input, 0, sizeof(test_inputs_s)); - memset(&g_test_decode, 0, sizeof(test_decode_s) * TEST_FILE_MAX); - memset(&g_test_encode, 0, sizeof(test_encode_s)); - - g_num_of_files = 0; - g_num_of_decoded = 0; - - return TRUE; -} - -gboolean _read_dir() -{ - struct dirent *dp = NULL; - DIR *fd = opendir(g_test_input. -path); - unsigned int i = 0, j = 0; - if (fd == NULL) { - fprintf(stderr, "\tlistdir: can't open %s\n", g_test_input. -path); - return FALSE; - } - - while ((dp = readdir(fd)) != NULL) { - if (strlen(dp->d_name) == 0) - continue; - if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, "..")) - continue; /* skip self and parent */ - size_t nbytes = g_snprintf(g_test_decode[g_num_of_files].filepath, sizeof(g_test_decode[g_num_of_files].filepath), "%s%s", g_test_input. -path, dp->d_name); - if (nbytes == 0) - continue; - g_num_of_files++; - } - - closedir(fd); - - if (g_num_of_files == 0) { - fprintf(stderr, "\tNo Test File!\n"); - return FALSE; - } - - /* sort file_name */ - char temp[PATH_MAX]; - for (i = 0; i < g_num_of_files; i++) { - for (j = 0; j < g_num_of_files - 1; j++) { - if ((strlen(g_test_decode[j].filepath) > strlen(g_test_decode[j + 1].filepath)) || - (strcmp(g_test_decode[j].filepath, g_test_decode[j + 1].filepath) > 0 && strlen(g_test_decode[j].filepath) == strlen(g_test_decode[j + 1].filepath))) { - memset(temp, 0, PATH_MAX); - g_strlcpy(temp, g_test_decode[j].filepath, sizeof(temp)); - g_strlcpy(g_test_decode[j].filepath, g_test_decode[j + 1].filepath, sizeof(g_test_decode[j].filepath)); - g_strlcpy(g_test_decode[j + 1].filepath, temp, sizeof(g_test_decode[j + 1].filepath)); - } - } - } - - return TRUE; -} - -gboolean _parse_inputs(int argc, char *argv[]) -{ - unsigned int i = 0; - gboolean result = FALSE; - - if (argv[1] == NULL || strlen(argv[1]) == 0) return FALSE; - - for (i = 0; i < TEST_COMMAND_NUM; i++) { - if (g_strcmp0(argv[1], TEST_CMD[i]) == 0) { - g_test_input.cmd = i; - result = TRUE; - } - } - if (!result) return FALSE; - - if (argv[2] == NULL || strlen(argv[2]) == 0) return FALSE; - - g_test_input.path = g_strdup(argv[2]); - if (g_test_input.path == NULL) - return FALSE; - - if (g_test_input.cmd >= FIRST_GIF_TEST) { - g_test_input.image_type = IMAGE_UTIL_GIF; - size_t nbytes = g_snprintf(g_test_encode.out_path, PATH_MAX, "%s%s", ENCODE_RESULT_PATH, "gif"); - if (nbytes == 0) - return FALSE; - return result; - } - - if (argv[3] == NULL || strlen(argv[3]) == 0) return FALSE; - - long temp = g_ascii_strtoll(argv[3], NULL, 10); - if (temp < 0 || temp > (long)IMAGE_UTIL_BMP) - return FALSE; - g_test_input.image_type = (unsigned int)temp; - - char ext[4]; - memset(g_test_encode.out_path, 0, PATH_MAX); - memset(ext, 0, 4); - switch (g_test_input.image_type) { - case IMAGE_UTIL_JPEG: - snprintf(ext, 4, "%s", "jpg"); - break; - case IMAGE_UTIL_PNG: - snprintf(ext, 4, "%s", "png"); - break; - case IMAGE_UTIL_GIF: - snprintf(ext, 4, "%s", "gif"); - break; - case IMAGE_UTIL_BMP: - snprintf(ext, 4, "%s", "bmp"); - break; - default: - fprintf(stderr, "\tNot supported image type!\n"); - _free_datas(); - return FALSE; - } - snprintf(g_test_encode.out_path, PATH_MAX, "%s%s", ENCODE_RESULT_PATH, ext); - - return result; -} - -void _print_help(int argc, char *argv[]) -{ - unsigned int i = 0; - - fprintf(stderr, "\t[usage]\n"); - fprintf(stderr, "\t\t1. decode & encode : %s ", argv[0]); - for (i = 0; i <= LAST_DECODE_TEST; i++) { - fprintf(stderr, "%s", TEST_CMD[i]); - if (i != LAST_DECODE_TEST) - fprintf(stderr, "/"); - } - fprintf(stderr, " filepath encode_image_type\n"); - fprintf(stderr, "\t\t2. encode animated-gif : %s ", argv[0]); - for (i = FIRST_GIF_TEST; i < TEST_COMMAND_NUM; i++) { - fprintf(stderr, "%s", TEST_CMD[i]); - if (i != TEST_COMMAND_NUM - 1) - fprintf(stderr, "/"); - } - fprintf(stderr, " folderpath containing png images named \ - with number prefix according to the animation order'\n"); -} - -gboolean _read_test_files() -{ - if (g_test_input.cmd >= FIRST_GIF_TEST) { - if (_read_dir() == FALSE) - return FALSE; - } else { - if ((g_test_input.cmd == TEST_DECODE_MEM) || (g_test_input.cmd == TEST_DECODE_MEM_ASYNC)) { - size_t read_size = 0; - if (_read_file(g_test_input.path, &g_test_input.buffer, &read_size) == FALSE) { - fprintf(stderr, "\tRead test file failed!\n"); - return FALSE; - } - g_test_input.buffer_size = (unsigned long long)read_size; - } else { - size_t nbytes = g_snprintf(g_test_decode[0].filepath, PATH_MAX, "%s", g_test_input. -path); - if (nbytes == 0) return FALSE; - } - g_num_of_files = 1; - } - - fprintf(stderr, "\tThe %d files are readed!\n", g_num_of_files); - - return TRUE; -} - - -gboolean test_decode() -{ - int ret = 0; - unsigned int i = 0; - image_util_decode_h decoded = NULL; - - for (i = 0; i < g_num_of_files; i++) { - g_test_decode[i].decode_result = FALSE; - - ret = image_util_decode_create(&decoded); - if (ret != IMAGE_UTIL_ERROR_NONE) - return FALSE; - - if ((g_test_input.cmd == TEST_DECODE_MEM) || (g_test_input.cmd == TEST_DECODE_MEM_ASYNC)) - ret = image_util_decode_set_input_buffer(decoded, (unsigned char *)g_test_input.buffer, g_test_input.buffer_size); - else - ret = image_util_decode_set_input_path(decoded, g_test_decode[i].filepath); - - if (ret != IMAGE_UTIL_ERROR_NONE) { - image_util_decode_destroy(decoded); - return FALSE; - } - - ret = image_util_decode_set_output_buffer(decoded, &(g_test_decode[i].decoded)); - if (ret != IMAGE_UTIL_ERROR_NONE) { - image_util_decode_destroy(decoded); - return FALSE; - } - - if ((g_test_input.cmd == TEST_DECODE_ASYNC) || (g_test_input.cmd == TEST_DECODE_MEM_ASYNC)) { - ret = image_util_decode_run_async(decoded, (image_util_decode_completed_cb) decode_completed_cb, &g_test_decode[i]); - if (ret == IMAGE_UTIL_ERROR_NONE) - _wait(); - } else { - ret = image_util_decode_run(decoded, &g_test_decode[i].width, &g_test_decode[i].height, &g_test_decode[i].decode_size); - } - if (ret != IMAGE_UTIL_ERROR_NONE) { - image_util_decode_destroy(decoded); - return FALSE; - } - - image_util_decode_destroy(decoded); - g_test_decode[i].decode_result = TRUE; - g_num_of_decoded++; - } - - if (g_num_of_decoded == 0) { - fprintf(stderr, "\tNo decoded data!\n"); - return FALSE; - } else { - fprintf(stderr, "\tThe %d images are decoded!(0: %p %llu)\n", g_num_of_decoded, g_test_decode[0].decoded, g_test_decode[0].decode_size); - } - - /* write the decoded result to the file */ - if (g_test_input.cmd <= LAST_DECODE_TEST) { - char temp[PATH_MAX]; - memset(temp, 0, PATH_MAX); - snprintf(temp, PATH_MAX, "%s%s", DECODE_RESULT_PATH, "raw"); - if (_write_file(temp, g_test_decode[0].decoded, (size_t)g_test_decode[0].decode_size) == FALSE) { - fprintf(stderr, "\tWrite the decoded result failed!\n"); - return FALSE; - } - } - - return TRUE; -} - -static void __decode_completed2_cb(int error_code, image_util_image_h image, void *user_data) -{ - fprintf(stderr, "__decode_completed2_cb invoked [%d]\n", error_code); - - if (error_code == IMAGE_UTIL_ERROR_NONE) - image_util_clone_image(image, &g_decoded_image); - - _signal(); - - return; -} - -gboolean test_new_decode() -{ - int ret = IMAGE_UTIL_ERROR_NONE; - unsigned int i = 0; - image_util_decode_h decoded = NULL; - - ret = image_util_decode_create(&decoded); - if (ret != IMAGE_UTIL_ERROR_NONE) - return FALSE; - - if ((g_test_input.cmd == TEST_DECODE_MEM) || (g_test_input.cmd == TEST_DECODE_MEM_ASYNC)) - ret = image_util_decode_set_input_buffer(decoded, (unsigned char *)g_test_input.buffer, g_test_input.buffer_size); - else - ret = image_util_decode_set_input_path(decoded, g_test_decode[i].filepath); - - if (ret != IMAGE_UTIL_ERROR_NONE) { - image_util_decode_destroy(decoded); - return FALSE; - } - - if ((g_test_input.cmd == TEST_DECODE_ASYNC) || (g_test_input.cmd == TEST_DECODE_MEM_ASYNC)) { - ret = image_util_decode_run_async2(decoded, __decode_completed2_cb, NULL); - if (ret == IMAGE_UTIL_ERROR_NONE) - _wait(); - } else { - ret = image_util_decode_run2(decoded, &g_decoded_image); - } - - image_util_decode_destroy(decoded); - - return TRUE; -} - -gboolean test_encode() -{ - int ret = 0; - image_util_encode_h encoded = NULL; - - ret = image_util_encode_create(g_test_input.image_type, &encoded); - if (ret != IMAGE_UTIL_ERROR_NONE) - return FALSE; - - ret = image_util_encode_set_input_buffer(encoded, g_test_decode[0].decoded); - if (ret != IMAGE_UTIL_ERROR_NONE) { - image_util_encode_destroy(encoded); - return FALSE; - } - - ret = image_util_encode_set_resolution(encoded, g_test_decode[0].width, g_test_decode[0].height); - if (ret != IMAGE_UTIL_ERROR_NONE) { - image_util_encode_destroy(encoded); - return FALSE; - } - - if ((g_test_input.cmd == TEST_DECODE_MEM) || (g_test_input.cmd == TEST_DECODE_MEM_ASYNC)) - ret = image_util_encode_set_output_buffer(encoded, &g_test_encode.encoded); - else - ret = image_util_encode_set_output_path(encoded, g_test_encode.out_path); - if (ret != IMAGE_UTIL_ERROR_NONE) { - image_util_encode_destroy(encoded); - return FALSE; - } - - if ((g_test_input.cmd == TEST_DECODE_ASYNC) || (g_test_input.cmd == TEST_DECODE_MEM_ASYNC)) { - ret = image_util_encode_run_async(encoded, (image_util_encode_completed_cb) encode_completed_cb, &g_test_encode); - if (ret == IMAGE_UTIL_ERROR_NONE) - _wait(); - } else { - ret = image_util_encode_run(encoded, &g_test_encode.encode_size); - } - if (ret != IMAGE_UTIL_ERROR_NONE) { - image_util_encode_destroy(encoded); - return FALSE; - } - - image_util_encode_destroy(encoded); - - if ((g_test_input.cmd == TEST_DECODE_MEM) || - (g_test_input.cmd == TEST_DECODE_MEM_ASYNC)) { - if (_write_file(g_test_encode.out_path, g_test_encode.encoded, (size_t)g_test_encode.encode_size) == FALSE) { - fprintf(stderr, "\tWrite the encoded result failed!\n"); - return FALSE; - } - } - - return TRUE; -} - -static void __encode_to_file_completed_cb(int error_code, void *user_data) -{ - fprintf(stderr, "__encode_to_file_completed_cb invoked [%d]\n", error_code); - _signal(); - - return; -} - -static void __encode_to_buffer_completed_cb(int error_code, unsigned char *buffer, size_t buffer_size, void *user_data) -{ - fprintf(stderr, "__encode_to_buffer_completed_cb invoked [%d]\n", error_code); - - if (_write_file(g_test_encode.out_path, buffer, buffer_size) == FALSE) - fprintf(stderr, "\tWrite the encoded result failed!\n"); - - _signal(); - - return; -} - -gboolean test_new_encode() -{ - int ret = IMAGE_UTIL_ERROR_NONE; - image_util_encode_h encoded = NULL; - image_util_image_h _image = NULL; - unsigned char *buffer = NULL; - size_t buffer_size = 0; - - - ret = image_util_encode_create(g_test_input.image_type, &encoded); - if (ret != IMAGE_UTIL_ERROR_NONE) - return FALSE; - - ret = image_util_create_image(g_test_decode[0].width, g_test_decode[0].height, IMAGE_UTIL_COLORSPACE_RGBA8888, g_test_decode[0].decoded, g_test_decode[0].decode_size, &_image); - if (ret != IMAGE_UTIL_ERROR_NONE) { - image_util_encode_destroy(encoded); - return FALSE; - } - - if (g_test_input.cmd == TEST_DECODE_FILE) { - ret = image_util_encode_run_to_file(encoded, _image, g_test_encode.out_path); - } else if (g_test_input.cmd == TEST_DECODE_MEM) { - ret = image_util_encode_run_to_buffer(encoded, _image, &buffer, &buffer_size); - } else if (g_test_input.cmd == TEST_DECODE_ASYNC) { - ret = image_util_encode_run_async_to_file(encoded, _image, g_test_encode.out_path, __encode_to_file_completed_cb, NULL); - if (ret == IMAGE_UTIL_ERROR_NONE) - _wait(); - } else if (g_test_input.cmd == TEST_DECODE_MEM_ASYNC) { - ret = image_util_encode_run_async_to_buffer(encoded, _image, __encode_to_buffer_completed_cb, NULL); - if (ret == IMAGE_UTIL_ERROR_NONE) - _wait(); - } - - image_util_encode_destroy(encoded); - - if (ret != IMAGE_UTIL_ERROR_NONE) { - fprintf(stderr, "\timage_util_encode_run_to_file failed!\n"); - if (buffer) - free(buffer); - return FALSE; - } - - if (g_test_input.cmd == TEST_DECODE_MEM) { - if (_write_file(g_test_encode.out_path, buffer, buffer_size) == FALSE) - fprintf(stderr, "\tWrite the encoded result failed!\n"); - } - - if (buffer) - free(buffer); - - return TRUE; -} - -gboolean test_new_decode_encode() -{ - int ret = IMAGE_UTIL_ERROR_NONE; - unsigned int i = 0; - image_util_decode_h decoded = NULL; - image_util_encode_h encoded = NULL; - unsigned char *buffer = NULL; - size_t buffer_size = 0; - - //Decode - ret = image_util_decode_create(&decoded); - if (ret != IMAGE_UTIL_ERROR_NONE) - return FALSE; - - if ((g_test_input.cmd == TEST_DECODE_MEM) || (g_test_input.cmd == TEST_DECODE_MEM_ASYNC)) - ret = image_util_decode_set_input_buffer(decoded, (unsigned char *)g_test_input.buffer, g_test_input.buffer_size); - else - ret = image_util_decode_set_input_path(decoded, g_test_decode[i].filepath); - - if (ret != IMAGE_UTIL_ERROR_NONE) { - image_util_decode_destroy(decoded); - return FALSE; - } - - if ((g_test_input.cmd == TEST_DECODE_ASYNC) || (g_test_input.cmd == TEST_DECODE_MEM_ASYNC)) { - ret = image_util_decode_run_async2(decoded, __decode_completed2_cb, NULL); - if (ret == IMAGE_UTIL_ERROR_NONE) - _wait(); - } else { - ret = image_util_decode_run2(decoded, &g_decoded_image); - } - - image_util_decode_destroy(decoded); - - //Encode - ret = image_util_encode_create(g_test_input.image_type, &encoded); - if (ret != IMAGE_UTIL_ERROR_NONE) - return FALSE; - - if (g_test_input.cmd == TEST_DECODE_FILE) { - ret = image_util_encode_run_to_file(encoded, g_decoded_image, g_test_encode.out_path); - } else if (g_test_input.cmd == TEST_DECODE_MEM) { - ret = image_util_encode_run_to_buffer(encoded, g_decoded_image, &buffer, &buffer_size); - - if (_write_file(g_test_encode.out_path, buffer, buffer_size) == FALSE) - fprintf(stderr, "\tWrite the encoded result failed!\n"); - - if (buffer) - free(buffer); - - } else if (g_test_input.cmd == TEST_DECODE_ASYNC) { - ret = image_util_encode_run_async_to_file(encoded, g_decoded_image, g_test_encode.out_path, __encode_to_file_completed_cb, NULL); - _wait(); - } else if (g_test_input.cmd == TEST_DECODE_MEM_ASYNC) { - ret = image_util_encode_run_async_to_buffer(encoded, g_decoded_image, __encode_to_buffer_completed_cb, NULL); - _wait(); - } - - image_util_encode_destroy(encoded); - - return TRUE; -} - -gboolean test_new_encode_agif() -{ - int ret = IMAGE_UTIL_ERROR_NONE; - image_util_agif_encode_h agif_enc = NULL; - image_util_image_h _image = NULL; - unsigned char *buffer = NULL; - size_t buffer_size = 0; - unsigned int i = 0; - - ret = image_util_agif_encode_create(&agif_enc); - if (ret != IMAGE_UTIL_ERROR_NONE) - return FALSE; - - // repeat start - for (i = 0; i < g_num_of_files; i++) { - if (g_test_decode[i].decode_result == FALSE) - continue; - - ret = image_util_create_image(g_test_decode[i].width, g_test_decode[i].height, IMAGE_UTIL_COLORSPACE_RGBA8888, g_test_decode[i].decoded, g_test_decode[i].decode_size, &_image); - if (ret != IMAGE_UTIL_ERROR_NONE) { - image_util_agif_encode_destroy(agif_enc); - return FALSE; - } - - ret = image_util_agif_encode_add_frame(agif_enc, _image, 50); /* 500ms */ - if (ret != IMAGE_UTIL_ERROR_NONE) { - image_util_destroy_image(_image); - image_util_agif_encode_destroy(agif_enc); - return FALSE; - } - - image_util_destroy_image(_image); - } - // repeat end - - if (g_test_input.cmd == GIFTEST_ENCODE_FILE) - ret = image_util_agif_encode_save_to_file(agif_enc, g_test_encode.out_path); - else if (g_test_input.cmd == GIFTEST_ENCODE_MEM) - ret = image_util_agif_encode_save_to_buffer(agif_enc, &buffer, &buffer_size); - else - fprintf(stderr, "\tDo not save the encoded GIF!\n"); - - image_util_agif_encode_destroy(agif_enc); - - if (g_test_input.cmd == GIFTEST_ENCODE_MEM) { - if (_write_file(g_test_encode.out_path, buffer, buffer_size) == FALSE) - fprintf(stderr, "\tWrite the encoded result failed!\n"); - } - - if (buffer) - free(buffer); - - return TRUE; -} - -gboolean test_encode_gif() -{ - int ret = 0; - unsigned int i = 0; - image_util_encode_h encoded = NULL; - - ret = image_util_encode_create(g_test_input.image_type, &encoded); - if (ret != IMAGE_UTIL_ERROR_NONE) { - image_util_encode_destroy(encoded); - return FALSE; - } - - for (i = 0; i < g_num_of_files; i++) { - if (g_test_decode[i].decode_result == FALSE) - continue; - - ret = image_util_encode_set_resolution(encoded, g_test_decode[i].width, g_test_decode[i].height); - if (ret != IMAGE_UTIL_ERROR_NONE) - continue; - - ret = image_util_encode_set_input_buffer(encoded, g_test_decode[i].decoded); - if (ret != IMAGE_UTIL_ERROR_NONE) - continue; - - ret = image_util_encode_set_gif_frame_delay_time(encoded, 50); /* 500ms */ - if (ret != IMAGE_UTIL_ERROR_NONE) - continue; - } - - if (g_test_input.cmd == GIFTEST_ENCODE_MEM) - ret = image_util_encode_set_output_buffer(encoded, &g_test_encode.encoded); - else - ret = image_util_encode_set_output_path(encoded, g_test_encode.out_path); - if (ret != IMAGE_UTIL_ERROR_NONE) { - image_util_encode_destroy(encoded); - return FALSE; - } - - ret = image_util_encode_run(encoded, &g_test_encode.encode_size); - if (ret != IMAGE_UTIL_ERROR_NONE) { - image_util_encode_destroy(encoded); - return FALSE; - } - - image_util_encode_destroy(encoded); - - if (g_test_input.cmd == GIFTEST_ENCODE_MEM) { - if (_write_file(g_test_encode.out_path, g_test_encode.encoded, (size_t)g_test_encode.encode_size) == FALSE) { - fprintf(stderr, "\tWrite the encoded result failed!\n"); - return FALSE; - } - } - - return TRUE; -} - -int main(int argc, char *argv[]) -{ - if (argc < ARGC_MIN) { - _print_help(argc, argv); - return 0; - } - - if (_init_datas() == FALSE) { - fprintf(stderr, "\tInit failed!\n"); - _free_datas(); - return 0; - } - - if (_parse_inputs(argc, argv) == FALSE) { - fprintf(stderr, "\tInput was wrong!\n"); - _free_datas(); - return 0; - } - - if (_read_test_files() == FALSE) { - fprintf(stderr, "\tCan not read the test files!\n"); - _free_datas(); - return 0; - } - - fprintf(stderr, "\tTests Start!\n"); - -#if 0 - if (!test_new_decode_encode()) { - fprintf(stderr, "\tNew Decode Encode Tests failed!\n"); - _free_datas(); - return 0; - } -#endif - - if (test_decode() == FALSE) { - //if (test_new_decode() == FALSE) { - fprintf(stderr, "\tDecode Tests failed!\n"); - _free_datas(); - return 0; - } - - fprintf(stderr, "\tDecoding is done!\n"); - - if ((g_test_input.cmd == GIFTEST_ENCODE_FILE) || (g_test_input.cmd == GIFTEST_ENCODE_MEM)) { - if (test_encode_gif() == FALSE) { - //if (test_new_encode_agif() == FALSE) { - fprintf(stderr, "\tEncode(gif) Tests failed!\n"); - _free_datas(); - return 0; - } - } else { - if (test_encode() == FALSE) { - //if (test_new_encode() == FALSE) { - fprintf(stderr, "\tEncode(default) Tests failed!\n"); - _free_datas(); - return 0; - } - } - - _free_datas(); - - fprintf(stderr, "\tEncoding is done!\n"); - - fprintf(stderr, "\tTests Finished!\n"); - - return 0; -} diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 9f52e4d..6ca1d10 100755 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,7 +1,7 @@ SET(fw_test "${fw_name}-test") INCLUDE(FindPkgConfig) -pkg_check_modules(${fw_test} REQUIRED glib-2.0) +pkg_check_modules(${fw_test} REQUIRED glib-2.0 libtzplatform-config) FOREACH(flag ${${fw_test}_CFLAGS}) SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") diff --git a/test/image_util_test.c b/test/image_util_test.c deleted file mode 100644 index 82288b0..0000000 --- a/test/image_util_test.c +++ /dev/null @@ -1,762 +0,0 @@ -/* -* Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -#include -#include -#include -#include -#include -#include -#include -#include - -#define MAX_STRING_LEN 128 -#define IMAGE_FORMAT_LABEL_BUFFER_SIZE 4 -#define MAX_REPEAT_COUNT 100 - -#define IMAGE_UTIL_SAFE_FREE(src) { if (src) {free(src); src = NULL; } } - - -GMainLoop *g_loop = NULL; -transformation_h g_handle = NULL; -static media_packet_h g_src_packet = NULL; -static image_util_image_h g_src_image = NULL; -char *g_path = NULL; -unsigned int g_width = 0; -unsigned int g_height = 0; -image_util_rotation_e g_angle = IMAGE_UTIL_ROTATION_NONE; -int g_format = -1; -static unsigned int g_request_count = 0; - -enum { - CURRENT_STATE_MAIN_MENU, - CURRENT_STATE_SET_ROTATION_PARAMETER_MENU, -}; - -int g_menu_state = CURRENT_STATE_MAIN_MENU; -int g_menu_rotation_parameter = IMAGE_UTIL_ROTATION_NONE; - -static void display_menu(void); - -media_format_mimetype_e -_image_util_mapping_imgp_format_to_mime(image_util_colorspace_e colorspace) -{ - media_format_mimetype_e mimetype = -1; - - switch (colorspace) { - case IMAGE_UTIL_COLORSPACE_NV12: - mimetype = MEDIA_FORMAT_NV12; - break; - case IMAGE_UTIL_COLORSPACE_NV16: - mimetype = MEDIA_FORMAT_NV16; - break; - case IMAGE_UTIL_COLORSPACE_YUYV: - mimetype = MEDIA_FORMAT_YUYV; - break; - case IMAGE_UTIL_COLORSPACE_UYVY: - mimetype = MEDIA_FORMAT_UYVY; - break; - case IMAGE_UTIL_COLORSPACE_YUV422: - mimetype = MEDIA_FORMAT_422P; - break; - case IMAGE_UTIL_COLORSPACE_I420: - mimetype = MEDIA_FORMAT_I420; - break; - case IMAGE_UTIL_COLORSPACE_YV12: - case IMAGE_UTIL_COLORSPACE_NV21: - mimetype = MEDIA_FORMAT_YV12; - break; - case IMAGE_UTIL_COLORSPACE_RGB565: - mimetype = MEDIA_FORMAT_RGB565; - break; - case IMAGE_UTIL_COLORSPACE_RGB888: - mimetype = MEDIA_FORMAT_RGB888; - break; - case IMAGE_UTIL_COLORSPACE_RGBA8888: - mimetype = MEDIA_FORMAT_RGBA; - break; - case IMAGE_UTIL_COLORSPACE_ARGB8888: - mimetype = MEDIA_FORMAT_ARGB; - break; - case IMAGE_UTIL_COLORSPACE_BGRA8888: - case IMAGE_UTIL_COLORSPACE_BGRX8888: - case IMAGE_UTIL_COLORSPACE_NV61: - default: - mimetype = -1; - g_printf("Not Supported Format"); - break; - } - - g_printf("imgp fmt[%d] mimetype fmt[%d]\n", colorspace, mimetype); - - return mimetype; -} - -static gboolean __read_file(char *path, void **data, size_t *length) -{ - FILE *fp = NULL; - long len = 0; - - if (!path || !data || length == 0) { - fprintf(stderr, "\tinvalid data %s %p %p\n", path, data, length); - return FALSE; - } - - fprintf(stderr, "\t%s read\n", path); - - fp = fopen(path, "r"); - if (fp == NULL) { - fprintf(stderr, "\tfopen failed (%d) \n", errno); - return FALSE; - } - - if (fseek(fp, 0, SEEK_END) < 0) { - fprintf(stderr, "\tfseek failed \n"); - fclose(fp); - return FALSE; - } - - len = ftell(fp); - if (len < 0) { - fprintf(stderr, "\tftell failed \n"); - fclose(fp); - return FALSE; - } - - rewind(fp); - *data = (void *)calloc(1, len); - if (*data == NULL) { - fprintf(stderr, "\tmemory allocation failed \n"); - fclose(fp); - return FALSE; - } - - *length = fread(*data, 1, (size_t)len, fp); - if (*length != (size_t)len) { - fprintf(stderr, "\tfread failed \n"); - } - - fclose(fp); - - if (*data == NULL) { - *length = 0; - return FALSE; - } - - *length = (size_t)len; - - fprintf(stderr, "\t%s %zu read DONE\n", path, *length); - - return TRUE; -} - -static gboolean __write_file(const char *path, void *data, size_t length) -{ - FILE *fp = NULL; - size_t len = 0; - - if (!path || !data || length == 0) { - g_printf("\tinvalid data %s %p %zu\n", path, data, length); - return FALSE; - } - - g_printf("\t%s %p %zu write\n", path, data, length); - - fp = fopen(path, "w"); - if (fp == NULL) { - g_printf("\tfopen failed (%d) \n", errno); - return FALSE; - } - - len = fwrite(data, 1, length, fp); - if (len != length) { - g_printf("\tfwrite failed \n"); - } - - fclose(fp); - fp = NULL; - - g_printf("\t%s write DONE\n", path); - - return TRUE; -} - -static gboolean __save_image(image_util_image_h image) -{ - int ret = IMAGE_UTIL_ERROR_NONE; - char out_file[PATH_MAX] = { 0, }; - - unsigned int width = 0, height = 0; - image_util_colorspace_e color = 0; - unsigned char *buf = NULL; - size_t buf_size = 0; - - ret = image_util_get_image(image, &width, &height, &color, &buf, &buf_size); - if (ret != IMAGE_UTIL_ERROR_NONE) { - g_printf("image_util_get_image failed (%d)", ret); - return FALSE;; - } - - snprintf(out_file, PATH_MAX, "result2_%dx%d_%d.raw", width, height, color); - - if (!__write_file(out_file, (void *)buf, buf_size)) - g_printf("__write_file failed"); - - IMAGE_UTIL_SAFE_FREE(buf); - - return TRUE; -} - -void test_transform_completed2_cb(image_util_image_h image, image_util_error_e error, void *user_data) -{ - g_printf("completed_cb [%d][%d] \n", error, --g_request_count); - - if (error != IMAGE_UTIL_ERROR_NONE) { - g_printf("Invalid error_code (%d)", error); - goto END; - } - - if (!image) { - g_printf("Invalid image"); - goto END; - } - - if (!__save_image(image)) - g_printf("_save_image failed"); - - g_printf("<<<<< SUCCESS >>>>>\n"); -END: - if (g_request_count == 0) - display_menu(); -} - -static gboolean __create_src_image() -{ - int ret = 0; - void *buf = NULL; - size_t buf_size = 0; - - if (!__read_file(g_path, &buf, &buf_size)) { - g_printf("__read_file failed\n"); - return FALSE; - } - - ret = image_util_create_image(g_width, g_height, g_format, buf, buf_size, &g_src_image); - IMAGE_UTIL_SAFE_FREE(buf); - if (ret != IMAGE_UTIL_ERROR_NONE) { - g_printf("image_util_create_image failed (%d)", ret); - return FALSE; - } - - return TRUE; -} - -void test_transform_completed_cb(media_packet_h *packet, image_util_error_e error, void *user_data) -{ - char output_file[25] = {}; - - media_format_h dst_fmt; - media_format_mimetype_e dst_mimetype; - int dst_width, dst_height, dst_avg_bps, dst_max_bps; - char *output_fmt = NULL; - unsigned int i = 0; - uint32_t plane_num = 0; - int stride_width = 0, stride_height = 0; - void *plane_ptr = NULL; - size_t plane_size = 0; - void *ptr = NULL; - size_t size = 0; - - g_printf("test_transform_completed_cb [%d][%d] \n", error, --g_request_count); - if (error != IMAGE_UTIL_ERROR_NONE) { - goto END; - } - - output_fmt = (char *)malloc(sizeof(char) * IMAGE_FORMAT_LABEL_BUFFER_SIZE); - if (!output_fmt) { - g_printf("memory allocation failed\n"); - goto END; - } - - if (media_packet_get_format(*packet, &dst_fmt) != MEDIA_PACKET_ERROR_NONE) { - g_printf("Imedia_packet_get_format\n"); - goto END; - } - - if (media_format_get_video_info(dst_fmt, &dst_mimetype, &dst_width, &dst_height, &dst_avg_bps, &dst_max_bps) == MEDIA_FORMAT_ERROR_NONE) { - memset(output_fmt, 0, IMAGE_FORMAT_LABEL_BUFFER_SIZE); - if (dst_mimetype == MEDIA_FORMAT_YV12 || dst_mimetype == MEDIA_FORMAT_422P || dst_mimetype == MEDIA_FORMAT_I420 - || dst_mimetype == MEDIA_FORMAT_NV12 || dst_mimetype == MEDIA_FORMAT_UYVY || dst_mimetype == MEDIA_FORMAT_YUYV) { - strncpy(output_fmt, "yuv", strlen("yuv")); - } else { - strncpy(output_fmt, "rgb", strlen("rgb")); - } - g_printf("[mimetype: %d] W x H : %d x %d \n", dst_mimetype, dst_width, dst_height); - snprintf(output_file, 25, "result_%dx%d.%s", dst_width, dst_height, output_fmt); - } - - if (MEDIA_PACKET_ERROR_NONE != media_packet_get_number_of_video_planes(*packet, &plane_num)) { - g_printf("media_packet_get_number_of_video_plances failed\n"); - goto END; - } - - g_printf("plane_num: %u\n", plane_num); - - for (i = 0; i < plane_num; i++) { - if (MEDIA_PACKET_ERROR_NONE != media_packet_get_video_stride_width(*packet, i, &stride_width)) { - g_printf("media_packet_get_number_of_video_plances failed\n"); - goto END; - } - - if (MEDIA_PACKET_ERROR_NONE != media_packet_get_video_stride_height(*packet, i, &stride_height)) { - g_printf("media_packet_get_number_of_video_plances failed\n"); - goto END; - } - - plane_size = stride_width * stride_height; - - if (MEDIA_PACKET_ERROR_NONE != media_packet_get_video_plane_data_ptr(*packet, i, &plane_ptr)) { - g_printf("media_packet_get_number_of_video_plances failed\n"); - goto END; - } - - g_printf("stride_width: %d, stride_height: %d, plane_ptr: %p, plane_size: %zu\n", - stride_width, stride_height, plane_ptr,plane_size); - - ptr = realloc(ptr, size + plane_size); - if (!ptr) { - g_printf("Memory allocation failed"); - goto END; - } - - memcpy(ptr + size, plane_ptr, plane_size); - size += plane_size; - } - - if (!__write_file(output_file, ptr, size)) { - g_printf("__write_file failed\n"); - goto END; - } - g_printf("<<<<< SUCCESS >>>>>\n"); - -END: - - IMAGE_UTIL_SAFE_FREE(output_fmt); - media_packet_destroy(*packet); - IMAGE_UTIL_SAFE_FREE(ptr); - - if (g_request_count == 0) - display_menu(); -} - -static gboolean __create_src_packet() -{ - int ret = 0; - media_format_h fmt; - void *buf = NULL; - size_t buf_size = 0; - void *ptr = NULL; - uint64_t ptr_size = 0; - if (media_format_create(&fmt) == MEDIA_FORMAT_ERROR_NONE) { - if (media_format_set_video_mime(fmt, _image_util_mapping_imgp_format_to_mime(g_format)) != MEDIA_FORMAT_ERROR_NONE) { - media_format_unref(fmt); - g_printf("[Error] Set - video mime\n"); - return FALSE; - } - - if (media_format_set_video_width(fmt, g_width) != MEDIA_FORMAT_ERROR_NONE) { - media_format_unref(fmt); - g_printf("[Error] Set - video width\n"); - return FALSE; - } - - if (media_format_set_video_height(fmt, g_height) != MEDIA_FORMAT_ERROR_NONE) { - media_format_unref(fmt); - g_printf("[Error] Set - video heigh\nt"); - return FALSE; - } - - g_printf("media_format_set_video_info success! file[%s] w[%d] h[%d] mime[%d]\n", g_path, g_width, g_height, _image_util_mapping_imgp_format_to_mime(g_format)); - } else { - g_printf("media_format_create failed..."); - } - - ret = media_packet_create_alloc(fmt, NULL, NULL, &g_src_packet); - if (ret == MEDIA_PACKET_ERROR_NONE) { - g_printf("Success - media_packet_create_alloc\n"); - if (media_packet_get_buffer_size(g_src_packet, &ptr_size) == MEDIA_PACKET_ERROR_NONE) { - if (media_packet_get_buffer_data_ptr(g_src_packet, &ptr) == MEDIA_PACKET_ERROR_NONE) { - if (!__read_file(g_path, &buf, &buf_size)) { - g_printf("\t__read_file failed\n"); - media_format_unref(fmt); - return FALSE; - } - if (buf_size <= ptr_size) { - g_printf("#Success# fread\n"); - memcpy(ptr, buf, (int)ptr_size); - g_printf("memcpy\n"); - } else { - g_printf("#Error# fread readed[%zu] size[%" PRIu64 "]\n", buf_size, ptr_size); - } - IMAGE_UTIL_SAFE_FREE(buf); - } - } - } else { - g_printf("ERROR - media_packet_create_alloc"); - media_format_unref(fmt); - return FALSE; - } - media_format_unref(fmt); - return TRUE; -} - -static void _create() -{ - int ret = 0; - if (g_handle != NULL) { - ret = image_util_transform_destroy(g_handle); - if (ret != IMAGE_UTIL_ERROR_NONE) - g_printf("[%d]Error image_util_transform_destroy [%d]\n", __LINE__, ret); - else - g_printf("[%d]Success image_util_transform_destroy [%d]\n", __LINE__, ret); - } - ret = image_util_transform_create(&g_handle); - if (ret != IMAGE_UTIL_ERROR_NONE) - g_printf("[%d]Error image_util_transform_create [%d]\n", __LINE__, ret); - else - g_printf("[%d]Success image_util_transform_create [%d]\n", __LINE__, ret); - g_request_count = 0; -} - -static void _destroy() -{ - int ret = 0; - - if (g_handle) { - ret = image_util_transform_destroy(g_handle); - if (ret != IMAGE_UTIL_ERROR_NONE) - g_printf("[%d]Error image_util_transform_destroy [%d]\n", __LINE__, ret); - else - g_printf("[%d]Success image_util_transform_destroy [%d]\n", __LINE__, ret); - } else { - g_printf("[%d]Error handle was already destroyed \n", __LINE__); - } - g_handle = NULL; -} - -static void _transform(const char *cmd) -{ - int ret = 0; - unsigned int width = 0; - unsigned int height = 0; - image_util_colorspace_e colorspace = IMAGE_UTIL_COLORSPACE_ARGB8888; - int start_x; - int start_y; - int end_x; - int end_y; - - if (!strcmp("convert", cmd)) { - ret = image_util_transform_set_colorspace(g_handle, colorspace); - if (ret != IMAGE_UTIL_ERROR_NONE) { - g_printf("[%d]error image_util_transform_set_colorspace [%d]\n", __LINE__, ret); - return; - } - } - - if (!strcmp("resize", cmd)) { - width = g_width/2; - height = g_height/2; - - ret = image_util_transform_set_resolution(g_handle, width, height); - if (ret != IMAGE_UTIL_ERROR_NONE) { - g_printf("[%d]Error image_util_transform_set_resolution [%d]\n", __LINE__, ret); - return; - } - } - - if (!strcmp("rotate", cmd)) { - ret = image_util_transform_set_rotation(g_handle, g_angle); - if (ret != IMAGE_UTIL_ERROR_NONE) { - g_printf("[%d]Error image_util_transform_set_rotation [%d]\n", __LINE__, ret); - return; - } - } - - if (!strcmp("crop", cmd)) { - start_x = g_width/4; - start_y = g_height/3; - end_x = g_width*3/4; - end_y = g_height; - - ret = image_util_transform_set_crop_area(g_handle, start_x, start_y, end_x, end_y); - if (ret != IMAGE_UTIL_ERROR_NONE) { - g_printf("[%d]Error image_util_transform_set_crop_area [%d]\n", __LINE__, ret); - return; - } - } - - if (!strcmp("run", cmd)) { - ret = image_util_transform_run(g_handle, g_src_packet, (image_util_transform_completed_cb)test_transform_completed_cb, NULL); - if (ret != IMAGE_UTIL_ERROR_NONE) { - g_printf("[%d]Error image_util_transform_run [%d]\n", __LINE__, ret); - return; - } - g_request_count++; - } - - if (!strcmp("run2", cmd)) { - image_util_image_h transformed_image = NULL; - - ret = image_util_transform_run2(g_handle, g_src_image, &transformed_image); - if (ret != IMAGE_UTIL_ERROR_NONE) { - g_printf("[%d]Error image_util_transform_run2 [%d]\n", __LINE__, ret); - return; - } - __save_image(transformed_image); - g_printf("<<<<< SUCCESS >>>>>\n"); - } - - if (!strcmp("run2_async", cmd)) { - ret = image_util_transform_run2_async(g_handle, g_src_image, (image_util_transform_completed2_cb)test_transform_completed2_cb, NULL); - if (ret != IMAGE_UTIL_ERROR_NONE) { - g_printf("[%d]Error image_util_transform_run2_async [%d]\n", __LINE__, ret); - return; - } - g_request_count++; - } -} - -static void _async_test() -{ - int i = 0; - g_request_count = 0; - for (i = 0; i < MAX_REPEAT_COUNT; i++) { - _transform("run"); - g_printf("<<<<< %03d >>>>>\n", g_request_count); - } -} - -static void _async_test2() -{ - int i = 0; - g_request_count = 0; - for (i = 0; i < MAX_REPEAT_COUNT; i++) { - _transform("run2_async"); - g_printf("<<<<< %03d >>>>>\n", g_request_count); - } -} - -void quit(void) -{ - if (g_loop) - g_main_loop_quit(g_loop); -} - -void reset_current_menu_state() -{ - g_menu_state = CURRENT_STATE_MAIN_MENU; - return; -} - -static void display_set_rotation_parameter_menu(void) -{ - g_print("\n"); - g_print("====================================================\n"); - g_print(" Enter number of rotate operation parameter\n"); - g_print("----------------------------------------------------\n"); - g_print("0. None\n"); - g_print("1. Rotation 90 degrees\n"); - g_print("2. Rotation 180 degrees\n"); - g_print("3. Rotation 270 degrees\n"); - g_print("4. Flip horizontal\n"); - g_print("5. Flip vertical\n"); - g_print("====================================================\n"); -} - -static void display_menu(void) -{ - g_print("\n"); - g_print("====================================================\n"); - g_print(" image-util Core-API test: Main menu v0.2\n"); - g_print("----------------------------------------------------\n"); - g_print("1. create handle \n"); - g_print("2. set convert \n"); - g_print("3. set crop \n"); - g_print("4. set resize \n"); - g_print("5. set rotate \n"); - g_print("6. run \n"); - g_print("7. run2 \n"); - g_print("8. run2_async \n"); - g_print("9. destroy handle \n"); - g_print("11. run %d times \n", MAX_REPEAT_COUNT); - g_print("12. run2_async %d times \n", MAX_REPEAT_COUNT); - g_print("0. quit \n"); - g_print("----------------------------------------------------\n"); - g_print("====================================================\n"); - -} - -static void interpret_rotation_parameter_cmd(char *cmd) -{ - int choice = atoi(cmd); - - if (choice < IMAGE_UTIL_ROTATION_NONE || choice > IMAGE_UTIL_ROTATION_FLIP_VERT) { - g_print("wrong rotation parameter\n"); - display_set_rotation_parameter_menu(); - } - g_angle = choice; -} - -static void interpret_cmd(char *cmd) -{ - int len = strlen(cmd); - if (g_menu_state == CURRENT_STATE_MAIN_MENU) { - if (len == 1) { - if (!strncmp(cmd, "1", len)) { - _create(); - } else if (!strncmp(cmd, "2", len)) { - _transform("convert"); - } else if (!strncmp(cmd, "3", len)) { - _transform("crop"); - } else if (!strncmp(cmd, "4", len)) { - _transform("resize"); - } else if (!strncmp(cmd, "5", len)) { - g_menu_state = CURRENT_STATE_SET_ROTATION_PARAMETER_MENU; - display_set_rotation_parameter_menu(); - return; - } else if (!strncmp(cmd, "6", len)) { - _transform("run"); - return; - } else if (!strncmp(cmd, "7", len)) { - _transform("run2"); - } else if (!strncmp(cmd, "8", len)) { - _transform("run2_async"); - return; - } else if (!strncmp(cmd, "9", len)) { - _destroy(); - } else if (!strncmp(cmd, "0", len)) { - quit(); - } - } else if (len == 2) { - if (!strncmp(cmd, "11", len)) { - _async_test(); - return; - } else if (!strncmp(cmd, "12", len)) { - _async_test2(); - return; - } else { - g_print("wrong command\n"); - } - } else { - g_print("wrong command\n"); - } - - display_menu(); - } else if (g_menu_state == CURRENT_STATE_SET_ROTATION_PARAMETER_MENU) { - interpret_rotation_parameter_cmd(cmd); - _transform("rotate"); - reset_current_menu_state(); - display_menu(); - } else { - g_print("wrong menu state\n"); - } -} - -gboolean input(GIOChannel *channel) -{ - gchar buf[MAX_STRING_LEN]; - gsize read; - GError *error = NULL; - - g_io_channel_read_chars(channel, buf, MAX_STRING_LEN, &read, &error); - - buf[read] = '\0'; - g_strstrip(buf); - interpret_cmd(buf); - - return TRUE; -} - -int main(int argc, char **argv) -{ - int ret = IMAGE_UTIL_ERROR_NONE; - - GIOChannel *stdin_channel = NULL; - stdin_channel = g_io_channel_unix_new(0); - g_io_channel_set_flags(stdin_channel, G_IO_FLAG_NONBLOCK, NULL); - g_io_add_watch(stdin_channel, G_IO_IN, (GIOFunc)input, NULL); - - if (argc < 4) { - g_printf("Do: export XDG_RUNTIME_DIR=/run \n"); - g_printf("Usage: image_utl_test filename width height format \n"); - return ret; - } - - g_handle = NULL; - g_src_packet = NULL; - g_path = (char *)g_malloc(MAX_STRING_LEN * sizeof(char)); - if (g_path == NULL) { - g_printf("memory allocation fail. \n"); - return ret; - } - - snprintf(g_path, MAX_STRING_LEN, "%s", argv[1]); - g_width = atoi(argv[2]); - g_height = atoi(argv[3]); - g_format = atoi(argv[4]); - - ret = image_util_transform_create(&g_handle); - if (ret != IMAGE_UTIL_ERROR_NONE) { - g_printf("[%d]Error image_util_transform_create [%d]\n", __LINE__, ret); - goto Exit; - } - - if (!__create_src_image()) { - g_printf("Error - Create_src_image\n"); - goto Exit; - } - - if (!__create_src_packet()) { - g_printf("Error - Create_src_packet\n"); - goto Exit; - } - - display_menu(); - - g_loop = g_main_loop_new(NULL, FALSE); - - g_main_loop_run(g_loop); - g_main_loop_unref(g_loop); - -Exit: - if (g_path) { - IMAGE_UTIL_SAFE_FREE(g_path); - g_printf("[%d]Success file path is destroyed \n", __LINE__); - } - - if (g_src_image) { - image_util_destroy_image(g_src_image); - g_printf("[%d]Success source image is destroyed \n", __LINE__); - } - - if (g_src_packet) { - media_packet_destroy(g_src_packet); - g_printf("[%d]Success source packet is destroyed \n", __LINE__); - } - _destroy(); - - return 0; -} diff --git a/test/image_util_testsuite.c b/test/image_util_testsuite.c new file mode 100644 index 0000000..bed1bdf --- /dev/null +++ b/test/image_util_testsuite.c @@ -0,0 +1,2813 @@ +/* +* Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +#include +#include +#include +#include +#include +#include +#include + +/* logs for testsuite */ +#define VERSION 0.1 +#define DEBUG_QUEUE 0 +#define DUMP_RAW_IMAGE 0 + +/* commons for testsuite */ +#define MAX_STRING_LEN PATH_MAX +#define MAX_AGIF_CNT 100 +#define IMAGE_UTIL_COLOR_NUM IMAGE_UTIL_COLORSPACE_NV61 + 1 + +#define SAFE_FREE(src) { if (src) {free(src); src = NULL; } } +#define SAFE_G_FREE(src) { if (src) {g_free(src); src = NULL; } } + +#define IS_RAW_FILE(x) ((g_strrstr(x, ".raw")) ? TRUE : FALSE) + +#define RETM_IF(expr, fmt, arg...) do { \ + if (expr) { \ + g_print(fmt, ##arg); \ + return; \ + } \ + } while (0) +#define RETVM_IF(expr, val, fmt, arg...) do { \ + if (expr) { \ + g_print(fmt, ##arg); \ + return (val); \ + } \ + } while (0) + +/* output file */ +#define FILE_FOR_DUMP_RAW_IMAGE tzplatform_mkpath(TZ_USER_CONTENT, "imgutil_test_raw") +#define FILE_FOR_AUTO tzplatform_mkpath(TZ_USER_CONTENT, "imgutil_test_auto") +#define FILE_FOR_ENCODE tzplatform_mkpath(TZ_USER_CONTENT, "imgutil_test_encode") +#define FILE_FOR_ENCODE_AGIF tzplatform_mkpath(TZ_USER_CONTENT, "imgutil_test_encode_agif") + +/* parameters for testsuite */ +typedef enum { + MAIN_MENU = 0, + SET_PATH_MENU, + SET_PATH_SUB_MENU, + DECODE_MENU, + ENCODE_MENU, + ENCODE_AGIF_MENU, + TRANSFORM_MENU, + + /* set menu */ + SET_BUFFER_MENU = 20, + SET_TO_BUFFER_MENU, + SET_COLOR_MENU, + SET_RAW_COLOR_MENU, + SET_COMPRESSION_MENU, + SET_CONVERT_MENU, + SET_CROP_MENU, + SET_DELAY_MENU, + SET_DIR_MENU, + SET_DOWNSCALE_MENU, + SET_QUALITY_MENU, + SET_RESIZE_MENU, + SET_ROTATE_MENU, + SET_SIZE_MENU, + SET_TYPE_MENU, + SET_LAST_MENU, +} test_menu_state_e; + +typedef struct { + test_menu_state_e menu_state; +} test_queue_menu_s; + +typedef struct { + unsigned int x; + unsigned int y; + unsigned int w; + unsigned int h; +} test_size_s; + +typedef struct { + /* for input */ + char *path; + + gboolean has_buffer; + unsigned char *buffer; + size_t buffer_size; + + gboolean is_raw; + test_size_s size; + image_util_colorspace_e color; + + /* for result of test or pass through */ + image_util_image_h image; + + /* for a-gif */ + unsigned int image_cnt; + image_util_image_h images[MAX_AGIF_CNT]; +} test_complex_data_s; + +typedef struct { + test_complex_data_s *cdata; +} test_queue_data_s; + +typedef struct { + image_util_colorspace_e color; + image_util_scale_e downscale; +} test_decode_params_s; + +typedef struct { + image_util_type_e type; + int quality; + image_util_png_compression_e compression; + gboolean use_buffer; +} test_encode_params_s; + +typedef struct { + int delay; + gboolean use_buffer; +} test_encode_agif_params_s; + +typedef struct { + gboolean has_convert_color; + image_util_colorspace_e convert_color; + gboolean has_crop; + test_size_s crop_area; + gboolean has_resize; + test_size_s resize; + gboolean has_rotation; + image_util_rotation_e rotation; +} test_transform_params_s; + +static test_menu_state_e g_current_menu = MAIN_MENU; +static test_menu_state_e g_previous_menu = MAIN_MENU; + +static test_complex_data_s g_input_data; + +/* decode */ +static test_decode_params_s g_decode_params; +static test_complex_data_s g_decode_result; +/* encode */ +static test_encode_params_s g_encode_params; +static test_complex_data_s g_encode_result; + +/* encode a-gif */ +static test_encode_agif_params_s g_encode_agif_params; +static test_complex_data_s g_encode_agif_result; +/* transform */ +static test_transform_params_s g_transform_params; +static test_complex_data_s g_transform_result; + +static GQueue *g_queue_menu = NULL; +static GQueue *g_queue_agif_images = NULL; +static GQueue *g_queue_data = NULL; + +static GMainLoop *g_mainloop = NULL; +/* parameters for testsuite */ + + + +/* display menu for testsuite */ +static void __display_set(const char *text, const char *ex) +{ + g_print("\n"); + g_print("\tPlease type 'b' to go back and 'q' to quit at any time.\n"); + + if (ex) + g_print("*** input %s [ex. %s] : ", text, ex); + else + g_print("*** input %s: ", text); +} + +typedef enum { + RAW_IMG_SET_COLOR, + RAW_IMG_SET_SIZE, + RAW_IMG_MENU_MAX, +} test_raw_img_menu_e; + +typedef struct { + test_raw_img_menu_e e; + const char *t; +} test_raw_img_menu_s; + +static const test_raw_img_menu_s g_disp_raw_img_menu[RAW_IMG_MENU_MAX] = { + { RAW_IMG_SET_COLOR, "set colorspace (opt. default=IMAGE_UTIL_COLORSPACE_RGBA8888)" }, + { RAW_IMG_SET_SIZE, "set width & height" }, +}; + +static void __display_set_raw_menu(void) +{ + unsigned int idx = 0; + g_print("\n"); + g_print("====================================================\n"); + g_print(" image-util Core-API test: Set raw data menu v%2.1f\n", VERSION); + g_print("----------------------------------------------------\n"); + for (idx = 0; idx < RAW_IMG_MENU_MAX; idx++) + g_print("%u. %s\n", g_disp_raw_img_menu[idx].e, g_disp_raw_img_menu[idx].t); + g_print("b. back\n"); + g_print("q. quit\n"); + g_print("----------------------------------------------------\n"); + g_print("====================================================\n"); +} + +typedef enum { + DECODE_SET_BUFFER = 0, + DECODE_SET_COLOR, + DECODE_SET_DOWNSCALE, + DECODE_RUN, + DECODE_RUN_ASYNC, + DECODE_RUN2, + DECODE_RUN_ASYNC2, + DECODE_SAVE_TO_JPEG, + DECODE_MENU_MAX, +} test_decode_menu_e; + +typedef struct { + test_decode_menu_e e; + const char *t; +} test_decode_menu_s; + +static const test_decode_menu_s g_disp_decode_menu[DECODE_MENU_MAX] = { + { DECODE_SET_BUFFER, "set input buffer" }, + { DECODE_SET_COLOR, "set color (mand. default=IMAGE_UTIL_COLORSPACE_RGBA8888)" }, + { DECODE_SET_DOWNSCALE, "set downscale (opt. for jpeg only)" }, + { DECODE_RUN, "decode run (will be deprecated)" }, + { DECODE_RUN_ASYNC, "decode run async (will be deprecated)" }, + { DECODE_RUN2, "decode run2" }, + { DECODE_RUN_ASYNC2, "decode run async2" }, + { DECODE_SAVE_TO_JPEG, "save decode result to jpg" }, +}; + +static void __display_decode_menu(void) +{ + unsigned int idx = 0; + g_print("\n"); + g_print("====================================================\n"); + g_print(" image-util Core-API test: Decode menu v%2.1f\n", VERSION); + g_print("----------------------------------------------------\n"); + for (idx = 0; idx < DECODE_MENU_MAX; idx++) + g_print("%u. %s\n", g_disp_decode_menu[idx].e, g_disp_decode_menu[idx].t); + g_print("b. back\n"); + g_print("q. quit\n"); + g_print("----------------------------------------------------\n"); + g_print("====================================================\n"); +} + +typedef enum { + ENCODE_SET_TYPE = 0, + ENCODE_SET_QUALITY, + ENCODE_SET_COMPRESIION, + ENCODE_SET_TO_BUFFER, + ENCODE_RUN, + ENCODE_RUN_ASYNC, + ENCODE_RUN_TO_FILE, + ENCODE_RUN_TO_BUFFER, + ENCODE_RUN_ASYNC_TO_FILE, + ENCODE_RUN_ASYNC_TO_BUFFER, + ENCODE_MENU_MAX, +} test_encode_menu_e; + +typedef struct { + test_encode_menu_e e; + const char *t; +} test_encode_menu_s; + +static const test_encode_menu_s g_disp_encode_menu[ENCODE_MENU_MAX] = { + { ENCODE_SET_TYPE, "set image_type (mand. default=IMAGE_UTIL_JPEG)" }, + { ENCODE_SET_QUALITY, "set quality (opt. for jpeg only)" }, + { ENCODE_SET_COMPRESIION, "set compression (opt. for png only)" }, + { ENCODE_SET_TO_BUFFER, "set output buffer (opt. deprecated)" }, + { ENCODE_RUN, "encode run (will be deprecated)" }, + { ENCODE_RUN_ASYNC, "encode run async (will be deprecated)" }, + { ENCODE_RUN_TO_FILE, "encode run to file" }, + { ENCODE_RUN_TO_BUFFER, "encode run to buffer" }, + { ENCODE_RUN_ASYNC_TO_FILE, "encode run async to file" }, + { ENCODE_RUN_ASYNC_TO_BUFFER, "encode run async to buffer" }, +}; + +static void __display_encode_menu(void) +{ + unsigned int idx = 0; + g_print("\n"); + g_print("====================================================\n"); + g_print(" image-util Core-API test: Encode menu v%2.1f\n", VERSION); + g_print("----------------------------------------------------\n"); + for (idx = 0; idx < ENCODE_MENU_MAX; idx++) + g_print("%u. %s\n", g_disp_encode_menu[idx].e, g_disp_encode_menu[idx].t); + g_print("b. back\n"); + g_print("q. quit\n"); + g_print("----------------------------------------------------\n"); + g_print("====================================================\n"); +} + +typedef enum { + ENCODE_AGIF_SET_DIR = 0, + ENCODE_AGIF_SET_DELAY, + ENCODE_AGIF_SET_TO_BUFFER, + ENCODE_AGIF_RUN, + ENCODE_AGIF_RUN_ASYNC, + ENCODE_AGIF_SAVE_TO_FILE, + ENCODE_AGIF_SAVE_TO_BUFFER, + ENCODE_AGIF_MENU_MAX, +} test_encode_agif_menu_e; + +typedef struct { + test_encode_agif_menu_e e; + const char *t; +} test_encode_agif_menu_s; + +static const test_encode_agif_menu_s g_disp_encode_agif_menu[ENCODE_AGIF_MENU_MAX] = { + { ENCODE_AGIF_SET_DIR, "set directory" }, + { ENCODE_AGIF_SET_DELAY, "set dealy time (mand. default = 100)" }, + { ENCODE_AGIF_SET_TO_BUFFER, "set output buffer (opt. will be deprecated)" }, + { ENCODE_AGIF_RUN, "run agif (will be deprecated)" }, + { ENCODE_AGIF_RUN_ASYNC, "run async agif (will be deprecated)" }, + { ENCODE_AGIF_SAVE_TO_FILE, "add frame by frame and save to file" }, + { ENCODE_AGIF_SAVE_TO_BUFFER, "add frame by frame and save to buffer" }, +}; + +static void __display_encode_agif_menu(void) +{ + unsigned int idx = 0; + g_print("\n"); + g_print("====================================================\n"); + g_print(" image-util Core-API test: Encode A-GIF menu v%2.1f\n", VERSION); + g_print("----------------------------------------------------\n"); + for (idx = 0; idx < ENCODE_AGIF_MENU_MAX; idx++) + g_print("%u. %s\n", g_disp_encode_agif_menu[idx].e, g_disp_encode_agif_menu[idx].t); + g_print("b. back\n"); + g_print("q. quit\n"); + g_print("----------------------------------------------------\n"); + g_print("====================================================\n"); +} + +typedef enum { + TRANSFORM_SET_CONVERT = 0, + TRANSFORM_SET_CROP, + TRANSFORM_SET_RESIZE, + TRANSFORM_SET_ROTATE, + TRANSFORM_RUN, + TRANSFORM_RUN2, + TRANSFORM_RUN2_ASYNC, + TRANSFORM_MENU_MAX, +} test_transform_menu_e; + +typedef struct { + test_transform_menu_e e; + const char *t; +} test_transform_menu_s; + +static const test_transform_menu_s g_disp_transform_menu[TRANSFORM_MENU_MAX] = { + { TRANSFORM_SET_CONVERT, "set convert" }, + { TRANSFORM_SET_CROP, "set crop" }, + { TRANSFORM_SET_RESIZE, "set resize" }, + { TRANSFORM_SET_ROTATE, "set rotate" }, + { TRANSFORM_RUN, "transform run" }, + { TRANSFORM_RUN2, "transform run2" }, + { TRANSFORM_RUN2_ASYNC, "transform run2 async" }, +}; + +static void __display_transform_menu(void) +{ + unsigned int idx = 0; + g_print("\n"); + g_print("====================================================\n"); + g_print(" image-util Core-API test: Transform menu v%2.1f\n", VERSION); + g_print("----------------------------------------------------\n"); + for (idx = 0; idx < TRANSFORM_MENU_MAX; idx++) + g_print("%u. %s\n", g_disp_transform_menu[idx].e, g_disp_transform_menu[idx].t); + g_print("b. back\n"); + g_print("q. quit\n"); + g_print("----------------------------------------------------\n"); + g_print("====================================================\n"); +} + +typedef enum { + TEST_AUTO = 0, + TEST_DECODE, + TEST_ENCODE, + TEST_ENCODE_AGIF, + TEST_TRANSFORM, + SET_PATH, + MAIN_MENU_MAX, +} test_main_menu_e; + +typedef struct { + test_main_menu_e e; + const char *t; +} test_main_menu_s; + +static const test_main_menu_s g_disp_main_menu[MAIN_MENU_MAX] = { + { TEST_AUTO, "test auto" }, + { TEST_DECODE, "test decode" }, + { TEST_ENCODE, "test encode" }, + { TEST_ENCODE_AGIF, "test encode a-gif" }, + { TEST_TRANSFORM, "test transform" }, + { SET_PATH, "set path" }, +}; + +static void __display_main_menu(void) +{ + unsigned int idx = 0; + g_print("\n"); + g_print("====================================================\n"); + g_print(" image-util Core-API test: Main menu v%2.1f\n", VERSION); + g_print("----------------------------------------------------\n"); + for (idx = 0; idx < MAIN_MENU_MAX; idx++) + g_print("%u. %s\n", g_disp_main_menu[idx].e, g_disp_main_menu[idx].t); + g_print("q. quit\n"); + g_print("----------------------------------------------------\n"); + g_print("====================================================\n"); +} + +static void __display_menu(test_menu_state_e menu_state) +{ + switch(menu_state) { + case DECODE_MENU: + __display_decode_menu(); + break; + case ENCODE_MENU: + __display_encode_menu(); + break; + case ENCODE_AGIF_MENU: + __display_encode_agif_menu(); + break; + case TRANSFORM_MENU: + __display_transform_menu(); + break; + + /* set menus */ + case SET_PATH_MENU: + __display_set("path", "/home/owner/media/test.jpg"); + break; + case SET_DIR_MENU: + __display_set("dir", "/home/owner/media/Images"); + break; + case SET_PATH_SUB_MENU: + __display_set_raw_menu(); + break; + + case SET_BUFFER_MENU: + __display_set("set buffer", "yes/no"); + break; + case SET_COLOR_MENU: + case SET_RAW_COLOR_MENU: + case SET_CONVERT_MENU: + __display_set("colorspace", "10"); + break; + case SET_COMPRESSION_MENU: + __display_set("comprssion", "0~9"); + break; + case SET_CROP_MENU: + __display_set("crop", "(sx)x(sy)x(w)x(h), 0x0x1920x1080"); + break; + case SET_DELAY_MENU: + __display_set("delay", "20~"); + break; + case SET_DOWNSCALE_MENU: + __display_set("downscale", "0~3"); + break; + case SET_QUALITY_MENU: + __display_set("quality", "1~100"); + break; + case SET_RESIZE_MENU: + case SET_SIZE_MENU: + __display_set("size", "1920x1080"); + break; + case SET_ROTATE_MENU: + __display_set("rotation", "0=none, 1=90, 2=180, 3=270"); + break; + case SET_TYPE_MENU: + __display_set("image_type", "0:jpeg, 1:png, 2:gif, 3:bmp"); + break; + /* set menus */ + + case MAIN_MENU: + default: + __display_main_menu(); + break; + } +} +/* display menu for testsuite */ + + + +/* internal functions for testsuite */ +GCond g_thread_cond; +GMutex g_thread_mutex; + +void __wait() +{ + g_mutex_lock(&g_thread_mutex); + g_print("\t[__wait] waiting... until finishing\n"); + g_cond_wait(&g_thread_cond, &g_thread_mutex); + g_print("\t[__wait] get signal from callback\n"); + g_mutex_unlock(&g_thread_mutex); +} + +void __signal() +{ + g_mutex_lock(&g_thread_mutex); + g_cond_signal(&g_thread_cond); + g_print("\t[__signal] send signal to test proc\n"); + g_mutex_unlock(&g_thread_mutex); +} + +static gboolean __read_file(char *path, void **data, size_t *length) +{ + FILE *fp = NULL; + long len = 0; + + if (!path || !data || length == 0) { + g_print("\t[__read_file] invalid data %s %p %p\n", path, data, length); + return FALSE; + } + + g_print("\t[__read_file] %s read\n", path); + + fp = fopen(path, "r"); + if (fp == NULL) { + g_print("\t[__read_file] fopen failed (%d)\n", errno); + return FALSE; + } + + if (fseek(fp, 0, SEEK_END) < 0) { + g_print("\t[__read_file] fseek failed\n"); + fclose(fp); + return FALSE; + } + + len = ftell(fp); + if (len < 0) { + g_print("\t[__read_file] ftell failed\n"); + fclose(fp); + return FALSE; + } + + rewind(fp); + *data = (void *)calloc(1, (size_t)len); + if (*data == NULL) { + g_print("\t[__read_file] memory allocation failed\n"); + fclose(fp); + return FALSE; + } + + *length = fread(*data, 1, (size_t)len, fp); + if (*length != (size_t)len) { + g_print("\t[__read_file] fread failed\n"); + } + + fclose(fp); + + if (*data == NULL) { + *length = 0; + return FALSE; + } + + *length = (size_t)len; + + g_print("\t[__read_file] %s %zu read DONE\n", path, *length); + + return TRUE; +} + +static gboolean __write_file(const char *path, void *data, size_t length) +{ + FILE *fp = NULL; + size_t len = 0; + + if (!path || !data || length == 0) { + g_print("\t[__write_file] invalid data %s %p %zu\n", path, data, length); + return FALSE; + } + + g_print("\t[__write_file] %s %p %zu write\n", path, data, length); + + fp = fopen(path, "w"); + if (fp == NULL) { + g_print("\t[__write_file] fopen failed (%d)\n", errno); + return FALSE; + } + + len = fwrite(data, 1, length, fp); + if (len != length) { + g_print("\t[__write_file] fwrite failed\n"); + } + + fclose(fp); + fp = NULL; + + g_print("\t[__write_file] %s write DONE\n", path); + + return TRUE; +} + +#if DUMP_RAW_IMAGE +static int __write_jpeg(const char *name, image_util_image_h image) +{ + int ret = IMAGE_UTIL_ERROR_NONE; + image_util_encode_h handle = NULL; + char *path = NULL; + + path = g_strdup_printf("%s_%s.jpg", FILE_FOR_DUMP_RAW_IMAGE, name); + RETVM_IF(!path, IMAGE_UTIL_ERROR_OUT_OF_MEMORY, "Memory allocation failed"); + + ret = image_util_encode_create(IMAGE_UTIL_JPEG, &handle); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_decode_create failed %d", ret); + return ret; + } + + ret = image_util_encode_run_to_file(handle, image, path); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_encode_run_to_file failed %d", ret); + goto ERROR; + } + +ERROR: + image_util_encode_destroy(handle); + + return ret; +} +#endif + +static void __queue_free_func(gpointer data) +{ + SAFE_FREE(data); +} + +static gboolean __safe_atoui(char *buffer, unsigned int *ui) +{ + char *end = NULL; + errno = 0; + if (buffer == NULL || ui == NULL) + return FALSE; + + const long sl = strtol(buffer, &end, 10); + + if (end == buffer) + return FALSE; + if ('\0' != *end) + return FALSE; + if ((LONG_MIN == sl || LONG_MAX == sl) && (ERANGE == errno)) + return FALSE; + if (sl < 0) + return FALSE; + + *ui = (unsigned int)sl; + + return TRUE; +} + +static void __decode_func(gpointer data, gpointer user_data) +{ + int ret = IMAGE_UTIL_ERROR_NONE; + image_util_decode_h decoder = (image_util_decode_h)user_data; + char *path = (char *)data; + + if (path == NULL || strlen(path) == 0) + return; + + ret = image_util_decode_set_input_path(decoder, path); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_decode_set_input_path failed %d\n", ret); + return; + } + + ret = image_util_decode_run2(decoder, &g_input_data.images[g_input_data.image_cnt]); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_decode_run2 failed %d\n", ret); + return; + } + g_input_data.image_cnt++; +} + +static gboolean __decode_file_in_dir() +{ + int ret = IMAGE_UTIL_ERROR_NONE; + image_util_decode_h decoder = NULL; + + ret = image_util_decode_create(&decoder); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_decode_create failed %d\n", ret); + return FALSE; + } + + g_queue_foreach(g_queue_agif_images, __decode_func, decoder); + + if (g_input_data.image_cnt == 0) { + g_print("No valid image\n"); + return FALSE; + } + + image_util_decode_destroy(decoder); + + g_print("%u valid image have been decoded.\n", g_input_data.image_cnt); + + return TRUE; +} + +static int __sort_compare(gconstpointer a, gconstpointer b, gpointer user_data) +{ + const char *_a = (const char *)a; + const char *_b = (const char *)b; + if (strlen(_a) < strlen(_b)) + return -1; + + if (strlen(_a) > strlen(_b)) + return 1; + + return g_ascii_strcasecmp(_a, _b); +} + +static gboolean __set_input_dir(const char *path) +{ + struct dirent *dp = NULL; + DIR *fd = NULL; + + if (path == NULL || strlen(path) == 0) + return FALSE; + + if (!g_queue_agif_images) { + g_queue_agif_images = g_queue_new(); + if (!g_queue_agif_images) { + g_print("g_queue_new failed\n"); + return FALSE; + } + } + + fd = opendir(path); + if (fd == NULL) { + g_print("\tlistdir: can't open %s\n", path); + return FALSE; + } + + g_queue_free_full(g_queue_agif_images, __queue_free_func); + + while ((dp = readdir(fd)) != NULL) { + if (strlen(dp->d_name) == 0) + continue; + if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, "..")) + continue; /* skip self and parent */ + + g_queue_push_tail(g_queue_agif_images, g_strdup_printf("%s/%s", path, dp->d_name)); + } + + closedir(fd); + + if (g_queue_get_length(g_queue_agif_images) == 0) { + g_print("\tNo Test File in directory(%s)!\n", path); + return FALSE; + } + + /* sort files */ + g_queue_sort(g_queue_agif_images, __sort_compare, NULL); + + if (!__decode_file_in_dir()) { + g_print("Fail to decode file from dir! %s\n", path); + return FALSE; + } + + return TRUE; +} + +static gboolean __set_input_path(const char *path) +{ + if (path == NULL || strlen(path) == 0) + return FALSE; + + SAFE_G_FREE(g_input_data.path); + + g_input_data.path = g_strdup(path); + if (!g_input_data.path) { + g_print("Memory allocation failed\n"); + return FALSE; + } + + if (g_file_test(path, G_FILE_TEST_IS_DIR)) { + g_print("file path is a directory (%s)\n", path); + return __set_input_dir(path); + } + + return TRUE; +} + +static gboolean __set_input_crop_area(const char *data, test_size_s *size) +{ + gchar **params = NULL; + gboolean ret = FALSE; + + if (data == NULL || strlen(data) == 0) + return FALSE; + + params = g_strsplit(data, "x", 0); + + if (params == NULL || params[0] == NULL || params[1] == NULL || params[2] == NULL || params[3] == NULL) + return FALSE; + + if (!__safe_atoui(params[0], &size->x)) { + g_print("wrong width! %s\n", params[0]); + goto ERROR; + } + if (!__safe_atoui(params[1], &size->y)) { + g_print("wrong height! %s\n", params[1]); + goto ERROR; + } + + if (!__safe_atoui(params[2], &size->w)) { + g_print("wrong width! %s\n", params[0]); + goto ERROR; + } + if (!__safe_atoui(params[3], &size->h)) { + g_print("wrong height! %s\n", params[1]); + goto ERROR; + } + + ret = TRUE; + +ERROR: + g_strfreev(params); + + return ret; +} + +static gboolean __set_input_size(const char *data, test_size_s *size) +{ + gchar **params = NULL; + gboolean ret = FALSE; + + if (data == NULL || strlen(data) == 0) + return FALSE; + + params = g_strsplit(data, "x", 0); + + if (params == NULL || params[0] == NULL || params[1] == NULL) + return FALSE; + + if (!__safe_atoui(params[0], &size->w)) { + g_print("wrong width! %s\n", params[0]); + goto ERROR; + } + if (!__safe_atoui(params[1], &size->h)) { + g_print("wrong height! %s\n", params[1]); + goto ERROR; + } + + ret = TRUE; + +ERROR: + g_strfreev(params); + + return ret; +} + +static int __get_raw_data(test_complex_data_s *test_data) +{ + int ret = IMAGE_UTIL_ERROR_NONE; + void *buffer = NULL; + size_t buffer_size = 0; + + if (test_data->is_raw) { + if (!__read_file(test_data->path, &buffer, &buffer_size)) { + g_print("__read_file failed %s\n", test_data->path); + return IMAGE_UTIL_ERROR_INVALID_PARAMETER; + } + + ret = image_util_create_image(test_data->size.w, test_data->size.h, test_data->color, + buffer, buffer_size, &test_data->image); + if (ret != IMAGE_UTIL_ERROR_NONE) + g_print("image_util_create_image failed %d\n", ret); + } + + return ret; +} + +static unsigned int g_num_of_file = 0; +static void __set_auto_file(image_util_type_e image_type, char **path) +{ + char ext[4]; + + SAFE_G_FREE(*path); + + switch (image_type) { + case IMAGE_UTIL_JPEG: + snprintf(ext, 4, "%s", "jpg"); + break; + case IMAGE_UTIL_PNG: + snprintf(ext, 4, "%s", "png"); + break; + case IMAGE_UTIL_GIF: + snprintf(ext, 4, "%s", "gif"); + break; + case IMAGE_UTIL_BMP: + snprintf(ext, 4, "%s", "bmp"); + break; + default: + g_print("Not supported encode format!\n"); + return; + } + + *path = g_strdup_printf("%s_%02d.%s", FILE_FOR_AUTO, g_num_of_file++, ext); + + g_print("\t__set_auto_file: %s!\n", *path); +} + +static void __set_encode_file(image_util_type_e image_type, const char *base, char **path) +{ + char ext[4]; + + SAFE_G_FREE(*path); + + switch (image_type) { + case IMAGE_UTIL_JPEG: + snprintf(ext, 4, "%s", "jpg"); + break; + case IMAGE_UTIL_PNG: + snprintf(ext, 4, "%s", "png"); + break; + case IMAGE_UTIL_GIF: + snprintf(ext, 4, "%s", "gif"); + break; + case IMAGE_UTIL_BMP: + snprintf(ext, 4, "%s", "bmp"); + break; + default: + g_print("Not supported encode format!\n"); + return; + } + + *path = g_strdup_printf("%s.%s", base, ext); +} + +typedef struct { + image_util_colorspace_e image_format; + media_format_mimetype_e mimetype; + const char *mimetype_name; +} image_format_mimetype_pair_s; + +static const image_format_mimetype_pair_s image_format_mimetype_table[IMAGE_UTIL_COLOR_NUM] = { + { IMAGE_UTIL_COLORSPACE_YV12, MEDIA_FORMAT_YV12, "MEDIA_FORMAT_YV12" }, + { IMAGE_UTIL_COLORSPACE_YUV422, MEDIA_FORMAT_422P, "MEDIA_FORMAT_422P" }, + { IMAGE_UTIL_COLORSPACE_I420, MEDIA_FORMAT_I420, "MEDIA_FORMAT_I420" }, + { IMAGE_UTIL_COLORSPACE_NV12, MEDIA_FORMAT_NV12, "Not support" }, + { IMAGE_UTIL_COLORSPACE_UYVY, MEDIA_FORMAT_UYVY, "MEDIA_FORMAT_UYVY" }, + { IMAGE_UTIL_COLORSPACE_YUYV, MEDIA_FORMAT_YUYV, "MEDIA_FORMAT_YUYV" }, + { IMAGE_UTIL_COLORSPACE_RGB565, MEDIA_FORMAT_RGB565, "MEDIA_FORMAT_RGB565" }, + { IMAGE_UTIL_COLORSPACE_RGB888, MEDIA_FORMAT_RGB888, "MEDIA_FORMAT_RGB888" }, + { IMAGE_UTIL_COLORSPACE_ARGB8888, MEDIA_FORMAT_ARGB, "MEDIA_FORMAT_ARGB" }, + { IMAGE_UTIL_COLORSPACE_BGRA8888, MEDIA_FORMAT_BGRA, "MEDIA_FORMAT_BGRA" }, + { IMAGE_UTIL_COLORSPACE_RGBA8888, MEDIA_FORMAT_RGBA, "MEDIA_FORMAT_RGBA" }, + { IMAGE_UTIL_COLORSPACE_BGRX8888, -1, "Not support" }, + { IMAGE_UTIL_COLORSPACE_NV21, MEDIA_FORMAT_NV12T, "MEDIA_FORMAT_NV12T" }, + { IMAGE_UTIL_COLORSPACE_NV16, MEDIA_FORMAT_NV16, "MEDIA_FORMAT_NV16" }, + { IMAGE_UTIL_COLORSPACE_NV61, -1, "Not support" } +}; + +static media_format_mimetype_e __image_format_to_mimetype(image_util_colorspace_e format) +{ + unsigned int i = 0; + media_format_mimetype_e mimetype = -1; + + for (i = 0; i < IMAGE_UTIL_COLOR_NUM; i++) { + if (image_format_mimetype_table[i].image_format == format) { + mimetype = image_format_mimetype_table[i].mimetype; + break; + } + } + + g_print("\t\timgp fmt: %d mimetype fmt: %s", format, image_format_mimetype_table[i].mimetype_name); + + return mimetype; +} + +static image_util_colorspace_e __mimetype_to_image_format(media_format_mimetype_e mimetype) +{ + unsigned int i = 0; + image_util_colorspace_e format = -1; + + for (i = 0; i < IMAGE_UTIL_COLOR_NUM; i++) { + if (image_format_mimetype_table[i].mimetype == mimetype) { + format = image_format_mimetype_table[i].image_format; + break; + } + } + + g_print("\t\tmimetype: %s imgp fmt: %d", image_format_mimetype_table[i].mimetype_name, format); + + return format; +} + +static int __create_media_format(media_format_mimetype_e mimetype, unsigned int width, unsigned int height, media_format_h *new_fmt) +{ + int err = MEDIA_FORMAT_ERROR_NONE; + + RETVM_IF((new_fmt == NULL) || (width == 0) || (height == 0), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid parameter"); + + err = media_format_create(new_fmt); + RETVM_IF((err != MEDIA_FORMAT_ERROR_NONE), IMAGE_UTIL_ERROR_INVALID_OPERATION, "media_format_make_writable failed (%d)", err); + + err = media_format_set_video_mime(*new_fmt, mimetype); + if (err != MEDIA_FORMAT_ERROR_NONE) { + media_format_unref(*new_fmt); + g_print("\tmedia_format_set_video_mime failed (%d)\n", err); + return IMAGE_UTIL_ERROR_INVALID_OPERATION; + } + + err = media_format_set_video_width(*new_fmt, width); + if (err != MEDIA_FORMAT_ERROR_NONE) { + media_format_unref(*new_fmt); + g_print("\tmedia_format_set_video_width failed (%d)\n", err); + return IMAGE_UTIL_ERROR_INVALID_OPERATION; + } + + err = media_format_set_video_height(*new_fmt, height); + if (err != MEDIA_FORMAT_ERROR_NONE) { + media_format_unref(*new_fmt); + g_print("\tmedia_format_set_video_height failed (%d)\n", err); + return IMAGE_UTIL_ERROR_INVALID_OPERATION; + } + + return IMAGE_UTIL_ERROR_NONE; +} + +static int __create_media_packet(media_format_h fmt, unsigned char *buffer, size_t buffer_size, media_packet_h *packet) +{ + int ret = MEDIA_FORMAT_ERROR_NONE; + unsigned int i = 0; + uint32_t plane_num = 0; + int stride_width = 0, stride_height = 0; + void *plane_ptr = NULL; + size_t plane_size = 0; + size_t buffer_offset = 0; + size_t memcpy_size = 0; + + RETVM_IF(!fmt, IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid fmt"); + RETVM_IF(!packet, IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid new_pkt"); + RETVM_IF(!buffer, IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid pkt_ptr"); + RETVM_IF(buffer_size == 0, IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid pkt_size"); + + ret = media_packet_create_alloc(fmt, NULL, NULL, packet); + if (ret != MEDIA_PACKET_ERROR_NONE) { + g_print("\tmedia_packet_create_from_external_memory failed (%d)\n", ret); + return IMAGE_UTIL_ERROR_INVALID_OPERATION; + } + + ret = media_packet_get_number_of_video_planes(*packet, &plane_num); + if (ret != MEDIA_PACKET_ERROR_NONE) { + g_print("\tmedia_packet_get_number_of_video_plances failed (%d)\n", ret); + ret = IMAGE_UTIL_ERROR_INVALID_OPERATION; + goto ERROR; + } + + g_print("\tplane_num: %u\n", plane_num); + + for (i = 0; i < plane_num; i++) { + ret = media_packet_get_video_stride_width(*packet, i, &stride_width); + if (ret != MEDIA_PACKET_ERROR_NONE) { + g_print("\tmedia_packet_get_video_stride_width failed (%d)\n", ret); + ret = IMAGE_UTIL_ERROR_INVALID_OPERATION; + goto ERROR; + } + + ret = media_packet_get_video_stride_height(*packet, i, &stride_height); + if (ret != MEDIA_PACKET_ERROR_NONE) { + g_print("\tmedia_packet_get_video_stride_height failed (%d)\n", ret); + ret = IMAGE_UTIL_ERROR_INVALID_OPERATION; + goto ERROR; + } + + plane_size = stride_width * stride_height; + + ret = media_packet_get_video_plane_data_ptr(*packet, i, &plane_ptr); + if (ret != MEDIA_PACKET_ERROR_NONE) { + g_print("\tmedia_packet_get_video_plane_data_ptr failed (%d)\n", ret); + ret = IMAGE_UTIL_ERROR_INVALID_OPERATION; + goto ERROR; + } + + g_print("\tstride_width: %d, stride_height: %d, plane_ptr: %p, plane_size: %zu\n", + stride_width, stride_height, plane_ptr,plane_size); + + if (buffer_offset + plane_size > buffer_size) + memcpy_size = buffer_size - buffer_offset; + else + memcpy_size = plane_size; + + memcpy(plane_ptr, buffer + buffer_offset, memcpy_size); + buffer_offset += memcpy_size; + } + + g_print("\tSuccess - media_packet is created (%p)\n", *packet); + + return IMAGE_UTIL_ERROR_NONE; + +ERROR: + if (*packet != NULL) + media_packet_destroy(*packet); + *packet = NULL; + + return ret; +} + +static int __convert_image_to_packet(image_util_image_h image, media_packet_h *packet) +{ + int ret = IMAGE_UTIL_ERROR_NONE; + image_util_colorspace_e color = 0; + unsigned int width = 0, height = 0; + unsigned char *buffer = NULL; + size_t buffer_size = 0; + media_format_h fmt = NULL; + + RETVM_IF(!image, IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid image"); + RETVM_IF(!packet, IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid packet"); + + ret = image_util_get_image(image, &width, &height, &color, &buffer, &buffer_size); + RETVM_IF((ret != IMAGE_UTIL_ERROR_NONE), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "mm_image_get_image failed"); + + g_print("\tBuffer: %p buffer_size: %zu\n", buffer, buffer_size); + + ret = __create_media_format(__image_format_to_mimetype(color), width, height, &fmt); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("\t__create_media_format failed (%d)\n", ret); + SAFE_FREE(buffer); + return IMAGE_UTIL_ERROR_INVALID_OPERATION; + } + + ret = __create_media_packet(fmt, buffer, buffer_size, packet); + if (ret != MEDIA_PACKET_ERROR_NONE) { + g_print("\t__create_media_packet failed (%d)\n", ret); + media_format_unref(fmt); + SAFE_FREE(buffer); + return IMAGE_UTIL_ERROR_INVALID_OPERATION; + } + + return IMAGE_UTIL_ERROR_NONE; +} + +static int __convert_packet_to_image(media_packet_h packet, image_util_image_h *image) +{ + int ret = IMAGE_UTIL_ERROR_NONE; + media_format_mimetype_e mimetype = 0; + int width = 0, height = 0; + media_format_h fmt = NULL; + unsigned int i = 0; + uint32_t plane_num = 0; + int stride_width = 0, stride_height = 0; + void *plane_ptr = NULL; + size_t plane_size = 0; + void *ptr = NULL; + size_t size = 0; + + RETVM_IF(!packet, IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid packet"); + RETVM_IF(!image, IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid image"); + + ret = media_packet_get_format(packet, &fmt); + RETVM_IF((ret != MEDIA_PACKET_ERROR_NONE), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "media_packet_get_format failed (%d)", ret); + + ret = media_format_get_video_info(fmt, &mimetype, &width, &height, NULL, NULL); + if (ret != MEDIA_FORMAT_ERROR_NONE) { + g_print("\tmedia_packet_get_format failed (%d)\n", ret); + media_format_unref(fmt); + return IMAGE_UTIL_ERROR_INVALID_PARAMETER; + } + media_format_unref(fmt); + + ret = media_packet_get_number_of_video_planes(packet, &plane_num); + if (ret != MEDIA_PACKET_ERROR_NONE) { + g_print("\tmedia_packet_get_number_of_video_plances failed (%d)\n", ret); + goto ERROR; + } + + g_print("\tplane_num: %u", plane_num); + + for (i = 0; i < plane_num; i++) { + ret = media_packet_get_video_stride_width(packet, i, &stride_width); + if (ret != MEDIA_PACKET_ERROR_NONE) { + g_print("\tmedia_packet_get_number_of_video_plances failed (%d)\n", ret); + goto ERROR; + } + + ret = media_packet_get_video_stride_height(packet, i, &stride_height); + if (ret != MEDIA_PACKET_ERROR_NONE) { + g_print("\tmedia_packet_get_number_of_video_plances failed (%d)\n", ret); + goto ERROR; + } + + plane_size = stride_width * stride_height; + + ret = media_packet_get_video_plane_data_ptr(packet, i, &plane_ptr); + if (ret != MEDIA_PACKET_ERROR_NONE) { + g_print("\tmedia_packet_get_number_of_video_plances failed (%d)\n", ret); + goto ERROR; + } + + g_print("\tstride_width: %d, stride_height: %d, plane_ptr: %p, plane_size: %zu\n", + stride_width, stride_height, plane_ptr,plane_size); + + ptr = realloc(ptr, size + plane_size); + RETVM_IF(!ptr, IMAGE_UTIL_ERROR_OUT_OF_MEMORY, "Memory allocation failed"); + + memcpy(ptr + size, plane_ptr, plane_size); + size += plane_size; + } + + g_print("\t[Fotmat: %u] W x H : %d x %d\n", mimetype, width, height); + RETVM_IF(((width <= 0) || (height <= 0) || (size == 0) || (ptr == NULL)), IMAGE_UTIL_ERROR_INVALID_PARAMETER, "Invalid source packet"); + + ret = image_util_create_image(width, height, __mimetype_to_image_format(mimetype), ptr, size, image); + SAFE_FREE(ptr); + RETVM_IF((ret != IMAGE_UTIL_ERROR_NONE), ret, "mm_image_create_image failed (%d)", ret); + + g_print("\t__image_util_packet_to_image succeed\n"); + + return IMAGE_UTIL_ERROR_NONE; + +ERROR: + SAFE_FREE(ptr); + return IMAGE_UTIL_ERROR_INVALID_OPERATION; +} + +/* internal functions for testsuite */ + + +/* callback functions for test */ +static void __decode_completed_cb(int error_code, void *user_data, unsigned long width, unsigned long height, unsigned long long size) +{ + test_complex_data_s *result = (test_complex_data_s *)user_data; + + g_print("\t__decode_completed_cb invoked %d\n", error_code); + + if (error_code != IMAGE_UTIL_ERROR_NONE) { + g_print("Fail to decode image %d\n", error_code); + __signal(); + return; + } + + result->size.w = (unsigned int)width; + result->size.h = (unsigned int)height; + result->buffer_size = (size_t)size; + __signal(); +} + +static void __decode_completed2_cb(int error_code, image_util_image_h image, void *user_data) +{ + int ret = IMAGE_UTIL_ERROR_NONE; + test_complex_data_s *result = (test_complex_data_s *)user_data; + + g_print("\t__decode_completed2_cb invoked %d\n", error_code); + + if (error_code != IMAGE_UTIL_ERROR_NONE) { + g_print("Fail to decode image %d", error_code); + __signal(); + return; + } + + ret = image_util_clone_image(image, &result->image); + if (ret != IMAGE_UTIL_ERROR_NONE) + g_print("image_util_clone_image failed %d\n", ret); + + __signal(); +} + +static void __encode_completed_cb(int error_code, void *user_data, unsigned long long size) +{ + test_complex_data_s *result = (test_complex_data_s *)user_data; + + g_print("\t__encode_to_file_completed_cb invoked %d\n", error_code); + + if (error_code != IMAGE_UTIL_ERROR_NONE) + g_print("Fail to decode image %d\n", error_code); + + result->buffer_size = (size_t)size; + __signal(); +} + +static void __encode_to_file_completed_cb(image_util_error_e error_code, void *user_data) +{ + g_print("\t__encode_to_file_completed_cb invoked %d\n", error_code); + + if (error_code != IMAGE_UTIL_ERROR_NONE) + g_print("Fail to decode image %d\n", error_code); + + __signal(); +} + +static void __encode_to_buffer_completed_cb(image_util_error_e error_code, unsigned char *buffer, size_t buffer_size, void *user_data) +{ + test_complex_data_s *result = (test_complex_data_s *)user_data; + + g_print("\t__encode_to_buffer_completed_cb invoked %d\n", error_code); + + if (error_code != IMAGE_UTIL_ERROR_NONE) { + g_print("Fail to decode image %d\n", error_code); + __signal(); + return; + } + + result->buffer = calloc(1, buffer_size); + if (result->buffer) { + memcpy(result->buffer, buffer, buffer_size); + result->buffer_size = buffer_size; + } + __signal(); +} + +static void __transform_completed_cb(media_packet_h *dst, int error_code, void *user_data) +{ + media_packet_h *result = (media_packet_h *)user_data; + + g_print("\t__transform_completed_cb invoked %d\n", error_code); + + if (error_code != IMAGE_UTIL_ERROR_NONE) { + g_print("Fail to transform image %d\n", error_code); + __signal(); + return; + } + + *result = *dst; + + __signal(); +} + +static void __transform_completed2_cb(image_util_image_h dst, int error_code, void *user_data) +{ + int ret = IMAGE_UTIL_ERROR_NONE; + test_complex_data_s *result = (test_complex_data_s *)user_data; + + g_print("\t__transform_completed2_cb invoked %d\n", error_code); + + if (error_code != IMAGE_UTIL_ERROR_NONE) { + g_print("Fail to transform image %d\n", error_code); + __signal(); + return; + } + + ret = image_util_clone_image(dst, &result->image); + if (ret != IMAGE_UTIL_ERROR_NONE) + g_print("image_util_clone_image failed %d\n", ret); + + __signal(); +} + +/* callback functions for test */ + + +/* test functions for testsuite */ +/* decode JPE, PNG, GIF and BMP with params + * input : use path or buffer(buffer_size) + * output : use image + */ +static int __run_decode(test_decode_menu_e menu, test_complex_data_s *input, + test_decode_params_s *params, test_complex_data_s *result) +{ + int ret = IMAGE_UTIL_ERROR_NONE; + image_util_decode_h handle = NULL; + unsigned long width = 0; + unsigned long height = 0; + unsigned long long buffer_size = 0; + + if (!input || !params || !result) { + g_print("invalid parameter!!! input: %p, params: %p, result: %p\n", input, params, result); + return IMAGE_UTIL_ERROR_INVALID_PARAMETER; + } + + if (result->image) { + image_util_destroy_image(result->image); + result->image = NULL; + } + + ret = image_util_decode_create(&handle); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_decode_create failed %d\n", ret); + return ret; + } + + if (input->has_buffer) { + ret = image_util_decode_set_input_buffer(handle, input->buffer, input->buffer_size); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_decode_set_input_buffer failed %d\n", ret); + goto ERROR; + } + } else { + ret = image_util_decode_set_input_path(handle, input->path); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_decode_set_input_path failed %d\n", ret); + goto ERROR; + } + } + + ret = image_util_decode_set_colorspace(handle, params->color); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_decode_set_colorspace failed %d\n", ret); + goto ERROR; + } + + switch(menu) { + case DECODE_RUN: + ret = image_util_decode_set_output_buffer(handle, &result->buffer); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_decode_run failed %d\n", ret); + break; + } + + ret = image_util_decode_run(handle, &width, &height, &buffer_size); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_decode_run failed %d\n", ret); + break; + } + + ret = image_util_create_image((unsigned int)width, (unsigned int)height, params->color, + result->buffer, buffer_size, &result->image); + SAFE_FREE(result->buffer); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_create_image failed %d\n", ret); + break; + } + break; + + case DECODE_RUN_ASYNC: + ret = image_util_decode_set_output_buffer(handle, &result->buffer); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_decode_run failed %d\n", ret); + break; + } + + ret = image_util_decode_run_async(handle, __decode_completed_cb, result); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_decode_run failed %d\n", ret); + break; + } + __wait(); + + ret = image_util_create_image(result->size.w, result->size.h, params->color, + result->buffer, result->buffer_size, &result->image); + SAFE_FREE(result->buffer); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_create_image failed %d\n", ret); + break; + } + break; + + case DECODE_RUN2: + ret = image_util_decode_run2(handle, &result->image); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_decode_run2 failed %d\n", ret); + goto ERROR; + } + break; + + case DECODE_RUN_ASYNC2: + ret = image_util_decode_run_async2(handle, __decode_completed2_cb, result); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_decode_run2 failed %d\n", ret); + goto ERROR; + } + __wait(); + break; + + default: + g_print("wrong decode menu %u\n", menu); + break; + } + +ERROR: + image_util_decode_destroy(handle); + + return ret; +} + +/* encode JPE, PNG, GIF and BMP with params + * input : use image + * output : use path or buffer(buffer_size) + */ +static int __run_encode(test_encode_menu_e menu, test_complex_data_s *input, + test_encode_params_s *params, test_complex_data_s *result) +{ + int ret = IMAGE_UTIL_ERROR_NONE; + image_util_encode_h handle = NULL; + unsigned long long buffer_size = 0; + + if (!input || !params || !result) { + g_print("invalid parameter!!! input: %p, params: %p, result: %p\n", input, params, result); + return IMAGE_UTIL_ERROR_INVALID_PARAMETER; + } + + ret = __get_raw_data(input); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("__get_raw_data failed %d\n", ret); + return ret; + } + + if (result->buffer) { + SAFE_FREE(result->buffer); + result->image = NULL; + } + + ret = image_util_encode_create(params->type, &handle); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_decode_create failed %d\n", ret); + return ret; + } + + if (params->type == IMAGE_UTIL_JPEG) { + ret = image_util_encode_set_quality(handle, params->quality); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_decode_set_input_buffer failed %d\n", ret); + goto ERROR; + } + } else if (params->type == IMAGE_UTIL_PNG) { + ret = image_util_encode_set_png_compression(handle, params->compression); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_decode_set_input_buffer failed %d\n", ret); + goto ERROR; + } + } + + switch(menu) { + case ENCODE_RUN: + if (input->image) { + SAFE_FREE(input->buffer); + ret = image_util_get_image(input->image, &input->size.w, &input->size.h, &input->color, &input->buffer, &input->buffer_size); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_get_image failed %d\n", ret); + break; + } + } + + ret = image_util_encode_set_resolution(handle, input->size.w, input->size.h); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_encode_set_resolution failed %d\n", ret); + break; + } + + ret = image_util_encode_set_colorspace(handle, input->color); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_decode_run failed %d\n", ret); + break; + } + + ret = image_util_encode_set_input_buffer(handle, input->buffer); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_encode_set_input_buffer failed %d\n", ret); + break; + } + + if (params->use_buffer) { + ret = image_util_encode_set_output_buffer(handle, &result->buffer); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_encode_set_output_buffer failed %d\n", ret); + break; + } + } else { + ret = image_util_encode_set_output_path(handle, result->path); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_encode_set_output_path failed %d\n", ret); + break; + } + } + + ret = image_util_encode_run(handle, &buffer_size); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_encode_run failed %d\n", ret); + break; + } + result->buffer_size = buffer_size; + + if (params->use_buffer) { + __write_file(result->path, result->buffer, result->buffer_size); + SAFE_FREE(result->buffer); + } + break; + + case ENCODE_RUN_ASYNC: + if (input->image) { + SAFE_FREE(input->buffer); + ret = image_util_get_image(input->image, &input->size.w, &input->size.h, &input->color, &input->buffer, &input->buffer_size); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_get_image failed %d\n", ret); + break; + } + } + + ret = image_util_encode_set_resolution(handle, input->size.w, input->size.h); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_encode_set_resolution failed %d\n", ret); + break; + } + + ret = image_util_encode_set_colorspace(handle, input->color); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_decode_run failed %d\n", ret); + break; + } + + ret = image_util_encode_set_input_buffer(handle, input->buffer); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_encode_set_input_buffer failed %d\n", ret); + break; + } + + if (params->use_buffer) { + ret = image_util_encode_set_output_buffer(handle, &result->buffer); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_encode_set_output_buffer failed %d\n", ret); + break; + } + } else { + ret = image_util_encode_set_output_path(handle, result->path); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_encode_set_output_path failed %d\n", ret); + break; + } + } + + ret = image_util_encode_run_async(handle, __encode_completed_cb, result); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_encode_run_async failed %d\n", ret); + break; + } + __wait(); + + if (params->use_buffer) { + __write_file(result->path, result->buffer, result->buffer_size); + SAFE_FREE(result->buffer); + } + break; + + case ENCODE_RUN_TO_FILE: + ret = image_util_encode_run_to_file(handle, input->image, result->path); + if (ret != IMAGE_UTIL_ERROR_NONE) + g_print("image_util_encode_run_to_file failed %d\n", ret); + break; + case ENCODE_RUN_TO_BUFFER: + ret = image_util_encode_run_to_buffer(handle, input->image, &result->buffer, &result->buffer_size); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_encode_run_to_buffer failed %d\n", ret); + break; + } + __write_file(result->path, result->buffer, result->buffer_size); + break; + case ENCODE_RUN_ASYNC_TO_FILE: + ret = image_util_encode_run_async_to_file(handle, input->image, result->path, + __encode_to_file_completed_cb, NULL); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_encode_run_async_to_file failed %d\n", ret); + break; + } + __wait(); + break; + case ENCODE_RUN_ASYNC_TO_BUFFER: + ret = image_util_encode_run_async_to_buffer(handle, input->image, + __encode_to_buffer_completed_cb, result); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_encode_run_async_to_buffer failed %d\n", ret); + break; + } + __wait(); + __write_file(result->path, result->buffer, result->buffer_size); + break; + + default: + g_print("wrong encode menu %u", menu); + break; + } + +ERROR: + image_util_encode_destroy(handle); + + return ret; +} + +/* encode animated GIF with deprecated APIs + * input : use image_cnt & images + * output : use path or buffer(buffer_size) + */ +static int __run_encode_agif_deprecated(test_encode_menu_e menu, test_complex_data_s *input, + test_encode_agif_params_s *params, test_complex_data_s *result) +{ + int ret = IMAGE_UTIL_ERROR_NONE; + image_util_encode_h handle = NULL; + unsigned int i = 0; + unsigned int width = 0, height = 0; + unsigned char **buffer = NULL; + size_t buffer_size = 0; + unsigned long long size = 0; + + if (!input || !params || !result) { + g_print("invalid parameter!!! input: %p, params: %p, result: %p\n", input, params, result); + return IMAGE_UTIL_ERROR_INVALID_PARAMETER; + } + + buffer = calloc(1, sizeof(char *) * input->image_cnt); + if (!buffer) { + g_print("Memory allocation failed %d\n", ret); + return IMAGE_UTIL_ERROR_OUT_OF_MEMORY; + } + + ret = image_util_encode_create(IMAGE_UTIL_GIF, &handle); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_encode_create failed %d\n", ret); + SAFE_FREE(buffer); + return ret; + } + + for (i = 0; i < input->image_cnt; i++) { + ret = image_util_get_image(input->images[i], &width, &height, NULL, &buffer[i], &buffer_size); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_get_image failed %d\n", ret); + goto ERROR; + } + + ret = image_util_encode_set_resolution(handle, (unsigned long) width, (unsigned long) height); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_encode_set_resolution failed %d\n", ret); + goto ERROR; + } + + ret = image_util_encode_set_gif_frame_delay_time(handle, params->delay); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_encode_set_gif_frame_delay_time failed %d\n", ret); + goto ERROR; + } + + ret = image_util_encode_set_input_buffer(handle, buffer[i]); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_encode_set_input_buffer failed %d\n", ret); + goto ERROR; + } + } + + switch(menu) { + case ENCODE_AGIF_RUN: + if (params->use_buffer) { + ret = image_util_encode_set_output_buffer(handle, &result->buffer); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_encode_set_output_buffer failed %d\n", ret); + break; + } + } else { + ret = image_util_encode_set_output_path(handle, result->path); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_encode_set_output_path failed %d\n", ret); + break; + } + } + + ret = image_util_encode_run(handle, &size); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_encode_run failed %d\n", ret); + break; + } + + result->buffer_size = (size_t)size; + if (params->use_buffer) { + __write_file(result->path, result->buffer, result->buffer_size); + SAFE_FREE(result->buffer); + } + break; + + case ENCODE_AGIF_RUN_ASYNC: + if (params->use_buffer) { + ret = image_util_encode_set_output_buffer(handle, &result->buffer); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_encode_set_output_buffer failed %d\n", ret); + break; + } + } else { + ret = image_util_encode_set_output_path(handle, result->path); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_encode_set_output_path failed %d\n", ret); + break; + } + } + + ret = image_util_encode_run_async(handle, __encode_completed_cb, &result); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_encode_run_async failed %d\n", ret); + break; + } + __wait(); + + if (params->use_buffer) { + __write_file(result->path, result->buffer, result->buffer_size); + SAFE_FREE(result->buffer); + } + break; + default: + g_print("wrong encode agif menu %u", menu); + break; + } + +ERROR: + image_util_encode_destroy(handle); + + for (i = 0; i < input->image_cnt; i++) + SAFE_FREE(buffer[i]); + + SAFE_FREE(buffer); + + return ret; +} + +/* encode animated GIF frame by frame + * input : use image_cnt & images + * output : use path or buffer(buffer_size) + */ +static int __run_encode_agif(test_encode_menu_e menu, test_complex_data_s *input, + test_encode_agif_params_s *params, test_complex_data_s *result) +{ + int ret = IMAGE_UTIL_ERROR_NONE; + image_util_agif_encode_h handle = NULL; + unsigned int i = 0; + + if (!input || !params || !result) { + g_print("invalid parameter!!! input: %p, params: %p, result: %p\n", input, params, result); + return IMAGE_UTIL_ERROR_INVALID_PARAMETER; + } + + ret = image_util_agif_encode_create(&handle); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_agif_encode_create failed %d\n", ret); + return ret; + } + + for (i = 0; i < input->image_cnt; i++) { + ret = image_util_agif_encode_add_frame(handle, input->images[i], params->delay); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_agif_encode_add_frame failed %d\n", ret); + goto ERROR; + } + } + + switch(menu) { + case ENCODE_AGIF_SAVE_TO_FILE: + ret = image_util_agif_encode_save_to_file(handle, result->path); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_agif_encode_save_to_file failed %d\n", ret); + break; + } + break; + + case ENCODE_AGIF_SAVE_TO_BUFFER: + ret = image_util_agif_encode_save_to_buffer(handle, &result->buffer, &result->buffer_size); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_agif_encode_save_to_buffer failed %d\n", ret); + break; + } + __write_file(result->path, result->buffer, result->buffer_size); + SAFE_FREE(result->buffer); + break; + default: + g_print("wrong encode agif menu %u", menu); + break; + } + +ERROR: + image_util_agif_encode_destroy(handle); + + return ret; +} + +/* run transform with parameters + * input/output : use only image_h + */ +static int __run_transform(test_transform_menu_e menu, test_complex_data_s *input, + test_transform_params_s *params, test_complex_data_s *result) +{ + int ret = IMAGE_UTIL_ERROR_NONE; + transformation_h handle = NULL; + media_packet_h mpacket = NULL; + media_packet_h res_mpacket = NULL; + + if (!input || !params || !result) { + g_print("invalid parameter!!! input: %p, params: %p, result: %p\n", input, params, result); + return IMAGE_UTIL_ERROR_INVALID_PARAMETER; + } + + ret = __get_raw_data(input); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("__get_raw_data failed %d\n", ret); + return ret; + } + + if (result->image) { + image_util_destroy_image(result->image); + result->image = NULL; + } + + ret = image_util_transform_create(&handle); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_transform_create failed %d\n", ret); + return ret; + } + + if (params->has_convert_color) { + ret = image_util_transform_set_colorspace(handle, params->convert_color); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_transform_set_colorspace failed %d\n", ret); + goto ERROR; + } + } + + if (params->has_crop) { + ret = image_util_transform_set_crop_area(handle, params->crop_area.x, params->crop_area.y, params->crop_area.w, params->crop_area.h); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_transform_set_crop_area failed %d\n", ret); + goto ERROR; + } + } + + if (params->has_resize) { + ret = image_util_transform_set_resolution(handle, params->resize.w, params->resize.h); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_transform_set_resolution failed %d\n", ret); + goto ERROR; + } + } + + if (params->has_rotation) { + ret = image_util_transform_set_rotation(handle, params->rotation); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_transform_set_rotation failed %d\n", ret); + goto ERROR; + } + } + + switch(menu) { + case TRANSFORM_RUN: + ret = __convert_image_to_packet(input->image, &mpacket); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("__convert_image_to_packet failed %d\n", ret); + break; + } + + ret = image_util_transform_run(handle, mpacket, __transform_completed_cb, &res_mpacket); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_transform_run failed %d\n", ret); + break; + } + __wait(); + + ret = __convert_packet_to_image(res_mpacket, &result->image); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("__convert_packet_to_image failed %d\n", ret); + break; + } + break; + case TRANSFORM_RUN2: + ret = image_util_transform_run2(handle, input->image, &result->image); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_transform_run2 failed %d\n", ret); + break; + } + break; + case TRANSFORM_RUN2_ASYNC: + ret = image_util_transform_run2_async(handle, input->image, __transform_completed2_cb, result); + if (ret != IMAGE_UTIL_ERROR_NONE) { + g_print("image_util_transform_run2_async failed %d\n", ret); + break; + } + __wait(); + break; + default: + g_print("wrong transform menu %u\n", menu); + break; + } + +ERROR: + image_util_transform_destroy(handle); + + return ret; +} + +static int __run_auto(void) +{ + int ret = IMAGE_UTIL_ERROR_NONE; + image_util_type_e image_type = IMAGE_UTIL_JPEG; + static test_complex_data_s encode_temp_result; + + g_num_of_file = 0; + + g_decode_params.color = IMAGE_UTIL_COLORSPACE_RGBA8888; + g_decode_params.downscale = IMAGE_UTIL_DOWNSCALE_1_1; + + ret = __run_decode(DECODE_RUN2, &g_input_data, &g_decode_params, &g_decode_result); + if (ret == IMAGE_UTIL_ERROR_NONE) + g_print("Success DECODE_RUN2!!!\n"); + else + g_print("Fail DECODE_RUN2!!!\n"); + + g_encode_params.type = IMAGE_UTIL_JPEG; + g_encode_params.quality = 100; + __set_auto_file(g_encode_params.type, &g_encode_result.path); + + g_transform_params.crop_area.x = 0; + g_transform_params.crop_area.y = 0; + g_transform_params.crop_area.w = 640; + g_transform_params.crop_area.h = 480; + + g_transform_params.resize.w = 320; + g_transform_params.resize.h = 240; + + g_transform_params.rotation = IMAGE_UTIL_ROTATION_90; + + ret = __run_encode(ENCODE_RUN_TO_FILE, &g_decode_result, &g_encode_params, &g_encode_result); + if (ret == IMAGE_UTIL_ERROR_NONE) + g_print("Success ENCODE_RUN_TO_FILE!!!\n"); + else + g_print("Fail ENCODE_RUN_TO_FILE!!!\n"); + + for (image_type = IMAGE_UTIL_JPEG; image_type <= IMAGE_UTIL_BMP; image_type++) { + g_print("[[[ IMAGE_TYPE %d ]]]\n", image_type); + + ret = __run_decode(DECODE_RUN2, &g_encode_result, &g_decode_params, &g_decode_result); + if (ret == IMAGE_UTIL_ERROR_NONE) + g_print("Success DECODE_RUN2!!!\n"); + else + g_print("Fail DECODE_RUN2!!!\n"); + + g_transform_params.has_crop = TRUE; + __run_transform(TRANSFORM_RUN2, &g_decode_result, &g_transform_params, &g_transform_result); + if (ret == IMAGE_UTIL_ERROR_NONE) + g_print("Success TRANSFORM_RUN2(crop)!!!\n"); + else + g_print("Fail TRANSFORM_RUN2(crop)!!!\n"); + + g_transform_params.has_crop = FALSE; + + __set_auto_file(image_type, &encode_temp_result.path); + ret = __run_encode(ENCODE_RUN_TO_FILE, &g_decode_result, &g_encode_params, &encode_temp_result); + if (ret == IMAGE_UTIL_ERROR_NONE) + g_print("Success ENCODE_RUN_TO_FILE!!!\n"); + else + g_print("Fail ENCODE_RUN_TO_FILE!!!\n"); + + __run_decode(DECODE_RUN_ASYNC2, &g_encode_result, &g_decode_params, &g_decode_result); + if (ret == IMAGE_UTIL_ERROR_NONE) + g_print("Success DECODE_RUN_ASYNC2!!!\n"); + else + g_print("Fail DECODE_RUN_ASYNC2!!!\n"); + + g_transform_params.has_resize = TRUE; + __run_transform(TRANSFORM_RUN2, &g_decode_result, &g_transform_params, &g_transform_result); + if (ret == IMAGE_UTIL_ERROR_NONE) + g_print("Success TRANSFORM_RUN2(resize)!!!\n"); + else + g_print("Fail TRANSFORM_RUN2(resize)!!!\n"); + + g_transform_params.has_resize = FALSE; + + __set_auto_file(image_type, &encode_temp_result.path); + ret = __run_encode(ENCODE_RUN_TO_BUFFER, &g_transform_result, &g_encode_params, &encode_temp_result); + if (ret == IMAGE_UTIL_ERROR_NONE) + g_print("Success ENCODE_RUN_TO_BUFFER!!!\n"); + else + g_print("Fail ENCODE_RUN_TO_BUFFER!!!\n"); + + __run_decode(DECODE_RUN_ASYNC2, &g_encode_result, &g_decode_params, &g_decode_result); + if (ret == IMAGE_UTIL_ERROR_NONE) + g_print("Success DECODE_RUN_ASYNC2!!!\n"); + else + g_print("Fail DECODE_RUN_ASYNC2!!!\n"); + + g_transform_params.has_rotation = TRUE; + __run_transform(TRANSFORM_RUN2, &g_decode_result, &g_transform_params, &g_transform_result); + if (ret == IMAGE_UTIL_ERROR_NONE) + g_print("Success TRANSFORM_RUN2(rotate)!!!\n"); + else + g_print("Fail TRANSFORM_RUN2(rotate)!!!\n"); + + g_transform_params.has_rotation = FALSE; + + /* change next image_type */ + g_encode_params.type = ((image_type + 1 > IMAGE_UTIL_BMP) ? IMAGE_UTIL_BMP : (image_type + 1)); + __set_auto_file(g_encode_params.type, &g_encode_result.path); + + ret = __run_encode(ENCODE_RUN_ASYNC_TO_BUFFER, &g_transform_result, &g_encode_params, &g_encode_result); + if (ret == IMAGE_UTIL_ERROR_NONE) + g_print("Success ENCODE_RUN_ASYNC_TO_BUFFER!!!\n"); + else + g_print("Fail ENCODE_RUN_ASYNC_TO_BUFFER!!!\n"); + } + + return ret; +} +/* test functions for testsuite */ + + +/* interprete menu */ + +/* push result data-set of test to stack */ +static void __data_push(test_complex_data_s *comp_data) +{ + if (!comp_data) + return; + + if (!g_queue_data) { + g_queue_data = g_queue_new(); + if (!g_queue_data) { + g_print("g_queue_new failed\n"); + return; + } + } + +#if DEBUG_QUEUE + g_print("[push data] %u\n", comp_data->type); +#endif + + g_queue_push_tail(g_queue_data, comp_data); +} + +static void __data_push_if_empty(test_complex_data_s *comp_data) +{ + if (g_queue_data) { + if (!g_queue_is_empty(g_queue_data)) { + g_print("data queue is not empty\n"); + return ; + } + } + + __data_push(comp_data); +} + +/* pop input data-set of test from stack */ +static gboolean __data_pop(test_complex_data_s **comp_data) +{ + test_complex_data_s *get = NULL; + + if (g_queue_is_empty(g_queue_data)) { + return FALSE; + } + + get = g_queue_pop_tail(g_queue_data); + if (!get) { + g_print("wrong data!\n\n"); + return FALSE; + } + +#if DEBUG_QUEUE + g_print("[pop data] %u\n", get->type); +#endif + + *comp_data = get; + + return TRUE; +} + +static void __menu_move(test_menu_state_e new_menu) +{ + test_queue_menu_s *data = NULL; + + if (!g_queue_menu) { + g_queue_menu = g_queue_new(); + if (!g_queue_menu) { + g_print("g_queue_new failed\n"); + return; + } + } + + data = calloc(1, sizeof(test_queue_menu_s)); + if (!data) { + g_print("Memory allocation failed\n"); + return; + } + +#if DEBUG_QUEUE + g_print("[menu move] %u -> %u\n", g_current_menu, new_menu); +#endif + + data->menu_state = g_current_menu; + g_queue_push_tail(g_queue_menu, data); + + g_previous_menu = g_current_menu; + + g_current_menu = new_menu; +} + +static void __menu_back(void) +{ + test_queue_menu_s *data = NULL; + + if (g_queue_is_empty(g_queue_menu)) { + return; + } + + data = g_queue_pop_tail(g_queue_menu); + if (!data) { + g_print("wrong menu data!\n\n"); + return; + } + +#if DEBUG_QUEUE + g_print("[menu back] %u -> %u\n", g_current_menu, data->menu_state); +#endif + + g_previous_menu = g_current_menu; + + g_current_menu = data->menu_state; + + SAFE_FREE(data); +} + +static void __quit(void) +{ + if (g_mainloop) + g_main_loop_quit(g_mainloop); +} + +static void __interpret_decode(const char *cmd, unsigned int index) +{ + int ret = 0; + test_complex_data_s *input_data = NULL; + + switch(index) { + case DECODE_SET_BUFFER: + __menu_move(SET_BUFFER_MENU); + break; + case DECODE_SET_COLOR: + __menu_move(SET_COLOR_MENU); + break; + case DECODE_SET_DOWNSCALE: + __menu_move(SET_DOWNSCALE_MENU); + break; + case DECODE_RUN: + case DECODE_RUN_ASYNC: + case DECODE_RUN2: + case DECODE_RUN_ASYNC2: + if (!__data_pop(&input_data)) { + g_print("There is no test data for decode.\n"); + break; + } + ret = __run_decode(index, input_data, &g_decode_params, &g_decode_result); + if (ret == IMAGE_UTIL_ERROR_NONE) { + g_print("Success to decode image!!!\n"); +#if DUMP_RAW_IMAGE + __write_jpeg("decode", g_decode_result.image); +#endif + __data_push(&g_decode_result); + } else { + g_print("Fail to decode image!!!\n"); + __data_push(input_data); + } + break; + default: + g_print("wrong command! %s\n\n", cmd); + break; + } +} + +static void __interpret_encode(const char *cmd, unsigned int index) +{ + int ret = 0; + test_complex_data_s *input_data = NULL; + + switch(index) { + case ENCODE_SET_TYPE: + __menu_move(SET_TYPE_MENU); + break; + case ENCODE_SET_QUALITY: + __menu_move(SET_QUALITY_MENU); + break; + case ENCODE_SET_COMPRESIION: + __menu_move(SET_COMPRESSION_MENU); + break; + case ENCODE_SET_TO_BUFFER: + __menu_move(SET_TO_BUFFER_MENU); + break; + case ENCODE_RUN: + case ENCODE_RUN_ASYNC: + case ENCODE_RUN_TO_FILE: + case ENCODE_RUN_TO_BUFFER: + case ENCODE_RUN_ASYNC_TO_FILE: + case ENCODE_RUN_ASYNC_TO_BUFFER: + if (!__data_pop(&input_data)) { + g_print("There is no test data for encode.\n"); + break; + } + __set_encode_file(g_encode_params.type, FILE_FOR_ENCODE, &g_encode_result.path); + ret = __run_encode(index, input_data, &g_encode_params, &g_encode_result); + if (ret == IMAGE_UTIL_ERROR_NONE) { + g_print("Success to encode image!!!\n"); + __data_push(&g_encode_result); + } else { + g_print("Fail to encode image!!!\n"); + __data_push(input_data); + } + break; + default: + g_print("wrong command! %s\n\n", cmd); + break; + } +} + +static void __interpret_encode_agif(const char *cmd, unsigned int index) +{ + int ret = 0; + test_complex_data_s *input_data = NULL; + + switch(index) { + case ENCODE_AGIF_SET_DIR: + __menu_move(SET_DIR_MENU); + break; + case ENCODE_AGIF_SET_DELAY: + __menu_move(SET_DELAY_MENU); + break; + case ENCODE_AGIF_SET_TO_BUFFER: + __menu_move(SET_TO_BUFFER_MENU); + break; + case ENCODE_AGIF_RUN: + case ENCODE_AGIF_RUN_ASYNC: + if (!__data_pop(&input_data)) { + g_print("There is no test data for decode.\n"); + break; + } + __set_encode_file(IMAGE_UTIL_GIF, FILE_FOR_ENCODE_AGIF, &g_encode_agif_result.path); + ret = __run_encode_agif_deprecated(index, input_data, &g_encode_agif_params, &g_encode_agif_result); + if (ret == IMAGE_UTIL_ERROR_NONE) { + g_print("Success to encode image!!!\n"); + __data_push(&g_encode_agif_result); + } else { + g_print("Fail to encode image!!!\n"); + __data_push(input_data); + } + break; + case ENCODE_AGIF_SAVE_TO_FILE: + case ENCODE_AGIF_SAVE_TO_BUFFER: + if (!__data_pop(&input_data)) { + g_print("There is no test data for decode.\n"); + break; + } + __set_encode_file(IMAGE_UTIL_GIF, FILE_FOR_ENCODE_AGIF, &g_encode_agif_result.path); + ret = __run_encode_agif(index, input_data, &g_encode_agif_params, &g_encode_agif_result); + if (ret == IMAGE_UTIL_ERROR_NONE) { + g_print("Success to encode image!!!\n"); + __data_push(&g_encode_agif_result); + } else { + g_print("Fail to encode image!!!\n"); + __data_push(input_data); + } + break; + default: + g_print("wrong command! %s\n\n", cmd); + break; + } +} + +static void __interpret_transform(const char *cmd, unsigned int index) +{ + int ret = 0; + test_complex_data_s *input_data = NULL; + + switch(index) { + case TRANSFORM_SET_CONVERT: + __menu_move(SET_CONVERT_MENU); + break; + case TRANSFORM_SET_CROP: + __menu_move(SET_CROP_MENU); + break; + case TRANSFORM_SET_RESIZE: + __menu_move(SET_RESIZE_MENU); + break; + case TRANSFORM_SET_ROTATE: + __menu_move(SET_ROTATE_MENU); + break; + case TRANSFORM_RUN: + case TRANSFORM_RUN2: + case TRANSFORM_RUN2_ASYNC: + if (!__data_pop(&input_data)) { + g_print("There is no test data for decode.\n"); + break; + } + ret = __run_transform(index, input_data, &g_transform_params, &g_transform_result); + if (ret == IMAGE_UTIL_ERROR_NONE) { + g_print("Success to transform image!!!\n"); +#if DUMP_RAW_IMAGE + __write_jpeg("transform", g_transform_result.image); +#endif + __data_push(&g_transform_result); + } else { + g_print("Fail to transform image!!!\n"); + __data_push(input_data); + } + break; + default: + g_print("wrong command! %s\n\n", cmd); + break; + } +} + +static gboolean __interpret_set_menu(test_menu_state_e menu_state, const char *cmd, unsigned int index) +{ + switch(menu_state) { + case SET_BUFFER_MENU: + if (g_ascii_strcasecmp(cmd, "y") == 0) { + SAFE_FREE(g_input_data.buffer); + if (__read_file(g_input_data.path, (void **)&g_input_data.buffer, &g_input_data.buffer_size)) + g_input_data.has_buffer = TRUE; + } + break; + case SET_TO_BUFFER_MENU: + if (g_ascii_strcasecmp(cmd, "y") == 0) { + if (g_previous_menu == ENCODE_MENU) { + g_encode_params.use_buffer = TRUE; + g_print("Data will be encoded to buffer\n"); + } else if (g_previous_menu == ENCODE_AGIF_MENU) { + g_encode_agif_params.use_buffer = TRUE; + g_print("Data will be encoded to buffer\n"); + } + } else { + g_encode_params.use_buffer = FALSE; + g_encode_agif_params.use_buffer = FALSE; + } + break; + case SET_RAW_COLOR_MENU: + g_input_data.color = index; + g_print("Success to set raw path color (%u)\n", g_input_data.color); + break; + case SET_COLOR_MENU: + g_decode_params.color = index; + g_print("Success to set color (%u)\n", g_decode_params.color); + break; + case SET_COMPRESSION_MENU: + g_encode_params.compression = index; + g_print("Success to set compression (%u)\n", g_encode_params.compression); + break; + case SET_CONVERT_MENU: + g_transform_params.convert_color = index; + g_transform_params.has_convert_color = TRUE; + g_print("Success to set convert_color (%u)\n", g_transform_params.convert_color); + break; + case SET_CROP_MENU: + if (!__set_input_crop_area(cmd, &g_transform_params.crop_area)) { + g_print("wrong size! %s\n\n", cmd); + return FALSE; + } + g_transform_params.has_crop = TRUE; + g_print("Success to set crop_area(%ux%u, %ux%u)\n", g_transform_params.crop_area.x, + g_transform_params.crop_area.y, g_transform_params.crop_area.w, g_transform_params.crop_area.h); + break; + case SET_DELAY_MENU: + g_encode_agif_params.delay = index; + g_print("Success to set agif delay (%u)\n", g_encode_agif_params.delay); + break; + case SET_DOWNSCALE_MENU: + g_decode_params.downscale = index; + break; + case SET_QUALITY_MENU: + g_encode_params.quality = index; + g_print("Success to set quality (%u)\n", g_encode_params.quality); + break; + case SET_RESIZE_MENU: + if (!__set_input_size(cmd, &g_transform_params.resize)) { + g_print("wrong size! %s\n\n", cmd); + return FALSE; + } + g_transform_params.has_resize = TRUE; + g_print("Success to set resize (%ux%u)\n", g_transform_params.resize.w, g_transform_params.resize.h); + break; + case SET_ROTATE_MENU: + g_transform_params.rotation = index; + g_transform_params.has_rotation = TRUE; + g_print("Success to set rotate (%u)\n", g_transform_params.rotation); + break; + case SET_SIZE_MENU: + if (!__set_input_size(cmd, &g_input_data.size)) { + g_print("wrong size! %s\n\n", cmd); + return FALSE; + } + g_print("Success to set size (%ux%u)\n", g_input_data.size.w, g_input_data.size.h); + break; + case SET_TYPE_MENU: + g_encode_params.type = index; + __set_encode_file(g_encode_params.type, FILE_FOR_ENCODE, &g_encode_result.path); + g_print("Success to set image_type (%u)\n", g_encode_params.type); + break; + default: + g_print("wrong command! %s\n\n", cmd); + return FALSE; + } + + return TRUE; +} + +static void __interpret_main(const char *cmd, unsigned int index) +{ + __data_push_if_empty(&g_input_data); + + switch(index) { + case SET_PATH: + __menu_move(SET_PATH_MENU); + break; + case TEST_AUTO: + __run_auto(); + break; + case TEST_DECODE: + __menu_move(DECODE_MENU); + break; + case TEST_ENCODE: + __menu_move(ENCODE_MENU); + break; + case TEST_ENCODE_AGIF: + __menu_move(ENCODE_AGIF_MENU); + break; + case TEST_TRANSFORM: + __menu_move(TRANSFORM_MENU); + break; + default: + g_print("wrong command! %s\n\n", cmd); + break; + } +} + +static void __interpret_cmd(char *cmd) +{ + unsigned int index = 0; + + if (cmd == NULL || strlen(cmd) == 0) { + g_print("No input!\n"); + return; + } + + if (strncmp(cmd, "q", strlen(cmd)) == 0) { + __quit(); + return; + } + + if (strncmp(cmd, "b", strlen(cmd)) == 0) { + __menu_back(); + __display_menu(g_current_menu); + return; + } + + __safe_atoui(cmd, &index); + + switch(g_current_menu) { + /* Main menu */ + case MAIN_MENU: + __interpret_main(cmd, index); + break; + + /* Decode menu */ + case DECODE_MENU: + __interpret_decode(cmd, index); + break; + + /* Encode menu */ + case ENCODE_MENU: + __interpret_encode(cmd, index); + break; + + /* Encode A-GIF menu */ + case ENCODE_AGIF_MENU: + __interpret_encode_agif(cmd, index); + break; + + /* Transform menu */ + case TRANSFORM_MENU: + __interpret_transform(cmd, index); + break; + + /* Set path menu */ + case SET_PATH_MENU: + if (!__set_input_path(cmd)) { + g_print("[Warn] Fail to set input path! %s\n", cmd); + goto ERROR; + } + __menu_back(); + if (IS_RAW_FILE(g_input_data.path)) { + g_input_data.is_raw = TRUE; + __menu_move(SET_PATH_SUB_MENU); + } + break; + case SET_PATH_SUB_MENU: + switch(index) { + case RAW_IMG_SET_COLOR: + __menu_move(SET_RAW_COLOR_MENU); + break; + case RAW_IMG_SET_SIZE: + __menu_move(SET_SIZE_MENU); + break; + default: + g_print("wrong raw path menu! %s\n\n", cmd); + break; + } + break; + case SET_DIR_MENU: + if (!__set_input_path(cmd)) { + g_print("[Warn] Fail to set input path! %s\n", cmd); + break; + } + __menu_back(); + break; + + /* Set optional parameters menu */ + case SET_BUFFER_MENU: + case SET_TO_BUFFER_MENU: + case SET_COLOR_MENU: + case SET_RAW_COLOR_MENU: + case SET_COMPRESSION_MENU: + case SET_CONVERT_MENU: + case SET_CROP_MENU: + case SET_DELAY_MENU: + case SET_DOWNSCALE_MENU: + case SET_QUALITY_MENU: + case SET_RESIZE_MENU: + case SET_ROTATE_MENU: + case SET_SIZE_MENU: + case SET_TYPE_MENU: + if (__interpret_set_menu(g_current_menu, cmd, index)) + __menu_back(); + break; + + default: + g_print("wrong menu state\n"); + break; + } + + __display_menu(g_current_menu); + return; + +ERROR: + __menu_back(); + __display_menu(g_current_menu); + return; +} +/* interprete menu */ + + +/* testsuite mainloop */ +/* + * This function initializes and sets default values for testsuite + */ +static void _init_data(void) +{ + memset(&g_input_data, 0, sizeof(test_complex_data_s)); + + /* init & set default parameters */ + memset(&g_decode_params, 0, sizeof(test_decode_params_s)); + memset(&g_encode_params, 0, sizeof(test_encode_params_s)); + memset(&g_encode_agif_params, 0, sizeof(test_encode_agif_params_s)); + memset(&g_transform_params, 0, sizeof(test_transform_params_s)); + + /* If you want to change default value, change the value here!!! */ + /* common */ + + /* decode */ + g_decode_params.color = IMAGE_UTIL_COLORSPACE_RGBA8888; + g_decode_params.downscale = IMAGE_UTIL_DOWNSCALE_1_1; + + /* encode */ + g_encode_params.type = IMAGE_UTIL_JPEG; + g_encode_params.quality = 75; + g_encode_params.compression = IMAGE_UTIL_PNG_COMPRESSION_6; + + /* encode_agif */ + g_encode_agif_params.delay = 10; + + /* transform, not used yet */ + g_transform_params.convert_color = IMAGE_UTIL_COLORSPACE_RGB888; + g_transform_params.crop_area.x = g_transform_params.crop_area.y = 100; + g_transform_params.crop_area.w = g_transform_params.crop_area.h = 200; + g_transform_params.resize.x = g_transform_params.resize.y = 0; + g_transform_params.resize.w = g_transform_params.resize.h = 100; + g_transform_params.rotation = IMAGE_UTIL_ROTATION_90; + + /* init results */ + memset(&g_decode_result, 0, sizeof(test_complex_data_s)); + memset(&g_encode_result, 0, sizeof(test_complex_data_s)); + memset(&g_transform_result, 0, sizeof(test_complex_data_s)); +} + +/* + * This function releases allocated memory for testsuite when program finish + */ +static void _destroy_data(void) +{ + unsigned int i = 0; + + g_queue_free_full(g_queue_menu, __queue_free_func); + g_queue_free_full(g_queue_agif_images, __queue_free_func); + + SAFE_G_FREE(g_input_data.path); + SAFE_FREE(g_input_data.buffer); + + for (i = 0; i < g_input_data.image_cnt; i++) + image_util_destroy_image(g_input_data.images[i]); + + SAFE_FREE(g_decode_result.buffer); + SAFE_FREE(g_transform_result.buffer); + SAFE_FREE(g_encode_result.buffer); + + image_util_destroy_image(g_decode_result.image); + image_util_destroy_image(g_transform_result.image); + image_util_destroy_image(g_encode_result.image); +} + +/* + * This function gets input + */ +static gboolean _input_func(GIOChannel *channel) +{ + gchar buf[MAX_STRING_LEN]; + gsize read = 0; + guint condition = 0; + GError *error = NULL; + + condition = g_io_channel_read_chars(channel, buf, MAX_STRING_LEN, &read, &error); + if (!condition) { + g_print("g_io_channel_read_chars failed : %s", error ? error->message : "none"); + if (error) g_error_free(error); + return TRUE; + } + + buf[read] = '\0'; + g_strstrip(buf); + + __interpret_cmd(buf); + + return TRUE; +} + +/* + * This function displays help + */ +static void _display_help(const char *cmd) +{ + g_print("====================================================\n"); + g_print("[image-util CAPI test: v%2.1f\n", VERSION); + g_print("%s {file_path} {test_mode} [for jpg/png/gif/bmp]\n", cmd); + g_print("%s {directory} {test_mode} [for a-gif]\n", cmd); + g_print("{test_mode} 0:auto, 1:decode, 2:encode, 3:a-gif, 4:transform\n"); + g_print("\n[Note]\n"); + g_print(" The {file_path}/{directory} are mandotary. but the {test_mode} is optional.\n"); + g_print("\n[usage]\n"); + g_print(" 1. %s test.jpg\n", cmd); + g_print(" 2. %s test.jpg %d\n", cmd, TEST_AUTO); + g_print(" 3. %s test_dir %d\n", cmd, TEST_ENCODE_AGIF); + g_print("====================================================\n"); +} + +/* + * Main + */ +int main(int argc, char **argv) +{ + GIOChannel *stdin_channel = NULL; + stdin_channel = g_io_channel_unix_new(0); + g_io_channel_set_flags(stdin_channel, G_IO_FLAG_NONBLOCK, NULL); + g_io_add_watch(stdin_channel, G_IO_IN, (GIOFunc)_input_func, NULL); + + _init_data(); + + if (argc > 1 && argv[1]) { + if ((strcmp(argv[1], "help") == 0) + || (strcmp(argv[1], "-h") == 0) + || (strcmp(argv[1], "-help") == 0) + || (strcmp(argv[1], "--help") == 0)) { + _display_help(argv[0]); + return 0; + } + + __set_input_path(argv[1]); + } + + /* + * if there is no argument for path, go to set path menu. + * else if there is raw data image, go to set path sub menu. + */ + if (!g_input_data.path) { + __menu_move(MAIN_MENU); + __menu_move(SET_PATH_MENU); + } else if (IS_RAW_FILE(g_input_data.path)) { + g_input_data.is_raw = TRUE; + __menu_move(MAIN_MENU); + __menu_move(SET_PATH_SUB_MENU); + } + + if (argc > 2) { + __menu_move(MAIN_MENU); + __interpret_cmd(argv[2]); + } else { + __display_menu(g_current_menu); + } + + g_mainloop = g_main_loop_new(NULL, FALSE); + + g_main_loop_run(g_mainloop); + g_main_loop_unref(g_mainloop); + + _destroy_data(); + + g_io_channel_unref(stdin_channel); + + return 0; +} -- 2.7.4