111 glewExperimental = GL_TRUE;
112 GLenum err = glewInit();
113 assert(err == GLEW_OK);
120 if ( decoder == NULL )
130 glEnable(GL_TEXTURE_2D);
136 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
137 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
138 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
139 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
141 GLenum internalformat;
145 internalformat = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
146 size = ((decoder->
width + 3) / 4 * 4) * ((decoder->
height + 3) / 4 * 4);
148 internalformat = GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
149 size = ((decoder->
width + 3) / 4 * 4) * ((decoder->
height + 3) / 4 * 4) / 2;
152 GLvoid *tmp_data = malloc(size);
153 glCompressedTexImage2DARB(GL_TEXTURE_2D, 0, internalformat, decoder->
width, decoder->
height, 0,
158 glGenFramebuffers(1, &decoder->
fbo_rgba);
159 glBindFramebuffer(GL_FRAMEBUFFER, decoder->
fbo_rgba);
163 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
164 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
165 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
166 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
168 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, decoder->
uncompressed_rgba_tex, 0);
169 glBindFramebuffer(GL_FRAMEBUFFER, 0);
175 switch(decoder->
type)
214 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
215 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
216 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
217 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
218 glTexImage2D(GL_TEXTURE_2D, 0 , GL_RGBA, decoder->
width / 2, decoder->
height, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, 0);
238 (GLfloat) decoder->
width);
241#if ! defined __APPLE__ || defined __MAC_10_11
242 GLint g_vertexLocation;
246 glGenVertexArrays(1, &decoder->
g_vao_422);
255 glGenBuffers(1, &g_vertices);
258 glBindBuffer(GL_ARRAY_BUFFER, g_vertices);
262 glBufferData(GL_ARRAY_BUFFER, 8 * 4 *
sizeof(GLfloat), (GLfloat*)
points, GL_STATIC_DRAW);
268 glVertexAttribPointer(g_vertexLocation, 4, GL_FLOAT, GL_FALSE, 0, 0);
271 glEnableVertexAttribArray(g_vertexLocation);
280#if ! defined __APPLE__ || defined __MAC_10_11
281 GLint g_vertexLocation;
285 glGenVertexArrays(1, &decoder->
g_vao);
288 glBindVertexArray(decoder->
g_vao);
291 g_vertexLocation = glGetAttribLocation(decoder->
program_display,
"position");
294 glGenBuffers(1, &g_vertices);
297 glBindBuffer(GL_ARRAY_BUFFER, g_vertices);
301 glBufferData(GL_ARRAY_BUFFER, 8 * 4 *
sizeof(GLfloat), (GLfloat*)
points, GL_STATIC_DRAW);
307 glVertexAttribPointer(g_vertexLocation, 4, GL_FLOAT, GL_FALSE, 0, 0);
310 glEnableVertexAttribArray(g_vertexLocation);
318#ifdef USE_PBO_DXT_DECODER
319 glGenBuffersARB(1, &decoder->pbo_in);
320 glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, decoder->pbo_in);
321 glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB,
325 glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0);
327 glGenBuffersARB(1, &decoder->pbo_out);
328 glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, decoder->pbo_out);
330 glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);
353#ifdef USE_PBO_DXT_DECODER
363 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
364 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
365 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
366 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
368 int data_size = ((decoder->
width + 3) / 4 * 4) * ((decoder->
height + 3) / 4 * 4) /
370#ifdef USE_PBO_DXT_DECODER
371 glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, decoder->pbo_in);
372 glCompressedTexSubImage2DARB (GL_TEXTURE_2D, 0, 0, 0,
373 (decoder->
width + 3) / 4 * 4,
374 (decoder->
height + 3) / 4 * 4,
378 glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, data_size, 0, GL_STREAM_DRAW_ARB);
379 ptr = (GLubyte*)glMapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, GL_WRITE_ONLY_ARB);
383 memcpy(ptr, image_compressed, data_size);
384 glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB);
387 glCompressedTexSubImage2DARB (GL_TEXTURE_2D, 0, 0, 0,
388 (decoder->
width + 3) / 4 * 4,
389 (decoder->
height + 3) / 4 * 4,
404 glBindFramebuffer(GL_FRAMEBUFFER, decoder->
fbo_rgba);
406 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
415 glTexCoord2f(0.0, 0.0); glVertex2f(-1.0, -1.0);
416 glTexCoord2f(1.0, 0.0); glVertex2f(1.0, -1.0);
417 glTexCoord2f(1.0, 1.0); glVertex2f(1.0, 1.0);
418 glTexCoord2f(0.0, 1.0); glVertex2f(-1.0, 1.0);
421#if ! defined __APPLE__ || defined __MAC_10_11
422 glBindVertexArray(decoder->
g_vao);
423 glDrawArrays(GL_TRIANGLES, 0, 6);
424 glBindVertexArray(0);
438#ifdef USE_PBO_DXT_DECODER
440 glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, decoder->pbo_out);
441 glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
442 glReadPixels(0, 0, decoder->
width, decoder->
height, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, 0);
445 glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, decoder->pbo_out);
446 ptr = (GLubyte*)glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB,
450 memcpy(image, ptr, decoder->
width * decoder->
height * 4);
451 glUnmapBufferARB(GL_PIXEL_PACK_BUFFER_ARB);
455 glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);
460 glBindFramebuffer(GL_FRAMEBUFFER, 0);
463 glBindFramebuffer(GL_FRAMEBUFFER, decoder->
fbo_yuv422);
464 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, decoder->
uncompressed_yuv422_tex, 0);
468 glPushAttrib(GL_VIEWPORT_BIT);
469 glViewport( 0, 0, decoder->
width / 2, decoder->
height);
475 glTexCoord2f(0.0, 0.0); glVertex2f(-1.0, -1.0);
476 glTexCoord2f(1.0, 0.0); glVertex2f(1.0, -1.0);
477 glTexCoord2f(1.0, 1.0); glVertex2f(1.0, 1.0);
478 glTexCoord2f(0.0, 1.0); glVertex2f(-1.0, 1.0);
481#if ! defined __APPLE__ || defined __MAC_10_11
483 glDrawArrays(GL_TRIANGLES, 0, 6);
484 glBindVertexArray(0);
490#ifdef USE_PBO_DXT_DECODER
492 glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, decoder->pbo_out);
493 glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
494 glReadPixels(0, 0, decoder->
width / 2, decoder->
height, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, 0);
497 glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, decoder->pbo_out);
498 ptr = (GLubyte*)glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB,
503 glUnmapBufferARB(GL_PIXEL_PACK_BUFFER_ARB);
507 glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);
509 glReadPixels(0, 0, decoder->
width / 2, decoder->
height, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, image);
513 glBindFramebuffer(GL_FRAMEBUFFER, 0);