Fix T74875: Preview shows previously cached frame after Hard Cut

Add method to invalidate strip cache in range of non-overlapping strip.
Invalidate original strip in range of new strip created by cutting.

Reviewed By: brecht

Differential Revision: https://developer.blender.org/D7313
This commit is contained in:
Richard Antalik 2020-04-12 22:42:31 +02:00
parent 5081556bb5
commit bbf1c83370
4 changed files with 25 additions and 11 deletions

View File

@ -336,7 +336,8 @@ void BKE_sequencer_cache_cleanup(struct Scene *scene);
void BKE_sequencer_cache_cleanup_sequence(struct Scene *scene,
struct Sequence *seq,
struct Sequence *seq_changed,
int invalidate_types);
int invalidate_types,
bool force_seq_changed_range);
void BKE_sequencer_cache_iterate(struct Scene *scene,
void *userdata,
bool callback_init(void *userdata, size_t item_count),
@ -434,6 +435,7 @@ void BKE_sequence_invalidate_cache_composite(struct Scene *scene, struct Sequenc
void BKE_sequence_invalidate_dependent(struct Scene *scene, struct Sequence *seq);
void BKE_sequence_invalidate_scene_strips(struct Main *bmain, struct Scene *scene_target);
void BKE_sequence_invalidate_movieclip_strips(struct Main *bmain, struct MovieClip *clip_target);
void BKE_sequence_invalidate_cache_in_range(struct Scene *scene, struct Sequence *seq, struct Sequence *range_mask, int invalidate_types);
void BKE_sequencer_update_sound_bounds_all(struct Scene *scene);
void BKE_sequencer_update_sound_bounds(struct Scene *scene, struct Sequence *seq);

View File

@ -1153,7 +1153,8 @@ void BKE_sequencer_cache_cleanup(Scene *scene)
void BKE_sequencer_cache_cleanup_sequence(Scene *scene,
Sequence *seq,
Sequence *seq_changed,
int invalidate_types)
int invalidate_types,
bool force_seq_changed_range)
{
SeqCache *cache = seq_cache_get_from_scene(scene);
if (!cache) {
@ -1169,12 +1170,14 @@ void BKE_sequencer_cache_cleanup_sequence(Scene *scene,
int range_start = seq_changed->startdisp;
int range_end = seq_changed->enddisp;
if (seq->startdisp > range_start) {
range_start = seq->startdisp;
}
if (!force_seq_changed_range) {
if (seq->startdisp > range_start) {
range_start = seq->startdisp;
}
if (seq->enddisp < range_end) {
range_end = seq->enddisp;
if (seq->enddisp < range_end) {
range_end = seq->enddisp;
}
}
int invalidate_composite = invalidate_types & SEQ_CACHE_STORE_FINAL_OUT;

View File

@ -4168,13 +4168,12 @@ static void sequence_do_invalidate_dependent(Scene *scene, Sequence *seq, ListBa
if (BKE_sequence_check_depend(seq, cur)) {
/* Effect must be invalidated completely if they depend on invalidated seq. */
if ((cur->type & SEQ_TYPE_EFFECT) != 0) {
BKE_sequencer_cache_cleanup_sequence(
scene, cur, seq, SEQ_CACHE_ALL_TYPES);
BKE_sequencer_cache_cleanup_sequence(scene, cur, seq, SEQ_CACHE_ALL_TYPES, false);
}
else {
/* In case of alpha over for example only invalidate composite image */
BKE_sequencer_cache_cleanup_sequence(
scene, cur, seq, SEQ_CACHE_STORE_COMPOSITE | SEQ_CACHE_STORE_FINAL_OUT);
scene, cur, seq, SEQ_CACHE_STORE_COMPOSITE | SEQ_CACHE_STORE_FINAL_OUT, false);
}
}
@ -4193,7 +4192,7 @@ static void sequence_invalidate_cache(Scene *scene,
if (invalidate_self) {
BKE_sequence_free_anim(seq);
BKE_sequencer_cache_cleanup_sequence(scene, seq, seq, invalidate_types);
BKE_sequencer_cache_cleanup_sequence(scene, seq, seq, invalidate_types, false);
}
if (seq->effectdata && seq->type == SEQ_TYPE_SPEED) {
@ -4205,6 +4204,14 @@ static void sequence_invalidate_cache(Scene *scene,
BKE_sequencer_prefetch_stop(scene);
}
void BKE_sequence_invalidate_cache_in_range(Scene *scene,
Sequence *seq,
Sequence *range_mask,
int invalidate_types)
{
BKE_sequencer_cache_cleanup_sequence(scene, seq, range_mask, invalidate_types, true);
}
void BKE_sequence_invalidate_cache_raw(Scene *scene, Sequence *seq)
{
sequence_invalidate_cache(scene, seq, true, SEQ_CACHE_ALL_TYPES);

View File

@ -838,6 +838,7 @@ static Sequence *split_seq_hard(
BKE_sequence_reload_new_file(bmain, scene, seqn, false);
BKE_sequence_calc(scene, seqn);
BKE_sequence_invalidate_cache_in_range(scene, seq, seqn, SEQ_CACHE_ALL_TYPES);
}
return seqn;
}
@ -937,6 +938,7 @@ static Sequence *split_seq_soft(
}
BKE_sequence_calc(scene, seqn);
BKE_sequence_invalidate_cache_in_range(scene, seq, seqn, SEQ_CACHE_ALL_TYPES);
}
return seqn;
}