sys/ximage/ximagesink.c: Rework the way software video scaling works. So now we check on each chain call if the video...

Original commit message from CVS:
2004-02-18  Julien MOUTTE  <julien@moutte.net>

* sys/ximage/ximagesink.c:
(gst_ximagesink_xwindow_update_geometry),
(gst_ximagesink_renegotiate_size), (gst_ximagesink_handle_xevents),
(gst_ximagesink_change_state), (gst_ximagesink_expose),
(gst_ximagesink_init): Rework the way software video scaling works. So
now we check on each chain call if the video frames are feeling the
window. If not we try to renegotiate caps. On failure we memorize that
and we won't try again for that PLAYING sessions.
* sys/ximage/ximagesink.h: Adding a boolean to store the caps renego
failure.
* sys/xvimage/xvimagesink.c: (gst_xvimagesink_init): initialize the
synchronous flag.
This commit is contained in:
Julien Moutte 2004-02-18 21:16:50 +00:00
parent 38471bcd13
commit c773027855
4 changed files with 54 additions and 49 deletions

View file

@ -1,3 +1,18 @@
2004-02-18 Julien MOUTTE <julien@moutte.net>
* sys/ximage/ximagesink.c:
(gst_ximagesink_xwindow_update_geometry),
(gst_ximagesink_renegotiate_size), (gst_ximagesink_handle_xevents),
(gst_ximagesink_change_state), (gst_ximagesink_expose),
(gst_ximagesink_init): Rework the way software video scaling works. So
now we check on each chain call if the video frames are feeling the
window. If not we try to renegotiate caps. On failure we memorize that
and we won't try again for that PLAYING sessions.
* sys/ximage/ximagesink.h: Adding a boolean to store the caps renego
failure.
* sys/xvimage/xvimagesink.c: (gst_xvimagesink_init): initialize the
synchronous flag.
2004-02-18 Thomas Vander Stichele <thomas at apestaart dot org>
* gst-libs/gst/play/play.c: (gst_play_pipeline_setup):

View file

