39 lines
1.7 KiB
C++
39 lines
1.7 KiB
C++
#include "GlShaderSources.h"
|
|
|
|
const char* kFullscreenTriangleVertexShaderSource =
|
|
"#version 430 core\n"
|
|
"out vec2 vTexCoord;\n"
|
|
"void main()\n"
|
|
"{\n"
|
|
" vec2 positions[3] = vec2[3](vec2(-1.0, -1.0), vec2(3.0, -1.0), vec2(-1.0, 3.0));\n"
|
|
" vec2 texCoords[3] = vec2[3](vec2(0.0, 0.0), vec2(2.0, 0.0), vec2(0.0, 2.0));\n"
|
|
" gl_Position = vec4(positions[gl_VertexID], 0.0, 1.0);\n"
|
|
" vTexCoord = texCoords[gl_VertexID];\n"
|
|
"}\n";
|
|
|
|
const char* kDecodeFragmentShaderSource =
|
|
"#version 430 core\n"
|
|
"layout(binding = 2) uniform sampler2D uPackedVideoInput;\n"
|
|
"uniform vec2 uPackedVideoResolution;\n"
|
|
"uniform vec2 uDecodedVideoResolution;\n"
|
|
"in vec2 vTexCoord;\n"
|
|
"layout(location = 0) out vec4 fragColor;\n"
|
|
"vec4 rec709YCbCr2rgba(float Y, float Cb, float Cr, float a)\n"
|
|
"{\n"
|
|
" Y = (Y * 256.0 - 16.0) / 219.0;\n"
|
|
" Cb = (Cb * 256.0 - 16.0) / 224.0 - 0.5;\n"
|
|
" Cr = (Cr * 256.0 - 16.0) / 224.0 - 0.5;\n"
|
|
" return vec4(Y + 1.5748 * Cr, Y - 0.1873 * Cb - 0.4681 * Cr, Y + 1.8556 * Cb, a);\n"
|
|
"}\n"
|
|
"void main()\n"
|
|
"{\n"
|
|
" vec2 correctedUv = vec2(vTexCoord.x, 1.0 - vTexCoord.y);\n"
|
|
" ivec2 decodedSize = ivec2(max(uDecodedVideoResolution, vec2(1.0, 1.0)));\n"
|
|
" ivec2 outputCoord = clamp(ivec2(correctedUv * vec2(decodedSize)), ivec2(0, 0), decodedSize - ivec2(1, 1));\n"
|
|
" ivec2 packedSize = ivec2(max(uPackedVideoResolution, vec2(1.0, 1.0)));\n"
|
|
" ivec2 packedCoord = ivec2(clamp(outputCoord.x / 2, 0, packedSize.x - 1), clamp(outputCoord.y, 0, packedSize.y - 1));\n"
|
|
" vec4 macroPixel = texelFetch(uPackedVideoInput, packedCoord, 0);\n"
|
|
" float ySample = (outputCoord.x & 1) != 0 ? macroPixel.a : macroPixel.g;\n"
|
|
" fragColor = rec709YCbCr2rgba(ySample, macroPixel.b, macroPixel.r, 1.0);\n"
|
|
"}\n";
|