Merge branch 'master' into 0.11
authorWim Taymans <wim.taymans@collabora.co.uk>
Tue, 21 Feb 2012 09:01:30 +0000 (10:01 +0100)
committerWim Taymans <wim.taymans@collabora.co.uk>
Tue, 21 Feb 2012 09:01:30 +0000 (10:01 +0100)
Conflicts:
tests/examples/seek/seek.c

1  2 
gst-libs/gst/riff/riff-media.c
tests/examples/seek/Makefile.am
tests/examples/seek/seek.c

@@@ -97,9 -104,22 +97,16 @@@ gst_riff_create_video_caps (guint32 cod
        }
        break;
      }
 -      caps = gst_caps_new_simple ("video/x-raw-rgb",
 -          "endianness", G_TYPE_INT, G_BIG_ENDIAN, "depth", G_TYPE_INT, 30,
 -          "bpp", G_TYPE_INT, 32,
 -          "endianness", G_TYPE_INT, G_BIG_ENDIAN,
 -          "red_mask", G_TYPE_INT, 0x3ff00000,
 -          "green_mask", G_TYPE_INT, 0x000ffc00,
 -          "blue_mask", G_TYPE_INT, 0x000003ff, NULL);
 -
+     case GST_MAKE_FOURCC ('r', '2', '1', '0'):
++      caps = gst_caps_new_simple ("video/x-raw",
++          "format", G_TYPE_STRING, "r210", NULL);
+       if (codec_name)
+         *codec_name = g_strdup ("Uncompressed packed RGB 10-bit 4:4:4");
+       break;
      case GST_MAKE_FOURCC ('I', '4', '2', '0'):
 -      caps = gst_caps_new_simple ("video/x-raw-yuv",
 -          "format", GST_TYPE_FOURCC, codec_fcc, NULL);
 +      caps = gst_caps_new_simple ("video/x-raw",
 +          "format", G_TYPE_STRING, "I420", NULL);
        if (codec_name)
          *codec_name = g_strdup ("Uncompressed planar YUV 4:2:0");
        break;
        if (codec_name)
          *codec_name = g_strdup ("Uncompressed packed YVU 4:2:2");
        break;
 -      caps = gst_caps_new_simple ("video/x-raw-yuv",
 -          "format", GST_TYPE_FOURCC, codec_fcc, NULL);
+     case GST_MAKE_FOURCC ('v', '2', '1', '0'):
++      caps = gst_caps_new_simple ("video/x-raw",
++          "format", G_TYPE_STRING, "v210", NULL);
+       if (codec_name)
+         *codec_name = g_strdup ("Uncompressed packed 10-bit YUV 4:2:2");
+       break;
  
      case GST_MAKE_FOURCC ('M', 'J', 'P', 'G'): /* YUY2 MJPEG */
      case GST_MAKE_FOURCC ('A', 'V', 'R', 'n'):
@@@ -11,7 -11,7 +11,8 @@@ examples = $(GTK_EXAMPLES) stepping ste
  noinst_PROGRAMS = $(examples)
  
  LDADD = \
 +      $(top_builddir)/gst-libs/gst/video/libgstvideo-@GST_MAJORMINOR@.la \
+       $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-@GST_MAJORMINOR@.la \
        $(GST_LIBS) $(GTK_LIBS) $(LIBM)
  
  AM_CFLAGS = -I$(top_builddir)/gst-libs $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(GTK_CFLAGS)
  #include <gdk/gdkx.h>
  #elif defined (GDK_WINDOWING_WIN32)
  #include <gdk/gdkwin32.h>
+ #elif defined (GDK_WINDOWING_QUARTZ)
+ #include <gdk/gdkquartzwindow.h>
  #endif
  
 -#include <gst/interfaces/xoverlay.h>
 +#include <gst/video/videooverlay.h>
+ #include <gst/interfaces/navigation.h>
  
  GST_DEBUG_CATEGORY_STATIC (seek_debug);
  #define GST_CAT_DEFAULT (seek_debug)
@@@ -1590,11 -2473,53 +1606,53 @@@ msg_clock_lost (GstBus * bus, GstMessag
    }
  }
  
