[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44545] trunk/blender/source/blender: Refactor of proxies build operators

Sergey Sharybin sergey.vfx at gmail.com
Wed Feb 29 13:08:34 CET 2012


Revision: 44545
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44545
Author:   nazgul
Date:     2012-02-29 12:08:26 +0000 (Wed, 29 Feb 2012)
Log Message:
-----------
Refactor of proxies build operators

Split proxy build operator into three parts:
- Prepare context (IMB_anim_index_rebuild_context) which prepares all
  needed data and stores it in an anonymous structure used by specific
  builder lately.
- Build proxies/timecodes into temporary files (IMB_anim_index_rebuild)
  This function will build all selected proxies/timecodes into a temporary
  files so old proxies will be still available during building.
- Finish building proxies (IMB_anim_index_rebuild_finish) which copies
  temporary files over old proxies filed and releases all resources used
  by a context.

Context creation and finishing building happens in a main thread so
it's easy and safe to close all opened handles of proxies files and
refresh cache after rebuilding is finished.

This should finally fix #30315: Temporary proxy files are not erased and old proxys are not updated if the proxy is built more then once (windows)

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_sequencer.h
    trunk/blender/source/blender/blenkernel/intern/sequencer.c
    trunk/blender/source/blender/editors/space_clip/clip_ops.c
    trunk/blender/source/blender/editors/space_sequencer/sequencer_edit.c
    trunk/blender/source/blender/imbuf/IMB_imbuf.h
    trunk/blender/source/blender/imbuf/intern/anim_movie.c
    trunk/blender/source/blender/imbuf/intern/indexer.c

Modified: trunk/blender/source/blender/blenkernel/BKE_sequencer.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_sequencer.h	2012-02-29 11:23:27 UTC (rev 44544)
+++ trunk/blender/source/blender/blenkernel/BKE_sequencer.h	2012-02-29 12:08:26 UTC (rev 44545)
@@ -40,6 +40,8 @@
 struct StripElem;
 struct bSound;
 
+struct SeqIndexBuildContext;
+
 #define BUILD_SEQAR_COUNT_NOTHING  0
 #define BUILD_SEQAR_COUNT_CURRENT  1
 #define BUILD_SEQAR_COUNT_CHILDREN 2
@@ -194,9 +196,10 @@
 int input_have_to_preprocess(
 	SeqRenderData context, struct Sequence * seq, float cfra);
 
-void seq_proxy_rebuild(struct Main * bmain, 
-                       struct Scene *scene, struct Sequence * seq,
+struct SeqIndexBuildContext *seq_proxy_rebuild_context(struct Main *bmain, struct Scene *scene, struct Sequence *seq);
+void seq_proxy_rebuild(struct SeqIndexBuildContext *context,
                        short *stop, short *do_update, float *progress);
+void seq_proxy_rebuild_finish(struct SeqIndexBuildContext *context, short stop);
 
 
 /* **********************************************************************

Modified: trunk/blender/source/blender/blenkernel/intern/sequencer.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/sequencer.c	2012-02-29 11:23:27 UTC (rev 44544)
+++ trunk/blender/source/blender/blenkernel/intern/sequencer.c	2012-02-29 12:08:26 UTC (rev 44545)
@@ -1140,6 +1140,18 @@
    proxy management
    ********************************************************************** */
 
+typedef struct SeqIndexBuildContext {
+	struct IndexBuildContext *index_context;
+
+	int tc_flags;
+	int size_flags;
+	int quality;
+
+	Main *bmain;
+	Scene *scene;
+	Sequence *seq, *orig_seq;
+} SeqIndexBuildContext;
+
 #define PROXY_MAXFILE (2*FILE_MAXDIR+FILE_MAXFILE)
 
 static IMB_Proxy_Size seq_rendersize_to_proxysize(int size)
@@ -1345,35 +1357,56 @@
 	IMB_freeImBuf(ibuf);
 }
 
