diff options
author | Luis de Bethencourt <luis@debethencourt.com> | 2011-03-31 20:20:23 +0200 |
---|---|---|
committer | Luis de Bethencourt <luis@debethencourt.com> | 2011-04-01 12:57:25 +0200 |
commit | 93b614303d4911d6055ac27b0c3e8fe3bd5902d1 (patch) | |
tree | 8501cd760ec1960aa291a3ae7d6cea5ac4675f37 | |
parent | 02b89c505b29b068460d657fbece900301707bd4 (diff) |
engine: use gst_discoverer to discover media info
it returns if the stream has video, audio, it's width, height, and duration
-rw-r--r-- | configure.ac | 6 | ||||
-rw-r--r-- | src/Makefile.am | 4 | ||||
-rw-r--r-- | src/gst_engine.c | 93 | ||||
-rw-r--r-- | src/gst_engine.h | 2 | ||||
-rw-r--r-- | src/snappy.c | 1 | ||||
-rw-r--r-- | src/user_interface.c | 7 | ||||
-rw-r--r-- | src/user_interface.h | 1 |
7 files changed, 78 insertions, 36 deletions
diff --git a/configure.ac b/configure.ac index c70c615..8f54f88 100644 --- a/configure.ac +++ b/configure.ac @@ -28,6 +28,7 @@ AC_STDC_HEADERS AM_PROG_LIBTOOL GST_0_10_REQS=0.10.20 +GST_PBUTILS=0.10.30 CLUTTER_REQS=1.2.0 CLUTTER_GST_1_0_REQS=1.0.0 CLUTTER_GST_0_10_REQS=0.10.0 @@ -41,6 +42,11 @@ PKG_CHECK_MODULES([GSTREAMER_0_10], \ AC_SUBST(GSTREAMER_0_10_CFLAGS) AC_SUBST(GSTREAMER_0_10_LIBS) +PKG_CHECK_MODULES([GST_PBUTILS], + [gstreamer-pbutils-0.10 >= $GST_PBUTILS]) +AC_SUBST(GST_PBUTILS_CFLAGS) +AC_SUBST(GST_PBUTILS_LIBS) + PKG_CHECK_MODULES([CLUTTER], [clutter-1.0 >= $CLUTTER_REQS]) AC_SUBST(CLUTTER_CFLAGS) diff --git a/src/Makefile.am b/src/Makefile.am index 89bda4d..ee03f6f 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -18,7 +18,7 @@ CLEANFILES = bin_PROGRAMS = snappy snappy_SOURCES = $(c_sources) -snappy_CFLAGS = $(CLUTTER_CFLAGS) $(GSTREAMER_0_10_CFLAGS) $(CLUTTER_GST_CFLAGS) $(GIO_CFLAGS) $(XTEST_CFLAGS) -DSNAPPY_DATA_DIR="\"$(pkgdatadir)\"" -snappy_LDADD = $(CLUTTER_LIBS) $(GSTREAMER_0_10_LIBS) $(CLUTTER_GST_LIBS) $(GIO_LIBS) $(XTEST_LIBS) +snappy_CFLAGS = $(CLUTTER_CFLAGS) $(GSTREAMER_0_10_CFLAGS) $(GST_PBUTILS_CFLAGS) $(CLUTTER_GST_CFLAGS) $(GIO_CFLAGS) $(XTEST_CFLAGS) -DSNAPPY_DATA_DIR="\"$(pkgdatadir)\"" +snappy_LDADD = $(CLUTTER_LIBS) $(GSTREAMER_0_10_LIBS) $(GST_PBUTILS_LIBS) $(CLUTTER_GST_LIBS) $(GIO_LIBS) $(XTEST_LIBS) noinst_HEADERS = $(public_headers) diff --git a/src/gst_engine.c b/src/gst_engine.c index 2ff37c0..56d3a7f 100644 --- a/src/gst_engine.c +++ b/src/gst_engine.c @@ -21,6 +21,7 @@ */ #include <clutter-gst/clutter-gst.h> +#include <gst/pbutils/pbutils.h> #include "user_interface.h" #include "gst_engine.h" @@ -76,6 +77,46 @@ add_uri_unfinished_playback (GstEngine * engine, gchar * uri, gint64 position) } gboolean +discover (GstEngine * engine, gchar * uri) +{ + gint timeout = 10; + GstDiscoverer *dc; + GstDiscovererInfo *info; + GstDiscovererStreamInfo *s_info; + GstDiscovererVideoInfo *v_info; + GError *error = NULL; + GList *list; + + dc = gst_discoverer_new (timeout * GST_SECOND, &error); + if (G_UNLIKELY (dc == NULL)) { + g_print ("Error in GST Discoverer initializing: %s\n", error->message); + return FALSE; + } + + info = gst_discoverer_discover_uri (dc, uri, &error); + list = gst_discoverer_info_get_video_streams (info); + engine->has_video = (g_list_length (list) > 0); + gst_discoverer_stream_info_list_free (list); + + list = gst_discoverer_info_get_audio_streams (info); + engine->has_audio = (g_list_length (list) > 0); + gst_discoverer_stream_info_list_free (list); + + if (engine->has_video || engine->has_audio) + engine->media_duration = gst_discoverer_info_get_duration (info); + + if (engine->has_video) { + list = gst_discoverer_info_get_video_streams (info); + v_info = (GstDiscovererVideoInfo *) list->data; + engine->media_width = gst_discoverer_video_info_get_width (v_info); + engine->media_height = gst_discoverer_video_info_get_height (v_info); + } + + gst_discoverer_info_unref (info); + g_error_free (error); +} + +gboolean remove_uri_unfinished_playback (GstEngine * engine, gchar * uri) { guint hash_key; @@ -198,37 +239,18 @@ bus_call (GstBus * bus, GstMessage * msg, gpointer data) { GstState old, new, pending; gst_message_parse_state_changed (msg, &old, &new, &pending); - if (new == GST_STATE_PAUSED) { - if (engine->media_width == -1) { - GstPad *p; - GstCaps *c; - - p = gst_element_get_pad (engine->sink, "sink"); - c = gst_pad_get_negotiated_caps (p); - if (c) { - GstStructure *s; - const GValue *widthval, *heightval; - - s = gst_caps_get_structure (c, 0); - widthval = gst_structure_get_value (s, "width"); - heightval = gst_structure_get_value (s, "height"); - if (G_VALUE_HOLDS (widthval, G_TYPE_INT)) { - gint width, height; - gint64 position; - - width = g_value_get_int (widthval); - height = g_value_get_int (heightval); - engine->media_width = width; - engine->media_height = height; - update_media_duration (ui->engine); - load_user_interface (ui); - - position = uri_is_unfinished_playback (engine, engine->uri); - if (position != -1) - seek (engine, position); - } - } - } + if (new == GST_STATE_PLAYING) { + if (!engine->has_started) { + gint64 position; + + position = uri_is_unfinished_playback (engine, engine->uri); + if (position != -1) { + seek (engine, position); + } + + update_controls (ui); + engine->has_started = TRUE; + } } break; @@ -249,9 +271,13 @@ engine_init (GstEngine * engine, GstElement * sink) { engine->media_width = -1; engine->media_height = -1; + engine->media_duration = -1; engine->direction_foward = TRUE; engine->prev_done = TRUE; engine->second = GST_SECOND; + engine->has_video = FALSE; + engine->has_audio = FALSE; + engine->has_started = FALSE; engine->player = gst_element_factory_make ("playbin2", "playbin2"); if (engine->player == NULL) { @@ -269,12 +295,12 @@ engine_init (GstEngine * engine, GstElement * sink) gboolean engine_load_uri (GstEngine * engine, gchar * uri) { - gint64 position; - engine->uri = uri; g_object_set (G_OBJECT (engine->player), "uri", uri, NULL); g_print ("Loading: %s\n", uri); + discover (engine, uri); + return TRUE; } @@ -359,7 +385,6 @@ change_state (GstEngine * engine, gchar * state) } else if (!g_strcmp0(state, "Paused")) { gst_element_set_state (engine->player, GST_STATE_PAUSED); engine->playing = FALSE; - engine->media_duration = -1; } else if (!g_strcmp0 (state, "Ready")) { gst_element_set_state (engine->player, GST_STATE_READY); engine->playing = FALSE; diff --git a/src/gst_engine.h b/src/gst_engine.h index 5d66b27..a0c71a9 100644 --- a/src/gst_engine.h +++ b/src/gst_engine.h @@ -28,6 +28,8 @@ G_BEGIN_DECLS typedef struct _GstEngine GstEngine; struct _GstEngine { gboolean playing, direction_foward, prev_done; + gboolean has_started; + gboolean has_video, has_audio; guint media_width, media_height; gint64 media_duration; diff --git a/src/snappy.c b/src/snappy.c index d4b6b23..0274f1f 100644 --- a/src/snappy.c +++ b/src/snappy.c @@ -162,6 +162,7 @@ main (int argc, char *argv[]) uri = g_strdup_printf ("file://%s", fileuri); engine_load_uri (engine, uri); interface_load_uri (ui, uri); + load_user_interface (ui); change_state (engine, "Paused"); change_state (engine, "Playing"); diff --git a/src/user_interface.c b/src/user_interface.c index 4b956eb..f73d35e 100644 --- a/src/user_interface.c +++ b/src/user_interface.c @@ -752,3 +752,10 @@ load_user_interface (UserInterface * ui) clutter_actor_show (ui->stage); } + +gboolean +update_controls (UserInterface * ui) +{ + progress_update_text (ui); + progress_update_seekbar (ui); +} diff --git a/src/user_interface.h b/src/user_interface.h index b9bdc7b..0cbb809 100644 --- a/src/user_interface.h +++ b/src/user_interface.h @@ -86,6 +86,7 @@ struct _UserInterface // Declaration of non-static functions gboolean interface_load_uri (UserInterface * ui, gchar * uri); void load_user_interface (UserInterface * ui); +gboolean update_controls (UserInterface * ui); G_END_DECLS #endif /* __USER_INTERFACE_H__ */ |