|
@@ -12,11 +12,21 @@
|
|
GLES2Debayer *
|
|
GLES2Debayer *
|
|
gles2_debayer_new(int format)
|
|
gles2_debayer_new(int format)
|
|
{
|
|
{
|
|
|
|
+ // Cannot run on format 0 (Undefined)
|
|
|
|
+ assert(format != 0);
|
|
|
|
+
|
|
uint32_t pixfmt = libmegapixels_format_to_v4l_pixfmt(format);
|
|
uint32_t pixfmt = libmegapixels_format_to_v4l_pixfmt(format);
|
|
- if (pixfmt != V4L2_PIX_FMT_SBGGR8 && pixfmt != V4L2_PIX_FMT_SGBRG8 &&
|
|
|
|
- pixfmt != V4L2_PIX_FMT_SGRBG8 && pixfmt != V4L2_PIX_FMT_SRGGB8 &&
|
|
|
|
- pixfmt != V4L2_PIX_FMT_SBGGR10P && pixfmt != V4L2_PIX_FMT_SGBRG10P &&
|
|
|
|
- pixfmt != V4L2_PIX_FMT_SGRBG10P && pixfmt != V4L2_PIX_FMT_SRGGB10P) {
|
|
|
|
|
|
+
|
|
|
|
+ int shader = 0;
|
|
|
|
+
|
|
|
|
+ if (pixfmt == V4L2_PIX_FMT_SBGGR8 || pixfmt == V4L2_PIX_FMT_SGBRG8 ||
|
|
|
|
+ pixfmt == V4L2_PIX_FMT_SGRBG8 || pixfmt == V4L2_PIX_FMT_SRGGB8 ||
|
|
|
|
+ pixfmt == V4L2_PIX_FMT_SBGGR10P || pixfmt == V4L2_PIX_FMT_SGBRG10P ||
|
|
|
|
+ pixfmt == V4L2_PIX_FMT_SGRBG10P || pixfmt == V4L2_PIX_FMT_SRGGB10P) {
|
|
|
|
+ shader = SHADER_DEBAYER;
|
|
|
|
+ } else if (pixfmt == V4L2_PIX_FMT_YUYV) {
|
|
|
|
+ shader = SHADER_YUV;
|
|
|
|
+ } else {
|
|
return NULL;
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -33,17 +43,22 @@ gles2_debayer_new(int format)
|
|
|
|
|
|
const GLchar *def[1] = { format_def };
|
|
const GLchar *def[1] = { format_def };
|
|
|
|
|
|
|
|
+ char shader_vertex[64];
|
|
|
|
+ char shader_fragment[64];
|
|
|
|
+ snprintf(shader_vertex,
|
|
|
|
+ 64,
|
|
|
|
+ "/org/postmarketos/Megapixels/%s.vert",
|
|
|
|
+ shader == SHADER_DEBAYER ? "debayer" : "yuv");
|
|
|
|
+ snprintf(shader_fragment,
|
|
|
|
+ 64,
|
|
|
|
+ "/org/postmarketos/Megapixels/%s.frag",
|
|
|
|
+ shader == SHADER_DEBAYER ? "debayer" : "yuv");
|
|
|
|
+
|
|
GLuint shaders[] = {
|
|
GLuint shaders[] = {
|
|
- gl_util_load_shader("/org/postmarketos/Megapixels/debayer.vert",
|
|
|
|
- GL_VERTEX_SHADER,
|
|
|
|
- NULL,
|
|
|
|
- 0),
|
|
|
|
- gl_util_load_shader("/org/postmarketos/Megapixels/debayer.frag",
|
|
|
|
- GL_FRAGMENT_SHADER,
|
|
|
|
- def,
|
|
|
|
- 1),
|
|
|
|
|
|
+ gl_util_load_shader(shader_vertex, GL_VERTEX_SHADER, NULL, 0),
|
|
|
|
+ gl_util_load_shader(shader_fragment, GL_FRAGMENT_SHADER, def, 1),
|
|
};
|
|
};
|
|
-
|
|
|
|
|
|
+ printf("Using shader %s and %s\n", shader_vertex, shader_fragment);
|
|
GLuint program = gl_util_link_program(shaders, 2);
|
|
GLuint program = gl_util_link_program(shaders, 2);
|
|
glBindAttribLocation(program, VERTEX_ATTRIBUTE, "vert");
|
|
glBindAttribLocation(program, VERTEX_ATTRIBUTE, "vert");
|
|
glBindAttribLocation(program, TEX_COORD_ATTRIBUTE, "tex_coord");
|
|
glBindAttribLocation(program, TEX_COORD_ATTRIBUTE, "tex_coord");
|
|
@@ -51,6 +66,7 @@ gles2_debayer_new(int format)
|
|
|
|
|
|
GLES2Debayer *self = malloc(sizeof(GLES2Debayer));
|
|
GLES2Debayer *self = malloc(sizeof(GLES2Debayer));
|
|
self->format = format;
|
|
self->format = format;
|
|
|
|
+ self->shader = shader;
|
|
|
|
|
|
self->frame_buffer = frame_buffer;
|
|
self->frame_buffer = frame_buffer;
|
|
self->program = program;
|
|
self->program = program;
|
|
@@ -116,7 +132,9 @@ gles2_debayer_set_shading(GLES2Debayer *self,
|
|
multiply_matrices(xyzd65, XYZD65_to_sRGB, colormat);
|
|
multiply_matrices(xyzd65, XYZD65_to_sRGB, colormat);
|
|
glUniformMatrix3fv(
|
|
glUniformMatrix3fv(
|
|
self->uniform_color_matrix, 1, GL_FALSE, colormat);
|
|
self->uniform_color_matrix, 1, GL_FALSE, colormat);
|
|
-
|
|
|
|
|
|
+ } else if (self->shader == SHADER_YUV) {
|
|
|
|
+ glUniformMatrix3fv(
|
|
|
|
+ self->uniform_color_matrix, 1, GL_FALSE, YUV_to_RGB);
|
|
} else {
|
|
} else {
|
|
glUniformMatrix3fv(
|
|
glUniformMatrix3fv(
|
|
self->uniform_color_matrix, 1, GL_FALSE, IDENTITY);
|
|
self->uniform_color_matrix, 1, GL_FALSE, IDENTITY);
|