}
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'):
#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)
}
}
- #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
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;
}
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
}
{
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
* 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);