Browse Source

enable errcheck (#2201)

pull/2204/head
Alessandro Ros 2 years ago committed by GitHub
parent
commit
659f19f8bb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 40
      .golangci.yml
  2. 6
      internal/conf/conf.go
  3. 3
      internal/conf/env/env.go
  4. 4
      internal/confwatcher/confwatcher.go
  5. 4
      internal/core/api.go
  6. 27
      internal/core/api_test.go
  7. 2
      internal/core/core.go
  8. 2
      internal/core/hls_http_server.go
  9. 3
      internal/core/hls_manager_test.go
  10. 8
      internal/core/hls_source_test.go
  11. 4
      internal/core/metrics.go
  12. 36
      internal/core/rtmp_conn.go
  13. 22
      internal/core/rtmp_listener.go
  14. 6
      internal/core/rtsp_source_test.go
  15. 42
      internal/core/srt_listener.go
  16. 8
      internal/core/srt_server_test.go
  17. 8
      internal/core/srt_source_test.go
  18. 8
      internal/core/udp_source_test.go
  19. 2
      internal/core/webrtc_http_server.go
  20. 5
      internal/core/webrtc_manager_test.go
  21. 34
      internal/core/webrtc_outgoing_track.go
  22. 2
      internal/externalcmd/cmd_unix.go
  23. 3
      internal/formatprocessor/generic_test.go
  24. 22
      internal/formatprocessor/h264_test.go
  25. 26
      internal/formatprocessor/h265_test.go
  26. 2
      internal/httpserv/handler_logger.go
  27. 2
      internal/logger/destination_file.go
  28. 2
      internal/logger/destination_stdout.go
  29. 3
      internal/rtmp/bytecounter/writer_test.go
  30. 2
      internal/rtmp/conn_test.go
  31. 5
      internal/rtmp/message/readwriter.go
  32. 2
      internal/rtmp/rawmessage/reader.go
  33. 2
      internal/webrtcpc/pc.go
  34. 12
      internal/websocket/serverconn.go
  35. 5
      internal/websocket/serverconn_test.go
  36. 2
      internal/whip/link_header.go

40
.golangci.yml

@ -15,13 +15,49 @@ linters:
- unconvert - unconvert
- wastedassign - wastedassign
- whitespace - whitespace
disable:
- errcheck
issues: issues:
exclude-use-default: false exclude-use-default: false
linters-settings: 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/v3.Client).Close
- (*github.com/bluenviron/gortsplib/v3.Server).Close
- (*github.com/bluenviron/gortsplib/v3.ServerSession).Close
- (*github.com/bluenviron/gortsplib/v3.ServerStream).Close
- (*github.com/bluenviron/gortsplib/v3.ServerConn).Close
govet: govet:
enable-all: true enable-all: true
disable: disable:

6
internal/conf/conf.go

@ -45,7 +45,8 @@ func loadFromFile(fpath string, conf *Conf) (bool, error) {
// other configuration files are not // other configuration files are not
if fpath == "mediamtx.yml" || fpath == "rtsp-simple-server.yml" { if fpath == "mediamtx.yml" || fpath == "rtsp-simple-server.yml" {
if _, err := os.Stat(fpath); errors.Is(err, os.ErrNotExist) { if _, err := os.Stat(fpath); errors.Is(err, os.ErrNotExist) {
conf.UnmarshalJSON(nil) // load defaults // load defaults
conf.UnmarshalJSON(nil) //nolint:errcheck
return false, nil return false, nil
} }
} }
@ -294,7 +295,8 @@ func (conf *Conf) Check() error {
pconf := conf.Paths[name] pconf := conf.Paths[name]
if pconf == nil { if pconf == nil {
pconf = &PathConf{} pconf = &PathConf{}
pconf.UnmarshalJSON(nil) // fill defaults // load defaults
pconf.UnmarshalJSON(nil) //nolint:errcheck
conf.Paths[name] = pconf conf.Paths[name] = pconf
} }

3
internal/conf/env/env.go vendored

@ -117,7 +117,8 @@ func loadEnvInternal(env map[string]string, prefix string, rv reflect.Value) err
if nv == zero { if nv == zero {
nv = reflect.New(rt.Elem().Elem()) nv = reflect.New(rt.Elem().Elem())
if unm, ok := nv.Interface().(json.Unmarshaler); ok { if unm, ok := nv.Interface().(json.Unmarshaler); ok {
unm.UnmarshalJSON(nil) // load defaults // load defaults
unm.UnmarshalJSON(nil) //nolint:errcheck
} }
rv.SetMapIndex(reflect.ValueOf(mapKeyLower), nv) rv.SetMapIndex(reflect.ValueOf(mapKeyLower), nv)
} }

4
internal/confwatcher/confwatcher.go

@ -51,7 +51,7 @@ func New(confPath string) (*ConfWatcher, error) {
err = inner.Add(parentPath) err = inner.Add(parentPath)
if err != nil { if err != nil {
inner.Close() inner.Close() //nolint:errcheck
return nil, err return nil, err
} }
@ -120,7 +120,7 @@ outer:
} }
close(w.signal) close(w.signal)
w.inner.Close() w.inner.Close() //nolint:errcheck
} }
// Watch returns a channel that is called after the configuration file has changed. // Watch returns a channel that is called after the configuration file has changed.

4
internal/core/api.go

