UltraGrid
UltraGrid Low-Latency High-Resolution Transmission System
Loading...
Searching...
No Matches
dxt_decoder.h File Reference
#include "dxt_common.h"
Include dependency graph for dxt_decoder.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

int dxt_decoder_buffer_allocate (struct dxt_decoder *decoder, unsigned char **image, int *image_size)
 
int dxt_decoder_buffer_free (unsigned char *image)
 
struct dxt_decoder * dxt_decoder_create (enum dxt_type type, int width, int height, enum dxt_format out_format, int legacy)
 
int dxt_decoder_decompress (struct dxt_decoder *encoder, unsigned char *image_compressed, DXT_IMAGE_TYPE *image)
 
int dxt_decoder_destroy (struct dxt_decoder *decoder)
 

Function Documentation

◆ dxt_decoder_buffer_allocate()

int dxt_decoder_buffer_allocate ( struct dxt_decoder * decoder,
unsigned char ** image,
int * image_size )

Allocate buffer for decompressed image by decoder

Parameters
decoderDecoder structure
imagePointer to variable where buffer pointer will be placed
image_sizePointer to variable where image data size will be set
Returns
0 if succeeds, otherwise nonzero

Documented at declaration

Definition at line 340 of file dxt_decoder.c.

341{
342 *image_size = decoder->width * decoder->height * 4 * sizeof(DXT_IMAGE_TYPE);
343 *image = (DXT_IMAGE_TYPE*)malloc(*image_size);
344 if ( *image == NULL )
345 return -1;
346 return 0;
347}
#define DXT_IMAGE_TYPE
Definition dxt_common.h:71

References DXT_IMAGE_TYPE, dxt_decoder::height, and dxt_decoder::width.

Referenced by perform_decode().

◆ dxt_decoder_buffer_free()

int dxt_decoder_buffer_free ( unsigned char * image)

Free buffer for decompressed image

Parameters
imagePointer to buffer where decompressed image data are stored
Returns
0 if succeeds, otherwise nonzero

Documented at declaration

Definition at line 527 of file dxt_decoder.c.

528{
529 free(image);
530 return 0;
531}

Referenced by perform_decode().

◆ dxt_decoder_create()

struct dxt_decoder * dxt_decoder_create ( enum dxt_type type,
int width,
int height,
enum dxt_format out_format,
int legacy )

Create DXT decoder

Parameters
width
height
Returns
decoder structure or zero if fails

Documented at declaration

Todo
Free other stuff as well

Definition at line 106 of file dxt_decoder.c.

