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