From 4e789ff6b967ee09bfdbafdddc80863a293b25b7 Mon Sep 17 00:00:00 2001 From: aler9 <46489434+aler9@users.noreply.github.com> Date: Sat, 5 Aug 2023 13:51:01 +0200 Subject: [PATCH] update mediacommon --- .../mpegts_muxer.go | 1 - .../mpegts_muxer.go | 1 - .../server-h264-save-to-disk/mpegts_muxer.go | 1 - go.mod | 4 +-- go.sum | 8 +++--- pkg/formats/rtph264/decoder.go | 27 ++++++++++++++++--- pkg/formats/rtph265/decoder.go | 26 +++++++++++++++--- pkg/formats/rtpmpeg2audio/decoder.go | 4 +-- pkg/formats/rtpmpeg2audio/encoder.go | 4 +-- pkg/formats/rtpmpeg4audiogeneric/decoder.go | 3 ++- pkg/formats/rtpmpeg4audiolatm/decoder.go | 3 ++- 11 files changed, 59 insertions(+), 23 deletions(-) diff --git a/examples/client-read-format-h264-save-to-disk/mpegts_muxer.go b/examples/client-read-format-h264-save-to-disk/mpegts_muxer.go index 76d1a7e6..4a3d1304 100644 --- a/examples/client-read-format-h264-save-to-disk/mpegts_muxer.go +++ b/examples/client-read-format-h264-save-to-disk/mpegts_muxer.go @@ -37,7 +37,6 @@ func newMPEGTSMuxer(sps []byte, pps []byte) (*mpegtsMuxer, error) { b := bufio.NewWriter(f) track := &mpegts.Track{ - PID: 256, Codec: &mpegts.CodecH264{}, } diff --git a/examples/client-read-format-mpeg4audio-save-to-disk/mpegts_muxer.go b/examples/client-read-format-mpeg4audio-save-to-disk/mpegts_muxer.go index 82b866b7..318d4820 100644 --- a/examples/client-read-format-mpeg4audio-save-to-disk/mpegts_muxer.go +++ b/examples/client-read-format-mpeg4audio-save-to-disk/mpegts_muxer.go @@ -32,7 +32,6 @@ func newMPEGTSMuxer(config *mpeg4audio.Config) (*mpegtsMuxer, error) { b := bufio.NewWriter(f) track := &mpegts.Track{ - PID: 256, Codec: &mpegts.CodecMPEG4Audio{ Config: *config, }, diff --git a/examples/server-h264-save-to-disk/mpegts_muxer.go b/examples/server-h264-save-to-disk/mpegts_muxer.go index 83468611..e4840431 100644 --- a/examples/server-h264-save-to-disk/mpegts_muxer.go +++ b/examples/server-h264-save-to-disk/mpegts_muxer.go @@ -37,7 +37,6 @@ func newMPEGTSMuxer(sps []byte, pps []byte) (*mpegtsMuxer, error) { b := bufio.NewWriter(f) track := &mpegts.Track{ - PID: 256, Codec: &mpegts.CodecH264{}, } diff --git a/go.mod b/go.mod index 219e71aa..bb1460e9 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/bluenviron/gortsplib/v3 go 1.18 require ( - github.com/bluenviron/mediacommon v0.7.1-0.20230730144331-10b74a4f6eda + github.com/bluenviron/mediacommon v0.7.1-0.20230805114828-bee33f3b286d github.com/google/uuid v1.3.0 github.com/pion/rtcp v1.2.10 github.com/pion/rtp v1.8.1 @@ -14,7 +14,7 @@ require ( require ( github.com/asticode/go-astikit v0.30.0 // indirect - github.com/asticode/go-astits v1.11.1-0.20230727094110-0df190a2dd87 // indirect + github.com/asticode/go-astits v1.12.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/pion/randutil v0.1.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect diff --git a/go.sum b/go.sum index f3bfb1ea..7ab74127 100644 --- a/go.sum +++ b/go.sum @@ -1,9 +1,9 @@ github.com/asticode/go-astikit v0.30.0 h1:DkBkRQRIxYcknlaU7W7ksNfn4gMFsB0tqMJflxkRsZA= github.com/asticode/go-astikit v0.30.0/go.mod h1:h4ly7idim1tNhaVkdVBeXQZEE3L0xblP7fCWbgwipF0= -github.com/asticode/go-astits v1.11.1-0.20230727094110-0df190a2dd87 h1:SCAqalLhgKGDghGz03yYVWr8TavHluP/i7IwshKU9yA= -github.com/asticode/go-astits v1.11.1-0.20230727094110-0df190a2dd87/go.mod h1:QSHmknZ51pf6KJdHKZHJTLlMegIrhega3LPWz3ND/iI= -github.com/bluenviron/mediacommon v0.7.1-0.20230730144331-10b74a4f6eda h1:+ungCWRNDjsy/CVL1l/UjAj4vYL4+NIJQoJJWbR3Xw8= -github.com/bluenviron/mediacommon v0.7.1-0.20230730144331-10b74a4f6eda/go.mod h1:tfk0qGPhqnOxVCrElu8ct3LKQn6Cj4Tpu3zbbJBTKj4= +github.com/asticode/go-astits v1.12.0 h1:BiefTgVEyPgEB8nT6J+Sys/uxE4H/a04SW/aedpOpPc= +github.com/asticode/go-astits v1.12.0/go.mod h1:QSHmknZ51pf6KJdHKZHJTLlMegIrhega3LPWz3ND/iI= +github.com/bluenviron/mediacommon v0.7.1-0.20230805114828-bee33f3b286d h1:ye0ze/XtVq23NwgxV/PWcjtagcZXTKZq+V6ZBT0HoTY= +github.com/bluenviron/mediacommon v0.7.1-0.20230805114828-bee33f3b286d/go.mod h1:8Y0rvMJDUCgqDegYrUxG1rbumB6DV0TZ98Rw9mowIrA= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= diff --git a/pkg/formats/rtph264/decoder.go b/pkg/formats/rtph264/decoder.go index 645a94ba..b9ee40a7 100644 --- a/pkg/formats/rtph264/decoder.go +++ b/pkg/formats/rtph264/decoder.go @@ -44,8 +44,9 @@ type Decoder struct { annexBMode bool // for DecodeUntilMarker() - frameBuffer [][]byte - frameBufferLen int + frameBuffer [][]byte + frameBufferLen int + frameBufferSize int } // Init initializes the decoder. @@ -102,9 +103,10 @@ func (d *Decoder) Decode(pkt *rtp.Packet) ([][]byte, time.Duration, error) { } d.fragmentsSize += len(pkt.Payload[2:]) - if d.fragmentsSize > h264.MaxNALUSize { + + if d.fragmentsSize > h264.MaxAccessUnitSize { d.fragments = d.fragments[:0] - return nil, 0, fmt.Errorf("NALU size (%d) is too big, maximum is %d", d.fragmentsSize, h264.MaxNALUSize) + return nil, 0, fmt.Errorf("NALU size (%d) is too big, maximum is %d", d.fragmentsSize, h264.MaxAccessUnitSize) } d.fragments = append(d.fragments, pkt.Payload[2:]) @@ -181,12 +183,28 @@ func (d *Decoder) DecodeUntilMarker(pkt *rtp.Packet) ([][]byte, time.Duration, e if (d.frameBufferLen + l) > h264.MaxNALUsPerAccessUnit { d.frameBuffer = nil d.frameBufferLen = 0 + d.frameBufferSize = 0 return nil, 0, fmt.Errorf("NALU count exceeds maximum allowed (%d)", h264.MaxNALUsPerAccessUnit) } + addSize := 0 + + for _, nalu := range nalus { + addSize += len(nalu) + } + + if (d.frameBufferSize + addSize) > h264.MaxAccessUnitSize { + d.frameBuffer = nil + d.frameBufferLen = 0 + d.frameBufferSize = 0 + return nil, 0, fmt.Errorf("access unit size (%d) is too big, maximum is %d", + d.frameBufferSize+addSize, h264.MaxAccessUnitSize) + } + d.frameBuffer = append(d.frameBuffer, nalus...) d.frameBufferLen += l + d.frameBufferSize += addSize if !pkt.Marker { return nil, 0, ErrMorePacketsNeeded @@ -197,6 +215,7 @@ func (d *Decoder) DecodeUntilMarker(pkt *rtp.Packet) ([][]byte, time.Duration, e // do not reuse frameBuffer to avoid race conditions d.frameBuffer = nil d.frameBufferLen = 0 + d.frameBufferSize = 0 return ret, pts, nil } diff --git a/pkg/formats/rtph265/decoder.go b/pkg/formats/rtph265/decoder.go index 9e492030..40389781 100644 --- a/pkg/formats/rtph265/decoder.go +++ b/pkg/formats/rtph265/decoder.go @@ -42,8 +42,9 @@ type Decoder struct { fragments [][]byte // for DecodeUntilMarker() - frameBuffer [][]byte - frameBufferLen int + frameBuffer [][]byte + frameBufferLen int + frameBufferSize int } // Init initializes the decoder. @@ -132,9 +133,9 @@ func (d *Decoder) Decode(pkt *rtp.Packet) ([][]byte, time.Duration, error) { } d.fragmentsSize += len(pkt.Payload[3:]) - if d.fragmentsSize > h265.MaxNALUSize { + if d.fragmentsSize > h265.MaxAccessUnitSize { d.fragments = d.fragments[:0] - return nil, 0, fmt.Errorf("NALU size (%d) is too big, maximum is %d", d.fragmentsSize, h265.MaxNALUSize) + return nil, 0, fmt.Errorf("NALU size (%d) is too big, maximum is %d", d.fragmentsSize, h265.MaxAccessUnitSize) } d.fragments = append(d.fragments, pkt.Payload[3:]) @@ -173,12 +174,28 @@ func (d *Decoder) DecodeUntilMarker(pkt *rtp.Packet) ([][]byte, time.Duration, e if (d.frameBufferLen + l) > h265.MaxNALUsPerAccessUnit { d.frameBuffer = nil d.frameBufferLen = 0 + d.frameBufferSize = 0 return nil, 0, fmt.Errorf("NALU count exceeds maximum allowed (%d)", h265.MaxNALUsPerAccessUnit) } + addSize := 0 + + for _, nalu := range nalus { + addSize += len(nalu) + } + + if (d.frameBufferSize + addSize) > h265.MaxAccessUnitSize { + d.frameBuffer = nil + d.frameBufferLen = 0 + d.frameBufferSize = 0 + return nil, 0, fmt.Errorf("access unit size (%d) is too big, maximum is %d", + d.frameBufferSize+addSize, h265.MaxAccessUnitSize) + } + d.frameBuffer = append(d.frameBuffer, nalus...) d.frameBufferLen += l + d.frameBufferSize += addSize if !pkt.Marker { return nil, 0, ErrMorePacketsNeeded @@ -189,6 +206,7 @@ func (d *Decoder) DecodeUntilMarker(pkt *rtp.Packet) ([][]byte, time.Duration, e // do not reuse frameBuffer to avoid race conditions d.frameBuffer = nil d.frameBufferLen = 0 + d.frameBufferSize = 0 return ret, pts, nil } diff --git a/pkg/formats/rtpmpeg2audio/decoder.go b/pkg/formats/rtpmpeg2audio/decoder.go index d76f2f66..16b2839f 100644 --- a/pkg/formats/rtpmpeg2audio/decoder.go +++ b/pkg/formats/rtpmpeg2audio/decoder.go @@ -5,7 +5,7 @@ import ( "fmt" "time" - "github.com/bluenviron/mediacommon/pkg/codecs/mpeg2audio" + "github.com/bluenviron/mediacommon/pkg/codecs/mpeg1audio" "github.com/pion/rtp" "github.com/bluenviron/gortsplib/v3/pkg/rtptime" @@ -72,7 +72,7 @@ func (d *Decoder) Decode(pkt *rtp.Packet) ([][]byte, time.Duration, error) { buf := pkt.Payload[4:] for { - var h mpeg2audio.FrameHeader + var h mpeg1audio.FrameHeader err := h.Unmarshal(buf) if err != nil { return nil, 0, err diff --git a/pkg/formats/rtpmpeg2audio/encoder.go b/pkg/formats/rtpmpeg2audio/encoder.go index f136f3fc..463efd70 100644 --- a/pkg/formats/rtpmpeg2audio/encoder.go +++ b/pkg/formats/rtpmpeg2audio/encoder.go @@ -4,7 +4,7 @@ import ( "crypto/rand" "time" - "github.com/bluenviron/mediacommon/pkg/codecs/mpeg2audio" + "github.com/bluenviron/mediacommon/pkg/codecs/mpeg1audio" "github.com/pion/rtp" "github.com/bluenviron/gortsplib/v3/pkg/rtptime" @@ -105,7 +105,7 @@ func (e *Encoder) Encode(frames [][]byte, pts time.Duration) ([]*rtp.Packet, err rets = append(rets, pkts...) for _, frame := range batch { - var h mpeg2audio.FrameHeader + var h mpeg1audio.FrameHeader err := h.Unmarshal(frame) if err != nil { return nil, err diff --git a/pkg/formats/rtpmpeg4audiogeneric/decoder.go b/pkg/formats/rtpmpeg4audiogeneric/decoder.go index 12bf8da2..2b5b8f96 100644 --- a/pkg/formats/rtpmpeg4audiogeneric/decoder.go +++ b/pkg/formats/rtpmpeg4audiogeneric/decoder.go @@ -124,7 +124,8 @@ func (d *Decoder) Decode(pkt *rtp.Packet) ([][]byte, time.Duration, error) { d.fragmentsSize += int(dataLens[0]) if d.fragmentsSize > mpeg4audio.MaxAccessUnitSize { d.fragments = d.fragments[:0] // discard pending fragments - return nil, 0, fmt.Errorf("AU size (%d) is too big, maximum is %d", d.fragmentsSize, mpeg4audio.MaxAccessUnitSize) + return nil, 0, fmt.Errorf("access unit size (%d) is too big, maximum is %d", + d.fragmentsSize, mpeg4audio.MaxAccessUnitSize) } d.fragments = append(d.fragments, payload[:dataLens[0]]) diff --git a/pkg/formats/rtpmpeg4audiolatm/decoder.go b/pkg/formats/rtpmpeg4audiolatm/decoder.go index fda71682..086bde65 100644 --- a/pkg/formats/rtpmpeg4audiolatm/decoder.go +++ b/pkg/formats/rtpmpeg4audiolatm/decoder.go @@ -66,7 +66,8 @@ func (d *Decoder) Decode(pkt *rtp.Packet) ([]byte, time.Duration, error) { } else { if pl > mpeg4audio.MaxAccessUnitSize { d.fragments = d.fragments[:0] // discard pending fragments - return nil, 0, fmt.Errorf("AU size (%d) is too big, maximum is %d", pl, mpeg4audio.MaxAccessUnitSize) + return nil, 0, fmt.Errorf("access unit size (%d) is too big, maximum is %d", + pl, mpeg4audio.MaxAccessUnitSize) } d.fragments = append(d.fragments, buf)