Hello Farsight community,

I know, the Farsight 2 development has mostly happened behind closed
doors (ie all discussions happenned inside the office, not on a public
forum). But this time, I'm going to try something different, ask you!

The problem I'm currently trying to solve is to make the candidate
related APIs nicely interoperable with ICE.

I've found the following problem:
 - There is no way to force a remote candidate without have any
connectivity check done
 - There is no way to do SIP forking
 - There is no way to do a ICE restart (do we want to do a ICE restart?)
 - There is no way to relay the state of the ICE negotiation
(connecting, connected, disconnected, etc) to the application


First, to set the remote candidates, on the nice mailing list, I've
proposed to do: 
nice_agent(..., gchar *foundation, NiceCandidate *cand)
which would translte to
gboolean fs_stream_set_selected_candidates(FsStream *stream, GList
*local_candidates, GList *remote_candidates);
with one local and one remote candidate per component. But I'm not
certain that its the right way to go.. Because it seems very much like
gboolean  fs_stream_set_remote_candidates (FsStream *stream, GList
*candidates, GError **error);
And I'm not certain that we want to specify the local candidate.
Shouldn't it pick it automatically? I don't know. Also, how would a
non-ice transmitter work, I guess it would only need one of these two
functions.

Second, for SIP forking, also as discussed on the libnice mailing list,
Kai proposed just doing a ICE restart if branch selected changes.

The candidate api should probably be changed to:
gboolean fs_stream_set_remote_candidates(FsStream *stream, GList
*candidates, GError **error)
This function could have two possible behaviors when called a second
time. Either act like an fs_stream_add_candidates() or reset the list of
candidates completely (possibly removing already existing ones?) Or
maybe do a ICE restart of candidates are removed? Or do a ICE restart if
NULL is passed instead of candidates? Or should we have a separate API
to do ICE restarts (but its very ICE specific, so no other transmitter
would implement it).

Also, what are the other reasons to do an ICE restart? Do we only want
to do this when new remote candidates are received or is there any other
time?


Last, but not least, how to convey the changes in ICE states to the
application.

This has some interesting sub-problems:
 - RTCP muxing, it seems that if you want to offer rtcp-muxing, you
first offer two components and a:rtcp-mux and then the remote end will
fail the second component if rtcp-mux succeeds, so in this case failing
the RTCP component is ok.
 - We also want to accept RTCP failing when trying to work with
deficient implementations (like Farsight1 or Google Talk) that don't do
RTCP.
 - We probably want to tell the user that RTCP has failed in those cases
still.

I propose doing the following:
the FsStreamTransmitter will announce state changes per component in a
signal with the arguments (FsStreamTransmitter *st, guint component_id,
FsConnectionState state)
Those would then be relayed as-is in a GStreamer Message (so the
application can know about it). Then, if component 1 (RTP) fails,
Farsight would also fail the stream (ie emit an error message).


I think that's it for today, you're comments are more than welcome.


PS. The current development tree has some API changes already as
described at http://farsight.freedesktop.org/wiki/Changes_in_0.0.3

-- 
Olivier Crête
[EMAIL PROTECTED]
Collabora Ltd

Attachment: signature.asc
Description: This is a digitally signed message part

-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://sourceforge.net/services/buy/index.php
_______________________________________________
Farsight-devel mailing list
Farsight-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/farsight-devel

Reply via email to