diff options
Diffstat (limited to 'libpurple/mediamanager.c')
-rw-r--r-- | libpurple/mediamanager.c | 76 |
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); } } |