14:56:13 RRSAgent has joined #webrtc 14:56:18 logging to https://www.w3.org/2025/09/16-webrtc-irc 14:56:18 Zakim has joined #webrtc 14:56:18 RRSAgent, make log public 14:56:19 Meeting: WebRTC September 2025 meeting 14:56:19 Agenda: https://www.w3.org/2011/04/webrtc/wiki/September_16_2025 14:56:19 Slideset: https://docs.google.com/presentation/d/11rr8X4aOao1AmvyoDLX8o9CPCmnDHkWGRM3nB4Q_104/ 14:56:19 Chairs: Guido, Jan-Ivar, Youenn 15:01:11 Present: Fippo, Jan-Ivar, Guido, SergeySilkin, NishitaDey, harald, SteveBecker, JasperHugo, PeterT 15:01:13 Present+ 15:02:00 Present +SunShin 15:03:32 Present+ TonyHerre 15:04:05 Present+ Youenn 15:04:24 Recording is starting 15:05:36 Present+ DiegoPerezBotero 15:05:38 Present+ Carine 15:06:56 Present+ TimP 15:07:09 Present+ KonradHofbauer 15:07:24 Topic: -> https://github.com/w3c/mediacapture-output/ Audio Output Devices API 15:07:24 Subtopic: Ask for user gesture to call setSinkId #84 15:07:24 [slide 10] 15:10:15 Jan-Ivar: a bit concerned that this adds variance among implementations and might lead to compat issues 15:10:30 ... what's the motivation for this change? 15:10:56 Youenn: similar to gUM or gDM: when a web site starts playing audio, we put a user activation check - which I think the media spec requires 15:11:14 ... setSinkId is starting to play audio on a given speaker - it seems logical to have a user gesture check there as well 15:11:36 Harald: the most common use case where a device is no longer available is when people unplug their earbuds 15:12:00 ... when they do and the app notices, will there be a user activation event available or not? 15:12:21 Youenn: in that situation in Safari, setSinkId would be available given the devicechange event 15:12:50 harald: so a devicechange event counts as user activation in this case? 15:12:57 Youenn: that's how we implemented in Safari 15:13:17 ... and we propagate to the async enumerateDevices call as well since it's likely to be called afterwards 15:13:35 harald: so harmess if it includes the devicechange event 15:13:59 Youenn: that's why the spec should allow it; we think we've solved web compat concerns, we'll see if more emerge 15:14:28 Fippo: a common use case is to play the ring tone on the speaker and the call on the headset - would that still be supported? 15:15:02 Youenn: in a call, you call gUM, you get the devices and then call setSinkId - microphone starting also counts as activation in our heuristics 15:16:09 ... When we call gUM, the enumerateDevices list is changing with a devicechange event, which is used as the trigger to do the device setup 15:16:23 Jan-Ivar: so user activation or devicechange event? 15:16:29 Youenn: that's what we've implemented 15:17:19 Jan-Ivar: how does this deal with multiple gUM? 15:17:28 Youenn: this hasn't been a concern so far 15:17:43 Jan-Ivar: I'm not sure Firefox would be able to implement this; I'm also not a big fan of SHOULD 15:18:03 TimP: I'm supportive of this change, with a bit more work on details 15:18:35 ... as it can protect against misuses 15:19:20 Dom: what would it take to turn this into a MUST? 15:19:53 Youenn: I thought of first making this a first step and get implementation experience before requiring it 15:20:20 Guido: I'm ok with adding it as a may, but making a must will require a more extensive list of circumstances 15:20:39 Youenn: I can start with a MAY and open a separate issue to make it stronger 15:20:51 RESOLVED: Proceed with a MAY require user activation 15:20:56 Subtopic: Should media capture output define an explicit default speaker device? #151 15:20:56 [slide 11] 15:21:15 [slide 12] 15:22:47 Jan-Ivar: I agree the situation is unfortunate for Web compat; is this only for speakers, or also for microphone? 15:23:20 Youenn: the problem seems less prominent for microphones 15:23:34 Jan-Ivar: the problem with that approach is that it clashes with the rest of the spec in terms of the devicechange event 15:23:47 Youenn: if you want the default, you call setSinkId("") 15:24:14 Jan-Ivar: but this doesn't let detect when the default OS device changes 15:24:27 Youenn: we've done that change for webcompat and seems to be working well 15:25:15 Guido: the default for the output device is a good idea; I think Firefox does it in some circumstances with selectAudioOutput 15:25:41 Jan-Ivar: yes, we have it in specific conditions for selectAudioOutput 15:25:57 Youenn: default speaker is also a widely used concept across OS 15:26:36 Jan-Ivar: Firefox needs to improve its compat on devicechange event in any case; so I'm in favor if we can clarify the situation with devicechange event 15:26:50 Youenn: ready for PR then? 15:27:05 Jan-Ivar: we can continue on the issue but not opposed to a PR 15:27:16 RESOLVED: proceed with proposed change with additional discussion expected 15:27:24 Subtopic: Expose the type of device in MediaDeviceInfo #1 15:27:24 [slide 13] 15:28:48 Jan-Ivar: LGTM, doesn't seem to bring privacy issues since they're only exposed when the device is exposed 15:29:06 ... should there be a headset category? 15:29:15 Youenn: we can try this 15:29:31 Harald: I'm a bit worried about the specifics of the enumeration 15:30:04 ... e.g. many mics are usb even they're built-in 15:30:16 Youenn: I can bring more info on what Windows / MacOS expose 15:30:51 RESOLVED: Proceed with a pull request with additional discussion on enumerated values 15:31:06 Subtopic: Speaker devices may not always work with all microphones #149 15:31:06 [slide 14] 15:33:12 Guido: what would be the alternative to failing gUM/setSinkId? 15:33:46 Youenn: I don't have a specific proposal; I was first trying to get a sense if that's a problem worth fixing (e.g. if it affects other OS) 15:34:06 Guido: maybe let's focus first on identifying how widespread an issue it is 15:34:36 Jan-Ivar: this reminds me of the issue where you can't open multiple mics on phones; don't have a good solution off the top of my head either 15:34:56 Topic: -> https://github.com/w3c/webrtc-extensions/issues/146 Decoder exposure and software fallback 15:34:56 [slide 17] 15:36:16 RRSAgent, draft minutes 15:36:17 I have made the request to generate https://www.w3.org/2025/09/16-webrtc-minutes.html dom 15:37:02 [slide 18] 15:38:24 [slide 19] 15:39:14 [slide 20] 15:39:34 [slide 21] 15:40:43 Youenn: the Privacy Working Group had raised concerns - we should ask them if we're looking at this again 15:41:07 ... if media capabilities already provide that info through polling - is that good enough? 15:41:51 ... polling instead of an event might be a feature here 15:42:28 Nishitha: media capabilities doesn't expose what is actually reflect what's happening during streaming 15:42:53 Diego: mc signals the potential to have the hardware decode enabled, but it doesn't say if it is happening 15:43:32 ... e.g. we can't get info on situations where MC says there is hardware decode but we're not seeing it used 15:44:34 ... there are software-fallback situations where errors occur that are can't be monitored via telemetry 15:45:04 Youenn: MC solves hardware support, but not lack of temporary availability. maybe it's a shortage of MC? 15:46:18 Diego: given that streams get negotiated during SDP O/A with the codec profile and format and characteristics that can lead to a decoder giving up in the middle of the stream; MC require predicting all possible cases to detect these situations when this event could give much more specific direction 15:47:14 Youenn: if the PRivacy Working Group is fine with this, I'm fine too; but these issues might arise in WebCodecs as well, so having a single solution would be nice 15:47:53 Jan-Ivar: I understand the event proposal comes from feedback from the Privacy WG (vs stats) 15:49:06 ... It's not really clear what fallback means 15:49:48 ... e.g. would that event be fired in a system without hardware decode support? 15:50:36 ... there are also situations (e.g. small frames) where software decode wouldn't be a sign of a problem 15:51:07 ... in terms of API shape, I prefer B rather than A that makes it harder to distinguish fatal errors 15:51:54 ... supportive of direction but with more clarification on situation of failures 15:52:32 TimP: supportive of this, but less supportive of the "fallback" concept and the hardware/software dichotomy 15:52:52 ... I think the event we want is "decoder implementation changed" 15:53:19 ... I think what we really care about is latency, not whether it's hardware or software 15:53:32 ... it would be nice to have stats on average frame decode time if we don't have one 15:53:39 Fippo: we do 15:53:55 TimP: then trigger on implementation change + stats would work 15:55:10 Diego: detecting device type is really hard for (good) privacy protection reasons, so we can't really figure the characteristics of the devices on which the stream is running, in particular to detect regressions 15:55:32 TimP: but knowing the decoder has changed under your feet, would that help? 15:55:47 Diego: CPU decode is not only about latency: it has impact on battery and thermal impact 15:58:02 ... the event would be useful, but less useful 15:59:56 dom: if we want to do this, we should do this and get feedback from Privacy WG 16:00:43 ... events can add privacy attacks by surfacing on two different origins 16:00:52 Harald: why on Transceiver vs Receiver? 16:00:59 Fippo: +1 to Receiver 16:01:20 RESOLVED: discuss proposal in more depth and prepare for Privacy review 16:01:28 Topic: -> https://github.com/w3c/webrtc-encoded-transform/ generateKeyFrame() API consolidation (Jan-Ivar) 16:01:28 Subtopic: Issue #273 / PR #274: Remove sender.generateKeyFrame() 16:01:28 [slide 25] 16:03:35 TimP: I don't like the first API - encoding parameters should be less dynamic than that, this is not an encoding parameter; the second API makes much more sense 16:04:04 Jan-Ivar: the argument why we went for this API is that it allows to combine changing all parameters and sending a keyframe at the same time 16:04:32 RESOLVED: Proceed with removing unimplemented API 16:04:59 Subtopic: Issue #147: expose rid as metadata on outgoing frames 16:04:59 [slide 26] 16:06:20 Fippo: we would like the encoding index in addition of the rid; we would like the mid since it isn't available in workers 16:06:38 Jan-Ivar: the mid can be passed as an option 16:06:58 Youenn: or in the Transformer itself 16:07:16 ... there will be one per mid 16:07:26 ... not exposing it in frames makes it more lightweight 16:07:43 ... we should file an issue on this 16:08:03 Jan-Ivar: adding an encodingIndex can also be filed an issue 16:08:29 Fippo: having it in addition to rid is an ergonomy value 16:08:36 RESOLVED: Proceed with pull request 16:08:45 Subtopic: PR #276: Default the generate key frame algorithm to all layers 16:08:45 [slide 27] 16:10:09 Youenn: the main use case is changing the encryption key in which case you want to generate keyframes for all layers 16:10:14 RESOLVED: proceed with merging PR 16:10:20 Subtopic: Issue 143: should transform.generateKeyFrame() take an array of rids? 16:10:20 [slide 28] 16:11:28 [slide 29] 16:11:30 [slide 30] 16:13:16 Youenn: no strong preference, but a slight preference to keep it as is since it matches the design requirements (encryption, per-rid keyframe); not sure what the use cases would be for different subsets; it adds complexity (e.g. what happens if one is invalid) 16:14:04 Fippo: there are use cases which only require 2 layers, e.g. on this call 16:14:24 Youenn: but this a use case for Transformer - we have setParameters otherwise 16:14:53 Fippo: what would be return value? Originally, it returned a timestamp which wouldn't work for an array 16:15:07 Jan-Ivar: already changed to undefined 16:15:58 Dom: let's leave it as is; we can change it to DOMString or Array if there is an important use case 16:16:16 RESOLVED: Leave current API with single DOMString argument 16:16:24 Topic: RTCDataChannel (SDP and stats) 16:16:24 Subtopic: -> https://github.com/w3c/webrtc-extensions/issues/241 Always negotiate datachannels 16:16:24 [slide 33] 16:19:00 Jan-Ivar: the problem is that BUNDLE attaches to the first m-line by default? 16:19:21 Fippo: right; since datachannels can't be rejected, they're the right target for BUNDLE 16:19:28 Jan-Ivar: thanks, makes sense to me 16:19:33 Youenn: +1 16:19:54 ... would be good to look into a JSEP revision given this is a second item on the revision list 16:20:11 Fippo: I have a bunch of issues against JSEP, I can talk with Justin on a third revision 16:20:17 Jan-Ivar: that'd be great 16:20:29 ... are there any concerns on compat issues? 16:20:34 Fippo: sounds unlikely 16:20:52 Dom: let's file a JSEP issue at the same time 16:21:00 RESOLVED: Proceed with PR and JSEP issue 16:21:09 Subtopic: -> https://github.com/w3c/webrtc-stats/issues/805# What is the lifetime of stats? 16:21:09 [slide 34] 16:22:23 [slide 35] 16:24:23 Youenn: will changes there create web compat issues? hopefully there is still room for making the right decisions 16:24:35 Fippo: I have web compat concerns for inboundrtp, we'll see 16:25:02 Jan-Ivar: thanks a lot for the analysis, showing diversity across stats, implementations (not clear what the spec asks for) 16:25:21 ... when implementations have a shared behavior, that's hopefully a good direction to go 16:25:37 ... +1 to documenting and cleaning as much as web compat enables 16:26:43 Fippo: the problem is creating stat objects before the relevant object is indeed created 16:27:23 ... Documenting rules and their motivation would be good, before seeing what we can change 16:27:35 Jan-Ivar: another parameter to take into account is rollback 16:28:01 Harald: there was a specific situation with candidate pair that some pairs contain ip addresses that are considered sensitive 16:28:13 ... I don't know if that impacts on when they're exposed 16:28:23 Fippo: they're hidden, so it shouldn't matter 16:29:01 Harald: the number of outgoing datachannels you create shoudl be equal to the number reflected in stats; I would be in favor to have them show up early 16:29:13 Fippo: let's document the behavior and then disagree on the right one :) 16:29:44 TimP: I'm happy with it being early; it's unpleasant but necessary 16:30:04 Jan-Ivar: having it late mean having it more useful; more generally, for early stats, we should be clear on what data they expose 16:30:13 Fippo: will report on this at the next meeting 16:30:19 Subtopic: -> https://github.com/w3c/webrtc-pc/issues/3071 data channel ids set before SCTP init #3071 16:30:19 [slide 36] 16:32:44 TimP: in theory, you could request more datachannels than the other party would accept 16:32:51 Fippo: good point, we need to look into that 16:33:03 Jan-Ivar: another aspect is workers 16:33:17 ... if all browsers do the same thing, documenting it sounds good to me 16:33:30 RESOLVED: Proceed with a PR 16:33:43 Topic: -> https://github.com/w3c/mst-content-hint/issues/62 Bring Your Own Degradation Adaptation 16:33:43 [slide 39] 16:34:38 [slide 40] 16:35:27 [slide 41] 16:36:37 Jan-Ivar: SGTM 16:36:44 Fippo: +1 16:37:16 ... would it make sense to expose the QP on the insertable stream as well? (rather than using getStats) 16:37:28 Sergey: exposing QP per frame sounds good 16:37:32 Guido: please file an issue 16:37:55 TimP: also in favor; as Fippo said, there may be more data needed outside of stats 16:41:11 Fippo: maintain-framerate / maintain-resolution - this adds the 3rd point of the triangle (with balance in the center) 16:41:28 Guido: there is an existing PR where the conversation can continue 16:41:37 RESOLVED: proceed with PR 16:41:42 Topic: -> https://github.com/w3c/webrtc-encoded-transform/issues/262 SFrameEncrypterStream rename 16:41:42 [slide 44] 16:44:10 Youenn: the behavior is not undefined 16:44:47 ... that isn't to say having different objects would be useful - e.g. for decrypting/encrypting 16:45:00 ... initially, one object for everything was sufficient 16:46:01 Harald: initially, we thought SFrameTransform would be added as a first or last step in a chain of transforms 16:46:31 ... if we're abandoning that model (which I think we should since nobody has implemented), we should look at how to apply it to a sender/receiver 16:46:50 [slide 45] 16:48:46 Youenn: +1 16:48:57 ... we will be able to add management key APIs dedicated to decryption and encryption 16:49:14 ... we might be able to duplicate these APIs in SFrameTransform as well 16:49:31 ... letting the UA do the encryption sounds like a good thing in general 16:50:07 Harald: I would like to see an example of ScriptTransform and SFrameTransform together 16:50:18 Jan-Ivar: see slide 16:50:23 Harald: that makes sense 16:50:31 Jan-Ivar: that wouldn't work for SPacket though 16:51:16 Harald: SGTM 16:51:23 RESOLVED: Proceed with PR 16:51:26 RRSAgent, draft minutes 16:51:28 I have made the request to generate https://www.w3.org/2025/09/16-webrtc-minutes.html dom 18:33:29 Zakim has left #webrtc