@ -236,7 +236,7 @@ func newAPI(
} }
router := gin.New() router := gin.New()
router.SetTrustedProxies(nil) router.SetTrustedProxies(nil) //nolint:errcheck
group := router.Group("/") group := router.Group("/")
@ -387,7 +387,7 @@ func (a *api) onConfigPathsAdd(ctx *gin.Context) {
newConfPath := &conf.PathConf{} newConfPath := &conf.PathConf{}
// load default values // load default values
newConfPath.UnmarshalJSON([]byte("{}")) newConfPath.UnmarshalJSON([]byte("{}")) //nolint:errcheck
fillStruct(newConfPath, in) fillStruct(newConfPath, in)

27
internal/core/api_test.go

@ -265,13 +265,14 @@ func TestAPIPathsList(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
defer source.Close() defer source.Close()
source.WritePacketRTP(media0, &rtp.Packet{ err = source.WritePacketRTP(media0, &rtp.Packet{
Header: rtp.Header{ Header: rtp.Header{
Version: 2, Version: 2,
PayloadType: 96, PayloadType: 96,
}, },
Payload: []byte{0x01, 0x02, 0x03, 0x04}, Payload: []byte{0x01, 0x02, 0x03, 0x04},
}) })
require.NoError(t, err)
var out pathList var out pathList
httpRequest(t, hc, http.MethodGet, "http://localhost:9997/v2/paths/list", nil, &out) httpRequest(t, hc, http.MethodGet, "http://localhost:9997/v2/paths/list", nil, &out)
@ -618,7 +619,7 @@ func TestAPIProtocolList(t *testing.T) {
0x00, 0x00, 0x03, 0x00, 0xf0, 0x3c, 0x60, 0xc9, 0x20, 0x00, 0x00, 0x03, 0x00, 0xf0, 0x3c, 0x60, 0xc9, 0x20,
},*/ },*/
source.WritePacketRTP(medi, &rtp.Packet{ err = source.WritePacketRTP(medi, &rtp.Packet{
Header: rtp.Header{ Header: rtp.Header{
Version: 2, Version: 2,
Marker: true, Marker: true,
@ -632,6 +633,7 @@ func TestAPIProtocolList(t *testing.T) {
0x05, 0x05,
}, },
}) })
require.NoError(t, err)
} }
}() }()
@ -654,7 +656,7 @@ func TestAPIProtocolList(t *testing.T) {
time.Sleep(500 * time.Millisecond) time.Sleep(500 * time.Millisecond)
source.WritePacketRTP(medi, &rtp.Packet{ err = source.WritePacketRTP(medi, &rtp.Packet{
Header: rtp.Header{ Header: rtp.Header{
Version: 2, Version: 2,
Marker: true, Marker: true,
@ -665,6 +667,7 @@ func TestAPIProtocolList(t *testing.T) {
}, },
Payload: []byte{0x01, 0x02, 0x03, 0x04}, Payload: []byte{0x01, 0x02, 0x03, 0x04},
}) })
require.NoError(t, err)
<-c.incomingTrack <-c.incomingTrack
@ -686,7 +689,9 @@ func TestAPIProtocolList(t *testing.T) {
err = w.WriteH26x(track, 0, 0, true, [][]byte{{1}}) err = w.WriteH26x(track, 0, 0, true, [][]byte{{1}})
require.NoError(t, err) require.NoError(t, err)
bw.Flush()
err = bw.Flush()
require.NoError(t, err)
time.Sleep(500 * time.Millisecond) time.Sleep(500 * time.Millisecond)
} }
@ -898,7 +903,7 @@ func TestAPIProtocolGet(t *testing.T) {
0x00, 0x00, 0x03, 0x00, 0xf0, 0x3c, 0x60, 0xc9, 0x20, 0x00, 0x00, 0x03, 0x00, 0xf0, 0x3c, 0x60, 0xc9, 0x20,
},*/ },*/
source.WritePacketRTP(medi, &rtp.Packet{ err := source.WritePacketRTP(medi, &rtp.Packet{
Header: rtp.Header{ Header: rtp.Header{
Version: 2, Version: 2,
Marker: true, Marker: true,
@ -912,6 +917,7 @@ func TestAPIProtocolGet(t *testing.T) {
0x05, 0x05,
}, },
}) })
require.NoError(t, err)
} }
}() }()
@ -934,7 +940,7 @@ func TestAPIProtocolGet(t *testing.T) {
time.Sleep(500 * time.Millisecond) time.Sleep(500 * time.Millisecond)
source.WritePacketRTP(medi, &rtp.Packet{ err = source.WritePacketRTP(medi, &rtp.Packet{
Header: rtp.Header{ Header: rtp.Header{
Version: 2, Version: 2,
Marker: true, Marker: true,
@ -945,6 +951,7 @@ func TestAPIProtocolGet(t *testing.T) {
}, },
Payload: []byte{0x01, 0x02, 0x03, 0x04}, Payload: []byte{0x01, 0x02, 0x03, 0x04},
}) })
require.NoError(t, err)
<-c.incomingTrack <-c.incomingTrack
@ -966,7 +973,9 @@ func TestAPIProtocolGet(t *testing.T) {
err = w.WriteH26x(track, 0, 0, true, [][]byte{{1}}) err = w.WriteH26x(track, 0, 0, true, [][]byte{{1}})
require.NoError(t, err) require.NoError(t, err)
bw.Flush()
err = bw.Flush()
require.NoError(t, err)
time.Sleep(500 * time.Millisecond) time.Sleep(500 * time.Millisecond)
} }
@ -1237,9 +1246,9 @@ func TestAPIProtocolKick(t *testing.T) {
err = w.WriteH26x(track, 0, 0, true, [][]byte{{1}}) err = w.WriteH26x(track, 0, 0, true, [][]byte{{1}})
require.NoError(t, err) require.NoError(t, err)
bw.Flush()
// time.Sleep(500 * time.Millisecond) err = bw.Flush()
require.NoError(t, err)
} }
var pa string var pa string

2
internal/core/core.go

