static void update_receiving_codec (EmpathyCallHandler *self, GList *codecs, FsStream *stream) { EmpathyCallHandlerPriv *priv = GET_PRIV (self); FsSession *session; FsMediaType type; if (codecs == NULL || stream == NULL) return; g_object_get (stream, "session", &session, NULL); if (session == NULL) return; g_object_get (session, "media-type", &type, NULL); if (type == FS_MEDIA_TYPE_AUDIO) { priv->recv_audio_codecs = fs_codec_list_copy (codecs); g_object_notify (G_OBJECT (self), "recv-audio-codecs"); } else if (type == FS_MEDIA_TYPE_VIDEO) { priv->recv_video_codecs = fs_codec_list_copy (codecs); g_object_notify (G_OBJECT (self), "recv-video-codecs"); } g_object_unref (session); }
/** * fs_rtp_stream_set_remote_codecs: * @stream: an #FsStream * @remote_codecs: a #GList of #FsCodec representing the remote codecs * @error: location of a #GError, or NULL if no error occured * * This function will set the list of remote codecs for this stream. If * the given remote codecs couldn't be negotiated with the list of local * codecs or already negotiated codecs for the corresponding #FsSession, @error * will be set and %FALSE will be returned. The @remote_codecs list will be * copied so it must be free'd using fs_codec_list_destroy() when done. * * Returns: %FALSE if the remote codecs couldn't be set. */ static gboolean fs_rtp_stream_set_remote_codecs (FsStream *stream, GList *remote_codecs, GError **error) { FsRtpStream *self = FS_RTP_STREAM (stream); GList *item = NULL; FsMediaType media_type; FsRtpSession *session = fs_rtp_stream_get_session (self, error); if (!session) return FALSE; if (remote_codecs == NULL) { g_set_error (error, FS_ERROR, FS_ERROR_INVALID_ARGUMENTS, "You can not set NULL remote codecs"); goto error; } g_object_get (session, "media-type", &media_type, NULL); for (item = g_list_first (remote_codecs); item; item = g_list_next (item)) { FsCodec *codec = item->data; if (!codec->encoding_name) { g_set_error (error, FS_ERROR, FS_ERROR_INVALID_ARGUMENTS, "The codec must have an encoding name"); goto error; } if (codec->id < 0 || codec->id > 128) { g_set_error (error, FS_ERROR, FS_ERROR_INVALID_ARGUMENTS, "The codec id must be between 0 ans 128 for %s", codec->encoding_name); goto error; } if (codec->media_type != media_type) { g_set_error (error, FS_ERROR, FS_ERROR_INVALID_ARGUMENTS, "The media type for codec %s is not %s", codec->encoding_name, fs_media_type_to_string (media_type)); goto error; } } if (self->priv->new_remote_codecs_cb (self, remote_codecs, error, self->priv->user_data_for_cb)) { gboolean is_new = TRUE; FS_RTP_SESSION_LOCK (session); if (self->remote_codecs) { is_new = !fs_codec_list_are_equal (self->remote_codecs, remote_codecs); fs_codec_list_destroy (self->remote_codecs); } self->remote_codecs = fs_codec_list_copy (remote_codecs); FS_RTP_SESSION_UNLOCK (session); if (is_new) g_object_notify (G_OBJECT (stream), "remote-codecs"); } else { goto error; } g_object_unref (session); return TRUE; error: g_object_unref (session); return FALSE; }