forked from External/mediamtx
rename Data into Unit (#1556)
This commit is contained in:
parent
25dc252342
commit
e8bdad8a1e
23 changed files with 240 additions and 237 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
13
internal/formatprocessor/unit.go
Normal file
13
internal/formatprocessor/unit.go
Normal 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
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue