[chronojump] Update libcesarplayer with the OS X port



commit 644a68a2085bdb2e8822ce5923327b855ca6a79a
Author: Andoni Morales Alastruey <ylatuya gmail com>
Date:   Fri Sep 28 21:45:05 2012 +0200

    Update libcesarplayer with the OS X port

 CesarPlayer/CesarPlayer.dll.config.in            |    6 +-
 configure.ac                                     |   22 +++
 libcesarplayer/src/Makefile.am                   |    5 +
 libcesarplayer/src/bacon-video-widget-gst-0.10.c |   88 +++++++++----
 libcesarplayer/src/bacon-video-widget.h          |    4 +-
 libcesarplayer/src/baconvideowidget-marshal.c    |    2 +-
 libcesarplayer/src/gst-camera-capturer.c         |   59 +++++----
 libcesarplayer/src/gst-video-editor.c            |  155 +++++++++++++++++++---
 libcesarplayer/src/gst-video-editor.h            |   27 ++--
 libcesarplayer/src/video-utils.c                 |   24 ++++-
 libcesarplayer/src/video-utils.h                 |   21 +++
 11 files changed, 328 insertions(+), 85 deletions(-)
---
diff --git a/CesarPlayer/CesarPlayer.dll.config.in b/CesarPlayer/CesarPlayer.dll.config.in
index adc67da..f5b5f41 100644
--- a/CesarPlayer/CesarPlayer.dll.config.in
+++ b/CesarPlayer/CesarPlayer.dll.config.in
@@ -1,3 +1,7 @@
 <configuration>
-        <dllmap dll="libcesarplayer.dll" target="@expanded_libdir@/@PACKAGE@/libcesarplayer.so.0"/>
+        <dllmap dll="libcesarplayer.dll" target="libcesarplayer.0.dylib"/>
+        <dllmap os="windows" dll="libcesarplayer.dll" target="libcesarplayer-0.dll"/>
+        <dllmap dll="libgstreamer-0.10.dll" target="libgstreamer-0.10.0.dylib"/>
+        <dllmap os="linux" dll="libgstreamer-0.10.dll" target="libgstreamer-0.10.so.0"/>
+        <dllmap os="windows" dll="libgstreamer-0.10.dll" target="libgstreamer-0.10-0.dll"/>
 </configuration>
diff --git a/configure.ac b/configure.ac
index 193b209..d109e5d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -50,6 +50,28 @@ else
 	AC_SUBST(MSGFMT,[msgfmt])
 fi
 
