mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-24 01:00:37 +00:00
Merge branch 'master' into 0.11
Conflicts: tests/examples/seek/seek.c
This commit is contained in:
commit
d2ea46cdbf
4 changed files with 392 additions and 16 deletions
|
@ -97,6 +97,13 @@ gst_riff_create_video_caps (guint32 codec_fcc,
|
|||
}
|
||||
break;
|
||||
}
|
||||
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",
|
||||
"format", G_TYPE_STRING, "I420", NULL);
|
||||
|
@ -133,6 +140,12 @@ gst_riff_create_video_caps (guint32 codec_fcc,
|
|||
if (codec_name)
|
||||
*codec_name = g_strdup ("Uncompressed packed YVU 4:2:2");
|
||||
break;
|
||||
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'):
|
||||
|
@ -1862,6 +1875,8 @@ gst_riff_create_video_template_caps (void)
|
|||
GST_MAKE_FOURCC ('Y', 'V', '1', '2'),
|
||||
GST_MAKE_FOURCC ('L', 'O', 'C', 'O'),
|
||||
GST_MAKE_FOURCC ('Z', 'M', 'B', 'V'),
|
||||
GST_MAKE_FOURCC ('v', '2', '1', '0'),
|
||||
GST_MAKE_FOURCC ('r', '2', '1', '0'),
|
||||
/* FILL ME */
|
||||
};
|
||||
guint i;
|
||||
|
|
|
@ -728,6 +728,9 @@ RESAMPLE_HORIZ_AYUV_FLOAT (resample_horiz_double_ayuv_generic, double, double,
|
|||
RESAMPLE_HORIZ_AYUV_FLOAT (resample_horiz_float_ayuv_generic, float, float,
|
||||
guint8, n_taps)
|
||||
|
||||
RESAMPLE_HORIZ_AYUV_FLOAT (resample_horiz_double_ayuv_generic_s16, double, double,
|
||||
guint16, n_taps)
|
||||
|
||||
RESAMPLE_HORIZ (resample_horiz_int32_int32_u8_generic, gint32, gint32,
|
||||
guint8, n_taps, shift)
|
||||
RESAMPLE_HORIZ (resample_horiz_int16_int16_u8_generic, gint16, gint16,
|
||||
|
@ -1636,7 +1639,7 @@ vs_image_scale_lanczos_AYUV64_double (const VSImage * dest, const VSImage * src,
|
|||
scale->dither = dither;
|
||||
|
||||
scale->horiz_resample_func =
|
||||
(HorizResampleFunc) resample_horiz_double_ayuv_generic;
|
||||
(HorizResampleFunc) resample_horiz_double_ayuv_generic_s16;
|
||||
|
||||
scale->tmpdata =
|
||||
g_malloc (sizeof (double) * scale->dest->width * scale->src->height * 4);
|
||||
|
|
|
@ -12,6 +12,7 @@ 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)
|
||||
|
|
|
@ -40,9 +40,12 @@
|
|||
#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/video/videooverlay.h>
|
||||
#include <gst/interfaces/navigation.h>
|
||||
|
||||
GST_DEBUG_CATEGORY_STATIC (seek_debug);
|
||||
#define GST_CAT_DEFAULT (seek_debug)
|
||||
|
@ -119,6 +122,12 @@ static GtkWidget *shuttle_checkbox, *step_button;
|
|||
static GtkWidget *shuttle_hscale;
|
||||
static GtkAdjustment *shuttle_adjustment;
|
||||
|
||||
static struct
|
||||
{
|
||||
GstNavigationCommand cmd;
|
||||
GtkWidget *button;
|
||||
} navigation_buttons[14];
|
||||
|
||||
static GList *paths = NULL, *l = NULL;
|
||||
|
||||
/* we keep an array of the visualisation entries so that we can easily switch
|
||||
|
@ -133,6 +142,7 @@ static GArray *vis_entries;
|
|||
static void clear_streams (GstElement * pipeline);
|
||||
static void volume_notify_cb (GstElement * pipeline, GParamSpec * arg,
|
||||
gpointer user_dat);
|
||||
static void find_navigation_element (void);
|
||||
|
||||
/* pipeline construction */
|
||||
|
||||
|
@ -691,6 +701,7 @@ stop_cb (GtkButton * button, gpointer data)
|
|||
{
|
||||
if (state != STOP_STATE) {
|
||||
GstStateChangeReturn ret;
|
||||
gint i;
|
||||
|
||||
g_print ("READY pipeline\n");
|
||||
gtk_statusbar_pop (GTK_STATUSBAR (statusbar), status_id);
|
||||
|
@ -731,6 +742,9 @@ stop_cb (GtkButton * button, gpointer data)
|
|||
connect_bus_signals (pipeline);
|
||||
}
|
||||
#endif
|
||||
gtk_widget_set_sensitive (GTK_WIDGET (hscale), TRUE);
|
||||
for (i = 0; i < G_N_ELEMENTS (navigation_buttons); i++)
|
||||
gtk_widget_set_sensitive (navigation_buttons[i].button, FALSE);
|
||||
}
|
||||
return;
|
||||
|
||||
|
@ -1425,6 +1439,8 @@ msg_async_done (GstBus * bus, GstMessage * message, GstPipeline * pipeline)
|
|||
|
||||
/* update the available streams */
|
||||
update_streams (pipeline);
|
||||
|
||||
find_navigation_element ();
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1590,9 +1606,51 @@ msg_clock_lost (GstBus * bus, GstMessage * message, GstPipeline * data)
|
|||
}
|
||||
}
|
||||
|
||||
#if defined (GDK_WINDOWING_X11) || defined (GDK_WINDOWING_WIN32)
|
||||
static GstElement *navigation_element = NULL;
|
||||
|
||||
static gulong embed_xid = 0;
|
||||
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 GstElement *overlay_element = NULL;
|
||||
static guintptr embed_handle = 0;
|
||||
|
||||
/* 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
|
||||
|
@ -1609,7 +1667,9 @@ bus_sync_handler (GstBus * bus, GstMessage * message, GstPipeline * data)
|
|||
|
||||
element = GST_ELEMENT (GST_MESSAGE_SRC (message));
|
||||
|
||||
g_print ("got prepare-window-handle, setting XID %lu\n", embed_xid);
|
||||
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")) {
|
||||
|
@ -1621,9 +1681,17 @@ bus_sync_handler (GstBus * bus, GstMessage * message, GstPipeline * data)
|
|||
* 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);
|
||||
|
||||
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);
|
||||
return GST_BUS_PASS;
|
||||
}
|
||||
#endif
|
||||
|
@ -1641,6 +1709,10 @@ draw_cb (GtkWidget * widget, cairo_t * cr, gpointer data)
|
|||
cairo_fill (cr);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (overlay_element)
|
||||
gst_video_overlay_expose (GST_VIDEO_OVERLAY (overlay_element));
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
@ -1655,14 +1727,72 @@ realize_cb (GtkWidget * widget, gpointer data)
|
|||
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_handle = gdk_quartz_window_get_nsview (window);
|
||||
g_print ("Window realize: video window NSView = %p\n", embed_handle);
|
||||
#elif defined (GDK_WINDOWING_X11)
|
||||
embed_handle = GDK_WINDOW_XID (window);
|
||||
g_print ("Window realize: video window XID = %" G_GUINTPTR_FORMAT "\n",
|
||||
embed_handle);
|
||||
#endif
|
||||
}
|
||||
|
||||
static gboolean
|
||||
button_press_cb (GtkWidget * widget, GdkEventButton * event, gpointer user_data)
|
||||
{
|
||||
gtk_widget_grab_focus (widget);
|
||||
|
||||
if (navigation_element)
|
||||
gst_navigation_send_mouse_event (GST_NAVIGATION (navigation_element),
|
||||
"mouse-button-press", event->button, event->x, event->y);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
button_release_cb (GtkWidget * widget, GdkEventButton * event,
|
||||
gpointer user_data)
|
||||
{
|
||||
if (navigation_element)
|
||||
gst_navigation_send_mouse_event (GST_NAVIGATION (navigation_element),
|
||||
"mouse-button-release", event->button, event->x, event->y);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
key_press_cb (GtkWidget * widget, GdkEventKey * event, gpointer user_data)
|
||||
{
|
||||
if (navigation_element)
|
||||
gst_navigation_send_key_event (GST_NAVIGATION (navigation_element),
|
||||
"key-press", gdk_keyval_name (event->keyval));
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
key_release_cb (GtkWidget * widget, GdkEventKey * event, gpointer user_data)
|
||||
{
|
||||
if (navigation_element)
|
||||
gst_navigation_send_key_event (GST_NAVIGATION (navigation_element),
|
||||
"key-release", gdk_keyval_name (event->keyval));
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
motion_notify_cb (GtkWidget * widget, GdkEventMotion * event,
|
||||
gpointer user_data)
|
||||
{
|
||||
if (navigation_element)
|
||||
gst_navigation_send_mouse_event (GST_NAVIGATION (navigation_element),
|
||||
"mouse-move", 0, event->x, event->y);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
msg_eos (GstBus * bus, GstMessage * message, GstPipeline * data)
|
||||
{
|
||||
|
@ -1686,12 +1816,69 @@ msg_step_done (GstBus * bus, GstMessage * message, GstPipeline * data)
|
|||
message_received (bus, message, data);
|
||||
}
|
||||
|
||||
static void
|
||||
msg (GstBus * bus, GstMessage * message, GstPipeline * data)
|
||||
{
|
||||
GstNavigationMessageType nav_type;
|
||||
|
||||
nav_type = gst_navigation_message_get_type (message);
|
||||
switch (nav_type) {
|
||||
case GST_NAVIGATION_MESSAGE_COMMANDS_CHANGED:{
|
||||
GstQuery *query;
|
||||
gboolean res, j;
|
||||
|
||||
/* Heuristic to detect if we're dealing with a DVD menu */
|
||||
query = gst_navigation_query_new_commands ();
|
||||
res = gst_element_query (GST_ELEMENT (GST_MESSAGE_SRC (message)), query);
|
||||
|
||||
for (j = 0; j < G_N_ELEMENTS (navigation_buttons); j++)
|
||||
gtk_widget_set_sensitive (navigation_buttons[j].button, FALSE);
|
||||
|
||||
if (res) {
|
||||
gboolean is_menu = FALSE;
|
||||
guint i, n;
|
||||
|
||||
if (gst_navigation_query_parse_commands_length (query, &n)) {
|
||||
for (i = 0; i < n; i++) {
|
||||
GstNavigationCommand cmd;
|
||||
|
||||
if (!gst_navigation_query_parse_commands_nth (query, i, &cmd))
|
||||
break;
|
||||
|
||||
is_menu |= (cmd == GST_NAVIGATION_COMMAND_ACTIVATE);
|
||||
is_menu |= (cmd == GST_NAVIGATION_COMMAND_LEFT);
|
||||
is_menu |= (cmd == GST_NAVIGATION_COMMAND_RIGHT);
|
||||
is_menu |= (cmd == GST_NAVIGATION_COMMAND_UP);
|
||||
is_menu |= (cmd == GST_NAVIGATION_COMMAND_DOWN);
|
||||
|
||||
for (j = 0; j < G_N_ELEMENTS (navigation_buttons); j++) {
|
||||
if (navigation_buttons[j].cmd != cmd)
|
||||
continue;
|
||||
|
||||
gtk_widget_set_sensitive (navigation_buttons[j].button, TRUE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
gtk_widget_set_sensitive (GTK_WIDGET (hscale), !is_menu);
|
||||
} else {
|
||||
g_assert_not_reached ();
|
||||
}
|
||||
|
||||
gst_query_unref (query);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
connect_bus_signals (GstElement * pipeline)
|
||||
{
|
||||
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-window-handle element message synchronously */
|
||||
gst_bus_set_sync_handler (bus, (GstBusSyncHandler) bus_sync_handler,
|
||||
pipeline);
|
||||
|
@ -1730,6 +1917,7 @@ connect_bus_signals (GstElement * pipeline)
|
|||
pipeline);
|
||||
g_signal_connect (bus, "sync-message::step-done",
|
||||
(GCallback) msg_sync_step_done, pipeline);
|
||||
g_signal_connect (bus, "message", (GCallback) msg, pipeline);
|
||||
|
||||
gst_object_unref (bus);
|
||||
}
|
||||
|
@ -1792,7 +1980,7 @@ int
|
|||
main (int argc, char **argv)
|
||||
{
|
||||
GtkWidget *window, *hbox, *vbox, *panel, *expander, *pb2vbox, *boxes,
|
||||
*flagtable, *boxes2, *step;
|
||||
*flagtable, *boxes2, *step, *navigation;
|
||||
GtkWidget *play_button, *pause_button, *stop_button, *shot_button;
|
||||
GtkWidget *accurate_checkbox, *key_checkbox, *loop_checkbox, *flush_checkbox;
|
||||
GtkWidget *scrub_checkbox, *play_scrub_checkbox;
|
||||
|
@ -1866,7 +2054,21 @@ main (int argc, char **argv)
|
|||
video_window = gtk_drawing_area_new ();
|
||||
g_signal_connect (video_window, "draw", G_CALLBACK (draw_cb), NULL);
|
||||
g_signal_connect (video_window, "realize", G_CALLBACK (realize_cb), NULL);
|
||||
g_signal_connect (video_window, "button-press-event",
|
||||
G_CALLBACK (button_press_cb), NULL);
|
||||
g_signal_connect (video_window, "button-release-event",
|
||||
G_CALLBACK (button_release_cb), NULL);
|
||||
g_signal_connect (video_window, "key-press-event", G_CALLBACK (key_press_cb),
|
||||
NULL);
|
||||
g_signal_connect (video_window, "key-release-event",
|
||||
G_CALLBACK (key_release_cb), NULL);
|
||||
g_signal_connect (video_window, "motion-notify-event",
|
||||
G_CALLBACK (motion_notify_cb), NULL);
|
||||
gtk_widget_set_can_focus (video_window, TRUE);
|
||||
gtk_widget_set_double_buffered (video_window, FALSE);
|
||||
gtk_widget_add_events (video_window,
|
||||
GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK
|
||||
| GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK);
|
||||
|
||||
statusbar = gtk_statusbar_new ();
|
||||
status_id = gtk_statusbar_get_context_id (GTK_STATUSBAR (statusbar), "seek");
|
||||
|
@ -1966,6 +2168,155 @@ main (int argc, char **argv)
|
|||
gtk_container_add (GTK_CONTAINER (step), hbox);
|
||||
}
|
||||
|
||||
/* navigation command expander */
|
||||
{
|
||||
GtkWidget *navigation_button;
|
||||
GtkWidget *grid;
|
||||
gint i = 0;
|
||||
|
||||
navigation = gtk_expander_new ("navigation commands");
|
||||
grid = gtk_grid_new ();
|
||||
gtk_grid_set_row_spacing (GTK_GRID (grid), 2);
|
||||
gtk_grid_set_row_homogeneous (GTK_GRID (grid), TRUE);
|
||||
gtk_grid_set_column_spacing (GTK_GRID (grid), 2);
|
||||
gtk_grid_set_column_homogeneous (GTK_GRID (grid), TRUE);
|
||||
|
||||
navigation_button = gtk_button_new_with_label ("Menu 1");
|
||||
g_signal_connect (G_OBJECT (navigation_button), "clicked",
|
||||
G_CALLBACK (navigation_cmd_cb),
|
||||
GINT_TO_POINTER (GST_NAVIGATION_COMMAND_MENU1));
|
||||
gtk_grid_attach (GTK_GRID (grid), navigation_button, i, 0, 1, 1);
|
||||
gtk_widget_set_sensitive (navigation_button, FALSE);
|
||||
gtk_widget_set_tooltip_text (navigation_button, "DVD Menu");
|
||||
navigation_buttons[i].button = navigation_button;
|
||||
navigation_buttons[i++].cmd = GST_NAVIGATION_COMMAND_MENU1;
|
||||
|
||||
navigation_button = gtk_button_new_with_label ("Menu 2");
|
||||
g_signal_connect (G_OBJECT (navigation_button), "clicked",
|
||||
G_CALLBACK (navigation_cmd_cb),
|
||||
GINT_TO_POINTER (GST_NAVIGATION_COMMAND_MENU2));
|
||||
gtk_grid_attach (GTK_GRID (grid), navigation_button, i, 0, 1, 1);
|
||||
gtk_widget_set_sensitive (navigation_button, FALSE);
|
||||
gtk_widget_set_tooltip_text (navigation_button, "DVD Title Menu");
|
||||
navigation_buttons[i].button = navigation_button;
|
||||
navigation_buttons[i++].cmd = GST_NAVIGATION_COMMAND_MENU2;
|
||||
|
||||
navigation_button = gtk_button_new_with_label ("Menu 3");
|
||||
g_signal_connect (G_OBJECT (navigation_button), "clicked",
|
||||
G_CALLBACK (navigation_cmd_cb),
|
||||
GINT_TO_POINTER (GST_NAVIGATION_COMMAND_MENU3));
|
||||
gtk_grid_attach (GTK_GRID (grid), navigation_button, i, 0, 1, 1);
|
||||
gtk_widget_set_sensitive (navigation_button, FALSE);
|
||||
gtk_widget_set_tooltip_text (navigation_button, "DVD Root Menu");
|
||||
navigation_buttons[i].button = navigation_button;
|
||||
navigation_buttons[i++].cmd = GST_NAVIGATION_COMMAND_MENU3;
|
||||
|
||||
navigation_button = gtk_button_new_with_label ("Menu 4");
|
||||
g_signal_connect (G_OBJECT (navigation_button), "clicked",
|
||||
G_CALLBACK (navigation_cmd_cb),
|
||||
GINT_TO_POINTER (GST_NAVIGATION_COMMAND_MENU4));
|
||||
gtk_grid_attach (GTK_GRID (grid), navigation_button, i, 0, 1, 1);
|
||||
gtk_widget_set_sensitive (navigation_button, FALSE);
|
||||
gtk_widget_set_tooltip_text (navigation_button, "DVD Subpicture Menu");
|
||||
navigation_buttons[i].button = navigation_button;
|
||||
navigation_buttons[i++].cmd = GST_NAVIGATION_COMMAND_MENU4;
|
||||
|
||||
navigation_button = gtk_button_new_with_label ("Menu 5");
|
||||
g_signal_connect (G_OBJECT (navigation_button), "clicked",
|
||||
G_CALLBACK (navigation_cmd_cb),
|
||||
GINT_TO_POINTER (GST_NAVIGATION_COMMAND_MENU5));
|
||||
gtk_grid_attach (GTK_GRID (grid), navigation_button, i, 0, 1, 1);
|
||||
gtk_widget_set_sensitive (navigation_button, FALSE);
|
||||
gtk_widget_set_tooltip_text (navigation_button, "DVD Audio Menu");
|
||||
navigation_buttons[i].button = navigation_button;
|
||||
navigation_buttons[i++].cmd = GST_NAVIGATION_COMMAND_MENU5;
|
||||
|
||||
navigation_button = gtk_button_new_with_label ("Menu 6");
|
||||
g_signal_connect (G_OBJECT (navigation_button), "clicked",
|
||||
G_CALLBACK (navigation_cmd_cb),
|
||||
GINT_TO_POINTER (GST_NAVIGATION_COMMAND_MENU6));
|
||||
gtk_grid_attach (GTK_GRID (grid), navigation_button, i, 0, 1, 1);
|
||||
gtk_widget_set_sensitive (navigation_button, FALSE);
|
||||
gtk_widget_set_tooltip_text (navigation_button, "DVD Angle Menu");
|
||||
navigation_buttons[i].button = navigation_button;
|
||||
navigation_buttons[i++].cmd = GST_NAVIGATION_COMMAND_MENU6;
|
||||
|
||||
navigation_button = gtk_button_new_with_label ("Menu 7");
|
||||
g_signal_connect (G_OBJECT (navigation_button), "clicked",
|
||||
G_CALLBACK (navigation_cmd_cb),
|
||||
GINT_TO_POINTER (GST_NAVIGATION_COMMAND_MENU7));
|
||||
gtk_grid_attach (GTK_GRID (grid), navigation_button, i, 0, 1, 1);
|
||||
gtk_widget_set_sensitive (navigation_button, FALSE);
|
||||
gtk_widget_set_tooltip_text (navigation_button, "DVD Chapter Menu");
|
||||
navigation_buttons[i].button = navigation_button;
|
||||
navigation_buttons[i++].cmd = GST_NAVIGATION_COMMAND_MENU7;
|
||||
|
||||
navigation_button = gtk_button_new_with_label ("Left");
|
||||
g_signal_connect (G_OBJECT (navigation_button), "clicked",
|
||||
G_CALLBACK (navigation_cmd_cb),
|
||||
GINT_TO_POINTER (GST_NAVIGATION_COMMAND_LEFT));
|
||||
gtk_grid_attach (GTK_GRID (grid), navigation_button, i - 7, 1, 1, 1);
|
||||
gtk_widget_set_sensitive (navigation_button, FALSE);
|
||||
navigation_buttons[i].button = navigation_button;
|
||||
navigation_buttons[i++].cmd = GST_NAVIGATION_COMMAND_LEFT;
|
||||
|
||||
navigation_button = gtk_button_new_with_label ("Right");
|
||||
g_signal_connect (G_OBJECT (navigation_button), "clicked",
|
||||
G_CALLBACK (navigation_cmd_cb),
|
||||
GINT_TO_POINTER (GST_NAVIGATION_COMMAND_RIGHT));
|
||||
gtk_grid_attach (GTK_GRID (grid), navigation_button, i - 7, 1, 1, 1);
|
||||
gtk_widget_set_sensitive (navigation_button, FALSE);
|
||||
navigation_buttons[i].button = navigation_button;
|
||||
navigation_buttons[i++].cmd = GST_NAVIGATION_COMMAND_RIGHT;
|
||||
|
||||
navigation_button = gtk_button_new_with_label ("Up");
|
||||
g_signal_connect (G_OBJECT (navigation_button), "clicked",
|
||||
G_CALLBACK (navigation_cmd_cb),
|
||||
GINT_TO_POINTER (GST_NAVIGATION_COMMAND_UP));
|
||||
gtk_grid_attach (GTK_GRID (grid), navigation_button, i - 7, 1, 1, 1);
|
||||
gtk_widget_set_sensitive (navigation_button, FALSE);
|
||||
navigation_buttons[i].button = navigation_button;
|
||||
navigation_buttons[i++].cmd = GST_NAVIGATION_COMMAND_UP;
|
||||
|
||||
navigation_button = gtk_button_new_with_label ("Down");
|
||||
g_signal_connect (G_OBJECT (navigation_button), "clicked",
|
||||
G_CALLBACK (navigation_cmd_cb),
|
||||
GINT_TO_POINTER (GST_NAVIGATION_COMMAND_DOWN));
|
||||
gtk_grid_attach (GTK_GRID (grid), navigation_button, i - 7, 1, 1, 1);
|
||||
gtk_widget_set_sensitive (navigation_button, FALSE);
|
||||
navigation_buttons[i].button = navigation_button;
|
||||
navigation_buttons[i++].cmd = GST_NAVIGATION_COMMAND_DOWN;
|
||||
|
||||
navigation_button = gtk_button_new_with_label ("Activate");
|
||||
g_signal_connect (G_OBJECT (navigation_button), "clicked",
|
||||
G_CALLBACK (navigation_cmd_cb),
|
||||
GINT_TO_POINTER (GST_NAVIGATION_COMMAND_ACTIVATE));
|
||||
gtk_grid_attach (GTK_GRID (grid), navigation_button, i - 7, 1, 1, 1);
|
||||
gtk_widget_set_sensitive (navigation_button, FALSE);
|
||||
navigation_buttons[i].button = navigation_button;
|
||||
navigation_buttons[i++].cmd = GST_NAVIGATION_COMMAND_ACTIVATE;
|
||||
|
||||
navigation_button = gtk_button_new_with_label ("Prev. Angle");
|
||||
g_signal_connect (G_OBJECT (navigation_button), "clicked",
|
||||
G_CALLBACK (navigation_cmd_cb),
|
||||
GINT_TO_POINTER (GST_NAVIGATION_COMMAND_PREV_ANGLE));
|
||||
gtk_grid_attach (GTK_GRID (grid), navigation_button, i - 7, 1, 1, 1);
|
||||
gtk_widget_set_sensitive (navigation_button, FALSE);
|
||||
navigation_buttons[i].button = navigation_button;
|
||||
navigation_buttons[i++].cmd = GST_NAVIGATION_COMMAND_PREV_ANGLE;
|
||||
|
||||
navigation_button = gtk_button_new_with_label ("Next. Angle");
|
||||
g_signal_connect (G_OBJECT (navigation_button), "clicked",
|
||||
G_CALLBACK (navigation_cmd_cb),
|
||||
GINT_TO_POINTER (GST_NAVIGATION_COMMAND_NEXT_ANGLE));
|
||||
gtk_grid_attach (GTK_GRID (grid), navigation_button, i - 7, 1, 1, 1);
|
||||
gtk_widget_set_sensitive (navigation_button, FALSE);
|
||||
navigation_buttons[i].button = navigation_button;
|
||||
navigation_buttons[i++].cmd = GST_NAVIGATION_COMMAND_NEXT_ANGLE;
|
||||
|
||||
gtk_container_add (GTK_CONTAINER (navigation), grid);
|
||||
}
|
||||
|
||||
/* seek bar */
|
||||
adjustment =
|
||||
GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.00, N_GRAD, 0.1, 1.0, 1.0));
|
||||
|
@ -2098,6 +2449,7 @@ main (int argc, char **argv)
|
|||
gtk_box_pack_start (GTK_BOX (vbox), expander, FALSE, FALSE, 2);
|
||||
}
|
||||
gtk_box_pack_start (GTK_BOX (vbox), step, FALSE, FALSE, 2);
|
||||
gtk_box_pack_start (GTK_BOX (vbox), navigation, FALSE, FALSE, 2);
|
||||
gtk_box_pack_start (GTK_BOX (vbox), hscale, FALSE, FALSE, 2);
|
||||
gtk_box_pack_start (GTK_BOX (vbox), statusbar, FALSE, FALSE, 2);
|
||||
|
||||
|
@ -2135,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 handle now */
|
||||
g_assert (embed_handle != 0);
|
||||
#endif
|
||||
|
||||
if (verbose) {
|
||||
|
@ -2151,6 +2503,11 @@ main (int argc, char **argv)
|
|||
g_print ("NULL pipeline\n");
|
||||
gst_element_set_state (pipeline, GST_STATE_NULL);
|
||||
|
||||
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);
|
||||
|
||||
|
|
Loading…
Reference in a new issue