yuyv 4:2:2 解析缓冲区

yuyv 4:2:2 parse buffer

我从 v4l 获得了一个 YUYV 4:2:2 格式的缓冲区。 我想从这个缓冲区中分离 Y 和 UV 以获得 2 个缓冲区: 缓冲 Y 和缓冲 UV 以便能够将其传递给 OpenGL 并在 C++ 中显示图像。

缓冲区长度为1280 * 720 * 2 = 1843200 bytes

可以吗,算法是什么?

V4L 正在发送一个缓冲区 4:2:2 YUV 但我的着色器正在等待 2 个缓冲区

const char gFragmentNV12ToRGB[] =
    "#version 320 es\n"
    "precision highp float;\n"
    "in vec2 TexCoords;\n"
    "out vec4 color;\n"
    "uniform sampler2D text;\n"
    "layout(binding = 0) uniform sampler2D textureY;\n"
    "layout(binding = 1) uniform sampler2D textureUV;\n"
    "void main() {\n"
    "   float r, g, b, y, u, v;\n"
    "   y = texture(textureY, TexCoords).r;\n"
    "   u = texture(textureUV, TexCoords).r - 0.5;\n"
    "   v = texture(textureUV, TexCoords).a - 0.5;\n"
    "   r = y + 1.13983 * v;\n"
    "   g = y - 0.39465 * u - 0.58060 * v;\n"
    "   b = y + 2.03211 * u;\n"
    "   color = vec4(r, g, b, 1.0);\n"
    "}\n";

所以我需要先拆分我的缓冲区,但不知道如何进行,因为我不知道 YUYV 缓冲区的结构...

最好的办法是能够将一个缓冲区发送到 GPU 并且他会完成工作...

我终于找到了如何仅使用 OpenGL ES 从一个采样器渲染 YUV 4:2:2 3.0 ...可惜网上没有例子...

这是最终的着色器

const char gFragment4:2:2ToRGB[] =
    "#version 320 es\n"
    "precision highp float;\n"
    "in vec2 TexCoords;\n"
    "out vec4 color;\n"
    "layout(binding = 0) uniform sampler2D textureYUV;\n"
    "void main() {\n"
    "   float r, g, b, y, u, v;\n"
    "   y = texture(textureYUV, TexCoords).r;\n"
    "   u = texture(textureYUV, TexCoords).g - 0.5;\n"
    "   v = texture(textureYUV, TexCoords).a - 0.5;\n"
    "   r = y + 1.13983 * v;\n"
    "   g = y - 0.39465 * u - 0.58060 * v;\n"
    "   b = y + 2.03211 * u;\n"
    "   color = vec4(r, g, b, 1.0);\n"
    "}\n";