-void seq_proxy_rebuild(struct Main * bmain, Scene *scene, Sequence * seq,
-		       short *stop, short *do_update, float *progress)
+struct SeqIndexBuildContext *seq_proxy_rebuild_context(Main *bmain, Scene *scene, Sequence *seq)
 {
-	SeqRenderData context;
-	int cfra;
-	int tc_flags;
-	int size_flags;
-	int quality;
+	SeqIndexBuildContext *context;
+	Sequence *nseq;
 
 	if (!seq->strip || !seq->strip->proxy) {
-		return;
+		return NULL;
 	}
 
 	if (!(seq->flag & SEQ_USE_PROXY)) {
-		return;
+		return NULL;
 	}
 
-	tc_flags   = seq->strip->proxy->build_tc_flags;
-	size_flags = seq->strip->proxy->build_size_flags;
-	quality    = seq->strip->proxy->quality;
+	context = MEM_callocN(sizeof(SeqIndexBuildContext), "seq proxy rebuild context");
 
+	nseq = seq_dupli_recursive(scene, scene, seq, 0);
+
+	context->tc_flags   = nseq->strip->proxy->build_tc_flags;
+	context->size_flags = nseq->strip->proxy->build_size_flags;
+	context->quality    = nseq->strip->proxy->quality;
+
+	context->bmain = bmain;
+	context->scene = scene;
+	context->orig_seq = seq;
+	context->seq = nseq;
+
+	if (nseq->type == SEQ_MOVIE) {
+		seq_open_anim_file(nseq);
+
+		if (nseq->anim) {
+			context->index_context = IMB_anim_index_rebuild_context(nseq->anim,
+				context->tc_flags, context->size_flags, context->quality);
+		}
+	}
+
+	return context;
+}
+
+void seq_proxy_rebuild(SeqIndexBuildContext *context, short *stop, short *do_update, float *progress)
+{
+	SeqRenderData render_context;
+	Sequence *seq = context->seq;
+	Scene *scene = context->scene;
+	int cfra;
+
 	if (seq->type == SEQ_MOVIE) {
-		seq_open_anim_file(seq);
+		if (context->index_context) {
+			IMB_anim_index_rebuild(context->index_context, stop, do_update, progress);
+		}
 
-		if (seq->anim) {
-			IMB_anim_index_rebuild(
-				seq->anim, tc_flags, size_flags, quality,
-				stop, do_update, progress);
-		}
 		return;
 	}
 
@@ -1388,25 +1421,25 @@
 
 	/* fail safe code */
 
-	context = seq_new_render_data(
-		bmain, scene, 
+	render_context = seq_new_render_data(
+		context->bmain, context->scene,
 		(scene->r.size * (float) scene->r.xsch) / 100.0f + 0.5f, 
 		(scene->r.size * (float) scene->r.ysch) / 100.0f + 0.5f, 
 		100);
 
 	for (cfra = seq->startdisp + seq->startstill; 
 	     cfra < seq->enddisp - seq->endstill; cfra++) {
-		if (size_flags & IMB_PROXY_25) {
-			seq_proxy_build_frame(context, seq, cfra, 25);
+		if (context->size_flags & IMB_PROXY_25) {
+			seq_proxy_build_frame(render_context, seq, cfra, 25);
 		}
-		if (size_flags & IMB_PROXY_50) {
-			seq_proxy_build_frame(context, seq, cfra, 50);
+		if (context->size_flags & IMB_PROXY_50) {
+			seq_proxy_build_frame(render_context, seq, cfra, 50);
 		}
-		if (size_flags & IMB_PROXY_75) {
-			seq_proxy_build_frame(context, seq, cfra, 75);
+		if (context->size_flags & IMB_PROXY_75) {
+			seq_proxy_build_frame(render_context, seq, cfra, 75);
 		}
-		if (size_flags & IMB_PROXY_100) {
-			seq_proxy_build_frame(context, seq, cfra, 100);
+		if (context->size_flags & IMB_PROXY_100) {
+			seq_proxy_build_frame(render_context, seq, cfra, 100);
 		}
 
 		*progress= (float)cfra/(seq->enddisp - seq->endstill 
@@ -1418,7 +1451,19 @@
 	}
 }
 
+void seq_proxy_rebuild_finish(SeqIndexBuildContext *context, short stop)
+{
+	if (context->index_context) {
+		IMB_close_anim_proxies(context->seq->anim);
+		IMB_close_anim_proxies(context->orig_seq->anim);
+		IMB_anim_index_rebuild_finish(context->index_context, stop);
+	}
 
+	seq_free_sequence_recurse(context->scene, context->seq);
+
+	MEM_freeN(context);
+}
+
 /* **********************************************************************
    color balance 
    ********************************************************************** */

Modified: trunk/blender/source/blender/editors/space_clip/clip_ops.c
===================================================================
--- trunk/blender/source/blender/editors/space_clip/clip_ops.c	2012-02-29 11:23:27 UTC (rev 44544)
+++ trunk/blender/source/blender/editors/space_clip/clip_ops.c	2012-02-29 12:08:26 UTC (rev 44545)
@@ -845,7 +845,8 @@
 	Scene *scene;
 	struct Main *main;
 	MovieClip *clip;
-	int clip_flag;
+	int clip_flag, stop;
+	struct IndexBuildContext *index_context;
 } ProxyJob;
 
 static void proxy_freejob(void *pjv)
@@ -896,11 +897,13 @@
 	build_undistort_count= proxy_bitflag_to_array(size_flag, build_undistort_sizes, 1);
 
 	if(clip->source == MCLIP_SRC_MOVIE) {
-		if(clip->anim)
-			IMB_anim_index_rebuild(clip->anim, tc_flag, size_flag, quality, stop, do_update, progress);
+		if (pj->index_context)
+			IMB_anim_index_rebuild(pj->index_context, stop, do_update, progress);
 
 		if(!build_undistort_count) {
-			BKE_movieclip_reload(clip);
+			if (*stop)
+				pj->stop = 1;
+
 			return;
 		}
 		else {
@@ -928,9 +931,25 @@
 	if(distortion)
 		BKE_tracking_distortion_destroy(distortion);
 
-	BKE_movieclip_reload(clip);
+	if (*stop)
+		pj->stop = 1;
 }
 
+static void proxy_endjob(void *pjv)
+{
+	ProxyJob *pj = pjv;
+
+	if (pj->clip->anim)
+		IMB_close_anim_proxies(pj->clip->anim);
+
+	if (pj->index_context)
+		IMB_anim_index_rebuild_finish(pj->index_context, pj->stop);
+
+	BKE_movieclip_reload(pj->clip);
+
+	WM_main_add_notifier(NC_MOVIECLIP|ND_DISPLAY, pj->clip);
+}
+
 static int clip_rebuild_proxy_exec(bContext *C, wmOperator *UNUSED(op))
 {
 	wmJob * steve;
@@ -951,9 +970,14 @@
 	pj->clip= clip;
 	pj->clip_flag= clip->flag&MCLIP_TIMECODE_FLAGS;
 
+	if (clip->anim) {
+		pj->index_context = IMB_anim_index_rebuild_context(clip->anim, clip->proxy.build_tc_flag,
+					clip->proxy.build_size_flag, clip->proxy.quality);
+	}
+
 	WM_jobs_customdata(steve, pj, proxy_freejob);
 	WM_jobs_timer(steve, 0.2, NC_MOVIECLIP|ND_DISPLAY, 0);
-	WM_jobs_callbacks(steve, proxy_startjob, NULL, NULL, NULL);
+	WM_jobs_callbacks(steve, proxy_startjob, NULL, NULL, proxy_endjob);
 
 	G.afbreek= 0;
 	WM_jobs_start(CTX_wm_manager(C), steve);

Modified: trunk/blender/source/blender/editors/space_sequencer/sequencer_edit.c
===================================================================
--- trunk/blender/source/blender/editors/space_sequencer/sequencer_edit.c	2012-02-29 11:23:27 UTC (rev 44544)
+++ trunk/blender/source/blender/editors/space_sequencer/sequencer_edit.c	2012-02-29 12:08:26 UTC (rev 44545)
@@ -56,6 +56,8 @@
 #include "BKE_report.h"
 #include "BKE_sound.h"
 
+#include "IMB_imbuf.h"
+
 #include "WM_api.h"
 #include "WM_types.h"
 
@@ -131,21 +133,15 @@
 	Scene *scene; 
 	struct Main * main;
 	ListBase queue;
-	ThreadMutex queue_lock;
+	int stop;
 } ProxyJob;
 
 static void proxy_freejob(void *pjv)
 {
 	ProxyJob *pj= pjv;
-	Sequence * seq;
 
-	for (seq = pj->queue.first; seq; seq = seq->next) {
-		BLI_remlink(&pj->queue, seq);
-		seq_free_sequence_recurse(pj->scene, seq);
-	}
+	BLI_freelistN(&pj->queue);
 
-	BLI_mutex_end(&pj->queue_lock);
-
 	MEM_freeN(pj);
 }
 
@@ -153,30 +149,17 @@
 static void proxy_startjob(void *pjv, short *stop, short *do_update, float *progress)
 {
 	ProxyJob *pj = pjv;
+	LinkData *link;
 
-	while (!*stop) {
-		Sequence * seq;
+	for (link = pj->queue.first; link; link = link->next) {
+		struct SeqIndexBuildContext *context = link->data;
 
-		BLI_mutex_lock(&pj->queue_lock);
-		
-		if (!pj->queue.first) {
-			BLI_mutex_unlock(&pj->queue_lock);
-			break;
-		}
-
-		seq = pj->queue.first;
-
-		BLI_remlink(&pj->queue, seq);
-		BLI_mutex_unlock(&pj->queue_lock);
-
-		seq_proxy_rebuild(pj->main, pj->scene, seq, 
-		                  stop, do_update, progress);
-		seq_free_sequence_recurse(pj->scene, seq);
+		seq_proxy_rebuild(context, stop, do_update, progress);
 	}
 
 	if (*stop) {
-		fprintf(stderr, 
-			"Canceling proxy rebuild on users request...\n");
+		pj->stop = 1;
+		fprintf(stderr,  "Canceling proxy rebuild on users request...\n");
 	}
 }
 
@@ -184,24 +167,30 @@
 {
 	ProxyJob *pj = pjv;
 	Editing *ed = seq_give_editing(pj->scene, FALSE);
+	LinkData *link;
 
+	for (link = pj->queue.first; link; link = link->next) {
+		seq_proxy_rebuild_finish(link->data, pj->stop);
+	}
+
 	free_imbuf_seq(pj->scene, &ed->seqbase, FALSE, FALSE);
 
 	WM_main_add_notifier(NC_SCENE|ND_SEQUENCER, pj->scene);
 }
 
-static void seq_proxy_build_job(const bContext *C, Sequence * seq)
+static void seq_proxy_build_job(const bContext *C)
 {
 	wmJob * steve;
 	ProxyJob *pj;
 	Scene *scene= CTX_data_scene(C);
+	Editing *ed = seq_give_editing(scene, FALSE);
 	ScrArea * sa= CTX_wm_area(C);
+	struct SeqIndexBuildContext *context;
+	LinkData *link;
+	Sequence * seq;
 
-	seq = seq_dupli_recursive(scene, scene, seq, 0);

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list