Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright (c) 2014 Lukasz Marek
  3.  *
  4.  * This file is part of FFmpeg.
  5.  *
  6.  * FFmpeg is free software; you can redistribute it and/or
  7.  * modify it under the terms of the GNU Lesser General Public
  8.  * License as published by the Free Software Foundation; either
  9.  * version 2.1 of the License, or (at your option) any later version.
  10.  *
  11.  * FFmpeg is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14.  * Lesser General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU Lesser General Public
  17.  * License along with FFmpeg; if not, write to the Free Software
  18.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  19.  */
  20.  
  21. #ifndef AVDEVICE_OPENGL_SHADERS_H
  22. #define AVDEVICE_OPENGL_SHADERS_H
  23.  
  24. #include "libavutil/pixfmt.h"
  25.  
  26. static const char * const FF_OPENGL_VERTEX_SHADER =
  27.     "uniform mat4 u_projectionMatrix;"
  28.     "uniform mat4 u_modelViewMatrix;"
  29.  
  30.     "attribute vec4 a_position;"
  31.     "attribute vec2 a_textureCoords;"
  32.  
  33.     "varying vec2 texture_coordinate;"
  34.  
  35.     "void main()"
  36.     "{"
  37.         "gl_Position = u_projectionMatrix * (a_position * u_modelViewMatrix);"
  38.         "texture_coordinate = a_textureCoords;"
  39.     "}";
  40.  
  41. /**
  42.  * Fragment shader for packet RGBA formats.
  43.  */
  44. static const char * const FF_OPENGL_FRAGMENT_SHADER_RGBA_PACKET =
  45. #if defined(GL_ES_VERSION_2_0)
  46.     "precision mediump float;"
  47. #endif
  48.     "uniform sampler2D u_texture0;"
  49.     "uniform mat4 u_colorMap;"
  50.  
  51.     "varying vec2 texture_coordinate;"
  52.  
  53.     "void main()"
  54.     "{"
  55.         "gl_FragColor = texture2D(u_texture0, texture_coordinate) * u_colorMap;"
  56.     "}";
  57.  
  58. /**
  59.  * Fragment shader for packet RGB formats.
  60.  */
  61. static const char * const FF_OPENGL_FRAGMENT_SHADER_RGB_PACKET =
  62. #if defined(GL_ES_VERSION_2_0)
  63.     "precision mediump float;"
  64. #endif
  65.     "uniform sampler2D u_texture0;"
  66.     "uniform mat4 u_colorMap;"
  67.  
  68.     "varying vec2 texture_coordinate;"
  69.  
  70.     "void main()"
  71.     "{"
  72.         "gl_FragColor = vec4((texture2D(u_texture0, texture_coordinate) * u_colorMap).rgb, 1.0);"
  73.     "}";
  74.  
  75. /**
  76.  * Fragment shader for planar RGBA formats.
  77.  */
  78. static const char * const FF_OPENGL_FRAGMENT_SHADER_RGBA_PLANAR =
  79. #if defined(GL_ES_VERSION_2_0)
  80.     "precision mediump float;"
  81. #endif
  82.     "uniform sampler2D u_texture0;"
  83.     "uniform sampler2D u_texture1;"
  84.     "uniform sampler2D u_texture2;"
  85.     "uniform sampler2D u_texture3;"
  86.  
  87.     "varying vec2 texture_coordinate;"
  88.  
  89.     "void main()"
  90.     "{"
  91.         "gl_FragColor = vec4(texture2D(u_texture0, texture_coordinate).r,"
  92.                             "texture2D(u_texture1, texture_coordinate).r,"
  93.                             "texture2D(u_texture2, texture_coordinate).r,"
  94.                             "texture2D(u_texture3, texture_coordinate).r);"
  95.     "}";
  96.  
  97. /**
  98.  * Fragment shader for planar RGB formats.
  99.  */
  100. static const char * const FF_OPENGL_FRAGMENT_SHADER_RGB_PLANAR =
  101. #if defined(GL_ES_VERSION_2_0)
  102.     "precision mediump float;"
  103. #endif
  104.     "uniform sampler2D u_texture0;"
  105.     "uniform sampler2D u_texture1;"
  106.     "uniform sampler2D u_texture2;"
  107.  
  108.     "varying vec2 texture_coordinate;"
  109.  
  110.     "void main()"
  111.     "{"
  112.         "gl_FragColor = vec4(texture2D(u_texture0, texture_coordinate).r,"
  113.                             "texture2D(u_texture1, texture_coordinate).r,"
  114.                             "texture2D(u_texture2, texture_coordinate).r,"
  115.                             "1.0);"
  116.     "}";
  117.  
  118. /**
  119.  * Fragment shader for planar YUV formats.
  120.  */
  121. static const char * const  FF_OPENGL_FRAGMENT_SHADER_YUV_PLANAR =
  122. #if defined(GL_ES_VERSION_2_0)
  123.     "precision mediump float;"
  124. #endif
  125.     "uniform sampler2D u_texture0;"
  126.     "uniform sampler2D u_texture1;"
  127.     "uniform sampler2D u_texture2;"
  128.     "uniform float u_chroma_div_w;"
  129.     "uniform float u_chroma_div_h;"
  130.  
  131.     "varying vec2 texture_coordinate;"
  132.  
  133.     "void main()"
  134.     "{"
  135.         "vec3 yuv;"
  136.  
  137.         "yuv.r = texture2D(u_texture0, texture_coordinate).r - 0.0625;"
  138.         "yuv.g = texture2D(u_texture1, vec2(texture_coordinate.x / u_chroma_div_w, texture_coordinate.y / u_chroma_div_h)).r - 0.5;"
  139.         "yuv.b = texture2D(u_texture2, vec2(texture_coordinate.x / u_chroma_div_w, texture_coordinate.y / u_chroma_div_h)).r - 0.5;"
  140.  
  141.         "gl_FragColor = clamp(vec4(mat3(1.1643,  1.16430, 1.1643,"
  142.                                        "0.0,    -0.39173, 2.0170,"
  143.                                        "1.5958, -0.81290, 0.0) * yuv, 1.0), 0.0, 1.0);"
  144.  
  145.     "}";
  146.  
  147. /**
  148.  * Fragment shader for planar YUVA formats.
  149.  */
  150. static const char * const FF_OPENGL_FRAGMENT_SHADER_YUVA_PLANAR =
  151. #if defined(GL_ES_VERSION_2_0)
  152.     "precision mediump float;"
  153. #endif
  154.     "uniform sampler2D u_texture0;"
  155.     "uniform sampler2D u_texture1;"
  156.     "uniform sampler2D u_texture2;"
  157.     "uniform sampler2D u_texture3;"
  158.     "uniform float u_chroma_div_w;"
  159.     "uniform float u_chroma_div_h;"
  160.  
  161.     "varying vec2 texture_coordinate;"
  162.  
  163.     "void main()"
  164.     "{"
  165.         "vec3 yuv;"
  166.  
  167.         "yuv.r = texture2D(u_texture0, texture_coordinate).r - 0.0625;"
  168.         "yuv.g = texture2D(u_texture1, vec2(texture_coordinate.x / u_chroma_div_w, texture_coordinate.y / u_chroma_div_h)).r - 0.5;"
  169.         "yuv.b = texture2D(u_texture2, vec2(texture_coordinate.x / u_chroma_div_w, texture_coordinate.y / u_chroma_div_h)).r - 0.5;"
  170.  
  171.         "gl_FragColor = clamp(vec4(mat3(1.1643,  1.16430, 1.1643,"
  172.                                        "0.0,    -0.39173, 2.0170,"
  173.                                        "1.5958, -0.81290, 0.0) * yuv, texture2D(u_texture3, texture_coordinate).r), 0.0, 1.0);"
  174.     "}";
  175.  
  176. static const char * const FF_OPENGL_FRAGMENT_SHADER_GRAY =
  177. #if defined(GL_ES_VERSION_2_0)
  178.     "precision mediump float;"
  179. #endif
  180.     "uniform sampler2D u_texture0;"
  181.     "varying vec2 texture_coordinate;"
  182.     "void main()"
  183.     "{"
  184.         "float c = texture2D(u_texture0, texture_coordinate).r;"
  185.         "gl_FragColor = vec4(c, c, c, 1.0);"
  186.     "}";
  187.  
  188. #endif /* AVDEVICE_OPENGL_SHADERS_H */
  189.