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