This effectively limits a glfilter subclass to be > GL(ES) 2.0.
rather than a possible GL 1.4.
GstGLEffects *effects = GST_GL_EFFECTS (data);
if (NULL != (shader = gst_gl_effects_get_fragment_shader (effects, "hconv0",
- hconv7_fragment_source_gles2, hconv7_fragment_source_opengl))) {
+ hconv7_fragment_source_gles2))) {
GstGLFilter *filter = GST_GL_FILTER (effects);
GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
GstGLFilter *filter = GST_GL_FILTER (effects);
if (NULL != (shader = gst_gl_effects_get_fragment_shader (effects, "vconv0",
- vconv7_fragment_source_gles2, vconv7_fragment_source_opengl))) {
+ vconv7_fragment_source_gles2))) {
GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
#if GST_GL_HAVE_OPENGL
GstGLFuncs *gl = context->gl_vtable;
shader = gst_gl_effects_get_fragment_shader (effects, "bulge",
- bulge_fragment_source_gles2, bulge_fragment_source_opengl);
+ bulge_fragment_source_gles2);
if (!shader)
return;
GstGLFuncs *gl = context->gl_vtable;
shader = gst_gl_effects_get_fragment_shader (effects, "fisheye",
- fisheye_fragment_source_gles2, fisheye_fragment_source_opengl);
+ fisheye_fragment_source_gles2);
if (!shader)
return;
GstGLFuncs *gl = context->gl_vtable;
shader = gst_gl_effects_get_fragment_shader (effects, "luma_threshold",
- luma_threshold_fragment_source_gles2,
- luma_threshold_fragment_source_opengl);
+ luma_threshold_fragment_source_gles2);
if (!shader)
return;
GstGLFuncs *gl = context->gl_vtable;
shader = gst_gl_effects_get_fragment_shader (effects, "hconv7",
- hconv7_fragment_source_gles2, hconv7_fragment_source_opengl);
+ hconv7_fragment_source_gles2);
if (!shader)
return;
GstGLFuncs *gl = context->gl_vtable;
shader = gst_gl_effects_get_fragment_shader (effects, "vconv7",
- vconv7_fragment_source_gles2, vconv7_fragment_source_opengl);
+ vconv7_fragment_source_gles2);
if (!shader)
return;
GstGLFuncs *gl = context->gl_vtable;
shader = gst_gl_effects_get_fragment_shader (effects, "sum",
- sum_fragment_source_gles2, sum_fragment_source_opengl);
+ sum_fragment_source_gles2);
if (!shader)
return;
GstGLFilter *filter = GST_GL_FILTER (effects);
GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
GstGLFuncs *gl = context->gl_vtable;
+ GstGLShader *shader;
#if GST_GL_HAVE_OPENGL
if (USING_OPENGL (context)) {
gl->LoadIdentity ();
}
#endif
- if (USING_GLES2 (context) || USING_OPENGL3 (context)) {
- GstGLShader *shader =
- g_hash_table_lookup (effects->shaderstable, "identity0");
- if (!shader) {
- shader = gst_gl_shader_new (context);
- g_hash_table_insert (effects->shaderstable, (gchar *) "identity0",
- shader);
+ shader = g_hash_table_lookup (effects->shaderstable, "identity0");
+ if (!shader) {
+ shader = gst_gl_shader_new (context);
+ g_hash_table_insert (effects->shaderstable, (gchar *) "identity0", shader);
- if (!gst_gl_shader_compile_with_default_vf_and_check (shader,
- &filter->draw_attr_position_loc,
- &filter->draw_attr_texture_loc)) {
- /* gst gl context error is already set */
- GST_ELEMENT_ERROR (effects, RESOURCE, NOT_FOUND,
- ("Failed to initialize identity shader, %s",
- gst_gl_context_get_error ()), (NULL));
- return;
- }
+ if (!gst_gl_shader_compile_with_default_vf_and_check (shader,
+ &filter->draw_attr_position_loc, &filter->draw_attr_texture_loc)) {
+ /* gst gl context error is already set */
+ GST_ELEMENT_ERROR (effects, RESOURCE, NOT_FOUND,
+ ("Failed to initialize identity shader, %s",
+ gst_gl_context_get_error ()), (NULL));
+ return;
}
- gst_gl_shader_use (shader);
+ }
+ gst_gl_shader_use (shader);
- gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
+ gl->ActiveTexture (GL_TEXTURE0);
+ gl->BindTexture (GL_TEXTURE_2D, texture);
- gst_gl_shader_set_uniform_1i (shader, "tex", 0);
- }
+ gst_gl_shader_set_uniform_1i (shader, "tex", 0);
gst_gl_filter_draw_texture (filter, texture, width, height);
}
GstGLFilter *filter = GST_GL_FILTER (effects);
if (NULL != (shader = gst_gl_effects_get_fragment_shader (effects, "conv0",
- conv9_fragment_source_gles2, conv9_fragment_source_opengl))) {
+ conv9_fragment_source_gles2))) {
GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
static gfloat kernel[9] = { 0.0, -1.0, 0.0,
-1.0, 4.0, -1.0,
GstGLFuncs *gl = context->gl_vtable;
shader = gst_gl_effects_get_fragment_shader (effects, "luma_to_curve",
- luma_to_curve_fragment_source_gles2,
- luma_to_curve_fragment_source_opengl);
+ luma_to_curve_fragment_source_gles2);
if (!shader)
return;
GstGLFuncs *gl = context->gl_vtable;
shader = gst_gl_effects_get_fragment_shader (effects, "mirror",
- mirror_fragment_source_gles2, mirror_fragment_source_opengl);
+ mirror_fragment_source_gles2);
if (!shader)
return;
GstGLFuncs *gl = context->gl_vtable;
shader = gst_gl_effects_get_fragment_shader (effects, "rgb_to_curve",
- rgb_to_curve_fragment_source_gles2, rgb_to_curve_fragment_source_opengl);
+ rgb_to_curve_fragment_source_gles2);
if (!shader)
return;
GstGLFuncs *gl = context->gl_vtable;
shader = gst_gl_effects_get_fragment_shader (effects, "sin",
- sin_fragment_source_gles2, sin_fragment_source_opengl);
+ sin_fragment_source_gles2);
if (!shader)
return;
GstGLFilter *filter = GST_GL_FILTER (effects);
if (NULL != (shader = gst_gl_effects_get_fragment_shader (effects, "desat0",
- desaturate_fragment_source_gles2,
- desaturate_fragment_source_opengl))) {
+ desaturate_fragment_source_gles2))) {
GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
#if GST_GL_HAVE_OPENGL
GstGLFilter *filter = GST_GL_FILTER (effects);
if (NULL != (shader = gst_gl_effects_get_fragment_shader (effects, "hconv0",
- sep_sobel_hconv3_fragment_source_gles2,
- sep_sobel_hconv3_fragment_source_opengl))) {
+ sep_sobel_hconv3_fragment_source_gles2))) {
GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
#if GST_GL_HAVE_OPENGL
GstGLFilter *filter = GST_GL_FILTER (effects);
if (NULL != (shader = gst_gl_effects_get_fragment_shader (effects, "vconv0",
- sep_sobel_vconv3_fragment_source_gles2,
- sep_sobel_vconv3_fragment_source_opengl))) {
+ sep_sobel_vconv3_fragment_source_gles2))) {
GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
#if GST_GL_HAVE_OPENGL
GstGLFilter *filter = GST_GL_FILTER (effects);
if (NULL != (shader = gst_gl_effects_get_fragment_shader (effects, "len0",
- sep_sobel_length_fragment_source_gles2,
- sep_sobel_length_fragment_source_opengl))) {
+ sep_sobel_length_fragment_source_gles2))) {
GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
#if GST_GL_HAVE_OPENGL
GstGLFuncs *gl = context->gl_vtable;
shader = gst_gl_effects_get_fragment_shader (effects, "square",
- square_fragment_source_gles2, square_fragment_source_opengl);
+ square_fragment_source_gles2);
if (!shader)
return;
GstGLFuncs *gl = context->gl_vtable;
shader = gst_gl_effects_get_fragment_shader (effects, "squeeze",
- squeeze_fragment_source_gles2, squeeze_fragment_source_opengl);
+ squeeze_fragment_source_gles2);
if (!shader)
return;
" gl_FragColor = texture2D (tex, texturecoord);"
"}";
-/* Squeeze effect */
-const gchar *squeeze_fragment_source_opengl =
- "uniform sampler2D tex;"
- "void main () {"
- " vec2 texturecoord = gl_TexCoord[0].xy;"
- " vec2 normcoord = texturecoord - 0.5;"
- " float r = length (normcoord);"
- " r = pow(r, 0.40)*1.3;"
- " normcoord = normcoord / r;"
- " texturecoord = (normcoord + 0.5);"
- " gl_FragColor = texture2D (tex, texturecoord);"
- "}";
-
const gchar *squeeze_fragment_source_gles2 =
"#ifdef GL_ES\n"
"precision mediump float;\n"
" gl_FragColor = texture2D (tex, texturecoord);"
"}";
-/* Stretch Effect */
-const gchar *stretch_fragment_source_opengl =
- "uniform sampler2D tex;"
- "void main () {"
- " vec2 texturecoord = gl_TexCoord[0].xy;"
- " vec2 normcoord;"
- " normcoord = texturecoord - 0.5;"
- " float r = length (normcoord);"
- " normcoord *= 2.0 - smoothstep(0.0, 0.35, r);"
- " texturecoord = normcoord + 0.5;"
- " vec4 color = texture2D (tex, texturecoord);"
- " gl_FragColor = color * gl_Color;"
- "}";
-
const gchar *stretch_fragment_source_gles2 =
"#ifdef GL_ES\n"
"precision mediump float;\n"
" gl_FragColor = texture2D (tex, texturecoord);"
"}";
-/* Light Tunnel effect */
-const gchar *tunnel_fragment_source_opengl =
- "uniform sampler2D tex;"
- "void main () {"
- " vec2 texturecoord = gl_TexCoord[0].xy;"
- " vec2 normcoord;"
- /* little trick with normalized coords to obtain a circle with
- * rect textures */
- " normcoord = (texturecoord - 0.5);"
- " float r = length(normcoord);"
- " normcoord *= clamp (r, 0.0, 0.275) / r;"
- " texturecoord = normcoord + 0.5;"
- " vec4 color = texture2D (tex, texturecoord); "
- " gl_FragColor = color;"
- "}";
-
const gchar *tunnel_fragment_source_gles2 =
"#ifdef GL_ES\n"
"precision mediump float;\n"
" gl_FragColor = texture2D (tex, texturecoord);"
"}";
-/* FishEye effect */
-const gchar *fisheye_fragment_source_opengl =
- "uniform sampler2D tex;"
- "void main () {"
- " vec2 texturecoord = gl_TexCoord[0].xy;"
- " vec2 normcoord;"
- " normcoord = texturecoord - 0.5;"
- " float r = length (normcoord);"
- " normcoord *= r * sqrt(2.0);"
- " texturecoord = normcoord + 0.5;"
- " vec4 color = texture2D (tex, texturecoord);"
- " gl_FragColor = color;"
- "}";
-
const gchar *fisheye_fragment_source_gles2 =
"#ifdef GL_ES\n"
"precision mediump float;\n"
" gl_FragColor = texture2D (tex, texturecoord);"
"}";
-/* Twirl effect */
-const gchar *twirl_fragment_source_opengl =
- "uniform sampler2D tex;"
- "void main () {"
- " vec2 texturecoord = gl_TexCoord[0].xy;"
- " vec2 normcoord;"
- " normcoord = texturecoord - 0.5;"
- " float r = length (normcoord);"
- /* calculate rotation angle: maximum (about pi/2) at the origin and
- * gradually decrease it up to 0.6 of each quadrant */
- " float phi = (1.0 - smoothstep (0.0, 0.3, r)) * 1.6;"
- /* precalculate sin phi and cos phi, save some alu */
- " float s = sin(phi);"
- " float c = cos(phi);"
- /* rotate */
- " normcoord *= mat2(c, s, -s, c);"
- " texturecoord = normcoord + 0.5;"
- " vec4 color = texture2D (tex, texturecoord); "
- " gl_FragColor = color;"
- "}";
-
const gchar *twirl_fragment_source_gles2 =
"#ifdef GL_ES\n"
"precision mediump float;\n"
" gl_FragColor = texture2D (tex, texturecoord);"
"}";
-/* Bulge effect */
-const gchar *bulge_fragment_source_opengl =
- "uniform sampler2D tex;"
- "void main () {"
- " vec2 texturecoord = gl_TexCoord[0].xy;"
- " vec2 normcoord;"
- " normcoord = texturecoord - 0.5;"
- " float r = length (normcoord);"
- " normcoord *= smoothstep (-0.05, 0.25, r);"
- " texturecoord = normcoord + 0.5;"
- " vec4 color = texture2D (tex, texturecoord);"
- " gl_FragColor = color;"
- "}";
-
const gchar *bulge_fragment_source_gles2 =
"#ifdef GL_ES\n"
"precision mediump float;\n"
" gl_FragColor = texture2D (tex, texturecoord);"
"}";
-/* Square Effect */
-const gchar *square_fragment_source_opengl =
- "uniform sampler2D tex;"
- "void main () {"
- " vec2 texturecoord = gl_TexCoord[0].xy;"
- " vec2 normcoord;"
- " normcoord = texturecoord - 0.5;"
- " float r = length (normcoord);"
- " normcoord *= 1.0 + smoothstep(0.125, 0.25, abs(normcoord));"
- " normcoord /= 2.0; /* zoom amount */"
- " texturecoord = normcoord + 0.5;"
- " vec4 color = texture2D (tex, texturecoord);"
- " gl_FragColor = color * gl_Color;"
- "}";
-
const gchar *square_fragment_source_gles2 =
"#ifdef GL_ES\n"
"precision mediump float;\n"
" gl_FragColor = texture2D (tex, texturecoord);"
"}";
-const gchar *luma_threshold_fragment_source_opengl =
- "uniform sampler2D tex;"
- "void main () {"
- " vec2 texturecoord = gl_TexCoord[0].st;"
- " vec4 color = texture2D(tex, texturecoord);"
- " float luma = dot(color.rgb, vec3(0.2125, 0.7154, 0.0721));" /* BT.709 (from orange book) */
- " gl_FragColor = vec4 (vec3 (smoothstep (0.30, 0.50, luma)), color.a);"
- "}";
-
const gchar *luma_threshold_fragment_source_gles2 =
"#ifdef GL_ES\n"
"precision mediump float;\n"
" gl_FragColor = vec4 (vec3 (smoothstep (0.30, 0.50, luma)), color.a);"
"}";
-const gchar *sep_sobel_length_fragment_source_opengl =
- "uniform sampler2D tex;"
- "uniform bool invert;"
- "void main () {"
- " vec4 g = texture2D (tex, gl_TexCoord[0].st);"
- /* restore black background with grey edges */
- " g -= vec4(0.5, 0.5, 0.0, 0.0);"
- " float len = length (g);"
- /* little trick to avoid IF operator */
- /* TODO: test if a standalone inverting pass is worth */
- " gl_FragColor = abs(vec4(vec3(float(invert) - len), 1.0));"
- "}";
-
const gchar *sep_sobel_length_fragment_source_gles2 =
"#ifdef GL_ES\n"
"precision mediump float;\n"
" gl_FragColor = abs(vec4(vec3(float(invert) - len), 1.0));"
"}";
-const gchar *desaturate_fragment_source_opengl =
- "uniform sampler2D tex;"
- "void main () {"
- " vec4 color = texture2D (tex, gl_TexCoord[0].st);"
- " float luma = dot(color.rgb, vec3(0.2125, 0.7154, 0.0721));"
- " gl_FragColor = vec4(vec3(luma), color.a);"
- "}";
-
const gchar *desaturate_fragment_source_gles2 =
"#ifdef GL_ES\n"
"precision mediump float;\n"
" gl_FragColor = vec4(vec3(luma), color.a);"
"}";
-const gchar *sep_sobel_hconv3_fragment_source_opengl =
- "uniform sampler2D tex;"
- "uniform float width;"
- "void main () {"
- " float w = 1.0 / width;"
- " vec2 texturecoord[3];"
- " texturecoord[1] = gl_TexCoord[0].st;"
- " texturecoord[0] = texturecoord[1] - vec2(w, 0.0);"
- " texturecoord[2] = texturecoord[1] + vec2(w, 0.0);"
- " float grad_kern[3];"
- " grad_kern[0] = 1.0;"
- " grad_kern[1] = 0.0;"
- " grad_kern[2] = -1.0;"
- " float blur_kern[3];"
- " blur_kern[0] = 0.25;"
- " blur_kern[1] = 0.5;"
- " blur_kern[2] = 0.25;"
- " int i;"
- " vec4 sum = vec4 (0.0);"
- " for (i = 0; i < 3; i++) { "
- " vec4 neighbor = texture2D(tex, texturecoord[i]); "
- " sum.r = neighbor.r * blur_kern[i] + sum.r;"
- " sum.g = neighbor.g * grad_kern[i] + sum.g;"
- " }"
- " gl_FragColor = sum + vec4(0.0, 0.5, 0.0, 0.0);"
- "}";
-
const gchar *sep_sobel_hconv3_fragment_source_gles2 =
"#ifdef GL_ES\n"
"precision mediump float;\n"
" gl_FragColor = sum + vec4(0.0, 0.5, 0.0, 0.0);"
"}";
-const gchar *sep_sobel_vconv3_fragment_source_opengl =
- "uniform sampler2D tex;"
- "uniform float height;"
- "void main () {"
- " float h = 1.0 / height;"
- " vec2 texturecoord[3];"
- " texturecoord[1] = gl_TexCoord[0].st;"
- " texturecoord[0] = texturecoord[1] - vec2(0.0, h);"
- " texturecoord[2] = texturecoord[1] + vec2(0.0, h);"
- " float grad_kern[3];"
- " grad_kern[0] = 1.0;"
- " grad_kern[1] = 0.0;"
- " grad_kern[2] = -1.0;"
- " float blur_kern[3];"
- " blur_kern[0] = 0.25;"
- " blur_kern[1] = 0.5;"
- " blur_kern[2] = 0.25;"
- " int i;"
- " vec4 sum = vec4 (0.0);"
- " for (i = 0; i < 3; i++) { "
- " vec4 neighbor = texture2D(tex, texturecoord[i]); "
- " sum.r = neighbor.r * grad_kern[i] + sum.r;"
- " sum.g = neighbor.g * blur_kern[i] + sum.g;"
- " }"
- " gl_FragColor = sum + vec4(0.5, 0.0, 0.0, 0.0);"
- "}";
-
const gchar *sep_sobel_vconv3_fragment_source_gles2 =
"#ifdef GL_ES\n"
"precision mediump float;\n"
" gl_FragColor = sum + vec4(0.5, 0.0, 0.0, 0.0);"
"}";
-/* horizontal convolution 7x7 */
-const gchar *hconv7_fragment_source_opengl =
- "uniform sampler2D tex;"
- "uniform float kernel[7];"
- "uniform float gauss_width;"
- "void main () {"
- " float w = 1.0 / gauss_width;"
- " vec2 texturecoord[7];"
- " texturecoord[3] = gl_TexCoord[0].st;"
- " texturecoord[2] = texturecoord[3] - vec2(w, 0.0);"
- " texturecoord[1] = texturecoord[2] - vec2(w, 0.0);"
- " texturecoord[0] = texturecoord[1] - vec2(w, 0.0);"
- " texturecoord[4] = texturecoord[3] + vec2(w, 0.0);"
- " texturecoord[5] = texturecoord[4] + vec2(w, 0.0);"
- " texturecoord[6] = texturecoord[5] + vec2(w, 0.0);"
- " int i;"
- " vec4 sum = vec4 (0.0);"
- " for (i = 0; i < 7; i++) { "
- " vec4 neighbor = texture2D(tex, texturecoord[i]); "
- " sum += neighbor * kernel[i];"
- " }"
- " gl_FragColor = sum;"
- "}";
-
const gchar *hconv7_fragment_source_gles2 =
"#ifdef GL_ES\n"
"precision mediump float;\n"
"}";
/* vertical convolution 7x7 */
-const gchar *vconv7_fragment_source_opengl =
- "uniform sampler2D tex;"
- "uniform float kernel[7];"
- "uniform float gauss_height;"
- "void main () {"
- " float h = 1.0 / gauss_height;"
- " vec2 texturecoord[7];"
- " texturecoord[3] = gl_TexCoord[0].st;"
- " texturecoord[2] = texturecoord[3] - vec2(0.0, h);"
- " texturecoord[1] = texturecoord[2] - vec2(0.0, h);"
- " texturecoord[0] = texturecoord[1] - vec2(0.0, h);"
- " texturecoord[4] = texturecoord[3] + vec2(0.0, h);"
- " texturecoord[5] = texturecoord[4] + vec2(0.0, h);"
- " texturecoord[6] = texturecoord[5] + vec2(0.0, h);"
- " int i;"
- " vec4 sum = vec4 (0.0);"
- " for (i = 0; i < 7; i++) { "
- " vec4 neighbor = texture2D(tex, texturecoord[i]);"
- " sum += neighbor * kernel[i];"
- " }"
- " gl_FragColor = sum;"
- "}";
-
const gchar *vconv7_fragment_source_gles2 =
"#ifdef GL_ES\n"
"precision mediump float;\n"
"}";
/* TODO: support several blend modes */
-const gchar *sum_fragment_source_opengl =
- "uniform sampler2D base;"
- "uniform sampler2D blend;"
- "uniform float alpha;"
- "uniform float beta;"
- "void main () {"
- " vec4 basecolor = texture2D (base, gl_TexCoord[0].st);"
- " vec4 blendcolor = texture2D (blend, gl_TexCoord[0].st);"
- " gl_FragColor = alpha * basecolor + beta * blendcolor;"
- "}";
-
const gchar *sum_fragment_source_gles2 =
"#ifdef GL_ES\n"
"precision mediump float;\n"
" gl_FragColor = alpha * basecolor + beta * blendcolor;"
"}";
-const gchar *multiply_fragment_source_opengl =
- "uniform sampler2D base;"
- "uniform sampler2D blend;"
- "uniform float alpha;"
- "void main () {"
- " vec4 basecolor = texture2D (base, gl_TexCoord[0].st);"
- " vec4 blendcolor = texture2D (blend, gl_TexCoord[0].st);"
- " gl_FragColor = (1.0 - alpha) * basecolor + alpha * basecolor * blendcolor;"
- "}";
-
const gchar *multiply_fragment_source_gles2 =
"#ifdef GL_ES\n"
"precision mediump float;\n"
"}";
/* lut operations, map luma to tex1d, see orange book (chapter 19) */
-const gchar *luma_to_curve_fragment_source_opengl =
- "uniform sampler2D tex;"
- "uniform sampler1D curve;"
- "void main () {"
- " vec2 texturecoord = gl_TexCoord[0].st;"
- " vec4 color = texture2D (tex, texturecoord);"
- " float luma = dot(color.rgb, vec3(0.2125, 0.7154, 0.0721));"
- " color = texture1D(curve, luma);"
- " gl_FragColor = color;"
- "}";
-
const gchar *luma_to_curve_fragment_source_gles2 =
"#ifdef GL_ES\n"
"precision mediump float;\n"
"}";
/* lut operations, map rgb to tex1d, see orange book (chapter 19) */
-const gchar *rgb_to_curve_fragment_source_opengl =
- "uniform sampler2D tex;"
- "uniform sampler1D curve;"
- "void main () {"
- " vec4 color = texture2D (tex, gl_TexCoord[0].st);"
- " vec4 outcolor;"
- " outcolor.r = texture1D(curve, color.r).r;"
- " outcolor.g = texture1D(curve, color.g).g;"
- " outcolor.b = texture1D(curve, color.b).b;"
- " outcolor.a = color.a;"
- " gl_FragColor = outcolor;"
- "}";
-
const gchar *rgb_to_curve_fragment_source_gles2 =
"#ifdef GL_ES\n"
"precision mediump float;\n"
" gl_FragColor = outcolor;"
"}";
-const gchar *sin_fragment_source_opengl =
- "uniform sampler2D tex;"
- "void main () {"
- " vec4 color = texture2D (tex, vec2(gl_TexCoord[0].st));"
- " float luma = dot(color.rgb, vec3(0.2125, 0.7154, 0.0721));"
-/* calculate hue with the Preucil formula */
- " float cosh = color.r - 0.5*(color.g + color.b);"
-/* sqrt(3)/2 = 0.866 */
- " float sinh = 0.866*(color.g - color.b);"
-/* hue = atan2 h */
- " float sch = (1.0-sinh)*cosh;"
-/* ok this is a little trick I came up because I didn't find any
- * detailed proof of the Preucil formula. The issue is that tan(h) is
- * pi-periodic so the smoothstep thing gives both reds (h = 0) and
- * cyans (h = 180). I don't want to use atan since it requires
- * branching and doesn't work on i915. So take only the right half of
- * the circle where cosine is positive */
-/* take a slightly purple color trying to get rid of human skin reds */
-/* tanh = +-1.0 for h = +-45, where yellow=60, magenta=-60 */
- " float a = smoothstep (0.3, 1.0, sch);"
- " float b = smoothstep (-0.4, -0.1, sinh);"
- " float mix = a * b;"
- " gl_FragColor = color * mix + luma * (1.0 - mix);"
- "}";
-
const gchar *sin_fragment_source_gles2 =
"#ifdef GL_ES\n"
"precision mediump float;\n"
when this shader will be used in production be careful to hard code
kernel into the shader and remove unneeded zero multiplications in
the convolution */
-const gchar *conv9_fragment_source_opengl =
- "uniform sampler2D tex;"
- "uniform float kernel[9];"
- "uniform float width, height;"
- "uniform bool invert;"
- "void main () {"
- " float w = 1.0 / width;"
- " float h = 1.0 / height;"
- " vec2 texturecoord[9];"
- " texturecoord[4] = gl_TexCoord[0].st;" /* 0 0 */
- " texturecoord[5] = texturecoord[4] + vec2(w, 0.0);" /* 1 0 */
- " texturecoord[2] = texturecoord[5] - vec2(0.0, h);" /* 1 -1 */
- " texturecoord[1] = texturecoord[2] - vec2(w, 0.0);" /* 0 -1 */
- " texturecoord[0] = texturecoord[1] - vec2(w, 0.0);" /* -1 -1 */
- " texturecoord[3] = texturecoord[0] + vec2(0.0, h);" /* -1 0 */
- " texturecoord[6] = texturecoord[3] + vec2(0.0, h);" /* -1 1 */
- " texturecoord[7] = texturecoord[6] + vec2(w, 0.0);" /* 0 1 */
- " texturecoord[8] = texturecoord[7] + vec2(w, 0.0);" /* 1 1 */
- " int i;"
- " vec3 sum = vec3 (0.0);"
- " for (i = 0; i < 9; i++) { "
- " vec4 neighbor = texture2D (tex, texturecoord[i]);"
- " sum += neighbor.xyz * kernel[i];"
- " }"
- " gl_FragColor = vec4 (abs(sum - vec3(float(invert))), 1.0);"
- "}";
-
const gchar *conv9_fragment_source_gles2 =
"#ifdef GL_ES\n"
"precision mediump float;\n"
#ifndef __GST_GL_EFFECTS_SOURCES_H__
#define __GST_GL_EFFECTS_SOURCES_H__
-extern const gchar *mirror_fragment_source_opengl;
-extern const gchar *squeeze_fragment_source_opengl;
-extern const gchar *stretch_fragment_source_opengl;
-extern const gchar *fisheye_fragment_source_opengl;
-extern const gchar *twirl_fragment_source_opengl;
-extern const gchar *bulge_fragment_source_opengl;
-extern const gchar *tunnel_fragment_source_opengl;
-extern const gchar *square_fragment_source_opengl;
-extern const gchar *luma_threshold_fragment_source_opengl;
-extern const gchar *hconv7_fragment_source_opengl;
-extern const gchar *vconv7_fragment_source_opengl;
-extern const gchar *sum_fragment_source_opengl;
-extern const gchar *luma_to_curve_fragment_source_opengl;
-extern const gchar *rgb_to_curve_fragment_source_opengl;
-extern const gchar *sin_fragment_source_opengl;
-extern const gchar *desaturate_fragment_source_opengl;
-extern const gchar *sep_sobel_hconv3_fragment_source_opengl;
-extern const gchar *sep_sobel_vconv3_fragment_source_opengl;
-extern const gchar *sep_sobel_length_fragment_source_opengl;
-extern const gchar *multiply_fragment_source_opengl;
-extern const gchar *conv9_fragment_source_opengl;
-
extern const gchar *mirror_fragment_source_gles2;
extern const gchar *squeeze_fragment_source_gles2;
extern const gchar *stretch_fragment_source_gles2;
GstGLFuncs *gl = context->gl_vtable;
shader = gst_gl_effects_get_fragment_shader (effects, "stretch",
- stretch_fragment_source_gles2, stretch_fragment_source_opengl);
+ stretch_fragment_source_gles2);
if (!shader)
return;
GstGLFuncs *gl = context->gl_vtable;
shader = gst_gl_effects_get_fragment_shader (effects, "tunnel",
- tunnel_fragment_source_gles2, tunnel_fragment_source_opengl);
+ tunnel_fragment_source_gles2);
if (!shader)
return;
GstGLFuncs *gl = context->gl_vtable;
shader = gst_gl_effects_get_fragment_shader (effects, "twirl",
- twirl_fragment_source_gles2, twirl_fragment_source_opengl);
+ twirl_fragment_source_gles2);
if (!shader)
return;
GstGLFuncs *gl = context->gl_vtable;
shader = gst_gl_effects_get_fragment_shader (effects, "hconv7",
- hconv7_fragment_source_gles2, hconv7_fragment_source_opengl);
+ hconv7_fragment_source_gles2);
if (!shader)
return;
GstGLFuncs *gl = context->gl_vtable;
shader = gst_gl_effects_get_fragment_shader (effects, "vconv7",
- vconv7_fragment_source_gles2, vconv7_fragment_source_opengl);
+ vconv7_fragment_source_gles2);
if (!shader)
return;
GstGLFuncs *gl = context->gl_vtable;
shader = gst_gl_effects_get_fragment_shader (effects, "desaturate",
- desaturate_fragment_source_gles2, desaturate_fragment_source_opengl);
+ desaturate_fragment_source_gles2);
if (!shader)
return;
GstGLFuncs *gl = context->gl_vtable;
shader = gst_gl_effects_get_fragment_shader (effects, "sobel_hconv3",
- sep_sobel_hconv3_fragment_source_gles2,
- sep_sobel_hconv3_fragment_source_opengl);
+ sep_sobel_hconv3_fragment_source_gles2);
if (!shader)
return;
GstGLFuncs *gl = context->gl_vtable;
shader = gst_gl_effects_get_fragment_shader (effects, "sobel_vconv3",
- sep_sobel_vconv3_fragment_source_gles2,
- sep_sobel_vconv3_fragment_source_opengl);
+ sep_sobel_vconv3_fragment_source_gles2);
if (!shader)
return;
GstGLFuncs *gl = context->gl_vtable;
shader = gst_gl_effects_get_fragment_shader (effects, "sobel_length",
- sep_sobel_length_fragment_source_gles2,
- sep_sobel_length_fragment_source_opengl);
+ sep_sobel_length_fragment_source_gles2);
if (!shader)
return;
GstGLFuncs *gl = context->gl_vtable;
shader = gst_gl_effects_get_fragment_shader (effects, "multiply",
- multiply_fragment_source_gles2, multiply_fragment_source_opengl);
+ multiply_fragment_source_gles2);
if (!shader)
return;
gst_gl_shader_new (GST_GL_BASE_FILTER (filter)->context);
}
- if (!gst_gl_shader_compile_and_check (differencematte->shader[0],
- difference_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE)) {
+ if (!gst_gl_shader_compile_with_default_v_and_check (differencematte->shader
+ [0], difference_fragment_source, &filter->draw_attr_position_loc,
+ &filter->draw_attr_texture_loc)) {
gst_gl_context_set_error (GST_GL_BASE_FILTER (differencematte)->context,
"Failed to initialize difference shader");
- GST_ELEMENT_ERROR (differencematte, RESOURCE, NOT_FOUND,
- ("%s", gst_gl_context_get_error ()), (NULL));
+ GST_ELEMENT_ERROR (differencematte, RESOURCE, NOT_FOUND, ("%s",
+ gst_gl_context_get_error ()), (NULL));
return;
}
- if (!gst_gl_shader_compile_and_check (differencematte->shader[1],
- hconv7_fragment_source_opengl, GST_GL_SHADER_FRAGMENT_SOURCE)) {
+ if (!gst_gl_shader_compile_with_default_v_and_check (differencematte->shader
+ [1], hconv7_fragment_source_gles2, &filter->draw_attr_position_loc,
+ &filter->draw_attr_texture_loc)) {
gst_gl_context_set_error (GST_GL_BASE_FILTER (differencematte)->context,
"Failed to initialize hconv7 shader");
- GST_ELEMENT_ERROR (differencematte, RESOURCE, NOT_FOUND,
- ("%s", gst_gl_context_get_error ()), (NULL));
+ GST_ELEMENT_ERROR (differencematte, RESOURCE, NOT_FOUND, ("%s",
+ gst_gl_context_get_error ()), (NULL));
return;
}
- if (!gst_gl_shader_compile_and_check (differencematte->shader[2],
- vconv7_fragment_source_opengl, GST_GL_SHADER_FRAGMENT_SOURCE)) {
+ if (!gst_gl_shader_compile_with_default_v_and_check (differencematte->shader
+ [2], vconv7_fragment_source_gles2, &filter->draw_attr_position_loc,
+ &filter->draw_attr_texture_loc)) {
gst_gl_context_set_error (GST_GL_BASE_FILTER (differencematte)->context,
"Failed to initialize vconv7 shader");
- GST_ELEMENT_ERROR (differencematte, RESOURCE, NOT_FOUND,
- ("%s", gst_gl_context_get_error ()), (NULL));
+ GST_ELEMENT_ERROR (differencematte, RESOURCE, NOT_FOUND, ("%s",
+ gst_gl_context_get_error ()), (NULL));
return;
}
- if (!gst_gl_shader_compile_and_check (differencematte->shader[3],
- texture_interp_fragment_source, GST_GL_SHADER_FRAGMENT_SOURCE)) {
+ if (!gst_gl_shader_compile_with_default_v_and_check (differencematte->shader
+ [3], texture_interp_fragment_source, &filter->draw_attr_position_loc,
+ &filter->draw_attr_texture_loc)) {
gst_gl_context_set_error (GST_GL_BASE_FILTER (differencematte)->context,
"Failed to initialize interp shader");
- GST_ELEMENT_ERROR (differencematte, RESOURCE, NOT_FOUND,
- ("%s", gst_gl_context_get_error ()), (NULL));
+ GST_ELEMENT_ERROR (differencematte, RESOURCE, NOT_FOUND, ("%s",
+ gst_gl_context_get_error ()), (NULL));
return;
}
}
"Saves a background frame and replace it with a pixbuf",
"Filippo Argiolas <filippo.argiolas@gmail.com>");
- GST_GL_BASE_FILTER_CLASS (klass)->supported_gl_api = GST_GL_API_OPENGL;
+ GST_GL_BASE_FILTER_CLASS (klass)->supported_gl_api =
+ GST_GL_API_OPENGL | GST_GL_API_OPENGL3 | GST_GL_API_GLES2;
}
static void
GstGLShader *
gst_gl_effects_get_fragment_shader (GstGLEffects * effects,
- const gchar * shader_name, const gchar * shader_source_gles2,
- const gchar * shader_source_opengl)
+ const gchar * shader_name, const gchar * shader_source_gles2)
{
GstGLShader *shader = NULL;
GstGLFilter *filter = GST_GL_FILTER (effects);
shader = g_hash_table_lookup (effects->shaderstable, shader_name);
if (!shader) {
- if (!shader && (USING_GLES2 (context) || USING_OPENGL3 (context))) {
- shader = gst_gl_shader_new (context);
- if (!gst_gl_shader_compile_with_default_v_and_check (shader,
- shader_source_gles2, &filter->draw_attr_position_loc,
- &filter->draw_attr_texture_loc)) {
- /* gst gl context error is already set */
- GST_ELEMENT_ERROR (effects, RESOURCE, NOT_FOUND,
- ("Failed to initialize %s shader, %s",
- shader_name, gst_gl_context_get_error ()), (NULL));
- gst_object_unref (shader);
- shader = NULL;
- }
- }
-#if GST_GL_HAVE_OPENGL
- if (!shader && USING_OPENGL (context)) {
- shader = gst_gl_shader_new (context);
- if (!gst_gl_shader_compile_and_check (shader,
- shader_source_opengl, GST_GL_SHADER_FRAGMENT_SOURCE)) {
- gst_gl_context_set_error (context, "Failed to initialize %s shader",
- shader_name);
- GST_ELEMENT_ERROR (effects, RESOURCE, NOT_FOUND, ("%s",
- gst_gl_context_get_error ()), (NULL));
- gst_object_unref (shader);
- shader = NULL;
- }
+ shader = gst_gl_shader_new (context);
+ if (!gst_gl_shader_compile_with_default_v_and_check (shader,
+ shader_source_gles2, &filter->draw_attr_position_loc,
+ &filter->draw_attr_texture_loc)) {
+ /* gst gl context error is already set */
+ GST_ELEMENT_ERROR (effects, RESOURCE, NOT_FOUND,
+ ("Failed to initialize %s shader, %s",
+ shader_name, gst_gl_context_get_error ()), (NULL));
+ gst_object_unref (shader);
+ shader = NULL;
}
-#endif
+ }
- if (!shader)
- return NULL;
+ if (!shader)
+ return NULL;
- g_hash_table_insert (effects->shaderstable, (gchar *) shader_name, shader);
- }
+ g_hash_table_insert (effects->shaderstable, (gchar *) shader_name, shader);
return shader;
}
GType gst_gl_effects_get_type (void);
gboolean gst_gl_effects_register_filters (GstPlugin *, GstRank);
GstGLShader* gst_gl_effects_get_fragment_shader (GstGLEffects *effects,
- const gchar * shader_name, const gchar * shader_source_gles2, const gchar * shader_source_opengl);
+ const gchar * shader_name, const gchar * shader_source_gles2);
void gst_gl_effects_identity (GstGLEffects *effects);
void gst_gl_effects_mirror (GstGLEffects *effects);
GST_DEBUG ("drawing texture:%u dimensions:%ux%u", texture, width, height);
-#if GST_GL_HAVE_OPENGL
- if (gst_gl_context_get_gl_api (context) & GST_GL_API_OPENGL) {
- GLfloat verts[] = { -1.0f, -1.0f,
- 1.0f, -1.0f,
- 1.0f, 1.0f,
- -1.0f, 1.0f
- };
- GLfloat texcoords[] = { 0.0f, 0.0f,
- 1.0f, 0.0f,
- 1.0f, 1.0f,
- 0.0f, 1.0f
- };
-
- gl->ActiveTexture (GL_TEXTURE0);
- gl->BindTexture (GL_TEXTURE_2D, texture);
-
- gl->EnableClientState (GL_VERTEX_ARRAY);
- gl->VertexPointer (2, GL_FLOAT, 0, &verts);
-
- gl->ClientActiveTexture (GL_TEXTURE0);
- gl->EnableClientState (GL_TEXTURE_COORD_ARRAY);
- gl->TexCoordPointer (2, GL_FLOAT, 0, &texcoords);
-
- gl->DrawArrays (GL_TRIANGLE_FAN, 0, 4);
-
- gl->DisableClientState (GL_VERTEX_ARRAY);
- gl->DisableClientState (GL_TEXTURE_COORD_ARRAY);
- }
-#endif
- if (gst_gl_context_get_gl_api (context) & (GST_GL_API_GLES2 |
- GST_GL_API_OPENGL3)) {
+ {
if (!filter->vertex_buffer) {
if (gl->GenVertexArrays) {
gl->GenVertexArrays (1, &filter->vao);