+AC_MSG_CHECKING([for the OS type])
+ostype=""
+
+case "$host" in
+  *-*-mingw*|*-*-cygwin*)
+    ostype=Windows
+    AC_DEFINE(OSTYPE_WINDOWS)
+    ;;
+  *-*-darwin*)
+    AC_DEFINE(OSTYPE_OS_X)
+    ostype=OS_X
+    ;;
+  *-*-linux*)
+    AC_DEFINE(OSTYPE_LINUX)
+    ostype=Linux
+    ;;
+esac
+AM_CONDITIONAL(OSTYPE_WINDOWS, test x$ostype = xWindows)
+AM_CONDITIONAL(OSTYPE_OS_X, test x$ostype = xOS_X)
+AM_CONDITIONAL(OSTYPE_LINUX, test x$ostype = xLinux)
+AC_MSG_RESULT($ostype)
+
 
 AC_ARG_ENABLE(debug,
 	AC_HELP_STRING([--enable-debug],
diff --git a/libcesarplayer/src/Makefile.am b/libcesarplayer/src/Makefile.am
index 0bc96b0..88205b6 100644
--- a/libcesarplayer/src/Makefile.am
+++ b/libcesarplayer/src/Makefile.am
@@ -6,6 +6,11 @@ AM_CPPFLAGS = \
 	-DPACKAGE_DATA_DIR=\""$(datadir)"\" \
 	$(CESARPLAYER_CFLAGS)
 
+if OSTYPE_OS_X
+AM_CPPFLAGS += \
+	-x objective-c
+endif
+
 AM_CFLAGS =\
 	 -Wall\
 	 -g
diff --git a/libcesarplayer/src/bacon-video-widget-gst-0.10.c b/libcesarplayer/src/bacon-video-widget-gst-0.10.c
index 199ec0c..e8bbe24 100644
--- a/libcesarplayer/src/bacon-video-widget-gst-0.10.c
+++ b/libcesarplayer/src/bacon-video-widget-gst-0.10.c
@@ -59,14 +59,27 @@
 #include <math.h>
 
 /* gtk+/gnome */
-#ifdef WIN32
-#include <gdk/gdkwin32.h>
-#define DEFAULT_VIDEO_SINK "autovideosink"
-#else
+#include <gdk/gdk.h>
+#if defined (GDK_WINDOWING_X11)
 #include <gdk/gdkx.h>
-#define DEFAULT_VIDEO_SINK "gconfvideosink"
+#elif defined (GDK_WINDOWING_WIN32)
+#include <gdk/gdkwin32.h>
+#elif defined (GDK_WINDOWING_QUARTZ)
+#include <gdk/gdkquartz.h>
 #endif
 #include <gtk/gtk.h>
+
+
+#if defined(OSTYPE_WINDOWS)
+#define DEFAULT_VIDEO_SINK "autovideosink"
+#define BACKUP_VIDEO_SINK "autovideosink"
+#elif defined(OSTYPE_OS_X)
+#define DEFAULT_VIDEO_SINK "autovideosink"
+#define BACKUP_VIDEO_SINK "autovideosink"
+#elif defined(OSTYPE_LINUX)
+#define DEFAULT_VIDEO_SINK "gsettingsvideosink"
+#define BACKUP_VIDEO_SINK "autovideosink"
+#endif
 #include <gio/gio.h>
 #include <glib/gi18n.h>
 
@@ -142,6 +155,7 @@ struct BaconVideoWidgetPrivate
   char *mrl;
 
   GstElement *play;
+  GstElement *video_sink;
   GstXOverlay *xoverlay;        /* protect with lock */
   GstColorBalance *balance;     /* protect with lock */
   GstNavigation *navigation;    /* protect with lock */
@@ -530,6 +544,7 @@ bacon_video_widget_realize (GtkWidget * widget)
   bvw->priv->video_window = gdk_window_new (window,
       &attributes, attributes_mask);
   gdk_window_set_user_data (bvw->priv->video_window, widget);
+  gdk_window_ensure_native(bvw->priv->video_window);
 
   gdk_color_parse ("black", &colour);
   gdk_colormap_alloc_color (gtk_widget_get_colormap (widget),
@@ -651,13 +666,7 @@ bacon_video_widget_expose_event (GtkWidget * widget, GdkEventExpose * event)
 
 
   if (xoverlay != NULL && GST_IS_X_OVERLAY (xoverlay)) {
-#ifdef WIN32
-    gst_x_overlay_set_xwindow_id (bvw->priv->xoverlay,
-        GDK_WINDOW_HWND (bvw->priv->video_window));
-#else
-    gst_x_overlay_set_xwindow_id (bvw->priv->xoverlay,
-        GDK_WINDOW_XID (bvw->priv->video_window));
-#endif
+    gst_set_window_handle(xoverlay, bvw->priv->video_window);
   }
 
   /* Start with a nice black canvas */
@@ -3245,7 +3254,7 @@ bacon_video_widget_seek_to_next_frame (BaconVideoWidget * bvw, gfloat rate,
   g_return_val_if_fail (BACON_IS_VIDEO_WIDGET (bvw), FALSE);
   g_return_val_if_fail (GST_IS_ELEMENT (bvw->priv->play), FALSE);
 
-  gst_element_send_event(bvw->priv->play,
+  gst_element_send_event(bvw->priv->video_sink,
       gst_event_new_step (GST_FORMAT_BUFFERS, 1, 1.0, TRUE, FALSE));
 
   pos = bacon_video_widget_get_accurate_current_time (bvw);
@@ -4389,7 +4398,8 @@ static struct _metadata_map_info
   BVW_INFO_AUDIO_BITRATE, "audio-bitrate"}, {
   BVW_INFO_AUDIO_CODEC, "audio-codec"}, {
   BVW_INFO_AUDIO_SAMPLE_RATE, "samplerate"}, {
-  BVW_INFO_AUDIO_CHANNELS, "channels"}
+  BVW_INFO_AUDIO_CHANNELS, "channels"}, {
+  BVW_INFO_PAR, "pixel-aspect-ratio"}
 };
 
 static const gchar *
@@ -4627,6 +4637,37 @@ bacon_video_widget_get_metadata_string (BaconVideoWidget * bvw,
 }
 
 static void
+bacon_video_widget_get_metadata_double (BaconVideoWidget * bvw,
+    BvwMetadataType type, GValue * value)
+{
+  gdouble metadata_double = 0;
+
+  g_value_init (value, G_TYPE_DOUBLE);
+
+  if (bvw->priv->play == NULL) {
+    g_value_set_double (value, 0);
+    return;
+  }
+
+  switch (type) {
+    case BVW_INFO_PAR:
+    {
+      int movie_par_n = gst_value_get_fraction_numerator (bvw->priv->movie_par);
+      int movie_par_d = gst_value_get_fraction_denominator (bvw->priv->movie_par);
+      metadata_double = (gdouble) movie_par_n / (gdouble) movie_par_d;
+      break;
+    }
+    default:
+      g_assert_not_reached();
+  }
+
+  g_value_set_double (value, metadata_double);
+  GST_DEBUG ("%s = %f", get_metadata_type_name (type), metadata_double);
+
+  return;
+}
+
+static void
 bacon_video_widget_get_metadata_int (BaconVideoWidget * bvw,
     BvwMetadataType type, GValue * value)
 {
@@ -4919,6 +4960,8 @@ bacon_video_widget_get_metadata (BaconVideoWidget * bvw,
           g_value_take_object (value, pixbuf);
       }
     }
+    case BVW_INFO_PAR:
+      bacon_video_widget_get_metadata_double (bvw, type, value);
       break;
     default:
       g_return_if_reached ();
@@ -5188,7 +5231,6 @@ bvw_update_interface_implementations (BaconVideoWidget * bvw)
   GstXOverlay *old_xoverlay = bvw->priv->xoverlay;
   GstElement *video_sink = NULL;
   GstElement *element = NULL;
-  GstIteratorResult ires;
   GstIterator *iter;
 
   if (g_thread_self () != gui_thread) {
@@ -5260,7 +5302,7 @@ bvw_update_interface_implementations (BaconVideoWidget * bvw)
       GST_TYPE_COLOR_BALANCE);
   /* naively assume no resync */
   element = NULL;
-  ires = gst_iterator_fold (iter, (GstIteratorFoldFunction)
+  gst_iterator_fold (iter, (GstIteratorFoldFunction)
       find_colorbalance_element, NULL, &element);
   gst_iterator_free (iter);
 
@@ -5317,13 +5359,7 @@ bvw_element_msg_sync (GstBus * bus, GstMessage * msg, gpointer data)
     g_return_if_fail (bvw->priv->xoverlay != NULL);
     g_return_if_fail (bvw->priv->video_window != NULL);
 
-#ifdef WIN32
-    gst_x_overlay_set_xwindow_id (bvw->priv->xoverlay,
-        GDK_WINDOW_HWND (bvw->priv->video_window));
-#else
-    gst_x_overlay_set_xwindow_id (bvw->priv->xoverlay,
-        GDK_WINDOW_XID (bvw->priv->video_window));
-#endif
+  gst_set_window_handle(bvw->priv->xoverlay, bvw->priv->video_window);
 
   }
 }
@@ -5454,7 +5490,7 @@ bacon_video_widget_new (int width, int height, BvwUseType type, GError ** err)
       gst_element_set_state (video_sink, GST_STATE_NULL);
       gst_object_unref (video_sink);
       /* Try again with autovideosink */
-      video_sink = gst_element_factory_make ("autovideosink", "video-sink");
+      video_sink = gst_element_factory_make (BACKUP_VIDEO_SINK, "video-sink");
       gst_element_set_bus (video_sink, bvw->priv->bus);
       ret = gst_element_set_state (video_sink, GST_STATE_READY);
       if (ret == GST_STATE_CHANGE_FAILURE) {
@@ -5474,6 +5510,8 @@ bacon_video_widget_new (int width, int height, BvwUseType type, GError ** err)
         }
         goto sink_error;
       }
