UltraGrid
UltraGrid Low-Latency High-Resolution Transmission System
Loading...
Searching...
No Matches
dxt_glsl.c File Reference
#include "debug.h"
#include "host.h"
#include "video_decompress.h"
#include "dxt_compress/dxt_decoder.h"
#include "dxt_compress/dxt_util.h"
#include "video.h"
#include <pthread.h>
#include <stdlib.h>
#include "lib_common.h"
#include "gl_context.h"
Include dependency graph for dxt_glsl.c:

Go to the source code of this file.

Classes

struct  state_decompress_rtdxt
 

Functions

static int configure_with (struct state_decompress_rtdxt *decompressor, struct video_desc desc)
 
static decompress_status dxt_glsl_decompress (void *state, unsigned char *dst, unsigned char *buffer, unsigned int src_len, int frame_seq, struct video_frame_callbacks *callbacks, struct pixfmt_desc *internal_prop)
 
static void dxt_glsl_decompress_done (void *state)
 
static int dxt_glsl_decompress_get_priority (codec_t compression, struct pixfmt_desc internal, codec_t ugc)
 
static int dxt_glsl_decompress_get_property (void *state, int property, void *val, size_t *len)
 
static void * dxt_glsl_decompress_init (void)
 
static int dxt_glsl_decompress_reconfigure (void *state, struct video_desc desc, int rshift, int gshift, int bshift, int pitch, codec_t out_codec)
 
 REGISTER_MODULE (dxt_glsl, &dxt_glsl_info, LIBRARY_CLASS_VIDEO_DECOMPRESS, VIDEO_DECOMPRESS_ABI_VERSION)
 

Variables

static const struct video_decompress_info dxt_glsl_info
 

Detailed Description

Author
Martin Pulec pulec.nosp@m.@ces.nosp@m.net.c.nosp@m.z

Definition in file dxt_glsl.c.

Function Documentation

◆ configure_with()

static int configure_with ( struct state_decompress_rtdxt * decompressor,
struct video_desc desc )
static

Definition at line 70 of file dxt_glsl.c.

71{
72 enum dxt_type type;
73
74 if(!init_gl_context(&decompressor->context, GL_CONTEXT_ANY)) {
75 fprintf(stderr, "[RTDXT decompress] Failed to create GL context.\n");
76 exit_uv(EXIT_FAILURE);
77 decompressor->compressed_len = 0;
78 return FALSE;
79 }
80
81 if(desc.color_spec == DXT5) {
83 } else if(desc.color_spec == DXT1) {
85 } else if(desc.color_spec == DXT1_YUV) {
87 } else {
88 fprintf(stderr, "Wrong compressiong to decompress.\n");
89 return FALSE;
90 }
91
92 decompressor->desc = desc;
93
94 decompressor->decoder = dxt_decoder_create(type, desc.width,
95 desc.height, decompressor->out_codec == RGBA ?
97 decompressor->context.legacy);
98
99 if (decompressor->decoder == NULL) {
100 fprintf(stderr, "[RTDXT decompress] State initialization failed.\n");
101 return FALSE;
102 }
103
105 decompressor->configured = TRUE;
106
107 return TRUE;
108}
struct video_desc desc
#define TRUE
#define FALSE
@ DXT_FORMAT_RGBA
Definition dxt_common.h:80
@ DXT_FORMAT_YUV422
Definition dxt_common.h:82
dxt_type
Definition dxt_common.h:88
@ 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
struct dxt_decoder * dxt_decoder_create(enum dxt_type type, int width, int height, enum dxt_format out_format, int legacy)
static int dxt_get_size(int width, int height, enum dxt_type format)
Definition dxt_util.h:60
bool init_gl_context(struct gl_context *context, int which)
initializes specified OpenGL context
Definition gl_context.c:69
#define GL_CONTEXT_ANY
Definition gl_context.h:72
void exit_uv(int status)
Definition host.cpp:625
Option::OptType type
Definition settings.cpp:194
unsigned legacy
Definition gl_context.h:66
struct video_desc desc
Definition dxt_glsl.c:60
unsigned int configured
Definition dxt_glsl.c:65
struct dxt_decoder * decoder
Definition dxt_glsl.c:58
struct gl_context context
Definition dxt_glsl.c:67
codec_t color_spec
Definition types.h:182
unsigned int width
width of every tile (!)
Definition types.h:179
unsigned int height
height of every tile (!)
Definition types.h:180
@ DXT1
S3 Texture Compression DXT1.
Definition types.h:77
@ DXT5
S3 Texture Compression DXT5.
Definition types.h:79
@ DXT1_YUV
Structure same as DXT1, instead of RGB, YCbCr values are stored.
Definition types.h:78
@ RGBA
RGBA 8-bit, big-endian.
Definition types.h:70

