61 "#define TEXCOORD gl_TexCoord[0]\n"
63 "#define TEXCOORD TEX0\n"
64 "#define texture2D texture\n"
68 "#define colorOut gl_FragColor\n"
70 "out vec4 colorOut;\n"
77 "uniform sampler2D image;\n"
78 "uniform float imageWidth; // is original image width, it means twice as wide as ours\n"
82 " vec4 rgba1, rgba2;\n"
84 " vec2 coor1, coor2;\n"
87 " coor1 = TEXCOORD.xy - vec2(1.0 / (imageWidth * 2.0), 0.0);\n"
88 " coor2 = TEXCOORD.xy + vec2(1.0 / (imageWidth * 2.0), 0.0);\n"
90 " rgba1 = texture2D(image, coor1);\n"
91 " rgba2 = texture2D(image, coor2);\n"
93 " yuv1.x = 1.0/16.0 + (rgba1.r * 0.2126 + rgba1.g * 0.7152 + rgba1.b * 0.0722) * 0.8588; // Y\n"
94 " yuv1.y = 0.5 + (-rgba1.r * 0.1145 - rgba1.g * 0.3854 + rgba1.b * 0.5) * 0.8784;\n"
95 " yuv1.z = 0.5 + (rgba1.r * 0.5 - rgba1.g * 0.4541 - rgba1.b * 0.0458) * 0.8784;\n"
97 " yuv2.x = 1.0/16.0 + (rgba2.r * 0.2126 + rgba2.g * 0.7152 + rgba2.b * 0.0722) * 0.8588; // Y\n"
98 " yuv2.y = 0.5 + (-rgba2.r * 0.1145 - rgba2.g * 0.3854 + rgba2.b * 0.5) * 0.8784;\n"
99 " yuv2.z = 0.5 + (rgba2.r * 0.5 - rgba2.g * 0.4541 - rgba2.b * 0.0458) * 0.8784;\n"
101 " U = mix(yuv1.y, yuv2.y, 0.5);\n"
102 " V = mix(yuv1.z, yuv2.z, 0.5);\n"
104 " colorOut = vec4(U,yuv1.x, V, yuv2.x);\n"
109struct state_video_compress_uyvy {
110 struct module module_data;
112 unsigned int configured:1;
117 GLuint program_rgba_to_yuv422;
128int uyvy_configure_with(
struct state_video_compress_uyvy *s,
struct video_frame *
tx);
129static void uyvy_compress_done(
struct module *mod);
133 struct state_video_compress_uyvy *s;
135 s = (
struct state_video_compress_uyvy *) malloc(
sizeof(
struct state_video_compress_uyvy));
140 glEnable(GL_TEXTURE_2D);
143 if (!s->program_rgba_to_yuv422) {
149 glUseProgram(s->program_rgba_to_yuv422);
150 glUniform1i(glGetUniformLocation(s->program_rgba_to_yuv422,
"image"),0);
153 s->configured =
FALSE;
162 s->module_data.
deleter = uyvy_compress_done;
165 return &s->module_data;
168int uyvy_configure_with(
struct state_video_compress_uyvy *s,
struct video_frame *
tx)
170 switch (
tx->color_spec) {
172 s->gl_format = GL_RGB;
175 s->gl_format = GL_RGBA;
178 fprintf(stderr,
"[UYVY compress] We can transform only RGB or RGBA to UYVY.\n");
184 compressed_desc.color_spec =
UYVY;
185 s->pool->
reconfigure(compressed_desc, 2 * compressed_desc.width *
186 compressed_desc.height );
188 glUseProgram(s->program_rgba_to_yuv422);
189 glUniform1f(glGetUniformLocation(s->program_rgba_to_yuv422,
"imageWidth"),
190 (GLfloat)
tx->tiles[0].width);
193 glGenFramebuffers(1, &s->fbo);
195 glGenTextures(1, &s->texture_rgba);
196 glBindTexture(GL_TEXTURE_2D, s->texture_rgba);
197 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
198 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
199 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
200 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
201 glTexImage2D(GL_TEXTURE_2D, 0 , s->gl_format,
tx->tiles[0].width,
tx->tiles[0].height, 0, s->gl_format, GL_UNSIGNED_BYTE, 0);
203 glGenTextures(1, &s->texture);
204 glBindTexture(GL_TEXTURE_2D, s->texture);
205 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
206 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
207 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
208 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
209 glTexImage2D(GL_TEXTURE_2D, 0 , GL_RGBA,
tx->tiles[0].width / 2,
tx->tiles[0].height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
211 glBindTexture(GL_TEXTURE_2D, 0);
213 glClearColor(1.0,1.0,0,1.0);
215 glMatrixMode( GL_PROJECTION );
217 glOrtho(-1,1,-1,1,10,-10);
219 glMatrixMode( GL_MODELVIEW );
222 glViewport( 0, 0,
tx->tiles[0].width / 2,
tx->tiles[0].height);
224 s->configured =
TRUE;
230shared_ptr<video_frame> uyvy_compress(
struct module *mod, shared_ptr<video_frame>
tx)
235 struct state_video_compress_uyvy *s = (
struct state_video_compress_uyvy *) mod->
priv_data;
241 ret = uyvy_configure_with(s,
tx.get());
248 shared_ptr<video_frame> out = s->pool->
get_frame();
251 glBindTexture(GL_TEXTURE_2D, s->texture_rgba);
252 glTexSubImage2D(GL_TEXTURE_2D,
262 glBindFramebuffer(GL_FRAMEBUFFER, s->fbo);
263 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, s->texture, 0);
265 glBindTexture(GL_TEXTURE_2D, s->texture_rgba);
267 glUseProgram(s->program_rgba_to_yuv422);
270 glTexCoord2f(0.0, 0.0); glVertex2f(-1.0, -1.0);
271 glTexCoord2f(1.0, 0.0); glVertex2f(1.0, -1.0);
272 glTexCoord2f(1.0, 1.0); glVertex2f(1.0, 1.0);
273 glTexCoord2f(0.0, 1.0); glVertex2f(-1.0, 1.0);
277 glReadBuffer(GL_COLOR_ATTACHMENT0);
281 glBindTexture(GL_TEXTURE_2D, 0);
282 glBindFramebuffer(GL_FRAMEBUFFER, 0);
289static void uyvy_compress_done(
struct module *mod)
291 struct state_video_compress_uyvy *s = (
struct state_video_compress_uyvy *) mod->
priv_data;
293 glDeleteFramebuffers(1, &s->fbo);
294 glDeleteTextures(1, &s->texture_rgba);
295 glDeleteTextures(1, &s->texture);
struct video_desc video_desc_from_frame(const struct video_frame *frame)
Returns struct video_desc from video frame.
void log_msg(int level, const char *format,...)
#define LOG_LEVEL_ERROR
general errors
bool init_gl_context(struct gl_context *context, int which)
initializes specified OpenGL context
void destroy_gl_context(struct gl_context *context)
void gl_context_make_current(struct gl_context *context)
GLuint glsl_compile_link(const char *vprogram, const char *fprogram)
#define GL_CONTEXT_LEGACY
void module_init_default(struct module *module_data)
void module_register(struct module *module_data, struct module *parent)
#define VIDEO_COMPRESS_ABI_VERSION
@ LIBRARY_CLASS_VIDEO_COMPRESS
#define REGISTER_MODULE(name, info, lclass, abi)
Registers module to global modules' registry.
Struct tile is an area of video_frame.
char * data
Raw tile data. Pointer must be at least 4B aligned.
std::shared_ptr< video_frame > get_frame()
void reconfigure(struct video_desc new_desc, size_t new_size=SIZE_MAX)
Struct video_frame represents a video frame and contains video description.
static const char fp_display_rgba_to_yuv422_legacy[]
@ RGB
RGB 8-bit (packed into 24-bit word)
@ UYVY
YCbCr 422 8-bit - Cb Y0 Cr Y1.
@ RGBA
RGBA 8-bit, big-endian.
This is an umbrella header for video functions.
API for video compress drivers.
bool video_desc_eq(struct video_desc a, struct video_desc b)
Compares two video descriptions.