[frogr] Port to GStreamer 1.0
- From: Dominique Leuenberger <dleuen src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [frogr] Port to GStreamer 1.0
- Date: Sun, 17 Feb 2013 12:38:00 +0000 (UTC)
commit f63040a689d3c2017a825de7a2e753d0a4a6884f
Author: Dominique Leuenberger <dimstar opensuse org>
Date: Wed Feb 6 00:20:55 2013 +0100
Port to GStreamer 1.0
https://bugzilla.gnome.org/show_bug.cgi?id=693230
configure.ac | 4 +-
src/frogr-util.c | 56 +++++++++--------------------------------------------
2 files changed, 12 insertions(+), 48 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 5b1622c..a520f60 100644
--- a/configure.ac
+++ b/configure.ac
@@ -38,8 +38,8 @@ PKG_CHECK_MODULES(LIBXML2, libxml-2.0 >= $LIBXML2_MIN_VERSION)
FROGR_CFLAGS="$FROGR_CFLAGS $LIBXML2_CFLAGS"
FROGR_LIBS="$FROGR_LIBS $LIBXML2_LIBS"
-GSTREAMER_MIN_VERSION=0.10
-PKG_CHECK_MODULES(GSTREAMER, gstreamer-0.10 >= $GSTREAMER_MIN_VERSION)
+GSTREAMER_MIN_VERSION=1.0
+PKG_CHECK_MODULES(GSTREAMER, gstreamer-1.0 >= $GSTREAMER_MIN_VERSION)
FROGR_CFLAGS="$FROGR_CFLAGS $GSTREAMER_CFLAGS"
FROGR_LIBS="$FROGR_LIBS $GSTREAMER_LIBS"
diff --git a/src/frogr-util.c b/src/frogr-util.c
index 8d59b84..d10bd98 100644
--- a/src/frogr-util.c
+++ b/src/frogr-util.c
@@ -28,6 +28,7 @@
#include <glib/gi18n.h>
#include <gtk/gtk.h>
#include <gst/gst.h>
+#include <gst/base/gstbasesink.h>
#include <libexif/exif-byte-order.h>
#include <libexif/exif-data.h>
#include <libexif/exif-entry.h>
@@ -35,7 +36,8 @@
#include <libexif/exif-loader.h>
#include <libexif/exif-tag.h>
-#define CAPS
"video/x-raw-rgb,width=160,pixel-aspect-ratio=1/1,bpp=(int)24,depth=(int)24,endianness=(int)4321,red_mask=(int)0xff0000,
green_mask=(int)0x00ff00, blue_mask=(int)0x0000ff"
+#define CAPS "video/x-raw,format=RGB,width=160,pixel-aspect-ratio=1/1"
+#define PREROLL_TIMEOUT (5*GST_SECOND)
static gboolean
_spawn_command (const gchar* cmd)
@@ -370,20 +372,16 @@ _get_pixbuf_from_video_file (GFile *file, GError **out_error)
{
GdkPixbuf *pixbuf = NULL;
GstElement *pipeline, *sink;
- GstBuffer *buffer;
- GstFormat format;
- GstStateChangeReturn ret;
+ GstStateChangeReturn ret, sret;
gchar *file_uri;
gchar *descr;
- gint width, height;
gint64 duration, position;
GError *error = NULL;
- gboolean res;
/* create a new pipeline */
file_uri = g_file_get_uri (file);
- descr = g_strdup_printf ("uridecodebin uri=%s ! ffmpegcolorspace ! videoscale ! "
- " appsink name=sink caps=\"" CAPS "\"", file_uri);
+ descr = g_strdup_printf ("uridecodebin uri=%s ! videoconvert ! videoscale "
+ " ! " CAPS " ! gdkpixbufsink name=sink", file_uri);
g_free (file_uri);
pipeline = gst_parse_launch (descr, &error);
@@ -423,8 +421,7 @@ _get_pixbuf_from_video_file (GFile *file, GError **out_error)
}
/* get the duration */
- format = GST_FORMAT_TIME;
- gst_element_query_duration (pipeline, &format, &duration);
+ gst_element_query_duration (pipeline, GST_FORMAT_TIME, &duration);
if (duration != -1)
/* we have a duration, seek to 50% */
@@ -439,43 +436,10 @@ _get_pixbuf_from_video_file (GFile *file, GError **out_error)
gst_element_seek_simple (pipeline, GST_FORMAT_TIME,
GST_SEEK_FLAG_KEY_UNIT | GST_SEEK_FLAG_FLUSH, position);
- /* get the preroll buffer from appsink, this block untils appsink really prerolls */
- g_signal_emit_by_name (sink, "pull-preroll", &buffer, NULL);
-
- /* if we have a buffer now, convert it to a pixbuf. It's possible that we
- * don't have a buffer because we went EOS right away or had an error. */
- if (buffer) {
- GstCaps *caps;
- GstStructure *s;
-
- /* get the snapshot buffer format now. We set the caps on the appsink so
- * that it can only be an rgb buffer. The only thing we have not specified
- * on the caps is the height, which is dependant on the pixel-aspect-ratio
- * of the source material */
- caps = GST_BUFFER_CAPS (buffer);
- if (!caps) {
- DEBUG ("could not get snapshot format\n");
- return NULL;
- }
- s = gst_caps_get_structure (caps, 0);
- /* we need to get the final caps on the buffer to get the size */
- res = gst_structure_get_int (s, "width", &width);
- res |= gst_structure_get_int (s, "height", &height);
- if (!res) {
- DEBUG ("could not get snapshot dimension\n");
- return NULL;
- }
-
- /* create pixmap from buffer and save, gstreamer video buffers have a stride
- * that is rounded up to the nearest multiple of 4 */
- pixbuf = gdk_pixbuf_new_from_data (GST_BUFFER_DATA (buffer),
- GDK_COLORSPACE_RGB, FALSE, 8, width, height,
- GST_ROUND_UP_4 (width * 3), NULL, NULL);
-
- } else {
- DEBUG ("could not make snapshot\n");
- }
+ sret = gst_element_get_state (pipeline, NULL, NULL, PREROLL_TIMEOUT);
+ if (sret == GST_STATE_CHANGE_SUCCESS)
+ g_object_get (sink, "last-pixbuf", &pixbuf, NULL);
/* cleanup and exit */
gst_element_set_state (pipeline, GST_STATE_NULL);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]