diff --git a/pkg/sfu/downtrack.go b/pkg/sfu/downtrack.go index fb2dff69a..5a492f89e 100644 --- a/pkg/sfu/downtrack.go +++ b/pkg/sfu/downtrack.go @@ -453,8 +453,9 @@ func (d *DownTrack) WriteRTP(extPkt *buffer.ExtPacket, layer int32) error { } } + var meta *packetMeta if d.sequencer != nil { - meta := d.sequencer.push(extPkt.Packet.SequenceNumber, tp.rtp.sequenceNumber, tp.rtp.timestamp, int8(layer)) + meta = d.sequencer.push(extPkt.Packet.SequenceNumber, tp.rtp.sequenceNumber, tp.rtp.timestamp, int8(layer)) if meta != nil && tp.vp8 != nil { meta.packVP8(tp.vp8.Header) } @@ -466,6 +467,10 @@ func (d *DownTrack) WriteRTP(extPkt *buffer.ExtPacket, layer int32) error { return err } + if meta != nil && d.dependencyDescriptorID != 0 { + meta.ddBytes = hdr.GetExtension(uint8(d.dependencyDescriptorID)) + } + _, err = d.writeStream.WriteRTP(hdr, payload) if err == nil { pktSize := hdr.MarshalSize() + len(payload) @@ -1263,7 +1268,14 @@ func (d *DownTrack) retransmitPackets(nacks []uint16) { } } - err = d.writeRTPHeaderExtensions(&pkt.Header) + var extraExtensions []extensionData + if len(meta.ddBytes) > 0 { + extraExtensions = append(extraExtensions, extensionData{ + id: uint8(d.dependencyDescriptorID), + payload: meta.ddBytes, + }) + } + err = d.writeRTPHeaderExtensions(&pkt.Header, extraExtensions...) if err != nil { d.logger.Errorw("writing rtp header extensions err", err) continue diff --git a/pkg/sfu/sequencer.go b/pkg/sfu/sequencer.go index d7bb12f57..f20f85384 100644 --- a/pkg/sfu/sequencer.go +++ b/pkg/sfu/sequencer.go @@ -53,6 +53,8 @@ type packetMeta struct { layer int8 // Information that differs depending on the codec misc uint64 + // Dependency Descriptor of packet + ddBytes []byte } func (p *packetMeta) packVP8(vp8 *buffer.VP8) {