107{
108 struct dxt_decoder* decoder = (struct dxt_decoder*)malloc(sizeof(struct dxt_decoder));
109
110#ifndef HAVE_MACOSX
111 glewExperimental = GL_TRUE;
112 GLenum err = glewInit();
113 assert(err == GLEW_OK);
114#endif
115
117 assert(out_format == DXT_FORMAT_RGBA ||
118 (out_format == DXT_FORMAT_YUV422 && width % 2 == 0)); /* width % 2 for YUV422 */
119
120 if ( decoder == NULL )
121 return NULL;
122 decoder->type = type;
123 decoder->width = width;
124 decoder->height = height;
125 decoder->out_format = out_format;
126 decoder->legacy = legacy;
127 //glutReshapeWindow(1, 1);
128
129 if(legacy) {
130 glEnable(GL_TEXTURE_2D);
131 }
132
133 // Create empty texture
134 glGenTextures(1, &decoder->compressed_tex);
135 glBindTexture(GL_TEXTURE_2D, decoder->compressed_tex);
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);
140
141 GLenum internalformat;
142 size_t size;
143
144 if ( decoder->type == DXT_TYPE_DXT5_YCOCG ) {
145 internalformat = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
146 size = ((decoder->width + 3) / 4 * 4) * ((decoder->height + 3) / 4 * 4);
147 } else {
148 internalformat = GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
149 size = ((decoder->width + 3) / 4 * 4) * ((decoder->height + 3) / 4 * 4) / 2;
150 }
151
152 GLvoid *tmp_data = malloc(size); // data pointer to glCompressedTexImage2D shouldn't be 0
153 glCompressedTexImage2DARB(GL_TEXTURE_2D, 0, internalformat, decoder->width, decoder->height, 0,
154 size, tmp_data);
155 free(tmp_data);
156
157 // Create fbo
158 glGenFramebuffers(1, &decoder->fbo_rgba);
159 glBindFramebuffer(GL_FRAMEBUFFER, decoder->fbo_rgba);
160
161 glGenTextures(1, &decoder->uncompressed_rgba_tex);
162 glBindTexture(GL_TEXTURE_2D, decoder->uncompressed_rgba_tex);
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);
167 glTexImage2D(GL_TEXTURE_2D, 0 , DXT_IMAGE_GL_FORMAT, decoder->width, decoder->height, 0, GL_RGBA, DXT_IMAGE_GL_TYPE, 0);
168 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, decoder->uncompressed_rgba_tex, 0);
169 glBindFramebuffer(GL_FRAMEBUFFER, 0);
170
171 // Create program [display] and its shader
172 decoder->program_display = glCreateProgram();
173 // Create shader from file
174 decoder->shader_fragment_display = 0;
175 switch(decoder->type)
176 {
178 if(legacy)
179 decoder->shader_fragment_display = dxt_shader_create_from_source(fp_display_dxt5ycocg_legacy, GL_FRAGMENT_SHADER);
180 else
182 break;
183 case DXT_TYPE_DXT1:
184 if(legacy)
185 decoder->shader_fragment_display = dxt_shader_create_from_source(fp_display_legacy, GL_FRAGMENT_SHADER);
186 else
187 decoder->shader_fragment_display = dxt_shader_create_from_source(fp_display, GL_FRAGMENT_SHADER);
188 break;
190 if(legacy)
191 decoder->shader_fragment_display = dxt_shader_create_from_source(fp_display_dxt1_yuv_legacy, GL_FRAGMENT_SHADER);
192 else
194 break;
195 }
196 if(legacy) {
197 decoder->shader_vertex_display = dxt_shader_create_from_source(vp_compress_legacy, GL_VERTEX_SHADER);
198 } else {
199 decoder->shader_vertex_display = dxt_shader_create_from_source(vp_compress, GL_VERTEX_SHADER);
200 }
201 if ( decoder->shader_fragment_display == 0 || decoder->shader_vertex_display == 0 ) {
203 free(decoder);
204 return NULL;
205 }
206 // Attach shader to program and link the program
207 glAttachShader(decoder->program_display, decoder->shader_fragment_display);
208 glAttachShader(decoder->program_display, decoder->shader_vertex_display);
209 glLinkProgram(decoder->program_display);
210
212 glGenTextures(1, &decoder->uncompressed_yuv422_tex);
213 glBindTexture(GL_TEXTURE_2D, decoder->uncompressed_yuv422_tex);
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);
219
220 glGenFramebuffers(1, &decoder->fbo_yuv422);
221
222 if(legacy) {
224 decoder->shader_vertex_rgba_to_yuv422 = dxt_shader_create_from_source(vp_compress_legacy, GL_VERTEX_SHADER);
225 } else {
226 decoder->shader_fragment_rgba_to_yuv422 = dxt_shader_create_from_source(fp_display_rgba_to_yuv422, GL_FRAGMENT_SHADER);
227 decoder->shader_vertex_rgba_to_yuv422 = dxt_shader_create_from_source(vp_compress, GL_VERTEX_SHADER);
228 }
229
230 decoder->program_rgba_to_yuv422 = glCreateProgram();
231 glAttachShader(decoder->program_rgba_to_yuv422, decoder->shader_fragment_rgba_to_yuv422);
232 glAttachShader(decoder->program_rgba_to_yuv422, decoder->shader_vertex_rgba_to_yuv422);
233 glLinkProgram(decoder->program_rgba_to_yuv422);
234
235 glUseProgram(decoder->program_rgba_to_yuv422);
236 glUniform1i(glGetUniformLocation(decoder->program_rgba_to_yuv422, "image"), 0);
237 glUniform1f(glGetUniformLocation(decoder->program_rgba_to_yuv422, "imageWidth"),
238 (GLfloat) decoder->width);
239
240 if(!decoder->legacy) {
241#if ! defined __APPLE__ || defined __MAC_10_11
242 GLint g_vertexLocation;
243 GLuint g_vertices;
244
245 // ToDo:
246 glGenVertexArrays(1, &decoder->g_vao_422);
247
248 // ToDo:
249 glBindVertexArray(decoder->g_vao_422);
250
251 // http://www.opengl.org/sdk/docs/man/xhtml/glGetAttribLocation.xml
252 g_vertexLocation = glGetAttribLocation(decoder->program_rgba_to_yuv422, "position");
253
254 // http://www.opengl.org/sdk/docs/man/xhtml/glGenBuffers.xml
255 glGenBuffers(1, &g_vertices);
256
257 // http://www.opengl.org/sdk/docs/man/xhtml/glBindBuffer.xml
258 glBindBuffer(GL_ARRAY_BUFFER, g_vertices);
259
260 // http://www.opengl.org/sdk/docs/man/xhtml/glBufferData.xml
261 //glBufferData(GL_ARRAY_BUFFER, 3 * 4 * sizeof(GLfloat), (GLfloat*) points, GL_STATIC_DRAW);
262 glBufferData(GL_ARRAY_BUFFER, 8 * 4 * sizeof(GLfloat), (GLfloat*) points, GL_STATIC_DRAW);
263
264 // http://www.opengl.org/sdk/docs/man/xhtml/glUseProgram.xml
265 glUseProgram(decoder->program_rgba_to_yuv422);
266
267 // http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttribPointer.xml
268 glVertexAttribPointer(g_vertexLocation, 4, GL_FLOAT, GL_FALSE, 0, 0);
269
270 // http://www.opengl.org/sdk/docs/man/xhtml/glEnableVertexAttribArray.xml
271 glEnableVertexAttribArray(g_vertexLocation);
272
273 glBindFragDataLocation(decoder->program_rgba_to_yuv422, 0, "colorOut");
274#endif
275 }
276
277 glUseProgram(0);
278 }
279 if(!decoder->legacy) {
280#if ! defined __APPLE__ || defined __MAC_10_11
281 GLint g_vertexLocation;
282 GLuint g_vertices;
283
284 // ToDo:
285 glGenVertexArrays(1, &decoder->g_vao);
286
287 // ToDo:
288 glBindVertexArray(decoder->g_vao);
289
290 // http://www.opengl.org/sdk/docs/man/xhtml/glGetAttribLocation.xml
291 g_vertexLocation = glGetAttribLocation(decoder->program_display, "position");
292
293 // http://www.opengl.org/sdk/docs/man/xhtml/glGenBuffers.xml
294 glGenBuffers(1, &g_vertices);
295
296 // http://www.opengl.org/sdk/docs/man/xhtml/glBindBuffer.xml
297 glBindBuffer(GL_ARRAY_BUFFER, g_vertices);
298
299 // http://www.opengl.org/sdk/docs/man/xhtml/glBufferData.xml
300 //glBufferData(GL_ARRAY_BUFFER, 3 * 4 * sizeof(GLfloat), (GLfloat*) points, GL_STATIC_DRAW);
301 glBufferData(GL_ARRAY_BUFFER, 8 * 4 * sizeof(GLfloat), (GLfloat*) points, GL_STATIC_DRAW);
302
303 // http://www.opengl.org/sdk/docs/man/xhtml/glUseProgram.xml
304 glUseProgram(decoder->program_display);
305
306 // http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttribPointer.xml
307 glVertexAttribPointer(g_vertexLocation, 4, GL_FLOAT, GL_FALSE, 0, 0);
308
309 // http://www.opengl.org/sdk/docs/man/xhtml/glEnableVertexAttribArray.xml
310 glEnableVertexAttribArray(g_vertexLocation);
311
312 glBindFragDataLocation(decoder->program_display, 0, "colorOut");
313
314 glUseProgram(0);
315#endif
316
317
318#ifdef USE_PBO_DXT_DECODER
319 glGenBuffersARB(1, &decoder->pbo_in); //Allocate PBO
320 glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, decoder->pbo_in);
321 glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB,
322 ((width + 3) / 4 * 4) * ((height + 3) / 4 * 4) / (decoder->type == DXT_TYPE_DXT5_YCOCG ? 1 : 2),
323 0,
324 GL_STREAM_DRAW_ARB);
325 glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0);
326
327 glGenBuffersARB(1, &decoder->pbo_out); //Allocate PBO
328 glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, decoder->pbo_out);
329 glBufferDataARB(GL_PIXEL_PACK_BUFFER_ARB, ((width + 3) / 4 * 4) * ((height + 3) / 4 * 4) * (out_format == DXT_FORMAT_YUV422 ? 2 : 4), 0, GL_STREAM_READ_ARB);
330 glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);
331#endif
332
333 }
334
335 return decoder;
336}
#define DXT_IMAGE_GL_TYPE
Definition dxt_common.h:72
#define DXT_IMAGE_GL_FORMAT
Definition dxt_common.h:73
@ DXT_FORMAT_RGBA
Definition dxt_common.h:80
@ DXT_FORMAT_YUV422
Definition dxt_common.h:82
@ DXT_TYPE_DXT1_YUV
Definition dxt_common.h:90
@ DXT_TYPE_DXT1
Definition dxt_common.h:89
@ DXT_TYPE_DXT5_YCOCG
Definition dxt_common.h:91
static GLfloat points[]
Definition dxt_decoder.c:50
GLuint dxt_shader_create_from_source(const char *source, GLenum type)
Definition dxt_util.c:32
static const char * fp_display_dxt1_yuv
Definition gl.cpp:283
static const char fp_display_dxt5ycocg[]
Definition gl.cpp:310
Option::OptType type
Definition settings.cpp:194
GLuint shader_vertex_rgba_to_yuv422
Definition dxt_decoder.c:88
GLuint uncompressed_yuv422_tex
Definition dxt_decoder.c:75
GLuint uncompressed_rgba_tex
Definition dxt_decoder.c:74
GLuint fbo_yuv422
Definition dxt_decoder.c:79
unsigned int legacy
GLuint shader_vertex_display
Definition dxt_decoder.c:84
GLuint program_display
Definition dxt_decoder.c:82
GLuint g_vao_422
Definition dxt_decoder.c:94
GLuint shader_fragment_display
Definition dxt_decoder.c:83
enum dxt_type type
Definition dxt_decoder.c:63
GLuint fbo_rgba
Definition dxt_decoder.c:78
GLuint shader_fragment_rgba_to_yuv422
Definition dxt_decoder.c:87
enum dxt_format out_format
Definition dxt_decoder.c:64
GLuint g_vao
Definition dxt_decoder.c:93
GLuint compressed_tex
Definition dxt_decoder.c:73
GLuint program_rgba_to_yuv422
Definition dxt_decoder.c:86
static const char fp_display_rgba_to_yuv422_legacy[]
Definition syphon.m:76

