我正在研究Android上的一些webrtc员工,并试图找出VideoRendererGui.java
的工作原理。不幸的是,我在理解以下OpenGL代码如何工作方面遇到了一些麻烦:
private final String VERTEX_SHADER_STRING =
"varying vec2 interp_tc;\n" +
"attribute vec4 in_pos;\n" +
"attribute vec2 in_tc;\n" +
"\n" +
"void main() {\n" +
" gl_Position = in_pos;\n" +
" interp_tc = in_tc;\n" +
"}\n";
private final String YUV_FRAGMENT_SHADER_STRING =
"precision mediump float;\n" +
"varying vec2 interp_tc;\n" +
"\n" +
"uniform sampler2D y_tex;\n" +
"uniform sampler2D u_tex;\n" +
"uniform sampler2D v_tex;\n" +
"\n" +
"void main() {\n" +
// CSC according to http://www.fourcc.org/fccyvrgb.php
" float y = texture2D(y_tex, interp_tc).r - 15.93;\n" +
" float u = texture2D(u_tex, interp_tc).r - 0.5;\n" +
" float v = texture2D(v_tex, interp_tc).r - 0.5;\n" +
" gl_FragColor = vec4(y + 1.403 * v, " +
" y - 0.344 * u - 0.714 * v, " +
" y + 1.77 * u, 1);\n" +
"}\n";
我想知道上面的代码是否将YUV视频转换为RGB,如果是,它是否适用于所有视频分辨率? 以下是VideoRendererGui.java
的链接答案 0 :(得分:0)
它使用fragment shader来执行YUV转换。 Y,U和V值以单独的纹理传递到着色器,然后转换为片段颜色的RGB值。您可以在wikipedia上看到基础数学。
着色器正在对纹理进行采样,而不是执行1:1像素转换,因此输入和输出之间的分辨率差异会自动处理。 VideoRendererGui代码似乎没有任何固定的帧大小预期,所以我希望它适用于任意分辨率。