bump golangci-lint (#784)

This commit is contained in:
Alessandro Ros
2025-05-23 14:51:33 +02:00
committed by GitHub
parent 2694ed941f
commit b1804d77e8
72 changed files with 289 additions and 211 deletions

View File

@@ -20,9 +20,9 @@ jobs:
with: with:
go-version: "1.24" go-version: "1.24"
- uses: golangci/golangci-lint-action@v3 - uses: golangci/golangci-lint-action@v8
with: with:
version: v1.64.5 version: v2.1.6
go-mod-tidy: go-mod-tidy:
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04

View File

@@ -1,33 +1,29 @@
version: "2"
linters: linters:
enable: enable:
- asciicheck - asciicheck
- bidichk - bidichk
- bodyclose - bodyclose
#- contextcheck
- copyloopvar - copyloopvar
- dupl - dupl
- errorlint - errorlint
- gochecknoinits - gochecknoinits
- gocritic - gocritic
- gofmt
- gofumpt
- lll - lll
- misspell - misspell
- nilerr - nilerr
- prealloc - prealloc
- predeclared - predeclared
- reassign
- revive - revive
- usestdlibvars - usestdlibvars
- unconvert - unconvert
#- usetesting
- tparallel - tparallel
- wastedassign - wastedassign
- whitespace - whitespace
issues: settings:
exclude-use-default: false
linters-settings:
errcheck: errcheck:
exclude-functions: exclude-functions:
- io.Copy - io.Copy
@@ -71,3 +67,9 @@ linters-settings:
disable: disable:
- fieldalignment - fieldalignment
- reflectvaluecompare - reflectvaluecompare
formatters:
enable:
- gofmt
- gofumpt
- goimports

View File

@@ -1,5 +1,5 @@
BASE_IMAGE = golang:1.24-alpine3.20 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) .PHONY: $(shell ls)

View File