@ -206,7 +206,7 @@ func (p *Core) createResources(initial bool) error {
// on Linux, try to raise the number of file descriptors that can be opened // on Linux, try to raise the number of file descriptors that can be opened
// to allow the maximum possible number of clients // to allow the maximum possible number of clients
// do not check for errors // do not check for errors
rlimit.Raise() rlimit.Raise() //nolint:errcheck
gin.SetMode(gin.ReleaseMode) gin.SetMode(gin.ReleaseMode)

2
internal/core/hls_http_server.go

@ -63,7 +63,7 @@ func newHLSHTTPServer( //nolint:dupl
} }
router := gin.New() router := gin.New()
router.SetTrustedProxies(trustedProxies.ToTrustedProxies()) router.SetTrustedProxies(trustedProxies.ToTrustedProxies()) //nolint:errcheck
router.NoRoute(s.onRequest) router.NoRoute(s.onRequest)

3
internal/core/hls_manager_test.go

@ -143,7 +143,7 @@ func TestHLSRead(t *testing.T) {
time.Sleep(500 * time.Millisecond) time.Sleep(500 * time.Millisecond)
for i := 0; i < 2; i++ { for i := 0; i < 2; i++ {
source.WritePacketRTP(medi, &rtp.Packet{ err = source.WritePacketRTP(medi, &rtp.Packet{
Header: rtp.Header{ Header: rtp.Header{
Version: 2, Version: 2,
Marker: true, Marker: true,
@ -156,6 +156,7 @@ func TestHLSRead(t *testing.T) {
0x05, 0x02, 0x03, 0x04, // IDR 0x05, 0x02, 0x03, 0x04, // IDR
}, },
}) })
require.NoError(t, err)
} }
hc := &http.Client{Transport: &http.Transport{}} hc := &http.Client{Transport: &http.Transport{}}

8
internal/core/hls_source_test.go

@ -87,7 +87,7 @@ func (ts *testHLSManager) onSegment1(ctx *gin.Context) {
w := mpegts.NewWriter(ctx.Writer, []*mpegts.Track{track1, track2}) w := mpegts.NewWriter(ctx.Writer, []*mpegts.Track{track1, track2})
w.WriteMPEG4Audio(track2, 1*90000, [][]byte{{1, 2, 3, 4}}) w.WriteMPEG4Audio(track2, 1*90000, [][]byte{{1, 2, 3, 4}}) //nolint:errcheck
} }
func (ts *testHLSManager) onSegment2(ctx *gin.Context) { func (ts *testHLSManager) onSegment2(ctx *gin.Context) {
@ -97,14 +97,14 @@ func (ts *testHLSManager) onSegment2(ctx *gin.Context) {
w := mpegts.NewWriter(ctx.Writer, []*mpegts.Track{track1, track2}) w := mpegts.NewWriter(ctx.Writer, []*mpegts.Track{track1, track2})
w.WriteH26x(track1, 2*90000, 2*90000, true, [][]byte{ w.WriteH26x(track1, 2*90000, 2*90000, true, [][]byte{ //nolint:errcheck
{7, 1, 2, 3}, // SPS {7, 1, 2, 3}, // SPS
{8}, // PPS {8}, // PPS
}) })
w.WriteMPEG4Audio(track2, 2*90000, [][]byte{{1, 2, 3, 4}}) w.WriteMPEG4Audio(track2, 2*90000, [][]byte{{1, 2, 3, 4}}) //nolint:errcheck
w.WriteH26x(track1, 2*90000, 2*90000, true, [][]byte{ w.WriteH26x(track1, 2*90000, 2*90000, true, [][]byte{ //nolint:errcheck
{5}, // IDR {5}, // IDR
}) })
} }

4
internal/core/metrics.go

@ -45,7 +45,7 @@ func newMetrics(
} }
router := gin.New() router := gin.New()
router.SetTrustedProxies(nil) router.SetTrustedProxies(nil) //nolint:errcheck
router.GET("/metrics", m.onMetrics) router.GET("/metrics", m.onMetrics)
@ -215,7 +215,7 @@ func (m *metrics) onMetrics(ctx *gin.Context) {
} }
ctx.Writer.WriteHeader(http.StatusOK) ctx.Writer.WriteHeader(http.StatusOK)
io.WriteString(ctx.Writer, out) io.WriteString(ctx.Writer, out) //nolint:errcheck
} }
// pathManagerSet is called by pathManager. // pathManagerSet is called by pathManager.

36
internal/core/rtmp_conn.go

