45 const char **r_error_str)
47 char name[
sizeof(seq_a->
name)];
50 *r_error_str =
N_(
"Strips must be the same length");
57 *r_error_str =
N_(
"Strips were not compatible");
63 *r_error_str =
N_(
"Strips were not compatible");
69 *r_error_str =
N_(
"Strips must have the same number of inputs");
75 blender::dna::shallow_swap(*seq_a, *seq_b);
111 if (seq == metaseq) {
118 if (seq->scene_sound) {
150 if (smd->mask_sequence == seq) {
151 smd->mask_sequence =
nullptr;
217 const char **r_error_str)
224 *r_error_str =
N_(
"Cannot move strip to non-meta strip");
228 if (src_seq == dst_seqm) {
229 *r_error_str =
N_(
"Strip cannot be moved into itself");
233 if (seqbase == &dst_seqm->
seqbase) {
234 *r_error_str =
N_(
"Moved strip is already inside provided meta strip");
239 *r_error_str =
N_(
"Moved strip is parent of provided meta strip");
244 *r_error_str =
N_(
"Cannot move strip to different scene");
269 if (timeline_frame < content_start) {
270 const float offset = content_start + 1 - timeline_frame;
271 seq->
start -= offset;
275 else if ((timeline_frame >= content_start) && (timeline_frame <= content_end)) {
295 if ((timeline_frame >= content_start) && (timeline_frame <= content_end)) {
298 seq->
start = timeline_frame;
302 else if (timeline_frame > content_end) {
303 const float offset = timeline_frame - content_end + 1;
304 seq->
start += offset;
315 const int timeline_frame)
325 const int timeline_frame,
353 const int timeline_frame)
355 bool input_does_intersect =
false;
360 scene, seq->
seq1, timeline_frame);
367 scene, seq->
seq2, timeline_frame);
370 return input_does_intersect;
375 const int timeline_frame,
376 const char **r_error)
381 *r_error =
"Strip is locked.";
394 *r_error =
"Splitting transition effect is not permitted.";
398 *r_error =
"Effect inputs don't overlap. Can not split such effect.";
409 const int timeline_frame,
411 const char **r_error)
424 for (
Sequence *strip : strips_old) {
426 connections.remove_if([&](
Sequence *connection) {
444 ListBase left_strips = {
nullptr,
nullptr};
455 ListBase right_strips = {
nullptr,
nullptr};
469 for (; seq_rename; seq_rename = seq_rename->
next) {
474 while (left_seq && right_seq) {
481 else if (return_seq ==
nullptr) {
483 return_seq = right_seq;
487 left_seq = left_seq->
next;
488 right_seq = right_seq->
next;
499 const int initial_frame,
500 const bool remove_all_gaps)
509 if (remove_all_gaps) {
void BKE_sound_mute_scene_sound(void *handle, bool mute)
#define LISTBASE_FOREACH(type, var, list)
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
void void void BLI_movelisttolist(struct ListBase *dst, struct ListBase *src) ATTR_NONNULL(1
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
MINLINE int round_fl_to_int(float a)
#define STRNCPY(dst, src)
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
char * BLI_strncpy_utf8(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
int BLI_str_utf8_invalid_strip(char *str, size_t length) ATTR_NONNULL(1)
void SEQ_animation_backup_original(Scene *scene, SeqAnimationBackup *backup)
void SEQ_free_animdata(Scene *scene, Sequence *seq)
void SEQ_animation_duplicate_backup_to_scene(Scene *scene, Sequence *seq, SeqAnimationBackup *backup)
void SEQ_animation_restore_original(Scene *scene, SeqAnimationBackup *backup)
ListBase * SEQ_channels_displayed_get(Editing *ed)
void add_multiple(Span< Key > keys)
int SEQ_effect_get_num_inputs(int seq_type)
void SEQ_iterator_set_expand(const Scene *scene, ListBase *seqbase, VectorSet< Sequence * > &strips, void seq_query_func(const Scene *scene, Sequence *seq_reference, ListBase *seqbase, VectorSet< Sequence * > &strips))
void SEQ_query_strip_effect_chain(const Scene *scene, Sequence *reference_strip, ListBase *seqbase, VectorSet< Sequence * > &strips)
bool SEQ_render_is_muted(const ListBase *channels, const Sequence *seq)
void SEQ_sequence_lookup_invalidate(const Scene *scene)
ListBase * SEQ_get_seqbase_by_seq(const Scene *scene, Sequence *seq)
void SEQ_ensure_unique_name(Sequence *seq, Scene *scene)
void SEQ_sequence_base_dupli_recursive(const Scene *scene_src, Scene *scene_dst, ListBase *nseqbase, const ListBase *seqbase, int dupe_flag, const int flag)
void SEQ_sequence_free(Scene *scene, Sequence *seq)
Editing * SEQ_editing_get(const Scene *scene)
void SEQ_add_reload_new_file(Main *bmain, Scene *scene, Sequence *seq, const bool lock_range)
blender::VectorSet< Sequence * > SEQ_get_connected_strips(const Sequence *seq)
bool SEQ_edit_remove_gaps(Scene *scene, ListBase *seqbase, const int initial_frame, const bool remove_all_gaps)
static bool seq_edit_split_operation_permitted_check(const Scene *scene, blender::Span< Sequence * > strips, const int timeline_frame, const char **r_error)
static void seq_split_set_left_hold_offset(Main *bmain, Scene *scene, Sequence *seq, int timeline_frame)
void SEQ_edit_flag_for_removal(Scene *scene, ListBase *seqbase, Sequence *seq)
bool SEQ_edit_move_strip_to_seqbase(Scene *scene, ListBase *seqbase, Sequence *seq, ListBase *dst_seqbase)
static void seq_edit_split_handle_strip_offsets(Main *bmain, Scene *scene, Sequence *left_seq, Sequence *right_seq, const int timeline_frame, const eSeqSplitMethod method)
Sequence * SEQ_edit_strip_split(Main *bmain, Scene *scene, ListBase *seqbase, Sequence *seq, const int timeline_frame, const eSeqSplitMethod method, const char **r_error)
static bool seq_edit_split_effect_inputs_intersect(const Scene *scene, const Sequence *seq, const int timeline_frame)
static bool seq_edit_split_intersect_check(const Scene *scene, const Sequence *seq, const int timeline_frame)
bool SEQ_edit_sequence_swap(Scene *scene, Sequence *seq_a, Sequence *seq_b, const char **r_error_str)
static void seq_split_set_right_hold_offset(Main *bmain, Scene *scene, Sequence *seq, int timeline_frame)
void SEQ_edit_sequence_name_set(Scene *scene, Sequence *seq, const char *new_name)
void SEQ_edit_remove_flagged_sequences(Scene *scene, ListBase *seqbase)
bool SEQ_edit_move_strip_to_meta(Scene *scene, Sequence *src_seq, Sequence *dst_seqm, const char **r_error_str)
static void seq_update_muting_recursive(ListBase *channels, ListBase *seqbasep, Sequence *metaseq, const bool mute)
void SEQ_edit_update_muting(Editing *ed)
static void sequencer_flag_users_for_removal(Scene *scene, ListBase *seqbase, Sequence *seq)
bool SEQ_exists_in_seqbase(const Sequence *seq, const ListBase *seqbase)
bool SEQ_relation_is_effect_of_strip(const Sequence *effect, const Sequence *input)
void SEQ_relations_invalidate_cache_preprocessed(Scene *scene, Sequence *seq)
int SEQ_time_strip_length_get(const Scene *scene, const Sequence *seq)
void SEQ_time_right_handle_frame_set(const Scene *scene, Sequence *seq, int timeline_frame)
void SEQ_time_left_handle_frame_set(const Scene *scene, Sequence *seq, int timeline_frame)
int SEQ_time_left_handle_frame_get(const Scene *, const Sequence *seq)
float SEQ_time_content_end_frame_get(const Scene *scene, const Sequence *seq)
void seq_time_gap_info_get(const Scene *scene, ListBase *seqbase, const int initial_frame, GapInfo *r_gap_info)
void seq_time_effect_range_set(const Scene *scene, Sequence *seq)
float SEQ_time_start_frame_get(const Sequence *seq)
float SEQ_time_media_playback_rate_factor_get(const Scene *scene, const Sequence *seq)
int SEQ_time_right_handle_frame_get(const Scene *scene, const Sequence *seq)