15:40:06 RRSAgent has joined #webrtc 15:40:06 logging to https://www.w3.org/2022/11/15-webrtc-irc 15:40:09 Zakim has joined #webrtc 15:40:25 Meeting: WebRTC November 2022 meeting 15:40:25 Agenda: https://www.w3.org/2011/04/webrtc/wiki/November_15_2022 15:40:26 Slideset: https://lists.w3.org/Archives/Public/www-archive/2022Nov/att-0000/WEBRTCWG-2022-11-15.pdf 15:40:28 Chairs: HTA, Jan-Ivar, Bernard 15:56:15 tovep has joined #webrtc 15:57:57 TuukkaToivonen has joined #webrtc 16:02:36 Present: Florent, PatrickRockhill, Youenn, TOve, PhilippHancke, Tuukka, Elad, Dom, Jan-Ivar, Hugo, PeterThatcher, Harald 16:03:43 Present+ Eero 16:04:06 eehakkin has joined #webrtc 16:04:48 Present+ Cullen 16:05:12 Present+ Bernard 16:06:15 Recording is starting 16:07:39 Present+ Carine 16:07:55 fippo has joined #webrtc 16:08:45 Topic: -> https://github.com/w3c/webrtc-encoded-transform Encoded Transform 16:08:45 [slide 10] 16:09:42 Harald: I offered to use the IETF Hackathon to experiment with encoded transform (on my own, for lack of participants) 16:09:47 [slide 11] 16:11:05 [slide 12] 16:12:23 Harald: developed 2 demos to evaluate the API (but not for signals) 16:12:25 [slide 13] 16:12:55 Harald: I had initially thought I needed both producers and consumers, but writing the demos, only the producers seemed necessary 16:13:30 [slide 14] 16:14:30 Harald: the processing is done via a user-defined JS class that you insert in the processing pipeline, but without requiring a single PC used in both end of the pipe 16:14:47 ... this led to the conclusion that the API could be used 16:15:33 ... Peter worked separately on how that one-way API approach could be done with the existing two-ways APIs 16:15:36 [slide 15] 16:15:58 Peter: I got it working with transport, codec 16:16:05 [slide 16] 16:16:47 Peter: a constructor would help 16:16:55 ... also missing signals for congestion control 16:16:57 [slide 17] 16:17:14 Peter: pretty straightforward on the receiver side 16:17:17 [slide 18] 16:17:53 Peter: again, missing a way to control e.g. the encoder bitrate based on congestion control 16:17:56 [slide 19] 16:18:29 Peter: for a Decoder, we would again want a constructor for the encoded video frame, and signals to detect the need for a key frame 16:18:35 [slide 20] 16:19:35 Peter: Harald's approach would satisfy these needs 16:20:06 Youenn: with regard to these 5 gaps, there is already a solution for the keyframe problem 16:20:32 ... for constructors, I'm not sure why we need something on top of what WebCodecs provide from raw data; what's the point of using PC for incoming data? 16:21:06 Peter: WebCodecs doesn't have a built-in jitter buffer, whereas this would 16:21:21 Youenn: but we've been discussing letting the app define the jitter buffer 16:21:30 ... so it's not clear that there is a benefit 16:21:50 Peter: it would still allow to get the same behavior that you get from WebRTC without having to write your own jitter buffer 16:22:06 Youenn: I think this would benefit from clearer use cases 16:22:23 Harald: one of the use cases that needs this is getting an incoming video frame and passes it out to a different peer connection 16:22:31 ... or passing it to 2 peer connections 16:22:38 Youenn: to re-forward it? 16:22:41 harald: possibly, yes 16:22:52 Youenn: this may be mostly about seralization, rather than a constructor 16:23:00 s/sera/seria/ 16:23:11 harald: metadata may need rewriting 16:23:17 ... let's see about use cases 16:23:57 Jan-Ivar: what's the high level problem we're solving? would this be instead of encoded transform? re-imagining it? identifying issues with it? 16:24:09 ... we have readable and writable streams on mediastreamtracks 16:24:26 ... so I can already receive a track and forward it 16:24:36 ... what's the difference? 16:24:54 Harald: this relates to the use cases discussed at TPAC 16:25:25 ... there were compelling arguments that this could not be addressed without substantive changes of the webrtc encoded transform API 16:25:40 ... not clear if this should replace or extend it - depending on where the shape lands 16:25:57 Peter: you cannot forward well without bandwidth estimation 16:26:34 ... you could re-use the encoded(audio|video)frame to forward them as is, but you probably need to re-packetize which you can't do without a constructor 16:27:17 Jan-ivar: OK; still unclear how this would affect the API shape 16:27:37 Peter: I was focused on identifying the gaps at this stage 16:28:00 Harald: I explicitly shied away from presenting an API shape, to focus on use cases and requirements at this stage 16:28:33 ... this is to stimulate the discussions 16:28:52 Peter: my impression is that this could be added with fairly minimal changes (constructors, signals) 16:28:56 ... not a big delta from what we have 16:29:31 Present+ BrianBaldino 16:29:44 Harald: so next step is to enumerate use cases a bit more before making a change proposal 16:29:49 ... Peter and I will continue to iterate on this 16:30:09 Topic: -> https://github.com/w3c/webrtc-pc WebRTC PC 16:30:25 Subtopic: Issue #2795: Missing URL in RTCIceCandidateInit 16:30:25 [slide 24] 16:30:45 Youenn: this follows from discussion at the previous meeting 16:31:22 ... the server URL used to be exposed in the event, and it has been proposed to move it to the candidate object itself 16:31:47 ... but we didn't discuss whether it would survive JSON serialization / deserialization 16:32:10 ... so far serialization/deserialization has been without information less 16:32:23 ... should that apply to the URL attribute? 16:32:32 [slide 25] 16:33:03 Youenn: this impacts whether it gets submitted to remote parties by default (although this is only about defaults, not about protecting the info in general since it remains available to JS) 16:33:30 ... in general, do we want to keep the invariant of non-lossiness on this object? 16:34:00 ... Personally, I don't think there are good use cases to pass the url to remote parties, and we should keep the model consistent with regard to lossiness 16:34:15 ... so we should keep the url attribute to the event rather than the object 16:34:34 ... it can be shimmed easily from one to the other 16:34:40 [slide 26] 16:35:08 fippo: toJSON conveys information that is needed for ICE 16:35:49 ... additional properties were added to avoid having developers parsing data out of the canddiate string 16:35:55 ... e.g. to determine the network topology 16:35:58 [slide 27] 16:37:35 youenn: the question is about convenience / POLA 16:37:53 fippo: exposing the data on candidate is best to avoid having to go through stats 16:38:12 ... you can't correlate you event with stats except through IP address matching 16:38:40 Jan-Ivar: I'm hearing that the candidates already has information that aren't exposed in toJSON 16:38:49 Fippo: right, e.g. relayProtocol 16:39:07 Jan-Ivar: so that already breaks the supposed invariant on non-lossiness 16:39:29 Youenn: if so, that goes against the spirit of the spec 16:39:46 ... if that's not the case, this may require clarifying the spec or aligning it with the invariant 16:39:57 fippo: the problem is that we're trying to treat local and remote candidates the same 16:40:06 ... but local candidates can have more info 16:40:25 youenn: that's why I thought the event was a good way to expose local information 16:40:34 Fippo: in stats we distinguish a lot between local & remote 16:40:59 jan-ivar: my preference is to not send it to remote parties, and so not include it in toJSON 16:41:22 ... the design pattern for events is also not to expose properties on the event when it can be exposed on the underlying object 16:41:35 ... so I lean towards exposing it in the object 16:42:03 youenn: we then at least to change the constructor 16:42:23 harald: the candidate is behaving like a data object, without inherent behavior 16:42:51 ... people expect to copy data objects, and they would expect toJSON() to allow this - breaking such a pattern is a bad idea 16:43:15 ... we have a backwards compatibility problem since toJSON is used to send data to remote parties 16:43:35 ... I think it was a mistake to use toJSON for transmission 16:43:46 ... I think putting the url data on the candidate is right 16:45:12 ... I think the right direction would be to add a method that only exposes the right info for the remote party 16:45:28 Youenn: another approach would be to distinguish local vs remote candidates 16:45:36 Harald: that's an interesting idea 16:45:58 Jan-Ivar: I agree we have a wart here, but I don't think we should chase technical purity 16:46:22 ... subclassing would not solve the backwards compat issue 16:46:45 Youenn: let's iterate on this discussion on github 16:47:10 Subtopic: Issue #2796: A simulcast transceiver saved from rollback by addTrack doesn’t re-associate, but unicast does 16:47:10 [slide 28] 16:47:30 Jan-Ivar: more corner cases, esp to with rollbacks 16:51:18 Harald: proposal seems reasonable to me 16:51:22 Bernard: +1 16:51:29 Harald: Jan-Ivar will propose a PR 16:51:41 Subtopic: Issue #2724: The language around setting a description appears to prohibit renegotiation of RIDs 16:51:41 [slide 29] 16:52:10 Jan-Ivar: see also PR #2794 16:53:36 [slide 30] 16:54:12 Jan-Ivar: this would match Chrome & Safari, although there is a remaining inconsistency identified in Chrome 16:54:43 Harald: this is the one where you discovered Chrome disabled layers rather than removing them 16:54:58 ... this sounds reasonable given our previous agreement on this 16:55:10 Jan-Ivar: it's a small change that doesn't introduce new behaviors, but extend them 16:55:25 Harald: I think this works 16:55:26 ... Will you add tests to? 16:55:37 Jan-Ivar: yes, along with FF implementation of setParameters 16:55:41 s/to?/too?/ 16:56:31 Topic: -> https://github.com/w3c/webcodecs Timing Model & WebCodecs 16:56:50 Bernard: the gorup created a videoframemetadata registry with a process 16:57:09 ... an example of that is the request to register human face metadata #607 16:57:24 ... this also relates to the requestVideoFrameCallback spec (being merged in HTML) 16:57:38 ... which also exposes metadata and whether they should be exposed there as well 16:58:17 ... the rVFC spec exposes timing info at all aspects of the pipeline (captureTime, rtpTimestamp, receiveTime, processingDuration, expectedDisplayTime, presentationTime) 16:58:38 ... it mixes codec-related timing but also rtp-related info 16:58:57 ... this brings up a number of questions: where is the metadata exposed in our APIs (e.g. mediacapture transform) 16:59:16 ... should I expect .captureTime to be visible in a videoframe 16:59:42 ... likewise, there are assumptions on whatthings should happen in WebRTC (e.g. setting the rtpTimestamp) 17:00:25 ... is metadata passed through the pipeline: converting a video frame with mediacapture transofrm and pass it to webrtc - is this still visible at the end in rVFC? in encoded transform? 17:00:36 ... in WebCodecs encoded chunks? 17:01:01 ... do we need to file related issues? 17:01:37 Youenn: I filed some of these issues - captureTime etc are planned to move to videoframemetadata 17:01:58 ... that should bring consistency throughout the pipeline 17:02:21 ... mediacapture transform will not perserve it magically - if you clone the frame, metadata will be clone along with it 17:02:31 ... likewise if it goes through WebRTC PC 17:02:57 ... encoded chunks doesn't expose that metadata - maybe we should; we haven't heard feedback or use cases for that yet 17:03:47 ... in terms of what the WG may need to discuss: how do we compute presentationTime? VideoTrackGenerator allows to set timestamp, but we're not defining what happens on rendering (e.g. re jitter buffer) 17:04:29 Harald: if a processing element has metadata defined both as part of input & output, should we have a general rule about metadata it doesn't understand? 17:04:54 ... for the metadata info it knows about (e.g. width and height for an encoder), it won't remain unchanged 17:05:13 ... but for metadata that isn't understood, should have a rule to leave it unchanged? 17:05:36 Bernard: the registry rule is that this is up to the registry-linked spec to define 17:05:48 ... not sure we can have a rule that is imposed to all WGs 17:06:06 ... a rule would have to be proposed to be enforced 17:07:02 Youenn: individual metadata spec could describe how they're handled by processors 17:07:23 Bernard: next step would be to file specific issues on specific specs 17:07:33 Youenn: the main remaining issue might be on rendering time 17:07:37 ... in media capture main 17:07:59 Topic: -> https://github.com/w3c/mediacapture-extensions/pull/78 Face Detection 17:07:59 [slide 33] 17:08:37 Tuukka: the face detection proposal now uses videoframemetadata object 17:10:55 [slide 34] 17:13:39 slide 35] 17:16:24 [slide 36] 17:18:43 [slide 3è] 17:18:46 s/è/7 17:19:39 [slide 38] 17:21:17 Tuukka: looking for feedback on the general direction 17:21:35 Youenn: thanks - looks like a great improvement, and exciting to see this moving forward 17:21:52 ... dictionary members probably don't need to be nullable, but some may need to be marked as required 17:22:19 ... re center points vs bounding box vs best possible contours: I'm not sure if a sequence is best vs different fields 17:22:44 ... not sure about faceDetectionMaxCountourPoints - do we really need this now? can we leave this for later? or have a hint? 17:23:10 ... if developers just want a bounding box, maybe we should let developers express it, and send back a detailed contour otherwise 17:23:24 ... the example may need an update wrt @@@ 17:23:37 ... I guess this means the proposal will be split across webcodecs and mediacapture-extensions 17:23:52 Tuukka: the metadata and the constraints are both specified in mediacapture extensions 17:24:00 ... are you suggesting the former should be done in webcodecs? 17:24:11 Youenn: not sure - I guess this is testing the registry process 17:24:32 ... the registry entry could either define the metadata or link to the mediacapture extensions spec 17:25:15 Tuukka: the constraints and metadata are co-dependent 17:25:25 ... they need to be maintained together 17:25:55 youenn: that makes sense; webcodecs has been asking to be able to review metadata when they change, so it may be best to have something in webcodecs space 17:26:06 ... we can iterate with webcodecs folks on the details 17:26:14 timp: I like this - looks useful & interesting 17:26:39 ... it would be good to document the lifespan and meaning of the id - in particular, that it doesn't allow to correlate faces across streams 17:27:26 ... re contour & bounding box, I agree with Youenn that they're not the same and should be handled separately, not rely on 4 items == bounding box 17:28:12 tuukka: the goal here was to avoid cluttering metadata as new contour approaches emerge 17:28:36 jan-ivar: looking at the broader question of merging this 17:29:01 ... from a privacy perspective, it looks like it doesn't add any concerns over having the detection done in JS 17:29:11 ... this looks good to me 17:30:05 Youenn: let's see a PR that editors can iron out and then run a CfC? 17:30:43 Topic: -> https://github.com/w3c/mediacapture-handle/issues/70 MessagePort on Capture Handle 17:30:43 [slide 44] 17:31:55 [slide 45] 17:32:49 [slide 46] 17:34:22 [slide 47] 17:34:57 [slide 48] 17:36:21 [slide 49] 17:38:03 [slide 50] 17:39:04 Youenn: having a message channel between capturer and capture makes sense 17:39:42 ... a few things off in the API shape that we can iterate on (e.g. event handler in a dictionary - they're usually on objects) 17:39:52 ... I'm not sure about the "supportsMessagePort" boolean 17:40:04 ... I would prefer we start from a minimal API surface 17:40:19 ... also for messageportinvalidated - we should discuss this with the HTML spec folks 17:40:39 ... this underlying behavior already exists with other messageports 17:41:21 ... I would prefer a name different "getMessagePort" given its side effects 17:41:29 ... I like the integration with capture handle 17:41:47 elad: +1 to "openMessagePort" instead of get... 17:42:13 ... I'm happy to discuss reduction of API surface 17:42:37 ... s/handle/controller 17:43:06 ... my proposal deals both with capture handle and controller - how do you feel about integration with handle? 17:43:18 Youenn: event handler in a dictionary feels wrong 17:43:30 ... don't have strong feelings on handle vs mediaDevices in general 17:44:30 elad: the link to capture handle happens both on capturer & capturee 17:44:53 ... you commented on only one side? 17:45:05 youenn: on the other side, I would move it to capture controller 17:46:05 jan-ivar: I really like the 1st part of the presentation - agree on use cases & requirements 17:46:13 ... would like to iterate on github on the API shape 17:46:29 ... generally would agree with youenn to move it to controller rather than track 17:46:44 ... I think the direction you're presenting makes sense as a starting point 17:47:16 Elad: so next steps is to surface similar events following that pattern on capture controller 17:48:05 ... we should revisit this a the next meeting 17:48:14 Topic: -> https://github.com/w3c/mediacapture-main/pull/912 enumerateDevices & Focus 17:48:14 [slide 53] 17:49:52 jan-ivar: PR #912 allows the behavior in Safari by relaxing the focus requirements a little bit 17:49:56 [slide 54] 17:50:49 [slide 55] 17:52:50 Youenn: I like this proposal; LGTM 17:53:24 Harald: my reading is that it waits after the gUM prompt has been replied to? 17:53:41 jan-ivar: after it has shown up, not responded to (since that requires focus in any case) 17:54:14 harald: I'll re-read the PR carefully to make sure it doesn't introduce issues 17:54:55 Elad: can you clarify the "anti-spying" behavior? 17:55:11 Jan-Ivar: the PR doesn't change the focus requirement, only its timing 17:55:18 Elad: ok, I'll bring the question on github then 17:55:25 [slide 56] 17:56:04 Jan-Ivar: we also had developers complaining that enumerateDevices() block when there is no focus (which is marked an optional behavior) 17:56:16 ... the PR proposes to make it tied to visibility, not focus 17:56:48 ... this helps backwards compat, and still satisfies the anti-fingerprinting requirement (anti-spying only applies to getUserMedia) 17:57:21 ... this would make the check deterministic as requested by the developer 17:58:52 [slide 57] 18:00:05 Youenn: so the goal is to reduce friction for developers and align user agents behaviors - that's a good goal 18:00:18 ... do you foresee compat issues in implementing this? 18:01:16 ... will it fix existing firefox issues that developers were complaining about or does that require developers adoption before it does? 18:01:44 jan-ivar: they would have to add the visibilityState check to avoid being "blocked" 18:02:10 elad: I could use more time to review this 18:02:49 youenn: I think it would be good to get feedback from other UAs and developers 18:02:56 Bernard: do we need a CfC? 18:03:49 Jan-Ivar: developers should be happy given that it relaxes the behavior 18:03:57 Dom: does this need an updated privacy review? 18:04:06 jan-ivar: I don't think so since the behavior was already optional 18:04:25 ... and the fuzzing advice is already in the spec 18:05:04 harald: I'll have to review this in details 18:05:32 Dom: so we can delegate this for final review by Harald, Elad & Youenn? 18:05:34 JIB: SGTM 18:05:40 RRSAgent, draft minutes 18:05:40 I have made the request to generate https://www.w3.org/2022/11/15-webrtc-minutes.html dom 18:05:50 RRSAgent, make log public 18:06:51 s/slide 35/[slide 35/ 18:06:52 RRSAgent, draft minutes 18:06:52 I have made the request to generate https://www.w3.org/2022/11/15-webrtc-minutes.html dom 18:30:35 Zakim has left #webrtc