@@ -1,3 +1,4 @@
// Package main contains an example.
package main package main
import ( import (

View File

@@ -1,5 +1,6 @@
//go:build cgo //go:build cgo
// Package main contains an example.
package main package main
import ( import (

View File

@@ -1,5 +1,6 @@
//go:build cgo //go:build cgo
// Package main contains an example.
package main package main
import ( import (

View File

@@ -1,3 +1,4 @@
// Package main contains an example.
package main package main
import ( import (
@@ -66,9 +67,9 @@ func main() {
} }
// extract G711 samples from RTP packets // extract G711 samples from RTP packets
samples, err := rtpDec.Decode(pkt) samples, err2 := rtpDec.Decode(pkt)
if err != nil { if err2 != nil {
log.Printf("ERR: %v", err) log.Printf("ERR: %v", err2)
return return
} }

View File

@@ -1,6 +1,8 @@
// Package main contains an example.
package main package main
import ( import (
"errors"
"log" "log"
"github.com/bluenviron/gortsplib/v4" "github.com/bluenviron/gortsplib/v4"
@@ -91,18 +93,18 @@ func main() {
} }
// extract access unit from RTP packets // extract access unit from RTP packets
au, err := h264RTPDec.Decode(pkt) au, err2 := h264RTPDec.Decode(pkt)
if err != nil { if err2 != nil {
if err != rtph264.ErrNonStartingPacketAndNoPrevious && err != rtph264.ErrMorePacketsNeeded { if !errors.Is(err2, rtph264.ErrNonStartingPacketAndNoPrevious) && !errors.Is(err2, rtph264.ErrMorePacketsNeeded) {
log.Printf("ERR: %v", err) log.Printf("ERR: %v", err2)
} }
return return
} }
// encode the access unit into MPEG-TS // encode the access unit into MPEG-TS
err = mpegtsMuxer.writeH264(au, pts) err2 = mpegtsMuxer.writeH264(au, pts)
if err != nil { if err2 != nil {
log.Printf("ERR: %v", err) log.Printf("ERR: %v", err2)
return return
} }
@@ -119,16 +121,16 @@ func main() {
} }
// extract access units from RTP packets // extract access units from RTP packets
aus, err := mpeg4AudioRTPDec.Decode(pkt) aus, err2 := mpeg4AudioRTPDec.Decode(pkt)
if err != nil { if err2 != nil {
log.Printf("ERR: %v", err) log.Printf("ERR: %v", err2)
return return
} }
// encode access units into MPEG-TS // encode access units into MPEG-TS
err = mpegtsMuxer.writeMPEG4Audio(aus, pts) err2 = mpegtsMuxer.writeMPEG4Audio(aus, pts)
if err != nil { if err2 != nil {
log.Printf("ERR: %v", err) log.Printf("ERR: %v", err2)
return return
} }

View File

@@ -61,7 +61,7 @@ func (e *mpegtsMuxer) initialize() error {
// close closes all the mpegtsMuxer resources. // close closes all the mpegtsMuxer resources.
func (e *mpegtsMuxer) close() { func (e *mpegtsMuxer) close() {
e.b.Flush() e.b.Flush() //nolint:errcheck
e.f.Close() e.f.Close()
} }
@@ -70,7 +70,7 @@ func (e *mpegtsMuxer) writeH264(au [][]byte, pts int64) error {
e.mutex.Lock() e.mutex.Lock()
defer e.mutex.Unlock() defer e.mutex.Unlock()
var filteredAU [][]byte var filteredAU [][]byte //nolint:prealloc
nonIDRPresent := false nonIDRPresent := false
idrPresent := false idrPresent := false
@@ -115,7 +115,8 @@ func (e *mpegtsMuxer) writeH264(au [][]byte, pts int64) error {
if !idrPresent { if !idrPresent {
return nil return nil
} }
e.dtsExtractor = h264.NewDTSExtractor() e.dtsExtractor = &h264.DTSExtractor{}
e.dtsExtractor.Initialize()
} }
dts, err := e.dtsExtractor.Extract(au, pts) dts, err := e.dtsExtractor.Extract(au, pts)
@@ -132,5 +133,6 @@ func (e *mpegtsMuxer) writeMPEG4Audio(aus [][]byte, pts int64) error {
e.mutex.Lock() e.mutex.Lock()
defer e.mutex.Unlock() 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)
} }

View File

@@ -1,6 +1,8 @@
// Package main contains an example.
package main package main
import ( import (
"errors"
"log" "log"
"github.com/bluenviron/gortsplib/v4" "github.com/bluenviron/gortsplib/v4"
@@ -78,18 +80,18 @@ func main() {
} }
// extract access unit from RTP packets // extract access unit from RTP packets
au, err := rtpDec.Decode(pkt) au, err2 := rtpDec.Decode(pkt)
if err != nil { if err2 != nil {
if err != rtph264.ErrNonStartingPacketAndNoPrevious && err != rtph264.ErrMorePacketsNeeded { if !errors.Is(err2, rtph264.ErrNonStartingPacketAndNoPrevious) && !errors.Is(err2, rtph264.ErrMorePacketsNeeded) {
log.Printf("ERR: %v", err) log.Printf("ERR: %v", err2)
} }
return return
} }
// encode the access unit into MPEG-TS // encode the access unit into MPEG-TS
err = mpegtsMuxer.writeH264(au, pts) err2 = mpegtsMuxer.writeH264(au, pts)
if err != nil { if err2 != nil {
log.Printf("ERR: %v", err) log.Printf("ERR: %v", err2)
return return
} }

View File

@@ -45,13 +45,13 @@ func (e *mpegtsMuxer) initialize() error {
// close closes all the mpegtsMuxer resources. // close closes all the mpegtsMuxer resources.
func (e *mpegtsMuxer) close() { func (e *mpegtsMuxer) close() {
e.b.Flush() e.b.Flush() //nolint:errcheck
e.f.Close() e.f.Close()
} }
// writeH264 writes a H264 access unit into MPEG-TS. // writeH264 writes a H264 access unit into MPEG-TS.
func (e *mpegtsMuxer) writeH264(au [][]byte, pts int64) error { func (e *mpegtsMuxer) writeH264(au [][]byte, pts int64) error {
var filteredAU [][]byte var filteredAU [][]byte //nolint:prealloc
nonIDRPresent := false nonIDRPresent := false
idrPresent := false idrPresent := false
@@ -96,7 +96,8 @@ func (e *mpegtsMuxer) writeH264(au [][]byte, pts int64) error {
if !idrPresent { if !idrPresent {
return nil return nil
} }
e.dtsExtractor = h264.NewDTSExtractor() e.dtsExtractor = &h264.DTSExtractor{}
e.dtsExtractor.Initialize()
} }
dts, err := e.dtsExtractor.Extract(au, pts) dts, err := e.dtsExtractor.Extract(au, pts)

View File

@@ -1,5 +1,6 @@
//go:build cgo //go:build cgo
// Package main contains an example.
package main package main
import ( import (

View File

@@ -1,5 +1,6 @@
//go:build cgo //go:build cgo
// Package main contains an example.
package main package main
import ( import (

View File

@@ -1,6 +1,8 @@
// Package main contains an example.
package main package main
import ( import (
"errors"
"log" "log"
"github.com/bluenviron/gortsplib/v4" "github.com/bluenviron/gortsplib/v4"
@@ -79,18 +81,18 @@ func main() {
} }
// extract access unit from RTP packets // extract access unit from RTP packets
au, err := rtpDec.Decode(pkt) au, err2 := rtpDec.Decode(pkt)
if err != nil { if err2 != nil {
if err != rtph265.ErrNonStartingPacketAndNoPrevious && err != rtph265.ErrMorePacketsNeeded { if !errors.Is(err2, rtph265.ErrNonStartingPacketAndNoPrevious) && !errors.Is(err2, rtph265.ErrMorePacketsNeeded) {
log.Printf("ERR: %v", err) log.Printf("ERR: %v", err2)
} }
return return
} }
// encode the access unit into MPEG-TS // encode the access unit into MPEG-TS
err = mpegtsMuxer.writeH265(au, pts) err2 = mpegtsMuxer.writeH265(au, pts)
if err != nil { if err2 != nil {
log.Printf("ERR: %v", err) log.Printf("ERR: %v", err2)
return return
} }

View File

@@ -46,13 +46,13 @@ func (e *mpegtsMuxer) initialize() error {
// close closes all the mpegtsMuxer resources. // close closes all the mpegtsMuxer resources.
func (e *mpegtsMuxer) close() { func (e *mpegtsMuxer) close() {
e.b.Flush() e.b.Flush() //nolint:errcheck
e.f.Close() e.f.Close()
} }
// writeH265 writes a H265 access unit into MPEG-TS. // writeH265 writes a H265 access unit into MPEG-TS.
func (e *mpegtsMuxer) writeH265(au [][]byte, pts int64) error { func (e *mpegtsMuxer) writeH265(au [][]byte, pts int64) error {
var filteredAU [][]byte var filteredAU [][]byte //nolint:prealloc
isRandomAccess := false isRandomAccess := false
@@ -97,7 +97,8 @@ func (e *mpegtsMuxer) writeH265(au [][]byte, pts int64) error {
if !isRandomAccess { if !isRandomAccess {
return nil return nil
} }
e.dtsExtractor = h265.NewDTSExtractor() e.dtsExtractor = &h265.DTSExtractor{}
e.dtsExtractor.Initialize()
} }
dts, err := e.dtsExtractor.Extract(au, pts) dts, err := e.dtsExtractor.Extract(au, pts)

View File

@@ -1,5 +1,6 @@
//go:build cgo //go:build cgo
// Package main contains an example.
package main package main
import ( import (

View File

@@ -1,5 +1,6 @@
//go:build cgo //go:build cgo
// Package main contains an example.
package main package main
import ( import (

View File

@@ -1,3 +1,4 @@
// Package main contains an example.
package main package main
import ( import (
@@ -65,9 +66,9 @@ func main() {
} }
// extract LPCM samples from RTP packets // extract LPCM samples from RTP packets
op, err := rtpDec.Decode(pkt) op, err2 := rtpDec.Decode(pkt)
if err != nil { if err2 != nil {
log.Printf("ERR: %v", err) log.Printf("ERR: %v", err2)
return return
} }

View File

@@ -1,7 +1,9 @@
// Package main contains an example.
package main package main
import ( import (
"bytes" "bytes"
"errors"
"image/jpeg" "image/jpeg"
"log" "log"
@@ -69,18 +71,18 @@ func main() {
} }
// extract JPEG images from RTP packets // extract JPEG images from RTP packets
enc, err := rtpDec.Decode(pkt) enc, err2 := rtpDec.Decode(pkt)
if err != nil { if err2 != nil {
if err != rtpmjpeg.ErrNonStartingPacketAndNoPrevious && err != rtpmjpeg.ErrMorePacketsNeeded { if !errors.Is(err2, rtpmjpeg.ErrNonStartingPacketAndNoPrevious) && !errors.Is(err2, rtpmjpeg.ErrMorePacketsNeeded) {
log.Printf("ERR: %v", err) log.Printf("ERR: %v", err2)
} }
return return
} }
// convert JPEG images into RGBA frames // convert JPEG images into RGBA frames
image, err := jpeg.Decode(bytes.NewReader(enc)) image, err2 := jpeg.Decode(bytes.NewReader(enc))
if err != nil { if err2 != nil {
panic(err) panic(err2)
} }
log.Printf("decoded image with PTS %v and size %v", pts, image.Bounds().Max) log.Printf("decoded image with PTS %v and size %v", pts, image.Bounds().Max)

View File

@@ -1,3 +1,4 @@
// Package main contains an example.
package main package main
import ( import (
@@ -82,16 +83,16 @@ func main() {
} }
// extract access units from RTP packets // extract access units from RTP packets
aus, err := rtpDec.Decode(pkt) aus, err2 := rtpDec.Decode(pkt)
if err != nil { if err2 != nil {
log.Printf("ERR: %v", err) log.Printf("ERR: %v", err2)
return return
} }
// encode access units into MPEG-TS // encode access units into MPEG-TS
err = mpegtsMuxer.writeMPEG4Audio(aus, pts) err2 = mpegtsMuxer.writeMPEG4Audio(aus, pts)
if err != nil { if err2 != nil {
log.Printf("ERR: %v", err) log.Printf("ERR: %v", err2)
return return
} }

View File

@@ -45,7 +45,7 @@ func (e *mpegtsMuxer) initialize() error {
// close closes all the mpegtsMuxer resources. // close closes all the mpegtsMuxer resources.
func (e *mpegtsMuxer) close() { func (e *mpegtsMuxer) close() {
e.b.Flush() e.b.Flush() //nolint:errcheck
e.f.Close() e.f.Close()
} }

View File

@@ -1,3 +1,4 @@
// Package main contains an example.
package main package main
import ( import (
@@ -65,9 +66,9 @@ func main() {
} }
// extract access units from RTP packets // extract access units from RTP packets
aus, err := rtpDec.Decode(pkt) aus, err2 := rtpDec.Decode(pkt)
if err != nil { if err2 != nil {
log.Printf("ERR: %v", err) log.Printf("ERR: %v", err2)
return return
} }

View File

@@ -1,3 +1,4 @@
// Package main contains an example.
package main package main
import ( import (
@@ -82,16 +83,16 @@ func main() {
} }
// extract Opus packets from RTP packets // extract Opus packets from RTP packets
opkt, err := rtpDec.Decode(pkt) opkt, err2 := rtpDec.Decode(pkt)
if err != nil { if err2 != nil {
log.Printf("ERR: %v", err) log.Printf("ERR: %v", err2)
return return
} }
// encode Opus packets into MPEG-TS // encode Opus packets into MPEG-TS
err = mpegtsMuxer.writeOpus(opkt, pts) err2 = mpegtsMuxer.writeOpus(opkt, pts)
if err != nil { if err2 != nil {
log.Printf("ERR: %v", err) log.Printf("ERR: %v", err2)
return return
} }

View File

@@ -45,7 +45,7 @@ func (e *mpegtsMuxer) initialize() error {
// close closes all the mpegtsMuxer resources. // close closes all the mpegtsMuxer resources.
func (e *mpegtsMuxer) close() { func (e *mpegtsMuxer) close() {
e.b.Flush() e.b.Flush() //nolint:errcheck
e.f.Close() e.f.Close()
} }

View File

@@ -1,3 +1,4 @@
// Package main contains an example.
package main package main
import ( import (
@@ -65,9 +66,9 @@ func main() {
} }
// extract Opus packets from RTP packets // extract Opus packets from RTP packets
op, err := rtpDec.Decode(pkt) op, err2 := rtpDec.Decode(pkt)
if err != nil { if err2 != nil {
log.Printf("ERR: %v", err) log.Printf("ERR: %v", err2)
return return
} }

View File

@@ -1,5 +1,6 @@
//go:build cgo //go:build cgo
// Package main contains an example.
package main package main
import ( import (

View File

@@ -1,5 +1,6 @@
//go:build cgo //go:build cgo
// Package main contains an example.
package main package main
import ( import (

View File

@@ -1,3 +1,4 @@
// Package main contains an example.
package main package main
import ( import (
@@ -53,7 +54,7 @@ func main() {
} }
// called when a RTP packet arrives // 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) log.Printf("RTP packet from media %v\n", medi)
}) })

View File

@@ -1,3 +1,4 @@
// Package main contains an example.
package main package main
import ( import (
@@ -47,7 +48,7 @@ func main() {
} }
// called when a RTP packet arrives // 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) log.Printf("RTP packet from media %v\n", medi)
}) })

View File

@@ -1,3 +1,4 @@
// Package main contains an example.
package main package main
import ( import (
@@ -44,7 +45,7 @@ func main() {
} }
// called when a RTP packet arrives // 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 // get the PTS timestamp of the packet, i.e. timestamp relative to the start of the session
pts, ptsAvailable := c.PacketPTS2(medi, pkt) pts, ptsAvailable := c.PacketPTS2(medi, pkt)
log.Printf("PTS: available=%v, value=%v\n", ptsAvailable, pts) log.Printf("PTS: available=%v, value=%v\n", ptsAvailable, pts)

View File

@@ -1,3 +1,4 @@
// Package main contains an example.
package main package main
import ( import (
@@ -55,8 +56,8 @@ func main() {
defer publisher.Close() defer publisher.Close()
// read RTP packets from the reader and route them to the publisher // read RTP packets from the reader and route them to the publisher
reader.OnPacketRTPAny(func(medi *description.Media, forma format.Format, pkt *rtp.Packet) { reader.OnPacketRTPAny(func(_ *description.Media, _ format.Format, pkt *rtp.Packet) {
publisher.WritePacketRTP(desc.Medias[0], pkt) publisher.WritePacketRTP(desc.Medias[0], pkt) //nolint:errcheck
}) })
// start playing // start playing

View File

@@ -1,3 +1,4 @@
// Package main contains an example.
package main package main
import ( import (
@@ -44,7 +45,7 @@ func main() {
} }
// called when a RTP packet arrives // 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) log.Printf("RTP packet from media %v\n", medi)
}) })

View File

@@ -1,3 +1,4 @@
// Package main contains an example.
package main package main
import ( import (

View File

@@ -1,3 +1,5 @@
//go:build cgo
package main package main
import ( import (

View File

@@ -1,5 +1,6 @@
//go:build cgo //go:build cgo
// Package main contains an example.
package main package main
import ( import (

View File

@@ -1,3 +1,4 @@
// Package main contains an example.
package main package main
import ( import (

View File

@@ -1,3 +1,4 @@
// Package main contains an example.
package main package main
import ( import (

View File

@@ -1,3 +1,5 @@
//go:build cgo
package main package main
import ( import (

View File

@@ -1,5 +1,6 @@
//go:build cgo //go:build cgo
// Package main contains an example.
package main package main
import ( import (

View File

@@ -1,3 +1,5 @@
//go:build cgo
package main package main
import ( import (

View File

@@ -1,5 +1,6 @@
//go:build cgo //go:build cgo
// Package main contains an example.
package main package main
import ( import (

View File

@@ -1,3 +1,4 @@
// Package main contains an example.
package main package main
import ( import (

View File

@@ -1,3 +1,4 @@
// Package main contains an example.
package main package main
import ( import (

View File

@@ -1,3 +1,5 @@
//go:build cgo
package main package main
import "math" import "math"

View File

@@ -1,5 +1,6 @@
//go:build cgo //go:build cgo
// Package main contains an example.
package main package main
import ( import (

View File

@@ -1,3 +1,5 @@
//go:build cgo
package main package main
import "math" import "math"

View File

@@ -1,5 +1,6 @@
//go:build cgo //go:build cgo
// Package main contains an example.
package main package main
import ( import (

View File

@@ -1,3 +1,5 @@
//go:build cgo
package main package main
import ( import (

View File

@@ -1,5 +1,6 @@
//go:build cgo //go:build cgo
// Package main contains an example.
package main package main
import ( import (

View File

@@ -1,3 +1,5 @@
//go:build cgo
package main package main
import ( import (

View File

@@ -1,5 +1,6 @@
//go:build cgo //go:build cgo
// Package main contains an example.
package main package main
import ( import (

View File

@@ -1,3 +1,5 @@
//go:build cgo
package main package main
import ( import (

View File

@@ -1,5 +1,6 @@
//go:build cgo //go:build cgo
// Package main contains an example.
package main package main
import ( import (

View File

@@ -1,3 +1,5 @@
//go:build cgo
package main package main
import ( import (

View File

@@ -1,5 +1,6 @@
//go:build cgo //go:build cgo
// Package main contains an example.
package main package main
import ( import (

View File

@@ -78,7 +78,7 @@ func (c *client) read() error {
} }
writeToClient := func(pkt *rtp.Packet) { writeToClient := func(pkt *rtp.Packet) {
rc.WritePacketRTP(backChannelMedia, pkt) rc.WritePacketRTP(backChannelMedia, pkt) //nolint:errcheck
} }
// setup all medias // 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") log.Printf("stream is ready and can be read from the server at rtsp://localhost:8554/stream\n")
// called when a RTP packet arrives // 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") log.Printf("received RTP packet from the client, routing to readers")
// route incoming packets to the server stream // route incoming packets to the server stream
stream.WritePacketRTP(medi, pkt) stream.WritePacketRTP(medi, pkt) //nolint:errcheck
}) })
// start playing // start playing

View File

@@ -1,3 +1,4 @@
// Package main contains an example.
package main package main
import "log" import "log"

View File

@@ -32,7 +32,7 @@ func (s *server) initialize() {
} }
// called when a connection is opened. // called when a connection is opened.
func (s *server) OnConnOpen(ctx *gortsplib.ServerHandlerOnConnOpenCtx) { func (s *server) OnConnOpen(_ *gortsplib.ServerHandlerOnConnOpenCtx) {
log.Printf("conn opened") log.Printf("conn opened")
} }
@@ -42,17 +42,17 @@ func (s *server) OnConnClose(ctx *gortsplib.ServerHandlerOnConnCloseCtx) {
} }
// called when a session is opened. // called when a session is opened.
func (s *server) OnSessionOpen(ctx *gortsplib.ServerHandlerOnSessionOpenCtx) { func (s *server) OnSessionOpen(_ *gortsplib.ServerHandlerOnSessionOpenCtx) {
log.Printf("session opened") log.Printf("session opened")
} }
// called when a session is closed. // called when a session is closed.
func (s *server) OnSessionClose(ctx *gortsplib.ServerHandlerOnSessionCloseCtx) { func (s *server) OnSessionClose(_ *gortsplib.ServerHandlerOnSessionCloseCtx) {
log.Printf("session closed") log.Printf("session closed")
} }
// called when receiving a DESCRIBE request. // 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") log.Printf("DESCRIBE request")
s.mutex.RLock() s.mutex.RLock()
@@ -71,7 +71,7 @@ func (s *server) OnDescribe(ctx *gortsplib.ServerHandlerOnDescribeCtx) (*base.Re
} }
// called when receiving a SETUP request. // 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") log.Printf("SETUP request")
s.mutex.RLock() 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) { func (s *server) OnPlay(ctx *gortsplib.ServerHandlerOnPlayCtx) (*base.Response, error) {
log.Printf("PLAY request") 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") log.Printf("received RTP packet from readers, routing to the client")
s.writeToClient(pkt) s.writeToClient(pkt)

View File

@@ -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") log.Printf("stream is ready and can be read from the server at rtsp://localhost:8554/stream\n")
// called when a RTP packet arrives // 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 // route incoming packets to the server stream
stream.WritePacketRTP(medi, pkt) stream.WritePacketRTP(medi, pkt) //nolint:errcheck
}) })
// start playing // start playing

View File

@@ -1,3 +1,4 @@
// Package main contains an example.
package main package main
import "log" import "log"

View File

@@ -29,7 +29,7 @@ func (s *server) initialize() {
} }
// called when a connection is opened. // called when a connection is opened.
func (s *server) OnConnOpen(ctx *gortsplib.ServerHandlerOnConnOpenCtx) { func (s *server) OnConnOpen(_ *gortsplib.ServerHandlerOnConnOpenCtx) {
log.Printf("conn opened") log.Printf("conn opened")
} }
@@ -39,17 +39,17 @@ func (s *server) OnConnClose(ctx *gortsplib.ServerHandlerOnConnCloseCtx) {
} }
// called when a session is opened. // called when a session is opened.
func (s *server) OnSessionOpen(ctx *gortsplib.ServerHandlerOnSessionOpenCtx) { func (s *server) OnSessionOpen(_ *gortsplib.ServerHandlerOnSessionOpenCtx) {
log.Printf("session opened") log.Printf("session opened")
} }
// called when a session is closed. // called when a session is closed.
func (s *server) OnSessionClose(ctx *gortsplib.ServerHandlerOnSessionCloseCtx) { func (s *server) OnSessionClose(_ *gortsplib.ServerHandlerOnSessionCloseCtx) {
log.Printf("session closed") log.Printf("session closed")
} }
// called when receiving a DESCRIBE request. // 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") log.Printf("DESCRIBE request")
s.mutex.RLock() s.mutex.RLock()
@@ -68,7 +68,7 @@ func (s *server) OnDescribe(ctx *gortsplib.ServerHandlerOnDescribeCtx) (*base.Re
} }
// called when receiving a SETUP request. // 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") log.Printf("SETUP request")
s.mutex.RLock() s.mutex.RLock()
@@ -87,7 +87,7 @@ func (s *server) OnSetup(ctx *gortsplib.ServerHandlerOnSetupCtx) (*base.Response
} }
// called when receiving a PLAY request. // 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") log.Printf("PLAY request")
return &base.Response{ return &base.Response{

View File

@@ -1,3 +1,4 @@
// Package main contains an example.
package main package main
import ( import (
@@ -36,7 +37,7 @@ type serverHandler struct {
} }
// called when a connection is opened. // called when a connection is opened.
func (sh *serverHandler) OnConnOpen(ctx *gortsplib.ServerHandlerOnConnOpenCtx) { func (sh *serverHandler) OnConnOpen(_ *gortsplib.ServerHandlerOnConnOpenCtx) {
log.Printf("conn opened") log.Printf("conn opened")
} }
@@ -46,7 +47,7 @@ func (sh *serverHandler) OnConnClose(ctx *gortsplib.ServerHandlerOnConnCloseCtx)
} }
// called when a session is opened. // called when a session is opened.
func (sh *serverHandler) OnSessionOpen(ctx *gortsplib.ServerHandlerOnSessionOpenCtx) { func (sh *serverHandler) OnSessionOpen(_ *gortsplib.ServerHandlerOnSessionOpenCtx) {
log.Printf("session opened") log.Printf("session opened")
} }
@@ -66,7 +67,9 @@ func (sh *serverHandler) OnSessionClose(ctx *gortsplib.ServerHandlerOnSessionClo
} }
// called when receiving a DESCRIBE request. // 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") log.Printf("DESCRIBE request")
// Verify reader credentials. // Verify reader credentials.
@@ -133,7 +136,9 @@ func (sh *serverHandler) OnAnnounce(ctx *gortsplib.ServerHandlerOnAnnounceCtx) (
} }
// called when receiving a SETUP request. // 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") log.Printf("SETUP request")
// SETUP is used by both readers and publishers. In case of publishers, just return StatusOK. // 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. // 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") log.Printf("PLAY request")
return &base.Response{ return &base.Response{
@@ -181,9 +186,9 @@ func (sh *serverHandler) OnRecord(ctx *gortsplib.ServerHandlerOnRecordCtx) (*bas
log.Printf("RECORD request") log.Printf("RECORD request")
// called when receiving a RTP packet // 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 // route the RTP packet to all readers
sh.stream.WritePacketRTP(medi, pkt) sh.stream.WritePacketRTP(medi, pkt) //nolint:errcheck
}) })
return &base.Response{ return &base.Response{

View File

@@ -2,14 +2,12 @@ package main
import ( import (
"crypto/rand" "crypto/rand"
"fmt"
"log" "log"
"time" "time"
"github.com/bluenviron/gortsplib/v4" "github.com/bluenviron/gortsplib/v4"
"github.com/bluenviron/gortsplib/v4/pkg/format" "github.com/bluenviron/gortsplib/v4/pkg/format"
"github.com/bluenviron/mediacommon/v2/pkg/codecs/g711" "github.com/bluenviron/mediacommon/v2/pkg/codecs/g711"
"github.com/bluenviron/mediacommon/v2/pkg/formats/mpegts"
) )
func multiplyAndDivide(v, m, d int64) int64 { 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 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 { type audioStreamer struct {
stream *gortsplib.ServerStream stream *gortsplib.ServerStream
} }
@@ -68,7 +57,8 @@ func (r *audioStreamer) run() {
for range ticker.C { for range ticker.C {
// get current timestamp // 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 // generate dummy LPCM audio samples
samples := createDummyAudio(pts, prevPTS) samples := createDummyAudio(pts, prevPTS)
@@ -98,6 +88,5 @@ func (r *audioStreamer) run() {
} }
prevPTS = pts prevPTS = pts
} }
} }

View File

@@ -1,3 +1,4 @@
// Package main contains an example.
package main package main
import ( import (
@@ -23,7 +24,7 @@ type serverHandler struct {
} }
// called when a connection is opened. // called when a connection is opened.
func (sh *serverHandler) OnConnOpen(ctx *gortsplib.ServerHandlerOnConnOpenCtx) { func (sh *serverHandler) OnConnOpen(_ *gortsplib.ServerHandlerOnConnOpenCtx) {
log.Printf("conn opened") log.Printf("conn opened")
} }
@@ -33,17 +34,19 @@ func (sh *serverHandler) OnConnClose(ctx *gortsplib.ServerHandlerOnConnCloseCtx)
} }
// called when a session is opened. // called when a session is opened.
func (sh *serverHandler) OnSessionOpen(ctx *gortsplib.ServerHandlerOnSessionOpenCtx) { func (sh *serverHandler) OnSessionOpen(_ *gortsplib.ServerHandlerOnSessionOpenCtx) {
log.Printf("session opened") log.Printf("session opened")
} }
// called when a session is closed. // called when a session is closed.
func (sh *serverHandler) OnSessionClose(ctx *gortsplib.ServerHandlerOnSessionCloseCtx) { func (sh *serverHandler) OnSessionClose(_ *gortsplib.ServerHandlerOnSessionCloseCtx) {
log.Printf("session closed") log.Printf("session closed")
} }
// called when receiving a DESCRIBE request. // 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") log.Printf("DESCRIBE request")
sh.mutex.RLock() sh.mutex.RLock()
@@ -55,7 +58,9 @@ func (sh *serverHandler) OnDescribe(ctx *gortsplib.ServerHandlerOnDescribeCtx) (
} }
// called when receiving a SETUP request. // 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") log.Printf("SETUP request")
sh.mutex.RLock() sh.mutex.RLock()
@@ -71,7 +76,7 @@ func (sh *serverHandler) OnPlay(ctx *gortsplib.ServerHandlerOnPlayCtx) (*base.Re
log.Printf("PLAY request") log.Printf("PLAY request")
// called when receiving a RTP packet // 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 // decode timestamp
pts, ok := ctx.Session.PacketPTS2(m, pkt) pts, ok := ctx.Session.PacketPTS2(m, pkt)
if !ok { if !ok {

View File

@@ -1,3 +1,4 @@
// Package main contains an example.
package main package main
import ( import (
@@ -22,7 +23,7 @@ type serverHandler struct {
} }
// called when a connection is opened. // called when a connection is opened.
func (sh *serverHandler) OnConnOpen(ctx *gortsplib.ServerHandlerOnConnOpenCtx) { func (sh *serverHandler) OnConnOpen(_ *gortsplib.ServerHandlerOnConnOpenCtx) {
log.Printf("conn opened") log.Printf("conn opened")
} }
@@ -32,17 +33,19 @@ func (sh *serverHandler) OnConnClose(ctx *gortsplib.ServerHandlerOnConnCloseCtx)
} }
// called when a session is opened. // called when a session is opened.
func (sh *serverHandler) OnSessionOpen(ctx *gortsplib.ServerHandlerOnSessionOpenCtx) { func (sh *serverHandler) OnSessionOpen(_ *gortsplib.ServerHandlerOnSessionOpenCtx) {
log.Printf("session opened") log.Printf("session opened")
} }
// called when a session is closed. // called when a session is closed.
func (sh *serverHandler) OnSessionClose(ctx *gortsplib.ServerHandlerOnSessionCloseCtx) { func (sh *serverHandler) OnSessionClose(_ *gortsplib.ServerHandlerOnSessionCloseCtx) {
log.Printf("session closed") log.Printf("session closed")
} }
// called when receiving a DESCRIBE request. // 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") log.Printf("DESCRIBE request")
sh.mutex.RLock() sh.mutex.RLock()
@@ -54,7 +57,9 @@ func (sh *serverHandler) OnDescribe(ctx *gortsplib.ServerHandlerOnDescribeCtx) (
} }
// called when receiving a SETUP request. // 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") log.Printf("SETUP request")
sh.mutex.RLock() sh.mutex.RLock()
@@ -66,7 +71,7 @@ func (sh *serverHandler) OnSetup(ctx *gortsplib.ServerHandlerOnSetupCtx) (*base.
} }
// called when receiving a PLAY request. // 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") log.Printf("PLAY request")
return &base.Response{ return &base.Response{

View File

@@ -1,3 +1,4 @@
// Package main contains an example.
package main package main
import ( import (
@@ -30,7 +31,7 @@ type serverHandler struct {
} }
// called when a connection is opened. // called when a connection is opened.
func (sh *serverHandler) OnConnOpen(ctx *gortsplib.ServerHandlerOnConnOpenCtx) { func (sh *serverHandler) OnConnOpen(_ *gortsplib.ServerHandlerOnConnOpenCtx) {
log.Printf("conn opened") log.Printf("conn opened")
} }
@@ -40,12 +41,12 @@ func (sh *serverHandler) OnConnClose(ctx *gortsplib.ServerHandlerOnConnCloseCtx)
} }
// called when a session is opened. // called when a session is opened.
func (sh *serverHandler) OnSessionOpen(ctx *gortsplib.ServerHandlerOnSessionOpenCtx) { func (sh *serverHandler) OnSessionOpen(_ *gortsplib.ServerHandlerOnSessionOpenCtx) {
log.Printf("session opened") log.Printf("session opened")
} }
// called when a session is closed. // called when a session is closed.
func (sh *serverHandler) OnSessionClose(ctx *gortsplib.ServerHandlerOnSessionCloseCtx) { func (sh *serverHandler) OnSessionClose(_ *gortsplib.ServerHandlerOnSessionCloseCtx) {
log.Printf("session closed") log.Printf("session closed")
sh.mutex.Lock() sh.mutex.Lock()
@@ -107,7 +108,9 @@ func (sh *serverHandler) OnAnnounce(ctx *gortsplib.ServerHandlerOnAnnounceCtx) (
} }
// called when receiving a SETUP request. // 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. // prevent readers from using the server.
if ctx.Session.State() == gortsplib.ServerSessionStateInitial { if ctx.Session.State() == gortsplib.ServerSessionStateInitial {
return &base.Response{ return &base.Response{
@@ -140,7 +143,7 @@ func (sh *serverHandler) OnRecord(ctx *gortsplib.ServerHandlerOnRecordCtx) (*bas
} }
// encode H264 access unit into MPEG-TS // encode H264 access unit into MPEG-TS
sh.mpegtsMuxer.writeH264(au, pts) sh.mpegtsMuxer.writeH264(au, pts) //nolint:errcheck
}) })
return &base.Response{ return &base.Response{

View File

@@ -45,13 +45,13 @@ func (e *mpegtsMuxer) initialize() error {
// close closes all the mpegtsMuxer resources. // close closes all the mpegtsMuxer resources.
func (e *mpegtsMuxer) close() { func (e *mpegtsMuxer) close() {
e.b.Flush() e.b.Flush() //nolint:errcheck
e.f.Close() e.f.Close()
} }
// writeH264 writes a H264 access unit into MPEG-TS. // writeH264 writes a H264 access unit into MPEG-TS.
func (e *mpegtsMuxer) writeH264(au [][]byte, pts int64) error { func (e *mpegtsMuxer) writeH264(au [][]byte, pts int64) error {
var filteredAU [][]byte var filteredAU [][]byte //nolint:prealloc
nonIDRPresent := false nonIDRPresent := false
idrPresent := false idrPresent := false
@@ -96,7 +96,8 @@ func (e *mpegtsMuxer) writeH264(au [][]byte, pts int64) error {
if !idrPresent { if !idrPresent {
return nil return nil
} }
e.dtsExtractor = h264.NewDTSExtractor() e.dtsExtractor = &h264.DTSExtractor{}
e.dtsExtractor.Initialize()
} }
dts, err := e.dtsExtractor.Extract(au, pts) dts, err := e.dtsExtractor.Extract(au, pts)

View File

@@ -1,3 +1,4 @@
// Package main contains an example.
package main package main
import ( import (
@@ -26,7 +27,7 @@ type serverHandler struct {
} }
// called when a connection is opened. // called when a connection is opened.
func (sh *serverHandler) OnConnOpen(ctx *gortsplib.ServerHandlerOnConnOpenCtx) { func (sh *serverHandler) OnConnOpen(_ *gortsplib.ServerHandlerOnConnOpenCtx) {
log.Printf("conn opened") log.Printf("conn opened")
} }
@@ -36,7 +37,7 @@ func (sh *serverHandler) OnConnClose(ctx *gortsplib.ServerHandlerOnConnCloseCtx)
} }
// called when a session is opened. // called when a session is opened.
func (sh *serverHandler) OnSessionOpen(ctx *gortsplib.ServerHandlerOnSessionOpenCtx) { func (sh *serverHandler) OnSessionOpen(_ *gortsplib.ServerHandlerOnSessionOpenCtx) {
log.Printf("session opened") log.Printf("session opened")
} }
@@ -56,7 +57,9 @@ func (sh *serverHandler) OnSessionClose(ctx *gortsplib.ServerHandlerOnSessionClo
} }
// called when receiving a DESCRIBE request. // 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") log.Printf("DESCRIBE request")
sh.mutex.RLock() sh.mutex.RLock()
@@ -105,7 +108,9 @@ func (sh *serverHandler) OnAnnounce(ctx *gortsplib.ServerHandlerOnAnnounceCtx) (
} }
// called when receiving a SETUP request. // 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") log.Printf("SETUP request")
// SETUP is used by both readers and publishers. In case of publishers, just return StatusOK. // 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. // 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") log.Printf("PLAY request")
return &base.Response{ return &base.Response{
@@ -144,9 +149,9 @@ func (sh *serverHandler) OnRecord(ctx *gortsplib.ServerHandlerOnRecordCtx) (*bas
log.Printf("RECORD request") log.Printf("RECORD request")
// called when receiving a RTP packet // 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 // route the RTP packet to all readers
sh.stream.WritePacketRTP(medi, pkt) sh.stream.WritePacketRTP(medi, pkt) //nolint:errcheck
}) })
return &base.Response{ return &base.Response{

View File

@@ -1,3 +1,4 @@
// Package main contains an example.
package main package main
import ( import (
@@ -25,7 +26,7 @@ type serverHandler struct {
} }
// called when a connection is opened. // called when a connection is opened.
func (sh *serverHandler) OnConnOpen(ctx *gortsplib.ServerHandlerOnConnOpenCtx) { func (sh *serverHandler) OnConnOpen(_ *gortsplib.ServerHandlerOnConnOpenCtx) {
log.Printf("conn opened") log.Printf("conn opened")
} }
@@ -35,7 +36,7 @@ func (sh *serverHandler) OnConnClose(ctx *gortsplib.ServerHandlerOnConnCloseCtx)
} }
// called when a session is opened. // called when a session is opened.
func (sh *serverHandler) OnSessionOpen(ctx *gortsplib.ServerHandlerOnSessionOpenCtx) { func (sh *serverHandler) OnSessionOpen(_ *gortsplib.ServerHandlerOnSessionOpenCtx) {
log.Printf("session opened") log.Printf("session opened")
} }
@@ -55,7 +56,9 @@ func (sh *serverHandler) OnSessionClose(ctx *gortsplib.ServerHandlerOnSessionClo
} }
// called when receiving a DESCRIBE request. // 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") log.Printf("DESCRIBE request")
sh.mutex.RLock() sh.mutex.RLock()
@@ -104,7 +107,9 @@ func (sh *serverHandler) OnAnnounce(ctx *gortsplib.ServerHandlerOnAnnounceCtx) (
} }
// called when receiving a SETUP request. // 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") log.Printf("SETUP request")
// SETUP is used by both readers and publishers. In case of publishers, just return StatusOK. // 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. // 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") log.Printf("PLAY request")
return &base.Response{ return &base.Response{
@@ -143,9 +148,9 @@ func (sh *serverHandler) OnRecord(ctx *gortsplib.ServerHandlerOnRecordCtx) (*bas
log.Printf("RECORD request") log.Printf("RECORD request")
// called when receiving a RTP packet // 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 // route the RTP packet to all readers
sh.stream.WritePacketRTP(medi, pkt) sh.stream.WritePacketRTP(medi, pkt) //nolint:errcheck
}) })
return &base.Response{ return &base.Response{

View File

@@ -81,11 +81,7 @@ func (e *Encoder) Encode(image []byte) ([]*rtp.Packet, error) {
var data []byte var data []byte
outer: outer:
for { for len(image) >= 2 {
if len(image) < 2 {
break
}
h0, h1 := image[0], image[1] h0, h1 := image[0], image[1]
image = image[2:] image = image[2:]

View File

@@ -72,13 +72,13 @@ func (d *Decoder) decodeSlice(pkt *rtp.Packet) ([]byte, error) {
an := pkt.Payload[2] >> 7 an := pkt.Payload[2] >> 7
if an != 0 { if an != 0 {
d.resetFragments() d.resetFragments()
return nil, fmt.Errorf("AN not supported yet") return nil, fmt.Errorf("'AN' not supported yet")
} }
n := (pkt.Payload[2] >> 6) & 0x01 n := (pkt.Payload[2] >> 6) & 0x01
if n != 0 { if n != 0 {
d.resetFragments() d.resetFragments()
return nil, fmt.Errorf("N not supported yet") return nil, fmt.Errorf("'N' not supported yet")
} }
b := (pkt.Payload[2] >> 4) & 0x01 b := (pkt.Payload[2] >> 4) & 0x01

View File

@@ -6,11 +6,7 @@ import (
func readKey(str string, separator byte) (string, string) { func readKey(str string, separator byte) (string, string) {
i := 0 i := 0
for { for i < len(str) && str[i] != '=' && str[i] != separator {
if i >= len(str) || str[i] == '=' || str[i] == separator {
break
}
i++ i++
} }
return str[:i], str[i:] return str[:i], str[i:]