@ -164,23 +164,7 @@ func (c *rtmpConn) run() {
}() }()
} }
err := func() error { err := c.runInner()
readerErr := make(chan error)
go func() {
readerErr <- c.runReader()
}()
select {
case err := <-readerErr:
c.nconn.Close()
return err
case <-c.ctx.Done():
c.nconn.Close()
<-readerErr
return errors.New("terminated")
}
}()
c.ctxCancel() c.ctxCancel()
@ -189,6 +173,24 @@ func (c *rtmpConn) run() {
c.Log(logger.Info, "closed (%v)", err) c.Log(logger.Info, "closed (%v)", err)
} }
func (c *rtmpConn) runInner() error {
readerErr := make(chan error)
go func() {
readerErr <- c.runReader()
}()
select {
case err := <-readerErr:
c.nconn.Close()
return err
case <-c.ctx.Done():
c.nconn.Close()
<-readerErr
return errors.New("terminated")
}
}
func (c *rtmpConn) runReader() error { func (c *rtmpConn) runReader() error {
c.nconn.SetReadDeadline(time.Now().Add(time.Duration(c.readTimeout))) c.nconn.SetReadDeadline(time.Now().Add(time.Duration(c.readTimeout)))
c.nconn.SetWriteDeadline(time.Now().Add(time.Duration(c.writeTimeout))) c.nconn.SetWriteDeadline(time.Now().Add(time.Duration(c.writeTimeout)))

22
internal/core/rtmp_listener.go

@ -31,16 +31,18 @@ func newRTMPListener(
func (l *rtmpListener) run() { func (l *rtmpListener) run() {
defer l.wg.Done() defer l.wg.Done()
err := func() error { err := l.runInner()
for {
conn, err := l.ln.Accept()
if err != nil {
return err
}
l.parent.newConn(conn)
}
}()
l.parent.acceptError(err) l.parent.acceptError(err)
} }
func (l *rtmpListener) runInner() error {
for {
conn, err := l.ln.Accept()
if err != nil {
return err
}
l.parent.newConn(conn)
}
}

6
internal/core/rtsp_source_test.go

@ -117,7 +117,7 @@ func TestRTSPSource(t *testing.T) {
err = s.Start() err = s.Start()
require.NoError(t, err) require.NoError(t, err)
defer s.Wait() defer s.Wait() //nolint:errcheck
defer s.Close() defer s.Close()
if source == "udp" || source == "tcp" { if source == "udp" || source == "tcp" {
@ -212,7 +212,7 @@ func TestRTSPSourceNoPassword(t *testing.T) {
} }
err = s.Start() err = s.Start()
require.NoError(t, err) require.NoError(t, err)
defer s.Wait() defer s.Wait() //nolint:errcheck
defer s.Close() defer s.Close()
p, ok := newInstance("rtmp: no\n" + p, ok := newInstance("rtmp: no\n" +
@ -268,7 +268,7 @@ func TestRTSPSourceRange(t *testing.T) {
} }
err := s.Start() err := s.Start()
require.NoError(t, err) require.NoError(t, err)
defer s.Wait() defer s.Wait() //nolint:errcheck
defer s.Close() defer s.Close()
var addConf string var addConf string

42
internal/core/srt_listener.go

@ -32,29 +32,31 @@ func newSRTListener(
func (l *srtListener) run() { func (l *srtListener) run() {
defer l.wg.Done() defer l.wg.Done()
err := func() error { err := l.runInner()
for {
var sconn *srtConn l.parent.acceptError(err)
conn, _, err := l.ln.Accept(func(req srt.ConnRequest) srt.ConnType { }
sconn = l.parent.newConnRequest(req)
if sconn == nil {
return srt.REJECT
}
// currently it's the same to return SUBSCRIBE or PUBLISH
return srt.SUBSCRIBE
})
if err != nil {
return err
}
if conn == nil { func (l *srtListener) runInner() error {
continue for {
var sconn *srtConn
conn, _, err := l.ln.Accept(func(req srt.ConnRequest) srt.ConnType {
sconn = l.parent.newConnRequest(req)
if sconn == nil {
return srt.REJECT
} }
sconn.setConn(conn) // currently it's the same to return SUBSCRIBE or PUBLISH
return srt.SUBSCRIBE
})
if err != nil {
return err
} }
}()
l.parent.acceptError(err) if conn == nil {
continue
}
sconn.setConn(conn)
}
} }

8
internal/core/srt_server_test.go

@ -50,7 +50,9 @@ func TestSRTServer(t *testing.T) {
}, },
}) })
require.NoError(t, err) require.NoError(t, err)
bw.Flush()
err = bw.Flush()
require.NoError(t, err)
time.Sleep(500 * time.Millisecond) time.Sleep(500 * time.Millisecond)
@ -71,7 +73,9 @@ func TestSRTServer(t *testing.T) {
}, },
}) })
require.NoError(t, err) require.NoError(t, err)
bw.Flush()
err = bw.Flush()
require.NoError(t, err)
r, err := mpegts.NewReader(reader) r, err := mpegts.NewReader(reader)
require.NoError(t, err) require.NoError(t, err)

8
internal/core/srt_source_test.go

@ -51,13 +51,17 @@ func TestSRTSource(t *testing.T) {
}, },
}) })
require.NoError(t, err) require.NoError(t, err)
bw.Flush()
err = bw.Flush()
require.NoError(t, err)
<-connected <-connected
err = w.WriteH26x(track, 0, 0, true, [][]byte{{5, 2}}) err = w.WriteH26x(track, 0, 0, true, [][]byte{{5, 2}})
require.NoError(t, err) require.NoError(t, err)
bw.Flush()
err = bw.Flush()
require.NoError(t, err)
<-done <-done
}() }()

8
internal/core/udp_source_test.go

@ -55,13 +55,17 @@ func TestUDPSource(t *testing.T) {
}, },
}) })
require.NoError(t, err) require.NoError(t, err)
bw.Flush()
err = bw.Flush()
require.NoError(t, err)
<-connected <-connected
err = w.WriteH26x(track, 0, 0, true, [][]byte{{5, 2}}) err = w.WriteH26x(track, 0, 0, true, [][]byte{{5, 2}})
require.NoError(t, err) require.NoError(t, err)
bw.Flush()
err = bw.Flush()
require.NoError(t, err)
}() }()
medias, baseURL, _, err := c.Describe(u) medias, baseURL, _, err := c.Describe(u)

2
internal/core/webrtc_http_server.go

@ -67,7 +67,7 @@ func newWebRTCHTTPServer( //nolint:dupl
} }
router := gin.New() router := gin.New()
router.SetTrustedProxies(trustedProxies.ToTrustedProxies()) router.SetTrustedProxies(trustedProxies.ToTrustedProxies()) //nolint:errcheck
router.NoRoute(s.onRequest) router.NoRoute(s.onRequest)
network, address := restrictNetwork("tcp", address) network, address := restrictNetwork("tcp", address)

5
internal/core/webrtc_manager_test.go

