[chronojump] Update libcesarplayer with the OS X port
- From: Andoni Morales Alastruey <amorales src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [chronojump] Update libcesarplayer with the OS X port
- Date: Fri, 16 Nov 2012 16:46:21 +0000 (UTC)
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]