4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Vineeth T M <vineeth.tm@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
27 #include <mm_util_gif.h>
28 #include <tzplatform_config.h>
30 #define ENCODE_RESULT_PATH tzplatform_mkpath(TZ_USER_CONTENT, "encode_test.gif")
31 #define ANIMATED_FRAME_MAX 100
33 static gboolean g_encode_mem = FALSE;
36 char file_name[PATH_MAX];
37 mm_util_gif_data decoded;
41 static int _write_file(const char *file_name, void *data, size_t data_size)
45 fprintf(stderr, "\tdata %s %p size:%zu\n", file_name, data, data_size);
47 if (!file_name || !data || data_size == 0) {
48 fprintf(stderr, "\tinvalid data %s %p size:%zu\n", file_name, data, data_size);
52 fprintf(stderr, "\tTry to open %s to write\n", file_name);
54 fp = fopen(file_name, "w");
56 fprintf(stderr, "\tfile open failed %d\n", errno);
60 fwrite(data, 1, data_size, fp);
64 fprintf(stderr, "\tfile [%s] write DONE\n", file_name);
69 static inline void flush_stdin()
72 while ((ch = getchar()) != EOF && ch != '\n') ;
75 int main(int argc, char *argv[])
78 int i = 0, nfiles = 0;
79 gif_test_data_s files[ANIMATED_FRAME_MAX];
82 fprintf(stderr, "\t[usage]\n");
83 fprintf(stderr, "\t\t1. decode : %s decode filepath\n", argv[0]);
84 fprintf(stderr, "\t\t2. encode-agif/encode-mem-agif : %s encode-agif dirpath\n", argv[0]);
88 if (!strcmp("decode", argv[1])) {
89 size_t nbytes = g_strlcpy(files[nfiles].file_name, argv[2], sizeof(files[nfiles].file_name));
90 if (nbytes != strlen(argv[2])) {
91 fprintf(stderr, "\tERROR is occurred %x\n", ret);
95 } else if (!strcmp("encode-agif", argv[1]) || !strcmp("encode-mem-agif", argv[1])) {
96 if (!strcmp("encode-mem-agif", argv[1]))
99 fprintf(stderr, "\tencode-agif %s\n", argv[1]);
100 struct dirent *dp = NULL;
101 DIR *fd = opendir(argv[2]);
104 fprintf(stderr, "\tlistdir: can't open %s\n", argv[2]);
108 while ((dp = readdir(fd)) != NULL) {
109 if (strlen(dp->d_name) == 0)
111 if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, ".."))
112 continue; /* skip self and parent */
113 size_t nbytes = g_snprintf(files[nfiles].file_name, sizeof(files[nfiles].file_name), "%s%s", argv[2], dp->d_name);
122 for (i = 0; i < nfiles; i++) {
123 for (j = 0; j < nfiles - 1; j++) {
124 if ((strlen(files[j].file_name) > strlen(files[j + 1].file_name)) ||
125 (strcmp(files[j].file_name, files[j + 1].file_name) > 0 && strlen(files[j].file_name) == strlen(files[j + 1].file_name))) {
126 memset(temp, 0, PATH_MAX);
127 g_strlcpy(temp, files[j].file_name, sizeof(temp));
128 g_strlcpy(files[j].file_name, files[j + 1].file_name, sizeof(files[j].file_name));
129 g_strlcpy(files[j + 1].file_name, temp, sizeof(files[j + 1].file_name));
134 fprintf(stderr, "\tunknown command [%s]\n", argv[1]);
138 fprintf(stderr, "\tnfiles: %d\n", nfiles);
140 for (i = 0; i < nfiles && i < ANIMATED_FRAME_MAX; i++) {
141 fprintf(stderr, "\tdecode %s\n", files[i].file_name);
142 ret = mm_util_decode_from_gif_file(&files[i].decoded, files[i].file_name);
143 if (ret != MM_UTIL_ERROR_NONE) {
144 fprintf(stderr, "\tERROR is occurred %x to decode %s\n", ret, files[i].file_name);
149 mm_gif_file_h gif_file = NULL;
150 mm_gif_image_h gif_image = NULL;
151 unsigned char *encoded_gif_mem = NULL;
152 unsigned long encoded_gif_size = 0;
154 ret = mm_util_gif_encode_create(&gif_file);
155 fprintf(stderr, "\t mm_util_gif_enc_create [%d]\n", ret);
157 ret = mm_util_gif_encode_set_mem(gif_file, (void **)&encoded_gif_mem, &encoded_gif_size);
158 fprintf(stderr, "\t mm_util_gif_encode_set_mem [%d]\n", ret);
160 ret = mm_util_gif_encode_set_file(gif_file, ENCODE_RESULT_PATH);
161 fprintf(stderr, "\t mm_util_gif_enc_set_file [%d]\n", ret);
164 ret = mm_util_gif_encode_set_repeat(gif_file, FALSE, 0);
165 fprintf(stderr, "\t mm_util_gif_encode_set_repeat [%d]\n", ret);
167 ret = mm_util_gif_encode_set_resolution(gif_file, files[0].decoded.width, files[0].decoded.height);
168 fprintf(stderr, "\t mm_util_gif_enc_set_resolution [%d]\n", ret);
170 for (i = 0; i < nfiles; i++) {
171 if (files[i].decoded.data) {
172 ret = mm_util_gif_image_create(gif_file, &gif_image);
173 fprintf(stderr, "\t mm_util_gif_image_create [%d]\n", ret);
175 ret = mm_util_gif_image_set_image(gif_image, files[i].decoded.data);
176 fprintf(stderr, "\t mm_util_gif_image_set_image [%d]\n", ret);
178 ret = mm_util_gif_image_set_delay_time(gif_image, 20);
179 fprintf(stderr, "\t mm_util_gif_image_set_delay_time [%d]\n", ret);
181 ret = mm_util_gif_image_set_position(gif_image, 0, 0, files[i].decoded.width, files[i].decoded.height);
182 fprintf(stderr, "\t mm_util_gif_image_set_position [%d]\n", ret);
184 ret = mm_util_gif_image_set_disposal_mode(gif_image, MM_UTIL_GIF_DISPOSAL_UNSPECIFIED);
185 fprintf(stderr, "\t mm_util_gif_image_set_disposal_mode [%d]\n", ret);
187 ret = mm_util_gif_encode_add_image(gif_file, gif_image);
188 fprintf(stderr, "\t mm_util_gif_enc_add_image [%d]\n", ret);
190 mm_util_gif_image_destory(gif_image);
191 free(files[i].decoded.data);
195 ret = mm_util_gif_encode_save(gif_file);
196 fprintf(stderr, "\t mm_util_gif_enc_save [%d]\n", ret);
198 _write_file(ENCODE_RESULT_PATH, (void *)encoded_gif_mem, (size_t)encoded_gif_size);
199 mm_util_gif_encode_destroy(gif_file);