opengles2.0 显示yuv数据

来源:互联网 发布:手机免费阅读软件 编辑:程序博客网 时间:2024/05/17 08:44

转自:http://blog.csdn.net/zsc09_leaf/article/details/16884435


cpp] view plaincopy
  1. // OpenGL ES 2.0 code  
[cpp] view plaincopy
  1. #include "Shader.vert"  
  2. #include "Shader.frag"  
  3.   
  4. #include <jni.h>  
  5. #include <android/log.h>  
  6.   
  7. #include <GLES2/gl2.h>  
  8. #include <GLES2/gl2ext.h>  
  9.   
  10. #include <stdio.h>  
  11. #include <stdlib.h>  
  12. #include <math.h>  
  13.   
  14. enum {  
  15.     ATTRIB_VERTEX,  
  16.     ATTRIB_TEXTURE,  
  17. };  
  18.   
  19. static GLuint g_texYId;  
  20. static GLuint g_texUId;  
  21. static GLuint g_texVId;  
  22. static GLuint simpleProgram;  
  23.   
  24. static char *              g_buffer = NULL;  
  25. static int                 g_width = 0;  
  26. static int                 g_height = 0;  
  27.   
  28.   
  29. static void checkGlError(const char* op)   
  30. {  
  31.     GLint error;  
  32.     for (error = glGetError(); error; error = glGetError())   
  33.     {  
  34.         log("error::after %s() glError (0x%x)\n", op, error);  
  35.     }  
  36. }  
  37.   
  38. static GLuint bindTexture(GLuint texture, const char *buffer, GLuint w , GLuint h)  
  39. {  
  40. //  GLuint texture;  
  41. //  glGenTextures ( 1, &texture );  
  42.     checkGlError("glGenTextures");  
  43.     glBindTexture ( GL_TEXTURE_2D, texture );  
  44.     checkGlError("glBindTexture");  
  45.     glTexImage2D ( GL_TEXTURE_2D, 0, GL_LUMINANCE, w, h, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, buffer);  
  46.     checkGlError("glTexImage2D");  
  47.     glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );  
  48.     checkGlError("glTexParameteri");  
  49.     glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );  
  50.     checkGlError("glTexParameteri");  
  51.     glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );  
  52.     checkGlError("glTexParameteri");  
  53.     glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );  
  54.     checkGlError("glTexParameteri");  
  55.     //glBindTexture(GL_TEXTURE_2D, 0);  
  56.   
  57.     return texture;  
  58. }  
  59.   
  60. static void renderFrame()  
  61. {  
  62. #if 0  
  63.     // Galaxy Nexus 4.2.2  
  64.     static GLfloat squareVertices[] = {  
  65.         -1.0f, -1.0f,  
  66.         1.0f, -1.0f,  
  67.         -1.0f,  1.0f,  
  68.         1.0f,  1.0f,  
  69.     };  
  70.   
  71.     static GLfloat coordVertices[] = {  
  72.         0.0f, 1.0f,  
  73.         1.0f, 1.0f,  
  74.         0.0f,  0.0f,  
  75.         1.0f,  0.0f,  
  76.     };  
  77. #else  
  78.  // HUAWEIG510-0010 4.1.1  
  79.     static GLfloat squareVertices[] = {  
  80.         0.0f, 0.0f,  
  81.         1.0f, 0.0f,  
  82.         0.0f,  1.0f,  
  83.         1.0f,  1.0f,  
  84.     };  
  85.   
  86.     static GLfloat coordVertices[] = {  
  87.             -1.0f, 1.0f,  
  88.             1.0f, 1.0f,  
  89.             -1.0f,  -1.0f,  
  90.             1.0f,  -1.0f,  
  91.     };  
  92. #endif  
  93.   
  94.     glClearColor(0.5f, 0.5f, 0.5f, 1);  
  95.     checkGlError("glClearColor");  
  96.     glClear(GL_COLOR_BUFFER_BIT);  
  97.     checkGlError("glClear");  
  98.     //PRINTF("setsampler %d %d %d", g_texYId, g_texUId, g_texVId);  
  99.     GLint tex_y = glGetUniformLocation(simpleProgram, "SamplerY");  
  100.     checkGlError("glGetUniformLocation");  
  101.     GLint tex_u = glGetUniformLocation(simpleProgram, "SamplerU");  
  102.     checkGlError("glGetUniformLocation");  
  103.     GLint tex_v = glGetUniformLocation(simpleProgram, "SamplerV");  
  104.     checkGlError("glGetUniformLocation");  
  105.   
  106.   
  107.     glBindAttribLocation(simpleProgram, ATTRIB_VERTEX, "vPosition");  
  108.     checkGlError("glBindAttribLocation");  
  109.     glBindAttribLocation(simpleProgram, ATTRIB_TEXTURE, "a_texCoord");  
  110.     checkGlError("glBindAttribLocation");  
  111.   
  112.     glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, squareVertices);  
  113.     checkGlError("glVertexAttribPointer");  
  114.     glEnableVertexAttribArray(ATTRIB_VERTEX);  
  115.     checkGlError("glEnableVertexAttribArray");  
  116.   
  117.     glVertexAttribPointer(ATTRIB_TEXTURE, 2, GL_FLOAT, 0, 0, coordVertices);  
  118.     checkGlError("glVertexAttribPointer");  
  119.     glEnableVertexAttribArray(ATTRIB_TEXTURE);  
  120.     checkGlError("glEnableVertexAttribArray");  
  121.   
  122.     glActiveTexture(GL_TEXTURE0);  
  123.     checkGlError("glActiveTexture");  
  124.     glBindTexture(GL_TEXTURE_2D, g_texYId);  
  125.     checkGlError("glBindTexture");  
  126.     glUniform1i(tex_y, 0);  
  127.     checkGlError("glUniform1i");  
  128.   
  129.     glActiveTexture(GL_TEXTURE1);  
  130.     checkGlError("glActiveTexture");  
  131.     glBindTexture(GL_TEXTURE_2D, g_texUId);  
  132.     checkGlError("glBindTexture");  
  133.     glUniform1i(tex_u, 1);  
  134.     checkGlError("glUniform1i");  
  135.   
  136.     glActiveTexture(GL_TEXTURE2);  
  137.     checkGlError("glActiveTexture");  
  138.     glBindTexture(GL_TEXTURE_2D, g_texVId);  
  139.     checkGlError("glBindTexture");  
  140.     glUniform1i(tex_v, 2);  
  141.     checkGlError("glUniform1i");  
  142.   
  143.     //glEnable(GL_TEXTURE_2D);  
  144.     //checkGlError("glEnable");  
  145.     glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);  
  146.     checkGlError("glDrawArrays");  
  147. }  
  148.   
  149. static GLuint buildShader(const char* source, GLenum shaderType)   
  150. {  
  151.     GLuint shaderHandle = glCreateShader(shaderType);  
  152.   
  153.     if (shaderHandle)  
  154.     {  
  155.         glShaderSource(shaderHandle, 1, &source, 0);  
  156.         glCompileShader(shaderHandle);  
  157.   
  158.         GLint compiled = 0;  
  159.         glGetShaderiv(shaderHandle, GL_COMPILE_STATUS, &compiled);  
  160.         if (!compiled)  
  161.         {  
  162.             GLint infoLen = 0;  
  163.             glGetShaderiv(shaderHandle, GL_INFO_LOG_LENGTH, &infoLen);  
  164.             if (infoLen)  
  165.             {  
  166.                 char* buf = (char*) malloc(infoLen);  
  167.                 if (buf)  
  168.                 {  
  169.                     glGetShaderInfoLog(shaderHandle, infoLen, NULL, buf);  
  170.                     log_easy("error::Could not compile shader %d:\n%s\n", shaderType, buf);  
  171.                     free(buf);  
  172.                 }  
  173.                 glDeleteShader(shaderHandle);  
  174.                 shaderHandle = 0;  
  175.             }  
  176.         }  
  177.   
  178.     }  
  179.       
  180.     return shaderHandle;  
  181. }  
  182.   
  183. static GLuint buildProgram(const char* vertexShaderSource,  
  184.         const char* fragmentShaderSource)   
  185. {  
  186.     GLuint vertexShader = buildShader(vertexShaderSource, GL_VERTEX_SHADER);  
  187.     GLuint fragmentShader = buildShader(fragmentShaderSource, GL_FRAGMENT_SHADER);  
  188.     GLuint programHandle = glCreateProgram();  
  189.   
  190.     if (programHandle)  
  191.     {  
  192.         glAttachShader(programHandle, vertexShader);  
  193.         checkGlError("glAttachShader");  
  194.         glAttachShader(programHandle, fragmentShader);  
  195.         checkGlError("glAttachShader");  
  196.         glLinkProgram(programHandle);  
  197.   
  198.         GLint linkStatus = GL_FALSE;  
  199.         glGetProgramiv(programHandle, GL_LINK_STATUS, &linkStatus);  
  200.         if (linkStatus != GL_TRUE) {  
  201.             GLint bufLength = 0;  
  202.             glGetProgramiv(programHandle, GL_INFO_LOG_LENGTH, &bufLength);  
  203.             if (bufLength) {  
  204.                 char* buf = (char*) malloc(bufLength);  
  205.                 if (buf) {  
  206.                     glGetProgramInfoLog(programHandle, bufLength, NULL, buf);  
  207.                     log_easy("error::Could not link program:\n%s\n", buf);  
  208.                     free(buf);  
  209.                 }  
  210.             }  
  211.             glDeleteProgram(programHandle);  
  212.             programHandle = 0;  
  213.         }  
  214.   
  215.     }  
  216.   
  217.     return programHandle;  
  218. }  
  219.   
  220. static unsigned char * readYUV(const char *path)  
  221. {  
  222.   
  223.     FILE *fp;  
  224.     unsigned char * buffer;  
  225.     long size = 1280 * 720 * 3 / 2;  
  226.   
  227.     if((fp=fopen(path,"rb"))==NULL)  
  228.     {  
  229.         log("cant open the file");  
  230.        exit(0);  
  231.     }  
  232.   
  233.     buffer = (unsigned char *)malloc(size);  
  234.     memset(buffer,'\0',size);  
  235.     long len = fread(buffer,1,size,fp);  
  236.     //PRINTF("read data size:%ld", len);  
  237.     fclose(fp);  
  238.     return buffer;  
  239. }  
  240.   
  241. void gl_initialize()   
  242. {  
  243.     g_buffer = NULL;  
  244.   
  245.     simpleProgram = buildProgram(VERTEX_SHADER, FRAG_SHADER);  
  246.     glUseProgram(simpleProgram);  
  247.     glGenTextures(1, &g_texYId);  
  248.     glGenTextures(1, &g_texUId);  
  249.     glGenTextures(1, &g_texVId);  
  250. }  
  251.   
  252. void gl_uninitialize()  
  253. {  
  254.   
  255.     g_width = 0;  
  256.     g_height = 0;  
  257.   
  258.     if (g_buffer)  
  259.     {  
  260.         free(g_buffer);  
  261.         g_buffer = NULL;  
  262.     }  
  263. }  
  264. //设置图像数据  
  265. void gl_set_framebuffer(const char* buffer, int buffersize, int width, int height)  
  266. {  
  267.       
  268.     if (g_width != width || g_height != height)  
  269.     {  
  270.         if (g_buffer)  
  271.             free(g_buffer);  
  272.   
  273.         g_width = width;  
  274.         g_height = height;  
  275.   
  276.         g_buffer = (char *)malloc(buffersize);  
  277.     }  
  278.   
  279.     if (g_buffer)  
  280.         memcpy(g_buffer, buffer, buffersize);  
  281.   
  282. }  
  283. //画屏  
  284. void gl_render_frame()  
  285. {  
  286.     if (0 == g_width || 0 == g_height)  
  287.         return;  
  288.   
  289. #if 0  
  290.     int width = 448;  
  291.     int height = 336;  
  292.     static unsigned char *buffer = NULL;  
  293.   
  294.     if (NULL == buffer)  
  295.     {  
  296.         char filename[128] = {0};  
  297.         strcpy(filename, "/sdcard/yuv_448_336.yuv");  
  298.         buffer = readYUV(filename);  
  299.     }  
  300.   
  301. #else  
  302.     const char *buffer = g_buffer;  
  303.     int width = g_width;  
  304.     int height = g_height;  
  305. #endif  
  306.     glViewport(0, 0, width, height);  
  307.     bindTexture(g_texYId, buffer, width, height);  
  308.     bindTexture(g_texUId, buffer + width * height, width/2, height/2);  
  309.     bindTexture(g_texVId, buffer + width * height * 5 / 4, width/2, height/2);  
  310.    renderFrame();   
  311. }  
  312. //如果设置图像数据和画屏是两个线程的话,记住要加锁。  
