Skip to content

Commit f41b196

Browse files
authored
add resetFragments() to all fragment-based decoders (#637)
1 parent 2899668 commit f41b196

File tree

13 files changed

+128
-100
lines changed

13 files changed

+128
-100
lines changed

pkg/format/rtpac3/decoder.go

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -42,30 +42,32 @@ func (d *Decoder) Init() error {
4242
return nil
4343
}
4444

45+
func (d *Decoder) resetFragments() {
46+
d.fragments = d.fragments[:0]
47+
d.fragmentsSize = 0
48+
}
49+
4550
// Decode decodes frames from a RTP packet.
4651
// It returns the frames and the PTS of the first frame.
4752
func (d *Decoder) Decode(pkt *rtp.Packet) ([][]byte, error) {
4853
if len(pkt.Payload) < 2 {
49-
d.fragments = d.fragments[:0] // discard pending fragments
50-
d.fragmentsSize = 0
54+
d.resetFragments()
5155
return nil, fmt.Errorf("payload is too short")
5256
}
5357

5458
mbz := pkt.Payload[0] >> 2
5559
ft := pkt.Payload[0] & 0b11
5660

5761
if mbz != 0 {
58-
d.fragments = d.fragments[:0] // discard pending fragments
59-
d.fragmentsSize = 0
62+
d.resetFragments()
6063
return nil, fmt.Errorf("invalid MBZ: %v", mbz)
6164
}
6265

6366
var frames [][]byte
6467

6568
switch ft {
6669
case 0:
67-
d.fragments = d.fragments[:0] // discard pending fragments
68-
d.fragmentsSize = 0
70+
d.resetFragments()
6971
d.firstPacketReceived = true
7072

7173
buf := pkt.Payload[2:]
@@ -91,8 +93,7 @@ func (d *Decoder) Decode(pkt *rtp.Packet) ([][]byte, error) {
9193
}
9294

9395
case 1, 2:
94-
d.fragments = d.fragments[:0] // discard pending fragments
95-
d.fragmentsSize = 0
96+
d.resetFragments()
9697

9798
var syncInfo ac3.SyncInfo
9899
err := syncInfo.Unmarshal(pkt.Payload[2:])
@@ -122,8 +123,7 @@ func (d *Decoder) Decode(pkt *rtp.Packet) ([][]byte, error) {
122123
d.fragmentsExpected -= le
123124

124125
if d.fragmentsExpected < 0 {
125-
d.fragments = d.fragments[:0] // discard pending fragments
126-
d.fragmentsSize = 0
126+
d.resetFragments()
127127
return nil, fmt.Errorf("fragment is too big")
128128
}
129129

@@ -134,8 +134,7 @@ func (d *Decoder) Decode(pkt *rtp.Packet) ([][]byte, error) {
134134
}
135135

136136
frames = [][]byte{joinFragments(d.fragments, d.fragmentsSize)}
137-
d.fragments = d.fragments[:0]
138-
d.fragmentsSize = 0
137+
d.resetFragments()
139138
}
140139

141140
return frames, nil

pkg/format/rtpav1/decoder.go

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -46,17 +46,21 @@ func (d *Decoder) Init() error {
4646
return nil
4747
}
4848

49+
func (d *Decoder) resetFragments() {
50+
d.fragments = d.fragments[:0]
51+
d.fragmentsSize = 0
52+
}
53+
4954
func (d *Decoder) decodeOBUs(pkt *rtp.Packet) ([][]byte, error) {
5055
var av1header codecs.AV1Packet
5156
_, err := av1header.Unmarshal(pkt.Payload)
5257
if err != nil {
53-
d.fragments = d.fragments[:0] // discard pending fragments
54-
d.fragmentsSize = 0
58+
d.resetFragments()
5559
return nil, fmt.Errorf("invalid header: %w", err)
5660
}
5761

5862
if av1header.Z {
59-
if len(d.fragments) == 0 {
63+
if d.fragmentsSize == 0 {
6064
if !d.firstPacketReceived {
6165
return nil, ErrNonStartingPacketAndNoPrevious
6266
}
@@ -66,8 +70,7 @@ func (d *Decoder) decodeOBUs(pkt *rtp.Packet) ([][]byte, error) {
6670

6771
d.fragmentsSize += len(av1header.OBUElements[0])
6872
if d.fragmentsSize > av1.MaxTemporalUnitSize {
69-
d.fragments = d.fragments[:0]
70-
d.fragmentsSize = 0
73+
d.resetFragments()
7174
return nil, fmt.Errorf("OBU size (%d) is too big, maximum is %d", d.fragmentsSize, av1.MaxTemporalUnitSize)
7275
}
7376

@@ -82,17 +85,16 @@ func (d *Decoder) decodeOBUs(pkt *rtp.Packet) ([][]byte, error) {
8285
if len(av1header.OBUElements) > 0 {
8386
if d.fragmentsSize != 0 {
8487
obus = append(obus, joinFragments(d.fragments, d.fragmentsSize))
85-
d.fragments = d.fragments[:0]
86-
d.fragmentsSize = 0
88+
d.resetFragments()
8789
}
8890

8991
if av1header.Y {
9092
elementCount := len(av1header.OBUElements)
9193

9294
d.fragmentsSize += len(av1header.OBUElements[elementCount-1])
95+
9396
if d.fragmentsSize > av1.MaxTemporalUnitSize {
94-
d.fragments = d.fragments[:0]
95-
d.fragmentsSize = 0
97+
d.resetFragments()
9698
return nil, fmt.Errorf("OBU size (%d) is too big, maximum is %d", d.fragmentsSize, av1.MaxTemporalUnitSize)
9799
}
98100

@@ -103,8 +105,7 @@ func (d *Decoder) decodeOBUs(pkt *rtp.Packet) ([][]byte, error) {
103105
obus = append(obus, av1header.OBUElements...)
104106
} else if !av1header.Y {
105107
obus = append(obus, joinFragments(d.fragments, d.fragmentsSize))
106-
d.fragments = d.fragments[:0]
107-
d.fragmentsSize = 0
108+
d.resetFragments()
108109
}
109110

110111
if len(obus) == 0 {

pkg/format/rtph264/decoder.go

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,14 @@ func (d *Decoder) Init() error {
6363
return nil
6464
}
6565

66+
func (d *Decoder) resetFragments() {
67+
d.fragments = d.fragments[:0]
68+
d.fragmentsSize = 0
69+
}
70+
6671
func (d *Decoder) decodeNALUs(pkt *rtp.Packet) ([][]byte, error) {
6772
if len(pkt.Payload) < 1 {
68-
d.fragments = d.fragments[:0] // discard pending fragments
73+
d.resetFragments()
6974
return nil, fmt.Errorf("payload is too short")
7075
}
7176

@@ -82,7 +87,7 @@ func (d *Decoder) decodeNALUs(pkt *rtp.Packet) ([][]byte, error) {
8287
end := (pkt.Payload[1] >> 6) & 0x01
8388

8489
if start == 1 {
85-
d.fragments = d.fragments[:0] // discard pending fragments
90+
d.resetFragments()
8691

8792
if end != 0 {
8893
return nil, fmt.Errorf("invalid FU-A packet (can't contain both a start and end bit)")
@@ -97,7 +102,7 @@ func (d *Decoder) decodeNALUs(pkt *rtp.Packet) ([][]byte, error) {
97102
return nil, ErrMorePacketsNeeded
98103
}
99104

100-
if len(d.fragments) == 0 {
105+
if d.fragmentsSize == 0 {
101106
if !d.firstPacketReceived {
102107
return nil, ErrNonStartingPacketAndNoPrevious
103108
}
@@ -108,7 +113,7 @@ func (d *Decoder) decodeNALUs(pkt *rtp.Packet) ([][]byte, error) {
108113
d.fragmentsSize += len(pkt.Payload[2:])
109114

110115
if d.fragmentsSize > h264.MaxAccessUnitSize {
111-
d.fragments = d.fragments[:0]
116+
d.resetFragments()
112117
return nil, fmt.Errorf("NALU size (%d) is too big, maximum is %d", d.fragmentsSize, h264.MaxAccessUnitSize)
113118
}
114119

@@ -119,10 +124,10 @@ func (d *Decoder) decodeNALUs(pkt *rtp.Packet) ([][]byte, error) {
119124
}
120125

121126
nalus = [][]byte{joinFragments(d.fragments, d.fragmentsSize)}
122-
d.fragments = d.fragments[:0]
127+
d.resetFragments()
123128

124129
case h264.NALUTypeSTAPA:
125-
d.fragments = d.fragments[:0] // discard pending fragments
130+
d.resetFragments()
126131

127132
payload := pkt.Payload[1:]
128133

@@ -159,12 +164,12 @@ func (d *Decoder) decodeNALUs(pkt *rtp.Packet) ([][]byte, error) {
159164

160165
case h264.NALUTypeSTAPB, h264.NALUTypeMTAP16,
161166
h264.NALUTypeMTAP24, h264.NALUTypeFUB:
162-
d.fragments = d.fragments[:0] // discard pending fragments
167+
d.resetFragments()
163168
d.firstPacketReceived = true
164169
return nil, fmt.Errorf("packet type not supported (%v)", typ)
165170

166171
default:
167-
d.fragments = d.fragments[:0] // discard pending fragments
172+
d.resetFragments()
168173
d.firstPacketReceived = true
169174
nalus = [][]byte{pkt.Payload}
170175
}

pkg/format/rtph265/decoder.go

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ type Decoder struct {
3535
MaxDONDiff int
3636

3737
firstPacketReceived bool
38-
fragmentsSize int
3938
fragments [][]byte
39+
fragmentsSize int
4040

4141
// for Decode()
4242
frameBuffer [][]byte
@@ -52,9 +52,14 @@ func (d *Decoder) Init() error {
5252
return nil
5353
}
5454

55+
func (d *Decoder) resetFragments() {
56+
d.fragments = d.fragments[:0]
57+
d.fragmentsSize = 0
58+
}
59+
5560
func (d *Decoder) decodeNALUs(pkt *rtp.Packet) ([][]byte, error) {
5661
if len(pkt.Payload) < 2 {
57-
d.fragments = d.fragments[:0] // discard pending fragments
62+
d.resetFragments()
5863
return nil, fmt.Errorf("payload is too short")
5964
}
6065

@@ -63,7 +68,7 @@ func (d *Decoder) decodeNALUs(pkt *rtp.Packet) ([][]byte, error) {
6368

6469
switch typ {
6570
case h265.NALUType_AggregationUnit:
66-
d.fragments = d.fragments[:0] // discard pending fragments
71+
d.resetFragments()
6772

6873
payload := pkt.Payload[2:]
6974

@@ -95,15 +100,15 @@ func (d *Decoder) decodeNALUs(pkt *rtp.Packet) ([][]byte, error) {
95100

96101
case h265.NALUType_FragmentationUnit:
97102
if len(pkt.Payload) < 3 {
98-
d.fragments = d.fragments[:0] // discard pending fragments
103+
d.resetFragments()
99104
return nil, fmt.Errorf("payload is too short")
100105
}
101106

102107
start := pkt.Payload[2] >> 7
103108
end := (pkt.Payload[2] >> 6) & 0x01
104109

105110
if start == 1 {
106-
d.fragments = d.fragments[:0] // discard pending fragments
111+
d.resetFragments()
107112

108113
if end != 0 {
109114
return nil, fmt.Errorf("invalid fragmentation unit (can't contain both a start and end bit)")
@@ -118,7 +123,7 @@ func (d *Decoder) decodeNALUs(pkt *rtp.Packet) ([][]byte, error) {
118123
return nil, ErrMorePacketsNeeded
119124
}
120125

121-
if len(d.fragments) == 0 {
126+
if d.fragmentsSize == 0 {
122127
if !d.firstPacketReceived {
123128
return nil, ErrNonStartingPacketAndNoPrevious
124129
}
@@ -128,7 +133,7 @@ func (d *Decoder) decodeNALUs(pkt *rtp.Packet) ([][]byte, error) {
128133

129134
d.fragmentsSize += len(pkt.Payload[3:])
130135
if d.fragmentsSize > h265.MaxAccessUnitSize {
131-
d.fragments = d.fragments[:0]
136+
d.resetFragments()
132137
return nil, fmt.Errorf("NALU size (%d) is too big, maximum is %d", d.fragmentsSize, h265.MaxAccessUnitSize)
133138
}
134139

@@ -139,16 +144,14 @@ func (d *Decoder) decodeNALUs(pkt *rtp.Packet) ([][]byte, error) {
139144
}
140145

141146
nalus = [][]byte{joinFragments(d.fragments, d.fragmentsSize)}
142-
d.fragments = d.fragments[:0]
147+
d.resetFragments()
143148

144149
case h265.NALUType_PACI:
145-
d.fragments = d.fragments[:0] // discard pending fragments
146-
d.firstPacketReceived = true
150+
d.resetFragments()
147151
return nil, fmt.Errorf("PACI packets are not supported (yet)")
148152

149153
default:
150-
d.fragments = d.fragments[:0] // discard pending fragments
151-
d.firstPacketReceived = true
154+
d.resetFragments()
152155
nalus = [][]byte{pkt.Payload}
153156
}
154157

pkg/format/rtpmjpeg/decoder.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -163,8 +163,8 @@ func joinFragments(fragments [][]byte, size int) []byte {
163163
// Specification: https://datatracker.ietf.org/doc/html/rfc2435
164164
type Decoder struct {
165165
firstPacketReceived bool
166-
fragmentsSize int
167166
fragments [][]byte
167+
fragmentsSize int
168168
firstJpegHeader *headerJPEG
169169
quantizationTables [][]byte
170170
}
@@ -174,6 +174,11 @@ func (d *Decoder) Init() error {
174174
return nil
175175
}
176176

177+
func (d *Decoder) resetFragments() {
178+
d.fragments = d.fragments[:0]
179+
d.fragmentsSize = 0
180+
}
181+
177182
// Decode decodes an image from a RTP packet.
178183
func (d *Decoder) Decode(pkt *rtp.Packet) ([]byte, error) {
179184
byts := pkt.Payload
@@ -194,8 +199,7 @@ func (d *Decoder) Decode(pkt *rtp.Packet) ([]byte, error) {
194199
}
195200

196201
if jh.FragmentOffset == 0 {
197-
d.fragments = d.fragments[:0] // discard pending fragments
198-
d.fragmentsSize = 0
202+
d.resetFragments()
199203
d.firstPacketReceived = true
200204

201205
if jh.Quantization >= 128 {
@@ -219,8 +223,7 @@ func (d *Decoder) Decode(pkt *rtp.Packet) ([]byte, error) {
219223
return nil, ErrNonStartingPacketAndNoPrevious
220224
}
221225

222-
d.fragments = d.fragments[:0] // discard pending fragments
223-
d.fragmentsSize = 0
226+
d.resetFragments()
224227
return nil, fmt.Errorf("received wrong fragment")
225228
}
226229

@@ -237,8 +240,7 @@ func (d *Decoder) Decode(pkt *rtp.Packet) ([]byte, error) {
237240
}
238241

239242
data := joinFragments(d.fragments, d.fragmentsSize)
240-
d.fragments = d.fragments[:0]
241-
d.fragmentsSize = 0
243+
d.resetFragments()
242244

243245
var buf []byte
244246

0 commit comments

Comments
 (0)