multicam: refactor to heavily optimize multicam monitor retrieval
This commit is contained in:
@@ -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();
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -111,6 +111,7 @@ RenderTicketPtr RenderManager::RenderFrame(const RenderVideoParams ¶ms)
|
||||
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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user