|
66 | 66 | // order, and allows removing in either sequence number order or via a |
67 | 67 | // provided timestamp. |
68 | 68 | type JitterBuffer struct { |
69 | | - packets *PriorityQueue |
| 69 | + packets *RBTree |
70 | 70 | minStartCount uint16 |
71 | 71 | overflowLen uint16 |
72 | 72 | lastSequence uint16 |
@@ -98,7 +98,7 @@ func New(opts ...Option) *JitterBuffer { |
98 | 98 | stats: Stats{0, 0, 0}, |
99 | 99 | minStartCount: 50, |
100 | 100 | overflowLen: 100, |
101 | | - packets: NewQueue(), |
| 101 | + packets: NewTree(), |
102 | 102 | listeners: make(map[Event][]EventListener), |
103 | 103 | } |
104 | 104 |
|
@@ -132,7 +132,15 @@ func (jb *JitterBuffer) PlayoutHead() uint16 { |
132 | 132 | return jb.playoutHead |
133 | 133 | } |
134 | 134 |
|
135 | | -// SetPlayoutHead allows you to manually specify the packet you wish to pop next |
| 135 | +// Length returns the current number of packets in the buffer. |
| 136 | +func (jb *JitterBuffer) Length() uint16 { |
| 137 | + jb.mutex.Lock() |
| 138 | + defer jb.mutex.Unlock() |
| 139 | + |
| 140 | + return jb.packets.Length() |
| 141 | +} |
| 142 | + |
| 143 | +// SetPlayoutHead allows you to manually specify the packet you wish to pop next. |
136 | 144 | // If you have encountered a packet that hasn't resolved you can skip it. |
137 | 145 | func (jb *JitterBuffer) SetPlayoutHead(playoutHead uint16) { |
138 | 146 | jb.mutex.Lock() |
@@ -171,7 +179,7 @@ func (jb *JitterBuffer) Push(packet *rtp.Packet) { |
171 | 179 | } |
172 | 180 |
|
173 | 181 | jb.updateStats(packet.SequenceNumber) |
174 | | - jb.packets.Push(packet, packet.SequenceNumber) |
| 182 | + jb.packets.Push(packet) |
175 | 183 | jb.updateState() |
176 | 184 | } |
177 | 185 |
|
@@ -255,6 +263,7 @@ func (jb *JitterBuffer) PopAtSequence(sq uint16) (*rtp.Packet, error) { |
255 | 263 | func (jb *JitterBuffer) PeekAtSequence(sq uint16) (*rtp.Packet, error) { |
256 | 264 | jb.mutex.Lock() |
257 | 265 | defer jb.mutex.Unlock() |
| 266 | + |
258 | 267 | packet, err := jb.packets.Find(sq) |
259 | 268 | if err != nil { |
260 | 269 | return nil, err |
@@ -296,3 +305,11 @@ func (jb *JitterBuffer) Clear(resetState bool) { |
296 | 305 | jb.minStartCount = 50 |
297 | 306 | } |
298 | 307 | } |
| 308 | + |
| 309 | +// State returns the current state of the jitter buffer. |
| 310 | +func (jb *JitterBuffer) State() State { |
| 311 | + jb.mutex.Lock() |
| 312 | + defer jb.mutex.Unlock() |
| 313 | + |
| 314 | + return jb.state |
| 315 | +} |
0 commit comments