changeset 8665:8b572238f63e

sig11 (in free() in uninit) fixed patch by Joey Parrish <joey@nicewarrior.org>
author arpi
date Mon, 30 Dec 2002 22:24:20 +0000
parents cfbf03d2bce1
children 809adad85bbc
files libvo/vo_gif89a.c
diffstat 1 files changed, 23 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/libvo/vo_gif89a.c	Mon Dec 30 21:35:46 2002 +0000
+++ b/libvo/vo_gif89a.c	Mon Dec 30 22:24:20 2002 +0000
@@ -58,7 +58,7 @@
 #include "../postproc/rgb2rgb.h"
 
 #define MPLAYER_VERSION 0.90
-#define VO_GIF_REVISION 3
+#define VO_GIF_REVISION 4
 
 static vo_info_t info = {
 	"animated GIF output",
@@ -94,7 +94,9 @@
 static uint32_t img_width;
 static uint32_t img_height;
 // image data for slice rendering
-static uint8_t *img_data = NULL;
+static uint8_t *slice_data = NULL;
+// pointer for whole frame rendering
+static uint8_t *frame_data = NULL;
 // reduced image data for flip_page
 static uint8_t *reduce_data = NULL;
 // reduced color map for flip_page
@@ -191,7 +193,7 @@
 			printf("GIF89a: Reconfigure attempted.\n");
 		return 0;
 	}
-	// but it need not be a fatal error, so return 0.
+	// reconfigure need not be a fatal error, so return 0.
 	// multiple configs without uninit will result in two
 	// movies concatenated in one gif file.  the output
 	// gif will have the dimensions of the first movie.
@@ -200,8 +202,8 @@
 		case IMGFMT_RGB24: break;     
 		case IMGFMT_YV12:
 			yuv2rgb_init(24, MODE_BGR);
-			img_data = malloc(img_width * img_height * 3);
-			if (img_data == NULL) {
+			slice_data = malloc(img_width * img_height * 3);
+			if (slice_data == NULL) {
 				printf("GIF89a: malloc failed.\n");
 				return 1;
 			}
@@ -293,11 +295,22 @@
 	char CB[4]; // control block
 	int delay = 0;
 	int ret;
+	uint8_t *img_data;
 
 	cycle_pos++;
 	if (cycle_pos < frame_cycle - frame_adj)
 		return; // we are skipping this frame
 
+	// slice_data is used for per slice rendering,
+	// and frame_data is used for per frame rendering.
+	// i seperated these two because slice_data is
+	// ram i allocate, and frame_data is not.
+	// using one pointer for both can lead to
+	// either segfault (freeing ram that i'm not supposed
+	// to) or memory leaks (not freeing any ram at all)
+	if (slice_data != NULL) img_data = slice_data;
+	else img_data = frame_data;
+	
 	// quantize the image
 	ret = gif_reduce(img_width, img_height, img_data, reduce_data, reduce_cmap->Colors);
 	if (ret == GIF_ERROR) {
@@ -329,17 +342,15 @@
 
 static uint32_t draw_frame(uint8_t *src[])
 {
-	img_data = src[0];
+	frame_data = src[0];
 	return 0;
 }
 
 static uint32_t draw_slice(uint8_t *src[], int stride[], int w, int h, int x, int y)
 {
 	uint8_t *dst;
-	
-	dst = img_data + (img_width * y + x) * 3;
+	dst = slice_data + (img_width * y + x) * 3;
 	yuv2rgb(dst, src[0], src[1], src[2], w, h, img_width * 3, stride[0], stride[1]);
-
 	return 0;
 }
 
@@ -379,17 +390,16 @@
 	
 	// free our allocated ram
 	if (gif_filename != NULL) free(gif_filename);
-	if (img_data != NULL) free(img_data);
+	if (slice_data != NULL) free(slice_data);
 	if (reduce_data != NULL) free(reduce_data);
 	if (reduce_cmap != NULL) FreeMapObject(reduce_cmap);
 	
 	// set the pointers back to null.
 	new_gif = NULL;
 	gif_filename = NULL;
-	img_data = NULL;
+	frame_data = NULL;
+	slice_data = NULL;
 	reduce_data = NULL;
 	reduce_cmap = NULL;
 }
 
-
-