diff --git a/app/render/previewautocacher.cpp b/app/render/previewautocacher.cpp index 81b6a46c4..cf66641c0 100644 --- a/app/render/previewautocacher.cpp +++ b/app/render/previewautocacher.cpp @@ -202,16 +202,8 @@ void PreviewAutoCacher::VideoRendered() // Assume that a "result" is a fully completed image and a non-result is a cancelled ticket if (watcher->HasResult()) { // Download frame in another thread - if (FramePtr frame = watcher->Get().value()) { - RenderTicketWatcher* w = new RenderTicketWatcher(); - w->setProperty("job", QVariant::fromValue(last_update_time_)); - w->setProperty("frame", QVariant::fromValue(frame)); - video_download_tasks_.insert(w, it.value()); - connect(w, &RenderTicketWatcher::Finished, this, &PreviewAutoCacher::VideoDownloaded); - w->SetTicket(RenderManager::instance()->SaveFrameToCache(viewer_node_->video_frame_cache(), - frame, - it.value(), - RenderTicketPriority::kHigh)); + if (watcher->GetTicket()->property("cached").toBool()) { + viewer_node_->video_frame_cache()->ValidateTime(it.value()); } } @@ -235,30 +227,6 @@ void PreviewAutoCacher::VideoRendered() delete watcher; } -void PreviewAutoCacher::VideoDownloaded() -{ - RenderTicketWatcher* watcher = static_cast(sender()); - - // If the task list doesn't contain this watcher, presumably it was cleared as a result of a - // viewer switch, so we'll completely ignore this watcher - if (video_download_tasks_.contains(watcher)) { - // Remove from task list - rational time = video_download_tasks_.take(watcher); - - // Assume that `true` is a completely successful frame save - if (watcher->Get().toBool()) { - viewer_node_->video_frame_cache()->ValidateTime(time); - } else { - qCritical() << "Failed to download video frame"; - } - - // No need to call TryRender here because it would not have been held up by a download task - // nor does the completion of this ticket automatically trigger another ticket - } - - delete watcher; -} - void PreviewAutoCacher::ProcessUpdateQueue() { // Iterate everything that happened to the graph and do the same thing on our end @@ -434,13 +402,6 @@ void PreviewAutoCacher::SetPlayhead(const rational &playhead) RequeueFrames(); } -void PreviewAutoCacher::WaitForVideoDownloadsToFinish() -{ - for (auto it=video_download_tasks_.cbegin(); it!=video_download_tasks_.cend(); it++) { - it.key()->WaitForFinished(); - } -} - template void CancelTasks(const T &task_list, bool and_wait) { @@ -563,7 +524,7 @@ void PreviewAutoCacher::TryRender() RenderTicketWatcher* render_task = video_tasks_.key(t); // We want this hash, if we're not already rendering, start render now - if (!render_task && !video_download_tasks_.key(t)) { + if (!render_task) { // Don't render any hash more than once RenderFrame(t, RenderTicketPriority::kNormal, false); } @@ -724,11 +685,6 @@ void PreviewAutoCacher::SetViewerNode(ViewerOutput *viewer_node) CancelAudioTasks(true); } - // Handle video download tasks - if (!video_download_tasks_.isEmpty()) { - WaitForVideoDownloadsToFinish(); - } - // Clear iterators queued_frame_iterator_.reset(); audio_iterator_.clear(); diff --git a/app/render/previewautocacher.h b/app/render/previewautocacher.h index 3dd54a9da..e2cc98ca9 100644 --- a/app/render/previewautocacher.h +++ b/app/render/previewautocacher.h @@ -73,8 +73,6 @@ public: */ void SetPlayhead(const rational& playhead); - void WaitForVideoDownloadsToFinish(); - /** * @brief Call cancel on all currently running video tasks * @@ -175,7 +173,6 @@ private: QMap audio_tasks_; QMap video_tasks_; - QMap video_download_tasks_; QMap > video_immediate_passthroughs_; JobTime graph_changed_time_; @@ -216,11 +213,6 @@ private slots: */ void VideoRendered(); - /** - * @brief Handler for when we've saved a video frame to the cache - */ - void VideoDownloaded(); - void NodeAdded(Node* node); void NodeRemoved(Node* node); diff --git a/app/render/rendermanager.cpp b/app/render/rendermanager.cpp index 6c595710e..13917ad9b 100644 --- a/app/render/rendermanager.cpp +++ b/app/render/rendermanager.cpp @@ -121,6 +121,8 @@ RenderTicketPtr RenderManager::RenderFrame(ViewerOutput *viewer, ColorManager* c if (cache) { ticket->setProperty("cache", cache->GetCacheDirectory()); + ticket->setProperty("cachetimebase", QVariant::fromValue(cache->GetTimebase())); + ticket->setProperty("cacheuuid", QVariant::fromValue(cache->GetUuid())); } AddTicket(ticket, priority); @@ -150,23 +152,6 @@ RenderTicketPtr RenderManager::RenderAudio(ViewerOutput* viewer, const TimeRange return ticket; } -RenderTicketPtr RenderManager::SaveFrameToCache(FrameHashCache *cache, FramePtr frame, const rational &time, RenderTicketPriority priority) -{ - // Create ticket - RenderTicketPtr ticket = std::make_shared(); - - ticket->setProperty("cache", cache->GetCacheDirectory()); - ticket->setProperty("frame", QVariant::fromValue(frame)); - ticket->setProperty("time", QVariant::fromValue(time)); - ticket->setProperty("timebase", QVariant::fromValue(cache->GetTimebase())); - ticket->setProperty("uuid", QVariant::fromValue(cache->GetUuid())); - ticket->setProperty("type", kTypeVideoDownload); - - AddTicket(ticket, priority); - - return ticket; -} - void RenderManager::RunTicket(RenderTicketPtr ticket) const { // Setup the ticket for ::Process diff --git a/app/render/rendermanager.h b/app/render/rendermanager.h index 98f4a01d4..8cea4b2cc 100644 --- a/app/render/rendermanager.h +++ b/app/render/rendermanager.h @@ -92,14 +92,11 @@ public: RenderTicketPtr RenderAudio(ViewerOutput* viewer, const TimeRange& r, const AudioParams& params, RenderMode::Mode mode, bool generate_waveforms, RenderTicketPriority priority = RenderTicketPriority::kNormal); RenderTicketPtr RenderAudio(ViewerOutput *viewer, const TimeRange& r, RenderMode::Mode mode, bool generate_waveforms, RenderTicketPriority priority = RenderTicketPriority::kNormal); - RenderTicketPtr SaveFrameToCache(FrameHashCache* cache, FramePtr frame, const rational &time, RenderTicketPriority priority = RenderTicketPriority::kNormal); - virtual void RunTicket(RenderTicketPtr ticket) const override; enum TicketType { kTypeVideo, - kTypeAudio, - kTypeVideoDownload + kTypeAudio }; Backend backend() const diff --git a/app/render/renderprocessor.cpp b/app/render/renderprocessor.cpp index ea9e5caba..6a519d870 100644 --- a/app/render/renderprocessor.cpp +++ b/app/render/renderprocessor.cpp @@ -182,6 +182,14 @@ void RenderProcessor::Run() // Convert to CPU frame FramePtr frame = GenerateFrame(texture, time); + 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); + } + ticket_->Finish(QVariant::fromValue(frame)); } break; @@ -215,17 +223,6 @@ void RenderProcessor::Run() } break; } - case RenderManager::kTypeVideoDownload: - { - QString cache = ticket_->property("cache").toString(); - FramePtr frame = ticket_->property("frame").value(); - rational time = ticket_->property("time").value(); - rational timebase = ticket_->property("timebase").value(); - QUuid uuid = ticket_->property("uuid").value(); - - ticket_->Finish(FrameHashCache::SaveCacheFrame(cache, uuid, time, timebase, frame)); - break; - } default: // Fail ticket_->Finish(); diff --git a/app/task/render/render.cpp b/app/task/render/render.cpp index 7c1f59ee2..46e4bf4f2 100644 --- a/app/task/render/render.cpp +++ b/app/task/render/render.cpp @@ -241,12 +241,12 @@ bool RenderTask::Render(ColorManager* manager, bool RenderTask::DownloadFrame(QThread *thread, FramePtr frame, const rational &time) { - RenderTicketWatcher* watcher = new RenderTicketWatcher(); - PrepareWatcher(watcher, thread); + //RenderTicketWatcher* watcher = new RenderTicketWatcher(); + //PrepareWatcher(watcher, thread); - IncrementRunningTickets(); + //IncrementRunningTickets(); - watcher->SetTicket(RenderManager::instance()->SaveFrameToCache(viewer_->video_frame_cache(), frame, time)); + //watcher->SetTicket(RenderManager::instance()->SaveFrameToCache(viewer_->video_frame_cache(), frame, time)); // NOTE: Doesn't reflect the actual return result of SaveFrameToCache return true;