#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";