mirror of
https://github.com/bluenviron/mediamtx.git
synced 2026-01-09 20:02:01 -08:00
parent
bc7804cb33
commit
27975d8b67
36 changed files with 527 additions and 129 deletions
|
|
@ -53,14 +53,13 @@ func (t *formatProcessorAC3) ProcessUnit(uu unit.Unit) error { //nolint:dupl
|
|||
if err != nil {
|
||||
return err
|
||||
}
|
||||
u.RTPPackets = pkts
|
||||
|
||||
ts := uint32(multiplyAndDivide(u.PTS, time.Duration(t.format.ClockRate()), time.Second))
|
||||
for _, pkt := range pkts {
|
||||
for _, pkt := range u.RTPPackets {
|
||||
pkt.Timestamp += ts
|
||||
}
|
||||
|
||||
u.RTPPackets = pkts
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -55,14 +55,13 @@ func (t *formatProcessorAV1) ProcessUnit(uu unit.Unit) error { //nolint:dupl
|
|||
if err != nil {
|
||||
return err
|
||||
}
|
||||
u.RTPPackets = pkts
|
||||
|
||||
ts := uint32(multiplyAndDivide(u.PTS, time.Duration(t.format.ClockRate()), time.Second))
|
||||
for _, pkt := range pkts {
|
||||
for _, pkt := range u.RTPPackets {
|
||||
pkt.Timestamp += ts
|
||||
}
|
||||
|
||||
u.RTPPackets = pkts
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1 +0,0 @@
|
|||
package formatprocessor
|
||||
|
|
@ -41,6 +41,7 @@ func newG711(
|
|||
func (t *formatProcessorG711) createEncoder() error {
|
||||
t.encoder = &rtpsimpleaudio.Encoder{
|
||||
PayloadMaxSize: t.udpMaxPayloadSize - 12,
|
||||
PayloadType: t.format.PayloadType(),
|
||||
}
|
||||
return t.encoder.Init()
|
||||
}
|
||||
|
|
@ -52,11 +53,10 @@ func (t *formatProcessorG711) ProcessUnit(uu unit.Unit) error { //nolint:dupl
|
|||
if err != nil {
|
||||
return err
|
||||
}
|
||||
u.RTPPackets = []*rtp.Packet{pkt}
|
||||
|
||||
ts := uint32(multiplyAndDivide(u.PTS, time.Duration(t.format.ClockRate()), time.Second))
|
||||
pkt.Timestamp += ts
|
||||
|
||||
u.RTPPackets = []*rtp.Packet{pkt}
|
||||
u.RTPPackets[0].Timestamp += ts
|
||||
|
||||
return nil
|
||||
}
|
||||
|
|
|
|||
62
internal/formatprocessor/g711_test.go
Normal file
62
internal/formatprocessor/g711_test.go
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
package formatprocessor
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/bluenviron/gortsplib/v4/pkg/format"
|
||||
"github.com/bluenviron/mediamtx/internal/unit"
|
||||
"github.com/pion/rtp"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestG611Encode(t *testing.T) {
|
||||
t.Run("alaw", func(t *testing.T) {
|
||||
forma := &format.G711{
|
||||
MULaw: false,
|
||||
}
|
||||
|
||||
p, err := New(1472, forma, true)
|
||||
require.NoError(t, err)
|
||||
|
||||
unit := &unit.G711{
|
||||
Samples: []byte{1, 2, 3, 4},
|
||||
}
|
||||
|
||||
err = p.ProcessUnit(unit)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, []*rtp.Packet{{
|
||||
Header: rtp.Header{
|
||||
Version: 2,
|
||||
PayloadType: 8,
|
||||
SequenceNumber: unit.RTPPackets[0].SequenceNumber,
|
||||
SSRC: unit.RTPPackets[0].SSRC,
|
||||
},
|
||||
Payload: []byte{1, 2, 3, 4},
|
||||
}}, unit.RTPPackets)
|
||||
})
|
||||
|
||||
t.Run("mulaw", func(t *testing.T) {
|
||||
forma := &format.G711{
|
||||
MULaw: true,
|
||||
}
|
||||
|
||||
p, err := New(1472, forma, true)
|
||||
require.NoError(t, err)
|
||||
|
||||
unit := &unit.G711{
|
||||
Samples: []byte{1, 2, 3, 4},
|
||||
}
|
||||
|
||||
err = p.ProcessUnit(unit)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, []*rtp.Packet{{
|
||||
Header: rtp.Header{
|
||||
Version: 2,
|
||||
PayloadType: 0,
|
||||
SequenceNumber: unit.RTPPackets[0].SequenceNumber,
|
||||
SSRC: unit.RTPPackets[0].SSRC,
|
||||
},
|
||||
Payload: []byte{1, 2, 3, 4},
|
||||
}}, unit.RTPPackets)
|
||||
})
|
||||
}
|
||||
|
|
@ -224,13 +224,12 @@ func (t *formatProcessorH264) ProcessUnit(uu unit.Unit) error {
|
|||
if err != nil {
|
||||
return err
|
||||
}
|
||||
u.RTPPackets = pkts
|
||||
|
||||
ts := uint32(multiplyAndDivide(u.PTS, time.Duration(t.format.ClockRate()), time.Second))
|
||||
for _, pkt := range pkts {
|
||||
for _, pkt := range u.RTPPackets {
|
||||
pkt.Timestamp += ts
|
||||
}
|
||||
|
||||
u.RTPPackets = pkts
|
||||
}
|
||||
|
||||
return nil
|
||||
|
|
@ -306,12 +305,11 @@ func (t *formatProcessorH264) ProcessRTPPacket( //nolint:dupl
|
|||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
u.RTPPackets = pkts
|
||||
|
||||
for _, newPKT := range pkts {
|
||||
for _, newPKT := range u.RTPPackets {
|
||||
newPKT.Timestamp = pkt.Timestamp
|
||||
}
|
||||
|
||||
u.RTPPackets = pkts
|
||||
}
|
||||
|
||||
return u, nil
|
||||
|
|
|
|||
|
|
@ -243,13 +243,12 @@ func (t *formatProcessorH265) ProcessUnit(uu unit.Unit) error { //nolint:dupl
|
|||
if err != nil {
|
||||
return err
|
||||
}
|
||||
u.RTPPackets = pkts
|
||||
|
||||
ts := uint32(multiplyAndDivide(u.PTS, time.Duration(t.format.ClockRate()), time.Second))
|
||||
for _, pkt := range pkts {
|
||||
for _, pkt := range u.RTPPackets {
|
||||
pkt.Timestamp += ts
|
||||
}
|
||||
|
||||
u.RTPPackets = pkts
|
||||
}
|
||||
|
||||
return nil
|
||||
|
|
@ -325,12 +324,11 @@ func (t *formatProcessorH265) ProcessRTPPacket( //nolint:dupl
|
|||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
u.RTPPackets = pkts
|
||||
|
||||
for _, newPKT := range pkts {
|
||||
for _, newPKT := range u.RTPPackets {
|
||||
newPKT.Timestamp = pkt.Timestamp
|
||||
}
|
||||
|
||||
u.RTPPackets = pkts
|
||||
}
|
||||
|
||||
return u, nil
|
||||
|
|
|
|||
|
|
@ -41,6 +41,9 @@ func newLPCM(
|
|||
func (t *formatProcessorLPCM) createEncoder() error {
|
||||
t.encoder = &rtplpcm.Encoder{
|
||||
PayloadMaxSize: t.udpMaxPayloadSize - 12,
|
||||
PayloadType: t.format.PayloadTyp,
|
||||
BitDepth: t.format.BitDepth,
|
||||
ChannelCount: t.format.ChannelCount,
|
||||
}
|
||||
return t.encoder.Init()
|
||||
}
|
||||
|
|
@ -52,14 +55,13 @@ func (t *formatProcessorLPCM) ProcessUnit(uu unit.Unit) error { //nolint:dupl
|
|||
if err != nil {
|
||||
return err
|
||||
}
|
||||
u.RTPPackets = pkts
|
||||
|
||||
ts := uint32(multiplyAndDivide(u.PTS, time.Duration(t.format.ClockRate()), time.Second))
|
||||
for _, pkt := range pkts {
|
||||
for _, pkt := range u.RTPPackets {
|
||||
pkt.Timestamp += ts
|
||||
}
|
||||
|
||||
u.RTPPackets = pkts
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
|
|||
37
internal/formatprocessor/lpcm_test.go
Normal file
37
internal/formatprocessor/lpcm_test.go
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
package formatprocessor
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/bluenviron/gortsplib/v4/pkg/format"
|
||||
"github.com/bluenviron/mediamtx/internal/unit"
|
||||
"github.com/pion/rtp"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestLPCMEncode(t *testing.T) {
|
||||
forma := &format.LPCM{
|
||||
PayloadTyp: 96,
|
||||
BitDepth: 16,
|
||||
ChannelCount: 2,
|
||||
}
|
||||
|
||||
p, err := New(1472, forma, true)
|
||||
require.NoError(t, err)
|
||||
|
||||
unit := &unit.LPCM{
|
||||
Samples: []byte{1, 2, 3, 4},
|
||||
}
|
||||
|
||||
err = p.ProcessUnit(unit)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, []*rtp.Packet{{
|
||||
Header: rtp.Header{
|
||||
Version: 2,
|
||||
PayloadType: 96,
|
||||
SequenceNumber: unit.RTPPackets[0].SequenceNumber,
|
||||
SSRC: unit.RTPPackets[0].SSRC,
|
||||
},
|
||||
Payload: []byte{1, 2, 3, 4},
|
||||
}}, unit.RTPPackets)
|
||||
}
|
||||
|
|
@ -54,14 +54,13 @@ func (t *formatProcessorMJPEG) ProcessUnit(uu unit.Unit) error { //nolint:dupl
|
|||
if err != nil {
|
||||
return err
|
||||
}
|
||||
u.RTPPackets = pkts
|
||||
|
||||
ts := uint32(multiplyAndDivide(u.PTS, time.Duration(t.format.ClockRate()), time.Second))
|
||||
for _, pkt := range pkts {
|
||||
for _, pkt := range u.RTPPackets {
|
||||
pkt.Timestamp += ts
|
||||
}
|
||||
|
||||
u.RTPPackets = pkts
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -53,14 +53,13 @@ func (t *formatProcessorMPEG1Audio) ProcessUnit(uu unit.Unit) error { //nolint:d
|
|||
if err != nil {
|
||||
return err
|
||||
}
|
||||
u.RTPPackets = pkts
|
||||
|
||||
ts := uint32(multiplyAndDivide(u.PTS, time.Duration(t.format.ClockRate()), time.Second))
|
||||
for _, pkt := range pkts {
|
||||
for _, pkt := range u.RTPPackets {
|
||||
pkt.Timestamp += ts
|
||||
}
|
||||
|
||||
u.RTPPackets = pkts
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -54,14 +54,13 @@ func (t *formatProcessorMPEG1Video) ProcessUnit(uu unit.Unit) error { //nolint:d
|
|||
if err != nil {
|
||||
return err
|
||||
}
|
||||
u.RTPPackets = pkts
|
||||
|
||||
ts := uint32(multiplyAndDivide(u.PTS, time.Duration(t.format.ClockRate()), time.Second))
|
||||
for _, pkt := range pkts {
|
||||
for _, pkt := range u.RTPPackets {
|
||||
pkt.Timestamp += ts
|
||||
}
|
||||
|
||||
u.RTPPackets = pkts
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -57,14 +57,13 @@ func (t *formatProcessorMPEG4Audio) ProcessUnit(uu unit.Unit) error { //nolint:d
|
|||
if err != nil {
|
||||
return err
|
||||
}
|
||||
u.RTPPackets = pkts
|
||||
|
||||
ts := uint32(multiplyAndDivide(u.PTS, time.Duration(t.format.ClockRate()), time.Second))
|
||||
for _, pkt := range pkts {
|
||||
for _, pkt := range u.RTPPackets {
|
||||
pkt.Timestamp += ts
|
||||
}
|
||||
|
||||
u.RTPPackets = pkts
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -94,7 +94,7 @@ func (t *formatProcessorMPEG4Video) ProcessUnit(uu unit.Unit) error { //nolint:d
|
|||
}
|
||||
|
||||
ts := uint32(multiplyAndDivide(u.PTS, time.Duration(t.format.ClockRate()), time.Second))
|
||||
for _, pkt := range pkts {
|
||||
for _, pkt := range u.RTPPackets {
|
||||
pkt.Timestamp += ts
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -54,14 +54,13 @@ func (t *formatProcessorVP8) ProcessUnit(uu unit.Unit) error { //nolint:dupl
|
|||
if err != nil {
|
||||
return err
|
||||
}
|
||||
u.RTPPackets = pkts
|
||||
|
||||
ts := uint32(multiplyAndDivide(u.PTS, time.Duration(t.format.ClockRate()), time.Second))
|
||||
for _, pkt := range pkts {
|
||||
for _, pkt := range u.RTPPackets {
|
||||
pkt.Timestamp += ts
|
||||
}
|
||||
|
||||
u.RTPPackets = pkts
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -54,14 +54,13 @@ func (t *formatProcessorVP9) ProcessUnit(uu unit.Unit) error { //nolint:dupl
|
|||
if err != nil {
|
||||
return err
|
||||
}
|
||||
u.RTPPackets = pkts
|
||||
|
||||
ts := uint32(multiplyAndDivide(u.PTS, time.Duration(t.format.ClockRate()), time.Second))
|
||||
for _, pkt := range pkts {
|
||||
for _, pkt := range u.RTPPackets {
|
||||
pkt.Timestamp += ts
|
||||
}
|
||||
|
||||
u.RTPPackets = pkts
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue