Loading...
Searching...
No Matches

GPU RGBA->NV12 encoder (semi-planar 4:2:0). More...

Inheritance diagram for score::gfx::NV12Encoder:
score::gfx::GPUVideoEncoder

Detailed Description

GPU RGBA->NV12 encoder (semi-planar 4:2:0).

Two render passes: Pass 1: Y plane -> R8 texture at full resolution Pass 2: UV plane -> RG8 texture at half resolution (width/2 × height/2)

Two readbacks. The caller concatenates Y + UV data for GStreamer video/x-raw,format=NV12.

Public Member Functions

void init (QRhi &rhi, const RenderState &state, QRhiTexture *inputRGBA, int width, int height, const QString &colorConversion=colorMatrixOut()) override
 
void exec (QRhi &rhi, QRhiCommandBuffer &cb) override
 
int planeCount () const override
 Number of readback planes (1 for UYVY, 2 for NV12, 3 for I420).
 
const QRhiReadbackResult & readback (int plane) const override
 Get the readback result for a given plane. Valid after endOffscreenFrame.
 
void release () override
 Release all GPU resources.
 

Public Attributes

QRhiTexture * m_yTexture {}
 
QRhiTextureRenderTarget * m_yRT {}
 
QRhiRenderPassDescriptor * m_yRP {}
 
QRhiShaderResourceBindings * m_ySRB {}
 
QRhiGraphicsPipeline * m_yPipeline {}
 
QRhiReadbackResult m_yReadback {}
 
QRhiTexture * m_uvTexture {}
 
QRhiTextureRenderTarget * m_uvRT {}
 
QRhiRenderPassDescriptor * m_uvRP {}
 
QRhiShaderResourceBindings * m_uvSRB {}
 
QRhiGraphicsPipeline * m_uvPipeline {}
 
QRhiReadbackResult m_uvReadback {}
 
QRhiSampler * m_sampler {}
 
int m_width {}
 
int m_height {}
 

Static Public Attributes

static constexpr const char * y_frag
 
static constexpr const char * uv_frag
 
- Static Public Attributes inherited from score::gfx::GPUVideoEncoder
static constexpr const char * vertex_shader
 
static constexpr const char * rgb_to_yuv_glsl
 
static constexpr const char * y_flip_glsl
 Fragment shader Y-flip: on GL, flip v_texcoord.y. On Metal/HLSL, no flip.
 

Member Function Documentation

◆ exec()

void score::gfx::NV12Encoder::exec ( QRhi &  rhi,
QRhiCommandBuffer &  cb 
)
inlineoverridevirtual

Execute the conversion pass. Call inside beginOffscreenFrame/endOffscreenFrame. Renders the conversion shader and schedules GPU->CPU readback(s).

Implements score::gfx::GPUVideoEncoder.

◆ init()

void score::gfx::NV12Encoder::init ( QRhi &  rhi,
const RenderState state,
QRhiTexture *  inputRGBA,
int  width,
int  height,
const QString &  colorConversion = colorMatrixOut() 
)
inlineoverridevirtual

Create render targets, textures, samplers, and the graphics pipeline.

Parameters
rhiThe QRhi instance.
stateThe render state (for shader compilation).
inputRGBAThe scene RGBA texture to read from.
widthSource width in pixels.
heightSource height in pixels.
colorConversionGLSL code from colorMatrixOut() defining convert_from_rgb(). If empty, defaults to BT.709 full range.

Implements score::gfx::GPUVideoEncoder.

◆ planeCount()

int score::gfx::NV12Encoder::planeCount ( ) const
inlineoverridevirtual

Number of readback planes (1 for UYVY, 2 for NV12, 3 for I420).

Implements score::gfx::GPUVideoEncoder.

◆ readback()

const QRhiReadbackResult & score::gfx::NV12Encoder::readback ( int  plane) const
inlineoverridevirtual

Get the readback result for a given plane. Valid after endOffscreenFrame.

Implements score::gfx::GPUVideoEncoder.

◆ release()

void score::gfx::NV12Encoder::release ( )
inlineoverridevirtual

Release all GPU resources.

Implements score::gfx::GPUVideoEncoder.

Member Data Documentation

◆ uv_frag

constexpr const char* score::gfx::NV12Encoder::uv_frag
staticconstexpr
Initial value:
= R"_(#version 450
layout(location = 0) in vec2 v_texcoord;
layout(location = 0) out vec4 fragColor;
layout(binding = 3) uniform sampler2D src_tex;
)_" "%1" R"_(
vec2 flip_y(vec2 tc) {
return tc;
return vec2(tc.x, 1.0 - tc.y);
}
void main() {
vec3 rgb = texture(src_tex, flip_y(v_texcoord)).rgb;
vec3 yuv = convert_from_rgb(rgb);
fragColor = vec4(yuv.y, yuv.z, 0.0, 1.0);
}
)_"

◆ y_frag

constexpr const char* score::gfx::NV12Encoder::y_frag
staticconstexpr
Initial value:
= R"_(#version 450
layout(location = 0) in vec2 v_texcoord;
layout(location = 0) out vec4 fragColor;
layout(binding = 3) uniform sampler2D src_tex;
)_" "%1" R"_(
vec2 flip_y(vec2 tc) {
return tc;
return vec2(tc.x, 1.0 - tc.y);
}
void main() {
vec3 rgb = texture(src_tex, flip_y(v_texcoord)).rgb;
vec3 yuv = convert_from_rgb(rgb);
fragColor = vec4(yuv.x, 0.0, 0.0, 1.0);
}
)_"

The documentation for this struct was generated from the following file: