Fix crash of Refresh Sequencer when some Movie / MovieClip strips doesn't have animation opened

This commit is contained in:
Sergey Sharybin
2012-03-26 15:57:00 +00:00
parent 3d5111a5ed
commit adbe628a1b
5 changed files with 48 additions and 30 deletions

View File

@@ -348,4 +348,6 @@ extern SequencerDrawView sequencer_view3d_cb;
extern ListBase seqbase_clipboard;
extern int seqbase_clipboard_frame;
void seq_update_sequence_length(struct Scene *scene, struct Editing *ed, struct Sequence *seq);
#endif // __BKE_SEQUENCER_H__

View File

@@ -213,11 +213,8 @@ static ImBuf *movieclip_load_sequence_file(MovieClip *clip, MovieClipUser *user,
return ibuf;
}
static ImBuf *movieclip_load_movie_file(MovieClip *clip, MovieClipUser *user, int framenr, int flag)
static void movieclip_open_anim_file(MovieClip *clip)
{
ImBuf *ibuf = NULL;
int tc = get_timecode(clip, flag);
int proxy = rendersize_to_proxy(user, flag);
char str[FILE_MAX];
if (!clip->anim) {
@@ -236,6 +233,15 @@ static ImBuf *movieclip_load_movie_file(MovieClip *clip, MovieClipUser *user, in
}
}
}
}
static ImBuf *movieclip_load_movie_file(MovieClip *clip, MovieClipUser *user, int framenr, int flag)
{
ImBuf *ibuf = NULL;
int tc = get_timecode(clip, flag);
int proxy = rendersize_to_proxy(user, flag);
movieclip_open_anim_file(clip);
if (clip->anim) {
int dur;
@@ -258,8 +264,12 @@ static ImBuf *movieclip_load_movie_file(MovieClip *clip, MovieClipUser *user, in
static void movieclip_calc_length(MovieClip *clip)
{
if (clip->anim) {
clip->len = IMB_anim_get_duration(clip->anim, clip->proxy.tc);
if (clip->source == MCLIP_SRC_MOVIE) {
movieclip_open_anim_file(clip);
if (clip->anim) {
clip->len = IMB_anim_get_duration(clip->anim, clip->proxy.tc);
}
}
else if (clip->source == MCLIP_SRC_SEQUENCE) {
int framenr = 1;

View File

@@ -4007,3 +4007,31 @@ void seqbase_dupli_recursive(Scene *scene, Scene *scene_to, ListBase *nseqbase,
}
}
}
void seq_update_sequence_length(Scene *scene, Editing *ed, Sequence *seq)
{
int changed = FALSE;
switch (seq->type) {
case SEQ_SCENE:
seq->len = seq->scene->r.efra - seq->scene->r.sfra + 1;
changed = TRUE;
break;
case SEQ_MOVIECLIP:
seq->len = BKE_movieclip_get_duration(seq->clip);
changed = TRUE;
break;
case SEQ_MOVIE:
seq_open_anim_file(seq);
seq->len = IMB_anim_get_duration(seq->anim, IMB_TC_RECORD_RUN);
changed = TRUE;
break;
}
if (changed) {
calc_sequence_disp(scene, seq);
if (seq_test_overlap(ed->seqbasep, seq))
shuffle_seq(ed->seqbasep, seq, scene);
}
}

View File

@@ -1863,7 +1863,7 @@ static void write_previews(WriteData *wd, PreviewImage *prv)
short h = prv->h[1];
unsigned int *rect = prv->rect[1];
/* don't write out large previews if not requested */
if (!(U.flag & USER_SAVE_PREVIEWS) ) {
if (!(U.flag & USER_SAVE_PREVIEWS)) {
prv->w[1] = 0;
prv->h[1] = 0;
prv->rect[1] = NULL;

View File

@@ -1311,29 +1311,7 @@ static void sequencer_refresh_all_length(Scene *scene, Editing *ed)
Sequence *seq;
SEQP_BEGIN(ed, seq) {
int changed = FALSE;
switch (seq->type) {
case SEQ_SCENE:
seq->len = seq->scene->r.efra - seq->scene->r.sfra + 1;
changed = TRUE;
break;
case SEQ_MOVIECLIP:
seq->len = BKE_movieclip_get_duration(seq->clip);
changed = TRUE;
break;
case SEQ_MOVIE:
seq->len = IMB_anim_get_duration(seq->anim, IMB_TC_RECORD_RUN);
changed = TRUE;
break;
}
if (changed) {
calc_sequence_disp(scene, seq);
if (seq_test_overlap(ed->seqbasep, seq))
shuffle_seq(ed->seqbasep, seq, scene);
}
seq_update_sequence_length(scene, ed, seq);
}
SEQ_END
}