diff options
Diffstat (limited to 'ext')
-rw-r--r-- | ext/Makefile.am | 11 | ||||
-rw-r--r-- | ext/sdl/Makefile.am | 14 | ||||
-rw-r--r-- | ext/sdl/sdlvideosink.c | 123 |
3 files changed, 64 insertions, 84 deletions
diff --git a/ext/Makefile.am b/ext/Makefile.am index 3b400c11..6cd51004 100644 --- a/ext/Makefile.am +++ b/ext/Makefile.am @@ -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 diff --git a/ext/sdl/Makefile.am b/ext/sdl/Makefile.am index b8e0daee..dbe91c4c 100644 --- a/ext/sdl/Makefile.am +++ b/ext/sdl/Makefile.am @@ -1,11 +1,15 @@ -plugin_LTLIBRARIES = libgstsdlvideosink.la +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 + + diff --git a/ext/sdl/sdlvideosink.c b/ext/sdl/sdlvideosink.c index 6a5b7418..aaf0e57d 100644 --- a/ext/sdl/sdlvideosink.c +++ b/ext/sdl/sdlvideosink.c @@ -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; |