mirror of
https://github.com/aler9/gortsplib
synced 2025-09-27 11:32:08 +08:00
bump golangci-lint (#784)
This commit is contained in:
4
.github/workflows/lint.yml
vendored
4
.github/workflows/lint.yml
vendored
@@ -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
|
||||
|
100
.golangci.yml
100
.golangci.yml
@@ -1,73 +1,75 @@
|
||||
version: "2"
|
||||
|
||||
linters:
|
||||
enable:
|
||||
- asciicheck
|
||||
- bidichk
|
||||
- bodyclose
|
||||
#- contextcheck
|
||||
- copyloopvar
|
||||
- dupl
|
||||
- errorlint
|
||||
- gochecknoinits
|
||||
- gocritic
|
||||
- gofmt
|
||||
- gofumpt
|
||||
- lll
|
||||
- misspell
|
||||
- nilerr
|
||||
- prealloc
|
||||
- predeclared
|
||||
- reassign
|
||||
- revive
|
||||
- usestdlibvars
|
||||
- unconvert
|
||||
#- usetesting
|
||||
- tparallel
|
||||
- wastedassign
|
||||
- whitespace
|
||||
|
||||
issues:
|
||||
exclude-use-default: false
|
||||
settings:
|
||||
errcheck:
|
||||
exclude-functions:
|
||||
- io.Copy
|
||||
- (io.Closer).Close
|
||||
- (io.Writer).Write
|
||||
- (hash.Hash).Write
|
||||
- (net.Conn).Close
|
||||
- (net.Conn).SetReadDeadline
|
||||
- (net.Conn).SetWriteDeadline
|
||||
- (*net.TCPConn).SetKeepAlive
|
||||
- (*net.TCPConn).SetKeepAlivePeriod
|
||||
- (*net.TCPConn).SetNoDelay
|
||||
- (net.Listener).Close
|
||||
- (net.PacketConn).Close
|
||||
- (net.PacketConn).SetReadDeadline
|
||||
- (net.PacketConn).SetWriteDeadline
|
||||
- (net/http.ResponseWriter).Write
|
||||
- (*net/http.Server).Serve
|
||||
- (*net/http.Server).ServeTLS
|
||||
- (*net/http.Server).Shutdown
|
||||
- os.Chdir
|
||||
- os.Mkdir
|
||||
- os.MkdirAll
|
||||
- os.Remove
|
||||
- os.RemoveAll
|
||||
- os.Setenv
|
||||
- os.Unsetenv
|
||||
- (*os.File).WriteString
|
||||
- (*os.File).Close
|
||||
- (github.com/datarhei/gosrt.Conn).Close
|
||||
- (github.com/datarhei/gosrt.Conn).SetReadDeadline
|
||||
- (github.com/datarhei/gosrt.Conn).SetWriteDeadline
|
||||
- (*github.com/bluenviron/gortsplib/v4.Client).Close
|
||||
- (*github.com/bluenviron/gortsplib/v4.Server).Close
|
||||
- (*github.com/bluenviron/gortsplib/v4.ServerSession).Close
|
||||
- (*github.com/bluenviron/gortsplib/v4.ServerStream).Close
|
||||
- (*github.com/bluenviron/gortsplib/v4.ServerConn).Close
|
||||
|
||||
linters-settings:
|
||||
errcheck:
|
||||
exclude-functions:
|
||||
- io.Copy
|
||||
- (io.Closer).Close
|
||||
- (io.Writer).Write
|
||||
- (hash.Hash).Write
|
||||
- (net.Conn).Close
|
||||
- (net.Conn).SetReadDeadline
|
||||
- (net.Conn).SetWriteDeadline
|
||||
- (*net.TCPConn).SetKeepAlive
|
||||
- (*net.TCPConn).SetKeepAlivePeriod
|
||||
- (*net.TCPConn).SetNoDelay
|
||||
- (net.Listener).Close
|
||||
- (net.PacketConn).Close
|
||||
- (net.PacketConn).SetReadDeadline
|
||||
- (net.PacketConn).SetWriteDeadline
|
||||
- (net/http.ResponseWriter).Write
|
||||
- (*net/http.Server).Serve
|
||||
- (*net/http.Server).ServeTLS
|
||||
- (*net/http.Server).Shutdown
|
||||
- os.Chdir
|
||||
- os.Mkdir
|
||||
- os.MkdirAll
|
||||
- os.Remove
|
||||
- os.RemoveAll
|
||||
- os.Setenv
|
||||
- os.Unsetenv
|
||||
- (*os.File).WriteString
|
||||
- (*os.File).Close
|
||||
- (github.com/datarhei/gosrt.Conn).Close
|
||||
- (github.com/datarhei/gosrt.Conn).SetReadDeadline
|
||||
- (github.com/datarhei/gosrt.Conn).SetWriteDeadline
|
||||
- (*github.com/bluenviron/gortsplib/v4.Client).Close
|
||||
- (*github.com/bluenviron/gortsplib/v4.Server).Close
|
||||
- (*github.com/bluenviron/gortsplib/v4.ServerSession).Close
|
||||
- (*github.com/bluenviron/gortsplib/v4.ServerStream).Close
|
||||
- (*github.com/bluenviron/gortsplib/v4.ServerConn).Close
|
||||
govet:
|
||||
enable-all: true
|
||||
disable:
|
||||
- fieldalignment
|
||||
- reflectvaluecompare
|
||||
|
||||
govet:
|
||||
enable-all: true
|
||||
disable:
|
||||
- fieldalignment
|
||||
- reflectvaluecompare
|
||||
formatters:
|
||||
enable:
|
||||
- gofmt
|
||||
- gofumpt
|
||||
- goimports
|
||||
|
2
Makefile
2
Makefile
@@ -1,5 +1,5 @@
|
||||
BASE_IMAGE = golang:1.24-alpine3.20
|
||||
LINT_IMAGE = golangci/golangci-lint:v1.64.5
|
||||
LINT_IMAGE = golangci/golangci-lint:v2.1.6
|
||||
|
||||
.PHONY: $(shell ls)
|
||||
|
||||
|
@@ -1,3 +1,4 @@
|
||||
// Package main contains an example.
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@@ -1,5 +1,6 @@
|
||||
//go:build cgo
|
||||
|
||||
// Package main contains an example.
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@@ -1,5 +1,6 @@
|
||||
//go:build cgo
|
||||
|
||||
// Package main contains an example.
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@@ -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
|
||||
}
|
||||
|
||||
|
@@ -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
|
||||
}
|
||||
|
||||
|
@@ -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)
|
||||
}
|
||||
|
@@ -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
|
||||
}
|
||||
|
||||
|
@@ -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)
|
||||
|
@@ -1,5 +1,6 @@
|
||||
//go:build cgo
|
||||
|
||||
// Package main contains an example.
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@@ -1,5 +1,6 @@
|
||||
//go:build cgo
|
||||
|
||||
// Package main contains an example.
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@@ -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
|
||||
}
|
||||
|
||||
|
@@ -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)
|
||||
|
@@ -1,5 +1,6 @@
|
||||
//go:build cgo
|
||||
|
||||
// Package main contains an example.
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@@ -1,5 +1,6 @@
|
||||
//go:build cgo
|
||||
|
||||
// Package main contains an example.
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@@ -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
|
||||
}
|
||||
|
||||
|
@@ -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)
|
||||
|
@@ -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
|
||||
}
|
||||
|
||||
|
@@ -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()
|
||||
}
|
||||
|
||||
|
@@ -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
|
||||
}
|
||||
|
||||
|
@@ -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
|
||||
}
|
||||
|
||||
|
@@ -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()
|
||||
}
|
||||
|
||||
|
@@ -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
|
||||
}
|
||||
|
||||
|
@@ -1,5 +1,6 @@
|
||||
//go:build cgo
|
||||
|
||||
// Package main contains an example.
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@@ -1,5 +1,6 @@
|
||||
//go:build cgo
|
||||
|
||||
// Package main contains an example.
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@@ -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)
|
||||
})
|
||||
|
||||
|
@@ -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)
|
||||
})
|
||||
|
||||
|
@@ -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)
|
||||
|
@@ -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
|
||||
|
@@ -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)
|
||||
})
|
||||
|
||||
|
@@ -1,3 +1,4 @@
|
||||
// Package main contains an example.
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@@ -1,3 +1,5 @@
|
||||
//go:build cgo
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@@ -1,5 +1,6 @@
|
||||
//go:build cgo
|
||||
|
||||
// Package main contains an example.
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@@ -1,3 +1,4 @@
|
||||
// Package main contains an example.
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@@ -1,3 +1,4 @@
|
||||
// Package main contains an example.
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@@ -1,3 +1,5 @@
|
||||
//go:build cgo
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@@ -1,5 +1,6 @@
|
||||
//go:build cgo
|
||||
|
||||
// Package main contains an example.
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@@ -1,3 +1,5 @@
|
||||
//go:build cgo
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@@ -1,5 +1,6 @@
|
||||
//go:build cgo
|
||||
|
||||
// Package main contains an example.
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@@ -1,3 +1,4 @@
|
||||
// Package main contains an example.
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@@ -1,3 +1,4 @@
|
||||
// Package main contains an example.
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@@ -1,3 +1,5 @@
|
||||
//go:build cgo
|
||||
|
||||
package main
|
||||
|
||||
import "math"
|
||||
|
@@ -1,5 +1,6 @@
|
||||
//go:build cgo
|
||||
|
||||
// Package main contains an example.
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@@ -1,3 +1,5 @@
|
||||
//go:build cgo
|
||||
|
||||
package main
|
||||
|
||||
import "math"
|
||||
|
@@ -1,5 +1,6 @@
|
||||
//go:build cgo
|
||||
|
||||
// Package main contains an example.
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@@ -1,3 +1,5 @@
|
||||
//go:build cgo
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@@ -1,5 +1,6 @@
|
||||
//go:build cgo
|
||||
|
||||
// Package main contains an example.
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@@ -1,3 +1,5 @@
|
||||
//go:build cgo
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@@ -1,5 +1,6 @@
|
||||
//go:build cgo
|
||||
|
||||
// Package main contains an example.
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@@ -1,3 +1,5 @@
|
||||
//go:build cgo
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@@ -1,5 +1,6 @@
|
||||
//go:build cgo
|
||||
|
||||
// Package main contains an example.
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@@ -1,3 +1,5 @@
|
||||
//go:build cgo
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@@ -1,5 +1,6 @@
|
||||
//go:build cgo
|
||||
|
||||
// Package main contains an example.
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@@ -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
|
||||
|
@@ -1,3 +1,4 @@
|
||||
// Package main contains an example.
|
||||
package main
|
||||
|
||||
import "log"
|
||||
|
@@ -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)
|
||||
|
@@ -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
|
||||
|
@@ -1,3 +1,4 @@
|
||||
// Package main contains an example.
|
||||
package main
|
||||
|
||||
import "log"
|
||||
|
@@ -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{
|
||||
|
@@ -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{
|
||||
|
@@ -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
|
||||
|
||||
}
|
||||
}
|
||||
|
@@ -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 {
|
||||
|
@@ -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{
|
||||
|
@@ -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{
|
||||
|
@@ -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)
|
||||
|
@@ -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{
|
||||
|
@@ -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{
|
||||
|
@@ -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:]
|
||||
|
||||
|
@@ -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
|
||||
|
@@ -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:]
|
||||
|
Reference in New Issue
Block a user