[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [55570] trunk/blender/source/blender/ blenkernel/intern/movieclip.c: Better handing of frames below actual sequence range

Sergey Sharybin sergey.vfx at gmail.com
Mon Mar 25 16:32:11 CET 2013


Revision: 55570
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=55570
Author:   nazgul
Date:     2013-03-25 15:32:11 +0000 (Mon, 25 Mar 2013)
Log Message:
-----------
Better handing of frames below actual sequence range

When trying to load file below actual sequence range
(like trying to load file for scene frame 10 when clip's
start frame is 20) first frame from file sequence is used.

Before this change first file used to be loaded for every
scene frame below start frame, which polluted memory with
unwanted data.

Now first frame would be loaded only once in this case.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/movieclip.c

Modified: trunk/blender/source/blender/blenkernel/intern/movieclip.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/movieclip.c	2013-03-25 14:46:34 UTC (rev 55569)
+++ trunk/blender/source/blender/blenkernel/intern/movieclip.c	2013-03-25 15:32:11 UTC (rev 55570)
@@ -357,6 +357,8 @@
 		int proxy, filter;
 		short render_flag;
 	} stabilized;
+
+	int sequence_offset;
 } MovieClipCache;
 
 typedef struct MovieClipImBufCacheKey {
@@ -369,6 +371,32 @@
 	int framenr;
 } MovieClipCachePriorityData;
 
+static int user_frame_to_cache_frame(MovieClip *clip, int framenr)
+{
+	int index;
+
+	index = framenr - clip->start_frame + clip->frame_offset;
+
+	if (clip->source == MCLIP_SRC_SEQUENCE) {
+		if (clip->cache->sequence_offset == -1) {
+			unsigned short numlen;
+			char head[FILE_MAX], tail[FILE_MAX];
+
+			BLI_stringdec(clip->name, head, tail, &numlen);
+
+			/* see comment in get_sequence_fname */
+			clip->cache->sequence_offset = sequence_guess_offset(clip->name, strlen(head), numlen);
+		}
+
+		index += clip->cache->sequence_offset;
+	}
+
+	if (index < 0)
+		return framenr - index;
+
+	return framenr;
+}
+
 static void moviecache_keydata(void *userkey, int *framenr, int *proxy, int *render_flags)
 {
 	MovieClipImBufCacheKey *key = (MovieClipImBufCacheKey *)userkey;
@@ -440,7 +468,7 @@
 	if (clip->cache) {
 		MovieClipImBufCacheKey key;
 
-		key.framenr = user->framenr;
+		key.framenr = user_frame_to_cache_frame(clip, user->framenr);
 
 		if (flag & MCLIP_USE_PROXY) {
 			key.proxy = rendersize_to_proxy(user, flag);
@@ -462,7 +490,7 @@
 	if (clip->cache) {
 		MovieClipImBufCacheKey key;
 
-		key.framenr = user->framenr;
+		key.framenr = user_frame_to_cache_frame(clip, user->framenr);
 
 		if (flag & MCLIP_USE_PROXY) {
 			key.proxy = rendersize_to_proxy(user, flag);
@@ -498,9 +526,10 @@
 		                                     moviecache_prioritydeleter);
 
 		clip->cache->moviecache = moviecache;
+		clip->cache->sequence_offset = -1;
 	}
 
-	key.framenr = user->framenr;
+	key.framenr = user_frame_to_cache_frame(clip, user->framenr);
 
 	if (flag & MCLIP_USE_PROXY) {
 		key.proxy = rendersize_to_proxy(user, flag);




More information about the Bf-blender-cvs mailing list