gst-libs/gst/xoverlay/xoverlay.*: Adding the _expose method to tell an overlay to...
authorJulien Moutte <julien@moutte.net>
Tue, 3 Feb 2004 23:05:46 +0000 (23:05 +0000)
committerJulien Moutte <julien@moutte.net>
Tue, 3 Feb 2004 23:05:46 +0000 (23:05 +0000)
Original commit message from CVS:
2004-02-04  Julien MOUTTE  <julien@moutte.net>

* gst-libs/gst/xoverlay/xoverlay.c: (gst_x_overlay_expose):
* gst-libs/gst/xoverlay/xoverlay.h: Adding the _expose method to tell
an overlay to redraw the image because it has been exposed.
* sys/ximage/ximagesink.c: (gst_ximagesink_ximage_destroy),
(gst_ximagesink_ximage_put), (gst_ximagesink_expose),
(gst_ximagesink_xoverlay_init), (gst_ximagesink_init):
* sys/ximage/ximagesink.h: Implement expose method from XOverlay
interface
* sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_destroy),
(gst_xvimagesink_xvimage_put), (gst_xvimagesink_expose),
(gst_xvimagesink_xoverlay_init), (gst_xvimagesink_init):
* sys/xvimage/xvimagesink.h: Implement expose method from XOverlay
interface

ChangeLog
gst-libs/gst/interfaces/xoverlay.c
gst-libs/gst/interfaces/xoverlay.h
gst-libs/gst/xoverlay/xoverlay.c
gst-libs/gst/xoverlay/xoverlay.h
sys/ximage/ximagesink.c
sys/ximage/ximagesink.h
sys/xvimage/xvimagesink.c
sys/xvimage/xvimagesink.h

index e8c5eb94826420ac0a26412b9fd0527accc894e6..0d81d3b18948a0de323f740f6554666776597799 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+2004-02-04  Julien MOUTTE  <julien@moutte.net>
+
+       * gst-libs/gst/xoverlay/xoverlay.c: (gst_x_overlay_expose):
+       * gst-libs/gst/xoverlay/xoverlay.h: Adding the _expose method to tell
+       an overlay to redraw the image because it has been exposed.
+       * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_destroy),
+       (gst_ximagesink_ximage_put), (gst_ximagesink_expose),
+       (gst_ximagesink_xoverlay_init), (gst_ximagesink_init):
+       * sys/ximage/ximagesink.h: Implement expose method from XOverlay
+       interface
+       * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_destroy),
+       (gst_xvimagesink_xvimage_put), (gst_xvimagesink_expose),
+       (gst_xvimagesink_xoverlay_init), (gst_xvimagesink_init):
+       * sys/xvimage/xvimagesink.h: Implement expose method from XOverlay
+       interface 
+
 2004-02-03  Benjamin Otte  <in7y118@public.uni-hamburg.de>
 
        * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_type_find):
index 2efe296660f24194f65104d5d3d4262501ba9176..73004f68aaa26493ad7327007c8a564ccd949fc6 100644 (file)
@@ -183,3 +183,20 @@ gst_x_overlay_got_desired_size (GstXOverlay *overlay, guint width, guint height)
   g_signal_emit (G_OBJECT (overlay),
                  gst_x_overlay_signals[DESIRED_SIZE], 0, width, height);
 }
