Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package galene for openSUSE:Factory checked in at 2022-01-27 23:17:02 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/galene (Old) and /work/SRC/openSUSE:Factory/.galene.new.1898 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "galene" Thu Jan 27 23:17:02 2022 rev:14 rq:949529 version:0.4.3 Changes: -------- --- /work/SRC/openSUSE:Factory/galene/galene.changes 2021-12-02 22:31:08.922466148 +0100 +++ /work/SRC/openSUSE:Factory/.galene.new.1898/galene.changes 2022-01-27 23:18:54.418173956 +0100 @@ -1,0 +2,11 @@ +Thu Jan 27 18:08:56 UTC 2022 - mich...@stroeder.com + +- Update to version 0.4.3 + * Fix a locking issue that could cause a deadlock when massive numbers + of clients join at the same time. + * Add support for displaying raised hands. + * Update the MIME type for AV1 to track recent browsers. + * Avoid overflow during rate estimation. + * More fixes to the disk writer. + +------------------------------------------------------------------- Old: ---- galene-0.4.2.tar.gz New: ---- galene-0.4.3.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ galene.spec ++++++ --- /var/tmp/diff_new_pack.kZthvS/_old 2022-01-27 23:18:54.918170501 +0100 +++ /var/tmp/diff_new_pack.kZthvS/_new 2022-01-27 23:18:54.926170446 +0100 @@ -1,7 +1,7 @@ # # spec file for package galene # -# Copyright (c) 2021 SUSE LLC +# Copyright (c) 2022 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -25,7 +25,7 @@ %bcond_without apparmor Name: galene -Version: 0.4.2 +Version: 0.4.3 Release: 0 Summary: Gal??ne videoconferencing server License: MIT ++++++ _service ++++++ --- /var/tmp/diff_new_pack.kZthvS/_old 2022-01-27 23:18:54.974170115 +0100 +++ /var/tmp/diff_new_pack.kZthvS/_new 2022-01-27 23:18:54.978170087 +0100 @@ -3,8 +3,8 @@ <param name="url">git://github.com/jech/galene.git</param> <param name="scm">git</param> <param name="exclude">.git</param> - <param name="revision">galene-0.4.2</param> - <param name="version">0.4.2</param> + <param name="revision">galene-0.4.3</param> + <param name="version">0.4.3</param> <param name="changesgenerate">enable</param> <!--param name="versionrewrite-pattern">galene-(\d+)</param> <param name="versionrewrite-replacement">\1</param--> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.kZthvS/_old 2022-01-27 23:18:55.002169921 +0100 +++ /var/tmp/diff_new_pack.kZthvS/_new 2022-01-27 23:18:55.010169866 +0100 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">git://github.com/jech/galene.git</param> - <param name="changesrevision">0e85552ea776d7d7e8498e599b5655ed9d7a244e</param></service></servicedata> + <param name="changesrevision">c1eb8a9cb5db7d94d8098d16e0b9cb92108c3da7</param></service></servicedata> (No newline at EOF) ++++++ galene-0.4.2.tar.gz -> galene-0.4.3.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/galene-0.4.2/CHANGES new/galene-0.4.3/CHANGES --- old/galene-0.4.2/CHANGES 2021-12-02 00:09:28.000000000 +0100 +++ new/galene-0.4.3/CHANGES 2022-01-27 14:22:43.000000000 +0100 @@ -1,3 +1,12 @@ +27 January 2021: Gal??ne 0.4.3 + + * Fix a locking issue that could cause a deadlock when massive numbers + of clients join at the same time. + * Add support for displaying raised hands (thanks to Sascha Silbe). + * Update the MIME type for AV1 to track recent browsers. + * Avoid overflow during rate estimation. + * More fixes to the disk writer. + 1 December 2021: Gal??ne 0.4.2 * Update the samplebuilder to avoid a crash when a single frame is so diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/galene-0.4.2/README.FRONTEND new/galene-0.4.3/README.FRONTEND --- old/galene-0.4.2/README.FRONTEND 2021-12-02 00:09:28.000000000 +0100 +++ new/galene-0.4.3/README.FRONTEND 2022-01-27 14:22:43.000000000 +0100 @@ -54,23 +54,44 @@ `ondownstream` is called when the server pushes a stream to the client; see the section below about streams. -You may now connect to the server. +You may now connect to the server: ```javascript serverConnection.connect(`wss://${location.host}/ws`); ``` -You typically join a group and request media in the `onconnected` callback: +You typically join a group in the `onconnected` callback: ```javascript serverConnection.onconnected = function() { this.join(group, 'join', username, password); - this.request({'':['audio','video']}); } ``` -You should not attempt to push a stream to the server until it has granted -you the `present` permission through the `onjoined` callback. +After the server has replied to the join request, the `onjoined` callback +will trigger. There, you update your user interface and request incoming +streams: + +```javascript +serverConnection.onjoined = function(kind, group, perms, status, message) { + switch(kind) { + case 'join': + this.request({'':['audio','video']}); + // then update the UI, possibly taking perms.present into account + break; + case 'change': + // update the UI + break; + case 'redirect': + this.close(); + document.location.href = message; + break; + case 'fail': + // display the friendly error message + break; +} +``` + ## Sending and receiving chat messages @@ -85,6 +106,7 @@ request that you clear your chat window, in that case the `onclearchat` callback will trigger. + ## Other messages The `usermessage` method of the `ServerConnection` is similar to the diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/galene-0.4.2/codecs/codecs.go new/galene-0.4.3/codecs/codecs.go --- old/galene-0.4.2/codecs/codecs.go 2021-12-02 00:09:28.000000000 +0100 +++ new/galene-0.4.3/codecs/codecs.go 2022-01-27 14:22:43.000000000 +0100 @@ -46,7 +46,7 @@ return (vp9.Payload[0] & 0xC) == 0, true } return (vp9.Payload[0] & 0x6) == 0, true - } else if strings.EqualFold(codec, "video/av1x") { + } else if strings.EqualFold(codec, "video/av1") { if len(packet.Payload) < 2 { return false, true } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/galene-0.4.2/diskwriter/diskwriter.go new/galene-0.4.3/diskwriter/diskwriter.go --- old/galene-0.4.2/diskwriter/diskwriter.go 2021-12-02 00:09:28.000000000 +0100 +++ new/galene-0.4.3/diskwriter/diskwriter.go 2022-01-27 14:22:43.000000000 +0100 @@ -184,8 +184,8 @@ // called locked func (conn *diskConn) reopen(extension string) error { for _, t := range conn.tracks { + t.writeBuffered(true) if t.writer != nil { - t.writeBuffered(true) t.writer.Close() t.writer = nil } @@ -207,8 +207,8 @@ conn.mu.Lock() tracks := make([]*diskTrack, 0, len(conn.tracks)) for _, t := range conn.tracks { + t.writeBuffered(true) if t.writer != nil { - t.writeBuffered(true) t.writer.Close() t.writer = nil } @@ -414,7 +414,7 @@ count := p.SequenceNumber - lastSeqno if count < 256 { for i := uint16(1); i < count; i++ { - recover(t, lastSeqno + i) + fetch(t, lastSeqno+i) } } else { requestKeyframe(t) @@ -439,10 +439,10 @@ return len(buf), nil } -func recover(t *diskTrack, seqno uint16) { +func fetch(t *diskTrack, seqno uint16) { // since the samplebuilder retains packets, use a fresh buffer buf := make([]byte, 1504) - n := t.remote.GetPacket(seqno, buf, true) + n := t.remote.GetPacket(seqno, buf, false) if n == 0 { return } @@ -462,7 +462,7 @@ } } -// writeRTP writes the packet without doing any loss recovery. +// writeRTP writes the packet without fetching lost packets // Called locked. func (t *diskTrack) writeRTP(p *rtp.Packet) error { codec := t.remote.Codec().MimeType @@ -470,6 +470,9 @@ kf, _ := gcodecs.Keyframe(codec, p) if kf { t.savedKf = p + t.lastKf = time.Now() + } else if time.Since(t.lastKf) > 4*time.Second { + requestKeyframe(t) } } @@ -518,7 +521,6 @@ } } } else { - keyframe = true if t.writer == nil { if !t.conn.hasVideo { err := t.conn.initWriter(0, 0) @@ -533,14 +535,6 @@ } } - now := time.Now() - if keyframe { - t.lastKf = now - } else if t.writer == nil || now.Sub(t.lastKf) > 4*time.Second { - requestKeyframe(t) - return nil - } - if t.writer == nil { continue } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/galene-0.4.2/go.mod new/galene-0.4.3/go.mod --- old/galene-0.4.2/go.mod 2021-12-02 00:09:28.000000000 +0100 +++ new/galene-0.4.3/go.mod 2022-01-27 14:22:43.000000000 +0100 @@ -6,14 +6,15 @@ github.com/at-wat/ebml-go v0.16.0 github.com/gorilla/websocket v1.4.2 github.com/jech/cert v0.0.0-20210819231831-aca735647728 - github.com/jech/samplebuilder v0.0.0-20211128135502-32cf2bc0a2b6 - github.com/pion/ice/v2 v2.1.14 + github.com/jech/samplebuilder v0.0.0-20220125212352-4553ed6f9a6c + github.com/pion/ice/v2 v2.1.19 + github.com/pion/interceptor v0.1.7 // indirect github.com/pion/rtcp v1.2.9 github.com/pion/rtp v1.7.4 github.com/pion/sdp/v3 v3.0.4 - github.com/pion/turn/v2 v2.0.5 - github.com/pion/webrtc/v3 v3.1.11 - golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871 - golang.org/x/net v0.0.0-20211123203042-d83791d6bcd9 // indirect - golang.org/x/sys v0.0.0-20211124211545-fe61309f8881 + github.com/pion/turn/v2 v2.0.6 + github.com/pion/webrtc/v3 v3.1.17 + golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce + golang.org/x/net v0.0.0-20220121210141-e204ce36a2ba // indirect + golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/galene-0.4.2/go.sum new/galene-0.4.3/go.sum --- old/galene-0.4.2/go.sum 2021-12-02 00:09:28.000000000 +0100 +++ new/galene-0.4.3/go.sum 2022-01-27 14:22:43.000000000 +0100 @@ -14,10 +14,12 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= @@ -25,8 +27,8 @@ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/jech/cert v0.0.0-20210819231831-aca735647728 h1:tN+W1ll2oKuJGMCaO1CRK4rr+xSRjVSfWmnKlACdx38= github.com/jech/cert v0.0.0-20210819231831-aca735647728/go.mod h1:FXUA/zpiQfV4uBVN2kAwkf3X7pU7l1l2ovS45CsSYZs= -github.com/jech/samplebuilder v0.0.0-20211128135502-32cf2bc0a2b6 h1:H9gIl/rX1Lb44RxR/9tljyQWC/cvlWGBSSuSb5iOnII= -github.com/jech/samplebuilder v0.0.0-20211128135502-32cf2bc0a2b6/go.mod h1:v8Ft/hAXNMLvYSyhWFcKgKgfqPV4EwOhVwk4oLstjpE= +github.com/jech/samplebuilder v0.0.0-20220125212352-4553ed6f9a6c h1:szaz3cPxulEofkxi5SDehgVF32ceQAi6E2VsRrm348U= +github.com/jech/samplebuilder v0.0.0-20220125212352-4553ed6f9a6c/go.mod h1:U83y/Kl/5BrI9ceNw17+lmguIrlUlMVntxKmZmei5EA= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -37,21 +39,27 @@ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.16.1/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.11.0/go.mod h1:azGKhqFUon9Vuj0YmTfLSmx0FUwqXYSTl5re8lQLTUg= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/pion/datachannel v1.4.21/go.mod h1:oiNyP4gHx2DIwRzX/MFyH0Rz/Gz05OgBlayAI2hAWjg= github.com/pion/datachannel v1.5.2 h1:piB93s8LGmbECrpO84DnkIVWasRMk3IimbcXkTQLE6E= github.com/pion/datachannel v1.5.2/go.mod h1:FTGQWaHrdCwIJ1rw6xBIfZVkslikjShim5yr05XFuCQ= github.com/pion/dtls/v2 v2.0.9/go.mod h1:O0Wr7si/Zj5/EBFlDzDd6UtVxx25CE1r7XM7BQKYQho= -github.com/pion/dtls/v2 v2.0.10 h1:wgys7gPR1NMbWjmjJ3CW7lkUGaun8djgH8nahpNLnxI= -github.com/pion/dtls/v2 v2.0.10/go.mod h1:00OxfeCRWHShcqT9jx8pKKmBWuTt0NCZoVPCaC4VKvU= -github.com/pion/ice/v2 v2.1.10/go.mod h1:kV4EODVD5ux2z8XncbLHIOtcXKtYXVgLVCeVqnpoeP0= -github.com/pion/ice/v2 v2.1.14 h1:nD9GZs3MiR1/dPa5EiMRMe8hLBG3/qqCdx/hTS2g8VE= -github.com/pion/ice/v2 v2.1.14/go.mod h1:ovgYHUmwYLlRvcCLI67PnQ5YGe+upXZbGgllBDG/ktU= -github.com/pion/interceptor v0.0.15/go.mod h1:pg3J253eGi5bqyKzA74+ej5Y19ez2jkWANVnF+Z9Dfk= -github.com/pion/interceptor v0.1.2 h1:1IfrJ+AQ0HhwxNl4hqh9hMvl1hBKiNhAAr7DrUHsC6s= -github.com/pion/interceptor v0.1.2/go.mod h1:Lh3JSl/cbJ2wP8I3ccrjh1K/deRGRn3UlSPuOTiHb6U= +github.com/pion/dtls/v2 v2.0.13/go.mod h1:OaE7eTM+ppaUhJ99OTO4aHl9uY6vPrT1gPY27uNTxRY= +github.com/pion/dtls/v2 v2.1.0 h1:g6gtKVNLp6URDkv9OijFJl16kqGHzVzZG+Fa4A38GTY= +github.com/pion/dtls/v2 v2.1.0/go.mod h1:qG3gA7ZPZemBqpEFqRKyURYdKEwFZQCGb7gv9T3ON3Y= +github.com/pion/ice/v2 v2.1.12/go.mod h1:ovgYHUmwYLlRvcCLI67PnQ5YGe+upXZbGgllBDG/ktU= +github.com/pion/ice/v2 v2.1.18/go.mod h1:9jDr0iIUg8P6+0Jq8QJ/eFSkX3JnsPd293TjCdkfpTs= +github.com/pion/ice/v2 v2.1.19 h1:z7iVx/fHlqvPILUbvcj1xjuz/6eVKgEFOM8h1AuLbF8= +github.com/pion/ice/v2 v2.1.19/go.mod h1:E5frMpIJ3zzcQiRo+XyT7z1IiAsGc1hDURcVJQUzGWA= +github.com/pion/interceptor v0.1.0/go.mod h1:j5NIl3tJJPB3u8+Z2Xz8MZs/VV6rc+If9mXEKNuFmEM= +github.com/pion/interceptor v0.1.6/go.mod h1:Lh3JSl/cbJ2wP8I3ccrjh1K/deRGRn3UlSPuOTiHb6U= +github.com/pion/interceptor v0.1.7 h1:HThW0tIIKT9RRoDWGURe8rlZVOx0fJHxBHpA0ej0+bo= +github.com/pion/interceptor v0.1.7/go.mod h1:Lh3JSl/cbJ2wP8I3ccrjh1K/deRGRn3UlSPuOTiHb6U= github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY= github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= github.com/pion/mdns v0.0.5 h1:Q2oj/JB3NqfzY9xGZ1fPzZzK7sDSD8rZPOvcIQ10BCw= @@ -59,17 +67,18 @@ github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA= github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8= github.com/pion/rtcp v1.2.6/go.mod h1:52rMNPWFsjr39z9B9MhnkqhPLoeHTv1aN63o/42bWE0= +github.com/pion/rtcp v1.2.8/go.mod h1:qVPhiCzAm4D/rxb6XzKeyZiQK69yJpbUDJSF7TgrqNo= github.com/pion/rtcp v1.2.9 h1:1ujStwg++IOLIEoOiIQ2s+qBuJ1VN81KW+9pMPsif+U= github.com/pion/rtcp v1.2.9/go.mod h1:qVPhiCzAm4D/rxb6XzKeyZiQK69yJpbUDJSF7TgrqNo= github.com/pion/rtp v1.7.0/go.mod h1:bDb5n+BFZxXx0Ea7E5qe+klMuqiBrP+w8XSjiWtCUko= -github.com/pion/rtp v1.7.1/go.mod h1:bDb5n+BFZxXx0Ea7E5qe+klMuqiBrP+w8XSjiWtCUko= github.com/pion/rtp v1.7.2/go.mod h1:bDb5n+BFZxXx0Ea7E5qe+klMuqiBrP+w8XSjiWtCUko= github.com/pion/rtp v1.7.4 h1:4dMbjb1SuynU5OpA3kz1zHK+u+eOCQjW3MAeVHf1ODA= github.com/pion/rtp v1.7.4/go.mod h1:bDb5n+BFZxXx0Ea7E5qe+klMuqiBrP+w8XSjiWtCUko= github.com/pion/sctp v1.7.10/go.mod h1:EhpTUQu1/lcK3xI+eriS6/96fWetHGCvBi9MSsnaBN0= github.com/pion/sctp v1.7.12/go.mod h1:xFe9cLMZ5Vj6eOzpyiKjT9SwGM4KpK/8Jbw5//jc+0s= -github.com/pion/sctp v1.8.0 h1:6erMF2qmQwXr+0iB1lm0AUSmDr9LdmpaBzgSVAEgehw= github.com/pion/sctp v1.8.0/go.mod h1:xFe9cLMZ5Vj6eOzpyiKjT9SwGM4KpK/8Jbw5//jc+0s= +github.com/pion/sctp v1.8.2 h1:yBBCIrUMJ4yFICL3RIvR4eh/H2BTTvlligmSTy+3kiA= +github.com/pion/sctp v1.8.2/go.mod h1:xFe9cLMZ5Vj6eOzpyiKjT9SwGM4KpK/8Jbw5//jc+0s= github.com/pion/sdp/v3 v3.0.4 h1:2Kf+dgrzJflNCSw3TV5v2VLeI0s/qkzy2r5jlR0wzf8= github.com/pion/sdp/v3 v3.0.4/go.mod h1:bNiSknmJE0HYBprTHXKPQ3+JjacTv5uap92ueJZKsRk= github.com/pion/srtp/v2 v2.0.5 h1:ks3wcTvIUE/GHndO3FAvROQ9opy0uLELpwHJaQ1yqhQ= @@ -78,15 +87,17 @@ github.com/pion/stun v0.3.5/go.mod h1:gDMim+47EeEtfWogA37n6qXZS88L5V6LqFcf+DZA2UA= github.com/pion/transport v0.10.1/go.mod h1:PBis1stIILMiis0PewDw91WJeLJkyIMcEk+DwKOzf4A= github.com/pion/transport v0.12.2/go.mod h1:N3+vZQD9HlDP5GWkZ85LohxNsDcNgofQmyL6ojX5d8Q= -github.com/pion/transport v0.12.3 h1:vdBfvfU/0Wq8kd2yhUMSDB/x+O4Z9MYVl2fJ5BT4JZw= github.com/pion/transport v0.12.3/go.mod h1:OViWW9SP2peE/HbwBvARicmAVnesphkNkCVZIWJ6q9A= -github.com/pion/turn/v2 v2.0.5 h1:iwMHqDfPEDEOFzwWKT56eFmh6DYC6o/+xnLAEzgISbA= +github.com/pion/transport v0.13.0 h1:KWTA5ZrQogizzYwPEciGtHPLwpAjE91FgXnyu+Hv2uY= +github.com/pion/transport v0.13.0/go.mod h1:yxm9uXpK9bpBBWkITk13cLo1y5/ur5VQpG22ny6EP7g= github.com/pion/turn/v2 v2.0.5/go.mod h1:APg43CFyt/14Uy7heYUOGWdkem/Wu4PhCO/bjyrTqMw= +github.com/pion/turn/v2 v2.0.6 h1:AsXjSPR6Im15DMTB39NlfdTY9BQfieANPBjdg/aVNwY= +github.com/pion/turn/v2 v2.0.6/go.mod h1:+y7xl719J8bAEVpSXBXvTxStjJv3hbz9YFflvkpcGPw= github.com/pion/udp v0.1.1 h1:8UAPvyqmsxK8oOjloDk4wUt63TzFe9WEJkg5lChlj7o= github.com/pion/udp v0.1.1/go.mod h1:6AFo+CMdKQm7UiA0eUPA8/eVCTx8jBIITLZHc9DWX5M= -github.com/pion/webrtc/v3 v3.1.0-beta.3/go.mod h1:I4O6v2pkiXdVmcn7sUhCNwHUAepGU19PVEyR204s1qc= -github.com/pion/webrtc/v3 v3.1.11 h1:8Q5BEsxvlDn3botM8U8n/Haln745FBa5TWgm8v2c2FA= -github.com/pion/webrtc/v3 v3.1.11/go.mod h1:h9pbP+CADYb/99s5rfjflEcBLgdVKm55Rm7heQ/gIvY= +github.com/pion/webrtc/v3 v3.1.0/go.mod h1:t51XSam1k56eYLuO1Ubxjs3pDBfGYxkGBFhYf55Mn/s= +github.com/pion/webrtc/v3 v3.1.17 h1:6V4Yf5wnvJZKs86401EcpsKmB5Px5pfF1ICXdPIRsC0= +github.com/pion/webrtc/v3 v3.1.17/go.mod h1:kHunUx6HPCbCvGy/HdWQNwtT9LJ2XMS/sBmLwB1A4rs= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -101,9 +112,10 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871 h1:/pEO3GD/ABYAjuakUS6xSEmmlyVS4kxBNkeA9tLJiTI= golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce h1:Roh6XWxHFKrPgC/EQhVubSAGQ6Ozk6IdxHSzt1mR0EI= +golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -116,13 +128,14 @@ golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210331212208-0fccb6fa2b5c/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211005001312-d4b1ae081e3b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211020060615-d418f374d309/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211123203042-d83791d6bcd9 h1:0qxwC5n+ttVOINCBeRHO0nq9X7uy8SDsPoi5OaCdIEI= -golang.org/x/net v0.0.0-20211123203042-d83791d6bcd9/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211201190559-0a0e4e1bb54c/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220121210141-e204ce36a2ba h1:6u6sik+bn/y7vILcYkK3iwTBWN7WtBvB0+SZswQnbf8= +golang.org/x/net v0.0.0-20220121210141-e204ce36a2ba/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -139,13 +152,15 @@ golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881 h1:TyHqChC80pFkXWraUUf6RuB5IqFdQieMLwwCJokV2pc= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 h1:XfKQ4OlFl8okEOr5UvAqFRVj8pY/4yfcXrddB8qAbU0= +golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -160,6 +175,8 @@ google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/galene-0.4.2/group/group.go new/galene-0.4.3/group/group.go --- old/galene-0.4.2/group/group.go 2021-12-02 00:09:28.000000000 +0100 +++ new/galene-0.4.3/group/group.go 2022-01-27 14:22:43.000000000 +0100 @@ -64,6 +64,7 @@ const ( LowBitrate = 100 * 1024 MinBitrate = LowBitrate * 2 + MaxBitrate = 1024 * 1024 * 1024 ) type Group struct { @@ -168,7 +169,7 @@ default: return 0, errors.New("unknown VP9 profile") } - case "video/av1x": + case "video/av1": return 35, nil case "video/h264": profile := fmtpValue(codec.SDPFmtpLine, "profile-level-id") @@ -231,7 +232,7 @@ case "av1": codecs = []webrtc.RTPCodecCapability{ { - "video/AV1X", 90000, 0, + "video/AV1", 90000, 0, "", fb, }, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/galene-0.4.2/rtpconn/rtpconn.go new/galene-0.4.3/rtpconn/rtpconn.go --- old/galene-0.4.2/rtpconn/rtpconn.go 2021-12-02 00:09:28.000000000 +0100 +++ new/galene-0.4.3/rtpconn/rtpconn.go 2022-01-27 14:22:43.000000000 +0100 @@ -881,6 +881,15 @@ } } +// saturating addition +func sadd(x, y uint64) uint64 { + s, c := bits.Add64(x, y, 0) + if c != 0 { + return ^uint64(0) + } + return s +} + func maxUpBitrate(t *rtpUpTrack) uint64 { minrate := ^uint64(0) maxrate := uint64(group.MinBitrate) @@ -908,15 +917,13 @@ // assume that lower spatial layers take up 1/5 of // the throughput if maxsid > 0 { - maxrate = maxrate * 5 / 4 + maxrate = sadd(maxrate, maxrate / 4) } // assume that each layer takes two times less // throughput than the higher one. Then we've // got enough slack for a factor of 2^(layers-1). for i := 0; i < maxtid; i++ { - if minrate < ^uint64(0)/2 { - minrate *= 2 - } + minrate = sadd(minrate, minrate) } if minrate < maxrate { return minrate @@ -990,15 +997,18 @@ } ssrcs = append(ssrcs, uint32(t.track.SSRC())) if t.Kind() == webrtc.RTPCodecTypeAudio { - rate += 100 * 1024 + rate = sadd(rate, 100 * 1024) } else if t.Label() == "l" { - rate += group.LowBitrate + rate = sadd(rate, group.LowBitrate) } else { - rate += maxUpBitrate(t) + rate = sadd(rate, maxUpBitrate(t)) } } - if rate < ^uint64(0) && len(ssrcs) > 0 { + if rate > group.MaxBitrate { + rate = group.MaxBitrate + } + if len(ssrcs) > 0 { packets = append(packets, &rtcp.ReceiverEstimatedMaximumBitrate{ Bitrate: float32(rate), diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/galene-0.4.2/rtpconn/rtpconn_test.go new/galene-0.4.3/rtpconn/rtpconn_test.go --- old/galene-0.4.2/rtpconn/rtpconn_test.go 2021-12-02 00:09:28.000000000 +0100 +++ new/galene-0.4.3/rtpconn/rtpconn_test.go 2022-01-27 14:22:43.000000000 +0100 @@ -37,3 +37,20 @@ t.Errorf("Expected %v, got %v", info, info2) } } + +func TestSadd(t *testing.T) { + ts := []struct{ x, y, z uint64 }{ + {0, 0, 0}, + {1, 2, 3}, + {^uint64(0) - 10, 5, ^uint64(0) - 5}, + {^uint64(0) - 10, 15, ^uint64(0)}, + } + for _, tt := range ts { + z := sadd(tt.x, tt.y) + if z != tt.z { + t.Errorf("%v + %v: expected %v, got %v", + tt.x, tt.y, tt.z, z, + ) + } + } +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/galene-0.4.2/rtpconn/webclient.go new/galene-0.4.3/rtpconn/webclient.go --- old/galene-0.4.2/rtpconn/webclient.go 2021-12-02 00:09:28.000000000 +0100 +++ new/galene-0.4.3/rtpconn/webclient.go 2022-01-27 14:22:43.000000000 +0100 @@ -64,10 +64,14 @@ writerDone chan struct{} actionCh chan struct{} - mu sync.Mutex - down map[string]*rtpDownConnection - up map[string]*rtpUpConnection - actions []interface{} + mu sync.Mutex + down map[string]*rtpDownConnection + up map[string]*rtpUpConnection + + // action may be called with the group mutex taken, and therefore + // actions needs to use its own mutex. + actionMu sync.Mutex + actions []interface{} } func (c *webClient) Group() *group.Group { @@ -948,10 +952,10 @@ return m } case <-c.actionCh: - c.mu.Lock() + c.actionMu.Lock() actions := c.actions c.actions = nil - c.mu.Unlock() + c.actionMu.Unlock() for _, a := range actions { err := handleAction(c, a) if err != nil { @@ -1759,10 +1763,10 @@ var ErrClientDead = errors.New("client is dead") func (c *webClient) action(a interface{}) error { - c.mu.Lock() + c.actionMu.Lock() empty := len(c.actions) == 0 c.actions = append(c.actions, a) - c.mu.Unlock() + c.actionMu.Unlock() if empty { select { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/galene-0.4.2/static/galene.css new/galene-0.4.3/static/galene.css --- old/galene-0.4.2/static/galene.css 2021-12-02 00:09:28.000000000 +0100 +++ new/galene-0.4.3/static/galene.css 2022-01-27 14:22:43.000000000 +0100 @@ -1204,6 +1204,10 @@ font-weight: 900; } +#users > div.user-status-raisehand::before { + content: "\f256"; +} + .close-icon { font: normal 1em/1 Arial, sans-serif; display: inline-block; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/galene-0.4.2/static/galene.js new/galene-0.4.3/static/galene.js --- old/galene-0.4.2/static/galene.js 2021-12-02 00:09:28.000000000 +0100 +++ new/galene-0.4.3/static/galene.js 2022-01-27 14:22:43.000000000 +0100 @@ -917,9 +917,9 @@ this.fixedFramerate = false; /** @type {Object} */ this.userdata = {} - - /** @ts-ignore */ + /** @type {MediaStream} */ this.captureStream = this.canvas.captureStream(0); + /** @ts-ignore */ if(!this.captureStream.getTracks()[0].requestFrame) { console.warn('captureFrame not supported, using fixed framerate'); @@ -1141,7 +1141,6 @@ t.enabled = false; } else if(t.kind == 'video') { if(settings.blackboardMode) { - /** @ts-ignore */ t.contentHint = 'detail'; } } @@ -1344,7 +1343,6 @@ try { if(!('getDisplayMedia' in navigator.mediaDevices)) throw new Error('Your browser does not support screen sharing'); - /** @ts-ignore */ stream = await navigator.mediaDevices.getDisplayMedia({video: true}); } catch(e) { console.error(e); @@ -1615,8 +1613,7 @@ media.classList.add('media'); media.autoplay = true; - /** @ts-ignore */ - media.playsinline = true; + media.playsInline = true; media.id = 'media-' + c.localId; div.appendChild(media); addCustomControls(media, div, c, !!video); @@ -1799,13 +1796,10 @@ let pip = getVideoButton(container, 'pip'); if(pip) { - /** @ts-ignore */ if(HTMLVideoElement.prototype.requestPictureInPicture) { pip.onclick = function(e) { e.preventDefault(); - /** @ts-ignore */ if(media.requestPictureInPicture) { - /** @ts-ignore */ media.requestPictureInPicture(); } else { displayWarning('Picture in Picture not supported.'); @@ -1997,15 +1991,19 @@ /** * @param {string} id - * @param {string} name + * @param {user} userinfo */ -function changeUser(id, name) { +function changeUser(id, userinfo) { let user = document.getElementById('user-' + id); if(!user) { console.warn('Unknown user ' + id); return; } - user.textContent = name ? name : '(anon)'; + user.textContent = userinfo.username ? userinfo.username : '(anon)'; + if (userinfo.status.raisehand) + user.classList.add('user-status-raisehand'); + else + user.classList.remove('user-status-raisehand'); } /** @@ -2034,7 +2032,7 @@ scheduleReconsiderParameters(); break; case 'change': - changeUser(id, serverConnection.users[id].username); + changeUser(id, serverConnection.users[id]); break; default: console.warn('Unknown user kind', kind); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/galene-0.4.2/static/protocol.js new/galene-0.4.3/static/protocol.js --- old/galene-0.4.2/static/protocol.js 2021-12-02 00:09:28.000000000 +0100 +++ new/galene-0.4.3/static/protocol.js 2022-01-27 14:22:43.000000000 +0100 @@ -1215,7 +1215,6 @@ if('restartIce' in c.pc) { try { - /** @ts-ignore */ c.pc.restartIce(); return; } catch(e) { ++++++ vendor.tar.gz ++++++ ++++ 5815 lines of diff (skipped)