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:
|
with:
|
||||||
go-version: "1.24"
|
go-version: "1.24"
|
||||||
|
|
||||||
- uses: golangci/golangci-lint-action@v3
|
- uses: golangci/golangci-lint-action@v8
|
||||||
with:
|
with:
|
||||||
version: v1.64.5
|
version: v2.1.6
|
||||||
|
|
||||||
go-mod-tidy:
|
go-mod-tidy:
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
|
100
.golangci.yml
100
.golangci.yml
@@ -1,73 +1,75 @@
|
|||||||
|
version: "2"
|
||||||
|
|
||||||
linters:
|
linters:
|
||||||
enable:
|
enable:
|
||||||
- asciicheck
|
- asciicheck
|
||||||
- bidichk
|
- bidichk
|
||||||
- bodyclose
|
- bodyclose
|
||||||
#- contextcheck
|
|
||||||
- copyloopvar
|
- copyloopvar
|
||||||
- dupl
|
- dupl
|
||||||
- errorlint
|
- errorlint
|
||||||
- gochecknoinits
|
- gochecknoinits
|
||||||
- gocritic
|
- gocritic
|
||||||
- gofmt
|
|
||||||
- gofumpt
|
|
||||||
- lll
|
- lll
|
||||||
- misspell
|
- misspell
|
||||||
- nilerr
|
- nilerr
|
||||||
- prealloc
|
- prealloc
|
||||||
- predeclared
|
- predeclared
|
||||||
|
- reassign
|
||||||
- revive
|
- revive
|
||||||
- usestdlibvars
|
- usestdlibvars
|
||||||
- unconvert
|
- unconvert
|
||||||
#- usetesting
|
|
||||||
- tparallel
|
- tparallel
|
||||||
- wastedassign
|
- wastedassign
|
||||||
- whitespace
|
- whitespace
|
||||||
|
|
||||||
issues:
|
settings:
|
||||||
exclude-use-default: false
|
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:
|
govet:
|
||||||
errcheck:
|
enable-all: true
|
||||||
exclude-functions:
|
disable:
|
||||||
- io.Copy
|
- fieldalignment
|
||||||
- (io.Closer).Close
|
- reflectvaluecompare
|
||||||
- (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:
|
formatters:
|
||||||
enable-all: true
|
enable:
|
||||||
disable:
|
- gofmt
|
||||||
- fieldalignment
|
- gofumpt
|
||||||
- reflectvaluecompare
|
- goimports
|
||||||
|
2
Makefile
2
Makefile
@@ -1,5 +1,5 @@
|
|||||||
BASE_IMAGE = golang:1.24-alpine3.20
|
BASE_IMAGE = golang:1.24-alpine3.20
|
||||||
LINT_IMAGE = golangci/golangci-lint:v1.64.5
|
LINT_IMAGE = golangci/golangci-lint:v2.1.6
|
||||||
|
|
||||||
.PHONY: $(shell ls)
|
.PHONY: $(shell ls)
|
||||||
|
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
//go:build cgo
|
//go:build cgo
|
||||||
|
|
||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
//go:build cgo
|
//go:build cgo
|
||||||
|
|
||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -66,9 +67,9 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// extract G711 samples from RTP packets
|
// extract G711 samples from RTP packets
|
||||||
samples, err := rtpDec.Decode(pkt)
|
samples, err2 := rtpDec.Decode(pkt)
|
||||||
if err != nil {
|
if err2 != nil {
|
||||||
log.Printf("ERR: %v", err)
|
log.Printf("ERR: %v", err2)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,6 +1,8 @@
|
|||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"log"
|
"log"
|
||||||
|
|
||||||
"github.com/bluenviron/gortsplib/v4"
|
"github.com/bluenviron/gortsplib/v4"
|
||||||
@@ -91,18 +93,18 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// extract access unit from RTP packets
|
// extract access unit from RTP packets
|
||||||
au, err := h264RTPDec.Decode(pkt)
|
au, err2 := h264RTPDec.Decode(pkt)
|
||||||
if err != nil {
|
if err2 != nil {
|
||||||
if err != rtph264.ErrNonStartingPacketAndNoPrevious && err != rtph264.ErrMorePacketsNeeded {
|
if !errors.Is(err2, rtph264.ErrNonStartingPacketAndNoPrevious) && !errors.Is(err2, rtph264.ErrMorePacketsNeeded) {
|
||||||
log.Printf("ERR: %v", err)
|
log.Printf("ERR: %v", err2)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// encode the access unit into MPEG-TS
|
// encode the access unit into MPEG-TS
|
||||||
err = mpegtsMuxer.writeH264(au, pts)
|
err2 = mpegtsMuxer.writeH264(au, pts)
|
||||||
if err != nil {
|
if err2 != nil {
|
||||||
log.Printf("ERR: %v", err)
|
log.Printf("ERR: %v", err2)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -119,16 +121,16 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// extract access units from RTP packets
|
// extract access units from RTP packets
|
||||||
aus, err := mpeg4AudioRTPDec.Decode(pkt)
|
aus, err2 := mpeg4AudioRTPDec.Decode(pkt)
|
||||||
if err != nil {
|
if err2 != nil {
|
||||||
log.Printf("ERR: %v", err)
|
log.Printf("ERR: %v", err2)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// encode access units into MPEG-TS
|
// encode access units into MPEG-TS
|
||||||
err = mpegtsMuxer.writeMPEG4Audio(aus, pts)
|
err2 = mpegtsMuxer.writeMPEG4Audio(aus, pts)
|
||||||
if err != nil {
|
if err2 != nil {
|
||||||
log.Printf("ERR: %v", err)
|
log.Printf("ERR: %v", err2)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -61,7 +61,7 @@ func (e *mpegtsMuxer) initialize() error {
|
|||||||
|
|
||||||
// close closes all the mpegtsMuxer resources.
|
// close closes all the mpegtsMuxer resources.
|
||||||
func (e *mpegtsMuxer) close() {
|
func (e *mpegtsMuxer) close() {
|
||||||
e.b.Flush()
|
e.b.Flush() //nolint:errcheck
|
||||||
e.f.Close()
|
e.f.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,7 +70,7 @@ func (e *mpegtsMuxer) writeH264(au [][]byte, pts int64) error {
|
|||||||
e.mutex.Lock()
|
e.mutex.Lock()
|
||||||
defer e.mutex.Unlock()
|
defer e.mutex.Unlock()
|
||||||
|
|
||||||
var filteredAU [][]byte
|
var filteredAU [][]byte //nolint:prealloc
|
||||||
|
|
||||||
nonIDRPresent := false
|
nonIDRPresent := false
|
||||||
idrPresent := false
|
idrPresent := false
|
||||||
@@ -115,7 +115,8 @@ func (e *mpegtsMuxer) writeH264(au [][]byte, pts int64) error {
|
|||||||
if !idrPresent {
|
if !idrPresent {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
e.dtsExtractor = h264.NewDTSExtractor()
|
e.dtsExtractor = &h264.DTSExtractor{}
|
||||||
|
e.dtsExtractor.Initialize()
|
||||||
}
|
}
|
||||||
|
|
||||||
dts, err := e.dtsExtractor.Extract(au, pts)
|
dts, err := e.dtsExtractor.Extract(au, pts)
|
||||||
@@ -132,5 +133,6 @@ func (e *mpegtsMuxer) writeMPEG4Audio(aus [][]byte, pts int64) error {
|
|||||||
e.mutex.Lock()
|
e.mutex.Lock()
|
||||||
defer e.mutex.Unlock()
|
defer e.mutex.Unlock()
|
||||||
|
|
||||||
return e.w.WriteMPEG4Audio(e.mpeg4AudioTrack, multiplyAndDivide(pts, 90000, int64(e.mpeg4AudioFormat.ClockRate())), aus)
|
return e.w.WriteMPEG4Audio(e.mpeg4AudioTrack,
|
||||||
|
multiplyAndDivide(pts, 90000, int64(e.mpeg4AudioFormat.ClockRate())), aus)
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,8 @@
|
|||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"log"
|
"log"
|
||||||
|
|
||||||
"github.com/bluenviron/gortsplib/v4"
|
"github.com/bluenviron/gortsplib/v4"
|
||||||
@@ -78,18 +80,18 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// extract access unit from RTP packets
|
// extract access unit from RTP packets
|
||||||
au, err := rtpDec.Decode(pkt)
|
au, err2 := rtpDec.Decode(pkt)
|
||||||
if err != nil {
|
if err2 != nil {
|
||||||
if err != rtph264.ErrNonStartingPacketAndNoPrevious && err != rtph264.ErrMorePacketsNeeded {
|
if !errors.Is(err2, rtph264.ErrNonStartingPacketAndNoPrevious) && !errors.Is(err2, rtph264.ErrMorePacketsNeeded) {
|
||||||
log.Printf("ERR: %v", err)
|
log.Printf("ERR: %v", err2)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// encode the access unit into MPEG-TS
|
// encode the access unit into MPEG-TS
|
||||||
err = mpegtsMuxer.writeH264(au, pts)
|
err2 = mpegtsMuxer.writeH264(au, pts)
|
||||||
if err != nil {
|
if err2 != nil {
|
||||||
log.Printf("ERR: %v", err)
|
log.Printf("ERR: %v", err2)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -45,13 +45,13 @@ func (e *mpegtsMuxer) initialize() error {
|
|||||||
|
|
||||||
// close closes all the mpegtsMuxer resources.
|
// close closes all the mpegtsMuxer resources.
|
||||||
func (e *mpegtsMuxer) close() {
|
func (e *mpegtsMuxer) close() {
|
||||||
e.b.Flush()
|
e.b.Flush() //nolint:errcheck
|
||||||
e.f.Close()
|
e.f.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
// writeH264 writes a H264 access unit into MPEG-TS.
|
// writeH264 writes a H264 access unit into MPEG-TS.
|
||||||
func (e *mpegtsMuxer) writeH264(au [][]byte, pts int64) error {
|
func (e *mpegtsMuxer) writeH264(au [][]byte, pts int64) error {
|
||||||
var filteredAU [][]byte
|
var filteredAU [][]byte //nolint:prealloc
|
||||||
|
|
||||||
nonIDRPresent := false
|
nonIDRPresent := false
|
||||||
idrPresent := false
|
idrPresent := false
|
||||||
@@ -96,7 +96,8 @@ func (e *mpegtsMuxer) writeH264(au [][]byte, pts int64) error {
|
|||||||
if !idrPresent {
|
if !idrPresent {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
e.dtsExtractor = h264.NewDTSExtractor()
|
e.dtsExtractor = &h264.DTSExtractor{}
|
||||||
|
e.dtsExtractor.Initialize()
|
||||||
}
|
}
|
||||||
|
|
||||||
dts, err := e.dtsExtractor.Extract(au, pts)
|
dts, err := e.dtsExtractor.Extract(au, pts)
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
//go:build cgo
|
//go:build cgo
|
||||||
|
|
||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
//go:build cgo
|
//go:build cgo
|
||||||
|
|
||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@@ -1,6 +1,8 @@
|
|||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"log"
|
"log"
|
||||||
|
|
||||||
"github.com/bluenviron/gortsplib/v4"
|
"github.com/bluenviron/gortsplib/v4"
|
||||||
@@ -79,18 +81,18 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// extract access unit from RTP packets
|
// extract access unit from RTP packets
|
||||||
au, err := rtpDec.Decode(pkt)
|
au, err2 := rtpDec.Decode(pkt)
|
||||||
if err != nil {
|
if err2 != nil {
|
||||||
if err != rtph265.ErrNonStartingPacketAndNoPrevious && err != rtph265.ErrMorePacketsNeeded {
|
if !errors.Is(err2, rtph265.ErrNonStartingPacketAndNoPrevious) && !errors.Is(err2, rtph265.ErrMorePacketsNeeded) {
|
||||||
log.Printf("ERR: %v", err)
|
log.Printf("ERR: %v", err2)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// encode the access unit into MPEG-TS
|
// encode the access unit into MPEG-TS
|
||||||
err = mpegtsMuxer.writeH265(au, pts)
|
err2 = mpegtsMuxer.writeH265(au, pts)
|
||||||
if err != nil {
|
if err2 != nil {
|
||||||
log.Printf("ERR: %v", err)
|
log.Printf("ERR: %v", err2)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -46,13 +46,13 @@ func (e *mpegtsMuxer) initialize() error {
|
|||||||
|
|
||||||
// close closes all the mpegtsMuxer resources.
|
// close closes all the mpegtsMuxer resources.
|
||||||
func (e *mpegtsMuxer) close() {
|
func (e *mpegtsMuxer) close() {
|
||||||
e.b.Flush()
|
e.b.Flush() //nolint:errcheck
|
||||||
e.f.Close()
|
e.f.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
// writeH265 writes a H265 access unit into MPEG-TS.
|
// writeH265 writes a H265 access unit into MPEG-TS.
|
||||||
func (e *mpegtsMuxer) writeH265(au [][]byte, pts int64) error {
|
func (e *mpegtsMuxer) writeH265(au [][]byte, pts int64) error {
|
||||||
var filteredAU [][]byte
|
var filteredAU [][]byte //nolint:prealloc
|
||||||
|
|
||||||
isRandomAccess := false
|
isRandomAccess := false
|
||||||
|
|
||||||
@@ -97,7 +97,8 @@ func (e *mpegtsMuxer) writeH265(au [][]byte, pts int64) error {
|
|||||||
if !isRandomAccess {
|
if !isRandomAccess {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
e.dtsExtractor = h265.NewDTSExtractor()
|
e.dtsExtractor = &h265.DTSExtractor{}
|
||||||
|
e.dtsExtractor.Initialize()
|
||||||
}
|
}
|
||||||
|
|
||||||
dts, err := e.dtsExtractor.Extract(au, pts)
|
dts, err := e.dtsExtractor.Extract(au, pts)
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
//go:build cgo
|
//go:build cgo
|
||||||
|
|
||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
//go:build cgo
|
//go:build cgo
|
||||||
|
|
||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -65,9 +66,9 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// extract LPCM samples from RTP packets
|
// extract LPCM samples from RTP packets
|
||||||
op, err := rtpDec.Decode(pkt)
|
op, err2 := rtpDec.Decode(pkt)
|
||||||
if err != nil {
|
if err2 != nil {
|
||||||
log.Printf("ERR: %v", err)
|
log.Printf("ERR: %v", err2)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,7 +1,9 @@
|
|||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"errors"
|
||||||
"image/jpeg"
|
"image/jpeg"
|
||||||
"log"
|
"log"
|
||||||
|
|
||||||
@@ -69,18 +71,18 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// extract JPEG images from RTP packets
|
// extract JPEG images from RTP packets
|
||||||
enc, err := rtpDec.Decode(pkt)
|
enc, err2 := rtpDec.Decode(pkt)
|
||||||
if err != nil {
|
if err2 != nil {
|
||||||
if err != rtpmjpeg.ErrNonStartingPacketAndNoPrevious && err != rtpmjpeg.ErrMorePacketsNeeded {
|
if !errors.Is(err2, rtpmjpeg.ErrNonStartingPacketAndNoPrevious) && !errors.Is(err2, rtpmjpeg.ErrMorePacketsNeeded) {
|
||||||
log.Printf("ERR: %v", err)
|
log.Printf("ERR: %v", err2)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// convert JPEG images into RGBA frames
|
// convert JPEG images into RGBA frames
|
||||||
image, err := jpeg.Decode(bytes.NewReader(enc))
|
image, err2 := jpeg.Decode(bytes.NewReader(enc))
|
||||||
if err != nil {
|
if err2 != nil {
|
||||||
panic(err)
|
panic(err2)
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Printf("decoded image with PTS %v and size %v", pts, image.Bounds().Max)
|
log.Printf("decoded image with PTS %v and size %v", pts, image.Bounds().Max)
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -82,16 +83,16 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// extract access units from RTP packets
|
// extract access units from RTP packets
|
||||||
aus, err := rtpDec.Decode(pkt)
|
aus, err2 := rtpDec.Decode(pkt)
|
||||||
if err != nil {
|
if err2 != nil {
|
||||||
log.Printf("ERR: %v", err)
|
log.Printf("ERR: %v", err2)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// encode access units into MPEG-TS
|
// encode access units into MPEG-TS
|
||||||
err = mpegtsMuxer.writeMPEG4Audio(aus, pts)
|
err2 = mpegtsMuxer.writeMPEG4Audio(aus, pts)
|
||||||
if err != nil {
|
if err2 != nil {
|
||||||
log.Printf("ERR: %v", err)
|
log.Printf("ERR: %v", err2)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -45,7 +45,7 @@ func (e *mpegtsMuxer) initialize() error {
|
|||||||
|
|
||||||
// close closes all the mpegtsMuxer resources.
|
// close closes all the mpegtsMuxer resources.
|
||||||
func (e *mpegtsMuxer) close() {
|
func (e *mpegtsMuxer) close() {
|
||||||
e.b.Flush()
|
e.b.Flush() //nolint:errcheck
|
||||||
e.f.Close()
|
e.f.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -65,9 +66,9 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// extract access units from RTP packets
|
// extract access units from RTP packets
|
||||||
aus, err := rtpDec.Decode(pkt)
|
aus, err2 := rtpDec.Decode(pkt)
|
||||||
if err != nil {
|
if err2 != nil {
|
||||||
log.Printf("ERR: %v", err)
|
log.Printf("ERR: %v", err2)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -82,16 +83,16 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// extract Opus packets from RTP packets
|
// extract Opus packets from RTP packets
|
||||||
opkt, err := rtpDec.Decode(pkt)
|
opkt, err2 := rtpDec.Decode(pkt)
|
||||||
if err != nil {
|
if err2 != nil {
|
||||||
log.Printf("ERR: %v", err)
|
log.Printf("ERR: %v", err2)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// encode Opus packets into MPEG-TS
|
// encode Opus packets into MPEG-TS
|
||||||
err = mpegtsMuxer.writeOpus(opkt, pts)
|
err2 = mpegtsMuxer.writeOpus(opkt, pts)
|
||||||
if err != nil {
|
if err2 != nil {
|
||||||
log.Printf("ERR: %v", err)
|
log.Printf("ERR: %v", err2)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -45,7 +45,7 @@ func (e *mpegtsMuxer) initialize() error {
|
|||||||
|
|
||||||
// close closes all the mpegtsMuxer resources.
|
// close closes all the mpegtsMuxer resources.
|
||||||
func (e *mpegtsMuxer) close() {
|
func (e *mpegtsMuxer) close() {
|
||||||
e.b.Flush()
|
e.b.Flush() //nolint:errcheck
|
||||||
e.f.Close()
|
e.f.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -65,9 +66,9 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// extract Opus packets from RTP packets
|
// extract Opus packets from RTP packets
|
||||||
op, err := rtpDec.Decode(pkt)
|
op, err2 := rtpDec.Decode(pkt)
|
||||||
if err != nil {
|
if err2 != nil {
|
||||||
log.Printf("ERR: %v", err)
|
log.Printf("ERR: %v", err2)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
//go:build cgo
|
//go:build cgo
|
||||||
|
|
||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
//go:build cgo
|
//go:build cgo
|
||||||
|
|
||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -53,7 +54,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called when a RTP packet arrives
|
// called when a RTP packet arrives
|
||||||
c.OnPacketRTPAny(func(medi *description.Media, forma format.Format, pkt *rtp.Packet) {
|
c.OnPacketRTPAny(func(medi *description.Media, _ format.Format, _ *rtp.Packet) {
|
||||||
log.Printf("RTP packet from media %v\n", medi)
|
log.Printf("RTP packet from media %v\n", medi)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -47,7 +48,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called when a RTP packet arrives
|
// called when a RTP packet arrives
|
||||||
c.OnPacketRTPAny(func(medi *description.Media, forma format.Format, pkt *rtp.Packet) {
|
c.OnPacketRTPAny(func(medi *description.Media, _ format.Format, _ *rtp.Packet) {
|
||||||
log.Printf("RTP packet from media %v\n", medi)
|
log.Printf("RTP packet from media %v\n", medi)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -44,7 +45,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called when a RTP packet arrives
|
// called when a RTP packet arrives
|
||||||
c.OnPacketRTPAny(func(medi *description.Media, forma format.Format, pkt *rtp.Packet) {
|
c.OnPacketRTPAny(func(medi *description.Media, _ format.Format, pkt *rtp.Packet) {
|
||||||
// get the PTS timestamp of the packet, i.e. timestamp relative to the start of the session
|
// get the PTS timestamp of the packet, i.e. timestamp relative to the start of the session
|
||||||
pts, ptsAvailable := c.PacketPTS2(medi, pkt)
|
pts, ptsAvailable := c.PacketPTS2(medi, pkt)
|
||||||
log.Printf("PTS: available=%v, value=%v\n", ptsAvailable, pts)
|
log.Printf("PTS: available=%v, value=%v\n", ptsAvailable, pts)
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -55,8 +56,8 @@ func main() {
|
|||||||
defer publisher.Close()
|
defer publisher.Close()
|
||||||
|
|
||||||
// read RTP packets from the reader and route them to the publisher
|
// read RTP packets from the reader and route them to the publisher
|
||||||
reader.OnPacketRTPAny(func(medi *description.Media, forma format.Format, pkt *rtp.Packet) {
|
reader.OnPacketRTPAny(func(_ *description.Media, _ format.Format, pkt *rtp.Packet) {
|
||||||
publisher.WritePacketRTP(desc.Medias[0], pkt)
|
publisher.WritePacketRTP(desc.Medias[0], pkt) //nolint:errcheck
|
||||||
})
|
})
|
||||||
|
|
||||||
// start playing
|
// start playing
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -44,7 +45,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called when a RTP packet arrives
|
// called when a RTP packet arrives
|
||||||
c.OnPacketRTPAny(func(medi *description.Media, forma format.Format, pkt *rtp.Packet) {
|
c.OnPacketRTPAny(func(medi *description.Media, _ format.Format, _ *rtp.Packet) {
|
||||||
log.Printf("RTP packet from media %v\n", medi)
|
log.Printf("RTP packet from media %v\n", medi)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@@ -1,3 +1,5 @@
|
|||||||
|
//go:build cgo
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
//go:build cgo
|
//go:build cgo
|
||||||
|
|
||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@@ -1,3 +1,5 @@
|
|||||||
|
//go:build cgo
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
//go:build cgo
|
//go:build cgo
|
||||||
|
|
||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@@ -1,3 +1,5 @@
|
|||||||
|
//go:build cgo
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
//go:build cgo
|
//go:build cgo
|
||||||
|
|
||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@@ -1,3 +1,5 @@
|
|||||||
|
//go:build cgo
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import "math"
|
import "math"
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
//go:build cgo
|
//go:build cgo
|
||||||
|
|
||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@@ -1,3 +1,5 @@
|
|||||||
|
//go:build cgo
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import "math"
|
import "math"
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
//go:build cgo
|
//go:build cgo
|
||||||
|
|
||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@@ -1,3 +1,5 @@
|
|||||||
|
//go:build cgo
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
//go:build cgo
|
//go:build cgo
|
||||||
|
|
||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@@ -1,3 +1,5 @@
|
|||||||
|
//go:build cgo
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
//go:build cgo
|
//go:build cgo
|
||||||
|
|
||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@@ -1,3 +1,5 @@
|
|||||||
|
//go:build cgo
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
//go:build cgo
|
//go:build cgo
|
||||||
|
|
||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@@ -1,3 +1,5 @@
|
|||||||
|
//go:build cgo
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
//go:build cgo
|
//go:build cgo
|
||||||
|
|
||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@@ -78,7 +78,7 @@ func (c *client) read() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
writeToClient := func(pkt *rtp.Packet) {
|
writeToClient := func(pkt *rtp.Packet) {
|
||||||
rc.WritePacketRTP(backChannelMedia, pkt)
|
rc.WritePacketRTP(backChannelMedia, pkt) //nolint:errcheck
|
||||||
}
|
}
|
||||||
|
|
||||||
// setup all medias
|
// setup all medias
|
||||||
@@ -94,11 +94,11 @@ func (c *client) read() error {
|
|||||||
log.Printf("stream is ready and can be read from the server at rtsp://localhost:8554/stream\n")
|
log.Printf("stream is ready and can be read from the server at rtsp://localhost:8554/stream\n")
|
||||||
|
|
||||||
// called when a RTP packet arrives
|
// called when a RTP packet arrives
|
||||||
rc.OnPacketRTPAny(func(medi *description.Media, forma format.Format, pkt *rtp.Packet) {
|
rc.OnPacketRTPAny(func(medi *description.Media, _ format.Format, pkt *rtp.Packet) {
|
||||||
log.Printf("received RTP packet from the client, routing to readers")
|
log.Printf("received RTP packet from the client, routing to readers")
|
||||||
|
|
||||||
// route incoming packets to the server stream
|
// route incoming packets to the server stream
|
||||||
stream.WritePacketRTP(medi, pkt)
|
stream.WritePacketRTP(medi, pkt) //nolint:errcheck
|
||||||
})
|
})
|
||||||
|
|
||||||
// start playing
|
// start playing
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import "log"
|
import "log"
|
||||||
|
@@ -32,7 +32,7 @@ func (s *server) initialize() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called when a connection is opened.
|
// called when a connection is opened.
|
||||||
func (s *server) OnConnOpen(ctx *gortsplib.ServerHandlerOnConnOpenCtx) {
|
func (s *server) OnConnOpen(_ *gortsplib.ServerHandlerOnConnOpenCtx) {
|
||||||
log.Printf("conn opened")
|
log.Printf("conn opened")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -42,17 +42,17 @@ func (s *server) OnConnClose(ctx *gortsplib.ServerHandlerOnConnCloseCtx) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called when a session is opened.
|
// called when a session is opened.
|
||||||
func (s *server) OnSessionOpen(ctx *gortsplib.ServerHandlerOnSessionOpenCtx) {
|
func (s *server) OnSessionOpen(_ *gortsplib.ServerHandlerOnSessionOpenCtx) {
|
||||||
log.Printf("session opened")
|
log.Printf("session opened")
|
||||||
}
|
}
|
||||||
|
|
||||||
// called when a session is closed.
|
// called when a session is closed.
|
||||||
func (s *server) OnSessionClose(ctx *gortsplib.ServerHandlerOnSessionCloseCtx) {
|
func (s *server) OnSessionClose(_ *gortsplib.ServerHandlerOnSessionCloseCtx) {
|
||||||
log.Printf("session closed")
|
log.Printf("session closed")
|
||||||
}
|
}
|
||||||
|
|
||||||
// called when receiving a DESCRIBE request.
|
// called when receiving a DESCRIBE request.
|
||||||
func (s *server) OnDescribe(ctx *gortsplib.ServerHandlerOnDescribeCtx) (*base.Response, *gortsplib.ServerStream, error) {
|
func (s *server) OnDescribe(_ *gortsplib.ServerHandlerOnDescribeCtx) (*base.Response, *gortsplib.ServerStream, error) {
|
||||||
log.Printf("DESCRIBE request")
|
log.Printf("DESCRIBE request")
|
||||||
|
|
||||||
s.mutex.RLock()
|
s.mutex.RLock()
|
||||||
@@ -71,7 +71,7 @@ func (s *server) OnDescribe(ctx *gortsplib.ServerHandlerOnDescribeCtx) (*base.Re
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called when receiving a SETUP request.
|
// called when receiving a SETUP request.
|
||||||
func (s *server) OnSetup(ctx *gortsplib.ServerHandlerOnSetupCtx) (*base.Response, *gortsplib.ServerStream, error) {
|
func (s *server) OnSetup(_ *gortsplib.ServerHandlerOnSetupCtx) (*base.Response, *gortsplib.ServerStream, error) {
|
||||||
log.Printf("SETUP request")
|
log.Printf("SETUP request")
|
||||||
|
|
||||||
s.mutex.RLock()
|
s.mutex.RLock()
|
||||||
@@ -93,7 +93,7 @@ func (s *server) OnSetup(ctx *gortsplib.ServerHandlerOnSetupCtx) (*base.Response
|
|||||||
func (s *server) OnPlay(ctx *gortsplib.ServerHandlerOnPlayCtx) (*base.Response, error) {
|
func (s *server) OnPlay(ctx *gortsplib.ServerHandlerOnPlayCtx) (*base.Response, error) {
|
||||||
log.Printf("PLAY request")
|
log.Printf("PLAY request")
|
||||||
|
|
||||||
ctx.Session.OnPacketRTPAny(func(m *description.Media, f format.Format, pkt *rtp.Packet) {
|
ctx.Session.OnPacketRTPAny(func(_ *description.Media, _ format.Format, pkt *rtp.Packet) {
|
||||||
log.Printf("received RTP packet from readers, routing to the client")
|
log.Printf("received RTP packet from readers, routing to the client")
|
||||||
|
|
||||||
s.writeToClient(pkt)
|
s.writeToClient(pkt)
|
||||||
|
@@ -69,9 +69,9 @@ func (c *client) read() error {
|
|||||||
log.Printf("stream is ready and can be read from the server at rtsp://localhost:8554/stream\n")
|
log.Printf("stream is ready and can be read from the server at rtsp://localhost:8554/stream\n")
|
||||||
|
|
||||||
// called when a RTP packet arrives
|
// called when a RTP packet arrives
|
||||||
rc.OnPacketRTPAny(func(medi *description.Media, forma format.Format, pkt *rtp.Packet) {
|
rc.OnPacketRTPAny(func(medi *description.Media, _ format.Format, pkt *rtp.Packet) {
|
||||||
// route incoming packets to the server stream
|
// route incoming packets to the server stream
|
||||||
stream.WritePacketRTP(medi, pkt)
|
stream.WritePacketRTP(medi, pkt) //nolint:errcheck
|
||||||
})
|
})
|
||||||
|
|
||||||
// start playing
|
// start playing
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import "log"
|
import "log"
|
||||||
|
@@ -29,7 +29,7 @@ func (s *server) initialize() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called when a connection is opened.
|
// called when a connection is opened.
|
||||||
func (s *server) OnConnOpen(ctx *gortsplib.ServerHandlerOnConnOpenCtx) {
|
func (s *server) OnConnOpen(_ *gortsplib.ServerHandlerOnConnOpenCtx) {
|
||||||
log.Printf("conn opened")
|
log.Printf("conn opened")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -39,17 +39,17 @@ func (s *server) OnConnClose(ctx *gortsplib.ServerHandlerOnConnCloseCtx) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called when a session is opened.
|
// called when a session is opened.
|
||||||
func (s *server) OnSessionOpen(ctx *gortsplib.ServerHandlerOnSessionOpenCtx) {
|
func (s *server) OnSessionOpen(_ *gortsplib.ServerHandlerOnSessionOpenCtx) {
|
||||||
log.Printf("session opened")
|
log.Printf("session opened")
|
||||||
}
|
}
|
||||||
|
|
||||||
// called when a session is closed.
|
// called when a session is closed.
|
||||||
func (s *server) OnSessionClose(ctx *gortsplib.ServerHandlerOnSessionCloseCtx) {
|
func (s *server) OnSessionClose(_ *gortsplib.ServerHandlerOnSessionCloseCtx) {
|
||||||
log.Printf("session closed")
|
log.Printf("session closed")
|
||||||
}
|
}
|
||||||
|
|
||||||
// called when receiving a DESCRIBE request.
|
// called when receiving a DESCRIBE request.
|
||||||
func (s *server) OnDescribe(ctx *gortsplib.ServerHandlerOnDescribeCtx) (*base.Response, *gortsplib.ServerStream, error) {
|
func (s *server) OnDescribe(_ *gortsplib.ServerHandlerOnDescribeCtx) (*base.Response, *gortsplib.ServerStream, error) {
|
||||||
log.Printf("DESCRIBE request")
|
log.Printf("DESCRIBE request")
|
||||||
|
|
||||||
s.mutex.RLock()
|
s.mutex.RLock()
|
||||||
@@ -68,7 +68,7 @@ func (s *server) OnDescribe(ctx *gortsplib.ServerHandlerOnDescribeCtx) (*base.Re
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called when receiving a SETUP request.
|
// called when receiving a SETUP request.
|
||||||
func (s *server) OnSetup(ctx *gortsplib.ServerHandlerOnSetupCtx) (*base.Response, *gortsplib.ServerStream, error) {
|
func (s *server) OnSetup(_ *gortsplib.ServerHandlerOnSetupCtx) (*base.Response, *gortsplib.ServerStream, error) {
|
||||||
log.Printf("SETUP request")
|
log.Printf("SETUP request")
|
||||||
|
|
||||||
s.mutex.RLock()
|
s.mutex.RLock()
|
||||||
@@ -87,7 +87,7 @@ func (s *server) OnSetup(ctx *gortsplib.ServerHandlerOnSetupCtx) (*base.Response
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called when receiving a PLAY request.
|
// called when receiving a PLAY request.
|
||||||
func (s *server) OnPlay(ctx *gortsplib.ServerHandlerOnPlayCtx) (*base.Response, error) {
|
func (s *server) OnPlay(_ *gortsplib.ServerHandlerOnPlayCtx) (*base.Response, error) {
|
||||||
log.Printf("PLAY request")
|
log.Printf("PLAY request")
|
||||||
|
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -36,7 +37,7 @@ type serverHandler struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called when a connection is opened.
|
// called when a connection is opened.
|
||||||
func (sh *serverHandler) OnConnOpen(ctx *gortsplib.ServerHandlerOnConnOpenCtx) {
|
func (sh *serverHandler) OnConnOpen(_ *gortsplib.ServerHandlerOnConnOpenCtx) {
|
||||||
log.Printf("conn opened")
|
log.Printf("conn opened")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -46,7 +47,7 @@ func (sh *serverHandler) OnConnClose(ctx *gortsplib.ServerHandlerOnConnCloseCtx)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called when a session is opened.
|
// called when a session is opened.
|
||||||
func (sh *serverHandler) OnSessionOpen(ctx *gortsplib.ServerHandlerOnSessionOpenCtx) {
|
func (sh *serverHandler) OnSessionOpen(_ *gortsplib.ServerHandlerOnSessionOpenCtx) {
|
||||||
log.Printf("session opened")
|
log.Printf("session opened")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -66,7 +67,9 @@ func (sh *serverHandler) OnSessionClose(ctx *gortsplib.ServerHandlerOnSessionClo
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called when receiving a DESCRIBE request.
|
// called when receiving a DESCRIBE request.
|
||||||
func (sh *serverHandler) OnDescribe(ctx *gortsplib.ServerHandlerOnDescribeCtx) (*base.Response, *gortsplib.ServerStream, error) {
|
func (sh *serverHandler) OnDescribe(ctx *gortsplib.ServerHandlerOnDescribeCtx) (
|
||||||
|
*base.Response, *gortsplib.ServerStream, error,
|
||||||
|
) {
|
||||||
log.Printf("DESCRIBE request")
|
log.Printf("DESCRIBE request")
|
||||||
|
|
||||||
// Verify reader credentials.
|
// Verify reader credentials.
|
||||||
@@ -133,7 +136,9 @@ func (sh *serverHandler) OnAnnounce(ctx *gortsplib.ServerHandlerOnAnnounceCtx) (
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called when receiving a SETUP request.
|
// called when receiving a SETUP request.
|
||||||
func (sh *serverHandler) OnSetup(ctx *gortsplib.ServerHandlerOnSetupCtx) (*base.Response, *gortsplib.ServerStream, error) {
|
func (sh *serverHandler) OnSetup(ctx *gortsplib.ServerHandlerOnSetupCtx) (
|
||||||
|
*base.Response, *gortsplib.ServerStream, error,
|
||||||
|
) {
|
||||||
log.Printf("SETUP request")
|
log.Printf("SETUP request")
|
||||||
|
|
||||||
// SETUP is used by both readers and publishers. In case of publishers, just return StatusOK.
|
// SETUP is used by both readers and publishers. In case of publishers, just return StatusOK.
|
||||||
@@ -168,7 +173,7 @@ func (sh *serverHandler) OnSetup(ctx *gortsplib.ServerHandlerOnSetupCtx) (*base.
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called when receiving a PLAY request.
|
// called when receiving a PLAY request.
|
||||||
func (sh *serverHandler) OnPlay(ctx *gortsplib.ServerHandlerOnPlayCtx) (*base.Response, error) {
|
func (sh *serverHandler) OnPlay(_ *gortsplib.ServerHandlerOnPlayCtx) (*base.Response, error) {
|
||||||
log.Printf("PLAY request")
|
log.Printf("PLAY request")
|
||||||
|
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
@@ -181,9 +186,9 @@ func (sh *serverHandler) OnRecord(ctx *gortsplib.ServerHandlerOnRecordCtx) (*bas
|
|||||||
log.Printf("RECORD request")
|
log.Printf("RECORD request")
|
||||||
|
|
||||||
// called when receiving a RTP packet
|
// called when receiving a RTP packet
|
||||||
ctx.Session.OnPacketRTPAny(func(medi *description.Media, forma format.Format, pkt *rtp.Packet) {
|
ctx.Session.OnPacketRTPAny(func(medi *description.Media, _ format.Format, pkt *rtp.Packet) {
|
||||||
// route the RTP packet to all readers
|
// route the RTP packet to all readers
|
||||||
sh.stream.WritePacketRTP(medi, pkt)
|
sh.stream.WritePacketRTP(medi, pkt) //nolint:errcheck
|
||||||
})
|
})
|
||||||
|
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
|
@@ -2,14 +2,12 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
"fmt"
|
|
||||||
"log"
|
"log"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/bluenviron/gortsplib/v4"
|
"github.com/bluenviron/gortsplib/v4"
|
||||||
"github.com/bluenviron/gortsplib/v4/pkg/format"
|
"github.com/bluenviron/gortsplib/v4/pkg/format"
|
||||||
"github.com/bluenviron/mediacommon/v2/pkg/codecs/g711"
|
"github.com/bluenviron/mediacommon/v2/pkg/codecs/g711"
|
||||||
"github.com/bluenviron/mediacommon/v2/pkg/formats/mpegts"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func multiplyAndDivide(v, m, d int64) int64 {
|
func multiplyAndDivide(v, m, d int64) int64 {
|
||||||
@@ -27,15 +25,6 @@ func randUint32() (uint32, error) {
|
|||||||
return uint32(b[0])<<24 | uint32(b[1])<<16 | uint32(b[2])<<8 | uint32(b[3]), nil
|
return uint32(b[0])<<24 | uint32(b[1])<<16 | uint32(b[2])<<8 | uint32(b[3]), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func findTrack(r *mpegts.Reader) (*mpegts.Track, error) {
|
|
||||||
for _, track := range r.Tracks() {
|
|
||||||
if _, ok := track.Codec.(*mpegts.CodecH264); ok {
|
|
||||||
return track, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil, fmt.Errorf("H264 track not found")
|
|
||||||
}
|
|
||||||
|
|
||||||
type audioStreamer struct {
|
type audioStreamer struct {
|
||||||
stream *gortsplib.ServerStream
|
stream *gortsplib.ServerStream
|
||||||
}
|
}
|
||||||
@@ -68,7 +57,8 @@ func (r *audioStreamer) run() {
|
|||||||
|
|
||||||
for range ticker.C {
|
for range ticker.C {
|
||||||
// get current timestamp
|
// get current timestamp
|
||||||
pts := multiplyAndDivide(int64(time.Since(start)), int64(r.stream.Desc.Medias[0].Formats[0].ClockRate()), int64(time.Second))
|
pts := multiplyAndDivide(int64(time.Since(start)),
|
||||||
|
int64(r.stream.Desc.Medias[0].Formats[0].ClockRate()), int64(time.Second))
|
||||||
|
|
||||||
// generate dummy LPCM audio samples
|
// generate dummy LPCM audio samples
|
||||||
samples := createDummyAudio(pts, prevPTS)
|
samples := createDummyAudio(pts, prevPTS)
|
||||||
@@ -98,6 +88,5 @@ func (r *audioStreamer) run() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
prevPTS = pts
|
prevPTS = pts
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -23,7 +24,7 @@ type serverHandler struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called when a connection is opened.
|
// called when a connection is opened.
|
||||||
func (sh *serverHandler) OnConnOpen(ctx *gortsplib.ServerHandlerOnConnOpenCtx) {
|
func (sh *serverHandler) OnConnOpen(_ *gortsplib.ServerHandlerOnConnOpenCtx) {
|
||||||
log.Printf("conn opened")
|
log.Printf("conn opened")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -33,17 +34,19 @@ func (sh *serverHandler) OnConnClose(ctx *gortsplib.ServerHandlerOnConnCloseCtx)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called when a session is opened.
|
// called when a session is opened.
|
||||||
func (sh *serverHandler) OnSessionOpen(ctx *gortsplib.ServerHandlerOnSessionOpenCtx) {
|
func (sh *serverHandler) OnSessionOpen(_ *gortsplib.ServerHandlerOnSessionOpenCtx) {
|
||||||
log.Printf("session opened")
|
log.Printf("session opened")
|
||||||
}
|
}
|
||||||
|
|
||||||
// called when a session is closed.
|
// called when a session is closed.
|
||||||
func (sh *serverHandler) OnSessionClose(ctx *gortsplib.ServerHandlerOnSessionCloseCtx) {
|
func (sh *serverHandler) OnSessionClose(_ *gortsplib.ServerHandlerOnSessionCloseCtx) {
|
||||||
log.Printf("session closed")
|
log.Printf("session closed")
|
||||||
}
|
}
|
||||||
|
|
||||||
// called when receiving a DESCRIBE request.
|
// called when receiving a DESCRIBE request.
|
||||||
func (sh *serverHandler) OnDescribe(ctx *gortsplib.ServerHandlerOnDescribeCtx) (*base.Response, *gortsplib.ServerStream, error) {
|
func (sh *serverHandler) OnDescribe(
|
||||||
|
_ *gortsplib.ServerHandlerOnDescribeCtx,
|
||||||
|
) (*base.Response, *gortsplib.ServerStream, error) {
|
||||||
log.Printf("DESCRIBE request")
|
log.Printf("DESCRIBE request")
|
||||||
|
|
||||||
sh.mutex.RLock()
|
sh.mutex.RLock()
|
||||||
@@ -55,7 +58,9 @@ func (sh *serverHandler) OnDescribe(ctx *gortsplib.ServerHandlerOnDescribeCtx) (
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called when receiving a SETUP request.
|
// called when receiving a SETUP request.
|
||||||
func (sh *serverHandler) OnSetup(ctx *gortsplib.ServerHandlerOnSetupCtx) (*base.Response, *gortsplib.ServerStream, error) {
|
func (sh *serverHandler) OnSetup(
|
||||||
|
_ *gortsplib.ServerHandlerOnSetupCtx,
|
||||||
|
) (*base.Response, *gortsplib.ServerStream, error) {
|
||||||
log.Printf("SETUP request")
|
log.Printf("SETUP request")
|
||||||
|
|
||||||
sh.mutex.RLock()
|
sh.mutex.RLock()
|
||||||
@@ -71,7 +76,7 @@ func (sh *serverHandler) OnPlay(ctx *gortsplib.ServerHandlerOnPlayCtx) (*base.Re
|
|||||||
log.Printf("PLAY request")
|
log.Printf("PLAY request")
|
||||||
|
|
||||||
// called when receiving a RTP packet
|
// called when receiving a RTP packet
|
||||||
ctx.Session.OnPacketRTPAny(func(m *description.Media, f format.Format, pkt *rtp.Packet) {
|
ctx.Session.OnPacketRTPAny(func(m *description.Media, _ format.Format, pkt *rtp.Packet) {
|
||||||
// decode timestamp
|
// decode timestamp
|
||||||
pts, ok := ctx.Session.PacketPTS2(m, pkt)
|
pts, ok := ctx.Session.PacketPTS2(m, pkt)
|
||||||
if !ok {
|
if !ok {
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -22,7 +23,7 @@ type serverHandler struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called when a connection is opened.
|
// called when a connection is opened.
|
||||||
func (sh *serverHandler) OnConnOpen(ctx *gortsplib.ServerHandlerOnConnOpenCtx) {
|
func (sh *serverHandler) OnConnOpen(_ *gortsplib.ServerHandlerOnConnOpenCtx) {
|
||||||
log.Printf("conn opened")
|
log.Printf("conn opened")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -32,17 +33,19 @@ func (sh *serverHandler) OnConnClose(ctx *gortsplib.ServerHandlerOnConnCloseCtx)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called when a session is opened.
|
// called when a session is opened.
|
||||||
func (sh *serverHandler) OnSessionOpen(ctx *gortsplib.ServerHandlerOnSessionOpenCtx) {
|
func (sh *serverHandler) OnSessionOpen(_ *gortsplib.ServerHandlerOnSessionOpenCtx) {
|
||||||
log.Printf("session opened")
|
log.Printf("session opened")
|
||||||
}
|
}
|
||||||
|
|
||||||
// called when a session is closed.
|
// called when a session is closed.
|
||||||
func (sh *serverHandler) OnSessionClose(ctx *gortsplib.ServerHandlerOnSessionCloseCtx) {
|
func (sh *serverHandler) OnSessionClose(_ *gortsplib.ServerHandlerOnSessionCloseCtx) {
|
||||||
log.Printf("session closed")
|
log.Printf("session closed")
|
||||||
}
|
}
|
||||||
|
|
||||||
// called when receiving a DESCRIBE request.
|
// called when receiving a DESCRIBE request.
|
||||||
func (sh *serverHandler) OnDescribe(ctx *gortsplib.ServerHandlerOnDescribeCtx) (*base.Response, *gortsplib.ServerStream, error) {
|
func (sh *serverHandler) OnDescribe(
|
||||||
|
_ *gortsplib.ServerHandlerOnDescribeCtx,
|
||||||
|
) (*base.Response, *gortsplib.ServerStream, error) {
|
||||||
log.Printf("DESCRIBE request")
|
log.Printf("DESCRIBE request")
|
||||||
|
|
||||||
sh.mutex.RLock()
|
sh.mutex.RLock()
|
||||||
@@ -54,7 +57,9 @@ func (sh *serverHandler) OnDescribe(ctx *gortsplib.ServerHandlerOnDescribeCtx) (
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called when receiving a SETUP request.
|
// called when receiving a SETUP request.
|
||||||
func (sh *serverHandler) OnSetup(ctx *gortsplib.ServerHandlerOnSetupCtx) (*base.Response, *gortsplib.ServerStream, error) {
|
func (sh *serverHandler) OnSetup(
|
||||||
|
_ *gortsplib.ServerHandlerOnSetupCtx,
|
||||||
|
) (*base.Response, *gortsplib.ServerStream, error) {
|
||||||
log.Printf("SETUP request")
|
log.Printf("SETUP request")
|
||||||
|
|
||||||
sh.mutex.RLock()
|
sh.mutex.RLock()
|
||||||
@@ -66,7 +71,7 @@ func (sh *serverHandler) OnSetup(ctx *gortsplib.ServerHandlerOnSetupCtx) (*base.
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called when receiving a PLAY request.
|
// called when receiving a PLAY request.
|
||||||
func (sh *serverHandler) OnPlay(ctx *gortsplib.ServerHandlerOnPlayCtx) (*base.Response, error) {
|
func (sh *serverHandler) OnPlay(_ *gortsplib.ServerHandlerOnPlayCtx) (*base.Response, error) {
|
||||||
log.Printf("PLAY request")
|
log.Printf("PLAY request")
|
||||||
|
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -30,7 +31,7 @@ type serverHandler struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called when a connection is opened.
|
// called when a connection is opened.
|
||||||
func (sh *serverHandler) OnConnOpen(ctx *gortsplib.ServerHandlerOnConnOpenCtx) {
|
func (sh *serverHandler) OnConnOpen(_ *gortsplib.ServerHandlerOnConnOpenCtx) {
|
||||||
log.Printf("conn opened")
|
log.Printf("conn opened")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -40,12 +41,12 @@ func (sh *serverHandler) OnConnClose(ctx *gortsplib.ServerHandlerOnConnCloseCtx)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called when a session is opened.
|
// called when a session is opened.
|
||||||
func (sh *serverHandler) OnSessionOpen(ctx *gortsplib.ServerHandlerOnSessionOpenCtx) {
|
func (sh *serverHandler) OnSessionOpen(_ *gortsplib.ServerHandlerOnSessionOpenCtx) {
|
||||||
log.Printf("session opened")
|
log.Printf("session opened")
|
||||||
}
|
}
|
||||||
|
|
||||||
// called when a session is closed.
|
// called when a session is closed.
|
||||||
func (sh *serverHandler) OnSessionClose(ctx *gortsplib.ServerHandlerOnSessionCloseCtx) {
|
func (sh *serverHandler) OnSessionClose(_ *gortsplib.ServerHandlerOnSessionCloseCtx) {
|
||||||
log.Printf("session closed")
|
log.Printf("session closed")
|
||||||
|
|
||||||
sh.mutex.Lock()
|
sh.mutex.Lock()
|
||||||
@@ -107,7 +108,9 @@ func (sh *serverHandler) OnAnnounce(ctx *gortsplib.ServerHandlerOnAnnounceCtx) (
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called when receiving a SETUP request.
|
// called when receiving a SETUP request.
|
||||||
func (sh *serverHandler) OnSetup(ctx *gortsplib.ServerHandlerOnSetupCtx) (*base.Response, *gortsplib.ServerStream, error) {
|
func (sh *serverHandler) OnSetup(
|
||||||
|
ctx *gortsplib.ServerHandlerOnSetupCtx,
|
||||||
|
) (*base.Response, *gortsplib.ServerStream, error) {
|
||||||
// prevent readers from using the server.
|
// prevent readers from using the server.
|
||||||
if ctx.Session.State() == gortsplib.ServerSessionStateInitial {
|
if ctx.Session.State() == gortsplib.ServerSessionStateInitial {
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
@@ -140,7 +143,7 @@ func (sh *serverHandler) OnRecord(ctx *gortsplib.ServerHandlerOnRecordCtx) (*bas
|
|||||||
}
|
}
|
||||||
|
|
||||||
// encode H264 access unit into MPEG-TS
|
// encode H264 access unit into MPEG-TS
|
||||||
sh.mpegtsMuxer.writeH264(au, pts)
|
sh.mpegtsMuxer.writeH264(au, pts) //nolint:errcheck
|
||||||
})
|
})
|
||||||
|
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
|
@@ -45,13 +45,13 @@ func (e *mpegtsMuxer) initialize() error {
|
|||||||
|
|
||||||
// close closes all the mpegtsMuxer resources.
|
// close closes all the mpegtsMuxer resources.
|
||||||
func (e *mpegtsMuxer) close() {
|
func (e *mpegtsMuxer) close() {
|
||||||
e.b.Flush()
|
e.b.Flush() //nolint:errcheck
|
||||||
e.f.Close()
|
e.f.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
// writeH264 writes a H264 access unit into MPEG-TS.
|
// writeH264 writes a H264 access unit into MPEG-TS.
|
||||||
func (e *mpegtsMuxer) writeH264(au [][]byte, pts int64) error {
|
func (e *mpegtsMuxer) writeH264(au [][]byte, pts int64) error {
|
||||||
var filteredAU [][]byte
|
var filteredAU [][]byte //nolint:prealloc
|
||||||
|
|
||||||
nonIDRPresent := false
|
nonIDRPresent := false
|
||||||
idrPresent := false
|
idrPresent := false
|
||||||
@@ -96,7 +96,8 @@ func (e *mpegtsMuxer) writeH264(au [][]byte, pts int64) error {
|
|||||||
if !idrPresent {
|
if !idrPresent {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
e.dtsExtractor = h264.NewDTSExtractor()
|
e.dtsExtractor = &h264.DTSExtractor{}
|
||||||
|
e.dtsExtractor.Initialize()
|
||||||
}
|
}
|
||||||
|
|
||||||
dts, err := e.dtsExtractor.Extract(au, pts)
|
dts, err := e.dtsExtractor.Extract(au, pts)
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -26,7 +27,7 @@ type serverHandler struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called when a connection is opened.
|
// called when a connection is opened.
|
||||||
func (sh *serverHandler) OnConnOpen(ctx *gortsplib.ServerHandlerOnConnOpenCtx) {
|
func (sh *serverHandler) OnConnOpen(_ *gortsplib.ServerHandlerOnConnOpenCtx) {
|
||||||
log.Printf("conn opened")
|
log.Printf("conn opened")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -36,7 +37,7 @@ func (sh *serverHandler) OnConnClose(ctx *gortsplib.ServerHandlerOnConnCloseCtx)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called when a session is opened.
|
// called when a session is opened.
|
||||||
func (sh *serverHandler) OnSessionOpen(ctx *gortsplib.ServerHandlerOnSessionOpenCtx) {
|
func (sh *serverHandler) OnSessionOpen(_ *gortsplib.ServerHandlerOnSessionOpenCtx) {
|
||||||
log.Printf("session opened")
|
log.Printf("session opened")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -56,7 +57,9 @@ func (sh *serverHandler) OnSessionClose(ctx *gortsplib.ServerHandlerOnSessionClo
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called when receiving a DESCRIBE request.
|
// called when receiving a DESCRIBE request.
|
||||||
func (sh *serverHandler) OnDescribe(ctx *gortsplib.ServerHandlerOnDescribeCtx) (*base.Response, *gortsplib.ServerStream, error) {
|
func (sh *serverHandler) OnDescribe(
|
||||||
|
_ *gortsplib.ServerHandlerOnDescribeCtx,
|
||||||
|
) (*base.Response, *gortsplib.ServerStream, error) {
|
||||||
log.Printf("DESCRIBE request")
|
log.Printf("DESCRIBE request")
|
||||||
|
|
||||||
sh.mutex.RLock()
|
sh.mutex.RLock()
|
||||||
@@ -105,7 +108,9 @@ func (sh *serverHandler) OnAnnounce(ctx *gortsplib.ServerHandlerOnAnnounceCtx) (
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called when receiving a SETUP request.
|
// called when receiving a SETUP request.
|
||||||
func (sh *serverHandler) OnSetup(ctx *gortsplib.ServerHandlerOnSetupCtx) (*base.Response, *gortsplib.ServerStream, error) {
|
func (sh *serverHandler) OnSetup(
|
||||||
|
ctx *gortsplib.ServerHandlerOnSetupCtx,
|
||||||
|
) (*base.Response, *gortsplib.ServerStream, error) {
|
||||||
log.Printf("SETUP request")
|
log.Printf("SETUP request")
|
||||||
|
|
||||||
// SETUP is used by both readers and publishers. In case of publishers, just return StatusOK.
|
// SETUP is used by both readers and publishers. In case of publishers, just return StatusOK.
|
||||||
@@ -131,7 +136,7 @@ func (sh *serverHandler) OnSetup(ctx *gortsplib.ServerHandlerOnSetupCtx) (*base.
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called when receiving a PLAY request.
|
// called when receiving a PLAY request.
|
||||||
func (sh *serverHandler) OnPlay(ctx *gortsplib.ServerHandlerOnPlayCtx) (*base.Response, error) {
|
func (sh *serverHandler) OnPlay(_ *gortsplib.ServerHandlerOnPlayCtx) (*base.Response, error) {
|
||||||
log.Printf("PLAY request")
|
log.Printf("PLAY request")
|
||||||
|
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
@@ -144,9 +149,9 @@ func (sh *serverHandler) OnRecord(ctx *gortsplib.ServerHandlerOnRecordCtx) (*bas
|
|||||||
log.Printf("RECORD request")
|
log.Printf("RECORD request")
|
||||||
|
|
||||||
// called when receiving a RTP packet
|
// called when receiving a RTP packet
|
||||||
ctx.Session.OnPacketRTPAny(func(medi *description.Media, forma format.Format, pkt *rtp.Packet) {
|
ctx.Session.OnPacketRTPAny(func(medi *description.Media, _ format.Format, pkt *rtp.Packet) {
|
||||||
// route the RTP packet to all readers
|
// route the RTP packet to all readers
|
||||||
sh.stream.WritePacketRTP(medi, pkt)
|
sh.stream.WritePacketRTP(medi, pkt) //nolint:errcheck
|
||||||
})
|
})
|
||||||
|
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
// Package main contains an example.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -25,7 +26,7 @@ type serverHandler struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called when a connection is opened.
|
// called when a connection is opened.
|
||||||
func (sh *serverHandler) OnConnOpen(ctx *gortsplib.ServerHandlerOnConnOpenCtx) {
|
func (sh *serverHandler) OnConnOpen(_ *gortsplib.ServerHandlerOnConnOpenCtx) {
|
||||||
log.Printf("conn opened")
|
log.Printf("conn opened")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -35,7 +36,7 @@ func (sh *serverHandler) OnConnClose(ctx *gortsplib.ServerHandlerOnConnCloseCtx)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called when a session is opened.
|
// called when a session is opened.
|
||||||
func (sh *serverHandler) OnSessionOpen(ctx *gortsplib.ServerHandlerOnSessionOpenCtx) {
|
func (sh *serverHandler) OnSessionOpen(_ *gortsplib.ServerHandlerOnSessionOpenCtx) {
|
||||||
log.Printf("session opened")
|
log.Printf("session opened")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -55,7 +56,9 @@ func (sh *serverHandler) OnSessionClose(ctx *gortsplib.ServerHandlerOnSessionClo
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called when receiving a DESCRIBE request.
|
// called when receiving a DESCRIBE request.
|
||||||
func (sh *serverHandler) OnDescribe(ctx *gortsplib.ServerHandlerOnDescribeCtx) (*base.Response, *gortsplib.ServerStream, error) {
|
func (sh *serverHandler) OnDescribe(
|
||||||
|
_ *gortsplib.ServerHandlerOnDescribeCtx,
|
||||||
|
) (*base.Response, *gortsplib.ServerStream, error) {
|
||||||
log.Printf("DESCRIBE request")
|
log.Printf("DESCRIBE request")
|
||||||
|
|
||||||
sh.mutex.RLock()
|
sh.mutex.RLock()
|
||||||
@@ -104,7 +107,9 @@ func (sh *serverHandler) OnAnnounce(ctx *gortsplib.ServerHandlerOnAnnounceCtx) (
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called when receiving a SETUP request.
|
// called when receiving a SETUP request.
|
||||||
func (sh *serverHandler) OnSetup(ctx *gortsplib.ServerHandlerOnSetupCtx) (*base.Response, *gortsplib.ServerStream, error) {
|
func (sh *serverHandler) OnSetup(ctx *gortsplib.ServerHandlerOnSetupCtx) (
|
||||||
|
*base.Response, *gortsplib.ServerStream, error,
|
||||||
|
) {
|
||||||
log.Printf("SETUP request")
|
log.Printf("SETUP request")
|
||||||
|
|
||||||
// SETUP is used by both readers and publishers. In case of publishers, just return StatusOK.
|
// SETUP is used by both readers and publishers. In case of publishers, just return StatusOK.
|
||||||
@@ -130,7 +135,7 @@ func (sh *serverHandler) OnSetup(ctx *gortsplib.ServerHandlerOnSetupCtx) (*base.
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called when receiving a PLAY request.
|
// called when receiving a PLAY request.
|
||||||
func (sh *serverHandler) OnPlay(ctx *gortsplib.ServerHandlerOnPlayCtx) (*base.Response, error) {
|
func (sh *serverHandler) OnPlay(_ *gortsplib.ServerHandlerOnPlayCtx) (*base.Response, error) {
|
||||||
log.Printf("PLAY request")
|
log.Printf("PLAY request")
|
||||||
|
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
@@ -143,9 +148,9 @@ func (sh *serverHandler) OnRecord(ctx *gortsplib.ServerHandlerOnRecordCtx) (*bas
|
|||||||
log.Printf("RECORD request")
|
log.Printf("RECORD request")
|
||||||
|
|
||||||
// called when receiving a RTP packet
|
// called when receiving a RTP packet
|
||||||
ctx.Session.OnPacketRTPAny(func(medi *description.Media, forma format.Format, pkt *rtp.Packet) {
|
ctx.Session.OnPacketRTPAny(func(medi *description.Media, _ format.Format, pkt *rtp.Packet) {
|
||||||
// route the RTP packet to all readers
|
// route the RTP packet to all readers
|
||||||
sh.stream.WritePacketRTP(medi, pkt)
|
sh.stream.WritePacketRTP(medi, pkt) //nolint:errcheck
|
||||||
})
|
})
|
||||||
|
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
|
@@ -81,11 +81,7 @@ func (e *Encoder) Encode(image []byte) ([]*rtp.Packet, error) {
|
|||||||
var data []byte
|
var data []byte
|
||||||
|
|
||||||
outer:
|
outer:
|
||||||
for {
|
for len(image) >= 2 {
|
||||||
if len(image) < 2 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
h0, h1 := image[0], image[1]
|
h0, h1 := image[0], image[1]
|
||||||
image = image[2:]
|
image = image[2:]
|
||||||
|
|
||||||
|
@@ -72,13 +72,13 @@ func (d *Decoder) decodeSlice(pkt *rtp.Packet) ([]byte, error) {
|
|||||||
an := pkt.Payload[2] >> 7
|
an := pkt.Payload[2] >> 7
|
||||||
if an != 0 {
|
if an != 0 {
|
||||||
d.resetFragments()
|
d.resetFragments()
|
||||||
return nil, fmt.Errorf("AN not supported yet")
|
return nil, fmt.Errorf("'AN' not supported yet")
|
||||||
}
|
}
|
||||||
|
|
||||||
n := (pkt.Payload[2] >> 6) & 0x01
|
n := (pkt.Payload[2] >> 6) & 0x01
|
||||||
if n != 0 {
|
if n != 0 {
|
||||||
d.resetFragments()
|
d.resetFragments()
|
||||||
return nil, fmt.Errorf("N not supported yet")
|
return nil, fmt.Errorf("'N' not supported yet")
|
||||||
}
|
}
|
||||||
|
|
||||||
b := (pkt.Payload[2] >> 4) & 0x01
|
b := (pkt.Payload[2] >> 4) & 0x01
|
||||||
|
@@ -6,11 +6,7 @@ import (
|
|||||||
|
|
||||||
func readKey(str string, separator byte) (string, string) {
|
func readKey(str string, separator byte) (string, string) {
|
||||||
i := 0
|
i := 0
|
||||||
for {
|
for i < len(str) && str[i] != '=' && str[i] != separator {
|
||||||
if i >= len(str) || str[i] == '=' || str[i] == separator {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
i++
|
i++
|
||||||
}
|
}
|
||||||
return str[:i], str[i:]
|
return str[:i], str[i:]
|
||||||
|
Reference in New Issue
Block a user