1be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev/*
2be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev * Copyright 2010, Google Inc.
3be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev * All rights reserved.
4be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev *
5be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev * Redistribution and use in source and binary forms, with or without
6be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev * modification, are permitted provided that the following conditions are
7be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev * met:
8be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev *
9be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev *     * Redistributions of source code must retain the above copyright
10be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev * notice, this list of conditions and the following disclaimer.
11be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev *     * Redistributions in binary form must reproduce the above
12be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev * copyright notice, this list of conditions and the following disclaimer
13be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev * in the documentation and/or other materials provided with the
14be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev * distribution.
15be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev *     * Neither the name of Google Inc. nor the names of its
16be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev * contributors may be used to endorse or promote products derived from
17be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev * this software without specific prior written permission.
18be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev *
19be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev */
31be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev
32be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev/*
33be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev * This is a semiplanar YUV to RGB conversion shader that uses separate
34be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev * samplers to hold Y, and UV components.
35be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev */
36be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev
37be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichevuniform sampler2D ySampler;
38be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichevuniform sampler2D uvSampler; /* GL_LUMINANCE_ALPHA */
39be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev
40be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev#if defined (USE_UNIFORM_MATRIX)
41be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichevuniform mat4 conversion;
42be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev#endif
43be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev
44be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichevvarying vec2 yPlane;
45be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichevvarying vec2 uvPlane;
46be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev
47be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichevvoid main() {
48be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev  float yChannel = texture2D(ySampler, yPlane).r;
49be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev  vec2 uvChannel = texture2D(uvSampler, uvPlane).ra;
50be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev  /*
51be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev   * This does the colorspace conversion from Y'UV to RGB as a matrix
52be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev   * multiply.  It also does the offset of the U and V channels from
53be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev   * [0,1] to [-.5,.5] as part of the transform.
54be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev   */
55be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev  vec4 channels = vec4(yChannel, uvChannel, 1.0);
56be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev
57be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev#if !defined(USE_UNIFORM_MATRIX)
58be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev  mat4 conversion = mat4( 1.0,    1.0,    1.0,   0.0,
59be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev                          0.0,   -0.344,  1.772, 0.0,
60be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev                          1.402, -0.714,  0.0,   0.0,
61be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev                         -0.701,  0.529, -0.886, 1.0);
62be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev#endif
63be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev
64be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev  gl_FragColor = conversion * channels;
65be37f88d1ae9af9885d171adb625364387257c4cAlexey Marinichev}
66