moved frame cache saving to our custom thread pool so we can control the priority

This commit is contained in:
itsmattkc
2020-10-29 03:12:04 +11:00
parent 84a1ec0ca3
commit 26e351d363
4 changed files with 50 additions and 13 deletions
+32
View File
@@ -98,6 +98,24 @@ RenderTicketPtr RenderManager::RenderAudio(ViewerOutput* viewer, const TimeRange
return ticket;
}
RenderTicketPtr RenderManager::SaveFrameToCache(FrameHashCache *cache, FramePtr frame, const QByteArray &hash, bool prioritize)
{
// Create ticket
RenderTicketPtr ticket = std::make_shared<RenderTicket>();
ticket->setProperty("cache", Node::PtrToValue(cache));
ticket->setProperty("frame", QVariant::fromValue(frame));
ticket->setProperty("hash", hash);
ticket->setProperty("type", kTypeVideoDownload);
// Queue appending the ticket and running the next job on our thread to make this function thread-safe
QMetaObject::invokeMethod(this, "AddTicket", Qt::AutoConnection,
OLIVE_NS_ARG(RenderTicketPtr, ticket),
Q_ARG(bool, prioritize));
return ticket;
}
void RenderManager::RunTicket(RenderTicketPtr ticket) const
{
// Depending on the render ticket type, start a job
@@ -110,6 +128,9 @@ void RenderManager::RunTicket(RenderTicketPtr ticket) const
case kTypeAudio:
RenderAudioInternal(ticket);
break;
case kTypeVideoDownload:
SaveFrameToCacheInternal(ticket);
break;
default:
// Fail
ticket->Cancel();
@@ -144,6 +165,17 @@ void RenderManager::RenderAudioInternal(RenderTicketPtr ticket)
ticket->Finish(QVariant::fromValue(SampleBuffer::CreateAllocated(viewer->audio_params(), time.length())), false);
}
void RenderManager::SaveFrameToCacheInternal(RenderTicketPtr ticket)
{
FrameHashCache* cache = Node::ValueToPtr<FrameHashCache>(ticket->property("cache"));
FramePtr frame = ticket->property("frame").value<FramePtr>();
QByteArray hash = ticket->property("hash").toByteArray();
ticket->Start();
ticket->Finish(cache->SaveCacheFrame(hash, frame), false);
}
void RenderManager::WorkerGeneratedWaveform(RenderTicketPtr ticket, TrackOutput *track, AudioVisualWaveform samples, TimeRange range)
{
ViewerOutput* viewer = Node::ValueToPtr<ViewerOutput>(ticket->property("viewer"));