summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuis de Bethencourt <luis@debethencourt.com>2011-03-31 20:20:23 +0200
committerLuis de Bethencourt <luis@debethencourt.com>2011-04-01 12:57:25 +0200
commit93b614303d4911d6055ac27b0c3e8fe3bd5902d1 (patch)
tree8501cd760ec1960aa291a3ae7d6cea5ac4675f37
parent02b89c505b29b068460d657fbece900301707bd4 (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.ac6
-rw-r--r--src/Makefile.am4
-rw-r--r--src/gst_engine.c93
-rw-r--r--src/gst_engine.h2
-rw-r--r--src/snappy.c1
-rw-r--r--src/user_interface.c7
-rw-r--r--src/user_interface.h1
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__ */