Use cache for packet level processing. (#632)

* Use cache for packet level processing.

Do not overload ops queue for packet level operations.

* byte -> uint8
This commit is contained in:
Raja Subramanian
2022-04-20 13:19:10 +05:30
committed by GitHub
parent 1cfc483d8f
commit 1fe485ef0c
+53 -6
View File
@@ -25,6 +25,17 @@ const (
ReportDelta = 1e9
)
type twccMetadata struct {
sn uint16
arrivalTime int64
marker bool
}
type audioLevelMetadata struct {
level uint8
duration uint32
}
type pendingPacket struct {
arrivalTime int64
packet []byte
@@ -69,6 +80,9 @@ type Buffer struct {
latestTSForAudioLevelInitialized bool
latestTSForAudioLevel uint32
twccPending []twccMetadata
audioLevelPending []audioLevelMetadata
lastPacketRead int
pliThrottle int64
@@ -396,11 +410,14 @@ func (b *Buffer) processHeaderExtensions(p *rtp.Packet, arrivalTime int64) {
// for bandwidth estimation
if b.twcc {
if ext := p.GetExtension(b.twccExt); len(ext) > 1 {
sn := binary.BigEndian.Uint16(ext[0:2])
marker := p.Marker
b.callbacksQueue.Enqueue(func() {
b.feedbackTWCC(sn, arrivalTime, marker)
b.twccPending = append(b.twccPending, twccMetadata{
sn: binary.BigEndian.Uint16(ext[0:2]),
arrivalTime: arrivalTime,
marker: p.Marker,
})
if len(b.twccPending) == 1 {
b.callbacksQueue.Enqueue(b.processTWCCPending)
}
}
}
@@ -415,9 +432,13 @@ func (b *Buffer) processHeaderExtensions(p *rtp.Packet, arrivalTime int64) {
if (p.Timestamp - b.latestTSForAudioLevel) < (1 << 31) {
duration := (int64(p.Timestamp) - int64(b.latestTSForAudioLevel)) * 1e3 / int64(b.clockRate)
if duration > 0 {
b.callbacksQueue.Enqueue(func() {
b.onAudioLevel(ext.Level, uint32(duration))
b.audioLevelPending = append(b.audioLevelPending, audioLevelMetadata{
level: ext.Level,
duration: uint32(duration),
})
if len(b.audioLevelPending) == 1 {
b.callbacksQueue.Enqueue(b.processAudioLevelPending)
}
}
b.latestTSForAudioLevel = p.Timestamp
@@ -631,3 +652,29 @@ func (b *Buffer) GetDeltaStats() *StreamStatsWithLayers {
Layers: layers,
}
}
func (b *Buffer) processTWCCPending() {
b.Lock()
pending := b.twccPending
b.twccPending = nil
b.Unlock()
if b.feedbackTWCC != nil {
for _, p := range pending {
b.feedbackTWCC(p.sn, p.arrivalTime, p.marker)
}
}
}
func (b *Buffer) processAudioLevelPending() {
b.Lock()
pending := b.audioLevelPending
b.audioLevelPending = nil
b.Unlock()
if b.onAudioLevel != nil {
for _, p := range pending {
b.onAudioLevel(p.level, p.duration)
}
}
}