VSE: Implement sanity check for files with more channels than supported

This is a follow up to 8fecc2a852.

This makes sure future .blend files that have more channels than the
limit won't break Blender.

It can be backported to LTS.

This is part of https://developer.blender.org/D12645

Differential Revision: https://developer.blender.org/D12648
This commit is contained in:
Dalai Felinto 2021-09-27 15:05:23 +02:00
parent 7cd43a9d28
commit a64782b133
Notes: blender-bot 2024-04-11 14:26:06 +02:00
Referenced by issue #77348, Blender LTS: Maintenance Task 2.83
3 changed files with 19 additions and 2 deletions

View File

@ -63,6 +63,8 @@
#include "BLI_threads.h"
#include "BLI_utildefines.h"
#include "BLO_readfile.h"
#include "BLT_translation.h"
#include "BKE_action.h"
@ -993,8 +995,13 @@ static void link_recurs_seq(BlendDataReader *reader, ListBase *lb)
{
BLO_read_list(reader, lb);
LISTBASE_FOREACH (Sequence *, seq, lb) {
if (seq->seqbase.first) {
LISTBASE_FOREACH_MUTABLE (Sequence *, seq, lb) {
/* Sanity check. */
if ((seq->machine < 1) || (seq->machine > MAXSEQ)) {
BLI_freelinkN(lb, seq);
BLO_read_data_reports(reader)->count.vse_strips_skipped++;
}
else if (seq->seqbase.first) {
link_recurs_seq(reader, &seq->seqbase);
}
}

View File

@ -121,6 +121,8 @@ typedef struct BlendFileReadReport {
int proxies_to_lib_overrides_success;
/* Number of proxies that failed to convert to library overrides. */
int proxies_to_lib_overrides_failures;
/* Number of VSE strips that were not read because were in non-supported channels. */
int vse_strips_skipped;
} count;
/* Number of libraries which had overrides that needed to be resynced, and a single linked list

View File

@ -871,6 +871,14 @@ static void file_read_reports_finalize(BlendFileReadReport *bf_reports)
bf_reports->count.linked_proxies);
}
if (bf_reports->count.vse_strips_skipped != 0) {
BKE_reportf(bf_reports->reports,
RPT_ERROR,
"%d sequence strips were not read because they were in a channel larger than %d",
bf_reports->count.vse_strips_skipped,
MAXSEQ);
}
BLI_linklist_free(bf_reports->resynced_lib_overrides_libraries, NULL);
bf_reports->resynced_lib_overrides_libraries = NULL;
}