References dxt_decoder::compressed_tex, DXT_FORMAT_RGBA, DXT_FORMAT_YUV422, DXT_IMAGE_GL_FORMAT, DXT_IMAGE_GL_TYPE, dxt_shader_create_from_source(), DXT_TYPE_DXT1, DXT_TYPE_DXT1_YUV, DXT_TYPE_DXT5_YCOCG, dxt_decoder::fbo_rgba, dxt_decoder::fbo_yuv422, fp_display_dxt1_yuv, fp_display_dxt5ycocg, fp_display_rgba_to_yuv422_legacy, dxt_decoder::g_vao, dxt_decoder::g_vao_422, dxt_decoder::height, dxt_decoder::legacy, dxt_decoder::out_format, points, dxt_decoder::program_display, dxt_decoder::program_rgba_to_yuv422, dxt_decoder::shader_fragment_display, dxt_decoder::shader_fragment_rgba_to_yuv422, dxt_decoder::shader_vertex_display, dxt_decoder::shader_vertex_rgba_to_yuv422, dxt_decoder::type, type, dxt_decoder::uncompressed_rgba_tex, dxt_decoder::uncompressed_yuv422_tex, and dxt_decoder::width.

Referenced by configure_with(), and perform_decode().

Here is the call graph for this function:

◆ dxt_decoder_decompress()

