cache: improved invalidation system
This commit is contained in:
+2
-1
@@ -82,7 +82,8 @@ Core::Core(const CoreParams& params) :
|
||||
tool_(Tool::kPointer),
|
||||
addable_object_(Tool::kAddableEmpty),
|
||||
snapping_(true),
|
||||
core_params_(params)
|
||||
core_params_(params),
|
||||
effects_slider_is_being_dragged_(false)
|
||||
{
|
||||
// Store reference to this object, making the assumption that Core will only ever be made in
|
||||
// main(). This will obviously break if not.
|
||||
|
||||
@@ -304,6 +304,10 @@ public:
|
||||
|
||||
void OpenNodeInViewer(ViewerOutput* viewer);
|
||||
|
||||
bool EffectsSliderIsBeingDragged() const {return effects_slider_is_being_dragged_;}
|
||||
|
||||
void SetEffectsSliderIsBeingDragged(bool e) {effects_slider_is_being_dragged_ = e;}
|
||||
|
||||
static const uint kProjectVersion;
|
||||
|
||||
public slots:
|
||||
@@ -571,6 +575,11 @@ private:
|
||||
*/
|
||||
QVector<QUuid> autorecovered_projects_;
|
||||
|
||||
/**
|
||||
* @brief An effects slider somewhere is being dragged
|
||||
*/
|
||||
bool effects_slider_is_being_dragged_;
|
||||
|
||||
private slots:
|
||||
void SaveAutorecovery();
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include <QtConcurrent/QtConcurrent>
|
||||
|
||||
#include "codec/conformmanager.h"
|
||||
#include "core.h"
|
||||
#include "node/project/project.h"
|
||||
#include "render/rendermanager.h"
|
||||
#include "render/renderprocessor.h"
|
||||
@@ -14,12 +15,11 @@ PreviewAutoCacher::PreviewAutoCacher() :
|
||||
viewer_node_(nullptr),
|
||||
has_changed_(false),
|
||||
use_custom_range_(false),
|
||||
single_frame_render_(nullptr),
|
||||
ignore_next_mouse_button_(false)
|
||||
single_frame_render_(nullptr)
|
||||
{
|
||||
paused_ = !Config::Current()[QStringLiteral("AutoCacheEnabled")].toBool(),
|
||||
|
||||
SetPlayhead(0);
|
||||
SetPlayhead(0);
|
||||
|
||||
delayed_requeue_timer_.setInterval(Config::Current()[QStringLiteral("AutoCacheDelay")].toInt());
|
||||
delayed_requeue_timer_.setSingleShot(true);
|
||||
@@ -96,9 +96,7 @@ void PreviewAutoCacher::VideoInvalidated(const TimeRange &range)
|
||||
ClearVideoQueue();
|
||||
|
||||
// Hash these frames since that should be relatively quick.
|
||||
if (ignore_next_mouse_button_ || !(qApp->mouseButtons() & Qt::LeftButton)) {
|
||||
ignore_next_mouse_button_ = false;
|
||||
|
||||
if (!Core::instance()->EffectsSliderIsBeingDragged()) {
|
||||
invalidated_video_.insert(range);
|
||||
video_job_tracker_.insert(range, graph_changed_time_);
|
||||
|
||||
@@ -563,7 +561,7 @@ void PreviewAutoCacher::RequeueFrames()
|
||||
delayed_requeue_timer_.stop();
|
||||
|
||||
if (viewer_node_
|
||||
&& viewer_node_->video_frame_cache()->HasInvalidatedRanges()
|
||||
&& viewer_node_->video_frame_cache()->HasInvalidatedRanges(viewer_node_->GetVideoLength())
|
||||
&& hash_tasks_.isEmpty()
|
||||
&& has_changed_
|
||||
&& VideoParams::FormatIsFloat(viewer_node_->GetVideoParams().format())
|
||||
@@ -577,7 +575,7 @@ void PreviewAutoCacher::RequeueFrames()
|
||||
using_range = cache_range_;
|
||||
}
|
||||
|
||||
TimeRangeList invalidated = viewer_node_->video_frame_cache()->GetInvalidatedRanges().Intersects(using_range);
|
||||
TimeRangeList invalidated = viewer_node_->video_frame_cache()->GetInvalidatedRanges(using_range);
|
||||
queued_frame_iterator_ = TimeRangeListFrameIterator(invalidated, viewer_node_->video_frame_cache()->GetTimebase());
|
||||
|
||||
QueueNextFrameInRange(RenderManager::GetNumberOfIdealConcurrentJobs());
|
||||
@@ -598,11 +596,6 @@ void PreviewAutoCacher::ConformFinished()
|
||||
}
|
||||
}
|
||||
|
||||
void PreviewAutoCacher::IgnoreNextMouseButton()
|
||||
{
|
||||
ignore_next_mouse_button_ = true;
|
||||
}
|
||||
|
||||
void PreviewAutoCacher::ForceCacheRange(const TimeRange &range)
|
||||
{
|
||||
has_changed_ = true;
|
||||
@@ -690,6 +683,8 @@ void PreviewAutoCacher::SetViewerNode(ViewerOutput *viewer_node)
|
||||
|
||||
// Find copied viewer node
|
||||
copied_viewer_node_ = static_cast<ViewerOutput*>(copy_map_.value(viewer_node_));
|
||||
copied_viewer_node_->SetViewerVideoCacheEnabled(false);
|
||||
copied_viewer_node_->SetViewerAudioCacheEnabled(false);
|
||||
copied_color_manager_ = static_cast<ColorManager*>(copy_map_.value(viewer_node_->project()->color_manager()));
|
||||
|
||||
// Add all connections
|
||||
@@ -711,9 +706,9 @@ void PreviewAutoCacher::SetViewerNode(ViewerOutput *viewer_node)
|
||||
connect(graph, &NodeGraph::ValueChanged, this, &PreviewAutoCacher::ValueChanged);
|
||||
|
||||
// Copy invalidated ranges - used to determine which frames need hashing
|
||||
invalidated_video_ = viewer_node_->video_frame_cache()->GetInvalidatedRanges();
|
||||
invalidated_video_ = viewer_node_->video_frame_cache()->GetInvalidatedRanges(viewer_node_->GetVideoLength());
|
||||
video_job_tracker_.insert(invalidated_video_, graph_changed_time_);
|
||||
invalidated_audio_ = viewer_node_->audio_playback_cache()->GetInvalidatedRanges();
|
||||
invalidated_audio_ = viewer_node_->audio_playback_cache()->GetInvalidatedRanges(viewer_node_->GetAudioLength());
|
||||
audio_job_tracker_.insert(invalidated_audio_, graph_changed_time_);
|
||||
|
||||
connect(viewer_node_->video_frame_cache(),
|
||||
|
||||
@@ -34,16 +34,6 @@ public:
|
||||
*/
|
||||
void SetViewerNode(ViewerOutput *viewer_node);
|
||||
|
||||
/**
|
||||
* @brief If the mouse is held during the next cache invalidation, cache anyway
|
||||
*
|
||||
* By default, PreviewAutoCacher ignores invalidations that occur while the mouse is held down,
|
||||
* assuming that if the mouse is held, the user is dragging something. If you know the mouse will
|
||||
* be held during a certain action and want PreviewAutoCacher to cache anyway, call this before
|
||||
* the cache invalidates.
|
||||
*/
|
||||
void IgnoreNextMouseButton();
|
||||
|
||||
/**
|
||||
* @brief Returns whether the auto-cache is currently paused or not
|
||||
*/
|
||||
@@ -175,8 +165,6 @@ private:
|
||||
JobTime graph_changed_time_;
|
||||
JobTime last_update_time_;
|
||||
|
||||
bool ignore_next_mouse_button_;
|
||||
|
||||
QTimer delayed_requeue_timer_;
|
||||
|
||||
TimeRangeList audio_needing_conform_;
|
||||
|
||||
@@ -62,6 +62,11 @@ void NodeParamViewWidgetBridge::SetTime(const rational &time)
|
||||
}
|
||||
}
|
||||
|
||||
int GetSliderCount(NodeValue::Type type)
|
||||
{
|
||||
return NodeValue::get_number_of_keyframe_tracks(type);
|
||||
}
|
||||
|
||||
void NodeParamViewWidgetBridge::CreateWidgets()
|
||||
{
|
||||
if (input_.IsArray() && input_.element() == -1) {
|
||||
@@ -73,7 +78,8 @@ void NodeParamViewWidgetBridge::CreateWidgets()
|
||||
} else {
|
||||
|
||||
// We assume the first data type is the "primary" type
|
||||
switch (input_.GetDataType()) {
|
||||
NodeValue::Type t = input_.GetDataType();
|
||||
switch (t) {
|
||||
// None of these inputs have applicable UI widgets
|
||||
case NodeValue::kNone:
|
||||
case NodeValue::kTexture:
|
||||
@@ -89,29 +95,17 @@ void NodeParamViewWidgetBridge::CreateWidgets()
|
||||
CreateSliders<IntegerSlider>(1);
|
||||
break;
|
||||
}
|
||||
case NodeValue::kFloat:
|
||||
{
|
||||
CreateSliders<FloatSlider>(1);
|
||||
break;
|
||||
}
|
||||
case NodeValue::kRational:
|
||||
{
|
||||
CreateSliders<RationalSlider>(1);
|
||||
break;
|
||||
}
|
||||
case NodeValue::kFloat:
|
||||
case NodeValue::kVec2:
|
||||
{
|
||||
CreateSliders<FloatSlider>(2);
|
||||
break;
|
||||
}
|
||||
case NodeValue::kVec3:
|
||||
{
|
||||
CreateSliders<FloatSlider>(3);
|
||||
break;
|
||||
}
|
||||
case NodeValue::kVec4:
|
||||
{
|
||||
CreateSliders<FloatSlider>(4);
|
||||
CreateSliders<FloatSlider>(GetSliderCount(t));
|
||||
break;
|
||||
}
|
||||
case NodeValue::kCombo:
|
||||
@@ -410,6 +404,7 @@ void NodeParamViewWidgetBridge::CreateSliders(int count)
|
||||
T* fs = new T();
|
||||
fs->SliderBase::SetDefaultValue(input_.GetSplitDefaultValueForTrack(i));
|
||||
fs->SetLadderElementCount(2);
|
||||
fs->SetIsEffectsSlider(true);
|
||||
widgets_.append(fs);
|
||||
connect(fs, &T::ValueChanged, this, &NodeParamViewWidgetBridge::WidgetCallback);
|
||||
}
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
|
||||
#include "common/qtutils.h"
|
||||
#include "config/config.h"
|
||||
#include "core.h"
|
||||
|
||||
namespace olive {
|
||||
|
||||
@@ -34,7 +35,8 @@ NumericSliderBase::NumericSliderBase(QWidget *parent) :
|
||||
has_max_(false),
|
||||
dragged_diff_(0),
|
||||
drag_multiplier_(1.0),
|
||||
setting_drag_value_(false)
|
||||
setting_drag_value_(false),
|
||||
is_effects_slider_(false)
|
||||
{
|
||||
// Numeric sliders are draggable, so we have a cursor that indicates that
|
||||
setCursor(Qt::SizeHorCursor);
|
||||
@@ -60,6 +62,10 @@ void NumericSliderBase::LabelPressed()
|
||||
|
||||
connect(drag_ladder_, &SliderLadder::DraggedByValue, this, &NumericSliderBase::LadderDragged);
|
||||
connect(drag_ladder_, &SliderLadder::Released, this, &NumericSliderBase::LadderReleased);
|
||||
|
||||
if (is_effects_slider_) {
|
||||
Core::instance()->SetEffectsSliderIsBeingDragged(true);
|
||||
}
|
||||
}
|
||||
|
||||
void NumericSliderBase::LadderDragged(int value, double multiplier)
|
||||
@@ -90,6 +96,10 @@ void NumericSliderBase::LadderDragged(int value, double multiplier)
|
||||
|
||||
void NumericSliderBase::LadderReleased()
|
||||
{
|
||||
if (is_effects_slider_) {
|
||||
Core::instance()->SetEffectsSliderIsBeingDragged(false);
|
||||
}
|
||||
|
||||
drag_ladder_->deleteLater();
|
||||
drag_ladder_ = nullptr;
|
||||
dragged_diff_ = 0;
|
||||
|
||||
@@ -42,6 +42,8 @@ public:
|
||||
|
||||
bool IsDragging() const;
|
||||
|
||||
void SetIsEffectsSlider(bool e) {is_effects_slider_ = e;}
|
||||
|
||||
protected:
|
||||
const QVariant& GetOffset() const
|
||||
{
|
||||
@@ -87,6 +89,8 @@ private:
|
||||
|
||||
bool setting_drag_value_;
|
||||
|
||||
bool is_effects_slider_;
|
||||
|
||||
private slots:
|
||||
void LabelPressed();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user