diff options
Diffstat (limited to 'source/blender/sequencer/intern/image_cache.c')
-rw-r--r-- | source/blender/sequencer/intern/image_cache.c | 46 |
1 files changed, 24 insertions, 22 deletions
diff --git a/source/blender/sequencer/intern/image_cache.c b/source/blender/sequencer/intern/image_cache.c index e1ff0ff64b3..53f076c9681 100644 --- a/source/blender/sequencer/intern/image_cache.c +++ b/source/blender/sequencer/intern/image_cache.c @@ -36,6 +36,7 @@ #include "SEQ_prefetch.h" #include "SEQ_relations.h" #include "SEQ_sequencer.h" +#include "SEQ_time.h" #include "disk_cache.h" #include "image_cache.h" @@ -132,21 +133,24 @@ static bool seq_cache_hashcmp(const void *a_, const void *b_) seq_cmp_render_data(&a->context, &b->context)); } -static float seq_cache_timeline_frame_to_frame_index(Sequence *seq, float timeline_frame, int type) +static float seq_cache_timeline_frame_to_frame_index(Scene *scene, + Sequence *seq, + float timeline_frame, + int type) { /* With raw images, map timeline_frame to strip input media frame range. This means that static * images or extended frame range of movies will only generate one cache entry. No special * treatment in converting frame index to timeline_frame is needed. */ if (ELEM(type, SEQ_CACHE_STORE_RAW, SEQ_CACHE_STORE_THUMBNAIL)) { - return seq_give_frame_index(seq, timeline_frame); + return seq_give_frame_index(scene, seq, timeline_frame); } - return timeline_frame - seq->start; + return timeline_frame - SEQ_time_start_frame_get(seq); } float seq_cache_frame_index_to_timeline_frame(Sequence *seq, float frame_index) { - return frame_index + seq->start; + return frame_index + SEQ_time_start_frame_get(seq); } static SeqCache *seq_cache_get_from_scene(Scene *scene) @@ -517,7 +521,8 @@ static void seq_cache_populate_key(SeqCacheKey *key, key->cache_owner = seq_cache_get_from_scene(context->scene); key->seq = seq; key->context = *context; - key->frame_index = seq_cache_timeline_frame_to_frame_index(seq, timeline_frame, type); + key->frame_index = seq_cache_timeline_frame_to_frame_index( + context->scene, seq, timeline_frame, type); key->timeline_frame = timeline_frame; key->type = type; key->link_prev = NULL; @@ -557,9 +562,10 @@ void seq_cache_free_temp_cache(Scene *scene, short id, int timeline_frame) if (key->is_temp_cache && key->task_id == id && key->type != SEQ_CACHE_STORE_THUMBNAIL) { /* Use frame_index here to avoid freeing raw images if they are used for multiple frames. */ float frame_index = seq_cache_timeline_frame_to_frame_index( - key->seq, timeline_frame, key->type); - if (frame_index != key->frame_index || timeline_frame > key->seq->enddisp || - timeline_frame < key->seq->startdisp) { + scene, key->seq, timeline_frame, key->type); + if (frame_index != key->frame_index || + timeline_frame > SEQ_time_right_handle_frame_get(scene, key->seq) || + timeline_frame < SEQ_time_left_handle_frame_get(scene, key->seq)) { BLI_ghash_remove(cache->hash, key, seq_cache_keyfree, seq_cache_valfree); } } @@ -634,17 +640,12 @@ void seq_cache_cleanup_sequence(Scene *scene, seq_cache_lock(scene); - int range_start = seq_changed->startdisp; - int range_end = seq_changed->enddisp; + int range_start = SEQ_time_left_handle_frame_get(scene, seq_changed); + int range_end = SEQ_time_right_handle_frame_get(scene, seq_changed); if (!force_seq_changed_range) { - if (seq->startdisp > range_start) { - range_start = seq->startdisp; - } - - if (seq->enddisp < range_end) { - range_end = seq->enddisp; - } + range_start = max_ii(range_start, SEQ_time_left_handle_frame_get(scene, seq)); + range_end = min_ii(range_end, SEQ_time_right_handle_frame_get(scene, seq)); } int invalidate_composite = invalidate_types & SEQ_CACHE_STORE_FINAL_OUT; @@ -668,8 +669,8 @@ void seq_cache_cleanup_sequence(Scene *scene, } if (key->type & invalidate_source && key->seq == seq && - key->timeline_frame >= seq_changed->startdisp && - key->timeline_frame <= seq_changed->enddisp) { + key->timeline_frame >= SEQ_time_left_handle_frame_get(scene, seq_changed) && + key->timeline_frame <= SEQ_time_right_handle_frame_get(scene, seq_changed)) { if (key->link_next || key->link_prev) { seq_cache_relink_keys(key->link_next, key->link_prev); } @@ -700,11 +701,12 @@ void seq_cache_thumbnail_cleanup(Scene *scene, rctf *view_area_safe) SeqCacheKey *key = BLI_ghashIterator_getKey(&gh_iter); BLI_ghashIterator_step(&gh_iter); - const int frame_index = key->timeline_frame - key->seq->startdisp; - const int frame_step = SEQ_render_thumbnails_guaranteed_set_frame_step_get(key->seq); + const int frame_index = key->timeline_frame - SEQ_time_left_handle_frame_get(scene, key->seq); + const int frame_step = SEQ_render_thumbnails_guaranteed_set_frame_step_get(scene, key->seq); const int relative_base_frame = round_fl_to_int((frame_index / (float)frame_step)) * frame_step; - const int nearest_guaranted_absolute_frame = relative_base_frame + key->seq->startdisp; + const int nearest_guaranted_absolute_frame = relative_base_frame + + SEQ_time_left_handle_frame_get(scene, key->seq); if (nearest_guaranted_absolute_frame == key->timeline_frame) { continue; |