#include <stdlib.h>
#include <string.h>
#include <errno.h>
+#include <limits.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <mm_util_gif.h>
-#define DECODE_RESULT_PATH "/media/decode_test."
-#define TRUE 1
-#define FALSE 0
-#define BUFFER_SIZE 128
+#define ENCODED_FILEPATH "/opt/usr/home/owner/media/mm_util_test.gif"
+#define ANIMATED_FRAME_MAX 100
+
+#ifdef GIF_ENCODER_V2
+static gboolean g_encode_mem = FALSE;
+#endif
+
+typedef struct {
+ char file_name[PATH_MAX];
+ mm_util_gif_data decoded;
+} gif_test_data_s;
+
+#ifdef GIF_ENCODER_V2
+static int _write_file(const char *file_name, void *data, size_t data_size)
+{
+ FILE *fp = NULL;
+
+ fprintf(stderr, "\tdata %s %p size:%u\n", file_name, data, data_size);
+
+ if (!file_name || !data || data_size == 0) {
+ fprintf(stderr, "\tinvalid data %s %p size:%u\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;
+}
+#endif
static inline void flush_stdin()
{
int main(int argc, char *argv[])
{
int ret = 0;
- mm_util_gif_data decoded;
+ int i = 0, nfiles = 0;
+ gif_test_data_s files[ANIMATED_FRAME_MAX];
if (argc < 2) {
fprintf(stderr, "\t[usage]\n");
- fprintf(stderr, "\t\t1. decode : mm_util_gif_testsuite decode filepath.gif\n");
+ fprintf(stderr, "\t\t1. decode : %s decode filepath\n", argv[0]);
+#ifdef GIF_ENCODER_V2
+ fprintf(stderr, "\t\t2. encode-agif/encode-mem-agif : %s encode-agif dirpath\n", argv[0]);
+#endif
return 0;
}
if (!strcmp("decode", argv[1])) {
- ret = mm_util_decode_from_gif_file(&decoded, argv[2]);
- } else {
+ size_t nbytes = g_strlcpy(files[nfiles].file_name, argv[2], sizeof(files[nfiles].file_name));
+ if (nbytes != strlen(argv[2])) {
+ fprintf(stderr, "\tERROR is occurred %x\n", ret);
+ return 0;
+ }
+ nfiles++;
+ }
+#ifdef GIF_ENCODER_V2
+ else if (!strcmp("encode-agif", argv[1]) || !strcmp("encode-mem-agif", argv[1])) {
+ if (!strcmp("encode-mem-agif", argv[1])) {
+ g_encode_mem = TRUE;
+ }
+ fprintf(stderr, "\tencode-agif %s\n", argv[1]);
+ struct dirent *dp = NULL;
+ DIR *fd = opendir(argv[2]);
+ int j = 0;
+ if (fd == NULL) {
+ fprintf(stderr, "\tlistdir: can't open %s\n", argv[2]);
+ return 0;
+ }
+
+ 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(files[nfiles].file_name, sizeof(files[nfiles].file_name), "%s%s", argv[2], dp->d_name);
+ if (nbytes == 0)
+ continue;
+ nfiles++;
+ }
+ closedir(fd);
+
+ /* sort file name */
+ char temp[PATH_MAX];
+ for (i = 0; i < nfiles; i++) {
+ for (j = 0; j < nfiles - 1; j++) {
+ if ((strlen(files[j].file_name) > strlen(files[j + 1].file_name)) ||
+ (strcmp(files[j].file_name, files[j + 1].file_name) > 0 && strlen(files[j].file_name) == strlen(files[j + 1].file_name))) {
+ memset(temp, 0, PATH_MAX);
+ g_strlcpy(temp, files[j].file_name, sizeof(temp));
+ g_strlcpy(files[j].file_name, files[j + 1].file_name, sizeof(files[j].file_name));
+ g_strlcpy(files[j + 1].file_name, temp, sizeof(files[j + 1].file_name));
+ }
+ }
+ }
+ }
+#endif
+ else {
fprintf(stderr, "\tunknown command [%s]\n", argv[1]);
return 0;
}
- if (ret != MM_UTIL_ERROR_NONE) {
- fprintf(stderr, "\tERROR is occurred %x\n", ret);
- } else {
- fprintf(stderr, "\tGIF OPERATION SUCCESS\n");
- {
- if (decoded.frames) {
- fprintf(stderr, "\t##Decoded data##: %p\t width: %lu\t height:%lu\t size: %llu\n", decoded.frames[0], decoded.width, decoded.height, decoded.size);
- char filename[BUFFER_SIZE] = { 0, };
- memset(filename, 0, BUFFER_SIZE);
- {
- snprintf(filename, BUFFER_SIZE, "%s%s", DECODE_RESULT_PATH, "gif");
- }
- mm_util_gif_encode_set_image_count(&decoded, 1);
- ret = mm_util_encode_open_gif_file(&decoded, filename);
- ret = mm_util_encode_gif(&decoded);
- ret = mm_util_encode_close_gif(&decoded);
-
- free(decoded.frames[0]->data);
- free(decoded.frames);
- } else {
- fprintf(stderr, "\tDECODED data is NULL\n");
+ fprintf(stderr, "\tnfiles: %d\n", nfiles);
+
+ for (i = 0; i < nfiles && i < ANIMATED_FRAME_MAX; i++) {
+ fprintf(stderr, "\tdecode %s\n", files[i].file_name);
+ ret = mm_util_decode_from_gif_file(&files[i].decoded, files[i].file_name);
+ if (ret != MM_UTIL_ERROR_NONE) {
+ fprintf(stderr, "\tERROR is occurred %x to decode %s\n", ret, files[i].file_name);
+ continue;
+ }
+ }
+
+#ifdef GIF_ENCODER_V2
+ mm_gif_file_h gif_file = NULL;
+ mm_gif_image_h gif_image = NULL;
+ unsigned char *encoded_gif_mem = NULL;
+ unsigned long encoded_gif_size = 0;
+
+ ret = mm_util_gif_encode_create(&gif_file);
+ fprintf(stderr, "\t mm_util_gif_enc_create [%d]\n", ret);
+ if (g_encode_mem) {
+ ret = mm_util_gif_encode_set_mem(gif_file, (void **)&encoded_gif_mem, &encoded_gif_size);
+ fprintf(stderr, "\t mm_util_gif_encode_set_mem [%d]\n", ret);
+ }
+ else {
+ ret = mm_util_gif_encode_set_file(gif_file, ENCODED_FILEPATH);
+ fprintf(stderr, "\t mm_util_gif_enc_set_file [%d]\n", ret);
+ }
+
+ ret = mm_util_gif_encode_set_repeat(gif_file, FALSE, 0);
+ fprintf(stderr, "\t mm_util_gif_encode_set_repeat [%d]\n", ret);
+
+ ret = mm_util_gif_encode_set_resolution(gif_file, files[0].decoded.width, files[0].decoded.height);
+ fprintf(stderr, "\t mm_util_gif_enc_set_resolution [%d]\n", ret);
+ /* repeat */
+ for (i = 0; i < nfiles; i++) {
+ if (files[i].decoded.frames) {
+ ret = mm_util_gif_image_create(gif_file, &gif_image);
+ fprintf(stderr, "\t mm_util_gif_image_create [%d]\n", ret);
+ ret = mm_util_gif_image_set_image(gif_image, files[i].decoded.frames[0]->data, files[i].decoded.size);
+ fprintf(stderr, "\t mm_util_gif_image_set_image [%d]\n", ret);
+ ret = mm_util_gif_image_set_delay_time(gif_image, 20);
+ fprintf(stderr, "\t mm_util_gif_image_set_delay_time [%d]\n", ret);
+ ret = mm_util_gif_image_set_position(gif_image,0, 0,files[i].decoded.width, files[i].decoded.height);
+ fprintf(stderr, "\t mm_util_gif_image_set_position [%d]\n", ret);
+ ret = mm_util_gif_image_set_disposal_mode(gif_image, MM_UTIL_GIF_DISPOSAL_UNSPECIFIED);
+ fprintf(stderr, "\t mm_util_gif_image_set_disposal_mode [%d]\n", ret);
+#if 0 /* for advanced */
+ if (files[i].decoded.frames[0]->is_transparent) {
+ mm_util_gif_color_s tp_color;
+ tp_color.red = files[i].decoded.frames[0]->transparent_color.Red;
+ tp_color.green = files[i].decoded.frames[0]->transparent_color.Green;
+ tp_color.blue = files[i].decoded.frames[0]->transparent_color.Blue;
+ ret = mm_util_gif_image_set_tp_color(gif_image, tp_color);
+ fprintf(stderr, "\t mm_util_gif_image_set_tp_color [%d]\n", ret);
}
+#endif
+ ret = mm_util_gif_encode_add_image(gif_file, gif_image);
+ fprintf(stderr, "\t mm_util_gif_enc_add_image [%d]\n", ret);
+ mm_util_gif_image_destory(gif_image);
+
+ free(files[i].decoded.frames[0]->data);
+ free(files[i].decoded.frames);
}
}
+ /* repeat */
+ ret = mm_util_gif_encode_save(gif_file);
+ fprintf(stderr, "\t mm_util_gif_enc_save [%d]\n", ret);
+ if (g_encode_mem)
+ _write_file(ENCODED_FILEPATH, (void *)encoded_gif_mem, (size_t)encoded_gif_size);
+ mm_util_gif_encode_destroy(gif_file);
+#else
+ if (files[0].decoded.frames) {
+ fprintf(stderr, "\t##Decoded data##: %p\t width: %lu\t height:%lu\t size: %llu\n", files[0].decoded.frames[0], files[0].decoded.width, files[0].decoded.height, files[0].decoded.size);
+ files[0].decoded.image_count = 1;
+ ret = mm_util_encode_open_gif_file(&files[0].decoded, ENCODED_FILEPATH);
+ ret = mm_util_encode_gif(&files[0].decoded);
+ ret = mm_util_encode_close_gif(&files[0].decoded);
+
+ free(files[0].decoded.frames[0]->data);
+ free(files[0].decoded.frames);
+ } else {
+ fprintf(stderr, "\tDECODED data is NULL\n");
+ }
+#endif
return 0;
}