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:
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

View File

@@ -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

View File

@@ -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)

View File

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

View File

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

View File

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

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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)
}

View File

@@ -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
}

View File

@@ -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)

View File

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

View File

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

View File

@@ -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
}

View File

@@ -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)

View File

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

View File

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

View File

@@ -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
}

View File

@@ -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)

View File

@@ -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
}

View File

@@ -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()
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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()
}

View File

@@ -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
}

View File

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

View File

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

View File

@@ -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)
})

View File

@@ -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)
})

View File

@@ -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)

View File

@@ -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

View File

@@ -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)
})

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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

View File

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

View File

@@ -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)

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")
// 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

View File

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

View File

@@ -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{

View File

@@ -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{

View File

@@ -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
}
}

View File

@@ -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 {

View File

@@ -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{

View File

@@ -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{

View File

@@ -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)

View File

@@ -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{

View File

@@ -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{

View File

@@ -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:]

View File

@@ -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

View File

@@ -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:]