- From: Jan-Ivar Bruaroey via GitHub <sysbot+gh@w3.org>
- Date: Fri, 24 Mar 2023 22:28:32 +0000
- To: public-webrtc@w3.org
jan-ivar has just created a new issue for https://github.com/w3c/webrtc-pc:
== What is setCodecPreferences's contract? ==
If codecs were [interfaces](https://webidl.spec.whatwg.org/#dfn-interface) (platform objects passed by reference) with [read only](https://webidl.spec.whatwg.org/#dfn-read-only) members, then prose in [setCodecPreferences](https://w3c.github.io/webrtc-pc/#dom-rtcrtptransceiver-setcodecpreferences) would make sense: _"The codecs sequence passed into [setCodecPreferences](https://w3c.github.io/webrtc-pc/#dom-rtcrtptransceiver-setcodecpreferences) can only contain codecs that are returned by [RTCRtpSender](https://w3c.github.io/webrtc-pc/#dom-rtcrtpsender).[getCapabilities](https://w3c.github.io/webrtc-pc/#dom-rtcrtpsender-getcapabilities)(kind) or [RTCRtpReceiver](https://w3c.github.io/webrtc-pc/#dom-rtcrtpreceiver).[getCapabilities](https://w3c.github.io/webrtc-pc/#dom-rtcrtpreceiver-getcapabilities)(kind)"_.
The user agent could easily enforce this, giving us a nice and tight contract:
```js
const {codecs} = RTCRtpSender.getCapabilities(transceiver.sender.track.kind);
transceiver.setCodecPreferences([codecs[0]]); // OK
transceiver.setCodecPreferences([{mimeType: "video/VP8", clockRate: 90000}]); // InvalidModificationError
```
...because the second input clearly did NOT come from RTCRtpSender.getCapabilities() or RTCRtpReceiver.getCapabilities().
Q1: Was this the intended contract?
Unfortunately, codecs aren't platform objects passed by reference, so there's no way to ensure they came from either.
_" ... Additionally, the [RTCRtpCodecCapability](https://w3c.github.io/webrtc-pc/#dom-rtcrtpcodeccapability) dictionary members cannot be modified."_
Um, yes they can!
_" ... If codecs does not fulfill these requirements, the user agent MUST [throw](https://webidl.spec.whatwg.org/#dfn-throw) an [InvalidModificationError](https://webidl.spec.whatwg.org/#invalidmodificationerror)."_
The intent here seems to be to ensure the dictionaries have not been modified since they were obtained using RTCRtp*.getCapabilities(). Again, since we have no way to know they came from there, the closest thing we could do would be to check that a serialized representation of the dictionary matches a serialized representation of one (or more) dictionaries that RTCRtp*.getCapabilities() regularly produces (i.e. a member-wise comparison).
But knowing this, should the second input now succeed or throw?
```js
transceiver.setCodecPreferences([{mimeType: "video/VP8", clockRate: 90000}]);
```
The answer is NO, because it's missing
But now we have a problem. Doe
, but what does that mean?
. But compared to what? Again, dictionaries
So this is allowed:
```js
const {codecs} = RTCRtpSender.getCapabilities(transceiver.sender.track.kind);
transceiver.setCodecPreferences(codecs);
```
As mentioned in https://github.com/w3c/webrtc-pc/issues/2805, [setCodecPreferences](https://w3c.github.io/webrtc-pc/#dom-rtcrtptransceiver-setcodecpreferences) isn't implementable as written.
Additionally, the [RTCRtpCodecCapability](https://w3c.github.io/webrtc-pc/#dom-rtcrtpcodeccapability) dictionary members cannot be modified. If codecs does not fulfill these requirements, the user agent MUST [throw](https://webidl.spec.whatwg.org/#dfn-throw) an [InvalidModificationError](https://webidl.spec.whatwg.org/#invalidmodificationerror).
Modifiable codecs make a mess of setCodecPreferences, which seems written as
Please view or discuss this issue at https://github.com/w3c/webrtc-pc/issues/2845 using your GitHub account
--
Sent via github-notify-ml as configured in https://github.com/w3c/github-notify-ml-config
Received on Friday, 24 March 2023 22:28:34 UTC