# HG changeset patch # User Paul Aurich # Date 1250178973 0 # Node ID 55549f101140f9a51f9f9036f4288c859a3cb48f # Parent e4b0bf56667ffb9761f9a280b675d103755be6c2# Parent 56770cc3287da3d37a1a9f7147731e992bf24473 merge of '777b9e651a771f8fac5e480e094c740ee495ca06' and 'de756219d6c0b43445596e8b6a82fa5b6edd18ff' diff -r e4b0bf56667f -r 55549f101140 libpurple/media.c --- a/libpurple/media.c Thu Aug 13 15:55:19 2009 +0000 +++ b/libpurple/media.c Thu Aug 13 15:56:13 2009 +0000 @@ -1906,8 +1906,8 @@ gst_element_add_pad(session->media->priv->confbin, ghost); } + gst_element_set_state(session->tee, GST_STATE_PLAYING); gst_element_link(session->src, session->media->priv->confbin); - gst_element_set_state(session->tee, GST_STATE_PLAYING); g_object_get(session->session, "sink-pad", &sinkpad, NULL); if (session->type & PURPLE_MEDIA_SEND_AUDIO) { @@ -1922,10 +1922,10 @@ g_free(name); gst_bin_add(GST_BIN(session->media->priv->confbin), volume); gst_bin_add(GST_BIN(session->media->priv->confbin), level); - gst_element_link(session->tee, volume); - gst_element_link(volume, level); gst_element_set_state(level, GST_STATE_PLAYING); gst_element_set_state(volume, GST_STATE_PLAYING); + gst_element_link(volume, level); + gst_element_link(session->tee, volume); srcpad = gst_element_get_static_pad(level, "src"); g_object_set(volume, "volume", input_volume, NULL); } else { @@ -2466,6 +2466,7 @@ gst_element_set_state(sink, GST_STATE_PLAYING); gst_element_set_state(stream->level, GST_STATE_PLAYING); gst_element_set_state(stream->volume, GST_STATE_PLAYING); + gst_element_set_state(queue, GST_STATE_PLAYING); gst_element_link(stream->level, sink); gst_element_link(stream->volume, stream->level); gst_element_link(queue, stream->volume); @@ -2477,11 +2478,11 @@ "fakesink", NULL); g_object_set(G_OBJECT(sink), "async", FALSE, NULL); gst_bin_add(GST_BIN(priv->confbin), sink); + gst_element_set_state(sink, GST_STATE_PLAYING); } stream->tee = gst_element_factory_make("tee", NULL); gst_bin_add_many(GST_BIN(priv->confbin), stream->src, stream->tee, NULL); - gst_element_set_state(sink, GST_STATE_PLAYING); gst_element_set_state(stream->tee, GST_STATE_PLAYING); gst_element_set_state(stream->src, GST_STATE_PLAYING); gst_element_link_many(stream->src, stream->tee, sink, NULL); @@ -2617,26 +2618,27 @@ 0, PURPLE_MEDIA_STATE_NEW, session->id, NULL); - session_type = purple_media_from_fs(media_type, - FS_DIRECTION_SEND); - src = purple_media_manager_get_element( - media->priv->manager, session_type, - media, session->id, who); - if (!GST_IS_ELEMENT(src)) { - purple_debug_error("media", - "Error creating src for session %s\n", - session->id); - purple_media_end(media, session->id, NULL); - return FALSE; + if (type_direction & FS_DIRECTION_SEND) { + session_type = purple_media_from_fs(media_type, + FS_DIRECTION_SEND); + src = purple_media_manager_get_element( + media->priv->manager, session_type, + media, session->id, who); + if (!GST_IS_ELEMENT(src)) { + purple_debug_error("media", + "Error creating src for session %s\n", + session->id); + purple_media_end(media, session->id, NULL); + return FALSE; + } + + purple_media_set_src(media, session->id, src); + gst_element_set_state(session->src, GST_STATE_PLAYING); + purple_media_manager_create_output_window( + media->priv->manager, + session->media, + session->id, NULL); } - - purple_media_set_src(media, session->id, src); - gst_element_set_state(session->src, GST_STATE_PLAYING); - - purple_media_manager_create_output_window( - media->priv->manager, - session->media, - session->id, NULL); } if (!(participant = purple_media_add_participant(media, who))) { @@ -3002,14 +3004,23 @@ if (session == NULL) return FALSE; - - g_object_get(session->session, "codecs-ready", &ret, NULL); + if (session->type & (PURPLE_MEDIA_SEND_AUDIO | + PURPLE_MEDIA_SEND_VIDEO)) + g_object_get(session->session, + "codecs-ready", &ret, NULL); + else + ret = TRUE; } else { GList *values = g_hash_table_get_values(media->priv->sessions); for (; values; values = g_list_delete_link(values, values)) { PurpleMediaSession *session = values->data; - g_object_get(session->session, - "codecs-ready", &ret, NULL); + if (session->type & (PURPLE_MEDIA_SEND_AUDIO | + PURPLE_MEDIA_SEND_VIDEO)) + g_object_get(session->session, + "codecs-ready", &ret, NULL); + else + ret = TRUE; + if (ret == FALSE) break; } diff -r e4b0bf56667f -r 55549f101140 libpurple/mediamanager.c --- a/libpurple/mediamanager.c Thu Aug 13 15:55:19 2009 +0000 +++ b/libpurple/mediamanager.c Thu Aug 13 15:56:13 2009 +0000 @@ -473,7 +473,6 @@ gst_element_link(tee, fakesink); ret = bin; - gst_element_set_locked_state(ret, TRUE); gst_object_ref(ret); gst_bin_add(GST_BIN(purple_media_manager_get_pipeline( manager)), ret); @@ -714,7 +713,7 @@ (participant == ow->participant)) && !strcmp(session_id, ow->session_id)) { GstBus *bus; - GstElement *queue; + GstElement *queue, *colorspace; GstElement *tee = purple_media_get_tee(media, session_id, participant); @@ -723,6 +722,8 @@ queue = gst_element_factory_make( "queue", NULL); + colorspace = gst_element_factory_make( + "ffmpegcolorspace", NULL); ow->sink = purple_media_manager_get_element( manager, PURPLE_MEDIA_RECV_VIDEO, ow->media, ow->session_id, @@ -743,7 +744,7 @@ } gst_bin_add_many(GST_BIN(GST_ELEMENT_PARENT(tee)), - queue, ow->sink, NULL); + queue, colorspace, ow->sink, NULL); bus = gst_pipeline_get_bus(GST_PIPELINE( manager->priv->pipeline)); @@ -752,8 +753,10 @@ 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(queue, GST_STATE_PLAYING); - gst_element_link(queue, ow->sink); + gst_element_link(colorspace, ow->sink); + gst_element_link(queue, colorspace); gst_element_link(tee, queue); } } @@ -822,8 +825,14 @@ GstPad *pad = gst_element_get_static_pad( output_window->sink, "sink"); GstPad *peer = gst_pad_get_peer(pad); - GstElement *queue = GST_ELEMENT_PARENT(peer); + GstElement *colorspace = GST_ELEMENT_PARENT(peer), *queue; gst_object_unref(pad); + gst_object_unref(peer); + pad = gst_element_get_static_pad(colorspace, "sink"); + peer = gst_pad_get_peer(pad); + queue = GST_ELEMENT_PARENT(peer); + gst_object_unref(pad); + gst_object_unref(peer); pad = gst_element_get_static_pad(queue, "sink"); peer = gst_pad_get_peer(pad); gst_object_unref(pad); @@ -832,6 +841,9 @@ gst_element_set_locked_state(queue, TRUE); gst_element_set_state(queue, GST_STATE_NULL); gst_bin_remove(GST_BIN(GST_ELEMENT_PARENT(queue)), queue); + gst_element_set_locked_state(colorspace, TRUE); + gst_element_set_state(colorspace, GST_STATE_NULL); + gst_bin_remove(GST_BIN(GST_ELEMENT_PARENT(colorspace)), colorspace); gst_element_set_locked_state(output_window->sink, TRUE); gst_element_set_state(output_window->sink, GST_STATE_NULL); gst_bin_remove(GST_BIN(GST_ELEMENT_PARENT(output_window->sink)), diff -r e4b0bf56667f -r 55549f101140 libpurple/protocols/jabber/jingle/rtp.c --- a/libpurple/protocols/jabber/jingle/rtp.c Thu Aug 13 15:55:19 2009 +0000 +++ b/libpurple/protocols/jabber/jingle/rtp.c Thu Aug 13 15:56:13 2009 +0000 @@ -589,8 +589,8 @@ if (!strcmp(senders, "both")) type = is_audio == TRUE ? PURPLE_MEDIA_AUDIO : PURPLE_MEDIA_VIDEO; - else if (!strcmp(senders, "initiator") - && jingle_session_is_initiator(session)) + else if ((strcmp(senders, "initiator") == 0) == + jingle_session_is_initiator(session)) type = is_audio == TRUE ? PURPLE_MEDIA_SEND_AUDIO : PURPLE_MEDIA_SEND_VIDEO; else diff -r e4b0bf56667f -r 55549f101140 pidgin/gtkmedia.c --- a/pidgin/gtkmedia.c Thu Aug 13 15:55:19 2009 +0000 +++ b/pidgin/gtkmedia.c Thu Aug 13 15:56:13 2009 +0000 @@ -882,6 +882,14 @@ GstPad *ghost; GstCaps *caps; +#ifdef _WIN32 + /* autovideosrc doesn't pick ksvideosrc for some reason */ + src = gst_element_factory_make("ksvideosrc", NULL); + if (src == NULL) + src = gst_element_factory_make("dshowvideosrc", NULL); + if (src == NULL) + src = gst_element_factory_make("autovideosrc", NULL); +#else src = gst_element_factory_make("gconfvideosrc", NULL); if (src == NULL) src = gst_element_factory_make("autovideosrc", NULL); @@ -889,10 +897,7 @@ src = gst_element_factory_make("v4l2src", NULL); if (src == NULL) src = gst_element_factory_make("v4lsrc", NULL); - if (src == NULL) - src = gst_element_factory_make("ksvideosrc", NULL); - if (src == NULL) - src = gst_element_factory_make("dshowvideosrc", NULL); +#endif if (src == NULL) { purple_debug_error("gtkmedia", "Unable to find a suitable " "element for the default video source.\n");