2 * Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
23 #include <mm_util_image.h>
24 #include <mm_util_magick.h>
25 #include <mm_util_webp.h>
26 #include <mm_util_private.h>
27 #include <tzplatform_config.h>
30 #define ENCODE_FILE_PATH tzplatform_mkpath(TZ_USER_CONTENT, "webp_test_enc_file.webp")
31 #define ENCODE_MEM_PATH tzplatform_mkpath(TZ_USER_CONTENT, "webp_test_enc_mem.webp")
33 static char *g_path = NULL;
35 /* for reading files */
36 static GQueue *g_queue_files = NULL;
37 static GQueue *g_queue_images = NULL;
39 static const mm_util_color_format_e g_color = MM_UTIL_COLOR_ARGB;
40 static const unsigned int g_delay_time = 500; // 500ms
41 static const int g_loop_count = 0; // if loop_count is 0, it is infinite loop
42 static uint8_t g_bgcolor[] = { 0xFF, 0x00, 0x00, 0x00 }; // black
44 static void __decode_func(gpointer data, gpointer user_data)
46 int ret = MM_UTIL_ERROR_NONE;
47 char *path = (char *)data;
48 mm_util_image_h image = NULL;
50 if (!MMUTIL_STRING_VALID(path)) {
51 g_print("invalid path %s\n", path);
55 ret = mm_util_decode_image_from_file(path, g_color, &image);
56 if (ret != MM_UTIL_ERROR_NONE) {
57 g_print("mm_util_decode_image_from_file failed %d\n", ret);
61 ret = mm_image_set_delay_time(image, g_delay_time);
62 if (ret != MM_UTIL_ERROR_NONE) {
63 g_print("mm_image_set_delay_time failed %d\n", ret);
67 g_queue_push_tail(g_queue_images, image);
70 static gboolean __decode_files_in_queue()
73 g_queue_free_full(g_queue_images, mm_image_destroy_image);
75 g_queue_images = g_queue_new();
77 g_queue_foreach(g_queue_files, __decode_func, NULL);
79 if (g_queue_images->length == 0) {
80 g_print("No valid image\n");
84 g_print("%u valid image have been decoded.\n", g_queue_images->length);
89 static int __sort_compare(gconstpointer a, gconstpointer b, gpointer user_data)
91 const char *_a = (const char *)a;
92 const char *_b = (const char *)b;
93 if (strlen(_a) < strlen(_b))
96 if (strlen(_a) > strlen(_b))
99 return g_ascii_strcasecmp(_a, _b);
102 static gboolean __set_input_dir(const char *path)
105 const gchar *filename = NULL;
106 GError *g_error = NULL;
108 dir = g_dir_open(path, 0, &g_error);
110 g_print("invalid dir %s (%s)\n", path, g_error ? g_error->message : "none");
111 g_error_free(g_error);
116 g_queue_free_full(g_queue_files, g_free);
118 g_queue_files = g_queue_new();
120 /* push files of dir into queue */
121 while ((filename = g_dir_read_name(dir)) != NULL)
122 g_queue_insert_sorted(g_queue_files, g_strdup_printf("%s/%s", path, filename), __sort_compare, NULL);
126 if (g_queue_files->length == 0) {
127 g_print("\tNo test file in directory(%s)!\n", path);
131 /* decode files of dir */
132 if (!__decode_files_in_queue()) {
133 g_print("Fail to decode files from dir! %s\n", path);
140 static void __print_help(const char *argv0)
142 fprintf(stderr, "\t[usage] Encode animation webp with images\n");
143 fprintf(stderr, "\t\t1. encode : %s directory(has numeric named files)\n", argv0);
144 fprintf(stderr, "\t\t2. support jpeg/png/gif/bmp/webp files to animation webp\n");
147 static gboolean __get_arguments(int argc, char *argv[])
149 g_path = g_strdup(argv[1]);
151 if (!MMUTIL_STRING_VALID(g_path)) {
152 fprintf(stderr, "\t[WEBP_testsuite] invalid path %s\n", argv[1]);
156 if (!__set_input_dir(g_path)) {
157 fprintf(stderr, "\t[WEBP_testsuite] __set_input_dir failed\n");
164 static void __add_image(gpointer data, gpointer user_data)
168 ret = mm_util_webp_anim_enc_add_image((mm_util_webp_anim_enc_h)user_data, (mm_util_image_h)data);
169 if (ret != MM_UTIL_ERROR_NONE)
170 fprintf(stderr, "\t[WEBP_testsuite] mm_util_webp_anim_enc_add_image failed : %d\n", ret);
173 static int __webp_encode_setup(mm_util_webp_anim_enc_h *webp_encode)
176 mm_util_webp_anim_enc_h webp_enc = NULL;
178 mm_util_retvm_if(!webp_encode, MM_UTIL_ERROR_INVALID_PARAMETER, "invalid webp_encode");
180 ret = mm_util_webp_anim_enc_create(&webp_enc);
181 if (ret != MM_UTIL_ERROR_NONE) {
182 fprintf(stderr, "\t[WEBP_testsuite] mm_util_webp_anim_enc_create failed : %d\n", ret);
186 ret = mm_util_webp_anim_enc_set_bgcolor(webp_enc, g_bgcolor[0], g_bgcolor[1], g_bgcolor[2], g_bgcolor[3]);
187 if (ret != MM_UTIL_ERROR_NONE) {
188 fprintf(stderr, "\t[WEBP_testsuite] mm_util_webp_anim_enc_set_bgcolor failed : %d\n", ret);
192 ret = mm_util_webp_anim_enc_set_loop_count(webp_enc, g_loop_count);
193 if (ret != MM_UTIL_ERROR_NONE) {
194 fprintf(stderr, "\t[WEBP_testsuite] mm_util_webp_anim_enc_set_loop_count failed : %d\n", ret);
198 *webp_encode = webp_enc;
200 if (ret != MM_UTIL_ERROR_NONE)
201 mm_util_webp_anim_enc_destroy(webp_enc);
206 static gboolean __test_encode_to_file()
209 mm_util_webp_anim_enc_h anim_enc = NULL;
211 ret = __webp_encode_setup(&anim_enc);
212 if (ret != MM_UTIL_ERROR_NONE) {
213 fprintf(stderr, "\t[WEBP_testsuite] __webp_encode_setup failed : %d\n", ret);
217 g_queue_foreach(g_queue_images, __add_image, anim_enc);
219 ret = mm_util_webp_anim_enc_save_to_file(anim_enc, ENCODE_FILE_PATH);
220 if (ret != MM_UTIL_ERROR_NONE) {
221 fprintf(stderr, "\t[WEBP_testsuite] mm_util_encode_webp_to_file failed : %d\n", ret);
226 mm_util_webp_anim_enc_destroy(anim_enc);
228 return (ret == MM_UTIL_ERROR_NONE);
231 static gboolean __test_encode_to_buffer()
234 mm_util_webp_anim_enc_h anim_enc = NULL;
235 /* for encoding webp to memory */
236 void *encoded_data = NULL;
237 size_t encoded_size = 0;
239 ret = __webp_encode_setup(&anim_enc);
240 if (ret != MM_UTIL_ERROR_NONE) {
241 fprintf(stderr, "\t[WEBP_testsuite] __webp_encode_setup failed : %d\n", ret);
245 g_queue_foreach(g_queue_images, __add_image, anim_enc);
247 ret = mm_util_webp_anim_enc_save_to_buffer(anim_enc, &encoded_data, &encoded_size);
248 if (ret != MM_UTIL_ERROR_NONE) {
249 fprintf(stderr, "\t[WEBP_testsuite] mm_util_webp_anim_enc_save_to_buffer failed : %d\n", ret);
253 ret = mm_util_file_write(ENCODE_MEM_PATH, encoded_data, encoded_size);
254 if (ret != MM_UTIL_ERROR_NONE)
255 fprintf(stderr, "\t[WEBP_testsuite] mm_util_file_write failed : %d\n", ret);
258 mm_util_webp_anim_enc_destroy(anim_enc);
260 g_free(encoded_data);
262 return (ret == MM_UTIL_ERROR_NONE);
265 int main(int argc, char *argv[])
268 __print_help(argv[0]);
272 if (!__get_arguments(argc, argv)) {
273 fprintf(stderr, "\t[WEBP_testsuite] _get_arguments failed\n");
277 /* test encoding animation webp to file */
278 if (!__test_encode_to_file()) {
279 fprintf(stderr, "\t[WEBP_testsuite] __test_encode_to_file failed\n");
283 /* test encoding animation webp to buffer */
284 if (!__test_encode_to_buffer()) {
285 fprintf(stderr, "\t[WEBP_testsuite] __test_encode_to_buffer failed\n");
291 g_queue_free_full(g_queue_images, mm_image_destroy_image);
292 g_queue_free_full(g_queue_files, g_free);