[cpp] view plaincopy
  1. //Shader.frag文件内容  
  2. static const char* FRAG_SHADER =  
  3.     "varying lowp vec2 tc;\n"  
  4.     "uniform sampler2D SamplerY;\n"  
  5.     "uniform sampler2D SamplerU;\n"  
  6.     "uniform sampler2D SamplerV;\n"  
  7.     "void main(void)\n"  
  8.     "{\n"  
  9.         "mediump vec3 yuv;\n"  
  10.         "lowp vec3 rgb;\n"  
  11.         "yuv.x = texture2D(SamplerY, tc).r;\n"  
  12.         "yuv.y = texture2D(SamplerU, tc).r - 0.5;\n"  
  13.         "yuv.z = texture2D(SamplerV, tc).r - 0.5;\n"  
  14.         "rgb = mat3( 1,   1,   1,\n"  
  15.                     "0,       -0.39465,  2.03211,\n"  
  16.                     "1.13983,   -0.58060,  0) * yuv;\n"  
  17.         "gl_FragColor = vec4(rgb, 1);\n"  
  18.     "}\n";  
[cpp] view plaincopy
  1. //Shader.vert文件内容  
  2. static const char* VERTEX_SHADER =    
  3.       "attribute vec4 vPosition;    \n"  
  4.       "attribute vec2 a_texCoord;   \n"  
  5.       "varying vec2 tc;     \n"  
  6.       "void main()                  \n"  
  7.       "{                            \n"  
  8.       "   gl_Position = vPosition;  \n"  
  9.       "   tc = a_texCoord;  \n"  
  10.       "}                            \n";


0 0