mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-25 18:14:15 +00:00
gst-libs/gst/xoverlay/xoverlay.*: Adding the _expose method to tell an overlay to redraw the image because it has bee...
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
This commit is contained in:
parent
bc966f3c48
commit
d1f51a2773
9 changed files with 95 additions and 0 deletions
16
ChangeLog
16
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):
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -111,6 +111,7 @@ struct _GstXImageSink {
|
|||
GstXContext *xcontext;
|
||||
GstXWindow *xwindow;
|
||||
GstXImage *ximage;
|
||||
GstXImage *cur_image;
|
||||
|
||||
gdouble framerate;
|
||||
GMutex *x_lock;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -127,6 +127,7 @@ struct _GstXvImageSink {
|
|||
GstXContext *xcontext;
|
||||
GstXWindow *xwindow;
|
||||
GstXvImage *xvimage;
|
||||
GstXvImage *cur_image;
|
||||
|
||||
gdouble framerate;
|
||||
|
||||
|
|
Loading…
Reference in a new issue