- #if defined (GDK_WINDOWING_X11) || defined (GDK_WINDOWING_WIN32)
+ static GstElement *navigation_element = NULL;
+ static void
+ find_navigation_element (void)
+ {
+   GstElement *video_sink;
+   g_object_get (pipeline, "video-sink", &video_sink, NULL);
+   if (!video_sink)
+     return;
+   if (navigation_element)
+     gst_object_unref (navigation_element);
+   if (GST_IS_NAVIGATION (video_sink)) {
+     navigation_element = gst_object_ref (video_sink);
+   } else if (GST_IS_BIN (video_sink)) {
+     navigation_element =
+         gst_bin_get_by_interface (GST_BIN (video_sink), GST_TYPE_NAVIGATION);
+   } else {
+     navigation_element = NULL;
+   }
+   gst_object_unref (video_sink);
+ }
+ /* called when Navigation command button is pressed */
+ static void
+ navigation_cmd_cb (GtkButton * button, gpointer data)
+ {
+   GstNavigationCommand cmd = GPOINTER_TO_INT (data);
+   if (!navigation_element) {
+     find_navigation_element ();
+     if (!navigation_element)
+       return;
+   }
+   gst_navigation_send_command (GST_NAVIGATION (navigation_element), cmd);
+ }
+ #if defined (GDK_WINDOWING_X11) || defined (GDK_WINDOWING_WIN32) || defined (GDK_WINDOWING_QUARTZ)
  
- static gulong embed_xid = 0;
 -static GstElement *xoverlay_element = NULL;
 -static guintptr embed_xid = 0;
++static GstElement *overlay_element = NULL;
++static guintptr embed_handle = 0;
  
 -/* We set the xid here in response to the prepare-xwindow-id message via a
 +/* We set the xid here in response to the prepare-window-handle message via a
   * bus sync handler because we don't know the actual videosink used from the
   * start (as we don't know the pipeline, or bin elements such as autovideosink
   * or gconfvideosink may be used which create the actual videosink only once
  static GstBusSyncReply
  bus_sync_handler (GstBus * bus, GstMessage * message, GstPipeline * data)
  {
 -  if ((GST_MESSAGE_TYPE (message) == GST_MESSAGE_ELEMENT) &&
 -      gst_structure_has_name (message->structure, "prepare-xwindow-id")) {
 -    GstElement *element = GST_ELEMENT (GST_MESSAGE_SRC (message));
 +  GstElement *element;
  
 -    if (xoverlay_element)
 -      gst_object_unref (xoverlay_element);
 -    xoverlay_element = GST_ELEMENT (gst_object_ref (element));
 +  if (!gst_is_video_overlay_prepare_window_handle_message (message))
 +    return GST_BUS_PASS;
  
 -    g_print ("got prepare-xwindow-id, setting XID %" G_GUINTPTR_FORMAT "\n",
 -        embed_xid);
 +  element = GST_ELEMENT (GST_MESSAGE_SRC (message));
  
-   g_print ("got prepare-window-handle, setting XID %lu\n", embed_xid);
 -    if (g_object_class_find_property (G_OBJECT_GET_CLASS (element),
 -            "force-aspect-ratio")) {
 -      g_object_set (element, "force-aspect-ratio", TRUE, NULL);
 -    }
++  if (overlay_element)
++    gst_object_unref (overlay_element);
++  overlay_element = GST_ELEMENT (gst_object_ref (element));
 +
 +  if (g_object_class_find_property (G_OBJECT_GET_CLASS (element),
 +          "force-aspect-ratio")) {
 +    g_object_set (element, "force-aspect-ratio", TRUE, NULL);
 +  }
  
 -    /* Should have been initialised from main thread before (can't use
 -     * GDK_WINDOW_XID here with Gtk+ >= 2.18, because the sync handler will
 -     * be called from a streaming thread and GDK_WINDOW_XID maps to more than
 -     * a simple structure lookup with Gtk+ >= 2.18, where 'more' is stuff that
 -     * shouldn't be done from a non-GUI thread without explicit locking).  */
 -    g_assert (embed_xid != 0);
 +  /* Should have been initialised from main thread before (can't use
 +   * GDK_WINDOW_XID here with Gtk+ >= 2.18, because the sync handler will
 +   * be called from a streaming thread and GDK_WINDOW_XID maps to more than
 +   * a simple structure lookup with Gtk+ >= 2.18, where 'more' is stuff that
 +   * shouldn't be done from a non-GUI thread without explicit locking).  */
