sdlvideosink ported to 0.9 and tested with filesrc ! mpeg2dec
authorEdgard Lima <edgard.lima@indt.org.br>
Mon, 19 Sep 2005 21:47:54 +0000 (21:47 +0000)
committerEdgard Lima <edgard.lima@indt.org.br>
Mon, 19 Sep 2005 21:47:54 +0000 (21:47 +0000)
Original commit message from CVS:
sdlvideosink ported to 0.9 and tested with filesrc ! mpeg2dec

PORTED_09
configure.ac
ext/Makefile.am
ext/sdl/Makefile.am
ext/sdl/sdlvideosink.c

index 05ee0aa..cf067bc 100644 (file)
--- a/PORTED_09
+++ b/PORTED_09
@@ -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)
index c37ace2..377d5c0 100644 (file)
@@ -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
index 3b400c1..6cd5100 100644 (file)
@@ -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
index b8e0dae..dbe91c4 100644 (file)
@@ -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
+
+
index 6a5b741..aaf0e57 100644 (file)
@@ -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;