return MM_UTIL_ERROR_NONE;
}
-int __gif_make_color_map(gif_image_s *gif_image)
+int __gif_make_color_map(gif_image_s *gif_image, GifByteType **intermediate_image, unsigned long *intermediate_image_size)
{
int ret = MM_UTIL_ERROR_NONE;
int colormap_size = DEFAULT_COLORMAP_SIZE;
}
/* allocate output buffer */
- gif_image->intermediate_image = (GifByteType *) calloc(1, num_of_pixels * sizeof(GifByteType));
- if (gif_image->intermediate_image == NULL) {
+ *intermediate_image = (GifByteType *) calloc(1, num_of_pixels * sizeof(GifByteType));
+ if (*intermediate_image == NULL) {
mm_util_error("Memory allocation failed");
ret = MM_UTIL_ERROR_INVALID_OPERATION;
goto FAIL;
}
- gif_image->intermediate_image_size = num_of_pixels * sizeof(GifByteType);
+ *intermediate_image_size = num_of_pixels * sizeof(GifByteType);
- if (GifQuantizeBuffer(gif_image->image_desc.Width, gif_image->image_desc.Height, &colormap_size, red, green, blue, gif_image->intermediate_image, gif_image->image_desc.ColorMap->Colors) == GIF_ERROR) {
+ if (GifQuantizeBuffer(gif_image->image_desc.Width, gif_image->image_desc.Height, &colormap_size, red, green, blue, *intermediate_image, gif_image->image_desc.ColorMap->Colors) == GIF_ERROR) {
mm_util_error("could not quantize buffer");
ret = MM_UTIL_ERROR_INVALID_OPERATION;
goto FAIL;
goto SUCCESS;
FAIL:
- if (gif_image->intermediate_image)
- MMUTIL_SAFE_FREE(gif_image->intermediate_image);
+ if (*intermediate_image)
+ MMUTIL_SAFE_FREE(*intermediate_image);
- gif_image->intermediate_image_size = 0;
+ *intermediate_image_size = 0;
COLORMAP_FREE(gif_image->image_desc.ColorMap);
SUCCESS:
RGB_FREE(red, green, blue);
return MM_UTIL_ERROR_NONE;
}
-int _gif_image_write_image_desc(gif_file_s *gif_file, gif_image_s *gif_image)
+int _gif_image_write_image(gif_file_s *gif_file, gif_image_s *gif_image)
{
+ int ret = MM_UTIL_ERROR_NONE;
+
+ GifByteType *intermediate_image = NULL;
+ unsigned long intermediate_image_size = 0;
+ unsigned long idx = 0;
+
mm_util_retvm_if(gif_image == NULL, MM_UTIL_ERROR_INVALID_PARAMETER, "Invalid parameter");
mm_util_retvm_if(gif_image->image_data == NULL, MM_UTIL_ERROR_INVALID_PARAMETER, "Invalid parameter");
+ /* Make local color map */
+ ret = __gif_make_color_map(gif_image, &intermediate_image, &intermediate_image_size);
+ mm_util_retvm_if(ret != MM_UTIL_ERROR_NONE, ret, "__gif_make_color_map failed");
+
if (EGifPutImageDesc(gif_file->GifFile, gif_image->image_desc.Left, gif_image->image_desc.Top,
gif_image->image_desc.Width, gif_image->image_desc.Height, gif_image->image_desc.Interlace,
gif_image->image_desc.ColorMap) == GIF_ERROR) {
mm_util_error("EGifPutImageDesc failed due to %s", GifErrorString(gif_file->GifFile->Error));
+ MMUTIL_SAFE_FREE(intermediate_image);
return MM_UTIL_ERROR_INVALID_OPERATION;
}
- return MM_UTIL_ERROR_NONE;
-}
+ mm_util_debug("put pixel count: %lu", (intermediate_image_size / sizeof(GifPixelType)));
-int _gif_image_write_image_data(gif_file_s *gif_file, gif_image_s *gif_image)
-{
- unsigned long idx = 0;
- mm_util_retvm_if(gif_image == NULL, MM_UTIL_ERROR_INVALID_PARAMETER, "Invalid parameter");
- mm_util_retvm_if(gif_image->image_data == NULL, MM_UTIL_ERROR_INVALID_PARAMETER, "Invalid parameter");
-
- /* encode OutputBuffer to GifFile */
- mm_util_retvm_if(gif_image->intermediate_image == NULL, MM_UTIL_ERROR_INVALID_OPERATION, "Intermediate_image is null");
-
- mm_util_debug("put pixel count: %lu", (gif_image->intermediate_image_size / sizeof(GifPixelType)));
-
- for (idx = 0; idx < (gif_image->intermediate_image_size / sizeof(GifPixelType)); idx++) {
- GifPixelType pixel = (GifPixelType)gif_image->intermediate_image[idx];
+ for (idx = 0; idx < (intermediate_image_size / sizeof(GifPixelType)); idx++) {
+ GifPixelType pixel = (GifPixelType)intermediate_image[idx];
if (EGifPutPixel(gif_file->GifFile, pixel) == GIF_ERROR) {
mm_util_error("could not put pixel");
return MM_UTIL_ERROR_INVALID_OPERATION;
}
}
+ /* release intermediate_image */
+ MMUTIL_SAFE_FREE(intermediate_image);
+
return MM_UTIL_ERROR_NONE;
}
MMUTIL_SAFE_FREE(gif_image->ext_blocks);
}
- /* release intermediate_image */
- MMUTIL_SAFE_FREE(gif_image->intermediate_image);
MMUTIL_SAFE_FREE(gif_image);
}
mm_util_retvm_if(ret != MM_UTIL_ERROR_NONE, ret, "mm_util_gif_encode_start failed");
}
- /* Make local color map */
- ret = __gif_make_color_map(gif_image);
- mm_util_retvm_if(ret != MM_UTIL_ERROR_NONE, ret, "__gif_make_color_map failed");
-
/* Write extension blocks */
ret = _gif_image_write_ext_blocks(gif_file, gif_image);
mm_util_retvm_if(ret != MM_UTIL_ERROR_NONE, ret, "_gif_image_write_ext_blocks failed");
/* Write image description */
- ret = _gif_image_write_image_desc(gif_file, gif_image);
+ ret = _gif_image_write_image(gif_file, gif_image);
mm_util_retvm_if(ret != MM_UTIL_ERROR_NONE, ret, "_gif_image_write_image_desc failed");
- /* Write image data */
- ret = _gif_image_write_image_data(gif_file, gif_image);
- mm_util_retvm_if(ret != MM_UTIL_ERROR_NONE, ret, "_gif_image_write_image_data failed");
-
gif_file->GifFile->ImageCount++;
return MM_UTIL_ERROR_NONE;