int dxt_decoder_decompress ( struct dxt_decoder * decoder,
unsigned char * image_compressed,
DXT_IMAGE_TYPE * image )

Decompress image by DXT decoder

Parameters
Decoderstructure
image_compressedCompressed image data
image_compressed_sizeCompressed image data size
imagePointer to buffer where image data will be placed
Returns
0 if succeeds, otherwise nonzero

Documented at declaration

Definition at line 351 of file dxt_decoder.c.

352{
353#ifdef USE_PBO_DXT_DECODER
354 GLubyte *ptr;
355#endif
356
357#ifdef RTDXT_DEBUG
358 TIMER_INIT();
359
360 TIMER_START();
361#endif
362 glBindTexture(GL_TEXTURE_2D, decoder->compressed_tex);
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);
367
368 int data_size = ((decoder->width + 3) / 4 * 4) * ((decoder->height + 3) / 4 * 4) /
369 (decoder->type == DXT_TYPE_DXT5_YCOCG ? 1 : 2);
370#ifdef USE_PBO_DXT_DECODER
371 glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, decoder->pbo_in); // current pbo
372 glCompressedTexSubImage2DARB (GL_TEXTURE_2D, 0, 0, 0,
373 (decoder->width + 3) / 4 * 4,
374 (decoder->height + 3) / 4 * 4,
375 decoder->type == DXT_TYPE_DXT5_YCOCG ? GL_COMPRESSED_RGBA_S3TC_DXT5_EXT : GL_COMPRESSED_RGB_S3TC_DXT1_EXT,
376 data_size,
377 0);
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);
380 if(ptr)
381 {
382 // update data directly on the mapped buffer
383 memcpy(ptr, image_compressed, data_size);
384 glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB); // release pointer to mapping buffer
385 }
386#else
387 glCompressedTexSubImage2DARB (GL_TEXTURE_2D, 0, 0, 0,
388 (decoder->width + 3) / 4 * 4,
389 (decoder->height + 3) / 4 * 4,
390 decoder->type == DXT_TYPE_DXT5_YCOCG ? GL_COMPRESSED_RGBA_S3TC_DXT5_EXT : GL_COMPRESSED_RGB_S3TC_DXT1_EXT,
391 data_size,
392 image_compressed);
393#endif
394
395
396#ifdef RTDXT_DEBUG
397 glFinish();
398 TIMER_STOP_PRINT("Texture Load: ");
399
400 TIMER_START();
401#endif
402
403 // Render to framebuffer
404 glBindFramebuffer(GL_FRAMEBUFFER, decoder->fbo_rgba);
405
406 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
407 glViewport(0, 0, decoder->width, decoder->height);
408
409 glUseProgram(decoder->program_display);
410
411 glBindTexture(GL_TEXTURE_2D, decoder->compressed_tex);
412
413 if(decoder->legacy) {
414 glBegin(GL_QUADS);
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);
419 glEnd();
420 } else {
421#if ! defined __APPLE__ || defined __MAC_10_11
422 glBindVertexArray(decoder->g_vao);
423 glDrawArrays(GL_TRIANGLES, 0, 6);
424 glBindVertexArray(0);
425#endif
426 }
427
428 glUseProgram(0);
429#ifdef RTDXT_DEBUG
430 glFinish();
431 TIMER_STOP_PRINT("Texture Decompress:");
432
433 TIMER_START();
434#endif
435 if(decoder->out_format != DXT_FORMAT_YUV422) { /* so RGBA */
436 // Disable framebuffer
437
438#ifdef USE_PBO_DXT_DECODER
439 // glReadPixels() should return immediately.
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);
443
444 // map the PBO to process its data by CPU
445 glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, decoder->pbo_out);
446 ptr = (GLubyte*)glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB,
447 GL_READ_ONLY_ARB);
448 if(ptr)
449 {
450 memcpy(image, ptr, decoder->width * decoder->height * 4);
451 glUnmapBufferARB(GL_PIXEL_PACK_BUFFER_ARB);
452 }
453
454 // back to conventional pixel operation
455 glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);
456#else
457 glReadPixels(0, 0, decoder->width, decoder->height, GL_RGBA, DXT_IMAGE_GL_TYPE, image);
458#endif
459
460 glBindFramebuffer(GL_FRAMEBUFFER, 0);
461 } else {
462
463 glBindFramebuffer(GL_FRAMEBUFFER, decoder->fbo_yuv422);
464 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, decoder->uncompressed_yuv422_tex, 0);
465
466 glBindTexture(GL_TEXTURE_2D, decoder->uncompressed_rgba_tex); /* to texturing unit 0 */
467
468 glPushAttrib(GL_VIEWPORT_BIT);
469 glViewport( 0, 0, decoder->width / 2, decoder->height);
470
471 glUseProgram(decoder->program_rgba_to_yuv422);
472
473 if(decoder->legacy) {
474 glBegin(GL_QUADS);
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);
479 glEnd();
480 } else {
481#if ! defined __APPLE__ || defined __MAC_10_11
482 glBindVertexArray(decoder->g_vao_422);
483 glDrawArrays(GL_TRIANGLES, 0, 6);
484 glBindVertexArray(0);
485#endif
486 }
487
488 glPopAttrib();
489
490#ifdef USE_PBO_DXT_DECODER
491 // glReadPixels() should return immediately.
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);
495
496 // map the PBO to process its data by CPU
497 glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, decoder->pbo_out);
498 ptr = (GLubyte*)glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB,
499 GL_READ_ONLY_ARB);
500 if(ptr)
501 {
502 memcpy(image, ptr, decoder->width * decoder->height * (decoder->out_format == DXT_FORMAT_YUV422 ? 2 : 4));
503 glUnmapBufferARB(GL_PIXEL_PACK_BUFFER_ARB);
504 }
505
506 // back to conventional pixel operation
507 glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);
508#else
509 glReadPixels(0, 0, decoder->width / 2, decoder->height, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, image);
510#endif
511
512 //glReadPixels(0, 0, decoder->width / 2, decoder->height, GL_RGBA, DXT_IMAGE_GL_TYPE, image);
513 glBindFramebuffer(GL_FRAMEBUFFER, 0);
514 glUseProgram(0);
515 }
516
517#ifdef RTDXT_DEBUG
518 glFinish();
519 TIMER_STOP_PRINT("Texture Save: ");
520#endif
521
522 return 0;
523}
#define TIMER_STOP_PRINT(text)
Definition dxt_common.h:64
#define TIMER_START()
Definition dxt_common.h:56
#define TIMER_INIT()
Definition dxt_common.h:52

