1 /* 2 * GStreamer 3 * Copyright (C) 2009 Julien Isorce <julien.isorce@gmail.com> 4 * 5 * This library is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU Library General Public 7 * License as published by the Free Software Foundation; either 8 * version 2 of the License, or (at your option) any later version. 9 * 10 * This library is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * Library General Public License for more details. 14 * 15 * You should have received a copy of the GNU Library General Public 16 * License along with this library; if not, write to the 17 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, 18 * Boston, MA 02110-1301, USA. 19 */ 20 21 #ifndef _GST_GL_VIDEO_MIXER_H_ 22 #define _GST_GL_VIDEO_MIXER_H_ 23 24 #include "gstglmixer.h" 25 26 G_BEGIN_DECLS 27 28 #define GST_TYPE_GL_VIDEO_MIXER (gst_gl_video_mixer_get_type()) 29 #define GST_GL_VIDEO_MIXER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_GL_VIDEO_MIXER,GstGLVideoMixer)) 30 #define GST_IS_GL_VIDEO_MIXER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_GL_VIDEO_MIXER)) 31 #define GST_GL_VIDEO_MIXER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass) ,GST_TYPE_GL_VIDEO_MIXER,GstGLVideoMixerClass)) 32 #define GST_IS_GL_VIDEO_MIXER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_GL_VIDEO_MIXER)) 33 #define GST_GL_VIDEO_MIXER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_GL_VIDEO_MIXER,GstGLVideoMixerClass)) 34 35 typedef struct _GstGLVideoMixer GstGLVideoMixer; 36 typedef struct _GstGLVideoMixerClass GstGLVideoMixerClass; 37 38 /** 39 * GstGLVideoMixerBackground: 40 * @GST_GL_VIDEO_MIXER_BACKGROUND_CHECKER: checker pattern background 41 * @GST_GL_VIDEO_MIXER_BACKGROUND_BLACK: solid color black background 42 * @GST_GL_VIDEO_MIXER_BACKGROUND_WHITE: solid color white background 43 * @GST_GL_VIDEO_MIXER_BACKGROUND_TRANSPARENT: background is left transparent and layers are composited using "A OVER B" composition rules. This is only applicable to AYUV and ARGB (and variants) as it preserves the alpha channel and allows for further mixing. 44 * 45 * The different backgrounds compositor can blend over. 46 */ 47 typedef enum 48 { 49 GST_GL_VIDEO_MIXER_BACKGROUND_CHECKER, 50 GST_GL_VIDEO_MIXER_BACKGROUND_BLACK, 51 GST_GL_VIDEO_MIXER_BACKGROUND_WHITE, 52 GST_GL_VIDEO_MIXER_BACKGROUND_TRANSPARENT, 53 } 54 GstGLVideoMixerBackground; 55 56 /** 57 * GstGLVideoMixerBlendEquation: 58 * @GST_GL_VIDEO_MIXER_BLEND_EQUATION_ADD: Add the two results. 59 * @GST_GL_VIDEO_MIXER_BLEND_EQUATION_SUBTRACT: Subtract component-wise the destination from the source (S - D). 60 * @GST_GL_VIDEO_MIXER_BLEND_EQUATION_REVERSE_SUBTRACT: Subtract component-wise the source from the destination (D - S). 61 * 62 * The blending equation to use. See the opengl specificition for 63 * glBlendEquationSeparate 64 */ 65 typedef enum 66 { 67 GST_GL_VIDEO_MIXER_BLEND_EQUATION_ADD, 68 GST_GL_VIDEO_MIXER_BLEND_EQUATION_SUBTRACT, 69 GST_GL_VIDEO_MIXER_BLEND_EQUATION_REVERSE_SUBTRACT, 70 } 71 GstGLVideoMixerBlendEquation; 72 73 /** 74 * GstGLVideoMixerBlendFunction: 75 * @GST_GL_VIDEO_MIXER_BLEND_FUNCTION_ZERO: All components are zero 76 * @GST_GL_VIDEO_MIXER_BLEND_FUNCTION_ONE: All components are one 77 * @GST_GL_VIDEO_MIXER_BLEND_FUNCTION_SRC_COLOR: Use the source color/alpha 78 * @GST_GL_VIDEO_MIXER_BLEND_FUNCTION_ONE_MINUS_SRC_COLOR: One minus the source color/alpha 79 * @GST_GL_VIDEO_MIXER_BLEND_FUNCTION_DST_COLOR: Use the destination color/alpha 80 * @GST_GL_VIDEO_MIXER_BLEND_FUNCTION_ONE_MINUS_DST_COLOR: One minus the destination color/alpha 81 * @GST_GL_VIDEO_MIXER_BLEND_FUNCTION_SRC_ALPHA: All components are the source alpha 82 * @GST_GL_VIDEO_MIXER_BLEND_FUNCTION_ONE_MINUS_SRC_ALPHA: All components are one minus the source alpha 83 * @GST_GL_VIDEO_MIXER_BLEND_FUNCTION_DST_ALPHA: All components are the destination alpha 84 * @GST_GL_VIDEO_MIXER_BLEND_FUNCTION_ONE_MINUS_DST_ALPHA: All components are one minus the destination alpha 85 * @GST_GL_VIDEO_MIXER_BLEND_FUNCTION_CONSTANT_COLOR: Use the constant color/alpha 86 * @GST_GL_VIDEO_MIXER_BLEND_FUNCTION_ONE_MINUS_CONSTANT_COLOR: Use one minus the constant color/alpha 87 * @GST_GL_VIDEO_MIXER_BLEND_FUNCTION_CONSTANT_ALPHA: All components are the constant alpha 88 * @GST_GL_VIDEO_MIXER_BLEND_FUNCTION_ONE_MINUS_CONSTANT_COLOR: All components are one minus the constant alpha 89 * @GST_GL_VIDEO_MIXER_BLEND_FUNCTION_SRC_ALPHA_SATURATE: All color components 90 * are the minimum of source alpha and one minus the destination alpha. 91 * Alpha is equal to one. 92 * 93 * The blending function to use. See the opengl specificition for 94 * glBlendFuncSeparate 95 */ 96 typedef enum 97 { 98 GST_GL_VIDEO_MIXER_BLEND_FUNCTION_ZERO, 99 GST_GL_VIDEO_MIXER_BLEND_FUNCTION_ONE, 100 GST_GL_VIDEO_MIXER_BLEND_FUNCTION_SRC_COLOR, 101 GST_GL_VIDEO_MIXER_BLEND_FUNCTION_ONE_MINUS_SRC_COLOR, 102 GST_GL_VIDEO_MIXER_BLEND_FUNCTION_DST_COLOR, 103 GST_GL_VIDEO_MIXER_BLEND_FUNCTION_ONE_MINUS_DST_COLOR, 104 GST_GL_VIDEO_MIXER_BLEND_FUNCTION_SRC_ALPHA, 105 GST_GL_VIDEO_MIXER_BLEND_FUNCTION_ONE_MINUS_SRC_ALPHA, 106 GST_GL_VIDEO_MIXER_BLEND_FUNCTION_DST_ALPHA, 107 GST_GL_VIDEO_MIXER_BLEND_FUNCTION_ONE_MINUS_DST_ALPHA, 108 GST_GL_VIDEO_MIXER_BLEND_FUNCTION_CONSTANT_COLOR, 109 GST_GL_VIDEO_MIXER_BLEND_FUNCTION_ONE_MINUS_CONSTANT_COLOR, 110 GST_GL_VIDEO_MIXER_BLEND_FUNCTION_CONSTANT_ALPHA, 111 GST_GL_VIDEO_MIXER_BLEND_FUNCTION_ONE_MINUS_CONSTANT_ALPHA, 112 GST_GL_VIDEO_MIXER_BLEND_FUNCTION_SRC_ALPHA_SATURATE, 113 } 114 GstGLVideoMixerBlendFunction; 115 116 struct _GstGLVideoMixer 117 { 118 GstGLMixer mixer; 119 120 GstGLVideoMixerBackground background; 121 122 GstGLShader *shader; 123 GstGLShader *checker; 124 125 GLuint vao; 126 GLuint vbo_indices; 127 GLuint checker_vbo; 128 GstGLMemory *out_tex; 129 130 gboolean output_geo_change; 131 }; 132 133 struct _GstGLVideoMixerClass 134 { 135 GstGLMixerClass mixer_class; 136 }; 137 138 GType gst_gl_video_mixer_get_type (void); 139 GType gst_gl_video_mixer_bin_get_type (void); 140 141 G_END_DECLS 142 143 #endif /* _GST_GLFILTERCUBE_H_ */ 144