+    } else {
+      bvw->priv->video_sink = video_sink;
     }
   } else {
     g_set_error (err, BVW_ERROR, GST_ERROR_VIDEO_PLUGIN,
@@ -5608,7 +5646,7 @@ bacon_video_widget_new (int width, int height, BvwUseType type, GError ** err)
       G_CALLBACK (bvw_element_msg_sync), bvw);
 
   if (GST_IS_BIN (video_sink)) {
-    /* video sink bins like gconfvideosink might remove their children and
+    /* video sink bins like gsettingsvideosink might remove their children and
      * create new ones when set to NULL state, and they are currently set
      * to NULL state whenever playbin re-creates its internal video bin
      * (it sets all elements to NULL state before gst_bin_remove()ing them) */
diff --git a/libcesarplayer/src/bacon-video-widget.h b/libcesarplayer/src/bacon-video-widget.h
index 7f9e7a0..d2e5746 100644
--- a/libcesarplayer/src/bacon-video-widget.h
+++ b/libcesarplayer/src/bacon-video-widget.h
@@ -247,7 +247,9 @@ bacon_video_widget_error_quark (void)
        BVW_INFO_AUDIO_BITRATE,
        BVW_INFO_AUDIO_CODEC,
        BVW_INFO_AUDIO_SAMPLE_RATE,
-       BVW_INFO_AUDIO_CHANNELS
+       BVW_INFO_AUDIO_CHANNELS,
+       /* Added later */
+       BVW_INFO_PAR,
      } BvwMetadataType;
 
      EXPORT void bacon_video_widget_get_metadata (BaconVideoWidget * bvw,
diff --git a/libcesarplayer/src/baconvideowidget-marshal.c b/libcesarplayer/src/baconvideowidget-marshal.c
index 8d8fd6f..6b34127 100644
--- a/libcesarplayer/src/baconvideowidget-marshal.c
+++ b/libcesarplayer/src/baconvideowidget-marshal.c
@@ -8,7 +8,7 @@ G_BEGIN_DECLS
 
 #ifdef G_ENABLE_DEBUG
 #define g_marshal_value_peek_boolean(v)  g_value_get_boolean (v)
-#define g_marshal_value_peek_char(v)     g_value_get_char (v)
+#define g_marshal_value_peek_char(v)     g_value_get_schar (v)
 #define g_marshal_value_peek_uchar(v)    g_value_get_uchar (v)
 #define g_marshal_value_peek_int(v)      g_value_get_int (v)
 #define g_marshal_value_peek_uint(v)     g_value_get_uint (v)
diff --git a/libcesarplayer/src/gst-camera-capturer.c b/libcesarplayer/src/gst-camera-capturer.c
index d0f787e..0cee4dd 100644
--- a/libcesarplayer/src/gst-camera-capturer.c
+++ b/libcesarplayer/src/gst-camera-capturer.c
@@ -34,22 +34,32 @@
 #include "gstscreenshot.h"
 
 /*Default video source*/
-#ifdef WIN32
+#if defined(OSTYPE_WINDOWS)
 #define DVVIDEOSRC "dshowvideosrc"
 #define RAWVIDEOSRC "dshowvideosrc"
 #define AUDIOSRC "dshowaudiosrc"
-#else
+#elif defined(OSTYPE_OS_X)
+#define DVVIDEOSRC "osxvideosrc"
+#define RAWVIDEOSRC "osxvideosrc"
+#define AUDIOSRC "osxaudiosrc"
+#elif defined(OSTYPE_LINUX)
 #define DVVIDEOSRC "dv1394src"
-#define RAWVIDEOSRC "gconfvideosrc"
-#define AUDIOSRC "gconfaudiosrc"
+#define RAWVIDEOSRC "gsettingsvideosrc"
+#define AUDIOSRC "gsettingsaudiosrc"
+#define RAWVIDEOSRC_GCONF "gconfvideosrc"
+#define AUDIOSRC_GCONF "gconfaudiosrc"
 #endif
 
 /* gtk+/gnome */
-#ifdef WIN32
-#include <gdk/gdkwin32.h>
-#else
+#include <gdk/gdk.h>
+#if defined (GDK_WINDOWING_X11)
 #include <gdk/gdkx.h>
+#elif defined (GDK_WINDOWING_WIN32)
+#include <gdk/gdkwin32.h>
+#elif defined (GDK_WINDOWING_QUARTZ)
+#include <gdk/gdkquartz.h>
 #endif
+#include <gtk/gtk.h>
 
 #ifdef WIN32
 #define DEFAULT_SOURCE_TYPE  GST_CAMERA_CAPTURE_SOURCE_TYPE_DSHOW
@@ -651,13 +661,7 @@ gst_camera_capturer_expose_event (GtkWidget * widget, GdkEventExpose * event)
 
   if (xoverlay != NULL && GST_IS_X_OVERLAY (xoverlay)) {
     gdk_window_show (gcc->priv->video_window);
-#ifdef WIN32
-    gst_x_overlay_set_xwindow_id (gcc->priv->xoverlay,
-        GDK_WINDOW_HWND (gcc->priv->video_window));
-#else
-    gst_x_overlay_set_xwindow_id (gcc->priv->xoverlay,
-        GDK_WINDOW_XID (gcc->priv->video_window));
-#endif
+    gst_set_window_handle (gcc->priv->xoverlay,gcc->priv->video_window);
   }
 
   /* Start with a nice black canvas */
@@ -1063,9 +1067,19 @@ gst_camera_capturer_set_source (GstCameraCapturer * gcc,
     case GST_CAMERA_CAPTURE_SOURCE_TYPE_RAW:
     default:
     {
+      gchar *videosrc = RAWVIDEOSRC;
+
+#if defined(OSTYPE_WINDOWS)
+      GstElementFactory *fact = gst_element_factory_find(RAWVIDEOSRC);
+      if (fact == NULL)
+        videosrc = RAWVIDEOSRC_GCONF;
+      else
+        gst_object_unref (fact);
+#endif
+
       gchar *bin =
           g_strdup_printf ("%s name=device_source ! videorate ! "
-          "ffmpegcolorspace ! videoscale", RAWVIDEOSRC);
+          "ffmpegcolorspace ! videoscale", videosrc);
       gcc->priv->videosrc = gst_parse_bin_from_description (bin, TRUE, err);
       gcc->priv->device_source =
           gst_bin_get_by_name (GST_BIN (gcc->priv->videosrc), "device_source");
@@ -1246,7 +1260,8 @@ gst_camera_capturer_set_video_encoder (GstCameraCapturer * gcc,
     case VIDEO_ENCODER_H264:
       gcc->priv->videoenc =
           gst_element_factory_make ("x264enc", "video-encoder");
-      g_object_set (gcc->priv->videoenc, "key-int-max", 25, "pass", 17, NULL);
+      g_object_set (gcc->priv->videoenc, "key-int-max", 25, "pass", 17,
+          "speed-preset", 3, NULL);
       name = "X264 video encoder";
       break;
 
@@ -1262,7 +1277,7 @@ gst_camera_capturer_set_video_encoder (GstCameraCapturer * gcc,
     default:
       gcc->priv->videoenc =
           gst_element_factory_make ("vp8enc", "video-encoder");
-      g_object_set (gcc->priv->videoenc, "speed", 2,
+      g_object_set (gcc->priv->videoenc, "speed", 2, "threads", 8,
           "max-keyframe-distance", 25, NULL);
       name = "VP8 video encoder";
       break;
@@ -1551,13 +1566,7 @@ gcc_element_msg_sync (GstBus * bus, GstMessage * msg, gpointer data)
     g_return_if_fail (gcc->priv->xoverlay != NULL);
     g_return_if_fail (gcc->priv->video_window != NULL);
 
-#ifdef WIN32
-    gst_x_overlay_set_xwindow_id (gcc->priv->xoverlay,
-        GDK_WINDOW_HWND (gcc->priv->video_window));
-#else
-    gst_x_overlay_set_xwindow_id (gcc->priv->xoverlay,
-        GDK_WINDOW_XID (gcc->priv->video_window));
-#endif
+    gst_set_window_handle (gcc->priv->xoverlay,gcc->priv->video_window);
   }
 }
 
@@ -1677,7 +1686,7 @@ destroy_pixbuf (guchar * pix, gpointer data)
 void
 gst_camera_capturer_unref_pixbuf (GdkPixbuf * pixbuf)
 {
-  gdk_pixbuf_unref (pixbuf);
+  g_object_unref (pixbuf);
 }
 
 GdkPixbuf *
diff --git a/libcesarplayer/src/gst-video-editor.c b/libcesarplayer/src/gst-video-editor.c
index 922ed83..7dea513 100644
--- a/libcesarplayer/src/gst-video-editor.c
+++ b/libcesarplayer/src/gst-video-editor.c
@@ -56,7 +56,8 @@ enum
   PROP_AUDIO_BITRATE,
   PROP_HEIGHT,
   PROP_WIDTH,
-  PROP_OUTPUT_FILE
+  PROP_OUTPUT_FILE,
+  PROP_TITLE_SIZE
 };
 
 struct GstVideoEditorPrivate
@@ -77,6 +78,7 @@ struct GstVideoEditorPrivate
   gint video_bitrate;
   gint width;
   gint height;
+  gint title_size;
 
   /* Bins */
   GstElement *main_pipeline;
@@ -129,6 +131,7 @@ static void gst_video_editor_set_property (GObject * object,
     guint property_id, const GValue * value, GParamSpec * pspec);
 static gboolean gve_query_timeout (GstVideoEditor * gve);
 static void gve_apply_new_caps (GstVideoEditor * gve);
+static void gve_apply_title_size (GstVideoEditor * gve);
 static void gve_rewrite_headers (GstVideoEditor * gve);
 G_DEFINE_TYPE (GstVideoEditor, gst_video_editor, G_TYPE_OBJECT);
 
@@ -154,6 +157,7 @@ gst_video_editor_init (GstVideoEditor * object)
   priv->video_bitrate = 5000;
   priv->height = 540;
   priv->width = 720;
+  priv->title_size = 20;
   priv->title_enabled = TRUE;
   priv->audio_enabled = TRUE;
 
@@ -239,6 +243,10 @@ gst_video_editor_class_init (GstVideoEditorClass * klass)
       g_param_spec_int ("width", NULL, NULL, 320,
           1920, 720, G_PARAM_READWRITE));
 
+  g_object_class_install_property (object_class, PROP_TITLE_SIZE,
+      g_param_spec_int ("title-size", NULL, NULL,
+          10, 100, 20, G_PARAM_READWRITE));
+
   g_object_class_install_property (object_class, PROP_OUTPUT_FILE,
       g_param_spec_string ("output_file", NULL, NULL, "", G_PARAM_READWRITE));
 
@@ -324,7 +332,7 @@ gst_video_editor_set_video_bit_rate (GstVideoEditor * gve, gint bitrate)
       g_object_set (gve->priv->video_encoder, "bitrate", bitrate, NULL);
     else
       g_object_set (gve->priv->video_encoder, "bitrate", bitrate * 1000, NULL);
-    GST_INFO ("Encoding video bitrate changed to :%d (kbps)\n", bitrate);
+    GST_INFO_OBJECT (gve, "Encoding video bitrate changed to :%d (kbps)\n", bitrate);
   }
 }
 
