Mercurial > pidgin
comparison libpurple/media/media.c @ 29159:efeb21092ed2
Begin transferring FsSession over to the Farsight 2 media backend.
author | maiku@pidgin.im |
---|---|
date | Fri, 23 Oct 2009 21:40:38 +0000 |
parents | ae81f8baa148 |
children | 2460e6774e08 |
comparison
equal
deleted
inserted
replaced
29158:ae81f8baa148 | 29159:efeb21092ed2 |
---|---|
357 for (iter = priv->streams; iter; iter = g_list_next(iter)) { | 357 for (iter = priv->streams; iter; iter = g_list_next(iter)) { |
358 PurpleMediaStream *stream = iter->data; | 358 PurpleMediaStream *stream = iter->data; |
359 if (stream->stream) { | 359 if (stream->stream) { |
360 g_object_unref(stream->stream); | 360 g_object_unref(stream->stream); |
361 stream->stream = NULL; | 361 stream->stream = NULL; |
362 } | |
363 } | |
364 | |
365 if (priv->sessions) { | |
366 GList *sessions = g_hash_table_get_values(priv->sessions); | |
367 for (; sessions; sessions = g_list_delete_link(sessions, sessions)) { | |
368 PurpleMediaSession *session = sessions->data; | |
369 if (session->session) { | |
370 g_object_unref(session->session); | |
371 session->session = NULL; | |
372 } | |
373 } | 362 } |
374 } | 363 } |
375 | 364 |
376 if (priv->participants) { | 365 if (priv->participants) { |
377 GList *participants = g_hash_table_get_values(priv->participants); | 366 GList *participants = g_hash_table_get_values(priv->participants); |
1476 gst_object_unref(sinkpad); | 1465 gst_object_unref(sinkpad); |
1477 | 1466 |
1478 stream->connected_cb_id = purple_timeout_add(0, | 1467 stream->connected_cb_id = purple_timeout_add(0, |
1479 (GSourceFunc)purple_media_connected_cb, stream); | 1468 (GSourceFunc)purple_media_connected_cb, stream); |
1480 } | 1469 } |
1481 | |
1482 static void | |
1483 purple_media_element_added_cb(FsElementAddedNotifier *self, | |
1484 GstBin *bin, GstElement *element, gpointer user_data) | |
1485 { | |
1486 /* | |
1487 * Hack to make H264 work with Gmail video. | |
1488 */ | |
1489 if (!strncmp(GST_ELEMENT_NAME(element), "x264", 4)) { | |
1490 g_object_set(GST_OBJECT(element), "cabac", FALSE, NULL); | |
1491 } | |
1492 } | |
1493 #endif /* USE_VV */ | 1470 #endif /* USE_VV */ |
1494 | 1471 |
1495 gboolean | 1472 gboolean |
1496 purple_media_add_stream(PurpleMedia *media, const gchar *sess_id, | 1473 purple_media_add_stream(PurpleMedia *media, const gchar *sess_id, |
1497 const gchar *who, PurpleMediaSessionType type, | 1474 const gchar *who, PurpleMediaSessionType type, |
1537 } | 1514 } |
1538 | 1515 |
1539 session = purple_media_get_session(media, sess_id); | 1516 session = purple_media_get_session(media, sess_id); |
1540 | 1517 |
1541 if (!session) { | 1518 if (!session) { |
1542 GError *err = NULL; | |
1543 GList *codec_conf = NULL, *iter = NULL; | |
1544 gchar *filename = NULL; | |
1545 PurpleMediaSessionType session_type; | 1519 PurpleMediaSessionType session_type; |
1546 GstElement *src = NULL; | 1520 GstElement *src = NULL; |
1547 | 1521 |
1548 session = g_new0(PurpleMediaSession, 1); | 1522 session = g_new0(PurpleMediaSession, 1); |
1549 | 1523 session->session = purple_media_backend_fs2_get_session( |
1550 session->session = fs_conference_new_session( | 1524 PURPLE_MEDIA_BACKEND_FS2(media->priv->backend), |
1551 media->priv->conference, media_type, &err); | 1525 sess_id); |
1552 | |
1553 if (err != NULL) { | |
1554 purple_media_error(media, _("Error creating session: %s"), err->message); | |
1555 g_error_free(err); | |
1556 g_free(session); | |
1557 return FALSE; | |
1558 } | |
1559 | |
1560 filename = g_build_filename(purple_user_dir(), "fs-codec.conf", NULL); | |
1561 codec_conf = fs_codec_list_from_keyfile(filename, &err); | |
1562 g_free(filename); | |
1563 | |
1564 if (err != NULL) { | |
1565 if (err->code == 4) | |
1566 purple_debug_info("media", "Couldn't read " | |
1567 "fs-codec.conf: %s\n", | |
1568 err->message); | |
1569 else | |
1570 purple_debug_error("media", "Error reading " | |
1571 "fs-codec.conf: %s\n", | |
1572 err->message); | |
1573 g_error_free(err); | |
1574 } | |
1575 | |
1576 /* | |
1577 * Add SPEEX if the configuration file doesn't exist or | |
1578 * there isn't a speex entry. | |
1579 */ | |
1580 for (iter = codec_conf; iter; iter = g_list_next(iter)) { | |
1581 FsCodec *codec = iter->data; | |
1582 if (!g_ascii_strcasecmp(codec->encoding_name, "speex")) | |
1583 break; | |
1584 } | |
1585 | |
1586 if (iter == NULL) { | |
1587 codec_conf = g_list_prepend(codec_conf, | |
1588 fs_codec_new(FS_CODEC_ID_ANY, | |
1589 "SPEEX", FS_MEDIA_TYPE_AUDIO, 8000)); | |
1590 codec_conf = g_list_prepend(codec_conf, | |
1591 fs_codec_new(FS_CODEC_ID_ANY, | |
1592 "SPEEX", FS_MEDIA_TYPE_AUDIO, 16000)); | |
1593 } | |
1594 | |
1595 fs_session_set_codec_preferences(session->session, codec_conf, NULL); | |
1596 | |
1597 /* | |
1598 * Removes a 5-7 second delay before | |
1599 * receiving the src-pad-added signal. | |
1600 * Only works for non-multicast FsRtpSessions. | |
1601 */ | |
1602 if (is_nice || !strcmp(transmitter, "rawudp")) | |
1603 g_object_set(G_OBJECT(session->session), | |
1604 "no-rtcp-timeout", 0, NULL); | |
1605 | |
1606 /* | |
1607 * Hack to make x264 work with Gmail video. | |
1608 */ | |
1609 if (is_nice && !strcmp(sess_id, "google-video")) { | |
1610 FsElementAddedNotifier *notifier = | |
1611 fs_element_added_notifier_new(); | |
1612 g_signal_connect(G_OBJECT(notifier), "element-added", | |
1613 G_CALLBACK(purple_media_element_added_cb), | |
1614 stream); | |
1615 fs_element_added_notifier_add(notifier, | |
1616 GST_BIN(media->priv->conference)); | |
1617 } | |
1618 | |
1619 fs_codec_list_destroy(codec_conf); | |
1620 | |
1621 session->id = g_strdup(sess_id); | 1526 session->id = g_strdup(sess_id); |
1622 session->media = media; | 1527 session->media = media; |
1623 session->type = type; | 1528 session->type = type; |
1624 session->initiator = initiator; | 1529 session->initiator = initiator; |
1625 | 1530 |