Skip to content

Commit fa1f5d9

Browse files
committed
SampleBuilder: Return header of sample head packet
To get RTP extension data associated with the sample.
1 parent dbf2254 commit fa1f5d9

File tree

3 files changed

+27
-21
lines changed

3 files changed

+27
-21
lines changed

pkg/media/media.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ type Sample struct {
1818
PacketTimestamp uint32
1919
PrevDroppedPackets uint16
2020
Metadata interface{}
21+
RTPHeader *rtp.Header
2122
}
2223

2324
// Writer defines an interface to handle

pkg/media/samplebuilder/samplebuilder.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -272,13 +272,17 @@ func (s *SampleBuilder) buildSample(purgingBuffers bool) *media.Sample {
272272
// merge all the buffers into a sample
273273
data := []byte{}
274274
var metadata interface{}
275+
var rtpHeader rtp.Header
275276
for i := consume.head; i != consume.tail; i++ {
276277
p, err := s.depacketizer.Unmarshal(s.buffer[i].Payload)
277278
if err != nil {
278279
return nil
279280
}
280-
if i == consume.head && s.packetHeadHandler != nil {
281-
metadata = s.packetHeadHandler(s.depacketizer)
281+
if i == consume.head {
282+
if s.packetHeadHandler != nil {
283+
metadata = s.packetHeadHandler(s.depacketizer)
284+
}
285+
rtpHeader = s.buffer[i].Header.Clone()
282286
}
283287

284288
data = append(data, p...)
@@ -291,6 +295,7 @@ func (s *SampleBuilder) buildSample(purgingBuffers bool) *media.Sample {
291295
PacketTimestamp: sampleTimestamp,
292296
PrevDroppedPackets: s.droppedPackets,
293297
Metadata: metadata,
298+
RTPHeader: &rtpHeader,
294299
}
295300

296301
s.droppedPackets = 0

pkg/media/samplebuilder/samplebuilder_test.go

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,8 @@ func TestSampleBuilder(t *testing.T) {
8484
{Header: rtp.Header{SequenceNumber: 5002, Timestamp: 7}, Payload: []byte{0x03}},
8585
},
8686
samples: []*media.Sample{
87-
{Data: []byte{0x01}, Duration: time.Second, PacketTimestamp: 5},
88-
{Data: []byte{0x02}, Duration: time.Second, PacketTimestamp: 6},
87+
{Data: []byte{0x01}, Duration: time.Second, PacketTimestamp: 5, RTPHeader: &rtp.Header{SequenceNumber: 5000, Timestamp: 5}},
88+
{Data: []byte{0x02}, Duration: time.Second, PacketTimestamp: 6, RTPHeader: &rtp.Header{SequenceNumber: 5001, Timestamp: 6}},
8989
},
9090
maxLate: 50,
9191
maxLateTimestamp: 0,
@@ -102,7 +102,7 @@ func TestSampleBuilder(t *testing.T) {
102102
{Header: rtp.Header{SequenceNumber: 5012, Timestamp: 17}, Payload: []byte{0x07}},
103103
},
104104
samples: []*media.Sample{
105-
{Data: []byte{0x01}, Duration: time.Second * 2, PacketTimestamp: 5},
105+
{Data: []byte{0x01}, Duration: time.Second * 2, PacketTimestamp: 5, RTPHeader: &rtp.Header{SequenceNumber: 5000, Timestamp: 5, Marker: true}},
106106
},
107107
maxLate: 5,
108108
maxLateTimestamp: 0,
@@ -134,8 +134,8 @@ func TestSampleBuilder(t *testing.T) {
134134
{Header: rtp.Header{SequenceNumber: 5012, Timestamp: 17}, Payload: []byte{0x07}},
135135
},
136136
samples: []*media.Sample{
137-
{Data: []byte{0x01}, Duration: time.Second * 2, PacketTimestamp: 5},
138-
{Data: []byte{0x02}, Duration: time.Second * 2, PacketTimestamp: 7, PrevDroppedPackets: 1},
137+
{Data: []byte{0x01}, Duration: time.Second * 2, PacketTimestamp: 5, RTPHeader: &rtp.Header{SequenceNumber: 5000, Timestamp: 5, Marker: true}},
138+
{Data: []byte{0x02}, Duration: time.Second * 2, PacketTimestamp: 7, PrevDroppedPackets: 1, RTPHeader: &rtp.Header{SequenceNumber: 5002, Timestamp: 7, Marker: true}},
139139
},
140140
maxLate: 5,
141141
maxLateTimestamp: 0,
@@ -149,8 +149,8 @@ func TestSampleBuilder(t *testing.T) {
149149
{Header: rtp.Header{SequenceNumber: 5003, Timestamp: 7}, Payload: []byte{0x04}},
150150
},
151151
samples: []*media.Sample{
152-
{Data: []byte{0x01}, Duration: time.Second, PacketTimestamp: 5},
153-
{Data: []byte{0x02, 0x03}, Duration: time.Second, PacketTimestamp: 6},
152+
{Data: []byte{0x01}, Duration: time.Second, PacketTimestamp: 5, RTPHeader: &rtp.Header{SequenceNumber: 5000, Timestamp: 5}},
153+
{Data: []byte{0x02, 0x03}, Duration: time.Second, PacketTimestamp: 6, RTPHeader: &rtp.Header{SequenceNumber: 5001, Timestamp: 6}},
154154
},
155155
maxLate: 50,
156156
maxLateTimestamp: 0,
@@ -203,11 +203,11 @@ func TestSampleBuilder(t *testing.T) {
203203
{Header: rtp.Header{SequenceNumber: 5005, Timestamp: 6}, Payload: []byte{0x06}},
204204
},
205205
samples: []*media.Sample{
206-
{Data: []byte{0x01}, Duration: time.Second, PacketTimestamp: 1},
207-
{Data: []byte{0x02}, Duration: time.Second, PacketTimestamp: 2},
208-
{Data: []byte{0x03}, Duration: time.Second, PacketTimestamp: 3},
209-
{Data: []byte{0x04}, Duration: time.Second, PacketTimestamp: 4},
210-
{Data: []byte{0x05}, Duration: time.Second, PacketTimestamp: 5},
206+
{Data: []byte{0x01}, Duration: time.Second, PacketTimestamp: 1, RTPHeader: &rtp.Header{SequenceNumber: 5000, Timestamp: 1}},
207+
{Data: []byte{0x02}, Duration: time.Second, PacketTimestamp: 2, RTPHeader: &rtp.Header{SequenceNumber: 5001, Timestamp: 2}},
208+
{Data: []byte{0x03}, Duration: time.Second, PacketTimestamp: 3, RTPHeader: &rtp.Header{SequenceNumber: 5002, Timestamp: 3}},
209+
{Data: []byte{0x04}, Duration: time.Second, PacketTimestamp: 4, RTPHeader: &rtp.Header{SequenceNumber: 5003, Timestamp: 4}},
210+
{Data: []byte{0x05}, Duration: time.Second, PacketTimestamp: 5, RTPHeader: &rtp.Header{SequenceNumber: 5004, Timestamp: 5}},
211211
},
212212
maxLate: 50,
213213
maxLateTimestamp: 0,
@@ -225,7 +225,7 @@ func TestSampleBuilder(t *testing.T) {
225225
{Header: rtp.Header{SequenceNumber: 5017, Timestamp: 7001}, Payload: []byte{0x05}},
226226
},
227227
samples: []*media.Sample{
228-
{Data: []byte{0x04, 0x05}, Duration: time.Second * time.Duration(2), PacketTimestamp: 4000, PrevDroppedPackets: 13},
228+
{Data: []byte{0x04, 0x05}, Duration: time.Second * time.Duration(2), PacketTimestamp: 4000, PrevDroppedPackets: 13, RTPHeader: &rtp.Header{SequenceNumber: 5013, Timestamp: 4000}},
229229
},
230230
withHeadChecker: true,
231231
headBytes: []byte{0x04},
@@ -247,7 +247,7 @@ func TestSampleBuilder(t *testing.T) {
247247
withHeadChecker: true,
248248
headBytes: []byte{1},
249249
samples: []*media.Sample{
250-
{Data: []byte{1, 2, 3}, Duration: 0, PacketTimestamp: 1, PrevDroppedPackets: 0}, // first sample
250+
{Data: []byte{1, 2, 3}, Duration: 0, PacketTimestamp: 1, PrevDroppedPackets: 0, RTPHeader: &rtp.Header{SequenceNumber: 5000, Timestamp: 1}}, // first sample
251251
},
252252
maxLate: 50,
253253
maxLateTimestamp: 2000,
@@ -265,7 +265,7 @@ func TestSampleBuilder(t *testing.T) {
265265
withHeadChecker: true,
266266
headBytes: []byte{1},
267267
samples: []*media.Sample{
268-
{Data: []byte{1, 2}, Duration: 0, PacketTimestamp: 1, PrevDroppedPackets: 0}, // 1st sample
268+
{Data: []byte{1, 2}, Duration: 0, PacketTimestamp: 1, PrevDroppedPackets: 0, RTPHeader: &rtp.Header{SequenceNumber: 5000, Timestamp: 1}}, // 1st sample
269269
},
270270
maxLate: 50,
271271
maxLateTimestamp: 2000,
@@ -309,18 +309,18 @@ func TestSampleBuilderMaxLate(t *testing.T) {
309309
s.Push(&rtp.Packet{Header: rtp.Header{SequenceNumber: 0, Timestamp: 1}, Payload: []byte{0x01}})
310310
s.Push(&rtp.Packet{Header: rtp.Header{SequenceNumber: 1, Timestamp: 2}, Payload: []byte{0x01}})
311311
s.Push(&rtp.Packet{Header: rtp.Header{SequenceNumber: 2, Timestamp: 3}, Payload: []byte{0x01}})
312-
assert.Equal(&media.Sample{Data: []byte{0x01}, Duration: time.Second, PacketTimestamp: 1}, s.Pop(), "Failed to build samples before gap")
312+
assert.Equal(&media.Sample{Data: []byte{0x01}, Duration: time.Second, PacketTimestamp: 1, RTPHeader: &rtp.Header{SequenceNumber: 0, Timestamp: 1}}, s.Pop(), "Failed to build samples before gap")
313313

314314
s.Push(&rtp.Packet{Header: rtp.Header{SequenceNumber: 5000, Timestamp: 500}, Payload: []byte{0x02}})
315315
s.Push(&rtp.Packet{Header: rtp.Header{SequenceNumber: 5001, Timestamp: 501}, Payload: []byte{0x02}})
316316
s.Push(&rtp.Packet{Header: rtp.Header{SequenceNumber: 5002, Timestamp: 502}, Payload: []byte{0x02}})
317317

318-
assert.Equal(&media.Sample{Data: []byte{0x01}, Duration: time.Second, PacketTimestamp: 2}, s.Pop(), "Failed to build samples after large gap")
318+
assert.Equal(&media.Sample{Data: []byte{0x01}, Duration: time.Second, PacketTimestamp: 2, RTPHeader: &rtp.Header{SequenceNumber: 1, Timestamp: 2}}, s.Pop(), "Failed to build samples after large gap")
319319
assert.Equal((*media.Sample)(nil), s.Pop(), "Failed to build samples after large gap")
320320

321321
s.Push(&rtp.Packet{Header: rtp.Header{SequenceNumber: 6000, Timestamp: 600}, Payload: []byte{0x03}})
322-
assert.Equal(&media.Sample{Data: []byte{0x02}, Duration: time.Second, PacketTimestamp: 500, PrevDroppedPackets: 4998}, s.Pop(), "Failed to build samples after large gap")
323-
assert.Equal(&media.Sample{Data: []byte{0x02}, Duration: time.Second, PacketTimestamp: 501}, s.Pop(), "Failed to build samples after large gap")
322+
assert.Equal(&media.Sample{Data: []byte{0x02}, Duration: time.Second, PacketTimestamp: 500, PrevDroppedPackets: 4998, RTPHeader: &rtp.Header{SequenceNumber: 5000, Timestamp: 500}}, s.Pop(), "Failed to build samples after large gap")
323+
assert.Equal(&media.Sample{Data: []byte{0x02}, Duration: time.Second, PacketTimestamp: 501, RTPHeader: &rtp.Header{SequenceNumber: 5001, Timestamp: 501}}, s.Pop(), "Failed to build samples after large gap")
324324
}
325325

326326
func TestSeqnumDistance(t *testing.T) {

0 commit comments

Comments
 (0)