1
0
Fork 0
forked from External/mediamtx

rename Data into Unit (#1556)

This commit is contained in:
Alessandro Ros 2023-03-10 12:44:59 +01:00 committed by GitHub
parent 25dc252342
commit e8bdad8a1e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
23 changed files with 240 additions and 237 deletions

View file

@ -13,19 +13,19 @@ const (
maxPacketSize = 1472
)
// DataGeneric is a generic data unit.
type DataGeneric struct {
// UnitGeneric is a generic data unit.
type UnitGeneric struct {
RTPPackets []*rtp.Packet
NTP time.Time
}
// GetRTPPackets implements Data.
func (d *DataGeneric) GetRTPPackets() []*rtp.Packet {
// GetRTPPackets implements Unit.
func (d *UnitGeneric) GetRTPPackets() []*rtp.Packet {
return d.RTPPackets
}
// GetNTP implements Data.
func (d *DataGeneric) GetNTP() time.Time {
// GetNTP implements Unit.
func (d *UnitGeneric) GetNTP() time.Time {
return d.NTP
}
@ -39,10 +39,10 @@ func newGeneric(forma format.Format, generateRTPPackets bool) (*formatProcessorG
return &formatProcessorGeneric{}, nil
}
func (t *formatProcessorGeneric) Process(dat Data, hasNonRTSPReaders bool) error {
tdata := dat.(*DataGeneric)
func (t *formatProcessorGeneric) Process(unit Unit, hasNonRTSPReaders bool) error {
tunit := unit.(*UnitGeneric)
pkt := tdata.RTPPackets[0]
pkt := tunit.RTPPackets[0]
// remove padding
pkt.Header.Padding = false

View file

@ -32,7 +32,7 @@ func TestGenericRemovePadding(t *testing.T) {
PaddingSize: 20,
}
err = p.Process(&DataGeneric{
err = p.Process(&UnitGeneric{
RTPPackets: []*rtp.Packet{pkt},
}, false)
require.NoError(t, err)

View file

@ -67,21 +67,21 @@ func rtpH264ExtractSPSPPS(pkt *rtp.Packet) ([]byte, []byte) {
}
}
// DataH264 is a H264 data unit.
type DataH264 struct {
// UnitH264 is a H264 data unit.
type UnitH264 struct {
RTPPackets []*rtp.Packet
NTP time.Time
PTS time.Duration
AU [][]byte
}
// GetRTPPackets implements Data.
func (d *DataH264) GetRTPPackets() []*rtp.Packet {
// GetRTPPackets implements Unit.
func (d *UnitH264) GetRTPPackets() []*rtp.Packet {
return d.RTPPackets
}
// GetNTP implements Data.
func (d *DataH264) GetNTP() time.Time {
// GetNTP implements Unit.
func (d *UnitH264) GetNTP() time.Time {
return d.NTP
}
@ -198,11 +198,11 @@ func (t *formatProcessorH264) remuxAccessUnit(nalus [][]byte) [][]byte {
return filteredNALUs
}
func (t *formatProcessorH264) Process(dat Data, hasNonRTSPReaders bool) error { //nolint:dupl
tdata := dat.(*DataH264)
func (t *formatProcessorH264) Process(unit Unit, hasNonRTSPReaders bool) error { //nolint:dupl
tunit := unit.(*UnitH264)
if tdata.RTPPackets != nil {
pkt := tdata.RTPPackets[0]
if tunit.RTPPackets != nil {
pkt := tunit.RTPPackets[0]
t.updateTrackParametersFromRTPPacket(pkt)
if t.encoder == nil {
@ -233,7 +233,7 @@ func (t *formatProcessorH264) Process(dat Data, hasNonRTSPReaders bool) error {
}
if t.encoder != nil {
tdata.RTPPackets = nil
tunit.RTPPackets = nil
}
// DecodeUntilMarker() is necessary, otherwise Encode() generates partial groups
@ -245,9 +245,9 @@ func (t *formatProcessorH264) Process(dat Data, hasNonRTSPReaders bool) error {
return err
}
tdata.AU = au
tdata.PTS = PTS
tdata.AU = t.remuxAccessUnit(tdata.AU)
tunit.AU = au
tunit.PTS = PTS
tunit.AU = t.remuxAccessUnit(tunit.AU)
}
// route packet as is
@ -255,18 +255,18 @@ func (t *formatProcessorH264) Process(dat Data, hasNonRTSPReaders bool) error {
return nil
}
} else {
t.updateTrackParametersFromNALUs(tdata.AU)
tdata.AU = t.remuxAccessUnit(tdata.AU)
t.updateTrackParametersFromNALUs(tunit.AU)
tunit.AU = t.remuxAccessUnit(tunit.AU)
}
if len(tdata.AU) != 0 {
pkts, err := t.encoder.Encode(tdata.AU, tdata.PTS)
if len(tunit.AU) != 0 {
pkts, err := t.encoder.Encode(tunit.AU, tunit.PTS)
if err != nil {
return err
}
tdata.RTPPackets = pkts
tunit.RTPPackets = pkts
} else {
tdata.RTPPackets = nil
tunit.RTPPackets = nil
}
return nil

View file

@ -23,7 +23,7 @@ func TestH264DynamicParams(t *testing.T) {
pkts, err := enc.Encode([][]byte{{byte(h264.NALUTypeIDR)}}, 0)
require.NoError(t, err)
data := &DataH264{RTPPackets: []*rtp.Packet{pkts[0]}}
data := &UnitH264{RTPPackets: []*rtp.Packet{pkts[0]}}
p.Process(data, true)
require.Equal(t, [][]byte{
@ -32,18 +32,18 @@ func TestH264DynamicParams(t *testing.T) {
pkts, err = enc.Encode([][]byte{{7, 4, 5, 6}}, 0) // SPS
require.NoError(t, err)
p.Process(&DataH264{RTPPackets: []*rtp.Packet{pkts[0]}}, false)
p.Process(&UnitH264{RTPPackets: []*rtp.Packet{pkts[0]}}, false)
pkts, err = enc.Encode([][]byte{{8, 1}}, 0) // PPS
require.NoError(t, err)
p.Process(&DataH264{RTPPackets: []*rtp.Packet{pkts[0]}}, false)
p.Process(&UnitH264{RTPPackets: []*rtp.Packet{pkts[0]}}, false)
require.Equal(t, []byte{7, 4, 5, 6}, forma.SPS)
require.Equal(t, []byte{8, 1}, forma.PPS)
pkts, err = enc.Encode([][]byte{{byte(h264.NALUTypeIDR)}}, 0)
require.NoError(t, err)
data = &DataH264{RTPPackets: []*rtp.Packet{pkts[0]}}
data = &UnitH264{RTPPackets: []*rtp.Packet{pkts[0]}}
p.Process(data, true)
require.Equal(t, [][]byte{
@ -104,7 +104,7 @@ func TestH264OversizedPackets(t *testing.T) {
Payload: []byte{0x1c, 0b01000000, 0x01, 0x02, 0x03, 0x04},
},
} {
data := &DataH264{RTPPackets: []*rtp.Packet{pkt}}
data := &UnitH264{RTPPackets: []*rtp.Packet{pkt}}
p.Process(data, false)
out = append(out, data.RTPPackets...)
}
@ -161,7 +161,7 @@ func TestH264EmptyPacket(t *testing.T) {
p, err := New(forma, true)
require.NoError(t, err)
unit := &DataH264{
unit := &UnitH264{
AU: [][]byte{
{0x07, 0x01, 0x02, 0x03}, // SPS
{0x08, 0x01, 0x02}, // PPS

View file

@ -74,21 +74,21 @@ func rtpH265ExtractVPSSPSPPS(pkt *rtp.Packet) ([]byte, []byte, []byte) {
}
}
// DataH265 is a H265 data unit.
type DataH265 struct {
// UnitH265 is a H265 data unit.
type UnitH265 struct {
RTPPackets []*rtp.Packet
NTP time.Time
PTS time.Duration
AU [][]byte
}
// GetRTPPackets implements Data.
func (d *DataH265) GetRTPPackets() []*rtp.Packet {
// GetRTPPackets implements Unit.
func (d *UnitH265) GetRTPPackets() []*rtp.Packet {
return d.RTPPackets
}
// GetNTP implements Data.
func (d *DataH265) GetNTP() time.Time {
// GetNTP implements Unit.
func (d *UnitH265) GetNTP() time.Time {
return d.NTP
}
@ -219,11 +219,11 @@ func (t *formatProcessorH265) remuxAccessUnit(nalus [][]byte) [][]byte {
return filteredNALUs
}
func (t *formatProcessorH265) Process(dat Data, hasNonRTSPReaders bool) error { //nolint:dupl
tdata := dat.(*DataH265)
func (t *formatProcessorH265) Process(unit Unit, hasNonRTSPReaders bool) error { //nolint:dupl
tunit := unit.(*UnitH265)
if tdata.RTPPackets != nil {
pkt := tdata.RTPPackets[0]
if tunit.RTPPackets != nil {
pkt := tunit.RTPPackets[0]
t.updateTrackParametersFromRTPPacket(pkt)
if t.encoder == nil {
@ -254,7 +254,7 @@ func (t *formatProcessorH265) Process(dat Data, hasNonRTSPReaders bool) error {
}
if t.encoder != nil {
tdata.RTPPackets = nil
tunit.RTPPackets = nil
}
// DecodeUntilMarker() is necessary, otherwise Encode() generates partial groups
@ -266,9 +266,9 @@ func (t *formatProcessorH265) Process(dat Data, hasNonRTSPReaders bool) error {
return err
}
tdata.AU = au
tdata.PTS = PTS
tdata.AU = t.remuxAccessUnit(tdata.AU)
tunit.AU = au
tunit.PTS = PTS
tunit.AU = t.remuxAccessUnit(tunit.AU)
}
// route packet as is
@ -276,18 +276,18 @@ func (t *formatProcessorH265) Process(dat Data, hasNonRTSPReaders bool) error {
return nil
}
} else {
t.updateTrackParametersFromNALUs(tdata.AU)
tdata.AU = t.remuxAccessUnit(tdata.AU)
t.updateTrackParametersFromNALUs(tunit.AU)
tunit.AU = t.remuxAccessUnit(tunit.AU)
}
if len(tdata.AU) != 0 {
pkts, err := t.encoder.Encode(tdata.AU, tdata.PTS)
if len(tunit.AU) != 0 {
pkts, err := t.encoder.Encode(tunit.AU, tunit.PTS)
if err != nil {
return err
}
tdata.RTPPackets = pkts
tunit.RTPPackets = pkts
} else {
tdata.RTPPackets = nil
tunit.RTPPackets = nil
}
return nil

View file

@ -22,7 +22,7 @@ func TestH265DynamicParams(t *testing.T) {
pkts, err := enc.Encode([][]byte{{byte(h265.NALUType_CRA_NUT) << 1, 0}}, 0)
require.NoError(t, err)
data := &DataH265{RTPPackets: []*rtp.Packet{pkts[0]}}
data := &UnitH265{RTPPackets: []*rtp.Packet{pkts[0]}}
p.Process(data, true)
require.Equal(t, [][]byte{
@ -31,15 +31,15 @@ func TestH265DynamicParams(t *testing.T) {
pkts, err = enc.Encode([][]byte{{byte(h265.NALUType_VPS_NUT) << 1, 1, 2, 3}}, 0)
require.NoError(t, err)
p.Process(&DataH265{RTPPackets: []*rtp.Packet{pkts[0]}}, false)
p.Process(&UnitH265{RTPPackets: []*rtp.Packet{pkts[0]}}, false)
pkts, err = enc.Encode([][]byte{{byte(h265.NALUType_SPS_NUT) << 1, 4, 5, 6}}, 0)
require.NoError(t, err)
p.Process(&DataH265{RTPPackets: []*rtp.Packet{pkts[0]}}, false)
p.Process(&UnitH265{RTPPackets: []*rtp.Packet{pkts[0]}}, false)
pkts, err = enc.Encode([][]byte{{byte(h265.NALUType_PPS_NUT) << 1, 7, 8, 9}}, 0)
require.NoError(t, err)
p.Process(&DataH265{RTPPackets: []*rtp.Packet{pkts[0]}}, false)
p.Process(&UnitH265{RTPPackets: []*rtp.Packet{pkts[0]}}, false)
require.Equal(t, []byte{byte(h265.NALUType_VPS_NUT) << 1, 1, 2, 3}, forma.VPS)
require.Equal(t, []byte{byte(h265.NALUType_SPS_NUT) << 1, 4, 5, 6}, forma.SPS)
@ -47,7 +47,7 @@ func TestH265DynamicParams(t *testing.T) {
pkts, err = enc.Encode([][]byte{{byte(h265.NALUType_CRA_NUT) << 1, 0}}, 0)
require.NoError(t, err)
data = &DataH265{RTPPackets: []*rtp.Packet{pkts[0]}}
data = &UnitH265{RTPPackets: []*rtp.Packet{pkts[0]}}
p.Process(data, true)
require.Equal(t, [][]byte{
@ -97,7 +97,7 @@ func TestH265OversizedPackets(t *testing.T) {
Payload: bytes.Repeat([]byte{0x01, 0x02, 0x03, 0x04}, 2000/4),
},
} {
data := &DataH265{RTPPackets: []*rtp.Packet{pkt}}
data := &UnitH265{RTPPackets: []*rtp.Packet{pkt}}
p.Process(data, false)
out = append(out, data.RTPPackets...)
}
@ -153,7 +153,7 @@ func TestH265EmptyPacket(t *testing.T) {
p, err := New(forma, true)
require.NoError(t, err)
unit := &DataH265{
unit := &UnitH265{
AU: [][]byte{
{byte(h265.NALUType_VPS_NUT) << 1, 10, 11, 12}, // VPS
{byte(h265.NALUType_SPS_NUT) << 1, 13, 14, 15}, // SPS

View file

@ -9,21 +9,21 @@ import (
"github.com/pion/rtp"
)
// DataMPEG4Audio is a MPEG4-audio data unit.
type DataMPEG4Audio struct {
// UnitMPEG4Audio is a MPEG4-audio data unit.
type UnitMPEG4Audio struct {
RTPPackets []*rtp.Packet
NTP time.Time
PTS time.Duration
AUs [][]byte
}
// GetRTPPackets implements Data.
func (d *DataMPEG4Audio) GetRTPPackets() []*rtp.Packet {
// GetRTPPackets implements Unit.
func (d *UnitMPEG4Audio) GetRTPPackets() []*rtp.Packet {
return d.RTPPackets
}
// GetNTP implements Data.
func (d *DataMPEG4Audio) GetNTP() time.Time {
// GetNTP implements Unit.
func (d *UnitMPEG4Audio) GetNTP() time.Time {
return d.NTP
}
@ -48,11 +48,11 @@ func newMPEG4Audio(
return t, nil
}
func (t *formatProcessorMPEG4Audio) Process(dat Data, hasNonRTSPReaders bool) error { //nolint:dupl
tdata := dat.(*DataMPEG4Audio)
func (t *formatProcessorMPEG4Audio) Process(unit Unit, hasNonRTSPReaders bool) error { //nolint:dupl
tunit := unit.(*UnitMPEG4Audio)
if tdata.RTPPackets != nil {
pkt := tdata.RTPPackets[0]
if tunit.RTPPackets != nil {
pkt := tunit.RTPPackets[0]
// remove padding
pkt.Header.Padding = false
@ -77,19 +77,19 @@ func (t *formatProcessorMPEG4Audio) Process(dat Data, hasNonRTSPReaders bool) er
return err
}
tdata.AUs = aus
tdata.PTS = PTS
tunit.AUs = aus
tunit.PTS = PTS
}
// route packet as is
return nil
}
pkts, err := t.encoder.Encode(tdata.AUs, tdata.PTS)
pkts, err := t.encoder.Encode(tunit.AUs, tunit.PTS)
if err != nil {
return err
}
tdata.RTPPackets = pkts
tunit.RTPPackets = pkts
return nil
}

View file

@ -9,21 +9,21 @@ import (
"github.com/pion/rtp"
)
// DataOpus is a Opus data unit.
type DataOpus struct {
// UnitOpus is a Opus data unit.
type UnitOpus struct {
RTPPackets []*rtp.Packet
NTP time.Time
PTS time.Duration
Frame []byte
}
// GetRTPPackets implements Data.
func (d *DataOpus) GetRTPPackets() []*rtp.Packet {
// GetRTPPackets implements Unit.
func (d *UnitOpus) GetRTPPackets() []*rtp.Packet {
return d.RTPPackets
}
// GetNTP implements Data.
func (d *DataOpus) GetNTP() time.Time {
// GetNTP implements Unit.
func (d *UnitOpus) GetNTP() time.Time {
return d.NTP
}
@ -48,11 +48,11 @@ func newOpus(
return t, nil
}
func (t *formatProcessorOpus) Process(dat Data, hasNonRTSPReaders bool) error { //nolint:dupl
tdata := dat.(*DataOpus)
func (t *formatProcessorOpus) Process(unit Unit, hasNonRTSPReaders bool) error { //nolint:dupl
tunit := unit.(*UnitOpus)
if tdata.RTPPackets != nil {
pkt := tdata.RTPPackets[0]
if tunit.RTPPackets != nil {
pkt := tunit.RTPPackets[0]
// remove padding
pkt.Header.Padding = false
@ -74,19 +74,19 @@ func (t *formatProcessorOpus) Process(dat Data, hasNonRTSPReaders bool) error {
return err
}
tdata.Frame = frame
tdata.PTS = PTS
tunit.Frame = frame
tunit.PTS = PTS
}
// route packet as is
return nil
}
pkt, err := t.encoder.Encode(tdata.Frame, tdata.PTS)
pkt, err := t.encoder.Encode(tunit.Frame, tunit.PTS)
if err != nil {
return err
}
tdata.RTPPackets = []*rtp.Packet{pkt}
tunit.RTPPackets = []*rtp.Packet{pkt}
return nil
}

View file

@ -2,23 +2,13 @@
package formatprocessor
import (
"time"
"github.com/pion/rtp"
"github.com/aler9/gortsplib/v2/pkg/format"
)
// Data is the elementary data unit routed across the server.
type Data interface {
GetRTPPackets() []*rtp.Packet
GetNTP() time.Time
}
// Processor allows to cleanup and normalize streams.
type Processor interface {
// clears and normalizes a data unit.
Process(Data, bool) error
Process(Unit, bool) error
}
// New allocates a Processor.

View file

@ -0,0 +1,13 @@
package formatprocessor
import (
"time"
"github.com/pion/rtp"
)
// Unit is the elementary data unit routed across the server.
type Unit interface {
GetRTPPackets() []*rtp.Packet
GetNTP() time.Time
}

View file

@ -9,21 +9,21 @@ import (
"github.com/pion/rtp"
)
// DataVP8 is a VP8 data unit.
type DataVP8 struct {
// UnitVP8 is a VP8 data unit.
type UnitVP8 struct {
RTPPackets []*rtp.Packet
NTP time.Time
PTS time.Duration
Frame []byte
}
// GetRTPPackets implements Data.
func (d *DataVP8) GetRTPPackets() []*rtp.Packet {
// GetRTPPackets implements Unit.
func (d *UnitVP8) GetRTPPackets() []*rtp.Packet {
return d.RTPPackets
}
// GetNTP implements Data.
func (d *DataVP8) GetNTP() time.Time {
// GetNTP implements Unit.
func (d *UnitVP8) GetNTP() time.Time {
return d.NTP
}
@ -48,11 +48,11 @@ func newVP8(
return t, nil
}
func (t *formatProcessorVP8) Process(dat Data, hasNonRTSPReaders bool) error { //nolint:dupl
tdata := dat.(*DataVP8)
func (t *formatProcessorVP8) Process(unit Unit, hasNonRTSPReaders bool) error { //nolint:dupl
tunit := unit.(*UnitVP8)
if tdata.RTPPackets != nil {
pkt := tdata.RTPPackets[0]
if tunit.RTPPackets != nil {
pkt := tunit.RTPPackets[0]
// remove padding
pkt.Header.Padding = false
@ -77,19 +77,19 @@ func (t *formatProcessorVP8) Process(dat Data, hasNonRTSPReaders bool) error { /
return err
}
tdata.Frame = frame
tdata.PTS = PTS
tunit.Frame = frame
tunit.PTS = PTS
}
// route packet as is
return nil
}
pkts, err := t.encoder.Encode(tdata.Frame, tdata.PTS)
pkts, err := t.encoder.Encode(tunit.Frame, tunit.PTS)
if err != nil {
return err
}
tdata.RTPPackets = pkts
tunit.RTPPackets = pkts
return nil
}

View file

@ -9,21 +9,21 @@ import (
"github.com/pion/rtp"
)
// DataVP9 is a VP9 data unit.
type DataVP9 struct {
// UnitVP9 is a VP9 data unit.
type UnitVP9 struct {
RTPPackets []*rtp.Packet
NTP time.Time
PTS time.Duration
Frame []byte
}
// GetRTPPackets implements Data.
func (d *DataVP9) GetRTPPackets() []*rtp.Packet {
// GetRTPPackets implements Unit.
func (d *UnitVP9) GetRTPPackets() []*rtp.Packet {
return d.RTPPackets
}
// GetNTP implements Data.
func (d *DataVP9) GetNTP() time.Time {
// GetNTP implements Unit.
func (d *UnitVP9) GetNTP() time.Time {
return d.NTP
}
@ -48,11 +48,11 @@ func newVP9(
return t, nil
}
func (t *formatProcessorVP9) Process(dat Data, hasNonRTSPReaders bool) error { //nolint:dupl
tdata := dat.(*DataVP9)
func (t *formatProcessorVP9) Process(unit Unit, hasNonRTSPReaders bool) error { //nolint:dupl
tunit := unit.(*UnitVP9)
if tdata.RTPPackets != nil {
pkt := tdata.RTPPackets[0]
if tunit.RTPPackets != nil {
pkt := tunit.RTPPackets[0]
// remove padding
pkt.Header.Padding = false
@ -77,19 +77,19 @@ func (t *formatProcessorVP9) Process(dat Data, hasNonRTSPReaders bool) error { /
return err
}
tdata.Frame = frame
tdata.PTS = PTS
tunit.Frame = frame
tunit.PTS = PTS
}
// route packet as is
return nil
}
pkts, err := t.encoder.Encode(tdata.Frame, tdata.PTS)
pkts, err := t.encoder.Encode(tunit.Frame, tunit.PTS)
if err != nil {
return err
}
tdata.RTPPackets = pkts
tunit.RTPPackets = pkts
return nil
}