diff --git a/server/internal/capture/streamsink.go b/server/internal/capture/streamsink.go index 850d90d7..8464e50b 100644 --- a/server/internal/capture/streamsink.go +++ b/server/internal/capture/streamsink.go @@ -4,7 +4,6 @@ import ( "errors" "reflect" "sync" - "sync/atomic" "time" "github.com/prometheus/client_golang/prometheus" @@ -26,7 +25,7 @@ type StreamSinkManagerCtx struct { // wait for a keyframe before sending samples waitForKf bool - bitrate uint64 // atomic + bitrate uint64 brBuckets map[int]float64 logger zerolog.Logger @@ -144,7 +143,7 @@ func (manager *StreamSinkManagerCtx) ID() string { } func (manager *StreamSinkManagerCtx) Bitrate() uint64 { - return atomic.LoadUint64(&manager.bitrate) + return manager.bitrate } func (manager *StreamSinkManagerCtx) Codec() codec.RTPCodec { @@ -361,8 +360,8 @@ func (manager *StreamSinkManagerCtx) saveSampleBitrate(timestamp time.Time, delt next := int((sec + 1) % 3) if manager.brBuckets[next] != 0 { - // atomic update bitrate - atomic.StoreUint64(&manager.bitrate, uint64(manager.brBuckets[last])) + // update bitrate, TODO: atomic? + manager.bitrate = uint64(manager.brBuckets[last]) // empty next bucket manager.brBuckets[next] = 0 } @@ -410,5 +409,5 @@ func (manager *StreamSinkManagerCtx) DestroyPipeline() { manager.pipelinesActive.Set(0) manager.brBuckets = make(map[int]float64) - atomic.StoreUint64(&manager.bitrate, 0) + manager.bitrate = 0 } diff --git a/server/pkg/xorg/xorg.go b/server/pkg/xorg/xorg.go index b948ed9a..49074c1d 100644 --- a/server/pkg/xorg/xorg.go +++ b/server/pkg/xorg/xorg.go @@ -11,6 +11,7 @@ import ( "fmt" "image" "image/color" + "strconv" "sync" "time" "unsafe" @@ -279,13 +280,14 @@ func GetCursorImage() *types.CursorImage { width := int(cur.width) height := int(cur.height) - // Xlib stores 32-bit data in longs, even if longs are 64-bits long. - pixels := C.GoBytes(unsafe.Pointer(cur.pixels), C.int(width*height*8)) + // Xlib stores 32-bit data in longs, even if longs are 64-bits on 64-bit systems. + ptrSize := strconv.IntSize / 8 + pixels := C.GoBytes(unsafe.Pointer(cur.pixels), C.int(width*height*ptrSize)) img := image.NewRGBA(image.Rect(0, 0, width, height)) for y := 0; y < height; y++ { for x := 0; x < width; x++ { - pos := ((y * width) + x) * 8 + pos := ((y * width) + x) * ptrSize img.SetRGBA(x, y, color.RGBA{ A: pixels[pos+3],