7 #include "GLvideo_pbotex.h"
11 namespace GLVideoRenderer
13 #define BUFFER_OFFSET(i) ((char *)NULL + (i))
27 void PboTex::deleteTextures()
29 if(glIsTexture(textures
.y
)) glDeleteTextures(1, &(textures
.y
));
30 if(glIsTexture(textures
.u
)) glDeleteTextures(1, &(textures
.u
));
31 if(glIsTexture(textures
.v
)) glDeleteTextures(1, &(textures
.v
));
33 if(glIsBuffer(buf
)) glDeleteBuffers(1, &buf
);
36 void PboTex::createTextures(VideoData
*video_data
)
40 glGenTextures(3, (GLuint
*)&textures
);
41 glGenBuffers(1, &buf
);
43 /* The explicit bind to the zero pixel unpack buffer object allows
44 * passing NULL in glTexImage2d() to be unspecified texture data
45 * (ie, create the storage for the texture but don't upload antything
47 glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB
, 0);
49 if (video_data
->isPlanar
) {
50 glBindTexture(GL_TEXTURE_RECTANGLE_ARB
, textures
.u
);
51 glTexImage2D(GL_TEXTURE_RECTANGLE_ARB
, 0, video_data
->glInternalFormat
,
52 video_data
->Cwidth
, video_data
->Cheight
, 0,
53 video_data
->glFormat
, video_data
->glType
, NULL
);
54 glTexParameteri(GL_TEXTURE_RECTANGLE_ARB
, GL_TEXTURE_MAG_FILTER
,
55 video_data
->glMinMaxFilter
);
56 glTexParameteri(GL_TEXTURE_RECTANGLE_ARB
, GL_TEXTURE_MIN_FILTER
,
57 video_data
->glMinMaxFilter
);
59 glBindTexture(GL_TEXTURE_RECTANGLE_ARB
, textures
.v
);
60 glTexImage2D(GL_TEXTURE_RECTANGLE_ARB
, 0, video_data
->glInternalFormat
,
61 video_data
->Cwidth
, video_data
->Cheight
, 0,
62 video_data
->glFormat
, video_data
->glType
, NULL
);
63 glTexParameteri(GL_TEXTURE_RECTANGLE_ARB
, GL_TEXTURE_MAG_FILTER
,
64 video_data
->glMinMaxFilter
);
65 glTexParameteri(GL_TEXTURE_RECTANGLE_ARB
, GL_TEXTURE_MIN_FILTER
,
66 video_data
->glMinMaxFilter
);
68 glBindTexture(GL_TEXTURE_RECTANGLE_ARB
, 0);
71 glBindTexture(GL_TEXTURE_RECTANGLE_ARB
, textures
.y
);
72 glTexImage2D(GL_TEXTURE_RECTANGLE_ARB
, 0, video_data
->glInternalFormat
,
73 video_data
->glYTextureWidth
, video_data
->Yheight
, 0,
74 video_data
->glFormat
, video_data
->glType
, NULL
);
75 glTexParameteri(GL_TEXTURE_RECTANGLE_ARB
, GL_TEXTURE_MAG_FILTER
,
76 video_data
->glMinMaxFilter
);
77 glTexParameteri(GL_TEXTURE_RECTANGLE_ARB
, GL_TEXTURE_MIN_FILTER
,
78 video_data
->glMinMaxFilter
);
80 glBindTexture(GL_TEXTURE_RECTANGLE_ARB
, 0);
83 void PboTex::uploadTextures(VideoData
*video_data
)
87 glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB
, buf
);
89 if (video_data
->isPlanar
) {
90 glBufferData(GL_PIXEL_UNPACK_BUFFER_ARB
, video_data
->UdataSize
, NULL
,
92 ioMem
= glMapBuffer(GL_PIXEL_UNPACK_BUFFER_ARB
, GL_WRITE_ONLY
);
94 memcpy(ioMem
, video_data
->Udata
, video_data
->UdataSize
);
95 glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER_ARB
);
96 glBindTexture(GL_TEXTURE_RECTANGLE_ARB
, textures
.u
);
97 glTexSubImage2D(GL_TEXTURE_RECTANGLE_ARB
, 0, 0, 0, video_data
->Cwidth
,
98 video_data
->Cheight
, video_data
->glFormat
,
99 video_data
->glType
, BUFFER_OFFSET(0));
101 glBufferData(GL_PIXEL_UNPACK_BUFFER_ARB
, video_data
->VdataSize
, NULL
,
103 ioMem
= glMapBuffer(GL_PIXEL_UNPACK_BUFFER_ARB
, GL_WRITE_ONLY
);
105 memcpy(ioMem
, video_data
->Vdata
, video_data
->VdataSize
);
106 glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER_ARB
);
107 glBindTexture(GL_TEXTURE_RECTANGLE_ARB
, textures
.v
);
108 glTexSubImage2D(GL_TEXTURE_RECTANGLE_ARB
, 0, 0, 0, video_data
->Cwidth
,
109 video_data
->Cheight
, video_data
->glFormat
,
110 video_data
->glType
, BUFFER_OFFSET(0));
113 glBufferData(GL_PIXEL_UNPACK_BUFFER_ARB
, video_data
->YdataSize
, NULL
,
115 ioMem
= glMapBuffer(GL_PIXEL_UNPACK_BUFFER_ARB
, GL_WRITE_ONLY
);
117 memcpy(ioMem
, video_data
->Ydata
, video_data
->YdataSize
);
118 glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER_ARB
);
119 glBindTexture(GL_TEXTURE_RECTANGLE_ARB
, textures
.y
);
120 glTexSubImage2D(GL_TEXTURE_RECTANGLE_ARB
, 0, 0, 0, video_data
->glYTextureWidth
,
121 video_data
->Yheight
, video_data
->glFormat
,
122 video_data
->glType
, BUFFER_OFFSET(0));
124 glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB
, 0);
127 void PboTex::renderVideo(VideoData
*video_data
, GLuint shader_prog
)
129 glClear(GL_COLOR_BUFFER_BIT
);
131 glUseProgramObjectARB(shader_prog
);
133 if (video_data
->isPlanar
) {
134 glActiveTexture(GL_TEXTURE1
);
135 glBindTexture(GL_TEXTURE_RECTANGLE_ARB
, textures
.u
);
136 i
= glGetUniformLocationARB(shader_prog
, "Utex");
137 glUniform1iARB(i
, 1); /* Bind Ytex to texture unit 1 */
139 glActiveTexture(GL_TEXTURE2
);
140 glBindTexture(GL_TEXTURE_RECTANGLE_ARB
, textures
.v
);
141 i
= glGetUniformLocationARB(shader_prog
, "Vtex");
142 glUniform1iARB(i
, 2); /* Bind Ytex to texture unit 2 */
145 glActiveTexture(GL_TEXTURE0
);
146 glBindTexture(GL_TEXTURE_RECTANGLE_ARB
, textures
.y
);
147 i
= glGetUniformLocationARB(shader_prog
, "Ytex");
148 glUniform1iARB(i
, 0); /* Bind Ytex to texture unit 0 */
151 glTexCoord2i(0, video_data
->Yheight
);
152 glColor3f(1., 0., 0.);
154 glTexCoord2i(video_data
->glYTextureWidth
, video_data
->Yheight
);
155 glColor3f(0., 1., 0.);
156 glVertex2i(video_data
->Ywidth
, 0);
157 glTexCoord2i(video_data
->glYTextureWidth
, 0);
158 glColor3f(0., 0., 1.);
159 glVertex2i(video_data
->Ywidth
, video_data
->Yheight
);
161 glColor3f(0., 0., 0.);
162 glVertex2i(0, video_data
->Yheight
);
164 glUseProgramObjectARB(0);