References dxt_decoder::compressed_tex, DXT_FORMAT_YUV422, DXT_IMAGE_GL_TYPE, DXT_TYPE_DXT5_YCOCG, dxt_decoder::fbo_rgba, dxt_decoder::fbo_yuv422, dxt_decoder::g_vao, dxt_decoder::g_vao_422, dxt_decoder::height, dxt_decoder::legacy, dxt_decoder::out_format, dxt_decoder::program_display, dxt_decoder::program_rgba_to_yuv422, TIMER_INIT, TIMER_START, TIMER_STOP_PRINT, dxt_decoder::type, dxt_decoder::uncompressed_rgba_tex, dxt_decoder::uncompressed_yuv422_tex, and dxt_decoder::width.

Referenced by dxt_glsl_decompress(), and perform_decode().

◆ dxt_decoder_destroy()

int dxt_decoder_destroy ( struct dxt_decoder * decoder)

Destroy DXT decoder

Parameters
decoderDecoder structure
Returns
0 if succeeds, otherwise nonzero

Documented at declaration

Definition at line 535 of file dxt_decoder.c.

536{
537 glDeleteShader(decoder->shader_fragment_display);
538 glDeleteProgram(decoder->program_display);
539 glDeleteTextures(1, &decoder->compressed_tex);
540 glDeleteTextures(1, &decoder->uncompressed_rgba_tex);
541 glDeleteFramebuffers(1, &decoder->fbo_rgba);
542
543 if(decoder->out_format == DXT_FORMAT_YUV422) {
544 glDeleteTextures(1, &decoder->uncompressed_yuv422_tex);
545 glDeleteFramebuffers(1, &decoder->fbo_yuv422);
546 }
547 free(decoder);
548 return 0;
549}

References dxt_decoder::compressed_tex, DXT_FORMAT_YUV422, dxt_decoder::fbo_rgba, dxt_decoder::fbo_yuv422, dxt_decoder::out_format, dxt_decoder::program_display, dxt_decoder::shader_fragment_display, dxt_decoder::uncompressed_rgba_tex, and dxt_decoder::uncompressed_yuv422_tex.

Referenced by dxt_glsl_decompress_done(), dxt_glsl_decompress_reconfigure(), and perform_decode().