Loading...
Searching...
No Matches
VideoNodeRenderer.hpp
1#pragma once
2#include <Gfx/Graph/NodeRenderer.hpp>
3#include <Gfx/Graph/VideoNode.hpp>
4#include <Video/VideoInterface.hpp>
5
6namespace score::gfx
7{
8class GPUVideoDecoder;
9
11{
12public:
13 explicit VideoNodeRenderer(
14 const VideoNodeBase& node, VideoFrameShare& frames) noexcept;
16
17 VideoNodeRenderer() = delete;
18 VideoNodeRenderer(const VideoNodeRenderer&) = delete;
20 VideoNodeRenderer& operator=(const VideoNodeRenderer&) = delete;
21 VideoNodeRenderer& operator=(VideoNodeRenderer&&) = delete;
22
23 TextureRenderTarget renderTargetForInput(const Port& input) override;
24
25 void createGpuDecoder();
26 void setupGpuDecoder(RenderList& r);
27 void checkFormat(RenderList& r, AVPixelFormat fmt, int w, int h);
28
29 void init(RenderList& renderer, QRhiResourceUpdateBatch& res) override;
30 void runRenderPass(RenderList&, QRhiCommandBuffer& commands, Edge& edge) override;
31
32 void update(RenderList& renderer, QRhiResourceUpdateBatch& res, Edge* edge) override;
33 void release(RenderList& r) override;
34
35 void initState(RenderList& renderer, QRhiResourceUpdateBatch& res) override;
36 void releaseState(RenderList& renderer) override;
37 void addOutputPass(
38 RenderList& renderer, Edge& edge, QRhiResourceUpdateBatch& res) override;
39 void removeOutputPass(RenderList& renderer, Edge& edge) override;
40 bool hasOutputPassForEdge(Edge& edge) const override;
41
42private:
43 void createPipelines(RenderList& r);
44 void displayFrame(AVFrame& frame, RenderList& renderer, QRhiResourceUpdateBatch& res);
45 Video::VideoMetadata& decoder() const noexcept;
46
47 const VideoNodeBase& node() const noexcept
48 {
49 return static_cast<const VideoNodeBase&>(NodeRenderer::node);
50 }
51 VideoFrameShare& reader;
52
53 PassMap m_p;
54 MeshBuffers m_meshBuffer{};
55 QRhiBuffer* m_processUBO{};
56 QRhiBuffer* m_materialUBO{};
57
58 struct Material
59 {
60 float scale_w{}, scale_h{};
61 float tex_w{}, tex_h{};
62 };
63
64 std::unique_ptr<GPUVideoDecoder> m_gpu;
65 std::pair<QShader, QShader> m_shaders;
66
67 Video::ImageFormat m_frameFormat{};
68 score::gfx::ScaleMode m_currentScaleMode{};
69
70 std::shared_ptr<RefcountedFrame> m_currentFrame{};
71 int64_t m_currentFrameIdx{-1};
72 bool m_recomputeScale{};
73};
74
75}
Renderer for a given node.
Definition NodeRenderer.hpp:11
List of nodes to be rendered to an output.
Definition RenderList.hpp:30
Definition VideoNode.hpp:73
Definition VideoNodeRenderer.hpp:11
bool hasOutputPassForEdge(Edge &edge) const override
Check if this renderer already has an output pass for the given edge.
Definition VideoNodeRenderer.cpp:179
void removeOutputPass(RenderList &renderer, Edge &edge) override
Definition VideoNodeRenderer.cpp:168
void releaseState(RenderList &renderer) override
Definition VideoNodeRenderer.cpp:185
void addOutputPass(RenderList &renderer, Edge &edge, QRhiResourceUpdateBatch &res) override
Create a pass for a new output edge (pipeline, SRB, processUBO).
Definition VideoNodeRenderer.cpp:149
void initState(RenderList &renderer, QRhiResourceUpdateBatch &res) override
Definition VideoNodeRenderer.cpp:118
Graphics rendering pipeline for ossia score.
Definition Filter/PreviewWidget.hpp:11
ScaleMode
How to resize a texture to adapt it to a viewport.
Definition Scale.hpp:10
Definition VideoInterface.hpp:26
Definition VideoInterface.hpp:54
Connection between two score::gfx::Port.
Definition score-plugin-gfx/Gfx/Graph/Utils.hpp:103
Definition Mesh.hpp:94
Port of a score::gfx::Node.
Definition score-plugin-gfx/Gfx/Graph/Utils.hpp:82
Useful abstraction for storing all the data related to a render target.
Definition score-plugin-gfx/Gfx/Graph/Utils.hpp:152
Definition VideoNode.hpp:30