tests/icles/metadata_editor.*: Remove GstXOverlay stuff and use gdkpixbufsink plus some rather crude drawing/scaling ...

Original commit message from CVS:
* tests/icles/metadata_editor.c: (ENC_UNKNOWN), (last_pixbuf),
(draw_pixbuf), (change_tag_list), (update_draw_pixbuf),
(ui_drawing_size_allocate_cb), (on_drawingMain_expose_event),
(on_buttonSaveFile_clicked), (ui_create), (me_gst_bus_callback_view),
(me_gst_setup_view_pipeline), (process_file):
* tests/icles/metadata_editor.glade:
Remove GstXOverlay stuff and use gdkpixbufsink plus some rather crude
drawing/scaling logic to make this compile and work on all platforms.
Fixes #518227.
This commit is contained in:
Tim-Philipp Müller 2008-04-11 18:46:31 +00:00
parent a1023d43ce
commit 950db408db
3 changed files with 141 additions and 40 deletions

View file

@ -1,3 +1,15 @@
2008-04-11 Tim-Philipp Müller <tim at centricular dot net>
* tests/icles/metadata_editor.c: (ENC_UNKNOWN), (last_pixbuf),
(draw_pixbuf), (change_tag_list), (update_draw_pixbuf),
(ui_drawing_size_allocate_cb), (on_drawingMain_expose_event),
(on_buttonSaveFile_clicked), (ui_create), (me_gst_bus_callback_view),
(me_gst_setup_view_pipeline), (process_file):
* tests/icles/metadata_editor.glade:
Remove GstXOverlay stuff and use gdkpixbufsink plus some rather crude
drawing/scaling logic to make this compile and work on all platforms.
Fixes #518227.
2008-04-11 Tim-Philipp Müller <tim at centricular dot net>
* configure.ac:

View file

