static void gst_glimage_sink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstGLImageSink *glimage_sink; g_return_if_fail (GST_IS_GLIMAGE_SINK (object)); glimage_sink = GST_GLIMAGE_SINK (object); switch (prop_id) { case ARG_DISPLAY: g_value_set_string (value, glimage_sink->display_name); break; case PROP_FORCE_ASPECT_RATIO: g_value_set_boolean (value, glimage_sink->keep_aspect_ratio); break; case PROP_PIXEL_ASPECT_RATIO: if (!glimage_sink->par) { glimage_sink->par = g_new0 (GValue, 1); g_value_init (glimage_sink->par, GST_TYPE_FRACTION); gst_value_set_fraction (glimage_sink->par, 1, 1); } if (!g_value_transform (glimage_sink->par, value)) g_warning ("Could not transform string to aspect ratio"); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
static void gst_glimage_sink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstGLImageSink *glimage_sink; g_return_if_fail (GST_IS_GLIMAGE_SINK (object)); glimage_sink = GST_GLIMAGE_SINK (object); switch (prop_id) { case ARG_DISPLAY: g_value_set_string (value, glimage_sink->display_name); break; case PROP_FORCE_ASPECT_RATIO: g_value_set_boolean (value, glimage_sink->keep_aspect_ratio); break; case PROP_PIXEL_ASPECT_RATIO: gst_value_set_fraction (value, glimage_sink->par_n, glimage_sink->par_d); break; case PROP_OTHER_CONTEXT: g_value_set_object (value, glimage_sink->other_context); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
static void gst_glimage_sink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstGLImageSink *glimage_sink; g_return_if_fail (GST_IS_GLIMAGE_SINK (object)); glimage_sink = GST_GLIMAGE_SINK (object); switch (prop_id) { case ARG_DISPLAY: { g_free (glimage_sink->display_name); glimage_sink->display_name = g_strdup (g_value_get_string (value)); break; } case PROP_CLIENT_RESHAPE_CALLBACK: { glimage_sink->clientReshapeCallback = g_value_get_pointer (value); break; } case PROP_CLIENT_DRAW_CALLBACK: { glimage_sink->clientDrawCallback = g_value_get_pointer (value); break; } case PROP_CLIENT_DATA: { glimage_sink->client_data = g_value_get_pointer (value); break; } case PROP_FORCE_ASPECT_RATIO: { glimage_sink->keep_aspect_ratio = g_value_get_boolean (value); break; } case PROP_PIXEL_ASPECT_RATIO: { glimage_sink->par_n = gst_value_get_fraction_numerator (value); glimage_sink->par_d = gst_value_get_fraction_denominator (value); break; } case PROP_OTHER_CONTEXT: { if (glimage_sink->other_context) gst_object_unref (glimage_sink->other_context); glimage_sink->other_context = g_value_dup_object (value); break; } default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
static void gst_glimage_sink_set_xwindow_id (GstXOverlay * overlay, gulong window_id) { GstGLImageSink *glimage_sink = GST_GLIMAGE_SINK (overlay); g_return_if_fail (GST_IS_GLIMAGE_SINK (overlay)); GST_DEBUG ("set_xwindow_id %ld", window_id); glimage_sink->new_window_id = window_id; }
static void gst_glimage_sink_set_window_handle (GstVideoOverlay * overlay, guintptr id) { GstGLImageSink *glimage_sink = GST_GLIMAGE_SINK (overlay); guintptr window_id = (guintptr) id; g_return_if_fail (GST_IS_GLIMAGE_SINK (overlay)); GST_DEBUG ("set_xwindow_id %" G_GUINT64_FORMAT, (guint64) window_id); glimage_sink->new_window_id = window_id; }
static void gst_glimage_sink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstGLImageSink *glimage_sink; g_return_if_fail (GST_IS_GLIMAGE_SINK (object)); glimage_sink = GST_GLIMAGE_SINK (object); switch (prop_id) { case ARG_DISPLAY: { g_free (glimage_sink->display_name); glimage_sink->display_name = g_strdup (g_value_get_string (value)); break; } case PROP_CLIENT_RESHAPE_CALLBACK: { glimage_sink->clientReshapeCallback = g_value_get_pointer (value); break; } case PROP_CLIENT_DRAW_CALLBACK: { glimage_sink->clientDrawCallback = g_value_get_pointer (value); break; } case PROP_CLIENT_DATA: { glimage_sink->client_data = g_value_get_pointer (value); break; } case PROP_FORCE_ASPECT_RATIO: { glimage_sink->keep_aspect_ratio = g_value_get_boolean (value); break; } case PROP_PIXEL_ASPECT_RATIO: { g_free (glimage_sink->par); glimage_sink->par = g_new0 (GValue, 1); g_value_init (glimage_sink->par, GST_TYPE_FRACTION); if (!g_value_transform (value, glimage_sink->par)) { g_warning ("Could not transform string to aspect ratio"); gst_value_set_fraction (glimage_sink->par, 1, 1); } break; } default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
static void gst_glimage_sink_finalize (GObject * object) { GstGLImageSink *glimage_sink; g_return_if_fail (GST_IS_GLIMAGE_SINK (object)); glimage_sink = GST_GLIMAGE_SINK (object); g_mutex_clear (&glimage_sink->drawing_lock); g_free (glimage_sink->display_name); GST_DEBUG ("finalized"); }
static void gst_glimage_sink_finalize (GObject * object) { GstGLImageSink *glimage_sink; g_return_if_fail (GST_IS_GLIMAGE_SINK (object)); glimage_sink = GST_GLIMAGE_SINK (object); if (glimage_sink->caps) gst_caps_unref (glimage_sink->caps); g_free (glimage_sink->display_name); GST_DEBUG ("finalized"); }
static void gst_glimage_sink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstGLImageSink *glimage_sink; g_return_if_fail (GST_IS_GLIMAGE_SINK (object)); glimage_sink = GST_GLIMAGE_SINK (object); switch (prop_id) { case ARG_DISPLAY: { g_free (glimage_sink->display_name); glimage_sink->display_name = g_strdup (g_value_get_string (value)); break; } case PROP_CLIENT_RESHAPE_CALLBACK: { glimage_sink->clientReshapeCallback = g_value_get_pointer (value); break; } case PROP_CLIENT_DRAW_CALLBACK: { glimage_sink->clientDrawCallback = g_value_get_pointer (value); break; } case PROP_FORCE_ASPECT_RATIO: { glimage_sink->keep_aspect_ratio = g_value_get_boolean (value); break; } default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
static void gst_glimage_sink_on_draw (const GstGLImageSink * gl_sink) { /* Here gl_sink members (ex:gl_sink->info) have a life time of set_caps. * It means that they cannot not change between two set_caps as well as * for the redisplay_texture size. * Whereas redisplay_texture id changes every sink_render */ const GstGLFuncs *gl = NULL; GstGLWindow *window = NULL; g_return_if_fail (GST_IS_GLIMAGE_SINK (gl_sink)); gl = gl_sink->context->gl_vtable; GST_GLIMAGE_SINK_LOCK (gl_sink); /* check if texture is ready for being drawn */ if (!gl_sink->redisplay_texture) { GST_GLIMAGE_SINK_UNLOCK (gl_sink); return; } window = gst_gl_context_get_window (gl_sink->context); window->is_drawing = TRUE; /* opengl scene */ GST_TRACE ("redrawing texture:%u", gl_sink->redisplay_texture); /* make sure that the environnement is clean */ gst_gl_context_clear_shader (gl_sink->context); #if GST_GL_HAVE_OPENGL if (USING_OPENGL (gl_sink->context)) gl->Disable (GL_TEXTURE_2D); #endif gl->BindTexture (GL_TEXTURE_2D, 0); /* check if a client draw callback is registered */ if (gl_sink->clientDrawCallback) { gboolean doRedisplay = gl_sink->clientDrawCallback (gl_sink->redisplay_texture, GST_VIDEO_INFO_WIDTH (&gl_sink->info), GST_VIDEO_INFO_HEIGHT (&gl_sink->info), gl_sink->client_data); if (doRedisplay) gst_gl_window_draw_unlocked (window, GST_VIDEO_INFO_WIDTH (&gl_sink->info), GST_VIDEO_INFO_HEIGHT (&gl_sink->info)); } /* default opengl scene */ else { #if GST_GL_HAVE_OPENGL if (USING_OPENGL (gl_sink->context)) { GLfloat verts[8] = { 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f }; GLfloat texcoords[8] = { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f }; gl->Clear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); gl->MatrixMode (GL_PROJECTION); gl->LoadIdentity (); gl->Enable (GL_TEXTURE_2D); gl->BindTexture (GL_TEXTURE_2D, gl_sink->redisplay_texture); gl->EnableClientState (GL_VERTEX_ARRAY); gl->EnableClientState (GL_TEXTURE_COORD_ARRAY); gl->VertexPointer (2, GL_FLOAT, 0, &verts); 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); gl->Disable (GL_TEXTURE_2D); } #endif #if GST_GL_HAVE_GLES2 if (USING_GLES2 (gl_sink->context)) { const GLfloat vVertices[] = { 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, -1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 1.0f }; GLushort indices[] = { 0, 1, 2, 0, 2, 3 }; gl->Clear (GL_COLOR_BUFFER_BIT); gst_gl_shader_use (gl_sink->redisplay_shader); /* Load the vertex position */ gl->VertexAttribPointer (gl_sink->redisplay_attr_position_loc, 3, GL_FLOAT, GL_FALSE, 5 * sizeof (GLfloat), vVertices); /* Load the texture coordinate */ gl->VertexAttribPointer (gl_sink->redisplay_attr_texture_loc, 2, GL_FLOAT, GL_FALSE, 5 * sizeof (GLfloat), &vVertices[3]); gl->EnableVertexAttribArray (gl_sink->redisplay_attr_position_loc); gl->EnableVertexAttribArray (gl_sink->redisplay_attr_texture_loc); gl->ActiveTexture (GL_TEXTURE0); gl->BindTexture (GL_TEXTURE_2D, gl_sink->redisplay_texture); gst_gl_shader_set_uniform_1i (gl_sink->redisplay_shader, "s_texture", 0); gl->DrawElements (GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices); } #endif } /* end default opengl scene */ window->is_drawing = FALSE; gst_object_unref (window); GST_GLIMAGE_SINK_UNLOCK (gl_sink); }