[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