mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-24 09:10:36 +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.
|
||||
|
||||
List of ported plugins (update when you commit a ported plugin):
|
||||
sdl (alima)
|
||||
speed (fcarvalho)
|
||||
gsmenc (fcarvalho)
|
||||
faac (fcarvalho)
|
||||
|
|
30
configure.ac
30
configure.ac
|
@ -364,6 +364,35 @@ return 0;
|
|||
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 ***
|
||||
translit(dnm, m, l) AM_CONDITIONAL(USE_GSM, true)
|
||||
GST_CHECK_FEATURE(GSM, [GSM library], gsmenc gsmdec, [
|
||||
|
@ -440,6 +469,7 @@ ext/Makefile
|
|||
ext/faac/Makefile
|
||||
ext/faad/Makefile
|
||||
ext/gsm/Makefile
|
||||
ext/sdl/Makefile
|
||||
common/Makefile
|
||||
common/m4/Makefile
|
||||
m4/Makefile
|
||||
|
|
|
@ -142,11 +142,11 @@ NAS_DIR=
|
|||
POLYP_DIR=
|
||||
# endif
|
||||
|
||||
# if USE_SDL
|
||||
# SDL_DIR=sdl
|
||||
# else
|
||||
if USE_SDL
|
||||
SDL_DIR=sdl
|
||||
else
|
||||
SDL_DIR=
|
||||
# endif
|
||||
endif
|
||||
|
||||
# if USE_SHOUT
|
||||
# SHOUT_DIR=shout
|
||||
|
@ -229,4 +229,5 @@ SUBDIRS=\
|
|||
DIST_SUBDIRS= \
|
||||
faac \
|
||||
faad \
|
||||
gsm
|
||||
gsm \
|
||||
sdl
|
||||
|
|
|
@ -2,10 +2,14 @@
|
|||
plugin_LTLIBRARIES = libgstsdlvideosink.la
|
||||
|
||||
libgstsdlvideosink_la_SOURCES = sdlvideosink.c
|
||||
## FIXME I have my doubts about these opti flags
|
||||
libgstsdlvideosink_la_CFLAGS = $(GST_CFLAGS) $(SDL_CFLAGS)
|
||||
libgstsdlvideosink_la_CFLAGS = $(GST_CFLAGS) $(X_CFLAGS) $(SDL_CFLAGS)
|
||||
libgstsdlvideosink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) -L/usr/X11R6/lib/
|
||||
libgstsdlvideosink_la_LIBADD = $(SDL_LIBS) \
|
||||
$(top_builddir)/gst-libs/gst/libgstinterfaces-@GST_MAJORMINOR@.la
|
||||
libgstsdlvideosink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
|
||||
$(top_builddir)/../gst-plugins-base/gst-libs/gst/interfaces/libgstinterfaces-$(GST_MAJORMINOR).la \
|
||||
$(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
|
||||
|
||||
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
#include <sys/time.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <gst/xoverlay/xoverlay.h>
|
||||
#include <gst/interfaces/xoverlay.h>
|
||||
|
||||
#include "sdlvideosink.h"
|
||||
|
||||
|
@ -62,10 +62,13 @@ static void gst_sdlvideosink_deinitsdl (GstSDLVideoSink * sdl);
|
|||
static gboolean gst_sdlvideosink_create (GstSDLVideoSink * sdl);
|
||||
static void gst_sdlvideosink_destroy (GstSDLVideoSink * sdl);
|
||||
|
||||
static GstPadLinkReturn
|
||||
gst_sdlvideosink_sinkconnect (GstPad * pad, const GstCaps * caps);
|
||||
static gboolean gst_sdlvideosink_setcaps (GstBaseSink * bsink, GstCaps * caps);
|
||||
|
||||
#if 0
|
||||
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,
|
||||
guint prop_id, const GValue * value, GParamSpec * pspec);
|
||||
|
@ -107,7 +110,7 @@ gst_sdlvideosink_get_type (void)
|
|||
NULL,
|
||||
};
|
||||
|
||||
sdlvideosink_type = g_type_register_static (GST_TYPE_VIDEOSINK,
|
||||
sdlvideosink_type = g_type_register_static (GST_TYPE_VIDEO_SINK,
|
||||
"GstSDLVideoSink", &sdlvideosink_info, 0);
|
||||
g_type_add_interface_static (sdlvideosink_type,
|
||||
GST_TYPE_IMPLEMENTS_INTERFACE, &iface_info);
|
||||
|
@ -163,19 +166,25 @@ gst_sdlvideosink_class_init (GstSDLVideoSinkClass * klass)
|
|||
{
|
||||
GObjectClass *gobject_class;
|
||||
GstElementClass *gstelement_class;
|
||||
GstVideoSinkClass *gstvs_class;
|
||||
GstBaseSinkClass *gstvs_class;
|
||||
|
||||
gobject_class = (GObjectClass *) klass;
|
||||
gstelement_class = (GstElementClass *) klass;
|
||||
gstvs_class = (GstVideoSinkClass *) klass;
|
||||
gstvs_class = (GstBaseSinkClass *) klass;
|
||||
|
||||
parent_class = g_type_class_ref (GST_TYPE_ELEMENT);
|
||||
|
||||
gobject_class->set_property = gst_sdlvideosink_set_property;
|
||||
gobject_class->get_property = gst_sdlvideosink_get_property;
|
||||
|
||||
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->push_ui_event = gst_sdlvideosink_push_ui_event;
|
||||
|
@ -244,17 +253,6 @@ gst_sdlvideosink_get_bufferpool (GstPad * pad)
|
|||
static void
|
||||
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->height = -1;
|
||||
|
@ -278,7 +276,6 @@ gst_sdlvideosink_init (GstSDLVideoSink * sdlvideosink)
|
|||
sdlvideosink);
|
||||
#endif
|
||||
|
||||
GST_FLAG_SET (sdlvideosink, GST_ELEMENT_THREAD_SUGGESTED);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -325,7 +322,6 @@ gst_sdlvideosink_xoverlay_set_xwindow_id (GstXOverlay * overlay,
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
static guint32
|
||||
gst_sdlvideosink_get_sdl_from_fourcc (GstSDLVideoSink * sdlvideosink,
|
||||
guint32 code)
|
||||
|
@ -346,7 +342,6 @@ gst_sdlvideosink_get_sdl_from_fourcc (GstSDLVideoSink * sdlvideosink,
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
static gboolean
|
||||
gst_sdlvideosink_lock (GstSDLVideoSink * sdlvideosink)
|
||||
{
|
||||
|
@ -451,22 +446,22 @@ gst_sdlvideosink_destroy (GstSDLVideoSink * sdlvideosink)
|
|||
static gboolean
|
||||
gst_sdlvideosink_create (GstSDLVideoSink * sdlvideosink)
|
||||
{
|
||||
if (GST_VIDEOSINK_HEIGHT (sdlvideosink) <= 0)
|
||||
GST_VIDEOSINK_HEIGHT (sdlvideosink) = sdlvideosink->height;
|
||||
if (GST_VIDEOSINK_WIDTH (sdlvideosink) <= 0)
|
||||
GST_VIDEOSINK_WIDTH (sdlvideosink) = sdlvideosink->width;
|
||||
if (GST_VIDEO_SINK_HEIGHT (sdlvideosink) <= 0)
|
||||
GST_VIDEO_SINK_HEIGHT (sdlvideosink) = sdlvideosink->height;
|
||||
if (GST_VIDEO_SINK_WIDTH (sdlvideosink) <= 0)
|
||||
GST_VIDEO_SINK_WIDTH (sdlvideosink) = sdlvideosink->width;
|
||||
|
||||
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);
|
||||
sdlvideosink->screen = SDL_SetVideoMode (GST_VIDEO_SINK_WIDTH (sdlvideosink),
|
||||
GST_VIDEO_SINK_HEIGHT (sdlvideosink), 0, SDL_HWSURFACE | SDL_RESIZABLE);
|
||||
if (sdlvideosink->screen == NULL) {
|
||||
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 ()));
|
||||
("SDL: Couldn't set %dx%d: %s", GST_VIDEO_SINK_WIDTH (sdlvideosink),
|
||||
GST_VIDEO_SINK_HEIGHT (sdlvideosink), SDL_GetError ()));
|
||||
g_mutex_unlock (sdlvideosink->lock);
|
||||
return FALSE;
|
||||
}
|
||||
|
@ -483,16 +478,16 @@ gst_sdlvideosink_create (GstSDLVideoSink * sdlvideosink)
|
|||
return FALSE;
|
||||
} else {
|
||||
GST_DEBUG ("Using a %dx%d %dbpp SDL screen with a %dx%d \'"
|
||||
GST_FOURCC_FORMAT "\' YUV overlay", GST_VIDEOSINK_WIDTH (sdlvideosink),
|
||||
GST_VIDEOSINK_HEIGHT (sdlvideosink),
|
||||
GST_FOURCC_FORMAT "\' YUV overlay", GST_VIDEO_SINK_WIDTH (sdlvideosink),
|
||||
GST_VIDEO_SINK_HEIGHT (sdlvideosink),
|
||||
sdlvideosink->screen->format->BitsPerPixel, sdlvideosink->width,
|
||||
sdlvideosink->height, GST_FOURCC_ARGS (sdlvideosink->format));
|
||||
}
|
||||
|
||||
sdlvideosink->rect.x = 0;
|
||||
sdlvideosink->rect.y = 0;
|
||||
sdlvideosink->rect.w = GST_VIDEOSINK_WIDTH (sdlvideosink);
|
||||
sdlvideosink->rect.h = GST_VIDEOSINK_HEIGHT (sdlvideosink);
|
||||
sdlvideosink->rect.w = GST_VIDEO_SINK_WIDTH (sdlvideosink);
|
||||
sdlvideosink->rect.h = GST_VIDEO_SINK_HEIGHT (sdlvideosink);
|
||||
|
||||
/*SDL_DisplayYUVOverlay (sdlvideosink->overlay, &(sdlvideosink->rect)); */
|
||||
|
||||
|
@ -504,6 +499,7 @@ gst_sdlvideosink_create (GstSDLVideoSink * sdlvideosink)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
#if 0
|
||||
static GstCaps *
|
||||
gst_sdlvideosink_fixate (GstPad * pad, const GstCaps * caps)
|
||||
{
|
||||
|
@ -527,18 +523,19 @@ gst_sdlvideosink_fixate (GstPad * pad, const GstCaps * caps)
|
|||
return newcaps;
|
||||
}
|
||||
|
||||
gst_caps_free (newcaps);
|
||||
gst_caps_unref (newcaps);
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
static GstPadLinkReturn
|
||||
gst_sdlvideosink_sinkconnect (GstPad * pad, const GstCaps * vscapslist)
|
||||
static gboolean
|
||||
gst_sdlvideosink_setcaps (GstBaseSink * bsink, GstCaps * vscapslist)
|
||||
{
|
||||
GstSDLVideoSink *sdlvideosink;
|
||||
guint32 format;
|
||||
GstStructure *structure;
|
||||
|
||||
sdlvideosink = GST_SDLVIDEOSINK (gst_pad_get_parent (pad));
|
||||
sdlvideosink = GST_SDLVIDEOSINK (bsink);
|
||||
|
||||
structure = gst_caps_get_structure (vscapslist, 0);
|
||||
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);
|
||||
|
||||
if (!sdlvideosink->format || !gst_sdlvideosink_create (sdlvideosink))
|
||||
return GST_PAD_LINK_REFUSED;
|
||||
return FALSE;
|
||||
|
||||
gst_x_overlay_got_desired_size (GST_X_OVERLAY (sdlvideosink),
|
||||
sdlvideosink->width, sdlvideosink->height);
|
||||
|
||||
return GST_PAD_LINK_OK;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
gst_sdlvideosink_chain (GstPad * pad, GstData * _data)
|
||||
static GstFlowReturn
|
||||
gst_sdlvideosink_show_frame (GstBaseSink * bsink, GstBuffer * buf)
|
||||
{
|
||||
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 (_data != NULL);
|
||||
sdlvideosink = GST_SDLVIDEOSINK (bsink);
|
||||
|
||||
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;
|
||||
g_print ("Not Init!\n");
|
||||
return GST_FLOW_ERROR;
|
||||
}
|
||||
|
||||
if (GST_BUFFER_DATA (buf) != sdlvideosink->overlay->pixels[0]) {
|
||||
if (!gst_sdlvideosink_lock (sdlvideosink)) {
|
||||
g_mutex_unlock (sdlvideosink->lock);
|
||||
return;
|
||||
return GST_FLOW_ERROR;
|
||||
}
|
||||
|
||||
/* buf->yuv - FIXME: bufferpool! */
|
||||
|
@ -615,8 +594,6 @@ gst_sdlvideosink_chain (GstPad * pad, GstData * _data)
|
|||
gst_sdlvideosink_unlock (sdlvideosink);
|
||||
}
|
||||
|
||||
gst_buffer_unref (buf);
|
||||
|
||||
/* Show, baby, show! */
|
||||
SDL_DisplayYUVOverlay (sdlvideosink->overlay, &(sdlvideosink->rect));
|
||||
|
||||
|
@ -624,14 +601,16 @@ gst_sdlvideosink_chain (GstPad * pad, GstData * _data)
|
|||
switch (sdl_event.type) {
|
||||
case SDL_VIDEORESIZE:
|
||||
/* create a SDL window of the size requested by the user */
|
||||
GST_VIDEOSINK_WIDTH (sdlvideosink) = sdl_event.resize.w;
|
||||
GST_VIDEOSINK_HEIGHT (sdlvideosink) = sdl_event.resize.h;
|
||||
GST_VIDEO_SINK_WIDTH (sdlvideosink) = sdl_event.resize.w;
|
||||
GST_VIDEO_SINK_HEIGHT (sdlvideosink) = sdl_event.resize.h;
|
||||
gst_sdlvideosink_create (sdlvideosink);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
g_mutex_unlock (sdlvideosink->lock);
|
||||
|
||||
return GST_FLOW_OK;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -705,10 +684,6 @@ gst_sdlvideosink_change_state (GstElement * element, GstStateChange transition)
|
|||
static gboolean
|
||||
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,
|
||||
GST_TYPE_SDLVIDEOSINK))
|
||||
return FALSE;
|
||||
|
|
Loading…
Reference in a new issue