-   g_assert (embed_xid != 0);
++  g_assert (embed_handle != 0);
 -    gst_x_overlay_set_window_handle (GST_X_OVERLAY (element), embed_xid);
 -    gst_x_overlay_handle_events (GST_X_OVERLAY (element), FALSE);
++  g_print ("got prepare-window-handle, setting handle %" G_GUINTPTR_FORMAT "\n",
++      embed_handle);
++
++  gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (element),
++      embed_handle);
++  gst_video_overlay_handle_events (GST_VIDEO_OVERLAY (element), FALSE);
++
++  find_navigation_element ();
  
-   gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (element), embed_xid);
 -    find_navigation_element ();
 -  }
    return GST_BUS_PASS;
  }
  #endif
@@@ -1641,6 -2572,10 +1709,10 @@@ draw_cb (GtkWidget * widget, cairo_t * 
      cairo_fill (cr);
      return TRUE;
    }
 -  if (xoverlay_element)
 -    gst_x_overlay_expose (GST_X_OVERLAY (xoverlay_element));
++  if (overlay_element)
++    gst_video_overlay_expose (GST_VIDEO_OVERLAY (overlay_element));
    return FALSE;
  }
  
@@@ -1655,11 -2590,15 +1727,15 @@@ realize_cb (GtkWidget * widget, gpointe
      g_error ("Couldn't create native window needed for GstXOverlay!");
  
  #if defined (GDK_WINDOWING_WIN32)
--  embed_xid = GDK_WINDOW_HWND (window);
--  g_print ("Window realize: video window HWND = %lu\n", embed_xid);
- #else
-   embed_xid = GDK_WINDOW_XID (window);
-   g_print ("Window realize: video window XID = %lu\n", embed_xid);
++  embed_handle = GDK_WINDOW_HWND (window);
++  g_print ("Window realize: video window HWND = %lu\n", embed_handle);
+ #elif defined (GDK_WINDOWING_QUARTZ)
 -  embed_xid = gdk_quartz_window_get_nsview (window);
 -  g_print ("Window realize: video window NSView = %p\n", embed_xid);
++  embed_handle = gdk_quartz_window_get_nsview (window);
++  g_print ("Window realize: video window NSView = %p\n", embed_handle);
+ #elif defined (GDK_WINDOWING_X11)
 -  embed_xid = GDK_WINDOW_XID (window);
++  embed_handle = GDK_WINDOW_XID (window);
+   g_print ("Window realize: video window XID = %" G_GUINTPTR_FORMAT "\n",
 -      embed_xid);
++      embed_handle);
  #endif
  }
  
@@@ -1691,8 -2741,8 +1878,8 @@@ connect_bus_signals (GstElement * pipel
  {
    GstBus *bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
  
- #if defined (GDK_WINDOWING_X11) || defined (GDK_WINDOWING_WIN32)
+ #if defined (GDK_WINDOWING_X11) || defined (GDK_WINDOWING_WIN32) || defined (GDK_WINDOWING_QUARTZ)
 -  /* handle prepare-xwindow-id element message synchronously */
 +  /* handle prepare-window-handle element message synchronously */
    gst_bus_set_sync_handler (bus, (GstBusSyncHandler) bus_sync_handler,
        pipeline);
  #endif
@@@ -2135,9 -3357,9 +2487,9 @@@ main (int argc, char **argv
     * asks for the XID of the window to render onto */
    gtk_widget_realize (window);
  
- #if defined (GDK_WINDOWING_X11) || defined (GDK_WINDOWING_WIN32)
-   /* we should have the XID now */
-   g_assert (embed_xid != 0);
+ #if defined (GDK_WINDOWING_X11) || defined (GDK_WINDOWING_WIN32) || defined (GDK_WINDOWING_QUARTZ)
 -  /* we should have the XID now */
 -  g_assert (embed_xid != 0);
++  /* we should have the handle now */
++  g_assert (embed_handle != 0);
  #endif
  
    if (verbose) {
    g_print ("NULL pipeline\n");
    gst_element_set_state (pipeline, GST_STATE_NULL);
  
 -  if (xoverlay_element)
 -    gst_object_unref (xoverlay_element);
++  if (overlay_element)
++    gst_object_unref (overlay_element);
+   if (navigation_element)
+     gst_object_unref (navigation_element);
    g_print ("free pipeline\n");
    gst_object_unref (pipeline);