Fix T78835: Ghosting audio after using undo

The root of the issue comes to the fact that sub-data pointers were
used to match strips before/after copy-on-write. The undo system might
re-use sub-data pointers after re-allocating them, making it so that,
for example, pointer used by sound strip is later re-used by video
strip.

This fix takes an advantage of recently introduced per-sequence UUID
and uses it to match sequences before/after copy-on-write.
master
Sergey Sharybin 4 years ago
parent 9ea6228b07
commit 1e7afea2bb

@ -26,6 +26,8 @@
#include "DNA_scene_types.h"
#include "DNA_sequence_types.h"
#include "BLI_assert.h"
#include "BKE_sequencer.h"
#include "BKE_sound.h"
@ -43,7 +45,9 @@ void SequencerBackup::init_from_scene(Scene *scene)
SequenceBackup sequence_backup(depsgraph);
sequence_backup.init_from_sequence(sequence);
if (!sequence_backup.isEmpty()) {
sequences_backup.add(sequence->orig_sequence, sequence_backup);
const SessionUUID &session_uuid = sequence->runtime.session_uuid;
BLI_assert(BLI_session_uuid_is_generated(&session_uuid));
sequences_backup.add(session_uuid, sequence_backup);
}
}
SEQ_END;
@ -53,7 +57,9 @@ void SequencerBackup::restore_to_scene(Scene *scene)
{
Sequence *sequence;
SEQ_BEGIN (scene->ed, sequence) {
SequenceBackup *sequence_backup = sequences_backup.lookup_ptr(sequence->orig_sequence);
const SessionUUID &session_uuid = sequence->runtime.session_uuid;
BLI_assert(BLI_session_uuid_is_generated(&session_uuid));
SequenceBackup *sequence_backup = sequences_backup.lookup_ptr(session_uuid);
if (sequence_backup != nullptr) {
sequence_backup->restore_to_sequence(sequence);
}

@ -23,6 +23,10 @@
#pragma once
#include "DNA_session_uuid_types.h"
#include "BLI_session_uuid.h"
#include "intern/depsgraph_type.h"
#include "intern/eval/deg_eval_runtime_backup_sequence.h"
@ -43,7 +47,7 @@ class SequencerBackup {
const Depsgraph *depsgraph;
Map<Sequence *, SequenceBackup> sequences_backup;
Map<SessionUUID, SequenceBackup> sequences_backup;
};
} // namespace deg

Loading…
Cancel
Save