multicam: refactor to heavily optimize multicam monitor retrieval

This commit is contained in:
itsmattkc
2022-09-29 17:50:09 -07:00
parent 63163ba23e
commit 6e183fe4be
25 changed files with 300 additions and 162 deletions
+8 -8
View File
@@ -43,7 +43,7 @@ PreviewAutoCacher::PreviewAutoCacher(QObject *parent) :
pause_renders_(false),
single_frame_render_(nullptr),
display_color_processor_(nullptr),
multicam_mode_(false),
multicam_(nullptr),
ignore_cache_requests_(false)
{
// Set defaults
@@ -216,6 +216,7 @@ void PreviewAutoCacher::VideoRendered()
QVector<RenderTicketPtr> tickets = video_immediate_passthroughs_.take(watcher);
foreach (RenderTicketPtr t, tickets) {
if (watcher->HasResult()) {
t->setProperty("multicam_output", watcher->GetTicket()->property("multicam_output"));
t->Finish(watcher->Get());
} else {
t->Finish();
@@ -288,13 +289,6 @@ void PreviewAutoCacher::AddNode(Node *node)
// Copy node
Node* copy = node->copy();
// Fairly hacky way of getting multicam nodes to produce a monitor rather than a single source
if (multicam_mode_) {
if (MultiCamNode *m = dynamic_cast<MultiCamNode*>(copy)) {
m->SetMonitorMode(true);
}
}
// Add to project
copy->setParent(&copied_project_);
@@ -742,6 +736,9 @@ RenderTicketWatcher* PreviewAutoCacher::RenderFrame(Node *node, const rational&
// Allow using cached images for this render job
rvp.use_cache = true;
// Multicam
rvp.multicam = static_cast<MultiCamNode*>(copy_map_.value(multicam_));
watcher->SetTicket(RenderManager::instance()->RenderFrame(rvp));
return watcher;
@@ -848,6 +845,9 @@ void PreviewAutoCacher::SetViewerNode(ViewerOutput *viewer_node)
video_cache_data_.clear();
audio_cache_data_.clear();
// Clear multicam reference
multicam_ = nullptr;
// Disconnect signals for future node additions/deletions
NodeGraph* graph = viewer_node_->parent();
+4 -2
View File
@@ -90,7 +90,8 @@ public:
void SetRendersPaused(bool e);
void SetMulticamMode(bool e) { multicam_mode_ = e; }
void SetMulticamNode(MultiCamNode *n) { multicam_ = n; }
void SetIgnoreCacheRequests(bool e) { ignore_cache_requests_ = e; }
public slots:
@@ -221,7 +222,8 @@ private:
ColorProcessorPtr display_color_processor_;
bool multicam_mode_;
MultiCamNode *multicam_;
bool ignore_cache_requests_;
private slots:
+1
View File
@@ -111,6 +111,7 @@ RenderTicketPtr RenderManager::RenderFrame(const RenderVideoParams &params)
ticket->setProperty("cache", params.cache_dir);
ticket->setProperty("cachetimebase", QVariant::fromValue(params.cache_timebase));
ticket->setProperty("cacheid", QVariant::fromValue(params.cache_id));
ticket->setProperty("multicam", Node::PtrToValue(params.multicam));
if (params.return_type == ReturnType::kNull) {
dry_run_thread_->AddTicket(ticket);
+2
View File
@@ -117,6 +117,7 @@ public:
force_size = QSize(0, 0);
force_channel_count = 0;
mode = m;
multicam = nullptr;
}
void AddCache(FrameHashCache *cache)
@@ -134,6 +135,7 @@ public:
bool use_cache;
ReturnType return_type;
RenderMode::Mode mode;
MultiCamNode *multicam;
QString cache_dir;
rational cache_timebase;
+24
View File
@@ -294,6 +294,30 @@ DecoderPtr RenderProcessor::ResolveDecoderFromInput(const QString& decoder_id, c
return dec;
}
NodeValueDatabase RenderProcessor::GenerateDatabase(const Node *node, const TimeRange &range)
{
NodeValueDatabase db = super::GenerateDatabase(node, range);
if (const MultiCamNode *multicam = dynamic_cast<const MultiCamNode*>(node)) {
if (Node::ValueToPtr<MultiCamNode>(ticket_->property("multicam")) == multicam) {
int sz = multicam->InputArraySize(multicam->kSourcesInput);
NodeValueTableArray arr;
QVector<TexturePtr> multicam_tex(sz);
for (int i=0; i<sz; i++) {
ProcessInputElement(arr, multicam, multicam->kSourcesInput, i, range);
NodeValue val = GenerateRowValueElement(multicam, multicam->kSourcesInput, i, &arr.at(i), range);
ResolveJobs(val);
multicam_tex[i] = val.toTexture();
}
ticket_->setProperty("multicam_output", QVariant::fromValue(multicam_tex));
}
}
return db;
}
void RenderProcessor::Process(RenderTicketPtr ticket, Renderer *render_ctx, DecoderCache *decoder_cache, ShaderCache *shader_cache)
{
RenderProcessor p(ticket, render_ctx, decoder_cache, shader_cache);
+2
View File
@@ -32,6 +32,8 @@ namespace olive {
class RenderProcessor : public NodeTraverser
{
public:
virtual NodeValueDatabase GenerateDatabase(const Node *node, const TimeRange &range) override;
static void Process(RenderTicketPtr ticket, Renderer* render_ctx, DecoderCache* decoder_cache, ShaderCache* shader_cache);
struct RenderedWaveform {