From da908ca6c1cd96c43ca65ed87e96f2cc1f82b60a Mon Sep 17 00:00:00 2001 From: Sergey Krashevich Date: Sat, 21 Mar 2026 13:45:29 +0300 Subject: [PATCH] refactor after #2160 --- pkg/webcodecs/consumer.go | 15 ++++++++------- www/video-renderer.js | 2 +- www/video-rtc.js | 2 +- www/video-webcodecs.js | 9 +++++++-- 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/pkg/webcodecs/consumer.go b/pkg/webcodecs/consumer.go index e67c1de7..7fd49bd1 100644 --- a/pkg/webcodecs/consumer.go +++ b/pkg/webcodecs/consumer.go @@ -5,6 +5,7 @@ import ( "errors" "io" "sync" + "sync/atomic" "github.com/AlexxIT/go2rtc/pkg/aac" "github.com/AlexxIT/go2rtc/pkg/core" @@ -25,7 +26,7 @@ type Consumer struct { core.Connection wr *core.WriteBuffer mu sync.Mutex - start bool + start atomic.Bool UseGOP bool } @@ -92,11 +93,11 @@ func (c *Consumer) AddTrack(media *core.Media, _ *core.Codec, track *core.Receiv clockRate := codec.ClockRate handler.Handler = func(packet *rtp.Packet) { keyframe := h264.IsKeyframe(packet.Payload) - if !c.start { + if !c.start.Load() { if !keyframe { return } - c.start = true + c.start.Store(true) } payload := annexb.DecodeAVCC(packet.Payload, true) @@ -123,11 +124,11 @@ func (c *Consumer) AddTrack(media *core.Media, _ *core.Codec, track *core.Receiv clockRate := codec.ClockRate handler.Handler = func(packet *rtp.Packet) { keyframe := h265.IsKeyframe(packet.Payload) - if !c.start { + if !c.start.Load() { if !keyframe { return } - c.start = true + c.start.Store(true) } payload := annexb.DecodeAVCC(packet.Payload, true) @@ -153,7 +154,7 @@ func (c *Consumer) AddTrack(media *core.Media, _ *core.Codec, track *core.Receiv default: clockRate := codec.ClockRate handler.Handler = func(packet *rtp.Packet) { - if !c.start { + if !c.start.Load() { return } @@ -245,7 +246,7 @@ func (c *Consumer) GetInitInfo() *InitInfo { func (c *Consumer) WriteTo(wr io.Writer) (int64, error) { if len(c.Senders) == 1 && c.Senders[0].Codec.IsAudio() { - c.start = true + c.start.Store(true) } return c.wr.WriteTo(wr) diff --git a/www/video-renderer.js b/www/video-renderer.js index 2b4249bd..eecc75c9 100644 --- a/www/video-renderer.js +++ b/www/video-renderer.js @@ -213,7 +213,7 @@ class WebGL2Tier { gl.useProgram(this.program); gl.bindTexture(gl.TEXTURE_2D, this.texture); gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, frame); - gl.drawArrays(gl.TRIANGLES, 0, 3); + gl.drawArrays(gl.TRIANGLES, 0, 6); } destroy() { diff --git a/www/video-rtc.js b/www/video-rtc.js index d488b273..25256355 100644 --- a/www/video-rtc.js +++ b/www/video-rtc.js @@ -543,7 +543,7 @@ export class VideoRTC extends HTMLElement { }; this.ondata = data => { - this._wc.feed(data); + if (this._wc) this._wc.feed(data); }; this.send({type: 'webcodecs', value: ''}); diff --git a/www/video-webcodecs.js b/www/video-webcodecs.js index a082b938..ba25d685 100644 --- a/www/video-webcodecs.js +++ b/www/video-webcodecs.js @@ -170,6 +170,10 @@ export class WebCodecsPlayer { this._renderer.destroy(); this._renderer = null; } + if (this._fsHandler) { + document.removeEventListener('fullscreenchange', this._fsHandler); + this._fsHandler = null; + } if (this._container?.parentElement) { this._container.remove(); } @@ -247,11 +251,12 @@ export class WebCodecsPlayer { container.requestFullscreen().catch(() => {}); } }); - document.addEventListener('fullscreenchange', () => { + this._fsHandler = () => { const isFS = document.fullscreenElement === container; btnFS.innerHTML = svgIcon(isFS ? ICONS.fsExit : ICONS.fs); btnFS.title = isFS ? 'Exit fullscreen' : 'Fullscreen'; - }); + }; + document.addEventListener('fullscreenchange', this._fsHandler); controls.append(btnPlay, timeLabel, spacer, btnMute, volume, btnFS); container.append(controls);