From bbac18352f4130f8dc92c74d6b8c71602e5dc46b Mon Sep 17 00:00:00 2001 From: Julien Moutte Date: Wed, 19 Nov 2003 20:43:49 +0000 Subject: GstVideoSink subclassing. 90% done. Original commit message from CVS: GstVideoSink subclassing. 90% done. --- sys/ximage/ximagesink.c | 125 ++++++++++++++++++++++------------------------ sys/ximage/ximagesink.h | 11 ++-- sys/xvimage/xvimagesink.c | 114 ++++++++++++++++++++---------------------- sys/xvimage/xvimagesink.h | 11 ++-- 4 files changed, 121 insertions(+), 140 deletions(-) diff --git a/sys/ximage/ximagesink.c b/sys/ximage/ximagesink.c index 94a7a9bff..b3142fa3f 100644 --- a/sys/ximage/ximagesink.c +++ b/sys/ximage/ximagesink.c @@ -48,7 +48,7 @@ GST_PAD_TEMPLATE_FACTORY (gst_ximagesink_sink_template_factory, "height", GST_PROPS_INT_RANGE (0, G_MAXINT)) ) -static GstElementClass *parent_class = NULL; +static GstVideoSinkClass *parent_class = NULL; /* ============================================================= */ /* */ @@ -297,7 +297,6 @@ gst_ximagesink_handle_xevents (GstXImageSink *ximagesink, GstPad *pad) KeyReleaseMask | ButtonPressMask | ButtonReleaseMask, &e)) { - GstEvent *event = NULL; KeySym keysym; /* We lock only for the X function call */ @@ -319,7 +318,7 @@ gst_ximagesink_handle_xevents (GstXImageSink *ximagesink, GstPad *pad) ximagesink->xwindow->width = e.xconfigure.width; ximagesink->xwindow->height = e.xconfigure.height; - r = gst_pad_try_set_caps (ximagesink->sinkpad, + r = gst_pad_try_set_caps (GST_VIDEOSINK_PAD (ximagesink), GST_CAPS_NEW ("ximagesink_ximage_caps", "video/x-raw-rgb", "bpp", GST_PROPS_INT (ximagesink->xcontext->bpp), "depth", GST_PROPS_INT (ximagesink->xcontext->depth), @@ -333,12 +332,12 @@ gst_ximagesink_handle_xevents (GstXImageSink *ximagesink, GstPad *pad) if ( (r == GST_PAD_LINK_OK) || (r == GST_PAD_LINK_DONE) ) { - ximagesink->width = e.xconfigure.width; - ximagesink->height = e.xconfigure.height; + GST_VIDEOSINK_WIDTH (ximagesink) = e.xconfigure.width; + GST_VIDEOSINK_HEIGHT (ximagesink) = e.xconfigure.height; if ( (ximagesink->ximage) && - ( (ximagesink->width != ximagesink->ximage->width) || - (ximagesink->height != ximagesink->ximage->height) ) ) + ( (GST_VIDEOSINK_WIDTH (ximagesink) != ximagesink->ximage->width) || + (GST_VIDEOSINK_HEIGHT (ximagesink) != ximagesink->ximage->height) ) ) { /* We renew our ximage only if size changed */ gst_ximagesink_ximage_destroy (ximagesink, @@ -346,13 +345,13 @@ gst_ximagesink_handle_xevents (GstXImageSink *ximagesink, GstPad *pad) ximagesink->ximage = gst_ximagesink_ximage_new ( ximagesink, - ximagesink->width, - ximagesink->height); + GST_VIDEOSINK_WIDTH (ximagesink), + GST_VIDEOSINK_HEIGHT (ximagesink)); } - gst_x_overlay_got_video_size ( - GST_X_OVERLAY (ximagesink), - ximagesink->width, ximagesink->height); + gst_video_sink_got_video_size (GST_VIDEOSINK (ximagesink), + GST_VIDEOSINK_WIDTH (ximagesink), + GST_VIDEOSINK_HEIGHT (ximagesink)); } } break; @@ -390,9 +389,6 @@ gst_ximagesink_handle_xevents (GstXImageSink *ximagesink, GstPad *pad) default: GST_DEBUG ("ximagesink unhandled X event (%d)", e.type); } - - if (event) - gst_pad_send_event (gst_pad_get_peer (pad), event); g_mutex_lock (ximagesink->x_lock); } @@ -551,9 +547,9 @@ gst_ximagesink_sinkconnect (GstPad *pad, GstCaps *caps) GST_DEBUG ("sinkconnect %s with %s", gst_caps_to_string(caps), gst_caps_to_string(ximagesink->xcontext->caps)); - if (!gst_caps_get_int (caps, "width", &ximagesink->width)) + if (!gst_caps_get_int (caps, "width", &(GST_VIDEOSINK_WIDTH (ximagesink)))) return GST_PAD_LINK_REFUSED; - if (!gst_caps_get_int (caps, "height", &ximagesink->height)) + if (!gst_caps_get_int (caps, "height", &(GST_VIDEOSINK_HEIGHT (ximagesink)))) return GST_PAD_LINK_REFUSED; if (!gst_caps_get_float (caps, "framerate", &ximagesink->framerate)) return GST_PAD_LINK_REFUSED; @@ -571,26 +567,27 @@ gst_ximagesink_sinkconnect (GstPad *pad, GstCaps *caps) /* Creating our window and our image */ if (!ximagesink->xwindow) ximagesink->xwindow = gst_ximagesink_xwindow_new (ximagesink, - ximagesink->width, - ximagesink->height); + GST_VIDEOSINK_WIDTH (ximagesink), + GST_VIDEOSINK_HEIGHT (ximagesink)); if ( (ximagesink->ximage) && - ( (ximagesink->width != ximagesink->ximage->width) || - (ximagesink->height != ximagesink->ximage->height) ) ) + ( (GST_VIDEOSINK_WIDTH (ximagesink) != ximagesink->ximage->width) || + (GST_VIDEOSINK_HEIGHT (ximagesink) != ximagesink->ximage->height) ) ) { /* We renew our ximage only if size changed */ gst_ximagesink_ximage_destroy (ximagesink, ximagesink->ximage); ximagesink->ximage = gst_ximagesink_ximage_new (ximagesink, - ximagesink->width, - ximagesink->height); + GST_VIDEOSINK_WIDTH (ximagesink), + GST_VIDEOSINK_HEIGHT (ximagesink)); } else if (!ximagesink->ximage) /* If no ximage, creating one */ ximagesink->ximage = gst_ximagesink_ximage_new (ximagesink, - ximagesink->width, - ximagesink->height); + GST_VIDEOSINK_WIDTH (ximagesink), + GST_VIDEOSINK_HEIGHT (ximagesink)); - gst_x_overlay_got_video_size (GST_X_OVERLAY (ximagesink), - ximagesink->width, ximagesink->height); + gst_video_sink_got_video_size (GST_VIDEOSINK (ximagesink), + GST_VIDEOSINK_WIDTH (ximagesink), + GST_VIDEOSINK_HEIGHT (ximagesink)); return GST_PAD_LINK_OK; } @@ -662,8 +659,9 @@ gst_ximagesink_chain (GstPad *pad, GstData *_data) GST_DEBUG ("videosink: clock wait: %" G_GUINT64_FORMAT, time); - if (ximagesink->clock) { - GstClockID id = gst_clock_new_single_shot_id (ximagesink->clock, time); + if (GST_VIDEOSINK_CLOCK (ximagesink)) { + GstClockID id; + id = gst_clock_new_single_shot_id (GST_VIDEOSINK_CLOCK (ximagesink), time); gst_element_clock_wait (GST_ELEMENT (ximagesink), id, NULL); gst_clock_id_free (id); } @@ -694,16 +692,6 @@ gst_ximagesink_chain (GstPad *pad, GstData *_data) gst_ximagesink_handle_xevents (ximagesink, pad); } -static void -gst_ximagesink_set_clock (GstElement *element, GstClock *clock) -{ - GstXImageSink *ximagesink; - - ximagesink = GST_XIMAGESINK (element); - - ximagesink->clock = clock; -} - static GstBuffer* gst_ximagesink_buffer_new (GstBufferPool *pool, gint64 location, guint size, gpointer user_data) @@ -729,8 +717,8 @@ gst_ximagesink_buffer_new (GstBufferPool *pool, ximagesink->image_pool = g_slist_delete_link (ximagesink->image_pool, ximagesink->image_pool); - if ( (ximage->width != ximagesink->width) || - (ximage->height != ximagesink->height) ) + if ( (ximage->width != GST_VIDEOSINK_WIDTH (ximagesink)) || + (ximage->height != GST_VIDEOSINK_HEIGHT (ximagesink)) ) { /* This image is unusable. Destroying... */ gst_ximagesink_ximage_destroy (ximagesink, ximage); ximage = NULL; @@ -744,8 +732,8 @@ gst_ximagesink_buffer_new (GstBufferPool *pool, if (!ximage) /* We found no suitable image in the pool. Creating... */ ximage = gst_ximagesink_ximage_new (ximagesink, - ximagesink->width, - ximagesink->height); + GST_VIDEOSINK_WIDTH (ximagesink), + GST_VIDEOSINK_HEIGHT (ximagesink)); if (ximage) { @@ -771,8 +759,8 @@ gst_ximagesink_buffer_free (GstBufferPool *pool, ximage = GST_BUFFER_POOL_PRIVATE (buffer); /* If our geometry changed we can't reuse that image. */ - if ( (ximage->width != ximagesink->width) || - (ximage->height != ximagesink->height) ) + if ( (ximage->width != GST_VIDEOSINK_WIDTH (ximagesink)) || + (ximage->height != GST_VIDEOSINK_HEIGHT (ximagesink)) ) gst_ximagesink_ximage_destroy (ximagesink, ximage); else /* In that case we can reuse the image and add it to our image pool. */ { @@ -842,7 +830,8 @@ gst_ximagesink_interface_init (GstInterfaceClass *klass) } static void -gst_ximagesink_navigation_send_event (GstNavigation *navigation, GstStructure *structure) +gst_ximagesink_navigation_send_event (GstNavigation *navigation, + GstStructure *structure) { GstXImageSink *ximagesink = GST_XIMAGESINK (navigation); GstEvent *event; @@ -858,8 +847,8 @@ gst_ximagesink_navigation_send_event (GstNavigation *navigation, GstStructure *s to match the applied scaling. So here we just add the offset if the image is centered in the window. */ - x_offset = ximagesink->xwindow->width - ximagesink->width; - y_offset = ximagesink->xwindow->height - ximagesink->height; + x_offset = ximagesink->xwindow->width - GST_VIDEOSINK_WIDTH (ximagesink); + y_offset = ximagesink->xwindow->height - GST_VIDEOSINK_HEIGHT (ximagesink); if (gst_structure_get_double (structure, "pointer_x", &x)) { @@ -872,7 +861,7 @@ gst_ximagesink_navigation_send_event (GstNavigation *navigation, GstStructure *s gst_structure_set (structure, "pointer_y", G_TYPE_DOUBLE, y, NULL); } - gst_pad_send_event (gst_pad_get_peer (ximagesink->sinkpad), event); + gst_pad_send_event (gst_pad_get_peer (GST_VIDEOSINK_PAD (ximagesink)), event); } static void @@ -916,7 +905,7 @@ gst_ximagesink_set_xwindow_id (GstXOverlay *overlay, XID xwindow_id) xwindow->internal = FALSE; XSelectInput (ximagesink->xcontext->disp, xwindow->win, ExposureMask | StructureNotifyMask | PointerMotionMask | KeyPressMask | - KeyReleaseMask /*| ButtonPressMask | ButtonReleaseMask*/); + KeyReleaseMask); xwindow->gc = XCreateGC (ximagesink->xcontext->disp, xwindow->win, 0, NULL); @@ -974,23 +963,26 @@ gst_ximagesink_dispose (GObject *object) static void gst_ximagesink_init (GstXImageSink *ximagesink) { - ximagesink->sinkpad = gst_pad_new_from_template (GST_PAD_TEMPLATE_GET ( - gst_ximagesink_sink_template_factory), - "sink"); - gst_element_add_pad (GST_ELEMENT (ximagesink), ximagesink->sinkpad); - - gst_pad_set_chain_function (ximagesink->sinkpad, gst_ximagesink_chain); - gst_pad_set_link_function (ximagesink->sinkpad, gst_ximagesink_sinkconnect); - gst_pad_set_getcaps_function (ximagesink->sinkpad, gst_ximagesink_getcaps); - gst_pad_set_bufferpool_function (ximagesink->sinkpad, + GST_VIDEOSINK_PAD (ximagesink) = gst_pad_new_from_template ( + GST_PAD_TEMPLATE_GET ( + gst_ximagesink_sink_template_factory), + "sink"); + + gst_element_add_pad (GST_ELEMENT (ximagesink), + GST_VIDEOSINK_PAD (ximagesink)); + + gst_pad_set_chain_function (GST_VIDEOSINK_PAD (ximagesink), + gst_ximagesink_chain); + gst_pad_set_link_function (GST_VIDEOSINK_PAD (ximagesink), + gst_ximagesink_sinkconnect); + gst_pad_set_getcaps_function (GST_VIDEOSINK_PAD (ximagesink), + gst_ximagesink_getcaps); + gst_pad_set_bufferpool_function (GST_VIDEOSINK_PAD (ximagesink), gst_ximagesink_get_bufferpool); ximagesink->xcontext = NULL; ximagesink->xwindow = NULL; ximagesink->ximage = NULL; - ximagesink->clock = NULL; - - ximagesink->width = ximagesink->height = 0; ximagesink->framerate = 0; @@ -1025,12 +1017,11 @@ gst_ximagesink_class_init (GstXImageSinkClass *klass) gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; - parent_class = g_type_class_ref (GST_TYPE_ELEMENT); + parent_class = g_type_class_ref (GST_TYPE_VIDEOSINK); gobject_class->dispose = gst_ximagesink_dispose; gstelement_class->change_state = gst_ximagesink_change_state; - gstelement_class->set_clock = gst_ximagesink_set_clock; } /* ============================================================= */ @@ -1079,7 +1070,7 @@ gst_ximagesink_get_type (void) NULL, }; - ximagesink_type = g_type_register_static (GST_TYPE_ELEMENT, + ximagesink_type = g_type_register_static (GST_TYPE_VIDEOSINK, "GstXImageSink", &ximagesink_info, 0); @@ -1097,6 +1088,10 @@ gst_ximagesink_get_type (void) static gboolean plugin_init (GstPlugin *plugin) { + /* Loading the library containing GstVideoSink, our parent object */ + if (!gst_library_load ("gstvideo")) + return FALSE; + if (!gst_element_register (plugin, "ximagesink", GST_RANK_SECONDARY, GST_TYPE_XIMAGESINK)) return FALSE; diff --git a/sys/ximage/ximagesink.h b/sys/ximage/ximagesink.h index 69b372e2f..5013c5fcd 100644 --- a/sys/ximage/ximagesink.h +++ b/sys/ximage/ximagesink.h @@ -20,7 +20,7 @@ #ifndef __GST_XIMAGESINK_H__ #define __GST_XIMAGESINK_H__ -#include +#include /* FIXME : We should have a configure test for shm support */ #define HAVE_XSHM @@ -104,17 +104,12 @@ struct _GstXImage { struct _GstXImageSink { /* Our element stuff */ - GstElement element; + GstVideoSink videosink; - GstPad *sinkpad; - - GstClock *clock; - GstXContext *xcontext; GstXWindow *xwindow; GstXImage *ximage; - gint width, height; gfloat framerate; GMutex *x_lock; @@ -127,7 +122,7 @@ struct _GstXImageSink { }; struct _GstXImageSinkClass { - GstElementClass parent_class; + GstVideoSinkClass parent_class; }; GType gst_ximagesink_get_type(void); diff --git a/sys/xvimage/xvimagesink.c b/sys/xvimage/xvimagesink.c index deb66783f..5691645a3 100644 --- a/sys/xvimage/xvimagesink.c +++ b/sys/xvimage/xvimagesink.c @@ -52,7 +52,7 @@ GST_PAD_TEMPLATE_FACTORY (gst_xvimagesink_sink_template_factory, "height", GST_PROPS_INT_RANGE(0, G_MAXINT)) ) -static GstElementClass *parent_class = NULL; +static GstVideoSinkClass *parent_class = NULL; /* ============================================================= */ /* */ @@ -308,7 +308,6 @@ gst_xvimagesink_handle_xevents (GstXvImageSink *xvimagesink, GstPad *pad) KeyReleaseMask | ButtonPressMask | ButtonReleaseMask, &e)) { - GstEvent *event = NULL; KeySym keysym; /* We lock only for the X function call */ @@ -356,9 +355,6 @@ gst_xvimagesink_handle_xevents (GstXvImageSink *xvimagesink, GstPad *pad) GST_DEBUG ("xvimagesink unhandled X event (%d)", e.type); } - if (event) - gst_pad_send_event (gst_pad_get_peer (pad), event); - g_mutex_lock (xvimagesink->x_lock); } g_mutex_unlock (xvimagesink->x_lock); @@ -620,9 +616,9 @@ gst_xvimagesink_sinkconnect (GstPad *pad, GstCaps *caps) GST_DEBUG ("sinkconnect %s with %s", gst_caps_to_string(caps), gst_caps_to_string(xvimagesink->xcontext->caps)); - if (!gst_caps_get_int (caps, "width", &xvimagesink->width)) + if (!gst_caps_get_int (caps, "width", &(GST_VIDEOSINK_WIDTH (xvimagesink)))) return GST_PAD_LINK_REFUSED; - if (!gst_caps_get_int (caps, "height", &xvimagesink->height)) + if (!gst_caps_get_int (caps, "height", &(GST_VIDEOSINK_HEIGHT (xvimagesink)))) return GST_PAD_LINK_REFUSED; if (!gst_caps_get_float (caps, "framerate", &xvimagesink->framerate)) return GST_PAD_LINK_REFUSED; @@ -643,26 +639,27 @@ gst_xvimagesink_sinkconnect (GstPad *pad, GstCaps *caps) /* Creating our window and our image */ if (!xvimagesink->xwindow) xvimagesink->xwindow = gst_xvimagesink_xwindow_new (xvimagesink, - xvimagesink->width, - xvimagesink->height); + GST_VIDEOSINK_WIDTH (xvimagesink), + GST_VIDEOSINK_HEIGHT (xvimagesink)); if ( (xvimagesink->xvimage) && - ( (xvimagesink->width != xvimagesink->xvimage->width) || - (xvimagesink->height != xvimagesink->xvimage->height) ) ) + ( (GST_VIDEOSINK_WIDTH (xvimagesink) != xvimagesink->xvimage->width) || + (GST_VIDEOSINK_HEIGHT (xvimagesink) != xvimagesink->xvimage->height) ) ) { /* We renew our xvimage only if size changed */ gst_xvimagesink_xvimage_destroy (xvimagesink, xvimagesink->xvimage); xvimagesink->xvimage = gst_xvimagesink_xvimage_new (xvimagesink, - xvimagesink->width, - xvimagesink->height); + GST_VIDEOSINK_WIDTH (xvimagesink), + GST_VIDEOSINK_HEIGHT (xvimagesink)); } else if (!xvimagesink->xvimage) /* If no xvimage, creating one */ xvimagesink->xvimage = gst_xvimagesink_xvimage_new (xvimagesink, - xvimagesink->width, - xvimagesink->height); + GST_VIDEOSINK_WIDTH (xvimagesink), + GST_VIDEOSINK_HEIGHT (xvimagesink)); - gst_x_overlay_got_video_size (GST_X_OVERLAY (xvimagesink), - xvimagesink->width, xvimagesink->height); + gst_video_sink_got_video_size (GST_VIDEOSINK (xvimagesink), + GST_VIDEOSINK_WIDTH (xvimagesink), + GST_VIDEOSINK_HEIGHT (xvimagesink)); return GST_PAD_LINK_OK; } @@ -694,8 +691,8 @@ gst_xvimagesink_change_state (GstElement *element) break; } - if (parent_class->change_state) - return parent_class->change_state (element); + if (GST_ELEMENT_CLASS (parent_class)->change_state) + return GST_ELEMENT_CLASS (parent_class)->change_state (element); return GST_STATE_SUCCESS; } @@ -734,8 +731,9 @@ gst_xvimagesink_chain (GstPad *pad, GstData *_data) GST_DEBUG ("videosink: clock wait: %" G_GUINT64_FORMAT, time); - if (xvimagesink->clock) { - GstClockID id = gst_clock_new_single_shot_id (xvimagesink->clock, time); + if (GST_VIDEOSINK_CLOCK (xvimagesink)) { + GstClockID id; + id = gst_clock_new_single_shot_id (GST_VIDEOSINK_CLOCK (xvimagesink), time); gst_element_clock_wait (GST_ELEMENT (xvimagesink), id, NULL); gst_clock_id_free (id); } @@ -766,16 +764,6 @@ gst_xvimagesink_chain (GstPad *pad, GstData *_data) gst_xvimagesink_handle_xevents (xvimagesink, pad); } -static void -gst_xvimagesink_set_clock (GstElement *element, GstClock *clock) -{ - GstXvImageSink *xvimagesink; - - xvimagesink = GST_XVIMAGESINK (element); - - xvimagesink->clock = clock; -} - static GstBuffer* gst_xvimagesink_buffer_new (GstBufferPool *pool, gint64 location, guint size, gpointer user_data) @@ -801,8 +789,8 @@ gst_xvimagesink_buffer_new (GstBufferPool *pool, xvimagesink->image_pool = g_slist_delete_link (xvimagesink->image_pool, xvimagesink->image_pool); - if ( (xvimage->width != xvimagesink->width) || - (xvimage->height != xvimagesink->height) ) + if ( (xvimage->width != GST_VIDEOSINK_WIDTH (xvimagesink)) || + (xvimage->height != GST_VIDEOSINK_HEIGHT (xvimagesink)) ) { /* This image is unusable. Destroying... */ gst_xvimagesink_xvimage_destroy (xvimagesink, xvimage); xvimage = NULL; @@ -816,8 +804,8 @@ gst_xvimagesink_buffer_new (GstBufferPool *pool, if (!xvimage) /* We found no suitable image in the pool. Creating... */ xvimage = gst_xvimagesink_xvimage_new (xvimagesink, - xvimagesink->width, - xvimagesink->height); + GST_VIDEOSINK_WIDTH (xvimagesink), + GST_VIDEOSINK_HEIGHT (xvimagesink)); if (xvimage) { @@ -843,13 +831,14 @@ gst_xvimagesink_buffer_free (GstBufferPool *pool, xvimage = GST_BUFFER_POOL_PRIVATE (buffer); /* If our geometry changed we can't reuse that image. */ - if ( (xvimage->width != xvimagesink->width) || - (xvimage->height != xvimagesink->height) ) + if ( (xvimage->width != GST_VIDEOSINK_WIDTH (xvimagesink)) || + (xvimage->height != GST_VIDEOSINK_HEIGHT (xvimagesink)) ) gst_xvimagesink_xvimage_destroy (xvimagesink, xvimage); else /* In that case we can reuse the image and add it to our image pool. */ { g_mutex_lock (xvimagesink->pool_lock); - xvimagesink->image_pool = g_slist_prepend (xvimagesink->image_pool, xvimage); + xvimagesink->image_pool = g_slist_prepend (xvimagesink->image_pool, + xvimage); g_mutex_unlock (xvimagesink->pool_lock); } @@ -867,7 +856,7 @@ gst_xvimagesink_imagepool_clear (GstXvImageSink *xvimagesink) { GstXvImage *xvimage = xvimagesink->image_pool->data; xvimagesink->image_pool = g_slist_delete_link (xvimagesink->image_pool, - xvimagesink->image_pool); + xvimagesink->image_pool); gst_xvimagesink_xvimage_destroy (xvimagesink, xvimage); } @@ -914,7 +903,8 @@ gst_xvimagesink_interface_init (GstInterfaceClass *klass) } static void -gst_xvimagesink_navigation_send_event (GstNavigation *navigation, GstStructure *structure) +gst_xvimagesink_navigation_send_event (GstNavigation *navigation, + GstStructure *structure) { GstXvImageSink *xvimagesink = GST_XVIMAGESINK (navigation); GstEvent *event; @@ -926,18 +916,18 @@ gst_xvimagesink_navigation_send_event (GstNavigation *navigation, GstStructure * /* Converting pointer coordinates to the non scaled geometry */ if (gst_structure_get_double (structure, "pointer_x", &x)) { - x *= xvimagesink->width; + x *= GST_VIDEOSINK_WIDTH (xvimagesink); x /= xvimagesink->xwindow->width; gst_structure_set (structure, "pointer_x", G_TYPE_DOUBLE, x, NULL); } if (gst_structure_get_double (structure, "pointer_y", &y)) { - y *= xvimagesink->height; + y *= GST_VIDEOSINK_HEIGHT (xvimagesink); y /= xvimagesink->xwindow->height; gst_structure_set (structure, "pointer_y", G_TYPE_DOUBLE, y, NULL); } - gst_pad_send_event (gst_pad_get_peer (xvimagesink->sinkpad), event); + gst_pad_send_event (gst_pad_get_peer (GST_VIDEOSINK_PAD (xvimagesink)), event); } static void @@ -981,7 +971,7 @@ gst_xvimagesink_set_xwindow_id (GstXOverlay *overlay, XID xwindow_id) xwindow->internal = FALSE; XSelectInput (xvimagesink->xcontext->disp, xwindow->win, ExposureMask | StructureNotifyMask | PointerMotionMask | KeyPressMask | - KeyReleaseMask /*| ButtonPressMask | ButtonReleaseMask*/); + KeyReleaseMask); xwindow->gc = XCreateGC (xvimagesink->xcontext->disp, xwindow->win, 0, NULL); @@ -1039,23 +1029,26 @@ gst_xvimagesink_dispose (GObject *object) static void gst_xvimagesink_init (GstXvImageSink *xvimagesink) { - xvimagesink->sinkpad = gst_pad_new_from_template (GST_PAD_TEMPLATE_GET ( - gst_xvimagesink_sink_template_factory), - "sink"); - gst_element_add_pad (GST_ELEMENT (xvimagesink), xvimagesink->sinkpad); - - gst_pad_set_chain_function (xvimagesink->sinkpad, gst_xvimagesink_chain); - gst_pad_set_link_function (xvimagesink->sinkpad, gst_xvimagesink_sinkconnect); - gst_pad_set_getcaps_function (xvimagesink->sinkpad, gst_xvimagesink_getcaps); - gst_pad_set_bufferpool_function (xvimagesink->sinkpad, + GST_VIDEOSINK_PAD (xvimagesink) = gst_pad_new_from_template ( + GST_PAD_TEMPLATE_GET ( + gst_xvimagesink_sink_template_factory), + "sink"); + + gst_element_add_pad (GST_ELEMENT (xvimagesink), + GST_VIDEOSINK_PAD (xvimagesink)); + + gst_pad_set_chain_function (GST_VIDEOSINK_PAD (xvimagesink), + gst_xvimagesink_chain); + gst_pad_set_link_function (GST_VIDEOSINK_PAD (xvimagesink), + gst_xvimagesink_sinkconnect); + gst_pad_set_getcaps_function (GST_VIDEOSINK_PAD (xvimagesink), + gst_xvimagesink_getcaps); + gst_pad_set_bufferpool_function (GST_VIDEOSINK_PAD (xvimagesink), gst_xvimagesink_get_bufferpool); xvimagesink->xcontext = NULL; xvimagesink->xwindow = NULL; xvimagesink->xvimage = NULL; - xvimagesink->clock = NULL; - - xvimagesink->width = xvimagesink->height = 0; xvimagesink->framerate = 0; @@ -1090,12 +1083,11 @@ gst_xvimagesink_class_init (GstXvImageSinkClass *klass) gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; - parent_class = g_type_class_ref (GST_TYPE_ELEMENT); + parent_class = g_type_class_ref (GST_TYPE_VIDEOSINK); gobject_class->dispose = gst_xvimagesink_dispose; gstelement_class->change_state = gst_xvimagesink_change_state; - gstelement_class->set_clock = gst_xvimagesink_set_clock; } /* ============================================================= */ @@ -1144,7 +1136,7 @@ gst_xvimagesink_get_type (void) NULL, }; - xvimagesink_type = g_type_register_static (GST_TYPE_ELEMENT, + xvimagesink_type = g_type_register_static (GST_TYPE_VIDEOSINK, "GstXvImageSink", &xvimagesink_info, 0); @@ -1162,6 +1154,10 @@ gst_xvimagesink_get_type (void) static gboolean plugin_init (GstPlugin *plugin) { + /* Loading the library containing GstVideoSink, our parent object */ + if (!gst_library_load ("gstvideo")) + return FALSE; + if (!gst_element_register (plugin, "xvimagesink", GST_RANK_PRIMARY, GST_TYPE_XVIMAGESINK)) return FALSE; diff --git a/sys/xvimage/xvimagesink.h b/sys/xvimage/xvimagesink.h index 070f269a7..7adc850d6 100644 --- a/sys/xvimage/xvimagesink.h +++ b/sys/xvimage/xvimagesink.h @@ -20,7 +20,7 @@ #ifndef __GST_XVIMAGESINK_H__ #define __GST_XVIMAGESINK_H__ -#include +#include /* FIXME : We should have a configure test for shm support */ #define HAVE_XSHM @@ -112,17 +112,12 @@ struct _GstXvImage { struct _GstXvImageSink { /* Our element stuff */ - GstElement element; + GstVideoSink videosink; - GstPad *sinkpad; - - GstClock *clock; - GstXContext *xcontext; GstXWindow *xwindow; GstXvImage *xvimage; - gint width, height; gfloat framerate; GMutex *x_lock; @@ -135,7 +130,7 @@ struct _GstXvImageSink { }; struct _GstXvImageSinkClass { - GstElementClass parent_class; + GstVideoSinkClass parent_class; }; GType gst_xvimagesink_get_type(void); -- cgit v1.2.3