Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Antalik <richardantalik@gmail.com>2020-05-13 00:19:00 +0300
committerRichard Antalik <richardantalik@gmail.com>2020-05-13 00:19:00 +0300
commit613715a994ab6d7ceeaf4c5005057f7ba6f530d1 (patch)
treefb5ad25a0ac69f8be3b8a94db3bacab2539c5360
parent5873bd82da4391f69ee16a8b404a8278c8caa59c (diff)
parentbe69f23b687ac0698fb95a28d007ee2e6b1b4eb5 (diff)
Merge branch 'blender-v2.83-release'
-rw-r--r--source/blender/blenkernel/BKE_sequencer.h4
-rw-r--r--source/blender/blenkernel/intern/seqprefetch.c65
-rw-r--r--source/blender/blenkernel/intern/sequencer.c9
3 files changed, 75 insertions, 3 deletions
diff --git a/source/blender/blenkernel/BKE_sequencer.h b/source/blender/blenkernel/BKE_sequencer.h
index cf3061248f5..58154006513 100644
--- a/source/blender/blenkernel/BKE_sequencer.h
+++ b/source/blender/blenkernel/BKE_sequencer.h
@@ -286,6 +286,10 @@ void BKE_sequence_reload_new_file(struct Main *bmain,
struct Sequence *seq,
const bool lock_range);
int BKE_sequencer_evaluate_frame(struct Scene *scene, int cfra);
+int BKE_sequencer_get_shown_sequences(struct ListBase *seqbasep,
+ int cfra,
+ int chanshown,
+ struct Sequence **seq_arr_out);
struct StripElem *BKE_sequencer_give_stripelem(struct Sequence *seq, int cfra);
diff --git a/source/blender/blenkernel/intern/seqprefetch.c b/source/blender/blenkernel/intern/seqprefetch.c
index 1425bff48a8..d87c2e1d898 100644
--- a/source/blender/blenkernel/intern/seqprefetch.c
+++ b/source/blender/blenkernel/intern/seqprefetch.c
@@ -334,6 +334,66 @@ void BKE_sequencer_prefetch_free(Scene *scene)
scene->ed->prefetch_job = NULL;
}
+static bool seq_prefetch_do_skip_frame(Scene *scene)
+{
+ Editing *ed = scene->ed;
+ PrefetchJob *pfjob = seq_prefetch_job_get(scene);
+ float cfra = pfjob->cfra + pfjob->num_frames_prefetched;
+ Sequence *seq_arr[MAXSEQ + 1];
+ int count = BKE_sequencer_get_shown_sequences(ed->seqbasep, cfra, 0, seq_arr);
+ SeqRenderData *ctx = &pfjob->context_cpy;
+ ImBuf *ibuf = NULL;
+
+ /* Disable prefetching 3D scene strips, but check for disk cache. */
+ for (int i = 0; i < count; i++) {
+ if (seq_arr[i]->type == SEQ_TYPE_SCENE && (seq_arr[i]->flag & SEQ_SCENE_STRIPS) == 0) {
+ int cached_types = 0;
+
+ ibuf = BKE_sequencer_cache_get(ctx, seq_arr[i], cfra, SEQ_CACHE_STORE_FINAL_OUT, false);
+ if (ibuf != NULL) {
+ cached_types |= SEQ_CACHE_STORE_FINAL_OUT;
+ IMB_freeImBuf(ibuf);
+ ibuf = NULL;
+ }
+
+ ibuf = BKE_sequencer_cache_get(ctx, seq_arr[i], cfra, SEQ_CACHE_STORE_FINAL_OUT, false);
+ if (ibuf != NULL) {
+ cached_types |= SEQ_CACHE_STORE_COMPOSITE;
+ IMB_freeImBuf(ibuf);
+ ibuf = NULL;
+ }
+
+ ibuf = BKE_sequencer_cache_get(ctx, seq_arr[i], cfra, SEQ_CACHE_STORE_PREPROCESSED, false);
+ if (ibuf != NULL) {
+ cached_types |= SEQ_CACHE_STORE_PREPROCESSED;
+ IMB_freeImBuf(ibuf);
+ ibuf = NULL;
+ }
+
+ ibuf = BKE_sequencer_cache_get(ctx, seq_arr[i], cfra, SEQ_CACHE_STORE_RAW, false);
+ if (ibuf != NULL) {
+ cached_types |= SEQ_CACHE_STORE_RAW;
+ IMB_freeImBuf(ibuf);
+ ibuf = NULL;
+ }
+
+ if ((cached_types & (SEQ_CACHE_STORE_RAW | SEQ_CACHE_STORE_PREPROCESSED)) != 0) {
+ continue;
+ }
+
+ /* It is only safe to use these cache types if strip is last in stack. */
+ if (i == count - 1 &&
+ (cached_types & (SEQ_CACHE_STORE_PREPROCESSED | SEQ_CACHE_STORE_RAW)) != 0) {
+ continue;
+ }
+
+ return true;
+ }
+ }
+
+ return false;
+}
+
static void *seq_prefetch_frames(void *job)
{
PrefetchJob *pfjob = (PrefetchJob *)job;
@@ -357,6 +417,11 @@ static void *seq_prefetch_frames(void *job)
*/
pfjob->scene_eval->ed->prefetch_job = pfjob;
+ if (seq_prefetch_do_skip_frame(pfjob->scene)) {
+ pfjob->num_frames_prefetched++;
+ continue;
+ }
+
ImBuf *ibuf = BKE_sequencer_give_ibuf(
&pfjob->context_cpy, pfjob->cfra + pfjob->num_frames_prefetched, 0);
BKE_sequencer_cache_free_temp_cache(
diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c
index 16a86fedc51..a14db79ffc6 100644
--- a/source/blender/blenkernel/intern/sequencer.c
+++ b/source/blender/blenkernel/intern/sequencer.c
@@ -1538,7 +1538,10 @@ static bool video_seq_is_rendered(Sequence *seq)
return (seq && !(seq->flag & SEQ_MUTE) && seq->type != SEQ_TYPE_SOUND_RAM);
}
-static int get_shown_sequences(ListBase *seqbasep, int cfra, int chanshown, Sequence **seq_arr_out)
+int BKE_sequencer_get_shown_sequences(ListBase *seqbasep,
+ int cfra,
+ int chanshown,
+ Sequence **seq_arr_out)
{
Sequence *seq_arr[MAXSEQ + 1];
int b = chanshown;
@@ -3964,7 +3967,7 @@ static ImBuf *seq_render_strip_stack(const SeqRenderData *context,
ImBuf *out = NULL;
clock_t begin;
- count = get_shown_sequences(seqbasep, cfra, chanshown, (Sequence **)&seq_arr);
+ count = BKE_sequencer_get_shown_sequences(seqbasep, cfra, chanshown, (Sequence **)&seq_arr);
if (count == 0) {
return NULL;
@@ -4072,7 +4075,7 @@ ImBuf *BKE_sequencer_give_ibuf(const SeqRenderData *context, float cfra, int cha
Sequence *seq_arr[MAXSEQ + 1];
int count;
- count = get_shown_sequences(seqbasep, cfra, chanshown, seq_arr);
+ count = BKE_sequencer_get_shown_sequences(seqbasep, cfra, chanshown, seq_arr);
if (count) {
out = BKE_sequencer_cache_get(