ConfigureFlexFEC03 helper and fec example

This commit is contained in:
Aleksandr Alekseev
2025-05-23 19:19:05 +03:00
committed by Aleksandr Alekseev
parent ca48a0d709
commit 08d015e056
7 changed files with 533 additions and 0 deletions

View File

@@ -10,6 +10,7 @@ import (
"sync/atomic"
"github.com/pion/interceptor"
"github.com/pion/interceptor/pkg/flexfec"
"github.com/pion/interceptor/pkg/nack"
"github.com/pion/interceptor/pkg/report"
"github.com/pion/interceptor/pkg/rfc8888"
@@ -160,6 +161,41 @@ func ConfigureSimulcastExtensionHeaders(mediaEngine *MediaEngine) error {
)
}
// ConfigureFlexFEC03 registers flexfec-03 codec with provided payloadType in mediaEngine
// and adds corresponding interceptor to the registry.
// Note that this function should be called before any other interceptor that modifies RTP packets
// (i.e. TWCCHeaderExtensionSender) is added to the registry, so that packets generated by flexfec
// interceptor are not modified.
func ConfigureFlexFEC03(
payloadType PayloadType,
mediaEngine *MediaEngine,
interceptorRegistry *interceptor.Registry,
options ...flexfec.FecOption,
) error {
codecFEC := RTPCodecParameters{
RTPCodecCapability: RTPCodecCapability{
MimeType: MimeTypeFlexFEC03,
ClockRate: 90000,
SDPFmtpLine: "repair-window=10000000",
RTCPFeedback: nil,
},
PayloadType: payloadType,
}
if err := mediaEngine.RegisterCodec(codecFEC, RTPCodecTypeVideo); err != nil {
return err
}
generator, err := flexfec.NewFecInterceptor(options...)
if err != nil {
return err
}
interceptorRegistry.Add(generator)
return nil
}
type interceptorToTrackLocalWriter struct{ interceptor atomic.Value } // interceptor.RTPWriter }
func (i *interceptorToTrackLocalWriter) WriteRTP(header *rtp.Header, payload []byte) (int, error) {