@ -242,7 +242,7 @@ func TestWebRTCRead(t *testing.T) {
time.Sleep(500 * time.Millisecond) time.Sleep(500 * time.Millisecond)
source.WritePacketRTP(medi, &rtp.Packet{ err = source.WritePacketRTP(medi, &rtp.Packet{
Header: rtp.Header{ Header: rtp.Header{
Version: 2, Version: 2,
Marker: true, Marker: true,
@ -253,6 +253,7 @@ func TestWebRTCRead(t *testing.T) {
}, },
Payload: []byte{3}, Payload: []byte{3},
}) })
require.NoError(t, err)
trak := <-c.incomingTrack trak := <-c.incomingTrack
@ -289,7 +290,7 @@ func TestWebRTCReadNotFound(t *testing.T) {
ICEServers: iceServers, ICEServers: iceServers,
}) })
require.NoError(t, err) require.NoError(t, err)
defer pc.Close() defer pc.Close() //nolint:errcheck
_, err = pc.AddTransceiverFromKind(webrtc.RTPCodecTypeVideo) _, err = pc.AddTransceiverFromKind(webrtc.RTPCodecTypeVideo)
require.NoError(t, err) require.NoError(t, err)

34
internal/core/webrtc_outgoing_track.go

@ -47,7 +47,10 @@ func newWebRTCOutgoingTrackVideo(medias media.Medias) (*webRTCOutgoingTrack, err
PayloadType: 105, PayloadType: 105,
PayloadMaxSize: webrtcPayloadMaxSize, PayloadMaxSize: webrtcPayloadMaxSize,
} }
encoder.Init() err = encoder.Init()
if err != nil {
return nil, err
}
return &webRTCOutgoingTrack{ return &webRTCOutgoingTrack{
media: videoMedia, media: videoMedia,
@ -66,7 +69,7 @@ func newWebRTCOutgoingTrackVideo(medias media.Medias) (*webRTCOutgoingTrack, err
} }
for _, pkt := range packets { for _, pkt := range packets {
webRTCTrak.WriteRTP(pkt) webRTCTrak.WriteRTP(pkt) //nolint:errcheck
} }
return nil return nil
@ -94,7 +97,10 @@ func newWebRTCOutgoingTrackVideo(medias media.Medias) (*webRTCOutgoingTrack, err
PayloadType: 96, PayloadType: 96,
PayloadMaxSize: webrtcPayloadMaxSize, PayloadMaxSize: webrtcPayloadMaxSize,
} }
encoder.Init() err = encoder.Init()
if err != nil {
return nil, err
}
return &webRTCOutgoingTrack{ return &webRTCOutgoingTrack{
media: videoMedia, media: videoMedia,
@ -113,7 +119,7 @@ func newWebRTCOutgoingTrackVideo(medias media.Medias) (*webRTCOutgoingTrack, err
} }
for _, pkt := range packets { for _, pkt := range packets {
webRTCTrak.WriteRTP(pkt) webRTCTrak.WriteRTP(pkt) //nolint:errcheck
} }
return nil return nil
@ -141,7 +147,10 @@ func newWebRTCOutgoingTrackVideo(medias media.Medias) (*webRTCOutgoingTrack, err
PayloadType: 96, PayloadType: 96,
PayloadMaxSize: webrtcPayloadMaxSize, PayloadMaxSize: webrtcPayloadMaxSize,
} }
encoder.Init() err = encoder.Init()
if err != nil {
return nil, err
}
return &webRTCOutgoingTrack{ return &webRTCOutgoingTrack{
media: videoMedia, media: videoMedia,
@ -160,7 +169,7 @@ func newWebRTCOutgoingTrackVideo(medias media.Medias) (*webRTCOutgoingTrack, err
} }
for _, pkt := range packets { for _, pkt := range packets {
webRTCTrak.WriteRTP(pkt) webRTCTrak.WriteRTP(pkt) //nolint:errcheck
} }
return nil return nil
@ -188,7 +197,10 @@ func newWebRTCOutgoingTrackVideo(medias media.Medias) (*webRTCOutgoingTrack, err
PayloadType: 96, PayloadType: 96,
PayloadMaxSize: webrtcPayloadMaxSize, PayloadMaxSize: webrtcPayloadMaxSize,
} }
encoder.Init() err = encoder.Init()
if err != nil {
return nil, err
}
var lastPTS time.Duration var lastPTS time.Duration
firstNALUReceived := false firstNALUReceived := false
@ -220,7 +232,7 @@ func newWebRTCOutgoingTrackVideo(medias media.Medias) (*webRTCOutgoingTrack, err
} }
for _, pkt := range packets { for _, pkt := range packets {
webRTCTrak.WriteRTP(pkt) webRTCTrak.WriteRTP(pkt) //nolint:errcheck
} }
return nil return nil
@ -255,7 +267,7 @@ func newWebRTCOutgoingTrackAudio(medias media.Medias) (*webRTCOutgoingTrack, err
track: webRTCTrak, track: webRTCTrak,
cb: func(unit formatprocessor.Unit) error { cb: func(unit formatprocessor.Unit) error {
for _, pkt := range unit.GetRTPPackets() { for _, pkt := range unit.GetRTPPackets() {
webRTCTrak.WriteRTP(pkt) webRTCTrak.WriteRTP(pkt) //nolint:errcheck
} }
return nil return nil
@ -285,7 +297,7 @@ func newWebRTCOutgoingTrackAudio(medias media.Medias) (*webRTCOutgoingTrack, err
track: webRTCTrak, track: webRTCTrak,
cb: func(unit formatprocessor.Unit) error { cb: func(unit formatprocessor.Unit) error {
for _, pkt := range unit.GetRTPPackets() { for _, pkt := range unit.GetRTPPackets() {
webRTCTrak.WriteRTP(pkt) webRTCTrak.WriteRTP(pkt) //nolint:errcheck
} }
return nil return nil
@ -322,7 +334,7 @@ func newWebRTCOutgoingTrackAudio(medias media.Medias) (*webRTCOutgoingTrack, err
track: webRTCTrak, track: webRTCTrak,
cb: func(unit formatprocessor.Unit) error { cb: func(unit formatprocessor.Unit) error {
for _, pkt := range unit.GetRTPPackets() { for _, pkt := range unit.GetRTPPackets() {
webRTCTrak.WriteRTP(pkt) webRTCTrak.WriteRTP(pkt) //nolint:errcheck
} }
return nil return nil

2
internal/externalcmd/cmd_unix.go

@ -50,7 +50,7 @@ func (e *Cmd) runOSSpecific() error {
select { select {
case <-e.terminate: case <-e.terminate:
syscall.Kill(cmd.Process.Pid, syscall.SIGINT) syscall.Kill(cmd.Process.Pid, syscall.SIGINT) //nolint:errcheck
<-cmdDone <-cmdDone
return errTerminated return errTerminated

3
internal/formatprocessor/generic_test.go

@ -13,7 +13,8 @@ func TestGenericRemovePadding(t *testing.T) {
PayloadTyp: 96, PayloadTyp: 96,
RTPMa: "private/90000", RTPMa: "private/90000",
} }
forma.Init() err := forma.Init()
require.NoError(t, err)
p, err := New(1472, forma, false, nil) p, err := New(1472, forma, false, nil)
require.NoError(t, err) require.NoError(t, err)

22
internal/formatprocessor/h264_test.go

@ -30,7 +30,8 @@ func TestH264DynamicParams(t *testing.T) {
RTPPackets: []*rtp.Packet{pkts[0]}, RTPPackets: []*rtp.Packet{pkts[0]},
}, },
} }
p.Process(data, true) err = p.Process(data, true)
require.NoError(t, err)
require.Equal(t, [][]byte{ require.Equal(t, [][]byte{
{byte(h264.NALUTypeIDR)}, {byte(h264.NALUTypeIDR)},
@ -38,31 +39,37 @@ func TestH264DynamicParams(t *testing.T) {
pkts, err = enc.Encode([][]byte{{7, 4, 5, 6}}, 0) // SPS pkts, err = enc.Encode([][]byte{{7, 4, 5, 6}}, 0) // SPS
require.NoError(t, err) require.NoError(t, err)
p.Process(&UnitH264{
err = p.Process(&UnitH264{
BaseUnit: BaseUnit{ BaseUnit: BaseUnit{
RTPPackets: []*rtp.Packet{pkts[0]}, RTPPackets: []*rtp.Packet{pkts[0]},
}, },
}, false) }, false)
require.NoError(t, err)
pkts, err = enc.Encode([][]byte{{8, 1}}, 0) // PPS pkts, err = enc.Encode([][]byte{{8, 1}}, 0) // PPS
require.NoError(t, err) require.NoError(t, err)
p.Process(&UnitH264{
err = p.Process(&UnitH264{
BaseUnit: BaseUnit{ BaseUnit: BaseUnit{
RTPPackets: []*rtp.Packet{pkts[0]}, RTPPackets: []*rtp.Packet{pkts[0]},
}, },
}, false) }, false)
require.NoError(t, err)
require.Equal(t, []byte{7, 4, 5, 6}, forma.SPS) require.Equal(t, []byte{7, 4, 5, 6}, forma.SPS)
require.Equal(t, []byte{8, 1}, forma.PPS) require.Equal(t, []byte{8, 1}, forma.PPS)
pkts, err = enc.Encode([][]byte{{byte(h264.NALUTypeIDR)}}, 0) pkts, err = enc.Encode([][]byte{{byte(h264.NALUTypeIDR)}}, 0)
require.NoError(t, err) require.NoError(t, err)
data = &UnitH264{ data = &UnitH264{
BaseUnit: BaseUnit{ BaseUnit: BaseUnit{
RTPPackets: []*rtp.Packet{pkts[0]}, RTPPackets: []*rtp.Packet{pkts[0]},
}, },
} }
p.Process(data, true) err = p.Process(data, true)
require.NoError(t, err)
require.Equal(t, [][]byte{ require.Equal(t, [][]byte{
{0x07, 4, 5, 6}, {0x07, 4, 5, 6},
@ -127,7 +134,9 @@ func TestH264OversizedPackets(t *testing.T) {
RTPPackets: []*rtp.Packet{pkt}, RTPPackets: []*rtp.Packet{pkt},
}, },
} }
p.Process(data, false) err := p.Process(data, false)
require.NoError(t, err)
out = append(out, data.RTPPackets...) out = append(out, data.RTPPackets...)
} }
@ -190,7 +199,8 @@ func TestH264EmptyPacket(t *testing.T) {
}, },
} }
p.Process(unit, false) err = p.Process(unit, false)
require.NoError(t, err)
// if all NALUs have been removed, no RTP packets must be generated. // if all NALUs have been removed, no RTP packets must be generated.
require.Equal(t, []*rtp.Packet(nil), unit.RTPPackets) require.Equal(t, []*rtp.Packet(nil), unit.RTPPackets)

26
internal/formatprocessor/h265_test.go

@ -29,7 +29,8 @@ func TestH265DynamicParams(t *testing.T) {
RTPPackets: []*rtp.Packet{pkts[0]}, RTPPackets: []*rtp.Packet{pkts[0]},
}, },
} }
p.Process(data, true) err = p.Process(data, true)
require.NoError(t, err)
require.Equal(t, [][]byte{ require.Equal(t, [][]byte{
{byte(h265.NALUType_CRA_NUT) << 1, 0}, {byte(h265.NALUType_CRA_NUT) << 1, 0},
@ -37,27 +38,33 @@ func TestH265DynamicParams(t *testing.T) {
pkts, err = enc.Encode([][]byte{{byte(h265.NALUType_VPS_NUT) << 1, 1, 2, 3}}, 0) pkts, err = enc.Encode([][]byte{{byte(h265.NALUType_VPS_NUT) << 1, 1, 2, 3}}, 0)
require.NoError(t, err) require.NoError(t, err)
p.Process(&UnitH265{
err = p.Process(&UnitH265{
BaseUnit: BaseUnit{ BaseUnit: BaseUnit{
RTPPackets: []*rtp.Packet{pkts[0]}, RTPPackets: []*rtp.Packet{pkts[0]},
}, },
}, false) }, false)
require.NoError(t, err)
pkts, err = enc.Encode([][]byte{{byte(h265.NALUType_SPS_NUT) << 1, 4, 5, 6}}, 0) pkts, err = enc.Encode([][]byte{{byte(h265.NALUType_SPS_NUT) << 1, 4, 5, 6}}, 0)
require.NoError(t, err) require.NoError(t, err)
p.Process(&UnitH265{
err = p.Process(&UnitH265{
BaseUnit: BaseUnit{ BaseUnit: BaseUnit{
RTPPackets: []*rtp.Packet{pkts[0]}, RTPPackets: []*rtp.Packet{pkts[0]},
}, },
}, false) }, false)
require.NoError(t, err)
pkts, err = enc.Encode([][]byte{{byte(h265.NALUType_PPS_NUT) << 1, 7, 8, 9}}, 0) pkts, err = enc.Encode([][]byte{{byte(h265.NALUType_PPS_NUT) << 1, 7, 8, 9}}, 0)
require.NoError(t, err) require.NoError(t, err)
p.Process(&UnitH265{
err = p.Process(&UnitH265{
BaseUnit: BaseUnit{ BaseUnit: BaseUnit{
RTPPackets: []*rtp.Packet{pkts[0]}, RTPPackets: []*rtp.Packet{pkts[0]},
}, },
}, false) }, false)
require.NoError(t, err)
require.Equal(t, []byte{byte(h265.NALUType_VPS_NUT) << 1, 1, 2, 3}, forma.VPS) require.Equal(t, []byte{byte(h265.NALUType_VPS_NUT) << 1, 1, 2, 3}, forma.VPS)
require.Equal(t, []byte{byte(h265.NALUType_SPS_NUT) << 1, 4, 5, 6}, forma.SPS) require.Equal(t, []byte{byte(h265.NALUType_SPS_NUT) << 1, 4, 5, 6}, forma.SPS)
@ -65,12 +72,14 @@ func TestH265DynamicParams(t *testing.T) {
pkts, err = enc.Encode([][]byte{{byte(h265.NALUType_CRA_NUT) << 1, 0}}, 0) pkts, err = enc.Encode([][]byte{{byte(h265.NALUType_CRA_NUT) << 1, 0}}, 0)
require.NoError(t, err) require.NoError(t, err)
data = &UnitH265{ data = &UnitH265{
BaseUnit: BaseUnit{ BaseUnit: BaseUnit{
RTPPackets: []*rtp.Packet{pkts[0]}, RTPPackets: []*rtp.Packet{pkts[0]},
}, },
} }
p.Process(data, true) err = p.Process(data, true)
require.NoError(t, err)
require.Equal(t, [][]byte{ require.Equal(t, [][]byte{
{byte(h265.NALUType_VPS_NUT) << 1, 1, 2, 3}, {byte(h265.NALUType_VPS_NUT) << 1, 1, 2, 3},
@ -124,7 +133,9 @@ func TestH265OversizedPackets(t *testing.T) {
RTPPackets: []*rtp.Packet{pkt}, RTPPackets: []*rtp.Packet{pkt},
}, },
} }
p.Process(data, false) err = p.Process(data, false)
require.NoError(t, err)
out = append(out, data.RTPPackets...) out = append(out, data.RTPPackets...)
} }
@ -187,7 +198,8 @@ func TestH265EmptyPacket(t *testing.T) {
}, },
} }
p.Process(unit, false) err = p.Process(unit, false)
require.NoError(t, err)
// if all NALUs have been removed, no RTP packets must be generated. // if all NALUs have been removed, no RTP packets must be generated.
require.Equal(t, []*rtp.Packet(nil), unit.RTPPackets) require.Equal(t, []*rtp.Packet(nil), unit.RTPPackets)

2
internal/httpserv/handler_logger.go

@ -35,7 +35,7 @@ func (w *loggerWriter) WriteHeader(statusCode int) {
func (w *loggerWriter) dump() string { func (w *loggerWriter) dump() string {
var buf bytes.Buffer var buf bytes.Buffer
fmt.Fprintf(&buf, "%s %d %s\n", "HTTP/1.1", w.status, http.StatusText(w.status)) fmt.Fprintf(&buf, "%s %d %s\n", "HTTP/1.1", w.status, http.StatusText(w.status))
w.w.Header().Write(&buf) w.w.Header().Write(&buf) //nolint:errcheck
buf.Write([]byte("\n")) buf.Write([]byte("\n"))
if w.buf.Len() > 0 { if w.buf.Len() > 0 {
fmt.Fprintf(&buf, "(body of %d bytes)", w.buf.Len()) fmt.Fprintf(&buf, "(body of %d bytes)", w.buf.Len())

2
internal/logger/destination_file.go

@ -27,7 +27,7 @@ func (d *destinationFile) log(t time.Time, level Level, format string, args ...i
writeTime(&d.buf, t, false) writeTime(&d.buf, t, false)
writeLevel(&d.buf, level, false) writeLevel(&d.buf, level, false)
writeContent(&d.buf, format, args) writeContent(&d.buf, format, args)
d.file.Write(d.buf.Bytes()) d.file.Write(d.buf.Bytes()) //nolint:errcheck
} }
func (d *destinationFile) close() { func (d *destinationFile) close() {

2
internal/logger/destination_stdout.go

@ -25,7 +25,7 @@ func (d *destinationStdout) log(t time.Time, level Level, format string, args ..
writeTime(&d.buf, t, d.useColor) writeTime(&d.buf, t, d.useColor)
writeLevel(&d.buf, level, d.useColor) writeLevel(&d.buf, level, d.useColor)
writeContent(&d.buf, format, args) writeContent(&d.buf, format, args)
os.Stdout.Write(d.buf.Bytes()) os.Stdout.Write(d.buf.Bytes()) //nolint:errcheck
} }
func (d *destinationStdout) close() { func (d *destinationStdout) close() {

3
internal/rtmp/bytecounter/writer_test.go

@ -13,6 +13,7 @@ func TestWriter(t *testing.T) {
w := NewWriter(&buf) w := NewWriter(&buf)
w.SetCount(100) w.SetCount(100)
w.Write(bytes.Repeat([]byte{0x01}, 64)) _, err := w.Write(bytes.Repeat([]byte{0x01}, 64))
require.NoError(t, err)
require.Equal(t, uint64(100+64), w.Count()) require.Equal(t, uint64(100+64), w.Count())
} }

2
internal/rtmp/conn_test.go

@ -490,6 +490,6 @@ func BenchmarkRead(b *testing.B) {
conn := newNoHandshakeConn(&buf) conn := newNoHandshakeConn(&buf)
for n := 0; n < b.N; n++ { for n := 0; n < b.N; n++ {
conn.Read() conn.Read() //nolint:errcheck
} }
} }

5
internal/rtmp/message/readwriter.go

@ -44,9 +44,12 @@ func (rw *ReadWriter) Read() (Message, error) {
rw.w.SetAcknowledgeValue(tmsg.Value) rw.w.SetAcknowledgeValue(tmsg.Value)
case *UserControlPingRequest: case *UserControlPingRequest:
rw.w.Write(&UserControlPingResponse{ err := rw.w.Write(&UserControlPingResponse{
ServerTime: tmsg.ServerTime, ServerTime: tmsg.ServerTime,
}) })
if err != nil {
return nil, err
}
} }
return msg, nil return msg, nil

2
internal/rtmp/rawmessage/reader.go

@ -266,7 +266,7 @@ func (r *Reader) Read() (*Message, error) {
r.chunkStreams[chunkStreamID] = rc r.chunkStreams[chunkStreamID] = rc
} }
r.br.UnreadByte() r.br.UnreadByte() //nolint:errcheck
msg, err := rc.readMessage(typ) msg, err := rc.readMessage(typ)
if err != nil { if err != nil {

2
internal/webrtcpc/pc.go

@ -90,7 +90,7 @@ func New(
// Close closes the connection. // Close closes the connection.
func (co *PeerConnection) Close() { func (co *PeerConnection) Close() {
co.PeerConnection.Close() co.PeerConnection.Close() //nolint:errcheck
<-co.closed <-co.closed
} }

12
internal/websocket/serverconn.go

@ -57,7 +57,7 @@ func NewServerConn(w http.ResponseWriter, req *http.Request) (*ServerConn, error
// Close closes a ServerConn. // Close closes a ServerConn.
func (c *ServerConn) Close() { func (c *ServerConn) Close() {
c.wc.Close() c.wc.Close() //nolint:errcheck
close(c.terminate) close(c.terminate)
} }
@ -67,10 +67,10 @@ func (c *ServerConn) RemoteAddr() net.Addr {
} }
func (c *ServerConn) run() { func (c *ServerConn) run() {
c.wc.SetReadDeadline(time.Now().Add(pingInterval + pingTimeout)) c.wc.SetReadDeadline(time.Now().Add(pingInterval + pingTimeout)) //nolint:errcheck
c.wc.SetPongHandler(func(string) error { c.wc.SetPongHandler(func(string) error {
c.wc.SetReadDeadline(time.Now().Add(pingInterval + pingTimeout)) c.wc.SetReadDeadline(time.Now().Add(pingInterval + pingTimeout)) //nolint:errcheck
return nil return nil
}) })
@ -80,13 +80,13 @@ func (c *ServerConn) run() {
for { for {
select { select {
case byts := <-c.write: case byts := <-c.write:
c.wc.SetWriteDeadline(time.Now().Add(writeTimeout)) c.wc.SetWriteDeadline(time.Now().Add(writeTimeout)) //nolint:errcheck
err := c.wc.WriteMessage(websocket.TextMessage, byts) err := c.wc.WriteMessage(websocket.TextMessage, byts)
c.writeErr <- err c.writeErr <- err
case <-pingTicker.C: case <-pingTicker.C:
c.wc.SetWriteDeadline(time.Now().Add(writeTimeout)) c.wc.SetWriteDeadline(time.Now().Add(writeTimeout)) //nolint:errcheck
c.wc.WriteMessage(websocket.PingMessage, nil) c.wc.WriteMessage(websocket.PingMessage, nil) //nolint:errcheck
case <-c.terminate: case <-c.terminate:
return return

5
internal/websocket/serverconn_test.go

@ -37,7 +37,7 @@ func TestServerConn(t *testing.T) {
c, res, err := websocket.DefaultDialer.Dial("ws://localhost:6344/", nil) c, res, err := websocket.DefaultDialer.Dial("ws://localhost:6344/", nil)
require.NoError(t, err) require.NoError(t, err)
defer res.Body.Close() defer res.Body.Close()
defer c.Close() defer c.Close() //nolint:errcheck
c.SetPingHandler(func(msg string) error { c.SetPingHandler(func(msg string) error {
close(pingReceived) close(pingReceived)
@ -49,7 +49,8 @@ func TestServerConn(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, "testing", msg) require.Equal(t, "testing", msg)
c.ReadMessage() _, _, err = c.ReadMessage()
require.Error(t, err)
<-pingReceived <-pingReceived
} }

2
internal/whip/link_header.go

@ -16,7 +16,7 @@ func quoteCredential(v string) string {
func unquoteCredential(v string) string { func unquoteCredential(v string) string {
var s string var s string
json.Unmarshal([]byte("\""+v+"\""), &s) json.Unmarshal([]byte("\""+v+"\""), &s) //nolint:errcheck
return s return s
} }

Loading…
Cancel
Save