mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 12:11:13 +00:00
gltestsrc: port smpte pattern to shaders
Loosely based on patch by Lubosz Sarnecki <lubosz.sarnecki@collabora.co.uk> https://bugzilla.gnome.org/show_bug.cgi?id=751540
This commit is contained in:
parent
b7ab7aa349
commit
55eaa869ea
1 changed files with 314 additions and 168 deletions
|
@ -28,6 +28,11 @@ struct vts_color_struct
|
||||||
gfloat R, G, B;
|
gfloat R, G, B;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct XYZW
|
||||||
|
{
|
||||||
|
gfloat X, Y, Z, W;
|
||||||
|
};
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
COLOR_WHITE = 0,
|
COLOR_WHITE = 0,
|
||||||
|
@ -82,9 +87,106 @@ static const GLfloat positions[] = {
|
||||||
static const GLushort indices_quad[] = { 0, 1, 2, 0, 2, 3 };
|
static const GLushort indices_quad[] = { 0, 1, 2, 0, 2, 3 };
|
||||||
/* *INDENT-ON* */
|
/* *INDENT-ON* */
|
||||||
|
|
||||||
struct SrcSMPTE
|
struct SrcShader
|
||||||
{
|
{
|
||||||
struct BaseSrcImpl base;
|
struct BaseSrcImpl base;
|
||||||
|
|
||||||
|
GstGLShader *shader;
|
||||||
|
|
||||||
|
gint attr_position;
|
||||||
|
gint attr_texcoord;
|
||||||
|
/* x, y, z, w */
|
||||||
|
const gfloat *vertices;
|
||||||
|
guint n_vertices;
|
||||||
|
const gushort *indices;
|
||||||
|
guint n_indices;
|
||||||
|
};
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
_src_shader_fill_bound_fbo (gpointer impl)
|
||||||
|
{
|
||||||
|
struct SrcShader *src = impl;
|
||||||
|
const GstGLFuncs *gl;
|
||||||
|
|
||||||
|
g_return_val_if_fail (src->base.context, FALSE);
|
||||||
|
g_return_val_if_fail (src->shader, FALSE);
|
||||||
|
gl = src->base.context->gl_vtable;
|
||||||
|
|
||||||
|
gst_gl_shader_use (src->shader);
|
||||||
|
|
||||||
|
if (src->attr_position != -1) {
|
||||||
|
gl->VertexAttribPointer (src->attr_position, 4, GL_FLOAT, GL_FALSE, 0,
|
||||||
|
src->vertices);
|
||||||
|
gl->EnableVertexAttribArray (src->attr_position);
|
||||||
|
}
|
||||||
|
gl->DrawElements (GL_TRIANGLES, src->n_indices, GL_UNSIGNED_SHORT,
|
||||||
|
src->indices);
|
||||||
|
|
||||||
|
if (src->attr_position != -1)
|
||||||
|
gl->DisableVertexAttribArray (src->attr_position);
|
||||||
|
gst_gl_context_clear_shader (src->base.context);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* *INDENT-OFF* */
|
||||||
|
static const gchar *smpte_vertex_src =
|
||||||
|
"attribute vec4 position;\n"
|
||||||
|
"attribute vec4 a_color;\n"
|
||||||
|
"varying vec4 color;\n"
|
||||||
|
"void main()\n"
|
||||||
|
"{\n"
|
||||||
|
" gl_Position = position;\n"
|
||||||
|
" color = a_color;\n"
|
||||||
|
"}";
|
||||||
|
|
||||||
|
static const gchar *smpte_fragment_src =
|
||||||
|
"#ifdef GL_ES\n"
|
||||||
|
"precision mediump float;\n"
|
||||||
|
"#endif\n"
|
||||||
|
"varying vec4 color;\n"
|
||||||
|
"void main()\n"
|
||||||
|
"{\n"
|
||||||
|
" gl_FragColor = color;\n"
|
||||||
|
"}";
|
||||||
|
|
||||||
|
static const gchar *snow_vertex_src =
|
||||||
|
"attribute vec4 position;\n"
|
||||||
|
"varying vec2 out_uv;\n"
|
||||||
|
"void main()\n"
|
||||||
|
"{\n"
|
||||||
|
" gl_Position = position;\n"
|
||||||
|
" out_uv = position.xy;\n"
|
||||||
|
"}";
|
||||||
|
|
||||||
|
static const gchar *snow_fragment_src =
|
||||||
|
"#ifdef GL_ES\n"
|
||||||
|
"precision mediump float;\n"
|
||||||
|
"#endif\n"
|
||||||
|
"uniform float time;\n"
|
||||||
|
"varying vec2 out_uv;\n"
|
||||||
|
"\n"
|
||||||
|
"float rand(vec2 co){\n"
|
||||||
|
" return fract(sin(dot(co.xy, vec2(12.9898,78.233))) * 43758.5453);\n"
|
||||||
|
"}\n"
|
||||||
|
"void main()\n"
|
||||||
|
"{\n"
|
||||||
|
" gl_FragColor = vec4(rand(time * out_uv));\n"
|
||||||
|
"}";
|
||||||
|
/* *INDENT-ON* */
|
||||||
|
|
||||||
|
#define N_QUADS 21
|
||||||
|
struct SrcSMPTE
|
||||||
|
{
|
||||||
|
struct SrcShader base;
|
||||||
|
|
||||||
|
GstGLShader *snow_shader;
|
||||||
|
GstGLShader *color_shader;
|
||||||
|
gint a_color_loc;
|
||||||
|
|
||||||
|
gfloat *vertices;
|
||||||
|
gushort *indices;
|
||||||
|
struct vts_color_struct *colors;
|
||||||
};
|
};
|
||||||
|
|
||||||
static gpointer
|
static gpointer
|
||||||
|
@ -92,7 +194,7 @@ _src_smpte_new (GstGLTestSrc * test)
|
||||||
{
|
{
|
||||||
struct SrcSMPTE *src = g_new0 (struct SrcSMPTE, 1);
|
struct SrcSMPTE *src = g_new0 (struct SrcSMPTE, 1);
|
||||||
|
|
||||||
src->base.src = test;
|
src->base.base.src = test;
|
||||||
|
|
||||||
return src;
|
return src;
|
||||||
}
|
}
|
||||||
|
@ -101,8 +203,177 @@ static gboolean
|
||||||
_src_smpte_init (gpointer impl, GstGLContext * context, GstVideoInfo * v_info)
|
_src_smpte_init (gpointer impl, GstGLContext * context, GstVideoInfo * v_info)
|
||||||
{
|
{
|
||||||
struct SrcSMPTE *src = impl;
|
struct SrcSMPTE *src = impl;
|
||||||
|
struct XYZW *plane_positions;
|
||||||
|
gushort *plane_indices;
|
||||||
|
struct vts_color_struct *colors;
|
||||||
|
GError *error = NULL;
|
||||||
|
int color_idx = 0;
|
||||||
|
int i;
|
||||||
|
|
||||||
src->base.context = context;
|
src->base.base.context = context;
|
||||||
|
|
||||||
|
colors = g_new0 (struct vts_color_struct, N_QUADS * 4);
|
||||||
|
plane_positions = g_new0 (struct XYZW, N_QUADS * 4);
|
||||||
|
plane_indices = g_new0 (gushort, N_QUADS * 6);
|
||||||
|
|
||||||
|
/* top row */
|
||||||
|
for (int i = 0; i < 7; i++) {
|
||||||
|
plane_positions[color_idx * 4 + 0].X = -1.0f + i * (2.0f / 7.0f);
|
||||||
|
plane_positions[color_idx * 4 + 0].Y = 1.0f / 3.0f;
|
||||||
|
plane_positions[color_idx * 4 + 1].X = -1.0f + (i + 1) * (2.0f / 7.0f);
|
||||||
|
plane_positions[color_idx * 4 + 1].Y = 1.0f / 3.0f;
|
||||||
|
plane_positions[color_idx * 4 + 2].X = -1.0f + (i + 1) * (2.0f / 7.0f),
|
||||||
|
plane_positions[color_idx * 4 + 2].Y = -1.0f;
|
||||||
|
plane_positions[color_idx * 4 + 3].X = -1.0f + i * (2.0f / 7.0f);
|
||||||
|
plane_positions[color_idx * 4 + 3].Y = -1.0f;
|
||||||
|
color_idx++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* middle row */
|
||||||
|
for (int i = 0; i < 7; i++) {
|
||||||
|
plane_positions[color_idx * 4 + 0].X = -1.0f + i * (2.0f / 7.0f);
|
||||||
|
plane_positions[color_idx * 4 + 0].Y = 0.5f;
|
||||||
|
plane_positions[color_idx * 4 + 1].X = -1.0f + (i + 1) * (2.0f / 7.0f);
|
||||||
|
plane_positions[color_idx * 4 + 1].Y = 0.5f;
|
||||||
|
plane_positions[color_idx * 4 + 2].X = -1.0f + (i + 1) * (2.0f / 7.0f);
|
||||||
|
plane_positions[color_idx * 4 + 2].Y = 1.0f / 3.0f;
|
||||||
|
plane_positions[color_idx * 4 + 3].X = -1.0f + i * (2.0f / 7.0f);
|
||||||
|
plane_positions[color_idx * 4 + 3].Y = 1.0f / 3.0f;
|
||||||
|
color_idx++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* bottom row, left three */
|
||||||
|
for (int i = 0; i < 3; i++) {
|
||||||
|
plane_positions[color_idx * 4 + 0].X = -1.0f + i / 3.0f;
|
||||||
|
plane_positions[color_idx * 4 + 0].Y = 1.0f;
|
||||||
|
plane_positions[color_idx * 4 + 1].X = -1.0f + (i + 1) / 3.0f;
|
||||||
|
plane_positions[color_idx * 4 + 1].Y = 1.0f;
|
||||||
|
plane_positions[color_idx * 4 + 2].X = -1.0f + (i + 1) / 3.0f;
|
||||||
|
plane_positions[color_idx * 4 + 2].Y = 0.5f;
|
||||||
|
plane_positions[color_idx * 4 + 3].X = -1.0f + i / 3.0f;
|
||||||
|
plane_positions[color_idx * 4 + 3].Y = 0.5f;
|
||||||
|
color_idx++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* bottom row, middle three (the blacks) */
|
||||||
|
for (int i = 0; i < 3; i++) {
|
||||||
|
plane_positions[color_idx * 4 + 0].X = i / 6.0f;
|
||||||
|
plane_positions[color_idx * 4 + 0].Y = 1.0f;
|
||||||
|
plane_positions[color_idx * 4 + 1].X = (i + 1) / 6.0f;
|
||||||
|
plane_positions[color_idx * 4 + 1].Y = 1.0f;
|
||||||
|
plane_positions[color_idx * 4 + 2].X = (i + 1) / 6.0f;
|
||||||
|
plane_positions[color_idx * 4 + 2].Y = 0.5f;
|
||||||
|
plane_positions[color_idx * 4 + 3].X = i / 6.0f;
|
||||||
|
plane_positions[color_idx * 4 + 3].Y = 0.5f;
|
||||||
|
color_idx++;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_assert (color_idx < N_QUADS);
|
||||||
|
|
||||||
|
for (i = 0; i < N_QUADS - 1; i++) {
|
||||||
|
int j, k;
|
||||||
|
if (i < 7) {
|
||||||
|
k = i;
|
||||||
|
} else if ((i - 7) & 1) {
|
||||||
|
k = COLOR_BLACK;
|
||||||
|
} else {
|
||||||
|
k = 13 - i;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i == 14) {
|
||||||
|
k = COLOR_NEG_I;
|
||||||
|
} else if (i == 15) {
|
||||||
|
k = COLOR_WHITE;
|
||||||
|
} else if (i == 16) {
|
||||||
|
k = COLOR_POS_Q;
|
||||||
|
} else if (i == 17) {
|
||||||
|
k = COLOR_SUPER_BLACK;
|
||||||
|
} else if (i == 18) {
|
||||||
|
k = COLOR_BLACK;
|
||||||
|
} else if (i == 19) {
|
||||||
|
k = COLOR_DARK_GREY;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (j = 0; j < 4; j++) {
|
||||||
|
plane_positions[i * 4 + j].Z = 0.0f;
|
||||||
|
plane_positions[i * 4 + j].W = 1.0f;
|
||||||
|
colors[i * 4 + j] = vts_colors[k];
|
||||||
|
}
|
||||||
|
|
||||||
|
for (j = 0; j < 6; j++)
|
||||||
|
plane_indices[i * 6 + j] = i * 4 + indices_quad[j];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* snow */
|
||||||
|
plane_positions[color_idx * 4 + 0].X = 0.5f;
|
||||||
|
plane_positions[color_idx * 4 + 0].Y = 1.0f;
|
||||||
|
plane_positions[color_idx * 4 + 0].Z = 0.0f;
|
||||||
|
plane_positions[color_idx * 4 + 0].W = 1.0f;
|
||||||
|
plane_positions[color_idx * 4 + 1].X = 1.0f;
|
||||||
|
plane_positions[color_idx * 4 + 1].Y = 1.0f;
|
||||||
|
plane_positions[color_idx * 4 + 1].Z = 0.0f;
|
||||||
|
plane_positions[color_idx * 4 + 1].W = 1.0f;
|
||||||
|
plane_positions[color_idx * 4 + 2].X = 1.0f;
|
||||||
|
plane_positions[color_idx * 4 + 2].Y = 0.5f;
|
||||||
|
plane_positions[color_idx * 4 + 2].Z = 0.0f;
|
||||||
|
plane_positions[color_idx * 4 + 2].W = 1.0f;
|
||||||
|
plane_positions[color_idx * 4 + 3].X = 0.5f;
|
||||||
|
plane_positions[color_idx * 4 + 3].Y = 0.5f;
|
||||||
|
plane_positions[color_idx * 4 + 3].Z = 0.0f;
|
||||||
|
plane_positions[color_idx * 4 + 3].W = 1.0f;
|
||||||
|
color_idx++;
|
||||||
|
|
||||||
|
if (src->color_shader)
|
||||||
|
gst_object_unref (src->color_shader);
|
||||||
|
src->color_shader = gst_gl_shader_new_link_with_stages (context, &error,
|
||||||
|
gst_glsl_stage_new_with_string (context, GL_VERTEX_SHADER,
|
||||||
|
GST_GLSL_VERSION_NONE,
|
||||||
|
GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
|
||||||
|
smpte_vertex_src),
|
||||||
|
gst_glsl_stage_new_with_string (context, GL_FRAGMENT_SHADER,
|
||||||
|
GST_GLSL_VERSION_NONE,
|
||||||
|
GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
|
||||||
|
smpte_fragment_src), NULL);
|
||||||
|
if (!src->color_shader) {
|
||||||
|
GST_ERROR_OBJECT (src->base.base.src, "%s", error->message);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (src->snow_shader)
|
||||||
|
gst_object_unref (src->snow_shader);
|
||||||
|
src->snow_shader = gst_gl_shader_new_link_with_stages (context, &error,
|
||||||
|
gst_glsl_stage_new_with_string (context, GL_VERTEX_SHADER,
|
||||||
|
GST_GLSL_VERSION_NONE,
|
||||||
|
GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
|
||||||
|
snow_vertex_src),
|
||||||
|
gst_glsl_stage_new_with_string (context, GL_FRAGMENT_SHADER,
|
||||||
|
GST_GLSL_VERSION_NONE,
|
||||||
|
GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
|
||||||
|
snow_fragment_src), NULL);
|
||||||
|
if (!src->snow_shader) {
|
||||||
|
GST_ERROR_OBJECT (src->base.base.src, "%s", error->message);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
gst_gl_shader_use (src->color_shader);
|
||||||
|
src->base.attr_position =
|
||||||
|
gst_gl_shader_get_attribute_location (src->color_shader, "position");
|
||||||
|
if (src->base.attr_position == -1) {
|
||||||
|
GST_ERROR_OBJECT (src->base.base.src, "No position attribute");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
src->a_color_loc =
|
||||||
|
gst_gl_shader_get_attribute_location (src->color_shader, "a_color");
|
||||||
|
/* if (src->a_color_loc == -1) {
|
||||||
|
GST_ERROR_OBJECT (src->base.base.src, "No color attribute");
|
||||||
|
return FALSE;
|
||||||
|
}*/
|
||||||
|
gst_gl_context_clear_shader (src->base.base.context);
|
||||||
|
|
||||||
|
src->vertices = (gfloat *) plane_positions;
|
||||||
|
src->indices = plane_indices;
|
||||||
|
src->colors = colors;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -110,105 +381,34 @@ _src_smpte_init (gpointer impl, GstGLContext * context, GstVideoInfo * v_info)
|
||||||
static gboolean
|
static gboolean
|
||||||
_src_smpte_fill_bound_fbo (gpointer impl)
|
_src_smpte_fill_bound_fbo (gpointer impl)
|
||||||
{
|
{
|
||||||
#if GST_GL_HAVE_OPENGL
|
|
||||||
struct SrcSMPTE *src = impl;
|
struct SrcSMPTE *src = impl;
|
||||||
int i;
|
const GstGLFuncs *gl = src->base.base.context->gl_vtable;
|
||||||
|
|
||||||
if (gst_gl_context_get_gl_api (src->base.context) & GST_GL_API_OPENGL) {
|
if (src->a_color_loc != -1) {
|
||||||
|
gl->VertexAttribPointer (src->a_color_loc, 3, GL_FLOAT, GL_FALSE, 0,
|
||||||
glClearColor (0.0, 0.0, 0.0, 1.0);
|
src->colors);
|
||||||
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
gl->EnableVertexAttribArray (src->a_color_loc);
|
||||||
|
|
||||||
glDisable (GL_CULL_FACE);
|
|
||||||
|
|
||||||
glMatrixMode (GL_PROJECTION);
|
|
||||||
glLoadIdentity ();
|
|
||||||
|
|
||||||
for (i = 0; i < 7; i++) {
|
|
||||||
glColor4f (vts_colors[i].R, vts_colors[i].G, vts_colors[i].B, 1.0f);
|
|
||||||
glBegin (GL_QUADS);
|
|
||||||
glVertex3f (-1.0f + i * (2.0f / 7.0f), -1.0f + 2.0 * (2.0f / 3.0f), 0);
|
|
||||||
glVertex3f (-1.0f + (i + 1.0f) * (2.0f / 7.0f),
|
|
||||||
-1.0f + 2.0f * (2.0f / 3.0f), 0);
|
|
||||||
glVertex3f (-1.0f + (i + 1.0f) * (2.0f / 7.0f), -1.0f, 0);
|
|
||||||
glVertex3f (-1.0f + i * (2.0f / 7.0f), -1.0f, 0);
|
|
||||||
glEnd ();
|
|
||||||
}
|
}
|
||||||
|
src->base.shader = src->color_shader;
|
||||||
|
src->base.vertices = src->vertices;
|
||||||
|
src->base.n_vertices = (N_QUADS - 1) * 4 * 4;
|
||||||
|
src->base.indices = src->indices;
|
||||||
|
src->base.n_indices = (N_QUADS - 1) * 6;
|
||||||
|
if (!_src_shader_fill_bound_fbo (impl))
|
||||||
|
return FALSE;
|
||||||
|
if (src->a_color_loc != -1)
|
||||||
|
gl->DisableVertexAttribArray (src->a_color_loc);
|
||||||
|
|
||||||
for (i = 0; i < 7; i++) {
|
src->base.shader = src->snow_shader;
|
||||||
int k;
|
src->base.vertices = &src->vertices[src->base.n_vertices];
|
||||||
|
src->base.n_vertices = 4;
|
||||||
if (i & 1) {
|
src->base.indices = src->indices;
|
||||||
k = 7;
|
src->base.n_indices = 6;
|
||||||
} else {
|
gst_gl_shader_use (src->snow_shader);
|
||||||
k = 6 - i;
|
gst_gl_shader_set_uniform_1f (src->snow_shader, "time",
|
||||||
}
|
(gfloat) src->base.base.src->running_time / GST_SECOND);
|
||||||
|
if (!_src_shader_fill_bound_fbo (impl))
|
||||||
glColor4f (vts_colors[k].R, vts_colors[k].G, vts_colors[k].B, 1.0f);
|
return FALSE;
|
||||||
glBegin (GL_QUADS);
|
|
||||||
glVertex3f (-1.0f + i * (2.0f / 7.0f), -1.0f + 2.0f * (3.0f / 4.0f), 0);
|
|
||||||
glVertex3f (-1.0f + (i + 1) * (2.0f / 7.0f), -1.0f + 2.0f * (3.0f / 4.0f),
|
|
||||||
0);
|
|
||||||
glVertex3f (-1.0f + (i + 1) * (2.0f / 7.0f), -1.0f + 2.0f * (2.0f / 3.0f),
|
|
||||||
0);
|
|
||||||
glVertex3f (-1.0f + i * (2.0f / 7.0f), -1.0f + 2.0f * (2.0f / 3.0f), 0);
|
|
||||||
glEnd ();
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < 3; i++) {
|
|
||||||
int k;
|
|
||||||
|
|
||||||
if (i == 0) {
|
|
||||||
k = 8;
|
|
||||||
} else if (i == 1) {
|
|
||||||
k = 0;
|
|
||||||
} else {
|
|
||||||
k = 9;
|
|
||||||
}
|
|
||||||
|
|
||||||
glColor4f (vts_colors[k].R, vts_colors[k].G, vts_colors[k].B, 1.0f);
|
|
||||||
glBegin (GL_QUADS);
|
|
||||||
glVertex3f (-1.0f + i * (2.0f / 6.0f), -1.0f + 2.0f * 1, 0);
|
|
||||||
glVertex3f (-1.0f + (i + 1) * (2.0f / 6.0f), -1.0f + 2.0f * 1, 0);
|
|
||||||
glVertex3f (-1.0f + (i + 1) * (2.0f / 6.0f), -1.0f + 2.0f * (3.0f / 4.0f),
|
|
||||||
0);
|
|
||||||
glVertex3f (-1.0f + i * (2.0f / 6.0f), -1.0f + 2.0f * (3.0f / 4.0f), 0);
|
|
||||||
glEnd ();
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < 3; i++) {
|
|
||||||
int k;
|
|
||||||
|
|
||||||
if (i == 0) {
|
|
||||||
k = COLOR_SUPER_BLACK;
|
|
||||||
} else if (i == 1) {
|
|
||||||
k = COLOR_BLACK;
|
|
||||||
} else {
|
|
||||||
k = COLOR_DARK_GREY;
|
|
||||||
}
|
|
||||||
|
|
||||||
glColor4f (vts_colors[k].R, vts_colors[k].G, vts_colors[k].B, 1.0f);
|
|
||||||
glBegin (GL_QUADS);
|
|
||||||
glVertex3f (-1.0f + 2.0f * (0.5f + i * (1.0f / 12.0f)), -1.0 + 2.0f * 1,
|
|
||||||
0);
|
|
||||||
glVertex3f (-1.0f + 2.0f * (0.5f + (i + 1) * (1.0f / 12.0f)),
|
|
||||||
-1.0f + 2.0f * 1, 0);
|
|
||||||
glVertex3f (-1.0f + 2.0f * (0.5f + (i + 1) * (1.0f / 12.0f)),
|
|
||||||
-1.0f + 2.0f * (3.0f / 4.0f), 0);
|
|
||||||
glVertex3f (-1.0f + 2.0f * (0.5f + i * (1.0f / 12.0f)),
|
|
||||||
-1.0f + 2.0f * (3.0f / 4.0f), 0);
|
|
||||||
glEnd ();
|
|
||||||
}
|
|
||||||
|
|
||||||
glColor4f (1.0, 1.0, 1.0, 1.0);
|
|
||||||
glBegin (GL_QUADS);
|
|
||||||
glVertex3f (-1.0 + 2.0 * (0.75), -1.0 + 2.0 * 1, 0);
|
|
||||||
glVertex3f (-1.0 + 2.0 * (1.0), -1.0 + 2.0 * 1, 0);
|
|
||||||
glVertex3f (-1.0 + 2.0 * (1.0), -1.0 + 2.0 * (3.0 / 4.0), 0);
|
|
||||||
glVertex3f (-1.0 + 2.0 * (0.75), -1.0 + 2.0 * (3.0 / 4.0), 0);
|
|
||||||
glEnd ();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -216,10 +416,22 @@ _src_smpte_fill_bound_fbo (gpointer impl)
|
||||||
static void
|
static void
|
||||||
_src_smpte_free (gpointer impl)
|
_src_smpte_free (gpointer impl)
|
||||||
{
|
{
|
||||||
|
struct SrcSMPTE *src = impl;
|
||||||
|
|
||||||
|
if (!impl)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (src->base.shader)
|
||||||
|
gst_object_unref (src->base.shader);
|
||||||
|
src->base.shader = NULL;
|
||||||
|
|
||||||
|
g_free (src->vertices);
|
||||||
|
g_free (src->indices);
|
||||||
|
g_free (src->colors);
|
||||||
|
|
||||||
g_free (impl);
|
g_free (impl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static const struct SrcFuncs src_smpte = {
|
static const struct SrcFuncs src_smpte = {
|
||||||
GST_GL_TEST_SRC_SMPTE,
|
GST_GL_TEST_SRC_SMPTE,
|
||||||
_src_smpte_new,
|
_src_smpte_new,
|
||||||
|
@ -228,6 +440,8 @@ static const struct SrcFuncs src_smpte = {
|
||||||
_src_smpte_free,
|
_src_smpte_free,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#undef N_QUADS
|
||||||
|
|
||||||
struct SrcUniColor
|
struct SrcUniColor
|
||||||
{
|
{
|
||||||
struct BaseSrcImpl base;
|
struct BaseSrcImpl base;
|
||||||
|
@ -329,48 +543,6 @@ static const struct SrcFuncs src_blink = {
|
||||||
_src_uni_color_free,
|
_src_uni_color_free,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SrcShader
|
|
||||||
{
|
|
||||||
struct BaseSrcImpl base;
|
|
||||||
|
|
||||||
GstGLShader *shader;
|
|
||||||
|
|
||||||
gint attr_position;
|
|
||||||
gint attr_texcoord;
|
|
||||||
/* x, y, z, w */
|
|
||||||
const gfloat *vertices;
|
|
||||||
guint n_vertices;
|
|
||||||
const gushort *indices;
|
|
||||||
guint n_indices;
|
|
||||||
};
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
_src_shader_fill_bound_fbo (gpointer impl)
|
|
||||||
{
|
|
||||||
struct SrcShader *src = impl;
|
|
||||||
const GstGLFuncs *gl;
|
|
||||||
|
|
||||||
g_return_val_if_fail (src->base.context, FALSE);
|
|
||||||
g_return_val_if_fail (src->shader, FALSE);
|
|
||||||
gl = src->base.context->gl_vtable;
|
|
||||||
|
|
||||||
gst_gl_shader_use (src->shader);
|
|
||||||
|
|
||||||
if (src->attr_position != -1) {
|
|
||||||
gl->VertexAttribPointer (src->attr_position, 4, GL_FLOAT, GL_FALSE, 0,
|
|
||||||
src->vertices);
|
|
||||||
gl->EnableVertexAttribArray (src->attr_position);
|
|
||||||
}
|
|
||||||
gl->DrawElements (GL_TRIANGLES, src->n_indices, GL_UNSIGNED_SHORT,
|
|
||||||
src->indices);
|
|
||||||
|
|
||||||
if (src->attr_position != -1)
|
|
||||||
gl->DisableVertexAttribArray (src->attr_position);
|
|
||||||
gst_gl_context_clear_shader (src->base.context);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* *INDENT-OFF* */
|
/* *INDENT-OFF* */
|
||||||
static const gchar *checkers_vertex_src = "attribute vec4 position;\n"
|
static const gchar *checkers_vertex_src = "attribute vec4 position;\n"
|
||||||
"void main()\n"
|
"void main()\n"
|
||||||
|
@ -491,32 +663,6 @@ SRC_CHECKERS (2);
|
||||||
SRC_CHECKERS (4);
|
SRC_CHECKERS (4);
|
||||||
SRC_CHECKERS (8);
|
SRC_CHECKERS (8);
|
||||||
|
|
||||||
/* *INDENT-OFF* */
|
|
||||||
static const gchar *snow_vertex_src =
|
|
||||||
"attribute vec4 position;\n"
|
|
||||||
"varying vec2 out_uv;\n"
|
|
||||||
"void main()\n"
|
|
||||||
"{\n"
|
|
||||||
" gl_Position = position;\n"
|
|
||||||
" out_uv = position.xy;\n"
|
|
||||||
"}";
|
|
||||||
|
|
||||||
static const gchar *snow_fragment_src =
|
|
||||||
"#ifdef GL_ES\n"
|
|
||||||
"precision mediump float;\n"
|
|
||||||
"#endif\n"
|
|
||||||
"uniform float time;\n"
|
|
||||||
"varying vec2 out_uv;\n"
|
|
||||||
"\n"
|
|
||||||
"float rand(vec2 co){\n"
|
|
||||||
" return fract(sin(dot(co.xy, vec2(12.9898,78.233))) * 43758.5453);\n"
|
|
||||||
"}\n"
|
|
||||||
"void main()\n"
|
|
||||||
"{\n"
|
|
||||||
" gl_FragColor = vec4(rand(time * out_uv));\n"
|
|
||||||
"}";
|
|
||||||
/* *INDENT-ON* */
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
_src_snow_init (gpointer impl, GstGLContext * context, GstVideoInfo * v_info)
|
_src_snow_init (gpointer impl, GstGLContext * context, GstVideoInfo * v_info)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue