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";
我从 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";