diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 10de09de..083a5243 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -20,9 +20,9 @@ jobs: with: go-version: "1.24" - - uses: golangci/golangci-lint-action@v3 + - uses: golangci/golangci-lint-action@v8 with: - version: v1.64.5 + version: v2.1.6 go-mod-tidy: runs-on: ubuntu-22.04 diff --git a/.golangci.yml b/.golangci.yml index 4bfbdcf6..e10b982a 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,73 +1,75 @@ +version: "2" + linters: enable: - asciicheck - bidichk - bodyclose - #- contextcheck - copyloopvar - dupl - errorlint - gochecknoinits - gocritic - - gofmt - - gofumpt - lll - misspell - nilerr - prealloc - predeclared + - reassign - revive - usestdlibvars - unconvert - #- usetesting - tparallel - wastedassign - whitespace -issues: - exclude-use-default: false + settings: + errcheck: + exclude-functions: + - io.Copy + - (io.Closer).Close + - (io.Writer).Write + - (hash.Hash).Write + - (net.Conn).Close + - (net.Conn).SetReadDeadline + - (net.Conn).SetWriteDeadline + - (*net.TCPConn).SetKeepAlive + - (*net.TCPConn).SetKeepAlivePeriod + - (*net.TCPConn).SetNoDelay + - (net.Listener).Close + - (net.PacketConn).Close + - (net.PacketConn).SetReadDeadline + - (net.PacketConn).SetWriteDeadline + - (net/http.ResponseWriter).Write + - (*net/http.Server).Serve + - (*net/http.Server).ServeTLS + - (*net/http.Server).Shutdown + - os.Chdir + - os.Mkdir + - os.MkdirAll + - os.Remove + - os.RemoveAll + - os.Setenv + - os.Unsetenv + - (*os.File).WriteString + - (*os.File).Close + - (github.com/datarhei/gosrt.Conn).Close + - (github.com/datarhei/gosrt.Conn).SetReadDeadline + - (github.com/datarhei/gosrt.Conn).SetWriteDeadline + - (*github.com/bluenviron/gortsplib/v4.Client).Close + - (*github.com/bluenviron/gortsplib/v4.Server).Close + - (*github.com/bluenviron/gortsplib/v4.ServerSession).Close + - (*github.com/bluenviron/gortsplib/v4.ServerStream).Close + - (*github.com/bluenviron/gortsplib/v4.ServerConn).Close -linters-settings: - errcheck: - exclude-functions: - - io.Copy - - (io.Closer).Close - - (io.Writer).Write - - (hash.Hash).Write - - (net.Conn).Close - - (net.Conn).SetReadDeadline - - (net.Conn).SetWriteDeadline - - (*net.TCPConn).SetKeepAlive - - (*net.TCPConn).SetKeepAlivePeriod - - (*net.TCPConn).SetNoDelay - - (net.Listener).Close - - (net.PacketConn).Close - - (net.PacketConn).SetReadDeadline - - (net.PacketConn).SetWriteDeadline - - (net/http.ResponseWriter).Write - - (*net/http.Server).Serve - - (*net/http.Server).ServeTLS - - (*net/http.Server).Shutdown - - os.Chdir - - os.Mkdir - - os.MkdirAll - - os.Remove - - os.RemoveAll - - os.Setenv - - os.Unsetenv - - (*os.File).WriteString - - (*os.File).Close - - (github.com/datarhei/gosrt.Conn).Close - - (github.com/datarhei/gosrt.Conn).SetReadDeadline - - (github.com/datarhei/gosrt.Conn).SetWriteDeadline - - (*github.com/bluenviron/gortsplib/v4.Client).Close - - (*github.com/bluenviron/gortsplib/v4.Server).Close - - (*github.com/bluenviron/gortsplib/v4.ServerSession).Close - - (*github.com/bluenviron/gortsplib/v4.ServerStream).Close - - (*github.com/bluenviron/gortsplib/v4.ServerConn).Close + govet: + enable-all: true + disable: + - fieldalignment + - reflectvaluecompare - govet: - enable-all: true - disable: - - fieldalignment - - reflectvaluecompare +formatters: + enable: + - gofmt + - gofumpt + - goimports diff --git a/Makefile b/Makefile index 112928df..3f0f3d48 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ BASE_IMAGE = golang:1.24-alpine3.20 -LINT_IMAGE = golangci/golangci-lint:v1.64.5 +LINT_IMAGE = golangci/golangci-lint:v2.1.6 .PHONY: $(shell ls) diff --git a/examples/client-play-backchannel/main.go b/examples/client-play-backchannel/main.go index 6527888d..f541b0d7 100644 --- a/examples/client-play-backchannel/main.go +++ b/examples/client-play-backchannel/main.go @@ -1,3 +1,4 @@ +// Package main contains an example. package main import ( diff --git a/examples/client-play-format-av1-to-jpeg/main.go b/examples/client-play-format-av1-to-jpeg/main.go index 19c0a210..ac08ce3d 100644 --- a/examples/client-play-format-av1-to-jpeg/main.go +++ b/examples/client-play-format-av1-to-jpeg/main.go @@ -1,5 +1,6 @@ //go:build cgo +// Package main contains an example. package main import ( diff --git a/examples/client-play-format-av1/main.go b/examples/client-play-format-av1/main.go index 90534d4c..4f5c3ae8 100644 --- a/examples/client-play-format-av1/main.go +++ b/examples/client-play-format-av1/main.go @@ -1,5 +1,6 @@ //go:build cgo +// Package main contains an example. package main import ( diff --git a/examples/client-play-format-g711/main.go b/examples/client-play-format-g711/main.go index fa350fbe..10f51658 100644 --- a/examples/client-play-format-g711/main.go +++ b/examples/client-play-format-g711/main.go @@ -1,3 +1,4 @@ +// Package main contains an example. package main import ( @@ -66,9 +67,9 @@ func main() { } // extract G711 samples from RTP packets - samples, err := rtpDec.Decode(pkt) - if err != nil { - log.Printf("ERR: %v", err) + samples, err2 := rtpDec.Decode(pkt) + if err2 != nil { + log.Printf("ERR: %v", err2) return } diff --git a/examples/client-play-format-h264-mpeg4audio-to-disk/main.go b/examples/client-play-format-h264-mpeg4audio-to-disk/main.go index 47e4cd09..470cdab8 100644 --- a/examples/client-play-format-h264-mpeg4audio-to-disk/main.go +++ b/examples/client-play-format-h264-mpeg4audio-to-disk/main.go @@ -1,6 +1,8 @@ +// Package main contains an example. package main import ( + "errors" "log" "github.com/bluenviron/gortsplib/v4" @@ -91,18 +93,18 @@ func main() { } // extract access unit from RTP packets - au, err := h264RTPDec.Decode(pkt) - if err != nil { - if err != rtph264.ErrNonStartingPacketAndNoPrevious && err != rtph264.ErrMorePacketsNeeded { - log.Printf("ERR: %v", err) + au, err2 := h264RTPDec.Decode(pkt) + if err2 != nil { + if !errors.Is(err2, rtph264.ErrNonStartingPacketAndNoPrevious) && !errors.Is(err2, rtph264.ErrMorePacketsNeeded) { + log.Printf("ERR: %v", err2) } return } // encode the access unit into MPEG-TS - err = mpegtsMuxer.writeH264(au, pts) - if err != nil { - log.Printf("ERR: %v", err) + err2 = mpegtsMuxer.writeH264(au, pts) + if err2 != nil { + log.Printf("ERR: %v", err2) return } @@ -119,16 +121,16 @@ func main() { } // extract access units from RTP packets - aus, err := mpeg4AudioRTPDec.Decode(pkt) - if err != nil { - log.Printf("ERR: %v", err) + aus, err2 := mpeg4AudioRTPDec.Decode(pkt) + if err2 != nil { + log.Printf("ERR: %v", err2) return } // encode access units into MPEG-TS - err = mpegtsMuxer.writeMPEG4Audio(aus, pts) - if err != nil { - log.Printf("ERR: %v", err) + err2 = mpegtsMuxer.writeMPEG4Audio(aus, pts) + if err2 != nil { + log.Printf("ERR: %v", err2) return } diff --git a/examples/client-play-format-h264-mpeg4audio-to-disk/mpegts_muxer.go b/examples/client-play-format-h264-mpeg4audio-to-disk/mpegts_muxer.go index d4c64e8b..d385c97e 100644 --- a/examples/client-play-format-h264-mpeg4audio-to-disk/mpegts_muxer.go +++ b/examples/client-play-format-h264-mpeg4audio-to-disk/mpegts_muxer.go @@ -61,7 +61,7 @@ func (e *mpegtsMuxer) initialize() error { // close closes all the mpegtsMuxer resources. func (e *mpegtsMuxer) close() { - e.b.Flush() + e.b.Flush() //nolint:errcheck e.f.Close() } @@ -70,7 +70,7 @@ func (e *mpegtsMuxer) writeH264(au [][]byte, pts int64) error { e.mutex.Lock() defer e.mutex.Unlock() - var filteredAU [][]byte + var filteredAU [][]byte //nolint:prealloc nonIDRPresent := false idrPresent := false @@ -115,7 +115,8 @@ func (e *mpegtsMuxer) writeH264(au [][]byte, pts int64) error { if !idrPresent { return nil } - e.dtsExtractor = h264.NewDTSExtractor() + e.dtsExtractor = &h264.DTSExtractor{} + e.dtsExtractor.Initialize() } dts, err := e.dtsExtractor.Extract(au, pts) @@ -132,5 +133,6 @@ func (e *mpegtsMuxer) writeMPEG4Audio(aus [][]byte, pts int64) error { e.mutex.Lock() defer e.mutex.Unlock() - return e.w.WriteMPEG4Audio(e.mpeg4AudioTrack, multiplyAndDivide(pts, 90000, int64(e.mpeg4AudioFormat.ClockRate())), aus) + return e.w.WriteMPEG4Audio(e.mpeg4AudioTrack, + multiplyAndDivide(pts, 90000, int64(e.mpeg4AudioFormat.ClockRate())), aus) } diff --git a/examples/client-play-format-h264-to-disk/main.go b/examples/client-play-format-h264-to-disk/main.go index 3ee85d4b..dcfa769c 100644 --- a/examples/client-play-format-h264-to-disk/main.go +++ b/examples/client-play-format-h264-to-disk/main.go @@ -1,6 +1,8 @@ +// Package main contains an example. package main import ( + "errors" "log" "github.com/bluenviron/gortsplib/v4" @@ -78,18 +80,18 @@ func main() { } // extract access unit from RTP packets - au, err := rtpDec.Decode(pkt) - if err != nil { - if err != rtph264.ErrNonStartingPacketAndNoPrevious && err != rtph264.ErrMorePacketsNeeded { - log.Printf("ERR: %v", err) + au, err2 := rtpDec.Decode(pkt) + if err2 != nil { + if !errors.Is(err2, rtph264.ErrNonStartingPacketAndNoPrevious) && !errors.Is(err2, rtph264.ErrMorePacketsNeeded) { + log.Printf("ERR: %v", err2) } return } // encode the access unit into MPEG-TS - err = mpegtsMuxer.writeH264(au, pts) - if err != nil { - log.Printf("ERR: %v", err) + err2 = mpegtsMuxer.writeH264(au, pts) + if err2 != nil { + log.Printf("ERR: %v", err2) return } diff --git a/examples/client-play-format-h264-to-disk/mpegts_muxer.go b/examples/client-play-format-h264-to-disk/mpegts_muxer.go index 576f14ab..68f5c4a3 100644 --- a/examples/client-play-format-h264-to-disk/mpegts_muxer.go +++ b/examples/client-play-format-h264-to-disk/mpegts_muxer.go @@ -45,13 +45,13 @@ func (e *mpegtsMuxer) initialize() error { // close closes all the mpegtsMuxer resources. func (e *mpegtsMuxer) close() { - e.b.Flush() + e.b.Flush() //nolint:errcheck e.f.Close() } // writeH264 writes a H264 access unit into MPEG-TS. func (e *mpegtsMuxer) writeH264(au [][]byte, pts int64) error { - var filteredAU [][]byte + var filteredAU [][]byte //nolint:prealloc nonIDRPresent := false idrPresent := false @@ -96,7 +96,8 @@ func (e *mpegtsMuxer) writeH264(au [][]byte, pts int64) error { if !idrPresent { return nil } - e.dtsExtractor = h264.NewDTSExtractor() + e.dtsExtractor = &h264.DTSExtractor{} + e.dtsExtractor.Initialize() } dts, err := e.dtsExtractor.Extract(au, pts) diff --git a/examples/client-play-format-h264-to-jpeg/main.go b/examples/client-play-format-h264-to-jpeg/main.go index c599ac01..7caa3e0c 100644 --- a/examples/client-play-format-h264-to-jpeg/main.go +++ b/examples/client-play-format-h264-to-jpeg/main.go @@ -1,5 +1,6 @@ //go:build cgo +// Package main contains an example. package main import ( diff --git a/examples/client-play-format-h264/main.go b/examples/client-play-format-h264/main.go index 2ae32d1f..8ec62614 100644 --- a/examples/client-play-format-h264/main.go +++ b/examples/client-play-format-h264/main.go @@ -1,5 +1,6 @@ //go:build cgo +// Package main contains an example. package main import ( diff --git a/examples/client-play-format-h265-to-disk/main.go b/examples/client-play-format-h265-to-disk/main.go index 78ee0539..01cbc97e 100644 --- a/examples/client-play-format-h265-to-disk/main.go +++ b/examples/client-play-format-h265-to-disk/main.go @@ -1,6 +1,8 @@ +// Package main contains an example. package main import ( + "errors" "log" "github.com/bluenviron/gortsplib/v4" @@ -79,18 +81,18 @@ func main() { } // extract access unit from RTP packets - au, err := rtpDec.Decode(pkt) - if err != nil { - if err != rtph265.ErrNonStartingPacketAndNoPrevious && err != rtph265.ErrMorePacketsNeeded { - log.Printf("ERR: %v", err) + au, err2 := rtpDec.Decode(pkt) + if err2 != nil { + if !errors.Is(err2, rtph265.ErrNonStartingPacketAndNoPrevious) && !errors.Is(err2, rtph265.ErrMorePacketsNeeded) { + log.Printf("ERR: %v", err2) } return } // encode the access unit into MPEG-TS - err = mpegtsMuxer.writeH265(au, pts) - if err != nil { - log.Printf("ERR: %v", err) + err2 = mpegtsMuxer.writeH265(au, pts) + if err2 != nil { + log.Printf("ERR: %v", err2) return } diff --git a/examples/client-play-format-h265-to-disk/mpegts_muxer.go b/examples/client-play-format-h265-to-disk/mpegts_muxer.go index 7c6f801a..34446b3a 100644 --- a/examples/client-play-format-h265-to-disk/mpegts_muxer.go +++ b/examples/client-play-format-h265-to-disk/mpegts_muxer.go @@ -46,13 +46,13 @@ func (e *mpegtsMuxer) initialize() error { // close closes all the mpegtsMuxer resources. func (e *mpegtsMuxer) close() { - e.b.Flush() + e.b.Flush() //nolint:errcheck e.f.Close() } // writeH265 writes a H265 access unit into MPEG-TS. func (e *mpegtsMuxer) writeH265(au [][]byte, pts int64) error { - var filteredAU [][]byte + var filteredAU [][]byte //nolint:prealloc isRandomAccess := false @@ -97,7 +97,8 @@ func (e *mpegtsMuxer) writeH265(au [][]byte, pts int64) error { if !isRandomAccess { return nil } - e.dtsExtractor = h265.NewDTSExtractor() + e.dtsExtractor = &h265.DTSExtractor{} + e.dtsExtractor.Initialize() } dts, err := e.dtsExtractor.Extract(au, pts) diff --git a/examples/client-play-format-h265-to-jpeg/main.go b/examples/client-play-format-h265-to-jpeg/main.go index b77e42bf..09a55f58 100644 --- a/examples/client-play-format-h265-to-jpeg/main.go +++ b/examples/client-play-format-h265-to-jpeg/main.go @@ -1,5 +1,6 @@ //go:build cgo +// Package main contains an example. package main import ( diff --git a/examples/client-play-format-h265/main.go b/examples/client-play-format-h265/main.go index 1bc352ff..3056b1f7 100644 --- a/examples/client-play-format-h265/main.go +++ b/examples/client-play-format-h265/main.go @@ -1,5 +1,6 @@ //go:build cgo +// Package main contains an example. package main import ( diff --git a/examples/client-play-format-lpcm/main.go b/examples/client-play-format-lpcm/main.go index 93f33fa1..17a09a15 100644 --- a/examples/client-play-format-lpcm/main.go +++ b/examples/client-play-format-lpcm/main.go @@ -1,3 +1,4 @@ +// Package main contains an example. package main import ( @@ -65,9 +66,9 @@ func main() { } // extract LPCM samples from RTP packets - op, err := rtpDec.Decode(pkt) - if err != nil { - log.Printf("ERR: %v", err) + op, err2 := rtpDec.Decode(pkt) + if err2 != nil { + log.Printf("ERR: %v", err2) return } diff --git a/examples/client-play-format-mjpeg/main.go b/examples/client-play-format-mjpeg/main.go index 2d223ed5..8f636e7b 100644 --- a/examples/client-play-format-mjpeg/main.go +++ b/examples/client-play-format-mjpeg/main.go @@ -1,7 +1,9 @@ +// Package main contains an example. package main import ( "bytes" + "errors" "image/jpeg" "log" @@ -69,18 +71,18 @@ func main() { } // extract JPEG images from RTP packets - enc, err := rtpDec.Decode(pkt) - if err != nil { - if err != rtpmjpeg.ErrNonStartingPacketAndNoPrevious && err != rtpmjpeg.ErrMorePacketsNeeded { - log.Printf("ERR: %v", err) + enc, err2 := rtpDec.Decode(pkt) + if err2 != nil { + if !errors.Is(err2, rtpmjpeg.ErrNonStartingPacketAndNoPrevious) && !errors.Is(err2, rtpmjpeg.ErrMorePacketsNeeded) { + log.Printf("ERR: %v", err2) } return } // convert JPEG images into RGBA frames - image, err := jpeg.Decode(bytes.NewReader(enc)) - if err != nil { - panic(err) + image, err2 := jpeg.Decode(bytes.NewReader(enc)) + if err2 != nil { + panic(err2) } log.Printf("decoded image with PTS %v and size %v", pts, image.Bounds().Max) diff --git a/examples/client-play-format-mpeg4audio-to-disk/main.go b/examples/client-play-format-mpeg4audio-to-disk/main.go index 59f8baf3..2aa6aa48 100644 --- a/examples/client-play-format-mpeg4audio-to-disk/main.go +++ b/examples/client-play-format-mpeg4audio-to-disk/main.go @@ -1,3 +1,4 @@ +// Package main contains an example. package main import ( @@ -82,16 +83,16 @@ func main() { } // extract access units from RTP packets - aus, err := rtpDec.Decode(pkt) - if err != nil { - log.Printf("ERR: %v", err) + aus, err2 := rtpDec.Decode(pkt) + if err2 != nil { + log.Printf("ERR: %v", err2) return } // encode access units into MPEG-TS - err = mpegtsMuxer.writeMPEG4Audio(aus, pts) - if err != nil { - log.Printf("ERR: %v", err) + err2 = mpegtsMuxer.writeMPEG4Audio(aus, pts) + if err2 != nil { + log.Printf("ERR: %v", err2) return } diff --git a/examples/client-play-format-mpeg4audio-to-disk/mpegts_muxer.go b/examples/client-play-format-mpeg4audio-to-disk/mpegts_muxer.go index 4ff3a6d7..f122a239 100644 --- a/examples/client-play-format-mpeg4audio-to-disk/mpegts_muxer.go +++ b/examples/client-play-format-mpeg4audio-to-disk/mpegts_muxer.go @@ -45,7 +45,7 @@ func (e *mpegtsMuxer) initialize() error { // close closes all the mpegtsMuxer resources. func (e *mpegtsMuxer) close() { - e.b.Flush() + e.b.Flush() //nolint:errcheck e.f.Close() } diff --git a/examples/client-play-format-mpeg4audio/main.go b/examples/client-play-format-mpeg4audio/main.go index 1ad07e13..5b0cd5d0 100644 --- a/examples/client-play-format-mpeg4audio/main.go +++ b/examples/client-play-format-mpeg4audio/main.go @@ -1,3 +1,4 @@ +// Package main contains an example. package main import ( @@ -65,9 +66,9 @@ func main() { } // extract access units from RTP packets - aus, err := rtpDec.Decode(pkt) - if err != nil { - log.Printf("ERR: %v", err) + aus, err2 := rtpDec.Decode(pkt) + if err2 != nil { + log.Printf("ERR: %v", err2) return } diff --git a/examples/client-play-format-opus-to-disk/main.go b/examples/client-play-format-opus-to-disk/main.go index 97699969..447c85ac 100644 --- a/examples/client-play-format-opus-to-disk/main.go +++ b/examples/client-play-format-opus-to-disk/main.go @@ -1,3 +1,4 @@ +// Package main contains an example. package main import ( @@ -82,16 +83,16 @@ func main() { } // extract Opus packets from RTP packets - opkt, err := rtpDec.Decode(pkt) - if err != nil { - log.Printf("ERR: %v", err) + opkt, err2 := rtpDec.Decode(pkt) + if err2 != nil { + log.Printf("ERR: %v", err2) return } // encode Opus packets into MPEG-TS - err = mpegtsMuxer.writeOpus(opkt, pts) - if err != nil { - log.Printf("ERR: %v", err) + err2 = mpegtsMuxer.writeOpus(opkt, pts) + if err2 != nil { + log.Printf("ERR: %v", err2) return } diff --git a/examples/client-play-format-opus-to-disk/mpegts_muxer.go b/examples/client-play-format-opus-to-disk/mpegts_muxer.go index 1ca0bdb9..cc3b1b1d 100644 --- a/examples/client-play-format-opus-to-disk/mpegts_muxer.go +++ b/examples/client-play-format-opus-to-disk/mpegts_muxer.go @@ -45,7 +45,7 @@ func (e *mpegtsMuxer) initialize() error { // close closes all the mpegtsMuxer resources. func (e *mpegtsMuxer) close() { - e.b.Flush() + e.b.Flush() //nolint:errcheck e.f.Close() } diff --git a/examples/client-play-format-opus/main.go b/examples/client-play-format-opus/main.go index 0cf4a235..aa85d2ba 100644 --- a/examples/client-play-format-opus/main.go +++ b/examples/client-play-format-opus/main.go @@ -1,3 +1,4 @@ +// Package main contains an example. package main import ( @@ -65,9 +66,9 @@ func main() { } // extract Opus packets from RTP packets - op, err := rtpDec.Decode(pkt) - if err != nil { - log.Printf("ERR: %v", err) + op, err2 := rtpDec.Decode(pkt) + if err2 != nil { + log.Printf("ERR: %v", err2) return } diff --git a/examples/client-play-format-vp8/main.go b/examples/client-play-format-vp8/main.go index 9a1c0316..644937dd 100644 --- a/examples/client-play-format-vp8/main.go +++ b/examples/client-play-format-vp8/main.go @@ -1,5 +1,6 @@ //go:build cgo +// Package main contains an example. package main import ( diff --git a/examples/client-play-format-vp9/main.go b/examples/client-play-format-vp9/main.go index ede9a5bb..1a6f74b3 100644 --- a/examples/client-play-format-vp9/main.go +++ b/examples/client-play-format-vp9/main.go @@ -1,5 +1,6 @@ //go:build cgo +// Package main contains an example. package main import ( diff --git a/examples/client-play-options/main.go b/examples/client-play-options/main.go index 9f203927..75810dcf 100644 --- a/examples/client-play-options/main.go +++ b/examples/client-play-options/main.go @@ -1,3 +1,4 @@ +// Package main contains an example. package main import ( @@ -53,7 +54,7 @@ func main() { } // called when a RTP packet arrives - c.OnPacketRTPAny(func(medi *description.Media, forma format.Format, pkt *rtp.Packet) { + c.OnPacketRTPAny(func(medi *description.Media, _ format.Format, _ *rtp.Packet) { log.Printf("RTP packet from media %v\n", medi) }) diff --git a/examples/client-play-pause/main.go b/examples/client-play-pause/main.go index eab21658..ce467d23 100644 --- a/examples/client-play-pause/main.go +++ b/examples/client-play-pause/main.go @@ -1,3 +1,4 @@ +// Package main contains an example. package main import ( @@ -47,7 +48,7 @@ func main() { } // called when a RTP packet arrives - c.OnPacketRTPAny(func(medi *description.Media, forma format.Format, pkt *rtp.Packet) { + c.OnPacketRTPAny(func(medi *description.Media, _ format.Format, _ *rtp.Packet) { log.Printf("RTP packet from media %v\n", medi) }) diff --git a/examples/client-play-timestamp/main.go b/examples/client-play-timestamp/main.go index 56c45023..0950b79e 100644 --- a/examples/client-play-timestamp/main.go +++ b/examples/client-play-timestamp/main.go @@ -1,3 +1,4 @@ +// Package main contains an example. package main import ( @@ -44,7 +45,7 @@ func main() { } // called when a RTP packet arrives - c.OnPacketRTPAny(func(medi *description.Media, forma format.Format, pkt *rtp.Packet) { + c.OnPacketRTPAny(func(medi *description.Media, _ format.Format, pkt *rtp.Packet) { // get the PTS timestamp of the packet, i.e. timestamp relative to the start of the session pts, ptsAvailable := c.PacketPTS2(medi, pkt) log.Printf("PTS: available=%v, value=%v\n", ptsAvailable, pts) diff --git a/examples/client-play-to-record/main.go b/examples/client-play-to-record/main.go index 54cc7201..b7777a6e 100644 --- a/examples/client-play-to-record/main.go +++ b/examples/client-play-to-record/main.go @@ -1,3 +1,4 @@ +// Package main contains an example. package main import ( @@ -55,8 +56,8 @@ func main() { defer publisher.Close() // read RTP packets from the reader and route them to the publisher - reader.OnPacketRTPAny(func(medi *description.Media, forma format.Format, pkt *rtp.Packet) { - publisher.WritePacketRTP(desc.Medias[0], pkt) + reader.OnPacketRTPAny(func(_ *description.Media, _ format.Format, pkt *rtp.Packet) { + publisher.WritePacketRTP(desc.Medias[0], pkt) //nolint:errcheck }) // start playing diff --git a/examples/client-play/main.go b/examples/client-play/main.go index 21ac7cb8..f809327c 100644 --- a/examples/client-play/main.go +++ b/examples/client-play/main.go @@ -1,3 +1,4 @@ +// Package main contains an example. package main import ( @@ -44,7 +45,7 @@ func main() { } // called when a RTP packet arrives - c.OnPacketRTPAny(func(medi *description.Media, forma format.Format, pkt *rtp.Packet) { + c.OnPacketRTPAny(func(medi *description.Media, _ format.Format, _ *rtp.Packet) { log.Printf("RTP packet from media %v\n", medi) }) diff --git a/examples/client-query/main.go b/examples/client-query/main.go index a10d9d02..08a5b840 100644 --- a/examples/client-query/main.go +++ b/examples/client-query/main.go @@ -1,3 +1,4 @@ +// Package main contains an example. package main import ( diff --git a/examples/client-record-format-av1/dummy_image.go b/examples/client-record-format-av1/dummy_image.go index f88c036d..557f696c 100644 --- a/examples/client-record-format-av1/dummy_image.go +++ b/examples/client-record-format-av1/dummy_image.go @@ -1,3 +1,5 @@ +//go:build cgo + package main import ( diff --git a/examples/client-record-format-av1/main.go b/examples/client-record-format-av1/main.go index 75bef012..4869be8b 100644 --- a/examples/client-record-format-av1/main.go +++ b/examples/client-record-format-av1/main.go @@ -1,5 +1,6 @@ //go:build cgo +// Package main contains an example. package main import ( diff --git a/examples/client-record-format-g711/main.go b/examples/client-record-format-g711/main.go index 4e68bf7f..fef10bb3 100644 --- a/examples/client-record-format-g711/main.go +++ b/examples/client-record-format-g711/main.go @@ -1,3 +1,4 @@ +// Package main contains an example. package main import ( diff --git a/examples/client-record-format-h264-from-disk/main.go b/examples/client-record-format-h264-from-disk/main.go index f4399e08..bba57afb 100644 --- a/examples/client-record-format-h264-from-disk/main.go +++ b/examples/client-record-format-h264-from-disk/main.go @@ -1,3 +1,4 @@ +// Package main contains an example. package main import ( diff --git a/examples/client-record-format-h264/dummy_image.go b/examples/client-record-format-h264/dummy_image.go index f88c036d..557f696c 100644 --- a/examples/client-record-format-h264/dummy_image.go +++ b/examples/client-record-format-h264/dummy_image.go @@ -1,3 +1,5 @@ +//go:build cgo + package main import ( diff --git a/examples/client-record-format-h264/main.go b/examples/client-record-format-h264/main.go index ed684108..60168e4f 100644 --- a/examples/client-record-format-h264/main.go +++ b/examples/client-record-format-h264/main.go @@ -1,5 +1,6 @@ //go:build cgo +// Package main contains an example. package main import ( diff --git a/examples/client-record-format-h265/dummy_image.go b/examples/client-record-format-h265/dummy_image.go index f88c036d..557f696c 100644 --- a/examples/client-record-format-h265/dummy_image.go +++ b/examples/client-record-format-h265/dummy_image.go @@ -1,3 +1,5 @@ +//go:build cgo + package main import ( diff --git a/examples/client-record-format-h265/main.go b/examples/client-record-format-h265/main.go index f8b47279..832f1140 100644 --- a/examples/client-record-format-h265/main.go +++ b/examples/client-record-format-h265/main.go @@ -1,5 +1,6 @@ //go:build cgo +// Package main contains an example. package main import ( diff --git a/examples/client-record-format-lpcm/main.go b/examples/client-record-format-lpcm/main.go index bcb78062..1682d4ee 100644 --- a/examples/client-record-format-lpcm/main.go +++ b/examples/client-record-format-lpcm/main.go @@ -1,3 +1,4 @@ +// Package main contains an example. package main import ( diff --git a/examples/client-record-format-mjpeg/main.go b/examples/client-record-format-mjpeg/main.go index a3033e91..e3c2ed15 100644 --- a/examples/client-record-format-mjpeg/main.go +++ b/examples/client-record-format-mjpeg/main.go @@ -1,3 +1,4 @@ +// Package main contains an example. package main import ( diff --git a/examples/client-record-format-mpeg4audio/dummy_audio.go b/examples/client-record-format-mpeg4audio/dummy_audio.go index 267263b2..8aa6ad24 100644 --- a/examples/client-record-format-mpeg4audio/dummy_audio.go +++ b/examples/client-record-format-mpeg4audio/dummy_audio.go @@ -1,3 +1,5 @@ +//go:build cgo + package main import "math" diff --git a/examples/client-record-format-mpeg4audio/main.go b/examples/client-record-format-mpeg4audio/main.go index 173f5a34..b3a82fb8 100644 --- a/examples/client-record-format-mpeg4audio/main.go +++ b/examples/client-record-format-mpeg4audio/main.go @@ -1,5 +1,6 @@ //go:build cgo +// Package main contains an example. package main import ( diff --git a/examples/client-record-format-opus/dummy_audio.go b/examples/client-record-format-opus/dummy_audio.go index 267263b2..8aa6ad24 100644 --- a/examples/client-record-format-opus/dummy_audio.go +++ b/examples/client-record-format-opus/dummy_audio.go @@ -1,3 +1,5 @@ +//go:build cgo + package main import "math" diff --git a/examples/client-record-format-opus/main.go b/examples/client-record-format-opus/main.go index 2363b054..bd10bf2a 100644 --- a/examples/client-record-format-opus/main.go +++ b/examples/client-record-format-opus/main.go @@ -1,5 +1,6 @@ //go:build cgo +// Package main contains an example. package main import ( diff --git a/examples/client-record-format-vp8/dummy_image.go b/examples/client-record-format-vp8/dummy_image.go index f88c036d..557f696c 100644 --- a/examples/client-record-format-vp8/dummy_image.go +++ b/examples/client-record-format-vp8/dummy_image.go @@ -1,3 +1,5 @@ +//go:build cgo + package main import ( diff --git a/examples/client-record-format-vp8/main.go b/examples/client-record-format-vp8/main.go index fbf4f9a3..d6d80444 100644 --- a/examples/client-record-format-vp8/main.go +++ b/examples/client-record-format-vp8/main.go @@ -1,5 +1,6 @@ //go:build cgo +// Package main contains an example. package main import ( diff --git a/examples/client-record-format-vp9/dummy_image.go b/examples/client-record-format-vp9/dummy_image.go index f88c036d..557f696c 100644 --- a/examples/client-record-format-vp9/dummy_image.go +++ b/examples/client-record-format-vp9/dummy_image.go @@ -1,3 +1,5 @@ +//go:build cgo + package main import ( diff --git a/examples/client-record-format-vp9/main.go b/examples/client-record-format-vp9/main.go index 6f1e4964..76c2d9ea 100644 --- a/examples/client-record-format-vp9/main.go +++ b/examples/client-record-format-vp9/main.go @@ -1,5 +1,6 @@ //go:build cgo +// Package main contains an example. package main import ( diff --git a/examples/client-record-options/dummy_image.go b/examples/client-record-options/dummy_image.go index f88c036d..557f696c 100644 --- a/examples/client-record-options/dummy_image.go +++ b/examples/client-record-options/dummy_image.go @@ -1,3 +1,5 @@ +//go:build cgo + package main import ( diff --git a/examples/client-record-options/main.go b/examples/client-record-options/main.go index abf926c2..54b95a3e 100644 --- a/examples/client-record-options/main.go +++ b/examples/client-record-options/main.go @@ -1,5 +1,6 @@ //go:build cgo +// Package main contains an example. package main import ( diff --git a/examples/client-record-pause/dummy_image.go b/examples/client-record-pause/dummy_image.go index f88c036d..557f696c 100644 --- a/examples/client-record-pause/dummy_image.go +++ b/examples/client-record-pause/dummy_image.go @@ -1,3 +1,5 @@ +//go:build cgo + package main import ( diff --git a/examples/client-record-pause/main.go b/examples/client-record-pause/main.go index f51ea0e6..bac670ca 100644 --- a/examples/client-record-pause/main.go +++ b/examples/client-record-pause/main.go @@ -1,5 +1,6 @@ //go:build cgo +// Package main contains an example. package main import ( diff --git a/examples/proxy-backchannel/client.go b/examples/proxy-backchannel/client.go index 8d626592..e23e2f79 100644 --- a/examples/proxy-backchannel/client.go +++ b/examples/proxy-backchannel/client.go @@ -78,7 +78,7 @@ func (c *client) read() error { } writeToClient := func(pkt *rtp.Packet) { - rc.WritePacketRTP(backChannelMedia, pkt) + rc.WritePacketRTP(backChannelMedia, pkt) //nolint:errcheck } // setup all medias @@ -94,11 +94,11 @@ func (c *client) read() error { log.Printf("stream is ready and can be read from the server at rtsp://localhost:8554/stream\n") // called when a RTP packet arrives - rc.OnPacketRTPAny(func(medi *description.Media, forma format.Format, pkt *rtp.Packet) { + rc.OnPacketRTPAny(func(medi *description.Media, _ format.Format, pkt *rtp.Packet) { log.Printf("received RTP packet from the client, routing to readers") // route incoming packets to the server stream - stream.WritePacketRTP(medi, pkt) + stream.WritePacketRTP(medi, pkt) //nolint:errcheck }) // start playing diff --git a/examples/proxy-backchannel/main.go b/examples/proxy-backchannel/main.go index ca2cf5e7..313b345a 100644 --- a/examples/proxy-backchannel/main.go +++ b/examples/proxy-backchannel/main.go @@ -1,3 +1,4 @@ +// Package main contains an example. package main import "log" diff --git a/examples/proxy-backchannel/server.go b/examples/proxy-backchannel/server.go index bc0dbec3..9bae5d52 100644 --- a/examples/proxy-backchannel/server.go +++ b/examples/proxy-backchannel/server.go @@ -32,7 +32,7 @@ func (s *server) initialize() { } // called when a connection is opened. -func (s *server) OnConnOpen(ctx *gortsplib.ServerHandlerOnConnOpenCtx) { +func (s *server) OnConnOpen(_ *gortsplib.ServerHandlerOnConnOpenCtx) { log.Printf("conn opened") } @@ -42,17 +42,17 @@ func (s *server) OnConnClose(ctx *gortsplib.ServerHandlerOnConnCloseCtx) { } // called when a session is opened. -func (s *server) OnSessionOpen(ctx *gortsplib.ServerHandlerOnSessionOpenCtx) { +func (s *server) OnSessionOpen(_ *gortsplib.ServerHandlerOnSessionOpenCtx) { log.Printf("session opened") } // called when a session is closed. -func (s *server) OnSessionClose(ctx *gortsplib.ServerHandlerOnSessionCloseCtx) { +func (s *server) OnSessionClose(_ *gortsplib.ServerHandlerOnSessionCloseCtx) { log.Printf("session closed") } // called when receiving a DESCRIBE request. -func (s *server) OnDescribe(ctx *gortsplib.ServerHandlerOnDescribeCtx) (*base.Response, *gortsplib.ServerStream, error) { +func (s *server) OnDescribe(_ *gortsplib.ServerHandlerOnDescribeCtx) (*base.Response, *gortsplib.ServerStream, error) { log.Printf("DESCRIBE request") s.mutex.RLock() @@ -71,7 +71,7 @@ func (s *server) OnDescribe(ctx *gortsplib.ServerHandlerOnDescribeCtx) (*base.Re } // called when receiving a SETUP request. -func (s *server) OnSetup(ctx *gortsplib.ServerHandlerOnSetupCtx) (*base.Response, *gortsplib.ServerStream, error) { +func (s *server) OnSetup(_ *gortsplib.ServerHandlerOnSetupCtx) (*base.Response, *gortsplib.ServerStream, error) { log.Printf("SETUP request") s.mutex.RLock() @@ -93,7 +93,7 @@ func (s *server) OnSetup(ctx *gortsplib.ServerHandlerOnSetupCtx) (*base.Response func (s *server) OnPlay(ctx *gortsplib.ServerHandlerOnPlayCtx) (*base.Response, error) { log.Printf("PLAY request") - ctx.Session.OnPacketRTPAny(func(m *description.Media, f format.Format, pkt *rtp.Packet) { + ctx.Session.OnPacketRTPAny(func(_ *description.Media, _ format.Format, pkt *rtp.Packet) { log.Printf("received RTP packet from readers, routing to the client") s.writeToClient(pkt) diff --git a/examples/proxy/client.go b/examples/proxy/client.go index 56b28a86..5b6c0d5c 100644 --- a/examples/proxy/client.go +++ b/examples/proxy/client.go @@ -69,9 +69,9 @@ func (c *client) read() error { log.Printf("stream is ready and can be read from the server at rtsp://localhost:8554/stream\n") // called when a RTP packet arrives - rc.OnPacketRTPAny(func(medi *description.Media, forma format.Format, pkt *rtp.Packet) { + rc.OnPacketRTPAny(func(medi *description.Media, _ format.Format, pkt *rtp.Packet) { // route incoming packets to the server stream - stream.WritePacketRTP(medi, pkt) + stream.WritePacketRTP(medi, pkt) //nolint:errcheck }) // start playing diff --git a/examples/proxy/main.go b/examples/proxy/main.go index 9cbc751e..01824c1f 100644 --- a/examples/proxy/main.go +++ b/examples/proxy/main.go @@ -1,3 +1,4 @@ +// Package main contains an example. package main import "log" diff --git a/examples/proxy/server.go b/examples/proxy/server.go index b7558161..e544afc2 100644 --- a/examples/proxy/server.go +++ b/examples/proxy/server.go @@ -29,7 +29,7 @@ func (s *server) initialize() { } // called when a connection is opened. -func (s *server) OnConnOpen(ctx *gortsplib.ServerHandlerOnConnOpenCtx) { +func (s *server) OnConnOpen(_ *gortsplib.ServerHandlerOnConnOpenCtx) { log.Printf("conn opened") } @@ -39,17 +39,17 @@ func (s *server) OnConnClose(ctx *gortsplib.ServerHandlerOnConnCloseCtx) { } // called when a session is opened. -func (s *server) OnSessionOpen(ctx *gortsplib.ServerHandlerOnSessionOpenCtx) { +func (s *server) OnSessionOpen(_ *gortsplib.ServerHandlerOnSessionOpenCtx) { log.Printf("session opened") } // called when a session is closed. -func (s *server) OnSessionClose(ctx *gortsplib.ServerHandlerOnSessionCloseCtx) { +func (s *server) OnSessionClose(_ *gortsplib.ServerHandlerOnSessionCloseCtx) { log.Printf("session closed") } // called when receiving a DESCRIBE request. -func (s *server) OnDescribe(ctx *gortsplib.ServerHandlerOnDescribeCtx) (*base.Response, *gortsplib.ServerStream, error) { +func (s *server) OnDescribe(_ *gortsplib.ServerHandlerOnDescribeCtx) (*base.Response, *gortsplib.ServerStream, error) { log.Printf("DESCRIBE request") s.mutex.RLock() @@ -68,7 +68,7 @@ func (s *server) OnDescribe(ctx *gortsplib.ServerHandlerOnDescribeCtx) (*base.Re } // called when receiving a SETUP request. -func (s *server) OnSetup(ctx *gortsplib.ServerHandlerOnSetupCtx) (*base.Response, *gortsplib.ServerStream, error) { +func (s *server) OnSetup(_ *gortsplib.ServerHandlerOnSetupCtx) (*base.Response, *gortsplib.ServerStream, error) { log.Printf("SETUP request") s.mutex.RLock() @@ -87,7 +87,7 @@ func (s *server) OnSetup(ctx *gortsplib.ServerHandlerOnSetupCtx) (*base.Response } // called when receiving a PLAY request. -func (s *server) OnPlay(ctx *gortsplib.ServerHandlerOnPlayCtx) (*base.Response, error) { +func (s *server) OnPlay(_ *gortsplib.ServerHandlerOnPlayCtx) (*base.Response, error) { log.Printf("PLAY request") return &base.Response{ diff --git a/examples/server-auth/main.go b/examples/server-auth/main.go index b63fb21c..acd8f869 100644 --- a/examples/server-auth/main.go +++ b/examples/server-auth/main.go @@ -1,3 +1,4 @@ +// Package main contains an example. package main import ( @@ -36,7 +37,7 @@ type serverHandler struct { } // called when a connection is opened. -func (sh *serverHandler) OnConnOpen(ctx *gortsplib.ServerHandlerOnConnOpenCtx) { +func (sh *serverHandler) OnConnOpen(_ *gortsplib.ServerHandlerOnConnOpenCtx) { log.Printf("conn opened") } @@ -46,7 +47,7 @@ func (sh *serverHandler) OnConnClose(ctx *gortsplib.ServerHandlerOnConnCloseCtx) } // called when a session is opened. -func (sh *serverHandler) OnSessionOpen(ctx *gortsplib.ServerHandlerOnSessionOpenCtx) { +func (sh *serverHandler) OnSessionOpen(_ *gortsplib.ServerHandlerOnSessionOpenCtx) { log.Printf("session opened") } @@ -66,7 +67,9 @@ func (sh *serverHandler) OnSessionClose(ctx *gortsplib.ServerHandlerOnSessionClo } // called when receiving a DESCRIBE request. -func (sh *serverHandler) OnDescribe(ctx *gortsplib.ServerHandlerOnDescribeCtx) (*base.Response, *gortsplib.ServerStream, error) { +func (sh *serverHandler) OnDescribe(ctx *gortsplib.ServerHandlerOnDescribeCtx) ( + *base.Response, *gortsplib.ServerStream, error, +) { log.Printf("DESCRIBE request") // Verify reader credentials. @@ -133,7 +136,9 @@ func (sh *serverHandler) OnAnnounce(ctx *gortsplib.ServerHandlerOnAnnounceCtx) ( } // called when receiving a SETUP request. -func (sh *serverHandler) OnSetup(ctx *gortsplib.ServerHandlerOnSetupCtx) (*base.Response, *gortsplib.ServerStream, error) { +func (sh *serverHandler) OnSetup(ctx *gortsplib.ServerHandlerOnSetupCtx) ( + *base.Response, *gortsplib.ServerStream, error, +) { log.Printf("SETUP request") // SETUP is used by both readers and publishers. In case of publishers, just return StatusOK. @@ -168,7 +173,7 @@ func (sh *serverHandler) OnSetup(ctx *gortsplib.ServerHandlerOnSetupCtx) (*base. } // called when receiving a PLAY request. -func (sh *serverHandler) OnPlay(ctx *gortsplib.ServerHandlerOnPlayCtx) (*base.Response, error) { +func (sh *serverHandler) OnPlay(_ *gortsplib.ServerHandlerOnPlayCtx) (*base.Response, error) { log.Printf("PLAY request") return &base.Response{ @@ -181,9 +186,9 @@ func (sh *serverHandler) OnRecord(ctx *gortsplib.ServerHandlerOnRecordCtx) (*bas log.Printf("RECORD request") // called when receiving a RTP packet - ctx.Session.OnPacketRTPAny(func(medi *description.Media, forma format.Format, pkt *rtp.Packet) { + ctx.Session.OnPacketRTPAny(func(medi *description.Media, _ format.Format, pkt *rtp.Packet) { // route the RTP packet to all readers - sh.stream.WritePacketRTP(medi, pkt) + sh.stream.WritePacketRTP(medi, pkt) //nolint:errcheck }) return &base.Response{ diff --git a/examples/server-play-backchannel/audio_streamer.go b/examples/server-play-backchannel/audio_streamer.go index cbfb861e..8810b1bf 100644 --- a/examples/server-play-backchannel/audio_streamer.go +++ b/examples/server-play-backchannel/audio_streamer.go @@ -2,14 +2,12 @@ package main import ( "crypto/rand" - "fmt" "log" "time" "github.com/bluenviron/gortsplib/v4" "github.com/bluenviron/gortsplib/v4/pkg/format" "github.com/bluenviron/mediacommon/v2/pkg/codecs/g711" - "github.com/bluenviron/mediacommon/v2/pkg/formats/mpegts" ) func multiplyAndDivide(v, m, d int64) int64 { @@ -27,15 +25,6 @@ func randUint32() (uint32, error) { return uint32(b[0])<<24 | uint32(b[1])<<16 | uint32(b[2])<<8 | uint32(b[3]), nil } -func findTrack(r *mpegts.Reader) (*mpegts.Track, error) { - for _, track := range r.Tracks() { - if _, ok := track.Codec.(*mpegts.CodecH264); ok { - return track, nil - } - } - return nil, fmt.Errorf("H264 track not found") -} - type audioStreamer struct { stream *gortsplib.ServerStream } @@ -68,7 +57,8 @@ func (r *audioStreamer) run() { for range ticker.C { // get current timestamp - pts := multiplyAndDivide(int64(time.Since(start)), int64(r.stream.Desc.Medias[0].Formats[0].ClockRate()), int64(time.Second)) + pts := multiplyAndDivide(int64(time.Since(start)), + int64(r.stream.Desc.Medias[0].Formats[0].ClockRate()), int64(time.Second)) // generate dummy LPCM audio samples samples := createDummyAudio(pts, prevPTS) @@ -98,6 +88,5 @@ func (r *audioStreamer) run() { } prevPTS = pts - } } diff --git a/examples/server-play-backchannel/main.go b/examples/server-play-backchannel/main.go index 4369c67d..323a2fea 100644 --- a/examples/server-play-backchannel/main.go +++ b/examples/server-play-backchannel/main.go @@ -1,3 +1,4 @@ +// Package main contains an example. package main import ( @@ -23,7 +24,7 @@ type serverHandler struct { } // called when a connection is opened. -func (sh *serverHandler) OnConnOpen(ctx *gortsplib.ServerHandlerOnConnOpenCtx) { +func (sh *serverHandler) OnConnOpen(_ *gortsplib.ServerHandlerOnConnOpenCtx) { log.Printf("conn opened") } @@ -33,17 +34,19 @@ func (sh *serverHandler) OnConnClose(ctx *gortsplib.ServerHandlerOnConnCloseCtx) } // called when a session is opened. -func (sh *serverHandler) OnSessionOpen(ctx *gortsplib.ServerHandlerOnSessionOpenCtx) { +func (sh *serverHandler) OnSessionOpen(_ *gortsplib.ServerHandlerOnSessionOpenCtx) { log.Printf("session opened") } // called when a session is closed. -func (sh *serverHandler) OnSessionClose(ctx *gortsplib.ServerHandlerOnSessionCloseCtx) { +func (sh *serverHandler) OnSessionClose(_ *gortsplib.ServerHandlerOnSessionCloseCtx) { log.Printf("session closed") } // called when receiving a DESCRIBE request. -func (sh *serverHandler) OnDescribe(ctx *gortsplib.ServerHandlerOnDescribeCtx) (*base.Response, *gortsplib.ServerStream, error) { +func (sh *serverHandler) OnDescribe( + _ *gortsplib.ServerHandlerOnDescribeCtx, +) (*base.Response, *gortsplib.ServerStream, error) { log.Printf("DESCRIBE request") sh.mutex.RLock() @@ -55,7 +58,9 @@ func (sh *serverHandler) OnDescribe(ctx *gortsplib.ServerHandlerOnDescribeCtx) ( } // called when receiving a SETUP request. -func (sh *serverHandler) OnSetup(ctx *gortsplib.ServerHandlerOnSetupCtx) (*base.Response, *gortsplib.ServerStream, error) { +func (sh *serverHandler) OnSetup( + _ *gortsplib.ServerHandlerOnSetupCtx, +) (*base.Response, *gortsplib.ServerStream, error) { log.Printf("SETUP request") sh.mutex.RLock() @@ -71,7 +76,7 @@ func (sh *serverHandler) OnPlay(ctx *gortsplib.ServerHandlerOnPlayCtx) (*base.Re log.Printf("PLAY request") // called when receiving a RTP packet - ctx.Session.OnPacketRTPAny(func(m *description.Media, f format.Format, pkt *rtp.Packet) { + ctx.Session.OnPacketRTPAny(func(m *description.Media, _ format.Format, pkt *rtp.Packet) { // decode timestamp pts, ok := ctx.Session.PacketPTS2(m, pkt) if !ok { diff --git a/examples/server-play-format-h264-from-disk/main.go b/examples/server-play-format-h264-from-disk/main.go index f3b108a1..9c30c4af 100644 --- a/examples/server-play-format-h264-from-disk/main.go +++ b/examples/server-play-format-h264-from-disk/main.go @@ -1,3 +1,4 @@ +// Package main contains an example. package main import ( @@ -22,7 +23,7 @@ type serverHandler struct { } // called when a connection is opened. -func (sh *serverHandler) OnConnOpen(ctx *gortsplib.ServerHandlerOnConnOpenCtx) { +func (sh *serverHandler) OnConnOpen(_ *gortsplib.ServerHandlerOnConnOpenCtx) { log.Printf("conn opened") } @@ -32,17 +33,19 @@ func (sh *serverHandler) OnConnClose(ctx *gortsplib.ServerHandlerOnConnCloseCtx) } // called when a session is opened. -func (sh *serverHandler) OnSessionOpen(ctx *gortsplib.ServerHandlerOnSessionOpenCtx) { +func (sh *serverHandler) OnSessionOpen(_ *gortsplib.ServerHandlerOnSessionOpenCtx) { log.Printf("session opened") } // called when a session is closed. -func (sh *serverHandler) OnSessionClose(ctx *gortsplib.ServerHandlerOnSessionCloseCtx) { +func (sh *serverHandler) OnSessionClose(_ *gortsplib.ServerHandlerOnSessionCloseCtx) { log.Printf("session closed") } // called when receiving a DESCRIBE request. -func (sh *serverHandler) OnDescribe(ctx *gortsplib.ServerHandlerOnDescribeCtx) (*base.Response, *gortsplib.ServerStream, error) { +func (sh *serverHandler) OnDescribe( + _ *gortsplib.ServerHandlerOnDescribeCtx, +) (*base.Response, *gortsplib.ServerStream, error) { log.Printf("DESCRIBE request") sh.mutex.RLock() @@ -54,7 +57,9 @@ func (sh *serverHandler) OnDescribe(ctx *gortsplib.ServerHandlerOnDescribeCtx) ( } // called when receiving a SETUP request. -func (sh *serverHandler) OnSetup(ctx *gortsplib.ServerHandlerOnSetupCtx) (*base.Response, *gortsplib.ServerStream, error) { +func (sh *serverHandler) OnSetup( + _ *gortsplib.ServerHandlerOnSetupCtx, +) (*base.Response, *gortsplib.ServerStream, error) { log.Printf("SETUP request") sh.mutex.RLock() @@ -66,7 +71,7 @@ func (sh *serverHandler) OnSetup(ctx *gortsplib.ServerHandlerOnSetupCtx) (*base. } // called when receiving a PLAY request. -func (sh *serverHandler) OnPlay(ctx *gortsplib.ServerHandlerOnPlayCtx) (*base.Response, error) { +func (sh *serverHandler) OnPlay(_ *gortsplib.ServerHandlerOnPlayCtx) (*base.Response, error) { log.Printf("PLAY request") return &base.Response{ diff --git a/examples/server-record-format-h264-to-disk/main.go b/examples/server-record-format-h264-to-disk/main.go index 7198606f..0f4ad1b1 100644 --- a/examples/server-record-format-h264-to-disk/main.go +++ b/examples/server-record-format-h264-to-disk/main.go @@ -1,3 +1,4 @@ +// Package main contains an example. package main import ( @@ -30,7 +31,7 @@ type serverHandler struct { } // called when a connection is opened. -func (sh *serverHandler) OnConnOpen(ctx *gortsplib.ServerHandlerOnConnOpenCtx) { +func (sh *serverHandler) OnConnOpen(_ *gortsplib.ServerHandlerOnConnOpenCtx) { log.Printf("conn opened") } @@ -40,12 +41,12 @@ func (sh *serverHandler) OnConnClose(ctx *gortsplib.ServerHandlerOnConnCloseCtx) } // called when a session is opened. -func (sh *serverHandler) OnSessionOpen(ctx *gortsplib.ServerHandlerOnSessionOpenCtx) { +func (sh *serverHandler) OnSessionOpen(_ *gortsplib.ServerHandlerOnSessionOpenCtx) { log.Printf("session opened") } // called when a session is closed. -func (sh *serverHandler) OnSessionClose(ctx *gortsplib.ServerHandlerOnSessionCloseCtx) { +func (sh *serverHandler) OnSessionClose(_ *gortsplib.ServerHandlerOnSessionCloseCtx) { log.Printf("session closed") sh.mutex.Lock() @@ -107,7 +108,9 @@ func (sh *serverHandler) OnAnnounce(ctx *gortsplib.ServerHandlerOnAnnounceCtx) ( } // called when receiving a SETUP request. -func (sh *serverHandler) OnSetup(ctx *gortsplib.ServerHandlerOnSetupCtx) (*base.Response, *gortsplib.ServerStream, error) { +func (sh *serverHandler) OnSetup( + ctx *gortsplib.ServerHandlerOnSetupCtx, +) (*base.Response, *gortsplib.ServerStream, error) { // prevent readers from using the server. if ctx.Session.State() == gortsplib.ServerSessionStateInitial { return &base.Response{ @@ -140,7 +143,7 @@ func (sh *serverHandler) OnRecord(ctx *gortsplib.ServerHandlerOnRecordCtx) (*bas } // encode H264 access unit into MPEG-TS - sh.mpegtsMuxer.writeH264(au, pts) + sh.mpegtsMuxer.writeH264(au, pts) //nolint:errcheck }) return &base.Response{ diff --git a/examples/server-record-format-h264-to-disk/mpegts_muxer.go b/examples/server-record-format-h264-to-disk/mpegts_muxer.go index 28cc9788..b03817bb 100644 --- a/examples/server-record-format-h264-to-disk/mpegts_muxer.go +++ b/examples/server-record-format-h264-to-disk/mpegts_muxer.go @@ -45,13 +45,13 @@ func (e *mpegtsMuxer) initialize() error { // close closes all the mpegtsMuxer resources. func (e *mpegtsMuxer) close() { - e.b.Flush() + e.b.Flush() //nolint:errcheck e.f.Close() } // writeH264 writes a H264 access unit into MPEG-TS. func (e *mpegtsMuxer) writeH264(au [][]byte, pts int64) error { - var filteredAU [][]byte + var filteredAU [][]byte //nolint:prealloc nonIDRPresent := false idrPresent := false @@ -96,7 +96,8 @@ func (e *mpegtsMuxer) writeH264(au [][]byte, pts int64) error { if !idrPresent { return nil } - e.dtsExtractor = h264.NewDTSExtractor() + e.dtsExtractor = &h264.DTSExtractor{} + e.dtsExtractor.Initialize() } dts, err := e.dtsExtractor.Extract(au, pts) diff --git a/examples/server-tls/main.go b/examples/server-tls/main.go index cbe5039b..8d3c423e 100644 --- a/examples/server-tls/main.go +++ b/examples/server-tls/main.go @@ -1,3 +1,4 @@ +// Package main contains an example. package main import ( @@ -26,7 +27,7 @@ type serverHandler struct { } // called when a connection is opened. -func (sh *serverHandler) OnConnOpen(ctx *gortsplib.ServerHandlerOnConnOpenCtx) { +func (sh *serverHandler) OnConnOpen(_ *gortsplib.ServerHandlerOnConnOpenCtx) { log.Printf("conn opened") } @@ -36,7 +37,7 @@ func (sh *serverHandler) OnConnClose(ctx *gortsplib.ServerHandlerOnConnCloseCtx) } // called when a session is opened. -func (sh *serverHandler) OnSessionOpen(ctx *gortsplib.ServerHandlerOnSessionOpenCtx) { +func (sh *serverHandler) OnSessionOpen(_ *gortsplib.ServerHandlerOnSessionOpenCtx) { log.Printf("session opened") } @@ -56,7 +57,9 @@ func (sh *serverHandler) OnSessionClose(ctx *gortsplib.ServerHandlerOnSessionClo } // called when receiving a DESCRIBE request. -func (sh *serverHandler) OnDescribe(ctx *gortsplib.ServerHandlerOnDescribeCtx) (*base.Response, *gortsplib.ServerStream, error) { +func (sh *serverHandler) OnDescribe( + _ *gortsplib.ServerHandlerOnDescribeCtx, +) (*base.Response, *gortsplib.ServerStream, error) { log.Printf("DESCRIBE request") sh.mutex.RLock() @@ -105,7 +108,9 @@ func (sh *serverHandler) OnAnnounce(ctx *gortsplib.ServerHandlerOnAnnounceCtx) ( } // called when receiving a SETUP request. -func (sh *serverHandler) OnSetup(ctx *gortsplib.ServerHandlerOnSetupCtx) (*base.Response, *gortsplib.ServerStream, error) { +func (sh *serverHandler) OnSetup( + ctx *gortsplib.ServerHandlerOnSetupCtx, +) (*base.Response, *gortsplib.ServerStream, error) { log.Printf("SETUP request") // SETUP is used by both readers and publishers. In case of publishers, just return StatusOK. @@ -131,7 +136,7 @@ func (sh *serverHandler) OnSetup(ctx *gortsplib.ServerHandlerOnSetupCtx) (*base. } // called when receiving a PLAY request. -func (sh *serverHandler) OnPlay(ctx *gortsplib.ServerHandlerOnPlayCtx) (*base.Response, error) { +func (sh *serverHandler) OnPlay(_ *gortsplib.ServerHandlerOnPlayCtx) (*base.Response, error) { log.Printf("PLAY request") return &base.Response{ @@ -144,9 +149,9 @@ func (sh *serverHandler) OnRecord(ctx *gortsplib.ServerHandlerOnRecordCtx) (*bas log.Printf("RECORD request") // called when receiving a RTP packet - ctx.Session.OnPacketRTPAny(func(medi *description.Media, forma format.Format, pkt *rtp.Packet) { + ctx.Session.OnPacketRTPAny(func(medi *description.Media, _ format.Format, pkt *rtp.Packet) { // route the RTP packet to all readers - sh.stream.WritePacketRTP(medi, pkt) + sh.stream.WritePacketRTP(medi, pkt) //nolint:errcheck }) return &base.Response{ diff --git a/examples/server/main.go b/examples/server/main.go index 65e5adac..dde9bbbb 100644 --- a/examples/server/main.go +++ b/examples/server/main.go @@ -1,3 +1,4 @@ +// Package main contains an example. package main import ( @@ -25,7 +26,7 @@ type serverHandler struct { } // called when a connection is opened. -func (sh *serverHandler) OnConnOpen(ctx *gortsplib.ServerHandlerOnConnOpenCtx) { +func (sh *serverHandler) OnConnOpen(_ *gortsplib.ServerHandlerOnConnOpenCtx) { log.Printf("conn opened") } @@ -35,7 +36,7 @@ func (sh *serverHandler) OnConnClose(ctx *gortsplib.ServerHandlerOnConnCloseCtx) } // called when a session is opened. -func (sh *serverHandler) OnSessionOpen(ctx *gortsplib.ServerHandlerOnSessionOpenCtx) { +func (sh *serverHandler) OnSessionOpen(_ *gortsplib.ServerHandlerOnSessionOpenCtx) { log.Printf("session opened") } @@ -55,7 +56,9 @@ func (sh *serverHandler) OnSessionClose(ctx *gortsplib.ServerHandlerOnSessionClo } // called when receiving a DESCRIBE request. -func (sh *serverHandler) OnDescribe(ctx *gortsplib.ServerHandlerOnDescribeCtx) (*base.Response, *gortsplib.ServerStream, error) { +func (sh *serverHandler) OnDescribe( + _ *gortsplib.ServerHandlerOnDescribeCtx, +) (*base.Response, *gortsplib.ServerStream, error) { log.Printf("DESCRIBE request") sh.mutex.RLock() @@ -104,7 +107,9 @@ func (sh *serverHandler) OnAnnounce(ctx *gortsplib.ServerHandlerOnAnnounceCtx) ( } // called when receiving a SETUP request. -func (sh *serverHandler) OnSetup(ctx *gortsplib.ServerHandlerOnSetupCtx) (*base.Response, *gortsplib.ServerStream, error) { +func (sh *serverHandler) OnSetup(ctx *gortsplib.ServerHandlerOnSetupCtx) ( + *base.Response, *gortsplib.ServerStream, error, +) { log.Printf("SETUP request") // SETUP is used by both readers and publishers. In case of publishers, just return StatusOK. @@ -130,7 +135,7 @@ func (sh *serverHandler) OnSetup(ctx *gortsplib.ServerHandlerOnSetupCtx) (*base. } // called when receiving a PLAY request. -func (sh *serverHandler) OnPlay(ctx *gortsplib.ServerHandlerOnPlayCtx) (*base.Response, error) { +func (sh *serverHandler) OnPlay(_ *gortsplib.ServerHandlerOnPlayCtx) (*base.Response, error) { log.Printf("PLAY request") return &base.Response{ @@ -143,9 +148,9 @@ func (sh *serverHandler) OnRecord(ctx *gortsplib.ServerHandlerOnRecordCtx) (*bas log.Printf("RECORD request") // called when receiving a RTP packet - ctx.Session.OnPacketRTPAny(func(medi *description.Media, forma format.Format, pkt *rtp.Packet) { + ctx.Session.OnPacketRTPAny(func(medi *description.Media, _ format.Format, pkt *rtp.Packet) { // route the RTP packet to all readers - sh.stream.WritePacketRTP(medi, pkt) + sh.stream.WritePacketRTP(medi, pkt) //nolint:errcheck }) return &base.Response{ diff --git a/pkg/format/rtpmjpeg/encoder.go b/pkg/format/rtpmjpeg/encoder.go index b3bbdf60..a6787471 100644 --- a/pkg/format/rtpmjpeg/encoder.go +++ b/pkg/format/rtpmjpeg/encoder.go @@ -81,11 +81,7 @@ func (e *Encoder) Encode(image []byte) ([]*rtp.Packet, error) { var data []byte outer: - for { - if len(image) < 2 { - break - } - + for len(image) >= 2 { h0, h1 := image[0], image[1] image = image[2:] diff --git a/pkg/format/rtpmpeg1video/decoder.go b/pkg/format/rtpmpeg1video/decoder.go index 9309df34..31fcb697 100644 --- a/pkg/format/rtpmpeg1video/decoder.go +++ b/pkg/format/rtpmpeg1video/decoder.go @@ -72,13 +72,13 @@ func (d *Decoder) decodeSlice(pkt *rtp.Packet) ([]byte, error) { an := pkt.Payload[2] >> 7 if an != 0 { d.resetFragments() - return nil, fmt.Errorf("AN not supported yet") + return nil, fmt.Errorf("'AN' not supported yet") } n := (pkt.Payload[2] >> 6) & 0x01 if n != 0 { d.resetFragments() - return nil, fmt.Errorf("N not supported yet") + return nil, fmt.Errorf("'N' not supported yet") } b := (pkt.Payload[2] >> 4) & 0x01 diff --git a/pkg/headers/keyval.go b/pkg/headers/keyval.go index bd72e27a..5b2d2539 100644 --- a/pkg/headers/keyval.go +++ b/pkg/headers/keyval.go @@ -6,11 +6,7 @@ import ( func readKey(str string, separator byte) (string, string) { i := 0 - for { - if i >= len(str) || str[i] == '=' || str[i] == separator { - break - } - + for i < len(str) && str[i] != '=' && str[i] != separator { i++ } return str[:i], str[i:]