[Bf-blender-cvs] [0095ac2] multiview: Fix unfreed memories issue

Dalai Felinto noreply at git.blender.org
Wed Sep 10 17:04:12 CEST 2014


Commit: 0095ac2186f7a9ec8ae11e55bb0a59ebf5b6b5e1
Author: Dalai Felinto
Date:   Wed Sep 10 16:59:09 2014 +0200
Branches: multiview
https://developer.blender.org/rB0095ac2186f7a9ec8ae11e55bb0a59ebf5b6b5e1

Fix unfreed memories issue

(the problem was that I was creating multiple ImBufs in the load functions, and was not deferring them)

===================================================================

M	source/blender/blenkernel/intern/image.c

===================================================================

diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index 96e6472..1f21ff5 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -3080,6 +3080,13 @@ static ImBuf *image_load_movie_file(Image *ima, ImageUser *iuser, int frame)
 	/* return the original requested ImBuf */
 	r_ibuf = ibuf[is_multiview ? (iuser ? iuser->multi_index : 0) : 0];
 
+	/* "remove" the others (decrease their refcount) */
+	for (i = 0; i < totviews; i++) {
+		if (ibuf[i] != r_ibuf) {
+			IMB_freeImBuf(ibuf[i]);
+		}
+	}
+
 	if (iuser)
 		iuser->ok = ima->ok;
 
@@ -3194,6 +3201,13 @@ static ImBuf *image_load_image_file(Image *ima, ImageUser *iuser, int cfra)
 	/* return the original requested ImBuf */
 	r_ibuf = ibuf[is_multiview ? (iuser ? iuser->multi_index : 0) : 0];
 
+	/* "remove" the others (decrease their refcount) */
+	for (i = 0; i < totviews; i++) {
+		if (ibuf[i] != r_ibuf) {
+			IMB_freeImBuf(ibuf[i]);
+		}
+	}
+
 	if (iuser)
 		iuser->ok = ima->ok;
 
@@ -3418,28 +3432,6 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **lock_
 	return ibuf;
 }
 
-static void image_get_frame_and_index(Image *ima, ImageUser *iuser, int *r_frame, int *r_index)
-{
-	int frame = 0, index = 0;
-
-	/* see if we already have an appropriate ibuf, with image source and type */
-	if (ima->source == IMA_SRC_MOVIE) {
-		frame = iuser ? iuser->framenr : ima->lastframe;
-	}
-	else if (ima->source == IMA_SRC_SEQUENCE) {
-		if (ima->type == IMA_TYPE_IMAGE) {
-			frame = iuser ? iuser->framenr : ima->lastframe;
-		}
-		else if (ima->type == IMA_TYPE_MULTILAYER) {
-			frame = iuser ? iuser->framenr : ima->lastframe;
-			index = iuser ? iuser->multi_index : IMA_NO_INDEX;
-		}
-	}
-
-	*r_frame = frame;
-	*r_index = index;
-}
-
 static size_t image_get_multiview_index(Image *ima, ImageUser *iuser)
 {
 	const bool is_multilayer = BKE_image_is_multilayer(ima);
@@ -3461,6 +3453,28 @@ static size_t image_get_multiview_index(Image *ima, ImageUser *iuser)
 	return IMA_NO_INDEX;
 }
 
+static void image_get_frame_and_index(Image *ima, ImageUser *iuser, int *r_frame, int *r_index)
+{
+	int frame = 0, index = 0;
+	index = image_get_multiview_index(ima, iuser);
+
+	/* see if we already have an appropriate ibuf, with image source and type */
+	if (ima->source == IMA_SRC_MOVIE) {
+		frame = iuser ? iuser->framenr : ima->lastframe;
+	}
+	else if (ima->source == IMA_SRC_SEQUENCE) {
+		if (ima->type == IMA_TYPE_IMAGE) {
+			frame = iuser ? iuser->framenr : ima->lastframe;
+		}
+		else if (ima->type == IMA_TYPE_MULTILAYER) {
+			frame = iuser ? iuser->framenr : ima->lastframe;
+		}
+	}
+
+	*r_frame = frame;
+	*r_index = index;
+}
+
 /* Get the ibuf from an image cache for a given image user.
  *
  * Returns referenced image buffer if it exists, callee is to




More information about the Bf-blender-cvs mailing list