[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12177] trunk/blender/source/blender: == Sequencer ==

Peter Schlaile peter at schlaile.de
Mon Oct 1 10:03:11 CEST 2007


Revision: 12177
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12177
Author:   schlaile
Date:     2007-10-01 10:03:11 +0200 (Mon, 01 Oct 2007)

Log Message:
-----------
== Sequencer ==

This patch adds prefetch buffering to the sequencer
(see the tracker for additional details:

https://projects.blender.org/tracker/?func=detail&aid=7307&group_id=9&atid=127
)

We create seperate render threads (currently one, because of the fact,
that sequence rendering modifies global structures...), that
render up to the defined userpref value "Prefetch frames" in advance.
(Pressing Alt-A will _first_ fill the buffer and then start playing.)

Bassam and I did some extensive testing, so it should work.

If you don't configure your number of prefetch frames, prefetching is disabled!
(Sane defaults... :)

Also: if the machine is definitely too slow and runs out of the prefetch
area, prefetching is disabled automatically and we are back to good old
frame skipping mode.

My Dual Athlon is able to handle 4 parallel DV streams at once (sometimes
a little bit choppy, but prefetching is never disabled!)

I fixed also a long standing bug in the audio code, that made playback run
backwards at the beginning...

Modified Paths:
--------------
    trunk/blender/source/blender/include/BIF_drawseq.h
    trunk/blender/source/blender/include/BIF_space.h
    trunk/blender/source/blender/include/BIF_spacetypes.h
    trunk/blender/source/blender/include/BSE_sequence.h
    trunk/blender/source/blender/makesdna/DNA_userdef_types.h
    trunk/blender/source/blender/src/drawseq.c
    trunk/blender/source/blender/src/drawview.c
    trunk/blender/source/blender/src/editscreen.c
    trunk/blender/source/blender/src/header_seq.c
    trunk/blender/source/blender/src/seqaudio.c
    trunk/blender/source/blender/src/sequence.c
    trunk/blender/source/blender/src/space.c
    trunk/blender/source/blender/src/spacetypes.c

Modified: trunk/blender/source/blender/include/BIF_drawseq.h
===================================================================
--- trunk/blender/source/blender/include/BIF_drawseq.h	2007-10-01 07:10:50 UTC (rev 12176)
+++ trunk/blender/source/blender/include/BIF_drawseq.h	2007-10-01 08:03:11 UTC (rev 12177)
@@ -36,6 +36,7 @@
 struct ScrArea;
 struct Sequence;
 
+void drawprefetchseqspace(struct ScrArea *sa, void *spacedata);
 void drawseqspace(struct ScrArea *sa, void *spacedata);
 void set_special_seq_update(int val);
 

Modified: trunk/blender/source/blender/include/BIF_space.h
===================================================================
--- trunk/blender/source/blender/include/BIF_space.h	2007-10-01 07:10:50 UTC (rev 12176)
+++ trunk/blender/source/blender/include/BIF_space.h	2007-10-01 08:03:11 UTC (rev 12177)
@@ -94,6 +94,7 @@
 #define B_RECALCLIGHT 	3310
 
 
+void	scrarea_do_winprefetchdraw	(struct ScrArea *sa);
 void	scrarea_do_windraw		(struct ScrArea *sa);
 void	scrarea_do_winchange	(struct ScrArea *sa);
 void	scrarea_do_winhandle	(struct ScrArea *sa, struct BWinEvent *evt);

Modified: trunk/blender/source/blender/include/BIF_spacetypes.h
===================================================================
--- trunk/blender/source/blender/include/BIF_spacetypes.h	2007-10-01 07:10:50 UTC (rev 12176)
+++ trunk/blender/source/blender/include/BIF_spacetypes.h	2007-10-01 08:03:11 UTC (rev 12177)
@@ -35,6 +35,7 @@
 
 typedef struct _SpaceType	SpaceType;
 
+typedef	void	(*SpacePrefetchDrawFP)	(struct ScrArea *sa, void *spacedata);
 typedef	void	(*SpaceDrawFP)		(struct ScrArea *sa, void *spacedata);
 typedef	void	(*SpaceChangeFP)	(struct ScrArea *sa, void *spacedata);
 typedef	void	(*SpaceHandleFP)	(struct ScrArea *sa, void *spacedata, struct BWinEvent *evt);
