Fix crash of Refresh Sequencer when some Movie / MovieClip strips doesn't have animation opened
This commit is contained in:
@@ -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__
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user