# HG changeset patch # User jakub.adam@ktknet.cz # Date 1294456904 0 # Node ID 55e30c0eca227b64734f2c231f36f8ae7bb60402 # Parent ea2a155b44391f8a6d2842880348f1262d5f27d5 Public API allowing plugins (including prpls) to get/set video capabilities where desired/appropriate. Fixes #13095. committer: John Bailey diff -r ea2a155b4439 -r 55e30c0eca22 libpurple/media-gst.h --- a/libpurple/media-gst.h Sat Jan 08 03:10:40 2011 +0000 +++ b/libpurple/media-gst.h Sat Jan 08 03:21:44 2011 +0000 @@ -159,6 +159,31 @@ PurpleMediaElementInfo *purple_media_manager_get_active_element( PurpleMediaManager *manager, PurpleMediaElementType type); +/** + * Reduces media formats supported by the video source to given set. + * + * Useful to force negotiation of smaller picture resolution more suitable for + * use with particular codec and communication protocol without rescaling. + * + * @param manager The media manager to set the media formats. + * @param caps Set of allowed media formats. + * + * @since 2.8.0 + */ +void purple_media_manager_set_video_caps(PurpleMediaManager *manager, + GstCaps *caps); + +/** + * Returns current set of media formats limiting the output from video source. + * + * @param manager The media manager to get the media formats from. + * + * @return @c GstCaps limiting the video source's formats. + * + * @since 2.8.0 + */ +GstCaps *purple_media_manager_get_video_caps(PurpleMediaManager *manager); + gchar *purple_media_element_info_get_id(PurpleMediaElementInfo *info); gchar *purple_media_element_info_get_name(PurpleMediaElementInfo *info); PurpleMediaElementType purple_media_element_info_get_element_type( diff -r ea2a155b4439 -r 55e30c0eca22 libpurple/mediamanager.c --- a/libpurple/mediamanager.c Sat Jan 08 03:10:40 2011 +0000 +++ b/libpurple/mediamanager.c Sat Jan 08 03:21:44 2011 +0000 @@ -420,7 +420,30 @@ #ifdef USE_GSTREAMER -static GstCaps * +void +purple_media_manager_set_video_caps(PurpleMediaManager *manager, GstCaps *caps) +{ +#ifdef USE_VV + if (manager->priv->video_caps) + gst_caps_unref(manager->priv->video_caps); + + manager->priv->video_caps = caps; + + if (manager->priv->pipeline && manager->priv->video_src) { + gchar *id = purple_media_element_info_get_id(manager->priv->video_src); + GstElement *src = gst_bin_get_by_name(GST_BIN(manager->priv->pipeline), id); + + if (src) { + GstElement *capsfilter = gst_bin_get_by_name(GST_BIN(src), "prpl_video_caps"); + g_object_set(G_OBJECT(capsfilter), "caps", caps, NULL); + } + + g_free(id); + } +#endif +} + +GstCaps * purple_media_manager_get_video_caps(PurpleMediaManager *manager) { #ifdef USE_VV