References video_desc::color_spec, state_decompress_rtdxt::compressed_len, state_decompress_rtdxt::configured, state_decompress_rtdxt::context, state_decompress_rtdxt::decoder, desc, state_decompress_rtdxt::desc, DXT1, DXT1_YUV, DXT5, dxt_decoder_create(), DXT_FORMAT_RGBA, DXT_FORMAT_YUV422, dxt_get_size(), DXT_TYPE_DXT1, DXT_TYPE_DXT1_YUV, DXT_TYPE_DXT5_YCOCG, exit_uv(), FALSE, GL_CONTEXT_ANY, video_desc::height, init_gl_context(), gl_context::legacy, state_decompress_rtdxt::out_codec, RGBA, TRUE, type, and video_desc::width.

Referenced by dxt_glsl_decompress_reconfigure().

Here is the call graph for this function:

◆ dxt_glsl_decompress()

static decompress_status dxt_glsl_decompress ( void * state,
unsigned char * dst,
unsigned char * buffer,
unsigned int src_len,
int frame_seq,
struct video_frame_callbacks * callbacks,
struct pixfmt_desc * internal_prop )
static

Definition at line 145 of file dxt_glsl.c.

147{
149 UNUSED(src_len);
150 UNUSED(frame_seq);
151 UNUSED(callbacks);
152 UNUSED(internal_prop);
153
154 if (!s->configured) {
155 fprintf(stderr, "DXT decoder not configured!\n");
156 return DECODER_NO_FRAME;
157 }
158
160
161 if(s->pitch == vc_get_linesize(s->desc.width, s->out_codec)) {
162 dxt_decoder_decompress(s->decoder, buffer, dst);
163 } else {
164 int i;
165 int linesize;
166 unsigned char *line_src, *line_dst;
167
168 unsigned char *tmp;
169
170 if(s->out_codec == UYVY)
171 linesize = s->desc.width * 2;
172 else
173 linesize = s->desc.width * 4;
174 tmp = malloc(linesize * s->desc.height);
175
176 dxt_decoder_decompress(s->decoder, buffer, tmp);
177 line_dst = dst;
178 line_src = tmp;
179 for(i = 0; i < (int) s->desc.height; i++) {
180 if(s->out_codec == RGBA) {
181 vc_copylineRGBA(line_dst, line_src, linesize,
182 s->rshift, s->gshift, s->bshift);
183 } else { /* UYVY */
184 memcpy(line_dst, line_src, linesize);
185 }
186 line_dst += s->pitch;
187 line_src += linesize;
188
189 }
190 free(tmp);
191 }
192
194 return DECODER_GOT_FRAME;
195}
#define UNUSED(x)
void ** state
int vc_get_linesize(unsigned int width, codec_t codec)
int dxt_decoder_decompress(struct dxt_decoder *decoder, unsigned char *image_compressed, DXT_IMAGE_TYPE *image)
void gl_context_make_current(struct gl_context *context)
Definition gl_context.c:236
@ DECODER_NO_FRAME
@ DECODER_GOT_FRAME
decoder_func_t vc_copylineRGBA
@ UYVY
YCbCr 422 8-bit - Cb Y0 Cr Y1.
Definition types.h:71

References state_decompress_rtdxt::bshift, state_decompress_rtdxt::configured, state_decompress_rtdxt::context, state_decompress_rtdxt::decoder, DECODER_GOT_FRAME, DECODER_NO_FRAME, state_decompress_rtdxt::desc, dxt_decoder_decompress(), gl_context_make_current(), state_decompress_rtdxt::gshift, video_desc::height, state_decompress_rtdxt::out_codec, state_decompress_rtdxt::pitch, RGBA, state_decompress_rtdxt::rshift, state, UNUSED, UYVY, vc_copylineRGBA, vc_get_linesize(), and video_desc::width.

Here is the call graph for this function:

◆ dxt_glsl_decompress_done()

static void dxt_glsl_decompress_done ( void * state)
static

Definition at line 218 of file dxt_glsl.c.

219{
221
222 if(s->configured) {
227 }
228 free(s);
229}
int dxt_decoder_destroy(struct dxt_decoder *decoder)
void destroy_gl_context(struct gl_context *context)
Definition gl_context.c:223

References state_decompress_rtdxt::configured, state_decompress_rtdxt::context, state_decompress_rtdxt::decoder, destroy_gl_context(), dxt_decoder_destroy(), gl_context_make_current(), and state.

