From a3c52cafaab0efa8e6b0bf794365000f906e5bbc Mon Sep 17 00:00:00 2001 From: itsmattkc <34096995+itsmattkc@users.noreply.github.com> Date: Tue, 3 May 2022 20:49:44 -0700 Subject: [PATCH] traverser: fixed regression regarding converting generated frames --- app/node/traverser.cpp | 15 +++++++++++++-- app/node/traverser.h | 2 ++ app/render/renderprocessor.cpp | 22 ++++++++-------------- app/render/renderprocessor.h | 2 ++ 4 files changed, 25 insertions(+), 16 deletions(-) diff --git a/app/node/traverser.cpp b/app/node/traverser.cpp index 7eb8087cf..bb914bb03 100644 --- a/app/node/traverser.cpp +++ b/app/node/traverser.cpp @@ -317,15 +317,26 @@ void NodeTraverser::ResolveJobs(NodeValue &val, const TimeRange &range) VideoParams tex_params = GetCacheVideoParams(); tex_params.set_channel_count(GetChannelCountFromJob(job)); + + VideoParams upload_params = tex_params; if (job.GetRequestedFormat() != VideoParams::kFormatInvalid) { - tex_params.set_format(job.GetRequestedFormat()); + upload_params.set_format(job.GetRequestedFormat()); } - TexturePtr tex = CreateTexture(tex_params); + TexturePtr tex = CreateTexture(upload_params); PreProcessRow(range, job.GetValues()); ProcessFrameGeneration(tex, val.source(), job); + if (!job.GetColorspace().isEmpty()) { + // Convert to reference space + TexturePtr dest = CreateTexture(tex_params); + + ConvertToReferenceSpace(dest, tex, job.GetColorspace()); + + tex = dest; + } + val.set_data(QVariant::fromValue(tex)); } else if (v.canConvert()) { diff --git a/app/node/traverser.h b/app/node/traverser.h index 9a48916a7..01a57ce29 100644 --- a/app/node/traverser.h +++ b/app/node/traverser.h @@ -92,6 +92,8 @@ protected: virtual void ProcessFrameGeneration(TexturePtr destination, const Node *node, const GenerateJob& job){} + virtual void ConvertToReferenceSpace(TexturePtr destination, TexturePtr source, const QString &input_cs){} + virtual TexturePtr CreateTexture(const VideoParams &p) { return CreateDummyTexture(p); diff --git a/app/render/renderprocessor.cpp b/app/render/renderprocessor.cpp index dce266726..cdb742d55 100644 --- a/app/render/renderprocessor.cpp +++ b/app/render/renderprocessor.cpp @@ -554,20 +554,7 @@ void RenderProcessor::ProcessFrameGeneration(TexturePtr destination, const Node node->GenerateFrame(frame, job); - if (job.GetColorspace().isEmpty()) { - // Just upload frame data straight to frame - destination->Upload(frame->data(), frame->linesize_pixels()); - } else { - // Convert to reference space - - // Upload to middle texture - TexturePtr mid = render_ctx_->CreateTexture(GetCacheVideoParams()); - mid->Upload(frame->data(), frame->linesize_pixels()); - - ColorManager* color_manager = Node::ValueToPtr(ticket_->property("colormanager")); - ColorProcessorPtr cp = ColorProcessor::Create(color_manager, job.GetColorspace(), color_manager->GetReferenceColorSpace()); - render_ctx_->BlitColorManaged(cp, mid, Renderer::kAlphaAssociated, destination.get()); - } + destination->Upload(frame->data(), frame->linesize_pixels()); } bool RenderProcessor::CanCacheFrames() @@ -575,4 +562,11 @@ bool RenderProcessor::CanCacheFrames() return ticket_->property("type").value() == RenderManager::kTypeVideo; } +void RenderProcessor::ConvertToReferenceSpace(TexturePtr destination, TexturePtr source, const QString &input_cs) +{ + ColorManager* color_manager = Node::ValueToPtr(ticket_->property("colormanager")); + ColorProcessorPtr cp = ColorProcessor::Create(color_manager, input_cs, color_manager->GetReferenceColorSpace()); + render_ctx_->BlitColorManaged(cp, source, Renderer::kAlphaAssociated, destination.get()); +} + } diff --git a/app/render/renderprocessor.h b/app/render/renderprocessor.h index d1172cf85..b39f2d7ff 100644 --- a/app/render/renderprocessor.h +++ b/app/render/renderprocessor.h @@ -66,6 +66,8 @@ protected: return SampleBuffer::CreateAllocated(params, sample_count); } + virtual void ConvertToReferenceSpace(TexturePtr destination, TexturePtr source, const QString &input_cs) override; + private: RenderProcessor(RenderTicketPtr ticket, Renderer* render_ctx, DecoderCache* decoder_cache, ShaderCache* shader_cache, QVariant default_shader);