From 9d154e19099b6bc0a54f3e23a0d5e5129f4a25f9 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 17 Nov 2019 13:44:50 +0900 Subject: [PATCH] use different signals when the audio invalidates vs the video Both audio and video renderers were working off the same invalidation signal (i.e. changing audio would also trigger a re-render of the video). This is obviously suboptimal and now they are separate. --- app/node/output/viewer/viewer.cpp | 8 +++++++- app/node/output/viewer/viewer.h | 6 +++++- app/render/backend/audiorenderbackend.cpp | 15 ++++++++++----- app/render/backend/audiorenderbackend.h | 4 +++- app/render/backend/renderbackend.cpp | 13 ++++++++----- app/render/backend/renderbackend.h | 3 ++- app/render/backend/videorenderbackend.cpp | 15 ++++++++++----- app/render/backend/videorenderbackend.h | 4 +++- 8 files changed, 48 insertions(+), 20 deletions(-) diff --git a/app/node/output/viewer/viewer.cpp b/app/node/output/viewer/viewer.cpp index 5ad6c07e1..823c2fac7 100644 --- a/app/node/output/viewer/viewer.cpp +++ b/app/node/output/viewer/viewer.cpp @@ -74,7 +74,13 @@ void ViewerOutput::InvalidateCache(const rational &start_range, const rational & { Node::InvalidateCache(start_range, end_range, from); - emit TextureChangedBetween(start_range, end_range); + if (from == texture_input()) { + emit VideoChangedBetween(start_range, end_range); + } else if (from == samples_input()) { + emit AudioChangedBetween(start_range, end_range); + } else if (from == length_input()) { + emit LengthChanged(Length()); + } SendInvalidateCache(start_range, end_range); } diff --git a/app/node/output/viewer/viewer.h b/app/node/output/viewer/viewer.h index 44aaddd21..000ec1df3 100644 --- a/app/node/output/viewer/viewer.h +++ b/app/node/output/viewer/viewer.h @@ -58,7 +58,11 @@ public: signals: void TimebaseChanged(const rational&); - void TextureChangedBetween(const rational&, const rational&); + void VideoChangedBetween(const rational&, const rational&); + + void AudioChangedBetween(const rational&, const rational&); + + void LengthChanged(const rational& length); void SizeChanged(int width, int height); diff --git a/app/render/backend/audiorenderbackend.cpp b/app/render/backend/audiorenderbackend.cpp index caa452b71..044ae8000 100644 --- a/app/render/backend/audiorenderbackend.cpp +++ b/app/render/backend/audiorenderbackend.cpp @@ -44,12 +44,17 @@ void AudioRenderBackend::InvalidateCache(const rational &start_range, const rati CacheNext(); } -void AudioRenderBackend::ViewerNodeChangedEvent(ViewerOutput *node) +void AudioRenderBackend::ConnectViewer(ViewerOutput *node) { - if (node != nullptr) { - // FIXME: Hardcoded format - SetParameters(AudioRenderingParams(node->audio_params(), SAMPLE_FMT_FLT)); - } + connect(node, SIGNAL(AudioChangedBetween(const rational&, const rational&)), this, SLOT(InvalidateCache(const rational&, const rational&))); + + // FIXME: Hardcoded format + SetParameters(AudioRenderingParams(node->audio_params(), SAMPLE_FMT_FLT)); +} + +void AudioRenderBackend::DisconnectViewer(ViewerOutput *node) +{ + disconnect(node, SIGNAL(AudioChangedBetween(const rational&, const rational&)), this, SLOT(InvalidateCache(const rational&, const rational&))); } bool AudioRenderBackend::GenerateCacheIDInternal(QCryptographicHash &hash) diff --git a/app/render/backend/audiorenderbackend.h b/app/render/backend/audiorenderbackend.h index aee5b83b5..2270921f0 100644 --- a/app/render/backend/audiorenderbackend.h +++ b/app/render/backend/audiorenderbackend.h @@ -26,7 +26,9 @@ public slots: virtual void InvalidateCache(const rational &start_range, const rational &end_range) override; protected: - virtual void ViewerNodeChangedEvent(ViewerOutput* node) override; + virtual void ConnectViewer(ViewerOutput* node) override; + + virtual void DisconnectViewer(ViewerOutput* node) override; /** * @brief Internal function for generating the cache ID diff --git a/app/render/backend/renderbackend.cpp b/app/render/backend/renderbackend.cpp index 9efbd62a3..edad69b9e 100644 --- a/app/render/backend/renderbackend.cpp +++ b/app/render/backend/renderbackend.cpp @@ -72,7 +72,7 @@ const QString &RenderBackend::GetError() const void RenderBackend::SetViewerNode(ViewerOutput *viewer_node) { if (viewer_node_ != nullptr) { - disconnect(viewer_node_, SIGNAL(TextureChangedBetween(const rational&, const rational&)), this, SLOT(InvalidateCache(const rational&, const rational&))); + DisconnectViewer(viewer_node_); Decompile(); } @@ -80,10 +80,8 @@ void RenderBackend::SetViewerNode(ViewerOutput *viewer_node) viewer_node_ = viewer_node; if (viewer_node_ != nullptr) { - connect(viewer_node_, SIGNAL(TextureChangedBetween(const rational&, const rational&)), this, SLOT(InvalidateCache(const rational&, const rational&))); + ConnectViewer(viewer_node_); } - - ViewerNodeChangedEvent(viewer_node_); } void RenderBackend::SetCacheName(const QString &s) @@ -148,7 +146,12 @@ void RenderBackend::SetError(const QString &error) error_ = error; } -void RenderBackend::ViewerNodeChangedEvent(ViewerOutput *node) +void RenderBackend::ConnectViewer(ViewerOutput *node) +{ + Q_UNUSED(node) +} + +void RenderBackend::DisconnectViewer(ViewerOutput *node) { Q_UNUSED(node) } diff --git a/app/render/backend/renderbackend.h b/app/render/backend/renderbackend.h index 6d928c10d..16dcbb517 100644 --- a/app/render/backend/renderbackend.h +++ b/app/render/backend/renderbackend.h @@ -56,7 +56,8 @@ protected: void SetError(const QString& error); - virtual void ViewerNodeChangedEvent(ViewerOutput* node); + virtual void ConnectViewer(ViewerOutput* node); + virtual void DisconnectViewer(ViewerOutput* node); /** * @brief Function called when there are frames in the queue to cache diff --git a/app/render/backend/videorenderbackend.cpp b/app/render/backend/videorenderbackend.cpp index 905e1a970..9849055d0 100644 --- a/app/render/backend/videorenderbackend.cpp +++ b/app/render/backend/videorenderbackend.cpp @@ -112,12 +112,17 @@ void VideoRenderBackend::CloseInternal() cache_frame_load_buffer_.clear(); } -void VideoRenderBackend::ViewerNodeChangedEvent(ViewerOutput *node) +void VideoRenderBackend::ConnectViewer(ViewerOutput *node) { - if (node != nullptr) { - // FIXME: Hardcoded format, mode, and divider - SetParameters(VideoRenderingParams(node->video_params(), olive::PIX_FMT_RGBA16F, olive::kOffline, 2)); - } + connect(node, SIGNAL(VideoChangedBetween(const rational&, const rational&)), this, SLOT(InvalidateCache(const rational&, const rational&))); + + // FIXME: Hardcoded format, mode, and divider + SetParameters(VideoRenderingParams(node->video_params(), olive::PIX_FMT_RGBA16F, olive::kOffline, 2)); +} + +void VideoRenderBackend::DisconnectViewer(ViewerOutput *node) +{ + disconnect(node, SIGNAL(VideoChangedBetween(const rational&, const rational&)), this, SLOT(InvalidateCache(const rational&, const rational&))); } const VideoRenderingParams &VideoRenderBackend::params() const diff --git a/app/render/backend/videorenderbackend.h b/app/render/backend/videorenderbackend.h index 5d61273e7..6a642c785 100644 --- a/app/render/backend/videorenderbackend.h +++ b/app/render/backend/videorenderbackend.h @@ -71,7 +71,9 @@ protected: QByteArray hash; }; - virtual void ViewerNodeChangedEvent(ViewerOutput* node) override; + virtual void ConnectViewer(ViewerOutput* node) override; + + virtual void DisconnectViewer(ViewerOutput* node) override; const char *GetCachedFrame(const rational& time);