Here is the call graph for this function:

◆ dxt_glsl_decompress_get_priority()

static int dxt_glsl_decompress_get_priority ( codec_t compression,
struct pixfmt_desc internal,
codec_t ugc )
static

Definition at line 231 of file dxt_glsl.c.

231 {
232 UNUSED(internal);
233 if (compression != DXT1 && compression != DXT1_YUV && compression != DXT5) {
234 return -1;
235 }
236 if (ugc != RGBA && ugc != UYVY) {
237 return -1;
238 }
239 return 500;
240}

References DXT1, DXT1_YUV, DXT5, RGBA, UNUSED, and UYVY.

◆ dxt_glsl_decompress_get_property()

static int dxt_glsl_decompress_get_property ( void * state,
int property,
void * val,
size_t * len )
static

Definition at line 197 of file dxt_glsl.c.

198{
200 UNUSED(s);
201 int ret = FALSE;
202
203 switch(property) {
205 if(*len >= sizeof(int)) {
206 *(int *) val = TRUE;
207 *len = sizeof(int);
208 ret = TRUE;
209 }
210 break;
211 default:
212 ret = FALSE;
213 }
214
215 return ret;
216}
int void * val
int void size_t * len
int property
#define DECOMPRESS_PROPERTY_ACCEPTS_CORRUPTED_FRAME

References DECOMPRESS_PROPERTY_ACCEPTS_CORRUPTED_FRAME, FALSE, len, property, state, TRUE, UNUSED, and val.

◆ dxt_glsl_decompress_init()

static void * dxt_glsl_decompress_init ( void )
static

Definition at line 110 of file dxt_glsl.c.

111{
112 struct state_decompress_rtdxt *s;
113
114 s = (struct state_decompress_rtdxt *) malloc(sizeof(struct state_decompress_rtdxt));
115 s->configured = FALSE;
116
117 return s;
118}

References state_decompress_rtdxt::configured, and FALSE.

◆ dxt_glsl_decompress_reconfigure()

static int dxt_glsl_decompress_reconfigure ( void * state,
struct video_desc desc,
int rshift,
int gshift,
int bshift,
int pitch,
codec_t out_codec )
static

Definition at line 120 of file dxt_glsl.c.

122{
124 int ret = TRUE;
125
126 s->pitch = pitch;
127 s->rshift = rshift;
128 s->gshift = gshift;
129 s->bshift = bshift;
130 s->out_codec = out_codec;
131 if(!s->configured) {
132 ret = configure_with(s, desc);
133 } else {
137 ret = configure_with(s, desc);
138 }
139
141
142 return ret;
143}
static int configure_with(struct state_decompress_rtdxt *decompressor, struct video_desc desc)
Definition dxt_glsl.c:70

References state_decompress_rtdxt::bshift, configure_with(), state_decompress_rtdxt::configured, state_decompress_rtdxt::context, state_decompress_rtdxt::decoder, desc, destroy_gl_context(), dxt_decoder_destroy(), gl_context_make_current(), state_decompress_rtdxt::gshift, state_decompress_rtdxt::out_codec, state_decompress_rtdxt::pitch, state_decompress_rtdxt::rshift, state, and TRUE.

Here is the call graph for this function:

◆ REGISTER_MODULE()

REGISTER_MODULE ( dxt_glsl ,
& dxt_glsl_info,
LIBRARY_CLASS_VIDEO_DECOMPRESS ,
VIDEO_DECOMPRESS_ABI_VERSION  )

Variable Documentation

◆ dxt_glsl_info

const struct video_decompress_info dxt_glsl_info
static
Initial value:
= {
}
static void * dxt_glsl_decompress_init(void)
Definition dxt_glsl.c:110
static int dxt_glsl_decompress_get_property(void *state, int property, void *val, size_t *len)
Definition dxt_glsl.c:197
static int dxt_glsl_decompress_get_priority(codec_t compression, struct pixfmt_desc internal, codec_t ugc)
Definition dxt_glsl.c:231
static int dxt_glsl_decompress_reconfigure(void *state, struct video_desc desc, int rshift, int gshift, int bshift, int pitch, codec_t out_codec)
Definition dxt_glsl.c:120
static void dxt_glsl_decompress_done(void *state)
Definition dxt_glsl.c:218
static decompress_status dxt_glsl_decompress(void *state, unsigned char *dst, unsigned char *buffer, unsigned int src_len, int frame_seq, struct video_frame_callbacks *callbacks, struct pixfmt_desc *internal_prop)
Definition dxt_glsl.c:145

Definition at line 242 of file dxt_glsl.c.