summaryrefslogtreecommitdiffstats
path: root/ext/sdl
diff options
context:
space:
mode:
Diffstat (limited to 'ext/sdl')
-rw-r--r--ext/sdl/sdlvideosink.c67
1 files changed, 44 insertions, 23 deletions
diff --git a/ext/sdl/sdlvideosink.c b/ext/sdl/sdlvideosink.c
index 0d8c719c..b765215e 100644
--- a/ext/sdl/sdlvideosink.c
+++ b/ext/sdl/sdlvideosink.c
@@ -279,7 +279,6 @@ gst_sdlvideosink_init (GstSDLVideoSink * sdlvideosink)
#endif
GST_FLAG_SET (sdlvideosink, GST_ELEMENT_THREAD_SUGGESTED);
- GST_FLAG_SET (sdlvideosink, GST_ELEMENT_EVENT_AWARE);
}
static void
@@ -390,10 +389,14 @@ gst_sdlvideosink_unlock (GstSDLVideoSink * sdlvideosink)
static void
gst_sdlvideosink_deinitsdl (GstSDLVideoSink * sdlvideosink)
{
+ g_mutex_lock (sdlvideosink->lock);
+
if (sdlvideosink->init) {
SDL_Quit ();
sdlvideosink->init = FALSE;
}
+
+ g_mutex_unlock (sdlvideosink->lock);
}
static gboolean
@@ -401,6 +404,8 @@ gst_sdlvideosink_initsdl (GstSDLVideoSink * sdlvideosink)
{
gst_sdlvideosink_deinitsdl (sdlvideosink);
+ g_mutex_lock (sdlvideosink->lock);
+
if (!sdlvideosink->xwindow_id) {
unsetenv ("SDL_WINDOWID");
} else {
@@ -414,15 +419,22 @@ gst_sdlvideosink_initsdl (GstSDLVideoSink * sdlvideosink)
if (SDL_Init (SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE) < 0) {
GST_ELEMENT_ERROR (sdlvideosink, LIBRARY, INIT, (NULL),
("Couldn't initialize SDL: %s", SDL_GetError ()));
+ g_mutex_unlock (sdlvideosink->lock);
return FALSE;
}
+ sdlvideosink->init = TRUE;
+
+ g_mutex_unlock (sdlvideosink->lock);
+
return TRUE;
}
static void
gst_sdlvideosink_destroy (GstSDLVideoSink * sdlvideosink)
{
+ g_mutex_lock (sdlvideosink->lock);
+
if (sdlvideosink->overlay) {
SDL_FreeYUVOverlay (sdlvideosink->overlay);
sdlvideosink->overlay = NULL;
@@ -432,6 +444,8 @@ gst_sdlvideosink_destroy (GstSDLVideoSink * sdlvideosink)
SDL_FreeSurface (sdlvideosink->screen);
sdlvideosink->screen = NULL;
}
+
+ g_mutex_unlock (sdlvideosink->lock);
}
static gboolean
@@ -444,6 +458,8 @@ gst_sdlvideosink_create (GstSDLVideoSink * sdlvideosink)
gst_sdlvideosink_destroy (sdlvideosink);
+ g_mutex_lock (sdlvideosink->lock);
+
/* create a SDL window of the size requested by the user */
sdlvideosink->screen = SDL_SetVideoMode (GST_VIDEOSINK_WIDTH (sdlvideosink),
GST_VIDEOSINK_HEIGHT (sdlvideosink), 0, SDL_HWSURFACE | SDL_RESIZABLE);
@@ -451,6 +467,7 @@ gst_sdlvideosink_create (GstSDLVideoSink * sdlvideosink)
GST_ELEMENT_ERROR (sdlvideosink, LIBRARY, TOO_LAZY, (NULL),
("SDL: Couldn't set %dx%d: %s", GST_VIDEOSINK_WIDTH (sdlvideosink),
GST_VIDEOSINK_HEIGHT (sdlvideosink), SDL_GetError ()));
+ g_mutex_unlock (sdlvideosink->lock);
return FALSE;
}
@@ -462,6 +479,7 @@ gst_sdlvideosink_create (GstSDLVideoSink * sdlvideosink)
("SDL: Couldn't create SDL YUV overlay (%dx%d \'" GST_FOURCC_FORMAT
"\'): %s", sdlvideosink->width, sdlvideosink->height,
GST_FOURCC_ARGS (sdlvideosink->format), SDL_GetError ()));
+ g_mutex_unlock (sdlvideosink->lock);
return FALSE;
} else {
GST_DEBUG ("Using a %dx%d %dbpp SDL screen with a %dx%d \'"
@@ -476,13 +494,13 @@ gst_sdlvideosink_create (GstSDLVideoSink * sdlvideosink)
sdlvideosink->rect.w = GST_VIDEOSINK_WIDTH (sdlvideosink);
sdlvideosink->rect.h = GST_VIDEOSINK_HEIGHT (sdlvideosink);
- SDL_DisplayYUVOverlay (sdlvideosink->overlay, &(sdlvideosink->rect));
+ /*SDL_DisplayYUVOverlay (sdlvideosink->overlay, &(sdlvideosink->rect)); */
GST_DEBUG ("sdlvideosink: setting %08x (" GST_FOURCC_FORMAT ")",
sdlvideosink->format, GST_FOURCC_ARGS (sdlvideosink->format));
- gst_x_overlay_got_desired_size (GST_X_OVERLAY (sdlvideosink),
- GST_VIDEOSINK_WIDTH (sdlvideosink), GST_VIDEOSINK_HEIGHT (sdlvideosink));
+ g_mutex_unlock (sdlvideosink->lock);
+
return TRUE;
}
@@ -532,6 +550,9 @@ gst_sdlvideosink_sinkconnect (GstPad * pad, const GstCaps * vscapslist)
if (!sdlvideosink->format || !gst_sdlvideosink_create (sdlvideosink))
return GST_PAD_LINK_REFUSED;
+ gst_x_overlay_got_desired_size (GST_X_OVERLAY (sdlvideosink),
+ sdlvideosink->width, sdlvideosink->height);
+
return GST_PAD_LINK_OK;
}
@@ -539,40 +560,38 @@ gst_sdlvideosink_sinkconnect (GstPad * pad, const GstCaps * vscapslist)
static void
gst_sdlvideosink_chain (GstPad * pad, GstData * _data)
{
- GstBuffer *buf = GST_BUFFER (_data);
+ GstBuffer *buf;
GstSDLVideoSink *sdlvideosink;
SDL_Event sdl_event;
g_return_if_fail (pad != NULL);
g_return_if_fail (GST_IS_PAD (pad));
- g_return_if_fail (buf != NULL);
+ g_return_if_fail (_data != NULL);
- sdlvideosink = GST_SDLVIDEOSINK (gst_pad_get_parent (pad));
-
- if (GST_IS_EVENT (buf)) {
- GstEvent *event = GST_EVENT (buf);
- gint64 offset;
-
- switch (GST_EVENT_TYPE (event)) {
- case GST_EVENT_DISCONTINUOUS:
- offset = GST_EVENT_DISCONT_OFFSET (event, 0).value;
- /*gst_clock_handle_discont (sdlvideosink->clock,
- (guint64) GST_EVENT_DISCONT_OFFSET (event, 0).value); */
- break;
- default:
- gst_pad_event_default (pad, event);
- return;
- }
- gst_event_unref (event);
+ if (GST_IS_EVENT (_data)) {
+ gst_pad_event_default (pad, GST_EVENT (_data));
return;
}
+ buf = GST_BUFFER (_data);
+ sdlvideosink = GST_SDLVIDEOSINK (gst_pad_get_parent (pad));
+
if (GST_VIDEOSINK_CLOCK (sdlvideosink) && GST_BUFFER_TIMESTAMP_IS_VALID (buf)) {
gst_element_wait (GST_ELEMENT (sdlvideosink), GST_BUFFER_TIMESTAMP (buf));
}
+ g_mutex_lock (sdlvideosink->lock);
+ if (!sdlvideosink->init ||
+ !sdlvideosink->overlay || !sdlvideosink->overlay->pixels) {
+ g_warning ("Not init!");
+ gst_buffer_unref (buf);
+ g_mutex_unlock (sdlvideosink->lock);
+ return;
+ }
+
if (GST_BUFFER_DATA (buf) != sdlvideosink->overlay->pixels[0]) {
if (!gst_sdlvideosink_lock (sdlvideosink)) {
+ g_mutex_unlock (sdlvideosink->lock);
return;
}
@@ -611,6 +630,8 @@ gst_sdlvideosink_chain (GstPad * pad, GstData * _data)
break;
}
}
+
+ g_mutex_unlock (sdlvideosink->lock);
}