@@ -337,7 +345,7 @@ gst_video_editor_set_audio_bit_rate (GstVideoEditor * gve, gint bitrate)
   gst_element_get_state (gve->priv->audioencoder, &cur_state, NULL, 0);
   if (cur_state <= GST_STATE_READY) {
     g_object_set (gve->priv->audioencoder, "bitrate", bitrate, NULL);
-    GST_INFO ("Encoding audio bitrate changed to :%d (bps)\n", bitrate);
+    GST_INFO_OBJECT (gve, "Encoding audio bitrate changed to :%d (bps)\n", bitrate);
   }
 }
 
@@ -356,6 +364,13 @@ gst_video_editor_set_height (GstVideoEditor * gve, gint height)
 }
 
 static void
+gst_video_editor_set_title_size (GstVideoEditor * gve, gint size)
+{
+  gve->priv->title_size = size;
+  gve_apply_title_size (gve);
+}
+
+static void
 gst_video_editor_set_output_file (GstVideoEditor * gve, const char *output_file)
 {
   GstState cur_state;
@@ -366,7 +381,7 @@ gst_video_editor_set_output_file (GstVideoEditor * gve, const char *output_file)
     gst_element_set_state (gve->priv->file_sink, GST_STATE_NULL);
     g_object_set (gve->priv->file_sink, "location", gve->priv->output_file,
         NULL);
-    GST_INFO ("Ouput File changed to :%s\n", gve->priv->output_file);
+    GST_INFO_OBJECT (gve, "Ouput File changed to :%s\n", gve->priv->output_file);
   }
 }
 
