Scherm delen vanuit een actieve Jitsi-call (#2537) #2585

Merged
brenno merged 2 commits from feat/jitsi-call-05-screenshare into main 2026-10-25 08:46:44 +00:00
Owner

Wat

  • MeetingSession/MeetingMediaConnection krijgen het deeloppervlak: screenShareSources, startScreenShare(sourceId/sourceLabel), stopScreenShare, screenShareLabel — plus screenSources/addLocalScreen/stopScreenShare op de media-seam.
  • WebRTC-binding: desktop desktopCapturer.getSources → kiezer met miniaturen; getDisplayMedia met deviceId.exact voor de gekozen bron. De schermtrack gaat via replaceTrack op de vaste video-sender — geen nieuwe m-line, geen heronderhandeling. Camera aanzetten tijdens delen verdringt het scherm niet; stoppen zet de camera terug, en was het scherm de enige video-bron dan gaat er een source-remove uit.
  • Signalering: buildSourceRemove, jitsiSourceAnnounceIq/jitsiSourceRemoveIq, SourceInfo met videoType: 'desktop', en de roster markeert remote -v0-bronnen met isScreenShare.
  • Fouten (weigering, annuleren, bronverlies via track.onEnded) zijn niet-terminale MeetingErrorEvents — nooit een dode knop of een achtergebleven deel-indicator.
  • CallPanel: deelknop alleen als capabilities.screenShare (platformfeit — desktop/web, nooit mobiel), kiezer waar er een bronlijst is, browser-route zonder eigen kiezer, live-bronlabel boven de knoppen.

Structuur

De sessieklasse stond op de grens: de lokale-media-levenscyclus is naar jitsi_local_media.dart (part of, spiegel van JitsiRemoteMedia) en de bron-wire-parsers naar jitsi_source_wire.dart — beide onder het plafond.

Testplan

  • 186 meetings-tests groen (source-remove-builder, share met camera uit → source-add, stop → camera terug, weigering → melding, remote videoType → isScreenShare, bronverlies-flows)
  • nieuwe goldens: de kiezer en het delende paneel in licht+donker
  • volle make check groen (formaat, analyze, conventies, suite 14600+, coverage, per-file-vloer, goldens)
  • cappedMemoryImage voor OS-miniaturen (image-decode-guard)

Generated with Devin

## Wat - `MeetingSession`/`MeetingMediaConnection` krijgen het deeloppervlak: `screenShareSources`, `startScreenShare(sourceId/sourceLabel)`, `stopScreenShare`, `screenShareLabel` — plus `screenSources`/`addLocalScreen`/`stopScreenShare` op de media-seam. - WebRTC-binding: desktop `desktopCapturer.getSources` → kiezer met miniaturen; `getDisplayMedia` met `deviceId.exact` voor de gekozen bron. De schermtrack gaat via `replaceTrack` op de vaste video-sender — geen nieuwe m-line, geen heronderhandeling. Camera aanzetten tijdens delen verdringt het scherm niet; stoppen zet de camera terug, en was het scherm de enige video-bron dan gaat er een `source-remove` uit. - Signalering: `buildSourceRemove`, `jitsiSourceAnnounceIq`/`jitsiSourceRemoveIq`, `SourceInfo` met `videoType: 'desktop'`, en de roster markeert remote -v0-bronnen met `isScreenShare`. - Fouten (weigering, annuleren, bronverlies via `track.onEnded`) zijn niet-terminale `MeetingErrorEvent`s — nooit een dode knop of een achtergebleven deel-indicator. - CallPanel: deelknop alleen als `capabilities.screenShare` (platformfeit — desktop/web, nooit mobiel), kiezer waar er een bronlijst is, browser-route zonder eigen kiezer, live-bronlabel boven de knoppen. ## Structuur De sessieklasse stond op de grens: de lokale-media-levenscyclus is naar `jitsi_local_media.dart` (`part of`, spiegel van `JitsiRemoteMedia`) en de bron-wire-parsers naar `jitsi_source_wire.dart` — beide onder het plafond. ## Testplan - [x] 186 meetings-tests groen (source-remove-builder, share met camera uit → source-add, stop → camera terug, weigering → melding, remote videoType → isScreenShare, bronverlies-flows) - [x] nieuwe goldens: de kiezer en het delende paneel in licht+donker - [x] volle `make check` groen (formaat, analyze, conventies, suite 14600+, coverage, per-file-vloer, goldens) - [x] `cappedMemoryImage` voor OS-miniaturen (image-decode-guard) Generated with [Devin](https://devin.ai)
De seam krijgt een deeloppervlak: screenSources (desktop-bronlijst met
miniaturen, leeg waar de browser zelf kiest) en addLocalScreen — die legt
de schermtrack via replaceTrack op de vaste video-sender, zodat de m-line
én de aangekondigde bron <nick>-v0 gelijk blijven zoals lib-jitsi-meet
delen neerlegt. Een camera die aangaat tijdens delen verdringt het scherm
niet; stoppen zet hem terug, en zonder camera is de share zijn eigen bron
met source-add/-remove. SourceInfo markeert -v0 met videoType 'desktop';
de roster parseert dat voor remote participants. Weigering, annuleren en
bronverlies zijn niet-terminale MeetingErrorEvents — de call blijft
intact. De sessieklasse groeide over haar regelplafond, dus de lokale-
media-levenscyclus (track-ids, ssrc's, share-staat, source-/presence-
signalering) is uitgeleid naar JitsiLocalMedia als part-bestand; de bron-
wire-parsers naar jitsi_source_wire.dart. Het paneel toont een kiezer
waar het OS een lijst geeft, de deelknop wisselt naar "Delen stoppen" en
noemt de live bron.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Zeven nieuwe strings (deelknop/stop/kiezer/bronverlies-meldingen) in alle
30 talen via add_l10n; de wees geworden "nog niet beschikbaar"-placeholder
is uit elke tabel. USER_GUIDE (EN+NL) en NATIVE_CALLS zeggen niet langer
dat delen ontbreekt maar waar het werkt en waar niet; SOURCE_MAP krijgt
de twee nieuwe bestanden en de gesplitste entries.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
brenno merged commit 5b77cdf91c into main 2026-10-25 08:46:44 +00:00
Sign in to join this conversation.
No description provided.