@@ -43,7 +44,7 @@
 
 SpaceType*	spacetype_new			(char *name);
 
-void		spacetype_set_winfuncs	(SpaceType *st, SpaceDrawFP draw, SpaceChangeFP change, SpaceHandleFP handle);
+void		spacetype_set_winfuncs	(SpaceType *st, SpacePrefetchDrawFP prefetch, SpaceDrawFP draw, SpaceChangeFP change, SpaceHandleFP handle);
 
 	/***/
 

Modified: trunk/blender/source/blender/include/BSE_sequence.h
===================================================================
--- trunk/blender/source/blender/include/BSE_sequence.h	2007-10-01 07:10:50 UTC (rev 12176)
+++ trunk/blender/source/blender/include/BSE_sequence.h	2007-10-01 08:03:11 UTC (rev 12177)
@@ -60,6 +60,15 @@
 struct ImBuf *give_ibuf_seq(int rectx, int recty, int cfra, int chansel); 
 /* chansel: render this channel. Default=0 (renders end result)*/
 
+/* sequence prefetch API */
+void seq_start_threads();
+void seq_stop_threads();
+void give_ibuf_prefetch_request(int rectx, int recty, int cfra, int chanshown);
+void seq_wait_for_prefetch_ready();
+struct ImBuf * give_ibuf_threaded(int rectx, int recty, int cfra, 
+				  int chanshown);
+
+
 void free_imbuf_seq_except(int cfra);
 void free_imbuf_seq_with_ipo(struct Ipo * ipo);
 void free_imbuf_seq(void);

Modified: trunk/blender/source/blender/makesdna/DNA_userdef_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_userdef_types.h	2007-10-01 07:10:50 UTC (rev 12176)
+++ trunk/blender/source/blender/makesdna/DNA_userdef_types.h	2007-10-01 08:03:11 UTC (rev 12177)
@@ -171,6 +171,7 @@
 	short tw_hotspot, tw_flag, tw_handlesize, tw_size;
 	int textimeout, texcollectrate;
 	int memcachelimit;
+	int prefetchframes;
 	short frameserverport;
 	short pad_rot_angle;	/*control the rotation step of the view when PAD2,PAD4,PAD6&PAD8 is use*/
 	short obcenter_dia;
@@ -181,7 +182,6 @@
 	short recent_files;		/* maximum number of recently used files to remember  */
 	short smooth_viewtx;	/* miliseconds to spend spinning the view */
 	short glreslimit;
-	char pad[4];
 } UserDef;
 
 extern UserDef U; /* from usiblender.c !!!! */

Modified: trunk/blender/source/blender/src/drawseq.c
===================================================================
--- trunk/blender/source/blender/src/drawseq.c	2007-10-01 07:10:50 UTC (rev 12176)
+++ trunk/blender/source/blender/src/drawseq.c	2007-10-01 08:03:11 UTC (rev 12177)
@@ -51,6 +51,7 @@
 #include "DNA_screen_types.h"
 #include "DNA_space_types.h"
 #include "DNA_view2d_types.h"
+#include "DNA_userdef_types.h"
 
 #include "BKE_global.h"
 #include "BKE_plugin_types.h"
@@ -788,7 +789,11 @@
 		return;
 	else {
 		recursive= 1;
-		ibuf= (ImBuf *)give_ibuf_seq(rectx, recty, (G.scene->r.cfra), sseq->chanshown);
+		if (!U.prefetchframes || (G.f & G_PLAYANIM) == 0) {
+			ibuf= (ImBuf *)give_ibuf_seq(rectx, recty, (G.scene->r.cfra), sseq->chanshown);
+		} else {
+			ibuf= (ImBuf *)give_ibuf_threaded(rectx, recty, (G.scene->r.cfra), sseq->chanshown);
+		}
 		recursive= 0;
 		
 		/* HURMF! the give_ibuf_seq can call image display in this window */
@@ -1276,6 +1281,20 @@
 
 }
 
