summaryrefslogtreecommitdiff
path: root/docs/nego-use-cases.txt
diff options
context:
space:
mode:
authorOlivier CrĂȘte <olivier.crete@collabora.co.uk>2008-09-12 15:28:45 -0400
committerOlivier CrĂȘte <olivier.crete@collabora.co.uk>2008-09-12 15:28:45 -0400
commit23e9cec66b76c4d376be13eb73c960c291553981 (patch)
tree0b368cb0a98ff73b4301c92ac5fe9f9586712a70 /docs/nego-use-cases.txt
parentefa832be0a40878ed3ebb25840ec7c1c11342422 (diff)
downloadfarstream-23e9cec66b76c4d376be13eb73c960c291553981.tar.gz
Add nego-use-cases to the tree
Diffstat (limited to 'docs/nego-use-cases.txt')
-rw-r--r--docs/nego-use-cases.txt169
1 files changed, 169 insertions, 0 deletions
diff --git a/docs/nego-use-cases.txt b/docs/nego-use-cases.txt
new file mode 100644
index 00000000..c284657f
--- /dev/null
+++ b/docs/nego-use-cases.txt
@@ -0,0 +1,169 @@
+Various use cases for codec negotiation
+=======================================
+
+One-to-one
+----------
+
+Starting with an offer
+ - Create session
+ - Possibly set the codec-preferences
+ - While codecs-ready property is false
+ - wait until the codecs-changed message is emitted
+ - Get list of codecs
+ - Get codecs from FsSession and send them
+ - Wait for reply
+ - Set remote codecs on FsStream
+
+
+Replying to an offer
+
+ - Create session
+ - Possibly set codec-preferences
+ - Set remote codecs
+ - While codecs-ready property is false
+ - wait until the codecs-changed message is emitted
+ - Get list of codecs
+ - Send reply
+
+
+Creating a new offer
+
+ - Possibly set codec-preferences
+ - While codecs-ready property is false
+ - wait until the codecs-changed message is emitted
+ - Get codecs from FsSession and send them
+ - Wait for reply
+ - Set remote codecs on FsStream
+
+Replying to a re-offer
+
+ - Set remote codecs
+ - While codecs-ready property is false
+ - wait until the codecs-changed message is emitted
+ - Get list of codecs from FsSession
+ - Send reply
+
+
+Multi-party
+-----------
+
+First, it starts with a single party call
+
+
+The conference master invites someone in a call
+
+ - Possibly set codec-preferences
+ - While codecs-ready property is false
+ - wait until the codecs-changed message is emitted
+ - Get codecs from FsSession and send them
+ - Wait for reply
+ - Set remote codecs on FsStream
+
+
+Someone asks the master to join a call
+
+ - Set remote codecs
+ - While codecs-ready property is false
+ - wait until the codecs-changed message is emitted
+ - Get list of codecs from FsSession
+ - Get list of codecs from every other stream
+ - Send reply with master codecs and codecs from every other stream
+ - .. Or just get list of codecs from everyone (if using a presence based system)
+
+
+Goals
+=====
+
+- Negotiated codecs should never change ids (or become incompatible)
+- In one-to-one, we should always prefer the remote codec id & params
+- In one-to-many, we should prefer our codec id and param
+- We have to keep a copy of the local and remote config-data
+- We have to produce list of codecs with the local and remote config-data
+- We must be able to extract config-data-less codecs for multicast/sip,
+ but we must also be able to produce them with the config data for cooler ones
+
+
+How negotiation works now
+=========================
+
+(I'M NOT CERTAIN THIS IS ACCURATE...)
+
+
+validate shall remove all config-data from preferred codecs
+
+the whole thing is ran whenever one of the parameters change (remote codecs, local codecs, local codecs config)
+
+out: codecs_with_config, codecs_without_config, new codecs in streams
+in: codec_preferences, blueprints, remote_streams with each its codecs,
+ codecs_with_config
+
+FsCodec gets a list of config_data that is filled from optional_params by
+the codec specific negotiation function from the optional params of the local codec or the remote codec.
+
+CodecAssociation gets a two new markers.. one is "need-config" and the other is "recv-only".. Need-config means that we have to try to fetch config-data, "recv-only" means it should only be used by the list in the stream, not in the public list. There should also be a marker for "empty" associations
+
+
+create empty list of codec assocs
+foreach codec_preference:
+ if its a disable-codec entry:
+ ignore it
+ else if its a "reserve-pt":
+ add a "reserve-pt" marker to the the list
+ else if there is a matching codec in the old codecs (is a sdp negotiable
+ codec) with the same id:
+ add it to the list with the id from the old codecs
+ else if there is a matching blueprint:
+ add the codec to the list with new id (not in already in existing list or
+ preferred list or new list)
+
+foreach codec:
+ if there is no pt number:
+ attribute an allocated pt number to it
+
+foreach codec blueprint:
+ if there is no matching codec already in the list
+ if its not marked as disabled
+ add a codec to the list with id from already existing codecs or find new
+ id (not in already existing list or new list)
+
+Now we have a list of "local codecs"
+
+foreach stream that has remote codecs:
+ create empty new_list
+ foreach remote_codec:
+ check if there is an existing assoc (in the list of "local codecs") in the
+ list with the same id that matches or if there is a codec in the list that
+ matches:
+ add this code_assoc to the new_list with remote id if there is only one
+ stream with codecs, otherwise take the local id
+ else
+ add id to list of known ids and process next codec
+
+ replace list with new_list
+ if the new list is empty:
+ return failure
+
+Now we have the general codec intersection
+
+
+# for Tandberg and such that don't do SDP Offer-Answer properly
+foreach codec in the incoming list:
+ if there is no codec with the same id in the new list:
+ add the codec from the original list to the new list with a marker (and without config data)
+
+foreach id in the list of known ids:
+ if there is nothing in the codec list:
+ add a marker to the codec list
+
+# Distribute the codecs to each stream
+foreach stream that has remote codecs:
+ create an empty list
+ foreach negotiated codec (includes the one with a marker):
+ check if there is a codec with the same id in the remote codecs
+ if none found:
+ check if there is a remote codec that matches
+ add the codec with the remote codec config data to the list (possibly copying the marker)
+ replace the list of remote codecs in the stream with the newly created list
+
+
+