Caused by checking if strip frame index falls into a range instead of
timeline frame. This was introduced in 6a39d79967 and was incorrect
solution to the issue.
Cache key had `timeline_frame` field, which was removed, because it is
not updated when strip moves. The value is now calculated from frame
index.
The issue was not very noticable especially when working with larger
strips, but the behavior was incorrect and confused me when working on
cache related features.
Pull Request: https://projects.blender.org/blender/blender/pulls/137583
57 lines
1.8 KiB
C++
57 lines
1.8 KiB
C++
/* SPDX-FileCopyrightText: 2004 Blender Authors
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
|
|
#pragma once
|
|
|
|
/** \file
|
|
* \ingroup sequencer
|
|
*/
|
|
|
|
#include "SEQ_render.hh" /* Needed for #eSeqTaskId. */
|
|
|
|
struct ImBuf;
|
|
struct Scene;
|
|
struct SeqRenderData;
|
|
struct Strip;
|
|
|
|
namespace blender::seq {
|
|
|
|
struct SeqCache;
|
|
|
|
struct SeqCacheKey {
|
|
SeqCache *cache_owner;
|
|
void *userkey;
|
|
SeqCacheKey *link_prev; /* Used for linking intermediate items to final frame. */
|
|
SeqCacheKey *link_next; /* Used for linking intermediate items to final frame. */
|
|
Strip *strip;
|
|
RenderData context;
|
|
float frame_index; /* Usually same as timeline_frame. Mapped to media for RAW entries. */
|
|
float cost; /* In short: render time(s) divided by playback frame duration(s) */
|
|
bool is_temp_cache; /* this cache entry will be freed before rendering next frame */
|
|
/* ID of task for assigning temp cache entries to particular task(thread, etc.) */
|
|
eTaskId task_id;
|
|
int type;
|
|
};
|
|
|
|
ImBuf *seq_cache_get(const RenderData *context, Strip *strip, float timeline_frame, int type);
|
|
void seq_cache_put(
|
|
const RenderData *context, Strip *strip, float timeline_frame, int type, ImBuf *i);
|
|
bool seq_cache_put_if_possible(
|
|
const RenderData *context, Strip *strip, float timeline_frame, int type, ImBuf *ibuf);
|
|
/**
|
|
* Find only "base" keys.
|
|
* Sources(other types) for a frame must be freed all at once.
|
|
*/
|
|
bool seq_cache_recycle_item(Scene *scene);
|
|
void seq_cache_free_temp_cache(Scene *scene, short id, int timeline_frame);
|
|
void seq_cache_destruct(Scene *scene);
|
|
void seq_cache_cleanup_sequence(Scene *scene,
|
|
Strip *strip,
|
|
Strip *strip_changed,
|
|
int invalidate_types,
|
|
bool force_seq_changed_range);
|
|
bool seq_cache_is_full();
|
|
|
|
} // namespace blender::seq
|