summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulien Moutte <julien@moutte.net>2003-11-19 20:43:49 +0000
committerJulien Moutte <julien@moutte.net>2003-11-19 20:43:49 +0000
commitbbac18352f4130f8dc92c74d6b8c71602e5dc46b (patch)
tree33f22479cdc4860a4196a65b58ca0076a9bf2174
parent280c25766a76d6f1b353567eb52b03565104b242 (diff)
GstVideoSink subclassing. 90% done.
Original commit message from CVS: GstVideoSink subclassing. 90% done.
-rw-r--r--sys/ximage/ximagesink.c125
-rw-r--r--sys/ximage/ximagesink.h11
-rw-r--r--sys/xvimage/xvimagesink.c114
-rw-r--r--sys/xvimage/xvimagesink.h11
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 <gst/gst.h>
+#include <gst/video/gstvideosink.h>
/* 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 <gst/gst.h>
+#include <gst/video/gstvideosink.h>
/* 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);