summaryrefslogtreecommitdiff
path: root/libpurple/mediamanager.c
diff options
context:
space:
mode:
Diffstat (limited to 'libpurple/mediamanager.c')
-rw-r--r--libpurple/mediamanager.c76
1 files changed, 58 insertions, 18 deletions
diff --git a/libpurple/mediamanager.c b/libpurple/mediamanager.c
index 1f49f2f941..e350734ae4 100644
--- a/libpurple/mediamanager.c
+++ b/libpurple/mediamanager.c
@@ -44,7 +44,12 @@
#else
#include <farstream/fs-element-added-notifier.h>
#endif
+
+#if GST_CHECK_VERSION(1,0,0)
+#include <gst/video/videooverlay.h>
+#else
#include <gst/interfaces/xoverlay.h>
+#endif
/** @copydoc _PurpleMediaManagerPrivate */
typedef struct _PurpleMediaManagerPrivate PurpleMediaManagerPrivate;
@@ -270,8 +275,11 @@ purple_media_manager_get_pipeline(PurpleMediaManager *manager)
gst_bus_add_signal_watch(GST_BUS(bus));
g_signal_connect(G_OBJECT(bus), "message",
G_CALLBACK(pipeline_bus_call), manager);
- gst_bus_set_sync_handler(bus,
- gst_bus_sync_signal_handler, NULL);
+#if GST_CHECK_VERSION(1,0,0)
+ gst_bus_set_sync_handler(bus, gst_bus_sync_signal_handler, NULL, NULL);
+#else
+ gst_bus_set_sync_handler(bus, gst_bus_sync_signal_handler, NULL);
+#endif
gst_object_unref(bus);
filename = g_build_filename(purple_user_dir(),
@@ -405,20 +413,31 @@ request_pad_unlinked_cb(GstPad *pad, GstPad *peer, gpointer user_data)
{
GstElement *parent = GST_ELEMENT_PARENT(pad);
GstIterator *iter;
+#if GST_CHECK_VERSION(1,0,0)
+ GValue tmp = G_VALUE_INIT;
+#endif
GstPad *remaining_pad;
GstIteratorResult result;
- gst_element_release_request_pad(GST_ELEMENT_PARENT(pad), pad);
+ gst_element_release_request_pad(parent, pad);
iter = gst_element_iterate_src_pads(parent);
+#if GST_CHECK_VERSION(1,0,0)
+ result = gst_iterator_next(iter, &tmp);
+#else
result = gst_iterator_next(iter, (gpointer)&remaining_pad);
+#endif
if (result == GST_ITERATOR_DONE) {
gst_element_set_locked_state(parent, TRUE);
gst_element_set_state(parent, GST_STATE_NULL);
gst_bin_remove(GST_BIN(GST_ELEMENT_PARENT(parent)), parent);
} else if (result == GST_ITERATOR_OK) {
+#if GST_CHECK_VERSION(1,0,0)
+ remaining_pad = g_value_get_object(&tmp);
+ g_value_reset(&tmp);
+#endif
gst_object_unref(remaining_pad);
}
@@ -456,7 +475,11 @@ purple_media_manager_get_video_caps(PurpleMediaManager *manager)
{
#ifdef USE_VV
if (manager->priv->video_caps == NULL)
+#if GST_CHECK_VERSION(1,0,0)
+ manager->priv->video_caps = gst_caps_from_string("video/x-raw,"
+#else
manager->priv->video_caps = gst_caps_from_string("video/x-raw-yuv,"
+#endif
"width=[250,352], height=[200,288], framerate=[1/1,20/1]");
return manager->priv->video_caps;
#else
@@ -539,7 +562,11 @@ purple_media_manager_get_element(PurpleMediaManager *manager,
g_free(id);
tee = gst_bin_get_by_name(GST_BIN(ret), "tee");
+#if GST_CHECK_VERSION(1,0,0)
+ pad = gst_element_get_request_pad(tee, "src_%u");
+#else
pad = gst_element_get_request_pad(tee, "src%d");
+#endif
gst_object_unref(tee);
ghost = gst_ghost_pad_new(NULL, pad);
gst_object_unref(pad);
@@ -730,9 +757,12 @@ window_id_cb(GstBus *bus, GstMessage *msg, PurpleMediaOutputWindow *ow)
{
GstElement *sink;
- if (GST_MESSAGE_TYPE(msg) != GST_MESSAGE_ELEMENT ||
- !gst_structure_has_name(msg->structure,
- "prepare-xwindow-id"))
+ if (GST_MESSAGE_TYPE(msg) != GST_MESSAGE_ELEMENT
+#if GST_CHECK_VERSION(1,0,0)
+ || !gst_is_video_overlay_prepare_window_handle_message(msg))
+#else
+ || !gst_structure_has_name(msg->structure, "prepare-xwindow-id"))
+#endif
return;
sink = GST_ELEMENT(GST_MESSAGE_SRC(msg));
@@ -746,8 +776,16 @@ window_id_cb(GstBus *bus, GstMessage *msg, PurpleMediaOutputWindow *ow)
| G_SIGNAL_MATCH_DATA, 0, 0, NULL,
window_id_cb, ow);
- gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(
- GST_MESSAGE_SRC(msg)), ow->window_id);
+#if GST_CHECK_VERSION(1,0,0)
+ gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(GST_MESSAGE_SRC(msg)),
+ ow->window_id);
+#elif GST_CHECK_VERSION(0,10,31)
+ gst_x_overlay_set_window_handle(GST_X_OVERLAY(GST_MESSAGE_SRC(msg)),
+ ow->window_id);
+#else
+ gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(GST_MESSAGE_SRC(msg)),
+ ow->window_id);
+#endif
}
#endif
@@ -772,17 +810,19 @@ purple_media_manager_create_output_window(PurpleMediaManager *manager,
(participant == ow->participant)) &&
!strcmp(session_id, ow->session_id)) {
GstBus *bus;
- GstElement *queue, *colorspace;
+ GstElement *queue, *convert;
GstElement *tee = purple_media_get_tee(media,
session_id, participant);
if (tee == NULL)
continue;
- queue = gst_element_factory_make(
- "queue", NULL);
- colorspace = gst_element_factory_make(
- "ffmpegcolorspace", NULL);
+ queue = gst_element_factory_make("queue", NULL);
+#if GST_CHECK_VERSION(1,0,0)
+ convert = gst_element_factory_make("videoconvert", NULL);
+#else
+ convert = gst_element_factory_make("ffmpegcolorspace", NULL);
+#endif
ow->sink = purple_media_manager_get_element(
manager, PURPLE_MEDIA_RECV_VIDEO,
ow->media, ow->session_id,
@@ -795,7 +835,7 @@ purple_media_manager_create_output_window(PurpleMediaManager *manager,
if (g_object_class_find_property(klass,
"sync"))
g_object_set(G_OBJECT(ow->sink),
- "sync", "FALSE", NULL);
+ "sync", FALSE, NULL);
if (g_object_class_find_property(klass,
"async"))
g_object_set(G_OBJECT(ow->sink),
@@ -803,7 +843,7 @@ purple_media_manager_create_output_window(PurpleMediaManager *manager,
}
gst_bin_add_many(GST_BIN(GST_ELEMENT_PARENT(tee)),
- queue, colorspace, ow->sink, NULL);
+ queue, convert, ow->sink, NULL);
bus = gst_pipeline_get_bus(GST_PIPELINE(
manager->priv->pipeline));
@@ -812,10 +852,10 @@ purple_media_manager_create_output_window(PurpleMediaManager *manager,
gst_object_unref(bus);
gst_element_set_state(ow->sink, GST_STATE_PLAYING);
- gst_element_set_state(colorspace, GST_STATE_PLAYING);
+ gst_element_set_state(convert, GST_STATE_PLAYING);
gst_element_set_state(queue, GST_STATE_PLAYING);
- gst_element_link(colorspace, ow->sink);
- gst_element_link(queue, colorspace);
+ gst_element_link(convert, ow->sink);
+ gst_element_link(queue, convert);
gst_element_link(tee, queue);
}
}