diff --git a/app/render/previewautocacher.cpp b/app/render/previewautocacher.cpp index cf66641c0..ba2550963 100644 --- a/app/render/previewautocacher.cpp +++ b/app/render/previewautocacher.cpp @@ -26,7 +26,6 @@ #include "codec/conformmanager.h" #include "node/inputdragger.h" #include "node/project/project.h" -#include "render/rendermanager.h" #include "render/renderprocessor.h" #include "task/customcache/customcachetask.h" #include "task/taskmanager.h" @@ -509,7 +508,7 @@ void PreviewAutoCacher::TryRender() // Check if already caching this RenderTicketWatcher *watcher = RenderFrame(single_frame_render_->property("time").value(), RenderTicketPriority(single_frame_render_->property("priority").toInt()), - !viewer_node_->GetVideoAutoCacheEnabled()); + false); video_immediate_passthroughs_[watcher].append(single_frame_render_); single_frame_render_ = nullptr; @@ -526,7 +525,7 @@ void PreviewAutoCacher::TryRender() // We want this hash, if we're not already rendering, start render now if (!render_task) { // Don't render any hash more than once - RenderFrame(t, RenderTicketPriority::kNormal, false); + RenderFrame(t, RenderTicketPriority::kNormal, true); } emit SignalCacheProxyTaskProgress(double(queued_frame_iterator_.frame_index()) / double(queued_frame_iterator_.size())); @@ -552,7 +551,7 @@ void PreviewAutoCacher::TryRender() } } -RenderTicketWatcher* PreviewAutoCacher::RenderFrame(const rational& time, RenderTicketPriority priority, bool texture_only) +RenderTicketWatcher* PreviewAutoCacher::RenderFrame(const rational& time, RenderTicketPriority priority, bool cache) { RenderTicketWatcher* watcher = new RenderTicketWatcher(); watcher->setProperty("job", QVariant::fromValue(last_update_time_)); @@ -562,9 +561,9 @@ RenderTicketWatcher* PreviewAutoCacher::RenderFrame(const rational& time, Render copied_color_manager_, time, RenderMode::kOffline, - viewer_node_->video_frame_cache(), + cache ? viewer_node_->video_frame_cache() : nullptr, priority, - texture_only)); + RenderManager::kTexture)); return watcher; } diff --git a/app/render/previewautocacher.h b/app/render/previewautocacher.h index e2cc98ca9..2ce0b0fb4 100644 --- a/app/render/previewautocacher.h +++ b/app/render/previewautocacher.h @@ -32,6 +32,7 @@ #include "node/project/project.h" #include "render/audioparams.h" #include "render/renderjobtracker.h" +#include "render/rendermanager.h" #include "threading/threadpool.h" #include "threading/threadticketwatcher.h" @@ -99,7 +100,7 @@ signals: private: void TryRender(); - RenderTicketWatcher *RenderFrame(const rational &time, RenderTicketPriority priority, bool texture_only); + RenderTicketWatcher *RenderFrame(const rational &time, RenderTicketPriority priority, bool cache); RenderTicketPtr RenderAudio(const TimeRange &range, bool generate_waveforms, RenderTicketPriority priority); /** diff --git a/app/render/rendermanager.cpp b/app/render/rendermanager.cpp index 13917ad9b..3db71aa76 100644 --- a/app/render/rendermanager.cpp +++ b/app/render/rendermanager.cpp @@ -78,7 +78,7 @@ RenderManager::~RenderManager() RenderTicketPtr RenderManager::RenderFrame(ViewerOutput *viewer, ColorManager* color_manager, const rational& time, RenderMode::Mode mode, - FrameHashCache* cache, RenderTicketPriority priority, bool texture_only) + FrameHashCache* cache, RenderTicketPriority priority, ReturnType return_type) { return RenderFrame(viewer, color_manager, @@ -92,7 +92,7 @@ RenderTicketPtr RenderManager::RenderFrame(ViewerOutput *viewer, ColorManager* c nullptr, cache, priority, - texture_only); + return_type); } RenderTicketPtr RenderManager::RenderFrame(ViewerOutput *viewer, ColorManager* color_manager, @@ -101,7 +101,7 @@ RenderTicketPtr RenderManager::RenderFrame(ViewerOutput *viewer, ColorManager* c const QSize& force_size, const QMatrix4x4& force_matrix, VideoParams::Format force_format, ColorProcessorPtr force_color_output, - FrameHashCache* cache, RenderTicketPriority priority, bool texture_only) + FrameHashCache* cache, RenderTicketPriority priority, ReturnType return_type) { // Create ticket RenderTicketPtr ticket = std::make_shared(); @@ -117,7 +117,7 @@ RenderTicketPtr RenderManager::RenderFrame(ViewerOutput *viewer, ColorManager* c ticket->setProperty("coloroutput", QVariant::fromValue(force_color_output)); ticket->setProperty("vparam", QVariant::fromValue(video_params)); ticket->setProperty("aparam", QVariant::fromValue(audio_params)); - ticket->setProperty("textureonly", texture_only); + ticket->setProperty("return", return_type); if (cache) { ticket->setProperty("cache", cache->GetCacheDirectory()); diff --git a/app/render/rendermanager.h b/app/render/rendermanager.h index 8cea4b2cc..543bcbd19 100644 --- a/app/render/rendermanager.h +++ b/app/render/rendermanager.h @@ -63,6 +63,11 @@ public: return instance_; } + enum ReturnType { + kTexture, + kFrame + }; + /** * @brief Asynchronously generate a frame at a given time * @@ -73,14 +78,14 @@ public: */ RenderTicketPtr RenderFrame(ViewerOutput *viewer, ColorManager* color_manager, const rational& time, RenderMode::Mode mode, - FrameHashCache* cache = nullptr, RenderTicketPriority priority = RenderTicketPriority::kNormal, bool texture_only = false); + FrameHashCache* cache = nullptr, RenderTicketPriority priority = RenderTicketPriority::kNormal, ReturnType return_type = kFrame); RenderTicketPtr RenderFrame(ViewerOutput* viewer, ColorManager* color_manager, const rational& time, RenderMode::Mode mode, const VideoParams& video_params, const AudioParams& audio_params, const QSize& force_size, const QMatrix4x4& force_matrix, VideoParams::Format force_format, ColorProcessorPtr force_color_output, - FrameHashCache* cache = nullptr, RenderTicketPriority priority = RenderTicketPriority::kNormal, bool texture_only = false); + FrameHashCache* cache = nullptr, RenderTicketPriority priority = RenderTicketPriority::kNormal, ReturnType return_type = kFrame); /** * @brief Asynchronously generate a chunk of audio diff --git a/app/render/renderprocessor.cpp b/app/render/renderprocessor.cpp index 6a519d870..705e626d2 100644 --- a/app/render/renderprocessor.cpp +++ b/app/render/renderprocessor.cpp @@ -168,29 +168,38 @@ void RenderProcessor::Run() // Finish cancelled ticket with nothing since we can't guarantee the frame we generated // is actually "complete ticket_->Finish(); - } else if (ticket_->property("textureonly").toBool()) { - // Return GPU texture - if (!texture) { - texture = render_ctx_->CreateTexture(GetCacheVideoParams()); - render_ctx_->ClearDestination(texture.get()); - } - - render_ctx_->Flush(); - - ticket_->Finish(QVariant::fromValue(texture)); } else { - // Convert to CPU frame - FramePtr frame = GenerateFrame(texture, time); + RenderManager::ReturnType return_type = RenderManager::ReturnType(ticket_->property("return").toInt()); + FramePtr frame; QString cache = ticket_->property("cache").toString(); - if (!cache.isEmpty()) { - rational timebase = ticket_->property("cachetimebase").value(); - QUuid uuid = ticket_->property("cacheuuid").value(); - bool cache_result = FrameHashCache::SaveCacheFrame(cache, uuid, time, timebase, frame); - ticket_->setProperty("cached", cache_result); + + if (return_type == RenderManager::kFrame || !cache.isEmpty()) { + // Convert to CPU frame + frame = GenerateFrame(texture, time); + + // Save to cache if requested + if (!cache.isEmpty()) { + rational timebase = ticket_->property("cachetimebase").value(); + QUuid uuid = ticket_->property("cacheuuid").value(); + bool cache_result = FrameHashCache::SaveCacheFrame(cache, uuid, time, timebase, frame); + ticket_->setProperty("cached", cache_result); + } } - ticket_->Finish(QVariant::fromValue(frame)); + if (return_type == RenderManager::kTexture) { + // Return GPU texture + if (!texture) { + texture = render_ctx_->CreateTexture(GetCacheVideoParams()); + render_ctx_->ClearDestination(texture.get()); + } + + render_ctx_->Flush(); + + ticket_->Finish(QVariant::fromValue(texture)); + } else { + ticket_->Finish(QVariant::fromValue(frame)); + } } break; }