[mmap] partial revert of 8cef8db4 to disable using mmap file reader
[videoplayer.git] / GLvideo_pbotex.cpp
blob0ecd2b1680babc86bfb6876d035e70003434deb6
1 #include <string.h>
2 #include <cassert>
4 //needed for NULL
5 #include <stdio.h>
7 #include "GLvideo_pbotex.h"
9 #include "videoData.h"
11 namespace GLVideoRenderer
13 #define BUFFER_OFFSET(i) ((char *)NULL + (i))
15 PboTex::PboTex()
17 textures.y = 0;
18 textures.u = 0;
19 textures.v = 0;
22 PboTex::~PboTex()
24 deleteTextures();
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)
38 deleteTextures();
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)
85 void *ioMem;
87 glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, buf);
89 if (video_data->isPlanar) {
90 glBufferData(GL_PIXEL_UNPACK_BUFFER_ARB, video_data->UdataSize, NULL,
91 GL_STREAM_DRAW);
92 ioMem = glMapBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, GL_WRITE_ONLY);
93 assert(ioMem);
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,
102 GL_STREAM_DRAW);
103 ioMem = glMapBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, GL_WRITE_ONLY);
104 assert(ioMem);
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,
114 GL_STREAM_DRAW);
115 ioMem = glMapBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, GL_WRITE_ONLY);
116 assert(ioMem);
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);
132 int i;
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 */
150 glBegin(GL_QUADS);
151 glTexCoord2i(0, video_data->Yheight);
152 glColor3f(1., 0., 0.);
153 glVertex2i(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);
160 glTexCoord2i(0, 0);
161 glColor3f(0., 0., 0.);
162 glVertex2i(0, video_data->Yheight);
163 glEnd();
164 glUseProgramObjectARB(0);
166 } // namespace