mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-10-04 09:42:19 +00:00
sdlvideosink ported to 0.9 and tested with filesrc ! mpeg2dec
Original commit message from CVS: sdlvideosink ported to 0.9 and tested with filesrc ! mpeg2dec
This commit is contained in:
parent
856cb2b355
commit
ffaa724795
5 changed files with 95 additions and 84 deletions
|
@ -1,6 +1,7 @@
|
||||||
When porting a plugin start with 0.8 CVS head, not the old code in this module. There are many bugfixes which have gone into 0.8 which you want to keep.
|
When porting a plugin start with 0.8 CVS head, not the old code in this module. There are many bugfixes which have gone into 0.8 which you want to keep.
|
||||||
|
|
||||||
List of ported plugins (update when you commit a ported plugin):
|
List of ported plugins (update when you commit a ported plugin):
|
||||||
|
sdl (alima)
|
||||||
speed (fcarvalho)
|
speed (fcarvalho)
|
||||||
gsmenc (fcarvalho)
|
gsmenc (fcarvalho)
|
||||||
faac (fcarvalho)
|
faac (fcarvalho)
|
||||||
|
|
30
configure.ac
30
configure.ac
|
@ -364,6 +364,35 @@ return 0;
|
||||||
AC_SUBST(FAAD_LIBS)
|
AC_SUBST(FAAD_LIBS)
|
||||||
])
|
])
|
||||||
|
|
||||||
|
dnl Check for X11
|
||||||
|
|
||||||
|
dnl now try to find the HEADER
|
||||||
|
AC_CHECK_HEADER(X11/Xlib.h, HAVE_X="yes", HAVE_X="no")
|
||||||
|
|
||||||
|
if test "x$HAVE_X" = "xno"
|
||||||
|
then
|
||||||
|
AC_MSG_NOTICE([cannot find X11 development files])
|
||||||
|
else
|
||||||
|
dnl this is much more than we want
|
||||||
|
X_LIBS="$X_LIBS $X_PRE_LIBS $X_EXTRA_LIBS"
|
||||||
|
dnl AC_PATH_XTRA only defines the path needed to find the X libs,
|
||||||
|
dnl it does not add the libs; therefore we add them here
|
||||||
|
X_LIBS="$X_LIBS -lX11"
|
||||||
|
AC_SUBST(X_CFLAGS)
|
||||||
|
AC_SUBST(X_LIBS)
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
dnl *** SDL ***
|
||||||
|
translit(dnm, m, l) AM_CONDITIONAL(USE_SDL, true)
|
||||||
|
GST_CHECK_FEATURE(SDL, [SDL plug-in], sdlvideosink, [
|
||||||
|
dnl sdlvideosink depends on the xoverlay interface, which depends on X
|
||||||
|
if test x$HAVE_X = xyes; then
|
||||||
|
AM_PATH_SDL(, HAVE_SDL=yes, HAVE_SDL=no)
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
dnl *** gsm ***
|
dnl *** gsm ***
|
||||||
translit(dnm, m, l) AM_CONDITIONAL(USE_GSM, true)
|
translit(dnm, m, l) AM_CONDITIONAL(USE_GSM, true)
|
||||||
GST_CHECK_FEATURE(GSM, [GSM library], gsmenc gsmdec, [
|
GST_CHECK_FEATURE(GSM, [GSM library], gsmenc gsmdec, [
|
||||||
|
@ -440,6 +469,7 @@ ext/Makefile
|
||||||
ext/faac/Makefile
|
ext/faac/Makefile
|
||||||
ext/faad/Makefile
|
ext/faad/Makefile
|
||||||
ext/gsm/Makefile
|
ext/gsm/Makefile
|
||||||
|
ext/sdl/Makefile
|
||||||
common/Makefile
|
common/Makefile
|
||||||
common/m4/Makefile
|
common/m4/Makefile
|
||||||
m4/Makefile
|
m4/Makefile
|
||||||
|
|
|
@ -142,11 +142,11 @@ NAS_DIR=
|
||||||
POLYP_DIR=
|
POLYP_DIR=
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
# if USE_SDL
|
if USE_SDL
|
||||||
# SDL_DIR=sdl
|
SDL_DIR=sdl
|
||||||
# else
|
else
|
||||||
SDL_DIR=
|
SDL_DIR=
|
||||||
# endif
|
endif
|
||||||
|
|
||||||
# if USE_SHOUT
|
# if USE_SHOUT
|
||||||
# SHOUT_DIR=shout
|
# SHOUT_DIR=shout
|
||||||
|
@ -229,4 +229,5 @@ SUBDIRS=\
|
||||||
DIST_SUBDIRS= \
|
DIST_SUBDIRS= \
|
||||||
faac \
|
faac \
|
||||||
faad \
|
faad \
|
||||||
gsm
|
gsm \
|
||||||
|
sdl
|
||||||
|
|
|
@ -2,10 +2,14 @@
|
||||||
plugin_LTLIBRARIES = libgstsdlvideosink.la
|
plugin_LTLIBRARIES = libgstsdlvideosink.la
|
||||||
|
|
||||||
libgstsdlvideosink_la_SOURCES = sdlvideosink.c
|
libgstsdlvideosink_la_SOURCES = sdlvideosink.c
|
||||||
## FIXME I have my doubts about these opti flags
|
libgstsdlvideosink_la_CFLAGS = $(GST_CFLAGS) $(X_CFLAGS) $(SDL_CFLAGS)
|
||||||
libgstsdlvideosink_la_CFLAGS = $(GST_CFLAGS) $(SDL_CFLAGS)
|
libgstsdlvideosink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) -L/usr/X11R6/lib/
|
||||||
libgstsdlvideosink_la_LIBADD = $(SDL_LIBS) \
|
libgstsdlvideosink_la_LIBADD = $(SDL_LIBS) \
|
||||||
$(top_builddir)/gst-libs/gst/libgstinterfaces-@GST_MAJORMINOR@.la
|
$(top_builddir)/../gst-plugins-base/gst-libs/gst/interfaces/libgstinterfaces-$(GST_MAJORMINOR).la \
|
||||||
libgstsdlvideosink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
|
$(top_builddir)/../gst-plugins-base/gst-libs/gst/video/libgstvideo-$(GST_MAJORMINOR).la \
|
||||||
|
$(X_LIBS) $(XVIDEO_LIBS) $(XSHM_LIBS)
|
||||||
|
libgstsdlvideosink_la_DEPENDENCIES = $(top_builddir)/../gst-plugins-base/gst-libs/gst/video/libgstvideo-$(GST_MAJORMINOR).la
|
||||||
|
|
||||||
noinst_HEADERS = sdlvideosink.h
|
noinst_HEADERS = sdlvideosink.h
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include <gst/xoverlay/xoverlay.h>
|
#include <gst/interfaces/xoverlay.h>
|
||||||
|
|
||||||
#include "sdlvideosink.h"
|
#include "sdlvideosink.h"
|
||||||
|
|
||||||
|
@ -62,10 +62,13 @@ static void gst_sdlvideosink_deinitsdl (GstSDLVideoSink * sdl);
|
||||||
static gboolean gst_sdlvideosink_create (GstSDLVideoSink * sdl);
|
static gboolean gst_sdlvideosink_create (GstSDLVideoSink * sdl);
|
||||||
static void gst_sdlvideosink_destroy (GstSDLVideoSink * sdl);
|
static void gst_sdlvideosink_destroy (GstSDLVideoSink * sdl);
|
||||||
|
|
||||||
static GstPadLinkReturn
|
static gboolean gst_sdlvideosink_setcaps (GstBaseSink * bsink, GstCaps * caps);
|
||||||
gst_sdlvideosink_sinkconnect (GstPad * pad, const GstCaps * caps);
|
|
||||||
|
#if 0
|
||||||
static GstCaps *gst_sdlvideosink_fixate (GstPad * pad, const GstCaps * caps);
|
static GstCaps *gst_sdlvideosink_fixate (GstPad * pad, const GstCaps * caps);
|
||||||
static void gst_sdlvideosink_chain (GstPad * pad, GstData * data);
|
#endif
|
||||||
|
static GstFlowReturn gst_sdlvideosink_show_frame (GstBaseSink * bsink,
|
||||||
|
GstBuffer * buff);
|
||||||
|
|
||||||
static void gst_sdlvideosink_set_property (GObject * object,
|
static void gst_sdlvideosink_set_property (GObject * object,
|
||||||
guint prop_id, const GValue * value, GParamSpec * pspec);
|
guint prop_id, const GValue * value, GParamSpec * pspec);
|
||||||
|
@ -107,7 +110,7 @@ gst_sdlvideosink_get_type (void)
|
||||||
NULL,
|
NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
sdlvideosink_type = g_type_register_static (GST_TYPE_VIDEOSINK,
|
sdlvideosink_type = g_type_register_static (GST_TYPE_VIDEO_SINK,
|
||||||
"GstSDLVideoSink", &sdlvideosink_info, 0);
|
"GstSDLVideoSink", &sdlvideosink_info, 0);
|
||||||
g_type_add_interface_static (sdlvideosink_type,
|
g_type_add_interface_static (sdlvideosink_type,
|
||||||
GST_TYPE_IMPLEMENTS_INTERFACE, &iface_info);
|
GST_TYPE_IMPLEMENTS_INTERFACE, &iface_info);
|
||||||
|
@ -163,19 +166,25 @@ gst_sdlvideosink_class_init (GstSDLVideoSinkClass * klass)
|
||||||
{
|
{
|
||||||
GObjectClass *gobject_class;
|
GObjectClass *gobject_class;
|
||||||
GstElementClass *gstelement_class;
|
GstElementClass *gstelement_class;
|
||||||
GstVideoSinkClass *gstvs_class;
|
GstBaseSinkClass *gstvs_class;
|
||||||
|
|
||||||
gobject_class = (GObjectClass *) klass;
|
gobject_class = (GObjectClass *) klass;
|
||||||
gstelement_class = (GstElementClass *) klass;
|
gstelement_class = (GstElementClass *) klass;
|
||||||
gstvs_class = (GstVideoSinkClass *) klass;
|
gstvs_class = (GstBaseSinkClass *) klass;
|
||||||
|
|
||||||
parent_class = g_type_class_ref (GST_TYPE_ELEMENT);
|
parent_class = g_type_class_ref (GST_TYPE_ELEMENT);
|
||||||
|
|
||||||
gobject_class->set_property = gst_sdlvideosink_set_property;
|
gobject_class->set_property = gst_sdlvideosink_set_property;
|
||||||
gobject_class->get_property = gst_sdlvideosink_get_property;
|
gobject_class->get_property = gst_sdlvideosink_get_property;
|
||||||
|
|
||||||
gobject_class->finalize = gst_sdlvideosink_finalize;
|
gobject_class->finalize = gst_sdlvideosink_finalize;
|
||||||
|
|
||||||
gstelement_class->change_state = gst_sdlvideosink_change_state;
|
gstelement_class->change_state =
|
||||||
|
GST_DEBUG_FUNCPTR (gst_sdlvideosink_change_state);
|
||||||
|
|
||||||
|
gstvs_class->set_caps = GST_DEBUG_FUNCPTR (gst_sdlvideosink_setcaps);
|
||||||
|
gstvs_class->preroll = GST_DEBUG_FUNCPTR (gst_sdlvideosink_show_frame);
|
||||||
|
gstvs_class->render = GST_DEBUG_FUNCPTR (gst_sdlvideosink_show_frame);
|
||||||
|
|
||||||
/*gstvs_class->set_video_out = gst_sdlvideosink_set_video_out;
|
/*gstvs_class->set_video_out = gst_sdlvideosink_set_video_out;
|
||||||
gstvs_class->push_ui_event = gst_sdlvideosink_push_ui_event;
|
gstvs_class->push_ui_event = gst_sdlvideosink_push_ui_event;
|
||||||
|
@ -244,17 +253,6 @@ gst_sdlvideosink_get_bufferpool (GstPad * pad)
|
||||||
static void
|
static void
|
||||||
gst_sdlvideosink_init (GstSDLVideoSink * sdlvideosink)
|
gst_sdlvideosink_init (GstSDLVideoSink * sdlvideosink)
|
||||||
{
|
{
|
||||||
GST_VIDEOSINK_PAD (sdlvideosink) = gst_pad_new_from_template (sink_template,
|
|
||||||
"sink");
|
|
||||||
gst_element_add_pad (GST_ELEMENT (sdlvideosink),
|
|
||||||
GST_VIDEOSINK_PAD (sdlvideosink));
|
|
||||||
|
|
||||||
gst_pad_set_chain_function (GST_VIDEOSINK_PAD (sdlvideosink),
|
|
||||||
gst_sdlvideosink_chain);
|
|
||||||
gst_pad_set_link_function (GST_VIDEOSINK_PAD (sdlvideosink),
|
|
||||||
gst_sdlvideosink_sinkconnect);
|
|
||||||
gst_pad_set_fixate_function (GST_VIDEOSINK_PAD (sdlvideosink),
|
|
||||||
gst_sdlvideosink_fixate);
|
|
||||||
|
|
||||||
sdlvideosink->width = -1;
|
sdlvideosink->width = -1;
|
||||||
sdlvideosink->height = -1;
|
sdlvideosink->height = -1;
|
||||||
|
@ -278,7 +276,6 @@ gst_sdlvideosink_init (GstSDLVideoSink * sdlvideosink)
|
||||||
sdlvideosink);
|
sdlvideosink);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
GST_FLAG_SET (sdlvideosink, GST_ELEMENT_THREAD_SUGGESTED);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -325,7 +322,6 @@ gst_sdlvideosink_xoverlay_set_xwindow_id (GstXOverlay * overlay,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static guint32
|
static guint32
|
||||||
gst_sdlvideosink_get_sdl_from_fourcc (GstSDLVideoSink * sdlvideosink,
|
gst_sdlvideosink_get_sdl_from_fourcc (GstSDLVideoSink * sdlvideosink,
|
||||||
guint32 code)
|
guint32 code)
|
||||||
|
@ -346,7 +342,6 @@ gst_sdlvideosink_get_sdl_from_fourcc (GstSDLVideoSink * sdlvideosink,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_sdlvideosink_lock (GstSDLVideoSink * sdlvideosink)
|
gst_sdlvideosink_lock (GstSDLVideoSink * sdlvideosink)
|
||||||
{
|
{
|
||||||
|
@ -451,22 +446,22 @@ gst_sdlvideosink_destroy (GstSDLVideoSink * sdlvideosink)
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_sdlvideosink_create (GstSDLVideoSink * sdlvideosink)
|
gst_sdlvideosink_create (GstSDLVideoSink * sdlvideosink)
|
||||||
{
|
{
|
||||||
if (GST_VIDEOSINK_HEIGHT (sdlvideosink) <= 0)
|
if (GST_VIDEO_SINK_HEIGHT (sdlvideosink) <= 0)
|
||||||
GST_VIDEOSINK_HEIGHT (sdlvideosink) = sdlvideosink->height;
|
GST_VIDEO_SINK_HEIGHT (sdlvideosink) = sdlvideosink->height;
|
||||||
if (GST_VIDEOSINK_WIDTH (sdlvideosink) <= 0)
|
if (GST_VIDEO_SINK_WIDTH (sdlvideosink) <= 0)
|
||||||
GST_VIDEOSINK_WIDTH (sdlvideosink) = sdlvideosink->width;
|
GST_VIDEO_SINK_WIDTH (sdlvideosink) = sdlvideosink->width;
|
||||||
|
|
||||||
gst_sdlvideosink_destroy (sdlvideosink);
|
gst_sdlvideosink_destroy (sdlvideosink);
|
||||||
|
|
||||||
g_mutex_lock (sdlvideosink->lock);
|
g_mutex_lock (sdlvideosink->lock);
|
||||||
|
|
||||||
/* 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 (GST_VIDEOSINK_WIDTH (sdlvideosink),
|
sdlvideosink->screen = SDL_SetVideoMode (GST_VIDEO_SINK_WIDTH (sdlvideosink),
|
||||||
GST_VIDEOSINK_HEIGHT (sdlvideosink), 0, SDL_HWSURFACE | SDL_RESIZABLE);
|
GST_VIDEO_SINK_HEIGHT (sdlvideosink), 0, SDL_HWSURFACE | SDL_RESIZABLE);
|
||||||
if (sdlvideosink->screen == NULL) {
|
if (sdlvideosink->screen == NULL) {
|
||||||
GST_ELEMENT_ERROR (sdlvideosink, LIBRARY, TOO_LAZY, (NULL),
|
GST_ELEMENT_ERROR (sdlvideosink, LIBRARY, TOO_LAZY, (NULL),
|
||||||
("SDL: Couldn't set %dx%d: %s", GST_VIDEOSINK_WIDTH (sdlvideosink),
|
("SDL: Couldn't set %dx%d: %s", GST_VIDEO_SINK_WIDTH (sdlvideosink),
|
||||||
GST_VIDEOSINK_HEIGHT (sdlvideosink), SDL_GetError ()));
|
GST_VIDEO_SINK_HEIGHT (sdlvideosink), SDL_GetError ()));
|
||||||
g_mutex_unlock (sdlvideosink->lock);
|
g_mutex_unlock (sdlvideosink->lock);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
@ -483,16 +478,16 @@ gst_sdlvideosink_create (GstSDLVideoSink * sdlvideosink)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
} else {
|
} else {
|
||||||
GST_DEBUG ("Using a %dx%d %dbpp SDL screen with a %dx%d \'"
|
GST_DEBUG ("Using a %dx%d %dbpp SDL screen with a %dx%d \'"
|
||||||
GST_FOURCC_FORMAT "\' YUV overlay", GST_VIDEOSINK_WIDTH (sdlvideosink),
|
GST_FOURCC_FORMAT "\' YUV overlay", GST_VIDEO_SINK_WIDTH (sdlvideosink),
|
||||||
GST_VIDEOSINK_HEIGHT (sdlvideosink),
|
GST_VIDEO_SINK_HEIGHT (sdlvideosink),
|
||||||
sdlvideosink->screen->format->BitsPerPixel, sdlvideosink->width,
|
sdlvideosink->screen->format->BitsPerPixel, sdlvideosink->width,
|
||||||
sdlvideosink->height, GST_FOURCC_ARGS (sdlvideosink->format));
|
sdlvideosink->height, GST_FOURCC_ARGS (sdlvideosink->format));
|
||||||
}
|
}
|
||||||
|
|
||||||
sdlvideosink->rect.x = 0;
|
sdlvideosink->rect.x = 0;
|
||||||
sdlvideosink->rect.y = 0;
|
sdlvideosink->rect.y = 0;
|
||||||
sdlvideosink->rect.w = GST_VIDEOSINK_WIDTH (sdlvideosink);
|
sdlvideosink->rect.w = GST_VIDEO_SINK_WIDTH (sdlvideosink);
|
||||||
sdlvideosink->rect.h = GST_VIDEOSINK_HEIGHT (sdlvideosink);
|
sdlvideosink->rect.h = GST_VIDEO_SINK_HEIGHT (sdlvideosink);
|
||||||
|
|
||||||
/*SDL_DisplayYUVOverlay (sdlvideosink->overlay, &(sdlvideosink->rect)); */
|
/*SDL_DisplayYUVOverlay (sdlvideosink->overlay, &(sdlvideosink->rect)); */
|
||||||
|
|
||||||
|
@ -504,6 +499,7 @@ gst_sdlvideosink_create (GstSDLVideoSink * sdlvideosink)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
static GstCaps *
|
static GstCaps *
|
||||||
gst_sdlvideosink_fixate (GstPad * pad, const GstCaps * caps)
|
gst_sdlvideosink_fixate (GstPad * pad, const GstCaps * caps)
|
||||||
{
|
{
|
||||||
|
@ -527,18 +523,19 @@ gst_sdlvideosink_fixate (GstPad * pad, const GstCaps * caps)
|
||||||
return newcaps;
|
return newcaps;
|
||||||
}
|
}
|
||||||
|
|
||||||
gst_caps_free (newcaps);
|
gst_caps_unref (newcaps);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static GstPadLinkReturn
|
static gboolean
|
||||||
gst_sdlvideosink_sinkconnect (GstPad * pad, const GstCaps * vscapslist)
|
gst_sdlvideosink_setcaps (GstBaseSink * bsink, GstCaps * vscapslist)
|
||||||
{
|
{
|
||||||
GstSDLVideoSink *sdlvideosink;
|
GstSDLVideoSink *sdlvideosink;
|
||||||
guint32 format;
|
guint32 format;
|
||||||
GstStructure *structure;
|
GstStructure *structure;
|
||||||
|
|
||||||
sdlvideosink = GST_SDLVIDEOSINK (gst_pad_get_parent (pad));
|
sdlvideosink = GST_SDLVIDEOSINK (bsink);
|
||||||
|
|
||||||
structure = gst_caps_get_structure (vscapslist, 0);
|
structure = gst_caps_get_structure (vscapslist, 0);
|
||||||
gst_structure_get_fourcc (structure, "format", &format);
|
gst_structure_get_fourcc (structure, "format", &format);
|
||||||
|
@ -548,51 +545,33 @@ gst_sdlvideosink_sinkconnect (GstPad * pad, const GstCaps * vscapslist)
|
||||||
gst_structure_get_int (structure, "height", &sdlvideosink->height);
|
gst_structure_get_int (structure, "height", &sdlvideosink->height);
|
||||||
|
|
||||||
if (!sdlvideosink->format || !gst_sdlvideosink_create (sdlvideosink))
|
if (!sdlvideosink->format || !gst_sdlvideosink_create (sdlvideosink))
|
||||||
return GST_PAD_LINK_REFUSED;
|
return FALSE;
|
||||||
|
|
||||||
gst_x_overlay_got_desired_size (GST_X_OVERLAY (sdlvideosink),
|
gst_x_overlay_got_desired_size (GST_X_OVERLAY (sdlvideosink),
|
||||||
sdlvideosink->width, sdlvideosink->height);
|
sdlvideosink->width, sdlvideosink->height);
|
||||||
|
|
||||||
return GST_PAD_LINK_OK;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static GstFlowReturn
|
||||||
gst_sdlvideosink_chain (GstPad * pad, GstData * _data)
|
gst_sdlvideosink_show_frame (GstBaseSink * bsink, GstBuffer * buf)
|
||||||
{
|
{
|
||||||
GstBuffer *buf;
|
|
||||||
GstSDLVideoSink *sdlvideosink;
|
GstSDLVideoSink *sdlvideosink;
|
||||||
SDL_Event sdl_event;
|
SDL_Event sdl_event;
|
||||||
|
|
||||||
g_return_if_fail (pad != NULL);
|
sdlvideosink = GST_SDLVIDEOSINK (bsink);
|
||||||
g_return_if_fail (GST_IS_PAD (pad));
|
|
||||||
g_return_if_fail (_data != NULL);
|
|
||||||
|
|
||||||
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 ||
|
if (!sdlvideosink->init ||
|
||||||
!sdlvideosink->overlay || !sdlvideosink->overlay->pixels) {
|
!sdlvideosink->overlay || !sdlvideosink->overlay->pixels) {
|
||||||
g_warning ("Not init!");
|
g_print ("Not Init!\n");
|
||||||
gst_buffer_unref (buf);
|
return GST_FLOW_ERROR;
|
||||||
g_mutex_unlock (sdlvideosink->lock);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GST_BUFFER_DATA (buf) != sdlvideosink->overlay->pixels[0]) {
|
if (GST_BUFFER_DATA (buf) != sdlvideosink->overlay->pixels[0]) {
|
||||||
if (!gst_sdlvideosink_lock (sdlvideosink)) {
|
if (!gst_sdlvideosink_lock (sdlvideosink)) {
|
||||||
g_mutex_unlock (sdlvideosink->lock);
|
return GST_FLOW_ERROR;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* buf->yuv - FIXME: bufferpool! */
|
/* buf->yuv - FIXME: bufferpool! */
|
||||||
|
@ -615,8 +594,6 @@ gst_sdlvideosink_chain (GstPad * pad, GstData * _data)
|
||||||
gst_sdlvideosink_unlock (sdlvideosink);
|
gst_sdlvideosink_unlock (sdlvideosink);
|
||||||
}
|
}
|
||||||
|
|
||||||
gst_buffer_unref (buf);
|
|
||||||
|
|
||||||
/* Show, baby, show! */
|
/* Show, baby, show! */
|
||||||
SDL_DisplayYUVOverlay (sdlvideosink->overlay, &(sdlvideosink->rect));
|
SDL_DisplayYUVOverlay (sdlvideosink->overlay, &(sdlvideosink->rect));
|
||||||
|
|
||||||
|
@ -624,14 +601,16 @@ gst_sdlvideosink_chain (GstPad * pad, GstData * _data)
|
||||||
switch (sdl_event.type) {
|
switch (sdl_event.type) {
|
||||||
case SDL_VIDEORESIZE:
|
case SDL_VIDEORESIZE:
|
||||||
/* create a SDL window of the size requested by the user */
|
/* create a SDL window of the size requested by the user */
|
||||||
GST_VIDEOSINK_WIDTH (sdlvideosink) = sdl_event.resize.w;
|
GST_VIDEO_SINK_WIDTH (sdlvideosink) = sdl_event.resize.w;
|
||||||
GST_VIDEOSINK_HEIGHT (sdlvideosink) = sdl_event.resize.h;
|
GST_VIDEO_SINK_HEIGHT (sdlvideosink) = sdl_event.resize.h;
|
||||||
gst_sdlvideosink_create (sdlvideosink);
|
gst_sdlvideosink_create (sdlvideosink);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
g_mutex_unlock (sdlvideosink->lock);
|
|
||||||
|
return GST_FLOW_OK;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -705,10 +684,6 @@ gst_sdlvideosink_change_state (GstElement * element, GstStateChange transition)
|
||||||
static gboolean
|
static gboolean
|
||||||
plugin_init (GstPlugin * plugin)
|
plugin_init (GstPlugin * plugin)
|
||||||
{
|
{
|
||||||
/* Loading the library containing GstVideoSink, our parent object */
|
|
||||||
if (!gst_library_load ("gstvideo"))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
if (!gst_element_register (plugin, "sdlvideosink", GST_RANK_NONE,
|
if (!gst_element_register (plugin, "sdlvideosink", GST_RANK_NONE,
|
||||||
GST_TYPE_SDLVIDEOSINK))
|
GST_TYPE_SDLVIDEOSINK))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
Loading…
Reference in a new issue