My work thus far. Contains shaders for motion compensation with 1 reference picture...
[xbmc:xbmc-antiquated.git] / sources / dvdplayer / ffmpeg / gpu / shaders / qpel2.frag
1 uniform sampler2DRect textureIn;
2
3 //Coefficients of the 6 tap filter
4 vec2 coeffs_l = vec2(1.0, -5.0);
5 vec4 coeffs_r = vec4(20.0, 20.0,-5.0, 1.0);
6
7 void main(void)
8 {
9
10   vec2 l[6], v2,row, col;
11   vec4 r[6], v4;
12   mat3 pels;
13   float mv_x, mv_y, halfpel;
14
15   mv_x = gl_TexCoord[1].s;
16   mv_y = gl_TexCoord[1].t;
17
18   if(mv_y == 0.5)
19     {
20       row = vec2(1.0, 0.0);
21       col = vec2(0.0, 1.0);
22     }
23   else
24     {
25       row = vec2(0.0, 1.0);
26       col = vec2(1.0, 0.0);
27     }
28
29
30   for(int i=0; i<6; i++)
31   {
32     vec2 col_pos =  col*(i-2.0);
33     l[i] = vec2(texture2DRect(textureIn, gl_TexCoord[0].st + row*-2.0 + col_pos).r,
34                 texture2DRect(textureIn, gl_TexCoord[0].st - row      + col_pos).r);
35     
36     r[i] = vec4(texture2DRect(textureIn, gl_TexCoord[0].st            + col_pos).r,
37                 texture2DRect(textureIn, gl_TexCoord[0].st + row      + col_pos).r,
38                 texture2DRect(textureIn, gl_TexCoord[0].st + row*2.0  + col_pos).r,
39                 texture2DRect(textureIn, gl_TexCoord[0].st + row*3.0  + col_pos).r);
40   }
41
42
43
44   //Left convolution
45   v2 = l[0] - 5*l[1] + 20*l[2] + 20*l[3] -5*l[4] + l[5];
46
47   //Right convolution
48   v4 = r[0] - 5*r[1] + 20*r[2] + 20*r[3] -5*r[4] + r[5];
49
50   if(mv_x > 0.5 || mv_y > 0.5)
51     halfpel = floor((v4.y + 16)/32);
52   else
53     halfpel = floor((v4.x + 16)/32);
54
55   //Texturein contains the previous frame
56   // gl_FragColor = floor((intpel + dot(v2*coeffs_l, vec2(1.0, 1.0)) + dot(v4*coeffs_r, vec4(1.0, 1.0, 1.0, 1.0)) + 1)/2);
57   gl_FragColor = floor( (floor((dot(v2*coeffs_l, vec2(1.0, 1.0)) + dot(v4*coeffs_r, vec4(1.0, 1.0, 1.0, 1.0)) + 512)/1024) + halfpel +1)/2)/255;
58   //gl_FragColor = vec4(0.0, 1.0, 0.0, 0.0);
59 }