mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-26 06:54:49 +00:00
Add an image and a title to the SDL window while waiting
Original commit message from CVS: Add an image and a title to the SDL window while waiting
This commit is contained in:
parent
44fe0401ff
commit
0673305409
1 changed files with 75 additions and 26 deletions
|
@ -59,7 +59,8 @@ enum {
|
||||||
static void gst_sdlvideosink_class_init (GstSDLVideoSinkClass *klass);
|
static void gst_sdlvideosink_class_init (GstSDLVideoSinkClass *klass);
|
||||||
static void gst_sdlvideosink_init (GstSDLVideoSink *sdlvideosink);
|
static void gst_sdlvideosink_init (GstSDLVideoSink *sdlvideosink);
|
||||||
|
|
||||||
static gboolean gst_sdlvideosink_create (GstSDLVideoSink *sdlvideosink);
|
static gboolean gst_sdlvideosink_create (GstSDLVideoSink *sdlvideosink,
|
||||||
|
gboolean showlogo);
|
||||||
static GstPadConnectReturn gst_sdlvideosink_sinkconnect (GstPad *pad,
|
static GstPadConnectReturn gst_sdlvideosink_sinkconnect (GstPad *pad,
|
||||||
GstCaps *caps);
|
GstCaps *caps);
|
||||||
static void gst_sdlvideosink_chain (GstPad *pad,
|
static void gst_sdlvideosink_chain (GstPad *pad,
|
||||||
|
@ -222,9 +223,45 @@ gst_sdlvideosink_get_sdl_from_fourcc (GstSDLVideoSink *sdlvideosink,
|
||||||
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_sdlvideosink_create (GstSDLVideoSink *sdlvideosink)
|
gst_sdlvideosink_lock (GstSDLVideoSink *sdlvideosink)
|
||||||
|
{
|
||||||
|
/* Lock SDL/yuv-overlay */
|
||||||
|
if (SDL_MUSTLOCK(sdlvideosink->screen))
|
||||||
|
{
|
||||||
|
if (SDL_LockSurface(sdlvideosink->screen) < 0)
|
||||||
|
{
|
||||||
|
gst_element_error(GST_ELEMENT(sdlvideosink),
|
||||||
|
"SDL: couldn\'t lock the SDL video window: %s", SDL_GetError());
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (SDL_LockYUVOverlay(sdlvideosink->yuv_overlay) < 0)
|
||||||
|
{
|
||||||
|
gst_element_error(GST_ELEMENT(sdlvideosink),
|
||||||
|
"SDL: couldn\'t lock the SDL YUV overlay: %s", SDL_GetError());
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
gst_sdlvideosink_unlock (GstSDLVideoSink *sdlvideosink)
|
||||||
|
{
|
||||||
|
/* Unlock SDL_yuv_overlay */
|
||||||
|
SDL_UnlockYUVOverlay(sdlvideosink->yuv_overlay);
|
||||||
|
if (SDL_MUSTLOCK(sdlvideosink->screen))
|
||||||
|
SDL_UnlockSurface(sdlvideosink->screen);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_sdlvideosink_create (GstSDLVideoSink *sdlvideosink, gboolean showlogo)
|
||||||
{
|
{
|
||||||
gulong print_format;
|
gulong print_format;
|
||||||
|
guint8 *sbuffer;
|
||||||
|
gint i;
|
||||||
|
|
||||||
if (sdlvideosink->window_height <= 0)
|
if (sdlvideosink->window_height <= 0)
|
||||||
sdlvideosink->window_height = sdlvideosink->image_height;
|
sdlvideosink->window_height = sdlvideosink->image_height;
|
||||||
|
@ -236,6 +273,9 @@ gst_sdlvideosink_create (GstSDLVideoSink *sdlvideosink)
|
||||||
/* create a SDL window of the size requested by the user */
|
/* create a SDL window of the size requested by the user */
|
||||||
sdlvideosink->screen = SDL_SetVideoMode(sdlvideosink->window_width,
|
sdlvideosink->screen = SDL_SetVideoMode(sdlvideosink->window_width,
|
||||||
sdlvideosink->window_height, 0, SDL_SWSURFACE | SDL_RESIZABLE);
|
sdlvideosink->window_height, 0, SDL_SWSURFACE | SDL_RESIZABLE);
|
||||||
|
if (showlogo) /* workaround for SDL bug - do it twice */
|
||||||
|
sdlvideosink->screen = SDL_SetVideoMode(sdlvideosink->window_width,
|
||||||
|
sdlvideosink->window_height, 0, SDL_SWSURFACE | SDL_RESIZABLE);
|
||||||
if ( sdlvideosink->screen == NULL)
|
if ( sdlvideosink->screen == NULL)
|
||||||
{
|
{
|
||||||
gst_element_error(GST_ELEMENT(sdlvideosink),
|
gst_element_error(GST_ELEMENT(sdlvideosink),
|
||||||
|
@ -271,11 +311,37 @@ gst_sdlvideosink_create (GstSDLVideoSink *sdlvideosink)
|
||||||
sdlvideosink->rect.y = 0;
|
sdlvideosink->rect.y = 0;
|
||||||
sdlvideosink->rect.w = sdlvideosink->window_width;
|
sdlvideosink->rect.w = sdlvideosink->window_width;
|
||||||
sdlvideosink->rect.h = sdlvideosink->window_height;
|
sdlvideosink->rect.h = sdlvideosink->window_height;
|
||||||
SDL_DisplayYUVOverlay(sdlvideosink->yuv_overlay, &(sdlvideosink->rect));
|
|
||||||
|
|
||||||
/* make stupid SDL *not* react on SIGINT */
|
/* make stupid SDL *not* react on SIGINT */
|
||||||
signal(SIGINT, SIG_DFL);
|
signal(SIGINT, SIG_DFL);
|
||||||
|
|
||||||
|
if (showlogo)
|
||||||
|
{
|
||||||
|
SDL_Event event;
|
||||||
|
while (SDL_PollEvent(&event));
|
||||||
|
|
||||||
|
if (!gst_sdlvideosink_lock(sdlvideosink))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
/* Draw bands of color on the raw surface, as run indicator for debugging */
|
||||||
|
sbuffer = (char *)sdlvideosink->screen->pixels;
|
||||||
|
for (i=0; i<sdlvideosink->screen->h; i++)
|
||||||
|
{
|
||||||
|
memset(sbuffer, (i*255)/sdlvideosink->screen->h,
|
||||||
|
sdlvideosink->screen->w * sdlvideosink->screen->format->BytesPerPixel);
|
||||||
|
sbuffer += sdlvideosink->screen->pitch;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set the windows title */
|
||||||
|
SDL_WM_SetCaption("GStreamer SDL Video Playback", "0000000");
|
||||||
|
|
||||||
|
gst_sdlvideosink_unlock(sdlvideosink);
|
||||||
|
|
||||||
|
SDL_UpdateRect(sdlvideosink->screen, 0, 0, sdlvideosink->rect.w, sdlvideosink->rect.h);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
SDL_DisplayYUVOverlay(sdlvideosink->yuv_overlay, &(sdlvideosink->rect));
|
||||||
|
|
||||||
GST_DEBUG (0, "sdlvideosink: setting %08lx (%4.4s)\n", sdlvideosink->format, (gchar*)&print_format);
|
GST_DEBUG (0, "sdlvideosink: setting %08lx (%4.4s)\n", sdlvideosink->format, (gchar*)&print_format);
|
||||||
|
|
||||||
/* TODO: is this the width of the input image stream or of the widget? */
|
/* TODO: is this the width of the input image stream or of the widget? */
|
||||||
|
@ -315,7 +381,7 @@ gst_sdlvideosink_sinkconnect (GstPad *pad,
|
||||||
sdlvideosink->image_height = gst_caps_get_int(caps, "height");
|
sdlvideosink->image_height = gst_caps_get_int(caps, "height");
|
||||||
|
|
||||||
/* try it out */
|
/* try it out */
|
||||||
if (!gst_sdlvideosink_create(sdlvideosink))
|
if (!gst_sdlvideosink_create(sdlvideosink, TRUE))
|
||||||
return GST_PAD_CONNECT_REFUSED;
|
return GST_PAD_CONNECT_REFUSED;
|
||||||
|
|
||||||
return GST_PAD_CONNECT_OK;
|
return GST_PAD_CONNECT_OK;
|
||||||
|
@ -349,7 +415,7 @@ gst_sdlvideosink_chain (GstPad *pad, GstBuffer *buf)
|
||||||
/* create a SDL window of the size requested by the user */
|
/* create a SDL window of the size requested by the user */
|
||||||
sdlvideosink->window_width = event.resize.w;
|
sdlvideosink->window_width = event.resize.w;
|
||||||
sdlvideosink->window_height = event.resize.h;
|
sdlvideosink->window_height = event.resize.h;
|
||||||
gst_sdlvideosink_create(sdlvideosink);
|
gst_sdlvideosink_create(sdlvideosink, FALSE);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -359,22 +425,8 @@ gst_sdlvideosink_chain (GstPad *pad, GstBuffer *buf)
|
||||||
sdlvideosink->clock, GST_BUFFER_TIMESTAMP (buf));
|
sdlvideosink->clock, GST_BUFFER_TIMESTAMP (buf));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Lock SDL/yuv-overlay */
|
if (!gst_sdlvideosink_lock(sdlvideosink))
|
||||||
if (SDL_MUSTLOCK(sdlvideosink->screen))
|
|
||||||
{
|
|
||||||
if (SDL_LockSurface(sdlvideosink->screen) < 0)
|
|
||||||
{
|
|
||||||
gst_element_error(GST_ELEMENT(sdlvideosink),
|
|
||||||
"SDL: couldn\'t lock the SDL video window: %s", SDL_GetError());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (SDL_LockYUVOverlay(sdlvideosink->yuv_overlay) < 0)
|
|
||||||
{
|
|
||||||
gst_element_error(GST_ELEMENT(sdlvideosink),
|
|
||||||
"SDL: couldn\'t lock the SDL YUV overlat: %s", SDL_GetError());
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
/* buf->yuv */
|
/* buf->yuv */
|
||||||
if (sdlvideosink->format == GST_MAKE_FOURCC('I','4','2','0') ||
|
if (sdlvideosink->format == GST_MAKE_FOURCC('I','4','2','0') ||
|
||||||
|
@ -393,10 +445,7 @@ gst_sdlvideosink_chain (GstPad *pad, GstBuffer *buf)
|
||||||
/* let's draw the data (*yuv[3]) on a SDL screen (*buffer) */
|
/* let's draw the data (*yuv[3]) on a SDL screen (*buffer) */
|
||||||
sdlvideosink->yuv_overlay->pixels = sdlvideosink->yuv;
|
sdlvideosink->yuv_overlay->pixels = sdlvideosink->yuv;
|
||||||
|
|
||||||
/* Unlock SDL_yuv_overlay */
|
gst_sdlvideosink_unlock(sdlvideosink);
|
||||||
SDL_UnlockYUVOverlay(sdlvideosink->yuv_overlay);
|
|
||||||
if (SDL_MUSTLOCK(sdlvideosink->screen))
|
|
||||||
SDL_UnlockSurface(sdlvideosink->screen);
|
|
||||||
|
|
||||||
/* Show, baby, show! */
|
/* Show, baby, show! */
|
||||||
SDL_DisplayYUVOverlay(sdlvideosink->yuv_overlay, &(sdlvideosink->rect));
|
SDL_DisplayYUVOverlay(sdlvideosink->yuv_overlay, &(sdlvideosink->rect));
|
||||||
|
@ -424,12 +473,12 @@ gst_sdlvideosink_set_property (GObject *object, guint prop_id, const GValue *val
|
||||||
case ARG_WIDTH:
|
case ARG_WIDTH:
|
||||||
sdlvideosink->window_width = g_value_get_int(value);
|
sdlvideosink->window_width = g_value_get_int(value);
|
||||||
if (sdlvideosink->yuv_overlay)
|
if (sdlvideosink->yuv_overlay)
|
||||||
gst_sdlvideosink_create(sdlvideosink);
|
gst_sdlvideosink_create(sdlvideosink, FALSE);
|
||||||
break;
|
break;
|
||||||
case ARG_HEIGHT:
|
case ARG_HEIGHT:
|
||||||
sdlvideosink->window_height = g_value_get_int(value);
|
sdlvideosink->window_height = g_value_get_int(value);
|
||||||
if (sdlvideosink->yuv_overlay)
|
if (sdlvideosink->yuv_overlay)
|
||||||
gst_sdlvideosink_create(sdlvideosink);
|
gst_sdlvideosink_create(sdlvideosink, FALSE);
|
||||||
break;
|
break;
|
||||||
case ARG_XID:
|
case ARG_XID:
|
||||||
sdlvideosink->window_id = g_value_get_int(value);
|
sdlvideosink->window_id = g_value_get_int(value);
|
||||||
|
|
Loading…
Reference in a new issue