@@ -397,6 +412,9 @@ gst_video_editor_set_property (GObject * object, guint property_id,
     case PROP_HEIGHT:
       gst_video_editor_set_height (gve, g_value_get_int (value));
       break;
+    case PROP_TITLE_SIZE:
+      gst_video_editor_set_title_size (gve, g_value_get_int (value));
+      break;
     case PROP_OUTPUT_FILE:
       gst_video_editor_set_output_file (gve, g_value_get_string (value));
       break;
@@ -471,7 +489,6 @@ static void
 gve_apply_new_caps (GstVideoEditor * gve)
 {
   GstCaps *caps;
-  gchar *font;
 
   caps = gst_caps_new_simple ("video/x-raw-yuv",
       "width", G_TYPE_INT, gve->priv->width,
@@ -479,13 +496,19 @@ gve_apply_new_caps (GstVideoEditor * gve)
       "pixel-aspect-ratio", GST_TYPE_FRACTION, 1, 1,
       "framerate", GST_TYPE_FRACTION, 25, 1, NULL);
 
+  GST_INFO_OBJECT(gve, "Changed caps: %s", gst_caps_to_string(caps));
   g_object_set (G_OBJECT (gve->priv->capsfilter), "caps", caps, NULL);
-  font =
-      g_strdup_printf ("sans bold %d",
-      (int) (gve->priv->height * FONT_SIZE_FACTOR));
+  gst_caps_unref (caps);
+}
+
+static void
+gve_apply_title_size (GstVideoEditor * gve)
+{
+  gchar *font;
+
+  font = g_strdup_printf ("sans bold %d", gve->priv->title_size);
   g_object_set (G_OBJECT (gve->priv->textoverlay), "font-desc", font, NULL);
   g_free (font);
-  gst_caps_unref (caps);
 }
 
 static void
@@ -833,15 +856,17 @@ gst_video_editor_add_segment (GstVideoEditor * gve, gchar * file,
     return;
   }
 
-  final_duration = GST_MSECOND * duration / rate;
+  start = GST_MSECOND * start;
+  duration = GST_MSECOND * duration;
+  final_duration = duration / rate;
 
   /* Video */
   filter = gst_caps_from_string ("video/x-raw-rgb;video/x-raw-yuv");
   element_name = g_strdup_printf ("gnlvideofilesource%d", gve->priv->segments);
   gnl_filesource = gst_element_factory_make ("gnlfilesource", element_name);
   g_object_set (G_OBJECT (gnl_filesource), "location", file,
-      "media-start", GST_MSECOND * start,
-      "media-duration", GST_MSECOND * duration,
+      "media-start", start,
+      "media-duration", duration,
       "start", gve->priv->duration,
       "duration", final_duration, "caps", filter, NULL);
   if (gve->priv->segments == 0) {
@@ -870,26 +895,107 @@ gst_video_editor_add_segment (GstVideoEditor * gve, gchar * file,
   }
   filter = gst_caps_from_string ("audio/x-raw-float;audio/x-raw-int");
   g_object_set (G_OBJECT (gnl_filesource),
-      "media-start", GST_MSECOND * start,
-      "media-duration", GST_MSECOND * duration,
+      "media-start", start,
+      "media-duration", duration,
       "start", gve->priv->duration,
       "duration", final_duration, "caps", filter, NULL);
   gst_bin_add (GST_BIN (gve->priv->gnl_audio_composition), gnl_filesource);
   gve->priv->gnl_audio_filesources =
       g_list_append (gve->priv->gnl_audio_filesources, gnl_filesource);
 
+  GST_INFO ("New segment: start={%" GST_TIME_FORMAT "} duration={%"
+      GST_TIME_FORMAT "} ", GST_TIME_ARGS (gve->priv->duration),
+      GST_TIME_ARGS (final_duration));
+
   gve->priv->duration += final_duration;
   gve->priv->segments++;
 
   gve->priv->titles = g_list_append (gve->priv->titles, title);
   gve->priv->stop_times[gve->priv->segments - 1] = gve->priv->duration;
 
-  GST_INFO ("New segment: start={%" GST_TIME_FORMAT "} duration={%"
-      GST_TIME_FORMAT "} ", GST_TIME_ARGS (start * GST_MSECOND),
-      GST_TIME_ARGS (duration * GST_MSECOND));
   g_free (element_name);
 }
 
+
+void
+gst_video_editor_add_image_segment (GstVideoEditor * gve, gchar * file,
+    guint64 start, gint64 duration, gchar * title)
+{
+  GstState cur_state;
+  GstElement *gnl_filesource = NULL;
+  GstElement *imagesourcebin = NULL;
+  GstElement *filesource = NULL;
+  GstElement *decoder = NULL;
+  GstElement *colorspace = NULL;
+  GstElement *imagefreeze = NULL;
+  GstElement *audiotestsrc = NULL;
+  GstCaps *filter = NULL;
+  gchar *element_name = NULL;
+  gchar *desc = NULL;
+
+  g_return_if_fail (GST_IS_VIDEO_EDITOR (gve));
+
+  gst_element_get_state (gve->priv->main_pipeline, &cur_state, NULL, 0);
+  if (cur_state > GST_STATE_READY) {
+    GST_WARNING ("Segments can only be added for a state <= GST_STATE_READY");
+    return;
+  }
+
+  duration = duration * GST_MSECOND;
+  start = start * GST_MSECOND;
+
+  /* Video */
+  /* gnlsource */
+  filter = gst_caps_from_string ("video/x-raw-rgb;video/x-raw-yuv");
+  element_name = g_strdup_printf ("gnlvideofilesource%d", gve->priv->segments);
+  gnl_filesource = gst_element_factory_make ("gnlsource", element_name);
+  g_object_set (G_OBJECT (gnl_filesource),
+      "media-start", start,
+      "media-duration", duration,
+      "start", gve->priv->duration,
+      "duration", duration, "caps", filter, NULL);
+  g_free(element_name);
+  /* filesrc ! pngdec ! ffmpegcolorspace ! imagefreeze */
+  desc = g_strdup_printf("filesrc location=%s ! pngdec ! videoscale ! ffmpegcolorspace ! video/x-raw-rgb, pixel-aspect-ratio=1/1 ! imagefreeze  ", file);
+  imagesourcebin = gst_parse_bin_from_description(desc, TRUE, NULL);
+  g_free(desc);
+  gst_bin_add (GST_BIN (gnl_filesource), imagesourcebin);
+  gst_bin_add (GST_BIN (gve->priv->gnl_video_composition), gnl_filesource);
+  gve->priv->gnl_video_filesources =
+      g_list_append (gve->priv->gnl_video_filesources, gnl_filesource);
+
+  /* Audio */
+  element_name =
+      g_strdup_printf ("gnlaudiofakesource%d", gve->priv->segments);
+  gnl_filesource = gst_element_factory_make ("gnlsource", element_name);
+  g_free (element_name);
+  element_name = g_strdup_printf ("audiotestsource%d", gve->priv->segments);
+  audiotestsrc = gst_element_factory_make ("audiotestsrc", element_name);
+  g_free (element_name);
+  g_object_set (G_OBJECT (audiotestsrc), "volume", (double) 0, NULL);
+  gst_bin_add (GST_BIN (gnl_filesource), audiotestsrc);
+  filter = gst_caps_from_string ("audio/x-raw-float;audio/x-raw-int");
+  g_object_set (G_OBJECT (gnl_filesource),
+      "media-start", start,
+      "media-duration", duration,
+      "start", gve->priv->duration,
+      "duration", duration, "caps", filter, NULL);
+  gst_bin_add (GST_BIN (gve->priv->gnl_audio_composition), gnl_filesource);
+  gve->priv->gnl_audio_filesources =
+      g_list_append (gve->priv->gnl_audio_filesources, gnl_filesource);
+
+  GST_INFO ("New segment: start={%" GST_TIME_FORMAT "} duration={%"
+      GST_TIME_FORMAT "} ", GST_TIME_ARGS (gve->priv->duration),
+      GST_TIME_ARGS (duration));
+
+  gve->priv->duration += duration;
+  gve->priv->segments++;
+
+  gve->priv->titles = g_list_append (gve->priv->titles, title);
+  gve->priv->stop_times[gve->priv->segments - 1] = gve->priv->duration;
+
+}
+
 void
 gst_video_editor_clear_segments_list (GstVideoEditor * gve)
 {
@@ -897,6 +1003,8 @@ gst_video_editor_clear_segments_list (GstVideoEditor * gve)
 
   g_return_if_fail (GST_IS_VIDEO_EDITOR (gve));
 
+  GST_INFO_OBJECT (gve, "Clearing list of segments");
+
   gst_video_editor_cancel (gve);
 
   tmp = gve->priv->gnl_video_filesources;
@@ -955,7 +1063,8 @@ gst_video_editor_set_video_encoder (GstVideoEditor * gve, gchar ** err,
     case VIDEO_ENCODER_H264:
       encoder_name = "x264enc";
       encoder = gst_element_factory_make (encoder_name, encoder_name);
-      g_object_set (G_OBJECT (encoder), "pass", 17, NULL);      //Variable Bitrate-Pass 1
+      g_object_set (G_OBJECT (encoder), "pass", 17, NULL);       //Variable Bitrate-Pass 1
+      g_object_set (G_OBJECT (encoder), "speed-preset", 4, NULL);//"Faster" preset
       break;
     case VIDEO_ENCODER_MPEG4:
       encoder_name = "xvidenc";
@@ -980,12 +1089,16 @@ gst_video_editor_set_video_encoder (GstVideoEditor * gve, gchar ** err,
     case VIDEO_ENCODER_VP8:
       encoder_name = "vp8enc";
       encoder = gst_element_factory_make (encoder_name, encoder_name);
+      g_object_set (G_OBJECT (encoder), "speed", 1, NULL);
+      g_object_set (G_OBJECT (encoder), "threads", 4, NULL);
       break;
   }
 
   if (!encoder)
     goto no_encoder;
 
+  GST_INFO_OBJECT(gve, "Changing video encoder: %s", encoder_name);
+
   if (!g_strcmp0
       (gst_element_get_name (gve->priv->video_encoder), encoder_name))
     goto same_encoder;
@@ -1095,6 +1208,8 @@ gst_video_editor_set_audio_encoder (GstVideoEditor * gve, gchar ** err,
   if (!encoder)
     goto no_encoder;
 
+  GST_INFO_OBJECT(gve, "Changing audio encoder: %s", encoder_name);
+
   if (!g_strcmp0 (gst_element_get_name (gve->priv->audioencoder), encoder_name))
     goto same_encoder;
 
@@ -1204,6 +1319,8 @@ gst_video_editor_set_video_muxer (GstVideoEditor * gve, gchar ** err,
   if (!muxer)
     goto no_muxer;
 
+  GST_INFO_OBJECT(gve, "Changing muxer: %s", muxer_name);
+
   if (!g_strcmp0 (gst_element_get_name (gve->priv->muxer), muxer_name))
     goto same_muxer;
 
@@ -1253,6 +1370,7 @@ gst_video_editor_start (GstVideoEditor * gve)
 {
   g_return_if_fail (GST_IS_VIDEO_EDITOR (gve));
 
+  GST_INFO_OBJECT(gve, "Starting");
   gst_element_set_state (gve->priv->main_pipeline, GST_STATE_PLAYING);
   g_signal_emit (gve, gve_signals[SIGNAL_PERCENT_COMPLETED], 0, (gfloat) 0);
 }
@@ -1262,6 +1380,7 @@ gst_video_editor_cancel (GstVideoEditor * gve)
 {
   g_return_if_fail (GST_IS_VIDEO_EDITOR (gve));
 
+  GST_INFO_OBJECT(gve, "Cancelling");
   if (gve->priv->update_id > 0) {
     g_source_remove (gve->priv->update_id);
     gve->priv->update_id = 0;
diff --git a/libcesarplayer/src/gst-video-editor.h b/libcesarplayer/src/gst-video-editor.h
index 85d7819..e8f32f9 100644
--- a/libcesarplayer/src/gst-video-editor.h
+++ b/libcesarplayer/src/gst-video-editor.h
@@ -32,6 +32,7 @@
 
 #include <glib-object.h>
 #include <gtk/gtk.h>
+#include <gdk/gdk.h>
 
 #include "common.h"
 
@@ -62,24 +63,24 @@ struct _GstVideoEditor
   GstVideoEditorPrivate *priv;
 };
 
-EXPORT GType
-gst_video_editor_get_type (void)
-    G_GNUC_CONST;
+EXPORT GType gst_video_editor_get_type (void) G_GNUC_CONST;
 
-     EXPORT void gst_video_editor_init_backend (int *argc, char ***argv);
-     EXPORT GstVideoEditor *gst_video_editor_new (GError ** err);
-     EXPORT void gst_video_editor_start (GstVideoEditor * gve);
-     EXPORT void gst_video_editor_cancel (GstVideoEditor * gve);
-     EXPORT void gst_video_editor_set_video_encoder (GstVideoEditor * gve,
+
+EXPORT void gst_video_editor_init_backend (int *argc, char ***argv);
+EXPORT GstVideoEditor *gst_video_editor_new (GError ** err);
+EXPORT void gst_video_editor_start (GstVideoEditor * gve);
+EXPORT void gst_video_editor_cancel (GstVideoEditor * gve);
+EXPORT void gst_video_editor_set_video_encoder (GstVideoEditor * gve,
     gchar ** err, VideoEncoderType codec);
-     EXPORT void gst_video_editor_set_audio_encoder (GstVideoEditor * gve,
+EXPORT void gst_video_editor_set_audio_encoder (GstVideoEditor * gve,
     gchar ** err, AudioEncoderType codec);
-     EXPORT void gst_video_editor_set_video_muxer (GstVideoEditor * gve,
+EXPORT void gst_video_editor_set_video_muxer (GstVideoEditor * gve,
     gchar ** err, VideoMuxerType codec);
-     EXPORT void gst_video_editor_clear_segments_list (GstVideoEditor * gve);
-     EXPORT void gst_video_editor_add_segment (GstVideoEditor * gve,
+EXPORT void gst_video_editor_clear_segments_list (GstVideoEditor * gve);
+EXPORT void gst_video_editor_add_segment (GstVideoEditor * gve,
     gchar * file, gint64 start,
     gint64 duration, gdouble rate, gchar * title, gboolean hasAudio);
-
+EXPORT void gst_video_editor_add_image_segment (GstVideoEditor * gve, gchar * file,
+    guint64 start, gint64 duration, gchar * title);
 G_END_DECLS
 #endif /* _GST_VIDEO_EDITOR_H_ */
diff --git a/libcesarplayer/src/video-utils.c b/libcesarplayer/src/video-utils.c
index ef8d619..d6fc907 100644
--- a/libcesarplayer/src/video-utils.c
+++ b/libcesarplayer/src/video-utils.c
@@ -5,7 +5,7 @@
 #include <glib/gi18n.h>
 #include <libintl.h>
 
-#include <gdk/gdk.h>
+#include <gst/gst.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <string.h>
@@ -234,3 +234,25 @@ totem_ratio_fits_screen (GdkWindow * video_window, int video_width,
 
   return TRUE;
 }
+
+void
+gst_set_window_handle(GstXOverlay *xoverlay, GdkWindow *window)
+{
+  guintptr window_handle;
+
+  /* Retrieve window handler from GDK */
+#if defined (GDK_WINDOWING_WIN32)
+  window_handle = (guintptr)GDK_WINDOW_HWND (window);
+#elif defined (GDK_WINDOWING_QUARTZ)
+  window_handle = gdk_quartz_window_get_nsview (window);
+#elif defined (GDK_WINDOWING_X11)
+  window_handle = GDK_WINDOW_XID (window);
+#endif
+  gst_x_overlay_set_window_handle (xoverlay, window_handle);
+}
+
+void
+init_backend (int argc, char **argv)
+{
+  gst_init(&argc, &argv);
+}
diff --git a/libcesarplayer/src/video-utils.h b/libcesarplayer/src/video-utils.h
index db17113..def2d38 100644
--- a/libcesarplayer/src/video-utils.h
+++ b/libcesarplayer/src/video-utils.h
@@ -1,7 +1,23 @@
 
+#include <gst/gst.h>
+#include <gst/interfaces/xoverlay.h>
 #include <gdk/gdk.h>
+#if defined (GDK_WINDOWING_X11)
+#include <gdk/gdkx.h>
+#elif defined (GDK_WINDOWING_WIN32)
+#include <gdk/gdkwin32.h>
+#elif defined (GDK_WINDOWING_QUARTZ)
+#include <gdk/gdkquartz.h>
+#endif
 #include <gtk/gtk.h>
 
+
+#ifdef WIN32
+#define EXPORT __declspec (dllexport)
+#else
+#define EXPORT
+#endif
+
 #define TOTEM_OBJECT_HAS_SIGNAL(obj, name) (g_signal_lookup (name, g_type_from_name (G_OBJECT_TYPE_NAME (obj))) != 0)
 
 void totem_gdk_window_set_invisible_cursor (GdkWindow * window);
@@ -17,3 +33,8 @@ void totem_widget_set_preferred_size (GtkWidget * widget, gint width,
     gint height);
 gboolean totem_ratio_fits_screen (GdkWindow * window, int video_width,
     int video_height, gfloat ratio);
+
+EXPORT void init_backend (int argc, char **argv);
+EXPORT void gst_set_window_handle (GstXOverlay *overlay, GdkWindow *window);
+
+



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]