+void drawprefetchseqspace(ScrArea *sa, void *spacedata)
+{
+	SpaceSeq *sseq= sa->spacedata.first;
+	int rectx, recty;
+
+	rectx= (G.scene->r.size*G.scene->r.xsch)/100;
+	recty= (G.scene->r.size*G.scene->r.ysch)/100;
+
+	if(sseq->mainb) {
+		give_ibuf_prefetch_request(
+			rectx, recty, (G.scene->r.cfra), sseq->chanshown);
+	}
+}
+
 void drawseqspace(ScrArea *sa, void *spacedata)
 {
 	SpaceSeq *sseq= sa->spacedata.first;

Modified: trunk/blender/source/blender/src/drawview.c
===================================================================
--- trunk/blender/source/blender/src/drawview.c	2007-10-01 07:10:50 UTC (rev 12176)
+++ trunk/blender/source/blender/src/drawview.c	2007-10-01 08:03:11 UTC (rev 12177)
@@ -136,6 +136,7 @@
 #include "BSE_filesel.h"
 #include "BSE_headerbuttons.h"
 #include "BSE_seqaudio.h"
+#include "BSE_sequence.h"
 #include "BSE_trans_types.h"
 #include "BSE_time.h"
 #include "BSE_view.h"
@@ -3172,13 +3173,20 @@
 
 
 double tottime = 0.0;
+static ScrArea *oldsa;
+static double swaptime;
+static int curmode;
 
 int update_time(void)
 {
 	static double ltime;
 	double time;
 
-	if ((U.mixbufsize)&&(audiostream_pos() != CFRA)&&(G.scene->audio.flag & AUDIO_SYNC)) return 0;
+	if ((U.mixbufsize)
+	    && (audiostream_pos() != CFRA)
+	    && (G.scene->audio.flag & AUDIO_SYNC)) {
+		return 0;
+	}
 
 	time = PIL_check_seconds_timer();
 	
@@ -3187,12 +3195,71 @@
 	return (tottime < 0.0);
 }
 
+static void inner_play_prefetch_frame(int mode, int cfra)
+{
+	ScrArea *sa;
+	int oldcfra = CFRA;
+	ScrArea *oldcurarea = curarea;
+
+	if (!U.prefetchframes) {
+		return;
+	}
+
+	CFRA = cfra;
+
+	sa= G.curscreen->areabase.first;
+	while(sa) {
+		if(sa==oldsa) {
+			scrarea_do_winprefetchdraw(sa);
+		}
+		else if(mode & 1) { /* all view3d and seq spaces */
+			if ELEM(sa->spacetype, SPACE_VIEW3D, SPACE_SEQ) {
+				scrarea_do_winprefetchdraw(sa);
+			}
+		}
+		else if(mode & 4) { /* all seq spaces */
+			if (sa->spacetype == SPACE_SEQ) {
+				scrarea_do_winprefetchdraw(sa);
+			}
+		}		
+		
+		sa= sa->next;	
+	}
+
+	CFRA = oldcfra;
+	curarea = oldcurarea;
+}
+
+static void inner_play_prefetch_startup(int mode)
+{
+	int i;
+
+	if (!U.prefetchframes) {
+		return;
+	}
+
+	seq_start_threads();
+
+	for (i = 0; i <= U.prefetchframes; i++) {
+		int cfra = CFRA + i;
+		inner_play_prefetch_frame(mode, cfra);
+	}
+
+	seq_wait_for_prefetch_ready();
+}
+
+static void inner_play_prefetch_shutdown(int mode)
+{
+	if (!U.prefetchframes) {
+		return;
+	}
+	seq_stop_threads();
+}
+
 void inner_play_anim_loop(int init, int mode)
 {
 	ScrArea *sa;
-	static ScrArea *oldsa;
-	static double swaptime;
-	static int curmode;
+	static int last_cfra = -1;
 
 	/* init */
 	if(init) {
@@ -3200,47 +3267,97 @@
 		swaptime= 1.0/(float)G.scene->r.frs_sec;
 		tottime= 0.0;
 		curmode= mode;
+		last_cfra = -1;
 
 		return;
 	}
 
-	set_timecursor(CFRA);
+	if (CFRA != last_cfra) {
+		int pf;
+		set_timecursor(CFRA);
 	
-	update_for_newframe_nodraw(1);	/* adds no events in UI */
+		update_for_newframe_nodraw(1);	/* adds no events in UI */
 
-	sa= G.curscreen->areabase.first;
-	while(sa) {
-		if(sa==oldsa) {
-			scrarea_do_windraw(sa);
-		}
-		else if(curmode & 1) { /* all view3d and seq spaces */
-			if ELEM(sa->spacetype, SPACE_VIEW3D, SPACE_SEQ) {
+		sa= G.curscreen->areabase.first;
+		while(sa) {
+			if(sa==oldsa) {
 				scrarea_do_windraw(sa);
 			}
+			else if(curmode & 1) { /* all view3d and seq spaces */
+				if ELEM(sa->spacetype, SPACE_VIEW3D, SPACE_SEQ) {
+					scrarea_do_windraw(sa);
+				}
+			}
+			else if(curmode & 4) { /* all seq spaces */
+				if (sa->spacetype == SPACE_SEQ) {
+					scrarea_do_windraw(sa);
+				}
+			}		
+		
+			sa= sa->next;	
 		}
-		else if(curmode & 4) { /* all seq spaces */
-			if (sa->spacetype == SPACE_SEQ) {
-				scrarea_do_windraw(sa);
+
+		if (last_cfra == -1) {
+			last_cfra = CFRA - 1;
+		}
+		
+		if (U.prefetchframes) {
+			pf = last_cfra;
+
+			if (CFRA - last_cfra >= U.prefetchframes || 
+			    CFRA - last_cfra < 0) {
+				pf = CFRA - U.prefetchframes;
+				fprintf(stderr, 
+					"SEQ-THREAD: Lost sync, "
+					"stopping threads, "
+					"back to skip mode...\n");
+				seq_stop_threads();
+			} else {
+				while (pf < CFRA) {
+					int c;
+					pf++;
+					c = pf + U.prefetchframes;
+					if (c >= PEFRA) {
+						c -= PEFRA;
+						c += PSFRA;
+					}
+
+					inner_play_prefetch_frame(curmode, c);
+				}
 			}
-		}		
-		
-		sa= sa->next;	
+			
+		}
 	}
-	
+
+	last_cfra = CFRA;
+
 	/* make sure that swaptime passed by */
 	tottime -= swaptime;
-	while (update_time()) PIL_sleep_ms(1);
-
-	if(CFRA>=PEFRA) {
-		if (tottime > 0.0) tottime = 0.0;
-		CFRA= PSFRA;
+	while (update_time()) {
+		PIL_sleep_ms(1);
+	}
+	
+	if (CFRA >= PEFRA) {
+		if (tottime > 0.0) {
+			tottime = 0.0;
+		}
+		CFRA = PSFRA;
 		audiostream_stop();
 		audiostream_start( CFRA );
+	} else {
+		if (U.mixbufsize 
+		    && (G.scene->audio.flag & AUDIO_SYNC)) {
+			CFRA = audiostream_pos();
+		} else {
+			CFRA++;
+		}
+		if (CFRA < last_cfra) {
+			fprintf(stderr, 
+				"SEQ-THREAD: CFRA running backwards: %d\n",
+				CFRA);
+		}
 	}
-	else {
-		if (U.mixbufsize && (G.scene->audio.flag & AUDIO_SYNC)) CFRA = audiostream_pos();
-		else CFRA++;
-	}
+
 }
 
 /* play_anim: 'mode' defines where to play and if repeat is on (now bitfield):
@@ -3261,22 +3378,24 @@
 
 	if(PSFRA>PEFRA) return 0;
 	
-	update_time();
-
 	/* waitcursor(1); */
 	G.f |= G_PLAYANIM;		/* in sequence.c and view.c this is handled */
 
 	cfraont= CFRA;
 	oldsa= curarea;
 
-	audiostream_start( CFRA );
-	
 	if (curarea && curarea->spacetype == SPACE_SEQ) {
 		SpaceSeq *sseq = curarea->spacedata.first;
 		if (sseq->mainb == 0) mode |= 4;
 	}
+
+	inner_play_prefetch_startup(mode);
+

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list