@ -49,8 +49,6 @@
#include <gst/gst.h>
#include <glade/glade-xml.h>
#include <gtk/gtk.h>
#include <gst/interfaces/xoverlay.h>
#include <gdk/gdkx.h>
/*
* Global constants
@ -86,8 +84,7 @@ typedef enum _AppOptions {
/* gstreamer related functions */
static void me_gst_cleanup_elements ();
static int
me_gst_setup_view_pipeline (const gchar * filename, GdkWindow * window);
static int me_gst_setup_view_pipeline (const gchar * filename);
static int
me_gst_setup_capture_pipeline (const gchar * src_file, const gchar * dest_file,
gint * encode_status, gboolean use_v4l2);
@ -115,6 +112,9 @@ GstElement *gst_video_sink = NULL;
GstElement *gst_file_sink = NULL;
GstElement *gst_pipeline = NULL;
GdkPixbuf *last_pixbuf = NULL; /* image as pixbuf at original size */
GdkPixbuf *draw_pixbuf = NULL; /* pixbuf resized for drawing */
AppOptions app_options = APP_OPT_ALL;
GstTagList *tag_list = NULL;
@ -259,39 +259,88 @@ done:
}
static void
update_draw_pixbuf (guint max_width, guint max_height)
{
gdouble wratio, hratio;
gint w = 0, h = 0;
if (last_pixbuf) {
w = gdk_pixbuf_get_width (last_pixbuf);
h = gdk_pixbuf_get_height (last_pixbuf);
}
g_print ("Allocation: %dx%d, pixbuf: %dx%d\n", max_width, max_height, w, h);
if (last_pixbuf == NULL)
return;
g_return_if_fail (max_width > 0 && max_height > 0);
wratio = w * 1.0 / max_width * 1.0;
hratio = h * 1.0 / max_height;
g_print ("ratios = %.2f / %.2f\n", wratio, hratio);
if (hratio > wratio) {
w = (gint) (w * 1.0 / hratio);
h = (gint) (h * 1.0 / hratio);
} else {
w = (gint) (w * 1.0 / wratio);
h = (gint) (h * 1.0 / wratio);
}
if (draw_pixbuf != NULL && gdk_pixbuf_get_width (draw_pixbuf) == w &&
gdk_pixbuf_get_height (last_pixbuf) == h) {
return; /* nothing to do */
}
g_print ("drawing pixbuf at %dx%d\n", w, h);
if (draw_pixbuf)
g_object_unref (draw_pixbuf);
draw_pixbuf =
gdk_pixbuf_scale_simple (last_pixbuf, w, h, GDK_INTERP_BILINEAR);
}
static void
ui_drawing_size_allocate_cb (GtkWidget * drawing_area,
GtkAllocation * allocation, gpointer data)
{
update_draw_pixbuf (allocation->width, allocation->height);
}
/*
* UI handling functions (mapped by glade)
*/
gboolean
on_windowMain_configure_event (GtkWidget * widget, GdkEventConfigure * event,
gpointer user_data)
{
GstXOverlay *xoverlay;
if (gst_video_sink) {
xoverlay = GST_X_OVERLAY (gst_video_sink);
if (xoverlay != NULL && GST_IS_X_OVERLAY (xoverlay)) {
gst_x_overlay_expose (xoverlay);
}
}
return FALSE;
}
gboolean
on_drawingMain_expose_event (GtkWidget * widget, GdkEventExpose * event,
gpointer data)
{
if (gst_video_sink) {
gst_x_overlay_set_xwindow_id (GST_X_OVERLAY (gst_video_sink),
GDK_WINDOW_XWINDOW (widget->window));
}
return FALSE;
GtkAllocation a = widget->allocation;
gint w, h, x, y;
if (draw_pixbuf == NULL)
return FALSE;
w = gdk_pixbuf_get_width (draw_pixbuf);
h = gdk_pixbuf_get_height (draw_pixbuf);
/* center image */
x = (a.width - w) / 2;
y = (a.height - h) / 2;
/* sanity check, shouldn't happen */
if (x < 0)
x = 0;
if (y < 0)
y = 0;
gdk_draw_pixbuf (GDK_DRAWABLE (widget->window), widget->style->black_gc,
draw_pixbuf, 0, 0, x, y, w, h, GDK_RGB_DITHER_NONE, 0, 0);
return TRUE; /* handled expose event */
}
void
@ -421,7 +470,7 @@ on_buttonSaveFile_clicked (GtkButton * button, gpointer user_data)
tag_list = NULL;
}
me_gst_setup_view_pipeline (filename->str, ui_drawing->window);
me_gst_setup_view_pipeline (filename->str);
gst_element_set_state (gst_pipeline, GST_STATE_PLAYING);
gst_element_get_state (gst_pipeline, NULL, NULL, GST_CLOCK_TIME_NONE);
@ -734,9 +783,6 @@ ui_connect_signals()
glade_xml_signal_connect(ui_glade_xml, "on_drawingMain_expose_event",
(GCallback)on_drawingMain_expose_event);
glade_xml_signal_connect(ui_glade_xml, "on_windowMain_configure_event",
(GCallback)on_windowMain_configure_event);
glade_xml_signal_connect(ui_glade_xml, "on_buttonInsert_clicked",
(GCallback)on_buttonInsert_clicked);
@ -788,6 +834,9 @@ ui_create ()
goto done;
}
g_signal_connect_after (ui_drawing, "size-allocate",
G_CALLBACK (ui_drawing_size_allocate_cb), NULL);
ui_connect_signals();
ui_setup_tree_view (GTK_TREE_VIEW (ui_tree));
@ -898,6 +947,37 @@ me_gst_bus_callback_view (GstBus * bus, GstMessage * message, gpointer data)
gst_tag_list_foreach (tag_list, insert_tag_on_tree, ui_tree);
}
break;
case GST_MESSAGE_ELEMENT: {
const GValue *val;
/* only interested in element messages from our gdkpixbufsink */
if (message->src != GST_OBJECT_CAST (gst_video_sink))
break;
/* only interested in the first image (not any smaller previews) */
if (gst_structure_has_name (message->structure, "pixbuf"))
break;
if (!gst_structure_has_name (message->structure, "preroll-pixbuf"))
break;
val = gst_structure_get_value (message->structure, "pixbuf");
g_return_val_if_fail (val != NULL, TRUE);
if (last_pixbuf)
g_object_unref (last_pixbuf);
last_pixbuf = g_value_dup_object (val);
g_print ("Got image pixbuf: %dx%d\n", gdk_pixbuf_get_width (last_pixbuf),
gdk_pixbuf_get_height (last_pixbuf));
update_draw_pixbuf (GTK_WIDGET (ui_drawing)->allocation.width,
GTK_WIDGET (ui_drawing)->allocation.height);
gtk_widget_queue_draw (ui_drawing);
break;
}
default:
/* unhandled message */
break;
@ -1171,7 +1251,7 @@ done:
}
static int
me_gst_setup_view_pipeline (const gchar * filename, GdkWindow * window)
me_gst_setup_view_pipeline (const gchar * filename)
{
int ret = 0;
GstBus *bus = NULL;
@ -1189,8 +1269,18 @@ me_gst_setup_view_pipeline (const gchar * filename, GdkWindow * window)
gst_image_dec = gst_element_factory_make ("jpegdec", NULL);
gst_video_scale = gst_element_factory_make ("videoscale", NULL);
gst_video_convert = gst_element_factory_make ("ffmpegcolorspace", NULL);
gst_video_sink = gst_element_factory_make ("ximagesink", NULL);
gst_video_sink = gst_element_factory_make ("gdkpixbufsink", NULL);
if (gst_video_sink == NULL) {
if (!gst_default_registry_check_feature_version ("gdkpixbufdec", 0, 10, 0))
g_warning ("Could not create 'gdkpixbufsink' element");
else {
g_warning ("Could not create 'gdkpixbufsink' element. "
"(May be your gst-plugins-good is too old?)");
ret = -400;
}
goto done;
}
if (!(gst_source && gst_metadata_demux && gst_image_dec && gst_video_scale
&& gst_video_convert && gst_video_sink)) {
fprintf (stderr, "An element couldn't be created for viewing\n");
@ -1210,7 +1300,6 @@ me_gst_setup_view_pipeline (const gchar * filename, GdkWindow * window)
/* set elements's properties */
g_object_set (gst_source, "location", filename, NULL);
g_object_set (gst_metadata_demux, "parse-only", TRUE, NULL);
g_object_set (gst_video_sink, "force-aspect-ratio", TRUE, NULL);
/* adding and linking elements */
@ -1225,9 +1314,10 @@ me_gst_setup_view_pipeline (const gchar * filename, GdkWindow * window)
gst_video_convert = NULL;
gst_object_ref (gst_video_sink);
if (window)
gst_x_overlay_set_xwindow_id (GST_X_OVERLAY (gst_video_sink),
GDK_WINDOW_XWINDOW (window));
if (last_pixbuf) {
g_object_unref (last_pixbuf);
last_pixbuf = NULL;
}
if (!linked) {
fprintf (stderr, "Elements couldn't be linked\n");
@ -1258,7 +1348,7 @@ process_file() {
}
/* create pipeline */
me_gst_setup_view_pipeline (filename->str, ui_drawing->window);
me_gst_setup_view_pipeline (filename->str);
gst_element_set_state (gst_pipeline, GST_STATE_PLAYING);

View file

@ -7,7 +7,6 @@
<property name="height_request">600</property>
<property name="events">GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="title" translatable="yes">Metadata Editor</property>
<signal name="configure_event" handler="on_windowMain_configure_event"/>
<signal name="delete_event" handler="on_windowMain_delete_event"/>
<child>
<widget class="GtkVPaned" id="vpanedMain">