+
+/**
+ * gst_x_overlay_expose:
+ * @overlay: a #GstXOverlay to expose.
+ *
+ * Tell an overlay that it has been exposed. This will redraw the current frame
+ * in the drawable even if the pipeline is PAUSED.
+ */
+void
+gst_x_overlay_expose (GstXOverlay *overlay)
+{
+  GstXOverlayClass *klass = GST_X_OVERLAY_GET_CLASS (overlay);
+
+  if (klass->expose) {
+    klass->expose (overlay);
+  }
+}
index 4c68487050c0570846e82ddabd19ef5d4b868edf..d92dc5ff038e78d1eabf9c208b35b42dfc4aee66 100644 (file)
@@ -54,6 +54,7 @@ typedef struct _GstXOverlayClass {
   void (* get_desired_size) (GstXOverlay *overlay,
                             guint *width,
                             guint *height);
+  void (* expose) (GstXOverlay *overlay);
   
   /* signals */
   void (*have_xwindow_id) (GstXOverlay *overlay,
@@ -70,6 +71,7 @@ GType gst_x_overlay_get_type          (void);
 /* virtual class function wrappers */
 void gst_x_overlay_set_xwindow_id (GstXOverlay *overlay, XID xwindow_id);
 void gst_x_overlay_get_desired_size (GstXOverlay *overlay, guint *width, guint *height);
+void gst_x_overlay_expose (GstXOverlay *overlay);
 
 /* public methods to fire signals */
 void gst_x_overlay_got_xwindow_id (GstXOverlay *overlay, XID xwindow_id);
index 2efe296660f24194f65104d5d3d4262501ba9176..73004f68aaa26493ad7327007c8a564ccd949fc6 100644 (file)
@@ -183,3 +183,20 @@ gst_x_overlay_got_desired_size (GstXOverlay *overlay, guint width, guint height)
   g_signal_emit (G_OBJECT (overlay),
                  gst_x_overlay_signals[DESIRED_SIZE], 0, width, height);
 }
+
+/**
+ * gst_x_overlay_expose:
+ * @overlay: a #GstXOverlay to expose.
+ *
+ * Tell an overlay that it has been exposed. This will redraw the current frame
+ * in the drawable even if the pipeline is PAUSED.
+ */
+void
+gst_x_overlay_expose (GstXOverlay *overlay)
+{
+  GstXOverlayClass *klass = GST_X_OVERLAY_GET_CLASS (overlay);
+
+  if (klass->expose) {
+    klass->expose (overlay);
+  }
+}
index 4c68487050c0570846e82ddabd19ef5d4b868edf..d92dc5ff038e78d1eabf9c208b35b42dfc4aee66 100644 (file)
@@ -54,6 +54,7 @@ typedef struct _GstXOverlayClass {
   void (* get_desired_size) (GstXOverlay *overlay,
                             guint *width,
                             guint *height);
+  void (* expose) (GstXOverlay *overlay);
   
   /* signals */
   void (*have_xwindow_id) (GstXOverlay *overlay,
@@ -70,6 +71,7 @@ GType gst_x_overlay_get_type          (void);
 /* virtual class function wrappers */
 void gst_x_overlay_set_xwindow_id (GstXOverlay *overlay, XID xwindow_id);
 void gst_x_overlay_get_desired_size (GstXOverlay *overlay, guint *width, guint *height);
+void gst_x_overlay_expose (GstXOverlay *overlay);
 
 /* public methods to fire signals */
 void gst_x_overlay_got_xwindow_id (GstXOverlay *overlay, XID xwindow_id);
index 8e5d3919262f5f9aec5da0cadd5c14867f1f2fd5..0d47b7b648de488fb690969e51859177e1abcf26 100644 (file)
@@ -221,6 +221,10 @@ gst_ximagesink_ximage_destroy (GstXImageSink *ximagesink, GstXImage *ximage)
   g_return_if_fail (ximagesink != NULL);
   g_return_if_fail (GST_IS_XIMAGESINK (ximagesink));
   
+  /* If the destroyed image is the current one we destroy our reference too */
+  if (ximagesink->cur_image == ximage)
+    ximagesink->cur_image = NULL;
+  
   g_mutex_lock (ximagesink->x_lock);
   
 #ifdef HAVE_XSHM
@@ -262,6 +266,10 @@ gst_ximagesink_ximage_put (GstXImageSink *ximagesink, GstXImage *ximage)
   g_return_if_fail (ximagesink != NULL);
   g_return_if_fail (GST_IS_XIMAGESINK (ximagesink));
   
+  /* Store a reference to the last image we put */
+  if (ximagesink->cur_image != ximage)
+    ximagesink->cur_image = ximage;
+  
   /* We center the image in the window */
   x = MAX (0, (ximagesink->xwindow->width - ximage->width) / 2);
   y = MAX (0, (ximagesink->xwindow->height- ximage->height) / 2);
@@ -1209,11 +1217,21 @@ gst_ximagesink_get_desired_size (GstXOverlay *overlay,
   *height = GST_VIDEOSINK_HEIGHT (ximagesink);
 }
 
+static void
+gst_ximagesink_expose (GstXOverlay *overlay)
+{
+  GstXImageSink *ximagesink = GST_XIMAGESINK (overlay);
+  
+  if (ximagesink->cur_image)
+    gst_ximagesink_ximage_put (ximagesink, ximagesink->cur_image);
+}
+
 static void
 gst_ximagesink_xoverlay_init (GstXOverlayClass *iface)
 {
   iface->set_xwindow_id = gst_ximagesink_set_xwindow_id;
   iface->get_desired_size = gst_ximagesink_get_desired_size;
+  iface->expose = gst_ximagesink_expose;
 }
 
 /* =========================================== */
@@ -1318,6 +1336,7 @@ gst_ximagesink_init (GstXImageSink *ximagesink)
   ximagesink->xcontext = NULL;
   ximagesink->xwindow = NULL;
   ximagesink->ximage = NULL;
+  ximagesink->cur_image = NULL;
   
   ximagesink->framerate = 0;
   
index fba3360f6b9a6ee39a6a0e7bc6d62352536901fe..b30de8e9a279d3623efac223de54a271347e5e79 100644 (file)
@@ -111,6 +111,7 @@ struct _GstXImageSink {
   GstXContext *xcontext;
   GstXWindow *xwindow;
   GstXImage *ximage;
+  GstXImage *cur_image;
   
   gdouble framerate;
   GMutex *x_lock;
index 19d817d5dd3e1ac0b88d929606cdc1788d820f98..1c5e5b596ce12a9b39e04a7ef48e0eb5be063665 100644 (file)
@@ -233,6 +233,10 @@ gst_xvimagesink_xvimage_destroy (GstXvImageSink *xvimagesink,
   g_return_if_fail (xvimagesink != NULL);
   g_return_if_fail (GST_IS_XVIMAGESINK (xvimagesink));
   
+  /* If the destroyed image is the current one we destroy our reference too */
+  if (xvimagesink->cur_image == xvimage)
+    xvimagesink->cur_image = NULL;
+  
   g_mutex_lock (xvimagesink->x_lock);
   
 #ifdef HAVE_XSHM
@@ -272,6 +276,10 @@ gst_xvimagesink_xvimage_put (GstXvImageSink *xvimagesink, GstXvImage *xvimage)
   g_return_if_fail (xvimagesink != NULL);
   g_return_if_fail (GST_IS_XVIMAGESINK (xvimagesink));
   
+  /* Store a reference to the last image we put */
+  if (xvimagesink->cur_image != xvimage)
+    xvimagesink->cur_image = xvimage;
+  
   g_mutex_lock (xvimagesink->x_lock);
   
   /* We scale to the window's geometry */
@@ -1467,11 +1475,22 @@ gst_xvimagesink_get_desired_size (GstXOverlay *overlay,
   *height = GST_VIDEOSINK_HEIGHT (xvimagesink);
 }
 
+static void
+gst_xvimagesink_expose (GstXOverlay *overlay)
+{
+  GstXvImageSink *xvimagesink = GST_XVIMAGESINK (overlay);
+  
+  if (xvimagesink->cur_image) {
+    gst_xvimagesink_xvimage_put (xvimagesink, xvimagesink->cur_image);
+  }
+}
+
 static void
 gst_xvimagesink_xoverlay_init (GstXOverlayClass *iface)
 {
   iface->set_xwindow_id = gst_xvimagesink_set_xwindow_id;
   iface->get_desired_size = gst_xvimagesink_get_desired_size;
+  iface->expose = gst_xvimagesink_expose;
 }
 
 static const GList *
@@ -1712,6 +1731,7 @@ gst_xvimagesink_init (GstXvImageSink *xvimagesink)
   xvimagesink->xcontext = NULL;
   xvimagesink->xwindow = NULL;
   xvimagesink->xvimage = NULL;
+  xvimagesink->cur_image = NULL;
   
   xvimagesink->hue = xvimagesink->saturation = 0;
   xvimagesink->contrast = xvimagesink->brightness = 0;
index 5329ead01735e634ea779e670d73d9e1f31fe212..2645bf7224f1abf8a5caa18e8f924d1b422165ae 100644 (file)
@@ -127,6 +127,7 @@ struct _GstXvImageSink {
   GstXContext *xcontext;
   GstXWindow *xwindow;
   GstXvImage *xvimage;
+  GstXvImage *cur_image;
   
   gdouble framerate;