in prpl/chat.c [567:641]
static void share_screen(gpointer _chat, PurpleMediaElementInfo *info)
{
struct chime_chat *chat = _chat;
chat->share_select_ui = NULL;
if (!info)
return;
/* Stop receiving so we can send */
on_call_presenter(chat->call, NULL, chat);
const gchar *name = _("Sharing screen");
PurpleMediaManager *mgr = purple_media_manager_get();
chat->share_media = purple_media_manager_create_media(purple_media_manager_get(),
chat->conv->account,
"fsrawconference",
name,
TRUE);
if (!chat->share_media) {
/* XX: Report error, but not with purple_media_error()! */
return;
}
g_object_set_data_full(G_OBJECT(chat->share_media), "src-element", info, g_object_unref);
g_signal_connect(chat->share_media, "state-changed", G_CALLBACK(share_media_changed), chat);
if (!purple_media_add_stream(chat->share_media, "chime", name,
PURPLE_MEDIA_SEND_VIDEO, TRUE,
"app", 0, NULL)) {
purple_media_error(chat->share_media, _("Error adding media stream\n"));
purple_media_end(chat->share_media, NULL, NULL);
chat->share_media = NULL;
return;
}
gchar *sinkname = g_strdup_printf("chime_screen_sink_%p", chat->call);
gchar *sinkpipe = g_strdup_printf("videorate drop-only=1 max-rate=3 ! videoconvert ! vp8enc min-quantizer=15 max-quantizer=25 target-bitrate=256000 deadline=1 ! appsink name=%s async=false", sinkname);
PurpleMediaCandidate *cand =
purple_media_candidate_new(NULL, 1,
PURPLE_MEDIA_CANDIDATE_TYPE_HOST,
PURPLE_MEDIA_NETWORK_PROTOCOL_UDP,
sinkpipe, 16000);
g_free(sinkpipe);
GList *cands = g_list_append (NULL, cand);
purple_media_add_remote_candidates(chat->share_media, "chime", name, cands);
purple_media_candidate_list_free(cands);
GList *codecs = g_list_append(NULL,
purple_media_codec_new(97, "video/x-raw", PURPLE_MEDIA_VIDEO, 0));
if (!purple_media_set_remote_codecs(chat->share_media, "chime", name, codecs)) {
purple_media_codec_list_free(codecs);
purple_media_error(chat->share_media, _("Error setting video codec\n"));
purple_media_end(chat->share_media, NULL, NULL);
chat->share_media = NULL;
return;
}
purple_media_codec_list_free(codecs);
GstElement *pipeline = purple_media_manager_get_pipeline(mgr);
GstElement *appsink = gst_bin_get_by_name(GST_BIN(pipeline), sinkname);
g_free(sinkname);
chime_call_send_screen(PURPLE_CHIME_CXN(chat->conv->account->gc), chat->call, GST_APP_SINK(appsink));
g_object_unref(appsink);
GST_DEBUG_BIN_TO_DOT_FILE(GST_BIN(purple_media_manager_get_pipeline(mgr)),
GST_DEBUG_GRAPH_SHOW_ALL, "chime share graph");
}