render: queue audio over time rather than all at once

This commit is contained in:
itsmattkc
2021-07-16 15:53:01 -07:00
parent 8f413d37f0
commit 710b931bbb
2 changed files with 34 additions and 14 deletions
+32 -14
View File
@@ -132,10 +132,7 @@ void PreviewAutoCacher::HashesProcessed()
}
}
if (hash_iterator_.HasNext()) {
// Launch next hashes
QueueNextHashTask();
} else {
if (!hash_iterator_.HasNext()) {
// Restart delayed requeue timer
delayed_requeue_timer_.stop();
delayed_requeue_timer_.start();
@@ -145,6 +142,9 @@ void PreviewAutoCacher::HashesProcessed()
// The cacher might be waiting for this job to finish
if (!graph_update_queue_.isEmpty()) {
TryRender();
} else if (hash_iterator_.HasNext()) {
// Launch next hashes
QueueNextHashTask();
}
delete watcher;
@@ -213,7 +213,9 @@ void PreviewAutoCacher::AudioRendered()
}
// The cacher might be waiting for this job to finish
if (!graph_update_queue_.isEmpty()) {
if (graph_update_queue_.isEmpty()) {
QueueNextAudioTask();
} else {
TryRender();
}
@@ -442,6 +444,8 @@ void PreviewAutoCacher::ClearVideoQueue(bool hard)
void PreviewAutoCacher::ClearAudioQueue(bool hard)
{
ClearQueueInternal(audio_tasks_, hard, &PreviewAutoCacher::AudioRendered);
audio_iterator_.clear();
}
void PreviewAutoCacher::ClearVideoDownloadQueue(bool hard)
@@ -503,16 +507,10 @@ void PreviewAutoCacher::TryRender()
}
if (!invalidated_audio_.isEmpty()) {
foreach (const TimeRange& range, invalidated_audio_) {
std::list<TimeRange> chunks = range.Split(30);
audio_iterator_ = invalidated_audio_;
foreach (const TimeRange& r, chunks) {
RenderTicketWatcher* watcher = new RenderTicketWatcher();
watcher->setProperty("job", QVariant::fromValue(last_update_time_));
connect(watcher, &RenderTicketWatcher::Finished, this, &PreviewAutoCacher::AudioRendered);
audio_tasks_.insert(watcher, r);
watcher->SetTicket(RenderManager::instance()->RenderAudio(copied_viewer_node_, r, RenderMode::kOffline, true));
}
for (int i=0; i<QThread::idealThreadCount(); i++) {
QueueNextAudioTask();
}
invalidated_audio_.clear();
@@ -799,6 +797,26 @@ void PreviewAutoCacher::QueueNextHashTask()
times));
}
void PreviewAutoCacher::QueueNextAudioTask()
{
if (!audio_iterator_.isEmpty()) {
// Copy first range in list
TimeRange r = audio_iterator_.first();
// Limit to 30 seconds (FIXME: Hardcoded)
r.set_out(qMin(r.out(), r.in() + 30));
// Start job
RenderTicketWatcher* watcher = new RenderTicketWatcher();
watcher->setProperty("job", QVariant::fromValue(last_update_time_));
connect(watcher, &RenderTicketWatcher::Finished, this, &PreviewAutoCacher::AudioRendered);
audio_tasks_.insert(watcher, r);
watcher->SetTicket(RenderManager::instance()->RenderAudio(copied_viewer_node_, r, RenderMode::kOffline, false));
audio_iterator_.remove(r);
}
}
template<typename T, typename Func>
void PreviewAutoCacher::ClearQueueInternal(T& list, bool hard, Func member)
{
+2
View File
@@ -107,6 +107,7 @@ private:
void QueueNextFrameInRange(int max);
void QueueNextHashTask();
void QueueNextAudioTask();
struct HashData {
rational time;
@@ -176,6 +177,7 @@ private:
TimeRangeListFrameIterator queued_frame_iterator_;
TimeRangeListFrameIterator hash_iterator_;
TimeRangeList audio_iterator_;
private slots:
/**