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:
Edgard Lima 2005-09-19 21:47:54 +00:00
parent 856cb2b355
commit ffaa724795
5 changed files with 95 additions and 84 deletions

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -1,11 +1,15 @@
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

View file

@ -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;