-
Notifications
You must be signed in to change notification settings - Fork 64
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
ace759a
commit 11b5c42
Showing
3 changed files
with
115 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,94 @@ | ||
// SPDX-FileCopyrightText: 2023 The Pion community <https://pion.ly> | ||
// SPDX-License-Identifier: MIT | ||
|
||
package jitterbuffer | ||
|
||
import ( | ||
"sync" | ||
|
||
"github.com/pion/interceptor" | ||
"github.com/pion/logging" | ||
"github.com/pion/rtp" | ||
) | ||
|
||
// JitterBufferInterceptorFactory is a interceptor.Factory for a GeneratorInterceptor | ||
type JitterBufferInterceptorFactory struct { | ||
Check warning on line 15 in pkg/jitterbuffer/generator_interceptor.go GitHub Actions / lint / Go
|
||
opts []JitterBufferOption | ||
} | ||
|
||
// NewInterceptor constructs a new ReceiverInterceptor | ||
func (g *JitterBufferInterceptorFactory) NewInterceptor(_ string) (interceptor.Interceptor, error) { | ||
i := &JitterBufferInterceptor{ | ||
close: make(chan struct{}), | ||
log: logging.NewDefaultLoggerFactory().NewLogger("nack_generator"), | ||
buffer: New(), | ||
} | ||
|
||
for _, opt := range g.opts { | ||
if err := opt(i); err != nil { | ||
return nil, err | ||
} | ||
} | ||
|
||
return i, nil | ||
} | ||
|
||
// JitterBufferInterceptor interceptor places a JitterBuffer in the chain to smooth packet arrival | ||
// and allow for network jitter | ||
type JitterBufferInterceptor struct { | ||
interceptor.NoOp | ||
buffer *JitterBuffer | ||
m sync.Mutex | ||
wg sync.WaitGroup | ||
close chan struct{} | ||
log logging.LeveledLogger | ||
} | ||
|
||
// NewGeneratorInterceptor returns a new GeneratorInterceptorFactory | ||
func NewInterceptor(opts ...JitterBufferOption) (*JitterBufferInterceptorFactory, error) { | ||
return &JitterBufferInterceptorFactory{opts}, nil | ||
} | ||
|
||
// BindRemoteStream lets you modify any incoming RTP packets. It is called once for per RemoteStream. The returned method | ||
// will be called once per rtp packet. | ||
func (i *JitterBufferInterceptor) BindRemoteStream(info *interceptor.StreamInfo, reader interceptor.RTPReader) interceptor.RTPReader { | ||
return interceptor.RTPReaderFunc(func(b []byte, a interceptor.Attributes) (int, interceptor.Attributes, error) { | ||
n, attr, err := reader.Read(b, a) | ||
if err != nil { | ||
return n, attr, err | ||
} | ||
packet := &rtp.Packet{} | ||
if err := packet.Unmarshal(b[:n]); err != nil { | ||
return 0, nil, err | ||
} | ||
i.buffer.Push(packet); | ||
|
||
if i.buffer.state == Emitting { | ||
newPkt, err := i.buffer.Pop() | ||
if err != nil { | ||
return 0, nil, err | ||
} | ||
n, err = newPkt.MarshalTo(b) | ||
if err != nil { | ||
return 0, nil, err | ||
} | ||
|
||
return n, attr, nil | ||
} | ||
return 0, attr, nil | ||
}) | ||
} | ||
|
||
// UnbindRemoteStream is called when the Stream is removed. It can be used to clean up any data related to that track. | ||
func (n *JitterBufferInterceptor) UnbindRemoteStream(info *interceptor.StreamInfo) { | ||
Check warning on line 83 in pkg/jitterbuffer/generator_interceptor.go GitHub Actions / lint / Go
|
||
|
||
} | ||
|
||
// Close closes the interceptor | ||
func (n *JitterBufferInterceptor) Close() error { | ||
defer n.wg.Wait() | ||
n.m.Lock() | ||
defer n.m.Unlock() | ||
|
||
return nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
// SPDX-FileCopyrightText: 2023 The Pion community <https://pion.ly> | ||
// SPDX-License-Identifier: MIT | ||
|
||
package jitterbuffer | ||
|
||
import ( | ||
"github.com/pion/logging" | ||
) | ||
|
||
// JitterBufferOption can be used to configure SenderInterceptor | ||
type JitterBufferOption func(d *JitterBufferInterceptor) error | ||
|
||
// Log sets a logger for the interceptor | ||
func Log(log logging.LeveledLogger) JitterBufferOption { | ||
return func(d *JitterBufferInterceptor) error { | ||
d.log = log | ||
return nil | ||
} | ||
} |