Blender V4.3
sequence_lookup.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2021-2024 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#include "SEQ_sequencer.hh"
10#include "sequencer.hh"
11
12#include "DNA_listBase.h"
13#include "DNA_scene_types.h"
14#include "DNA_sequence_types.h"
15
16#include "BLI_listbase.h"
17#include "BLI_map.hh"
18#include "BLI_sys_types.h"
19#include "BLI_vector_set.hh"
20
21#include <cstring>
22#include <mutex>
23
24#include "MEM_guardedalloc.h"
25
26static std::mutex lookup_lock;
27
35
37 Sequence *effect,
38 SequenceLookup *lookup)
39{
40 if (input == nullptr) {
41 return;
42 }
43
44 blender::VectorSet<Sequence *> &effects = lookup->effects_by_seq.lookup_or_add_default(input);
45
46 effects.add(effect);
47}
48
50{
51 if ((seq->type & SEQ_TYPE_EFFECT) == 0) {
52 return;
53 }
54
55 seq_sequence_lookup_append_effect(seq->seq1, seq, lookup);
56 seq_sequence_lookup_append_effect(seq->seq2, seq, lookup);
57}
58
60 const ListBase *seqbase,
61 SequenceLookup *lookup)
62{
63 if (parent_meta != nullptr) {
64 LISTBASE_FOREACH (SeqTimelineChannel *, channel, &parent_meta->channels) {
65 lookup->owner_by_channel.add(channel, parent_meta);
66 }
67 }
68
69 LISTBASE_FOREACH (Sequence *, seq, seqbase) {
70 lookup->seq_by_name.add(seq->name + 2, seq);
71 lookup->meta_by_seq.add(seq, parent_meta);
73
74 if (seq->type == SEQ_TYPE_META) {
75 seq_sequence_lookup_build_from_seqbase(seq, &seq->seqbase, lookup);
76 }
77 }
78}
79
80static void seq_sequence_lookup_build(const Scene *scene, SequenceLookup *lookup)
81{
82 Editing *ed = SEQ_editing_get(scene);
84 lookup->is_valid = true;
85}
86
88{
89 SequenceLookup *lookup = MEM_new<SequenceLookup>(__func__);
90 return lookup;
91}
92
94{
95 MEM_delete(*lookup);
96 *lookup = nullptr;
97}
98
99static void seq_sequence_lookup_rebuild(const Scene *scene, SequenceLookup **lookup)
100{
102 *lookup = seq_sequence_lookup_new();
103 seq_sequence_lookup_build(scene, *lookup);
104}
105
107{
108 if (!scene->ed) {
109 return;
110 }
111 if (*lookup && (*lookup)->is_valid) {
112 return;
113 }
114
115 seq_sequence_lookup_rebuild(scene, lookup);
116}
117
119{
120 BLI_assert(scene->ed);
121 std::lock_guard lock(lookup_lock);
122 SequenceLookup *lookup = scene->ed->runtime.sequence_lookup;
124}
125
126Sequence *SEQ_sequence_lookup_seq_by_name(const Scene *scene, const char *key)
127{
128 BLI_assert(scene->ed);
129 std::lock_guard lock(lookup_lock);
130 seq_sequence_lookup_update_if_needed(scene, &scene->ed->runtime.sequence_lookup);
131 SequenceLookup *lookup = scene->ed->runtime.sequence_lookup;
132 return lookup->seq_by_name.lookup_default(key, nullptr);
133}
134
136{
137 BLI_assert(scene->ed);
138 std::lock_guard lock(lookup_lock);
139 seq_sequence_lookup_update_if_needed(scene, &scene->ed->runtime.sequence_lookup);
140 SequenceLookup *lookup = scene->ed->runtime.sequence_lookup;
141 return lookup->meta_by_seq.lookup_default(key, nullptr);
142}
143
145 const Sequence *key)
146{
147 BLI_assert(scene->ed);
148 std::lock_guard lock(lookup_lock);
149 seq_sequence_lookup_update_if_needed(scene, &scene->ed->runtime.sequence_lookup);
150 SequenceLookup *lookup = scene->ed->runtime.sequence_lookup;
151 blender::VectorSet<Sequence *> &effects = lookup->effects_by_seq.lookup_or_add_default(key);
152 return effects.as_span();
153}
154
156 const SeqTimelineChannel *channel)
157{
158 BLI_assert(scene->ed);
159 std::lock_guard lock(lookup_lock);
160 seq_sequence_lookup_update_if_needed(scene, &scene->ed->runtime.sequence_lookup);
161 SequenceLookup *lookup = scene->ed->runtime.sequence_lookup;
162 return lookup->owner_by_channel.lookup_default(channel, nullptr);
163}
164
166{
167 if (scene == nullptr || scene->ed == nullptr) {
168 return;
169 }
170
171 std::lock_guard lock(lookup_lock);
172 SequenceLookup *lookup = scene->ed->runtime.sequence_lookup;
173 if (lookup != nullptr) {
174 lookup->is_valid = false;
175 }
176}
#define BLI_assert(a)
Definition BLI_assert.h:50
#define LISTBASE_FOREACH(type, var, list)
These structs are the foundation for all linked lists in the library system.
@ SEQ_TYPE_META
@ SEQ_TYPE_EFFECT
Read Guarded memory(de)allocation.
volatile int lock
Sequence * SEQ_sequence_lookup_owner_by_channel(const Scene *scene, const SeqTimelineChannel *channel)
static void seq_sequence_lookup_rebuild(const Scene *scene, SequenceLookup **lookup)
static void seq_sequence_lookup_free(SequenceLookup **lookup)
static void seq_sequence_lookup_update_if_needed(const Scene *scene, SequenceLookup **lookup)
static SequenceLookup * seq_sequence_lookup_new()
static void seq_sequence_lookup_build_from_seqbase(Sequence *parent_meta, const ListBase *seqbase, SequenceLookup *lookup)
Sequence * seq_sequence_lookup_meta_by_seq(const Scene *scene, const Sequence *key)
static void seq_sequence_lookup_build_effect(Sequence *seq, SequenceLookup *lookup)
blender::Span< Sequence * > seq_sequence_lookup_effects_by_seq(const Scene *scene, const Sequence *key)
static void seq_sequence_lookup_append_effect(const Sequence *input, Sequence *effect, SequenceLookup *lookup)
void SEQ_sequence_lookup_invalidate(const Scene *scene)
static std::mutex lookup_lock
Sequence * SEQ_sequence_lookup_seq_by_name(const Scene *scene, const char *key)
void SEQ_sequence_lookup_free(const Scene *scene)
static void seq_sequence_lookup_build(const Scene *scene, SequenceLookup *lookup)
Editing * SEQ_editing_get(const Scene *scene)
Definition sequencer.cc:262
ListBase seqbase
blender::Map< const Sequence *, blender::VectorSet< Sequence * > > effects_by_seq
blender::Map< const Sequence *, Sequence * > meta_by_seq
blender::Map< std::string, Sequence * > seq_by_name
blender::Map< const SeqTimelineChannel *, Sequence * > owner_by_channel
ListBase channels
struct Sequence * seq1
struct Sequence * seq2