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:
parent
5081556bb5
commit
bbf1c83370
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue