Re: [rtcweb] Proposal for a JS API for NoPlan (adding multiple sources without encoding them in SDP)
Silvia Pfeiffer <silviapfeiffer1@gmail.com> Tue, 18 June 2013 03:27 UTC
Return-Path: <silviapfeiffer1@gmail.com>
X-Original-To: rtcweb@ietfa.amsl.com
Delivered-To: rtcweb@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id B945321F9446 for <rtcweb@ietfa.amsl.com>; Mon, 17 Jun 2013 20:27:50 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -2.599
X-Spam-Level:
X-Spam-Status: No, score=-2.599 tagged_above=-999 required=5 tests=[AWL=-0.000, BAYES_00=-2.599, HTML_MESSAGE=0.001, NO_RELAYS=-0.001]
Received: from mail.ietf.org ([12.22.58.30]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id LCNKaVa7RSGR for <rtcweb@ietfa.amsl.com>; Mon, 17 Jun 2013 20:27:48 -0700 (PDT)
Received: from mail-oa0-x231.google.com (mail-oa0-x231.google.com [IPv6:2607:f8b0:4003:c02::231]) by ietfa.amsl.com (Postfix) with ESMTP id 69E8221F9B29 for <rtcweb@ietf.org>; Mon, 17 Jun 2013 20:27:48 -0700 (PDT)
Received: by mail-oa0-f49.google.com with SMTP id n9so4325685oag.8 for <rtcweb@ietf.org>; Mon, 17 Jun 2013 20:27:48 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc:content-type; bh=9IhBi/l5p2eAxmiifliGFfy4yo7qMbWVCrkq4ipOj5Y=; b=a4ebkrA7aDyWMlZ4leX/d/KdR623+uUlLVUZmnG3p4nobmleHVn/mXe+8863eCrGYW VGSWLpGk59YYTMveCX+Ce053TPOd3wUwPcS/f2plPCeq876UfZorxng14rJmTX8lEr5G n01h5nbou4zLET9++rfUI8vF8T/yoXC5Su5RM7nwcumxk3JEIR6chkLmkOv/IFc5EYxu R/QQIQi4gyjzpxDGQXFhoogVHV1p0gmKf3eESQ8J+vPSQDkqHNQsAkkfHJxF+kVNJQrl JFuCoC5mfPxfjavdUrT/VtAwm/KRm+78G9j1c6JLZowfQwORCaSU2OQOemzAx1K7gt4t 9onQ==
X-Received: by 10.60.162.98 with SMTP id xz2mr10714836oeb.7.1371526067972; Mon, 17 Jun 2013 20:27:47 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.76.116.71 with HTTP; Mon, 17 Jun 2013 20:27:27 -0700 (PDT)
In-Reply-To: <51BFCBE9.5070406@hookflash.com>
References: <CAJrXDUHdoxLTsofiwLBdwBNnCCkCBgjSdbmLaXrNEPODMrsSVA@mail.gmail.com> <CAHp8n2m4VwkpbdGE+q73qqij5RDCB4Vb-Ui1LmGSx1zmv8TX2g@mail.gmail.com> <51BFCBE9.5070406@hookflash.com>
From: Silvia Pfeiffer <silviapfeiffer1@gmail.com>
Date: Tue, 18 Jun 2013 13:27:27 +1000
Message-ID: <CAHp8n2=k9mosTCi5Ea3BYTQN_msOfqktEshtNmr27rTAyfZM1A@mail.gmail.com>
To: Robin Raymond <robin@hookflash.com>
Content-Type: multipart/related; boundary="047d7b3a97a814f4e504df654c36"
Cc: "<rtcweb@ietf.org>" <rtcweb@ietf.org>
Subject: Re: [rtcweb] Proposal for a JS API for NoPlan (adding multiple sources without encoding them in SDP)
X-BeenThere: rtcweb@ietf.org
X-Mailman-Version: 2.1.12
Precedence: list
List-Id: Real-Time Communication in WEB-browsers working group list <rtcweb.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/rtcweb>, <mailto:rtcweb-request@ietf.org?subject=unsubscribe>
List-Archive: <http://www.ietf.org/mail-archive/web/rtcweb>
List-Post: <mailto:rtcweb@ietf.org>
List-Help: <mailto:rtcweb-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/rtcweb>, <mailto:rtcweb-request@ietf.org?subject=subscribe>
X-List-Received-Date: Tue, 18 Jun 2013 03:27:50 -0000
On Tue, Jun 18, 2013 at 12:54 PM, Robin Raymond <robin@hookflash.com> wrote: > > I actually need access to the raw controls like SSRC, detailed ICE > candidate control, encryption keying, etc, and as much control over how > media should be controlled/behave as possible. Those things are extremely > important for interoperability and signaling and have specific meaning for > those who deal with that kind of stuff daily. > Sure - but if you need to hack SDP directly, you're already able to do that. However, as a JavaScript developer, you likely need a simple high level > API. Why should you care about all that low level junk? It's meaningless > nonsense to you. > > Real-Time Communication is hard because there is a lot involved, > especially if there is any kind of compatibility, advanced features or > network control. Nobody wants a difficult API for the sake of being > difficult, especially for a sleek language like JavaScript. It's more that > it's just necessary if we audio/video people want to do some really cool > features that work with new or existing platforms, devices and services. > > But we can have the best of both worlds! > Agreed, that's what I'm after, but not as a library, but rather as part of the WebRTC API. > There are many people who are in this RTC domain who can wrap that lower > level API to give very simple and easy to understand conceptual APIs that > abstract that weird funky stuff away. I'd be one of those people to offer > such a simpler library (along with many others I'm sure). > I think you should write a proposal! > In some way, it's not all that dissimilar with DOM and CSS3, etc.; jQuery > and jQuery UI (and other libraries) create wrappers to make access and > control easier but for those who need to raw control they have it. Most > people use wrappers and toolkits when they are trying to do the standard > stuff, but someone put together the APIs originally to make common use > cases. > jQuery was necessary because HTML did not evolve. Now that a lot of the jQuery APIs have been added to HTML directly, you can even get away pretty well without using jQuery. On a side note, I agree that SDP should go (and quickly) but it's not the > format that's the problem. Granted, it is obtuse. But it's not just that; > it's a monolithic do-everything offer/answer model that offers very little > control and the API to control the browser's RTC is effectively via > manipulation of the SDP. Yuck! Even if it were fancier and prettier JSON, > it would still be an ugly do-everything monolithic object with a sketchy > offer/answer model that is brittle and offered very little real-scenario > controls for those whom need it. It's absolutely horrible and is in good > need of quick deprecation. > Right - by providing a higher level abstraction of it, you'd enable that stuff underneath to be replaced. I don't have a good handle on SDP, so but I think what is proposed can be improved. If you have any ideas on how to, this would be a good time to help out, IMHO. Cheers, Silvia. > -Robin > > > > > Silvia Pfeiffer <silviapfeiffer1@gmail.com> > 17 June, 2013 9:00 PM > Hi Peter, all, > > I'm looking at all this from the view of a JS developer and I am > really excited that there is movement in this space. Having hit my > head hard against the limitations of the current WebRTC API and being > forced to learn SDP to achieve some of the less common use cases, I'm > feeling the pain. I am therefore happy to see that there is a proposal > for a higher-level API with similarities to the Microsoft's CU-WebRTC > proposal and I hope that together with Microsoft's input this can > become a really useful API. > > What I would like to see, though, is a bit different from what you've > proposed. In particular, the MediaFlowDescription object is the one > object that I believe is supposed to enable JS developers to do "SDP > hacking" without having to understand SDP. Unfortunately, the way in > which it is currently written, this API doesn't help a JS developer > much. There are properties in that object like "ssrc" that mean > nothing unless you understand SDP. > > I would therefore like to recommend making the properties on the > MediaFlowDescription more semantic - in particular giving them better > names - such that a JS developer really doesn't have to understand SDP > to create/change media flow descriptions. Can we find better names for > id, transportId and ssrc that are more explicitly expressing what > they stand for and when a JS developer would actually change them? > > It would be nice if the MediaFlowDescription was abstract enough such > that in future it doesn't matter if SDP is actually underneath (with > offer/answer), but that's not actually my main goal. What I'm after is > an API that can be used without having to understand what is > underneath. > > Thanks for listening and HTH, > Silvia. > > _______________________________________________ > rtcweb mailing list > rtcweb@ietf.org > https://www.ietf.org/mailman/listinfo/rtcweb > Peter Thatcher <pthatcher@google.com> > 17 June, 2013 8:57 AM > Google is in full support of "Plan B" for encoding multiple media sources > in SDP, and would like to see the Plan A vs. Plan B decision resolved soon. > Recently, though, a third option, called "NoPlan" has been proposed, but > it lacked the details of what a JS API would look like for NoPlan. Cullen > asked to see such an API proposal, and so I have worked with Emil to make > one. He will be adding it to the NoPlan draft, but I will also include it > in this email. > > Again, Google is in full support of "Plan B". But if Plan A vs. Plan B > cannot be decided, then we support NoPlan with the following additions to > the WebRTC JS API as an option that allows implementing either Plan A or > Plan B in Javascript. And even if Plan A vs. Plan B is resolved, these > API additions would still be a big improvement for those WebRTC > applications that don't use SDP for signalling. > > It is a bit long because I have added many comments and examples, but the > actually additions only include two new methods on PeerConnection and a few > new dictionaries. So don't be overwhelmed :). > > > > Intro: This follows the model of createDataChannel, which has a JS method > on PeerConnection that makes it possible to add data channels without going > through SDP. Furthermore, just like createDataChannel allows 2 ways to > handle neogitation (the "I know what I'm doing; Here's what I want to > send; Let me signal everything" mode and the "please take care of it for > me; send an OPEN message" mode), this also has 2 ways to handle > negotiation (the "I know what I'm doing; Here's what I want to send; Let me > signal everything" mode and the "please take care of it for me; send SDP > back and forth" mode). > > Following the success of createDataChannel, this allows simple > applications to Just Work and more advanced applications to easily control > what they need to. In particular, it's possible to use this API to > implement either Plan A or Plan B. > > // The following two method are added to RTCPeerConnection > partial interface RTCPeerConnection { > // Create a stream that is used to send a source stream. > // The MediaSendStream.description can be used for signalling. > // No media is sent until addStream(MediaSendStream) is called. > LocalMediaStream createLocalStream(MediaStream sourceStream); > > // Create a stream that is used to receive media from the remote side, > // given the parameters signalled from MedaiSendStream.description. > MediaStream createRemoteStream(MediaStreamDescription description); > } > > > interface LocalMediaStream implements MediaStream { > // This can be changed at any time, but especially before calling > // PeerConnection.addStream > attribute MediaStreamDescription description; > } > > > // Represents the parameters used to either send or receive a stream > // over a PeerConnection. > dictionary MediaStreamDescription { > MediaStreamTrackDescription[] tracks; > } > > > // Represents the parameters used to either send or receive a track over > // a PeerConnection. A track has many "flows", which can be grouped > // together. > dictionary MediaStreamTrackDescription { > // Same as the MediaStreamTrack.id > DOMString id; > > // Same as the MediaStreamTrack.kind > DOMString kind; > > // A track can have many "flows", such as for Simulcast, FEC, etc. > // And they can be grouped in arbitrary ways. > MediaFlowDescription[] flows; > MediaFlowGroup[] flowGroups; > } > > // Represents the parameters used to either send or receive a "flow" > // over a PeerConnection. A "flow" is a media that arrives with a > // single, unique SSRC. One to many flows together make up the media > // for a track. For example, there may be Simulcast, FEC, and RTX > // flows. > dictionay MediaFlowDescription { > // The "flow id" must be unique to the track, but need not be unique > // outside of the track (two tracks could both have a flow with the > // same flow ID). > DOMString id; > > // Each flow can go over its own transport. If the JS sets this to a > // transportId that doesn't have a transport setup already, the > // browser will use SDP negotiation to setup a transport to back that > // transportId. If This is set to an MID in the SDP, then that MID's > // transport is used. > DOMString transportId; > > // The SSRC used to send the flow. > unsigned int ssrc; > > // When used as receive parameters, this indicates the possible list > // of codecs that might come in for this flow. For exmample, a given > // receive flow could be setup to receive any of OPUS, ISAC, or PCMU. > // When used as send parameters, this indicates that the first codec > // should be used, but the browser can use send other codecs if it > // needs to because of either bandwidth or CPU constraints. > MediaCodecDescription[] codecs; > } > > > dictionary MediaFlowGroup { > DOMString type; // "SIM" for Simulcast, "FEC" for FEC, etc > DOMString[] flowids; > } > > dictionary MediaCodecDescription { > unsigned byte payloadType; > DOMString name; > unsigned int? clockRate; > unsigned int? bitRate; > // A grab bag of other fmtp that will need to be further defined. > MediaCodecParam[] params; > } > > dictionary MediaCodecParam { > DOMString key; > DOMString value; > } > > > Notes: > > - When LocalMediaStreams are added using addStream, onnegotiatedneeded is > not called, and those streams are never reflected in future SDP exchanges. > Indeed, it would be impossible to put them in the SDP without first > resolving if that would be Plan A SDP or Plan B SDP. > > - Just like piles of attributes would need to be defined for Plan A and > for Plan B, similar attributes would need to be defined here (Luckily, > much work has already been done figuring out what those parameters are :). > > > Pros: > > - Either Plan A or Plan B or could be implemented in Javascript using this > API > - It exposes all the same functionality to the Javascript as SDP, but in a > much nicer format that is much easier to work with. > - Any other signalling mechanism, such as Jingle or CLUE could be > implemented using this API. > - There is almost no risk of signalling glare. > - Debugging errors with misconfigured descriptions should be much easier > with this than with large SDP blobs. > > > Cons: > > - Now there are two slightly different ways to add streams: by creating a > LocalMediaStream first, and not. This is, however, analogous to setting > "negotiated: true" in createDataChannel. On way is "Just Work", and the > other is more advanced control. > > - All the options in MediaCodecDescription are a bit complicated. Really, > this is only necessary because Plan A requires being able to specify codec > parameters per SSRC, and set each flow on different transports. If we did > not have this requirement, we could simplify. > > > Example Usage: > > // Imagine I have MyApp, handles creating a PeerConnection, > // signalling, and rendering streams. This is how the new API could be > // used. > var peerConnection = MyApp.createPeerConnection(); > > // On sender side: > var stream = MyApp.getMediaStream(); > var localStream = peerConnection.createSendStream(stream); > sendStream.description = MyApp.modifyStream(localStream.description) > MyApp.signalAddStream(localStream.description, function(response)) { > if (!response.rejected) { > // Media will not be sent. > peerConnection.addStream(localStream); > } > } > > // On receiver side: > MyApp.onAddStreamSignalled = function(streamDescription) { > var stream = peerConnection.createReceiveStream(streamDescription); > MyApp.renderStream(stream); > } > > > // In this exchange, the MediaStreamDescription signalled from the > // sender to the receiver may have looked something like this: > > { > tracks: [ > { > id: "audio1", > kind: "audio", > flows: [ > { > id: "main", > transportId: "transport1", > ssrc: 1111, > codecs: [ > { > payloadType: 111, > name: "opus", > // ... more codec details > }, > { > payloadType: 112, > name: "pcmu", > // ... more codec details > }] > }] > }, > { > id: "video1", > kind: "video", > flows: [ > { > id: "sim0", > transportId: "transport2", > ssrc: 2222, > codecs: [ > { > payloadType: 122, > name: "vp8" > // ... more codec details > }] > }, > { > id: "sim1", > transportId: "transport2", > ssrc: 2223, > codecs: [ > { > payloadType: 122, > name: "vp8", > // ... more codec details > }] > }, > { > id: "sim2", > transportId: "transport2", > ssrc: 2224, > codecs: [ > { > payloadType: 122, > name: "vp8", > // ... more codec details > }] > }, > > { > id: "sim0fec", > transportId: "transport2", > ssrc: 2225, > codecs: [ > { > payloadType: 122, > name: "vp8", > // ... > }] > }], > flowGroups: [ > { > semantics: "SIM", > ssrcs: [2222, 2223, 2224] > }, > { > semantics: "FEC", > ssrcs: [2222, 2225] > }] > }] > } > > > Constructive feedback is welcome :). > _______________________________________________ > rtcweb mailing list > rtcweb@ietf.org > https://www.ietf.org/mailman/listinfo/rtcweb > >
- [rtcweb] Proposal for a JS API for NoPlan (adding… Peter Thatcher
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Stefan Håkansson LK
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Peter Thatcher
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Jim Barnett
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Peter Thatcher
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Iñaki Baz Castillo
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Peter Thatcher
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Martin Thomson
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… José Luis Millán
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Martin Thomson
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Emil Ivov
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Peter Thatcher
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Peter Thatcher
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… José Luis Millán
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Peter Thatcher
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Jim Barnett
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Martin Thomson
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Iñaki Baz Castillo
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Roman Shpount
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Robin Raymond
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Bernard Aboba
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Silvia Pfeiffer
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Matthew Kaufman (SKYPE)
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Matthew Kaufman (SKYPE)
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Matthew Kaufman (SKYPE)
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Robin Raymond
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Silvia Pfeiffer
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Martin Thomson
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Peter Thatcher
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Peter Thatcher
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Peter Thatcher
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Peter Thatcher
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Peter Thatcher
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Emil Ivov
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Silvia Pfeiffer
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Harald Alvestrand
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Stefan Håkansson LK
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Iñaki Baz Castillo
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Harald Alvestrand
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Enrico Marocco
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Iñaki Baz Castillo
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Enrico Marocco
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Iñaki Baz Castillo
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Emil Ivov
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Iñaki Baz Castillo
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Max Jonas Werner
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Robin Raymond
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Iñaki Baz Castillo
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Matthew Kaufman (SKYPE)
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Christer Holmberg
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Peter Thatcher
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Peter Thatcher
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Iñaki Baz Castillo
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Silvia Pfeiffer
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Harald Alvestrand
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Silvia Pfeiffer
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Sergio Garcia Murillo
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Peter Thatcher
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Peter Thatcher
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Robin Raymond
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Harald Alvestrand
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Martin Thomson
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Peter Thatcher
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Roman Shpount
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Iñaki Baz Castillo
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Iñaki Baz Castillo
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Peter Thatcher
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Matthew Kaufman
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Peter Thatcher
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Peter Thatcher
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Iñaki Baz Castillo
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Robin Raymond
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Iñaki Baz Castillo
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Bernard Aboba
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Bernard Aboba
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Bernard Aboba
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Peter Thatcher
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Peter Thatcher
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Robin Raymond
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Peter Thatcher
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Peter Thatcher
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Peter Thatcher
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Matthew Kaufman (SKYPE)
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Cullen Jennings (fluffy)
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Peter Thatcher
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Eric Rescorla
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Cullen Jennings (fluffy)
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Robin Raymond
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Stefan Håkansson LK
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Roy, Radhika R CIV USARMY (US)
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Cullen Jennings (fluffy)
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Peter Thatcher
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Cullen Jennings (fluffy)
- Re: [rtcweb] Proposal for a JS API for NoPlan (ad… Peter Thatcher