- From: Harald Alvestrand <harald@alvestrand.no>
- Date: Mon, 07 Nov 2011 16:15:22 +0100
- To: "public-webrtc@w3.org" <public-webrtc@w3.org>
Another API question triggered by reading ROAP:
What semantics do we attach to onaddstream()?
The current spec says that the addstream event is "A new stream has been
added to the remoteStreams array", but not when that should happen.
So ROAP may offer more information, but turns out to be a bit confusing.
The sequence of calls in section 5.3 shows (with some commentary added):
OffererJS->OffererUA: peer=new PeerConnection();
OffererJS->OffererUA: peer->addStream();
OffererUA->OffererJS: sendSignalingChannel();
OffererJS->AnswererJS: {"type":"OFFER", "sdp":"..."}
AnswererJS->AnswererUA: peer=new PeerConnection();
AnswererJS->AnswererUA: peer->processSignalingMessage();
----- at this point AnswererUA knows about the
Offerer->Answerer proposed stream
AnswererUA->AnswererJS: onconnecting();
AnswererUA->OffererUA: ICE starts checking
note right of AnswererUA: User decides it is OK to send video
AnswererJS->AnswererUA: peer->addStream();
AnswererUA->OffererUA: Media
AnswererUA->AnswererJS: sendSignalingChannel();
AnswererJS->OffererJS: {"type":"ANSWER","sdp":"..."}
OffererJS->OffererUA: peer->processSignalingMessage();
---- at this point OffererUA knows that Offerer->Answerer
stream is accepted
---- at this point OffererUA knows about Answerer->Offerer
stream
OffererUA->OffererJS: onaddstream(); <---- on the A->O stream
OffererUA->AnswererUA: Media
AnswererUA->OffererUA: ICE Completes
---- this is the earliest time media packets can actually flow
AnswererUA->AnswererJS: onopen();
OffererUA->OffererJS: onopen();
OffererUA->OffererJS: sendSignalingChannel();
OffererJS->AnswererJS: {"type":"OK" }
AnswererJS->AnswererUA: peer->processSignalingMessage();
---- at this point AnswererUA knows that Answerer->Offerer
stream is accepted
AnswererUA->AnswererJS: onaddstream(); <----- on the O->A stream
There's an oddity here in onaddstream(): This call presumably tells the
AnswererJS that there is an incoming video channel that will need to be
connected to some display surface.
Now, the information needed to know this is sent in the Offer (based on
data in the OffererJS' addStream() call), right at the top.
So in theory, the callback could be triggered at the same time as
onconnecting(). It may also contain information that could be useful to
know before the Answerer does his addStream() call, so there's an
advantage to knowing that info at that time.
Now, a competing theory is that you shouldn't call onaddstream() before
you actually see media packets. But in that case, the
OffererUA->OffererJS: onaddstream() doesn't make sense; you can't see
media packets until ICE has completed, and that doesn't happen until two
lines later.
I suggest that we pick one of two semantics for onaddstream():
1) We know that this stream is expected. The callback occurs as soon as
we have the OFFER or ANSWER containing information about this stream.
Move the last onaddstream() up to just after onconnecting().
2) We know that media is arriving on the stream. The callback occurs as
soon as the first media packet arrives. Move the first onaddstream()
down below the "ICE Completes" line
My order of preference is 1) followed by 2). But I think we need to pick
one and only one, and make sure the API spec says exactly that.
Harald
Received on Monday, 7 November 2011 15:15:52 UTC