@ -399,6 +399,25 @@ gst_ximagesink_xwindow_clear (GstXImageSink *ximagesink, GstXWindow *xwindow)
g_mutex_unlock (ximagesink->x_lock);
}
static void
gst_ximagesink_xwindow_update_geometry (GstXImageSink *ximagesink,
GstXWindow *xwindow)
{
XWindowAttributes attr;
g_return_if_fail (xwindow != NULL);
g_return_if_fail (GST_IS_XIMAGESINK (ximagesink));
/* Update the window geometry */
g_mutex_lock (ximagesink->x_lock);
XGetWindowAttributes (ximagesink->xcontext->disp,
ximagesink->xwindow->win, &attr);
g_mutex_unlock (ximagesink->x_lock);
ximagesink->xwindow->width = attr.width;
ximagesink->xwindow->height = attr.height;
}
static void
gst_ximagesink_renegotiate_size (GstXImageSink *ximagesink)
{
@ -407,6 +426,11 @@ gst_ximagesink_renegotiate_size (GstXImageSink *ximagesink)
if (!ximagesink->xwindow)
return;
gst_ximagesink_xwindow_update_geometry (ximagesink, ximagesink->xwindow);
if (ximagesink->sw_scaling_failed)
return;
if (ximagesink->xwindow->width <= 1 || ximagesink->xwindow->height <= 1)
return;
@ -454,6 +478,10 @@ gst_ximagesink_renegotiate_size (GstXImageSink *ximagesink)
GST_VIDEOSINK_HEIGHT (ximagesink));
}
}
else
{
ximagesink->sw_scaling_failed = TRUE;
}
}
}
@ -466,46 +494,11 @@ gst_ximagesink_handle_xevents (GstXImageSink *ximagesink, GstPad *pad)
{
XEvent e;
guint pointer_x = 0, pointer_y = 0;
gboolean pointer_moved = FALSE, window_configured = FALSE;
gboolean pointer_moved = FALSE;
g_return_if_fail (GST_IS_XIMAGESINK (ximagesink));
/* First we get all structure modification events. Only the last one is
interesting */
g_mutex_lock (ximagesink->x_lock);
while (XCheckWindowEvent (ximagesink->xcontext->disp,
ximagesink->xwindow->win,
StructureNotifyMask, &e))
{
g_mutex_unlock (ximagesink->x_lock);
switch (e.type)
{
case ConfigureNotify:
/* We ignore configure events from external window. Renegotiation
will only happen if the application tell us to do so through
gst_x_overlay_expose */
if (ximagesink->xwindow->internal)
{
ximagesink->xwindow->width = e.xconfigure.width;
ximagesink->xwindow->height = e.xconfigure.height;
window_configured = TRUE;
}
break;
default:
break;
}
g_mutex_lock (ximagesink->x_lock);
}
g_mutex_unlock (ximagesink->x_lock);
if (window_configured)
{
GST_DEBUG ("ximagesink window geometry is : %d,%d",
ximagesink->xwindow->width, ximagesink->xwindow->height);
gst_ximagesink_renegotiate_size (ximagesink);
}
gst_ximagesink_renegotiate_size (ximagesink);
/* Then we get all pointer motion events, only the last position is
interesting. */
@ -881,6 +874,7 @@ gst_ximagesink_change_state (GstElement *element)
break;
case GST_STATE_PAUSED_TO_READY:
ximagesink->framerate = 0;
ximagesink->sw_scaling_failed = FALSE;
GST_VIDEOSINK_WIDTH (ximagesink) = 0;
GST_VIDEOSINK_HEIGHT (ximagesink) = 0;
break;
@ -1249,28 +1243,18 @@ gst_ximagesink_get_desired_size (GstXOverlay *overlay,
static void
gst_ximagesink_expose (GstXOverlay *overlay)
{
XWindowAttributes attr;
GstXImageSink *ximagesink = GST_XIMAGESINK (overlay);
if (!ximagesink->xwindow)
return;
gst_ximagesink_xwindow_update_geometry (ximagesink, ximagesink->xwindow);
/* We don't act on internal window from outside that could cause some thread
race with the video sink own thread checking for configure event */
if (ximagesink->xwindow->internal)
return;
/* Update the window geometry */
g_mutex_lock (ximagesink->x_lock);
XGetWindowAttributes (ximagesink->xcontext->disp,
ximagesink->xwindow->win, &attr);
g_mutex_unlock (ximagesink->x_lock);
ximagesink->xwindow->width = attr.width;
ximagesink->xwindow->height = attr.height;
gst_ximagesink_renegotiate_size (ximagesink);
gst_ximagesink_xwindow_clear (ximagesink, ximagesink->xwindow);
if (ximagesink->cur_image)
@ -1398,6 +1382,9 @@ gst_ximagesink_init (GstXImageSink *ximagesink)
ximagesink->image_pool = NULL;
ximagesink->pool_lock = g_mutex_new ();
ximagesink->sw_scaling_failed = FALSE;
ximagesink->synchronous = FALSE;
GST_FLAG_SET(ximagesink, GST_ELEMENT_THREAD_SUGGESTED);
GST_FLAG_SET(ximagesink, GST_ELEMENT_EVENT_AWARE);
}

View file

@ -125,6 +125,7 @@ struct _GstXImageSink {
GSList *image_pool;
gboolean synchronous;
gboolean sw_scaling_failed;
};
struct _GstXImageSinkClass {

View file

@ -1766,6 +1766,8 @@ gst_xvimagesink_init (GstXvImageSink *xvimagesink)
xvimagesink->image_pool = NULL;
xvimagesink->pool_lock = g_mutex_new ();
xvimagesink->synchronous = FALSE;
GST_FLAG_SET(xvimagesink, GST_ELEMENT_THREAD_SUGGESTED);
GST_FLAG_SET(xvimagesink, GST_ELEMENT_EVENT_AWARE);
}