Advertisement
Guest User

Untitled

a guest
Jun 28th, 2017
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.28 KB | None | 0 0
  1. package com.gogomaper.meat.feature.live_chat.apprtc;
  2.  
  3. import android.opengl.GLES20;
  4.  
  5. import org.webrtc.GlShader;
  6. import org.webrtc.GlUtil;
  7. import org.webrtc.RendererCommon;
  8.  
  9. import java.nio.FloatBuffer;
  10. import java.util.IdentityHashMap;
  11. import java.util.Iterator;
  12. import java.util.Map;
  13.  
  14. /**
  15. * Created by tony on 2017/6/28.
  16. */
  17.  
  18. class GaussianBlurGlDrawer implements RendererCommon.GlDrawer {
  19. private static final String VARYING_TEXCOORD = "interp_tc";
  20. private static final String ATTRIBUTE_POSITION = "a_Position";
  21. private static final String ATTRIBUTE_TEXCOORD = "a_TexCoord";
  22.  
  23. private static final String UNIFORM_TEXMATRIX = "texMatrix";
  24. private static final String UNIFORM_YTEX = "y_tex";
  25. private static final String UNIFORM_UTEX = "u_tex";
  26. private static final String UNIFORM_VTEX = "v_tex";
  27. private static final String UNIFORM_RGB = "rgb_tex";
  28. private static final String UNIFORM_OES = "oes_tex";
  29.  
  30. private static final String UNIFORM_TEXELWIDTH = "u_TexelWidth";
  31. private static final String UNIFORM_TEXELHEIGHT = "u_TexelHeight";
  32.  
  33. private static final String VERTEX_SHADER_STRING =
  34. "varying vec2 " + VARYING_TEXCOORD + ";\n"
  35. + "attribute vec4 " + ATTRIBUTE_POSITION + ";\n"
  36. + "attribute vec4 " + ATTRIBUTE_TEXCOORD + ";\n"
  37. + "\n"
  38. + "uniform mat4 " + UNIFORM_TEXMATRIX + ";\n"
  39. + "\n"
  40. + "void main() {\n"
  41. + " gl_Position = " + ATTRIBUTE_POSITION + ";\n"
  42. + " " + VARYING_TEXCOORD + " = (" + UNIFORM_TEXMATRIX + " * " + ATTRIBUTE_TEXCOORD + ").xy;\n"
  43. + "}\n";
  44. private static final String YUV_FRAGMENT_SHADER_STRING =
  45. "precision mediump float;\n"
  46. + "varying vec2 " + VARYING_TEXCOORD + ";\n"
  47. + "\n"
  48. + "uniform sampler2D " + UNIFORM_YTEX + ";\n"
  49. + "uniform sampler2D " + UNIFORM_UTEX + ";\n"
  50. + "uniform sampler2D " + UNIFORM_VTEX + ";\n"
  51. + "\n"
  52. + "void main() {\n"
  53. + " float y = texture2D(" + UNIFORM_YTEX + ", " + VARYING_TEXCOORD + ").r;\n"
  54. + " float u = texture2D(" + UNIFORM_UTEX + ", " + VARYING_TEXCOORD + ").r - 0.5;\n"
  55. + " float v = texture2D(" + UNIFORM_VTEX + ", " + VARYING_TEXCOORD + ").r - 0.5;\n"
  56. + " gl_FragColor = vec4(y + 1.403 * v, "
  57. + " y - 0.344 * u - 0.714 * v, "
  58. + " y + 1.77 * u, 1);\n"
  59. + "}\n";
  60. private static final String RGB_FRAGMENT_SHADER_STRING =
  61. "precision mediump float;\n"
  62. + "varying vec2 " + VARYING_TEXCOORD + ";\n"
  63. + "uniform sampler2D " + UNIFORM_RGB + ";\n"
  64. + "\n"
  65. + "void main() {\n"
  66. + " gl_FragColor = texture2D(" + UNIFORM_RGB + ", " + VARYING_TEXCOORD + ");\n"
  67. + "}\n";
  68. private static final String OES_FRAGMENT_SHADER_STRING =
  69. "#extension GL_OES_EGL_image_external : require\n"
  70. +"precision mediump float;\n"
  71. +"varying vec2 "+VARYING_TEXCOORD+";\n"
  72. +"uniform samplerExternalOES "+UNIFORM_OES+";\n"
  73. +"uniform float "+UNIFORM_TEXELWIDTH+";\n"
  74. +"uniform float "+UNIFORM_TEXELHEIGHT+";\n"
  75. + "\n"
  76. +"void main(){\n"
  77. + " gl_FragColor = texture2D(" + UNIFORM_OES + ", " + VARYING_TEXCOORD + ");\n"
  78. +"}\n";
  79. private static final FloatBuffer FULL_RECTANGLE_BUF = GlUtil.createFloatBuffer(new float[]{-1.0F, -1.0F, 1.0F, -1.0F, -1.0F, 1.0F, 1.0F, 1.0F});
  80. private static final FloatBuffer FULL_RECTANGLE_TEX_BUF = GlUtil.createFloatBuffer(new float[]{0.0F, 0.0F, 1.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F});
  81. private final Map<String, GaussianBlurGlDrawer.Shader> shaders = new IdentityHashMap();
  82.  
  83. public GaussianBlurGlDrawer() {
  84. }
  85.  
  86. public void drawOes(int oesTextureId, float[] texMatrix, int frameWidth, int frameHeight, int viewportX, int viewportY, int viewportWidth, int viewportHeight) {
  87. this.prepareShader(OES_FRAGMENT_SHADER_STRING, texMatrix, frameWidth, frameHeight);
  88. GLES20.glActiveTexture('蓀');
  89. GLES20.glBindTexture('赥', oesTextureId);
  90. this.drawRectangle(viewportX, viewportY, viewportWidth, viewportHeight);
  91. GLES20.glBindTexture('赥', 0);
  92. }
  93.  
  94. public void drawRgb(int textureId, float[] texMatrix, int frameWidth, int frameHeight, int viewportX, int viewportY, int viewportWidth, int viewportHeight) {
  95. this.prepareShader(RGB_FRAGMENT_SHADER_STRING, texMatrix, frameWidth, frameHeight);
  96. GLES20.glActiveTexture('蓀');
  97. GLES20.glBindTexture(3553, textureId);
  98. this.drawRectangle(viewportX, viewportY, viewportWidth, viewportHeight);
  99. GLES20.glBindTexture(3553, 0);
  100. }
  101.  
  102. public void drawYuv(int[] yuvTextures, float[] texMatrix, int frameWidth, int frameHeight, int viewportX, int viewportY, int viewportWidth, int viewportHeight) {
  103. this.prepareShader(YUV_FRAGMENT_SHADER_STRING, texMatrix, frameWidth, frameHeight);
  104.  
  105. int i;
  106. for(i = 0; i < 3; ++i) {
  107. GLES20.glActiveTexture('蓀' + i);
  108. GLES20.glBindTexture(3553, yuvTextures[i]);
  109. }
  110.  
  111. this.drawRectangle(viewportX, viewportY, viewportWidth, viewportHeight);
  112.  
  113. for(i = 0; i < 3; ++i) {
  114. GLES20.glActiveTexture('蓀' + i);
  115. GLES20.glBindTexture(3553, 0);
  116. }
  117.  
  118. }
  119.  
  120. private void drawRectangle(int x, int y, int width, int height) {
  121. GLES20.glViewport(x, y, width, height);
  122. GLES20.glDrawArrays(5, 0, 4);
  123. }
  124.  
  125. private void prepareShader(String fragmentShader, float[] texMatrix, int frameWidth, int frameHeight) {
  126. GaussianBlurGlDrawer.Shader shader;
  127. if(this.shaders.containsKey(fragmentShader)) {
  128. shader = (GaussianBlurGlDrawer.Shader)this.shaders.get(fragmentShader);
  129. } else {
  130. shader = new GaussianBlurGlDrawer.Shader(fragmentShader);
  131. this.shaders.put(fragmentShader, shader);
  132. shader.glShader.useProgram();
  133. if(YUV_FRAGMENT_SHADER_STRING.equals(fragmentShader)) {
  134. GLES20.glUniform1i(shader.glShader.getUniformLocation(UNIFORM_YTEX), 0);
  135. GLES20.glUniform1i(shader.glShader.getUniformLocation(UNIFORM_UTEX), 1);
  136. GLES20.glUniform1i(shader.glShader.getUniformLocation(UNIFORM_VTEX), 2);
  137. } else if(RGB_FRAGMENT_SHADER_STRING.equals(fragmentShader)) {
  138. GLES20.glUniform1i(shader.glShader.getUniformLocation(UNIFORM_RGB), 0);
  139. } else if(OES_FRAGMENT_SHADER_STRING.equals(fragmentShader)) {
  140. GLES20.glUniform1i(shader.glShader.getUniformLocation(UNIFORM_OES), 0);
  141. GLES20.glUniform1f(shader.glShader.getUniformLocation(UNIFORM_TEXELWIDTH), frameWidth);
  142. GLES20.glUniform1f(shader.glShader.getUniformLocation(UNIFORM_TEXELHEIGHT), frameHeight);
  143. }else {
  144. throw new IllegalStateException("Unknown fragment shader: " + fragmentShader);
  145. }
  146.  
  147. GlUtil.checkNoGLES2Error("Initialize fragment shader uniform values.");
  148. shader.glShader.setVertexAttribArray(ATTRIBUTE_POSITION, 2, FULL_RECTANGLE_BUF);
  149. shader.glShader.setVertexAttribArray(ATTRIBUTE_TEXCOORD, 2, FULL_RECTANGLE_TEX_BUF);
  150. }
  151.  
  152. shader.glShader.useProgram();
  153. GLES20.glUniformMatrix4fv(shader.texMatrixLocation, 1, false, texMatrix, 0);
  154. }
  155.  
  156. public void release() {
  157. Iterator i$ = this.shaders.values().iterator();
  158.  
  159. while(i$.hasNext()) {
  160. GaussianBlurGlDrawer.Shader shader = (GaussianBlurGlDrawer.Shader)i$.next();
  161. shader.glShader.release();
  162. }
  163.  
  164. this.shaders.clear();
  165. }
  166.  
  167. private static class Shader {
  168. public final GlShader glShader;
  169. public final int texMatrixLocation;
  170.  
  171. public Shader(String fragmentShader) {
  172. this.glShader = new GlShader(VERTEX_SHADER_STRING, fragmentShader);
  173. this.texMatrixLocation = this.glShader.getUniformLocation(UNIFORM_TEXMATRIX);
  174. }
  175. }
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement