diff --git a/pkg/rtpcleaner/cleaner.go b/pkg/rtpcleaner/cleaner.go index 2596f844..6a658b61 100644 --- a/pkg/rtpcleaner/cleaner.go +++ b/pkg/rtpcleaner/cleaner.go @@ -81,6 +81,7 @@ func (p *Cleaner) processH264(pkt *rtp.Packet) ([]*Output, error) { } return nil, err } + ptsEqualsDTS := h264.IDRPresent(nalus) // re-encode diff --git a/track.go b/track.go index 3b1b888d..228cb9c2 100644 --- a/track.go +++ b/track.go @@ -66,6 +66,9 @@ func newTrackFromMediaDescription(md *psdp.MediaDescription) (Track, error) { case md.MediaName.Formats[0] == "26": return newTrackJPEGFromMediaDescription(control) + case md.MediaName.Formats[0] == "32": + return newTrackMPVFromMediaDescription(control) + case rtpmapPart1 == "H264/90000": return newTrackH264FromMediaDescription(control, payloadType, md) diff --git a/track_mpv.go b/track_mpv.go new file mode 100644 index 00000000..da1cfbd1 --- /dev/null +++ b/track_mpv.go @@ -0,0 +1,53 @@ +package gortsplib //nolint:dupl + +import ( + psdp "github.com/pion/sdp/v3" +) + +// TrackMPV is a MPEG-1 or MPEG-2 video track. +type TrackMPV struct { + trackBase +} + +// NewTrackMPV allocates a TrackMPV. +func NewTrackMPV() *TrackMPV { + return &TrackMPV{} +} + +func newTrackMPVFromMediaDescription( + control string) (*TrackMPV, error, +) { + return &TrackMPV{ + trackBase: trackBase{ + control: control, + }, + }, nil +} + +// ClockRate returns the track clock rate. +func (t *TrackMPV) ClockRate() int { + return 90000 +} + +func (t *TrackMPV) clone() Track { + return &TrackMPV{ + trackBase: t.trackBase, + } +} + +// MediaDescription returns the track media description in SDP format. +func (t *TrackMPV) MediaDescription() *psdp.MediaDescription { + return &psdp.MediaDescription{ + MediaName: psdp.MediaName{ + Media: "video", + Protos: []string{"RTP", "AVP"}, + Formats: []string{"32"}, + }, + Attributes: []psdp.Attribute{ + { + Key: "control", + Value: t.control, + }, + }, + } +} diff --git a/track_mpv_test.go b/track_mpv_test.go new file mode 100644 index 00000000..68a0a6d4 --- /dev/null +++ b/track_mpv_test.go @@ -0,0 +1,39 @@ +package gortsplib + +import ( + "testing" + + psdp "github.com/pion/sdp/v3" + "github.com/stretchr/testify/require" +) + +func TestTrackMPVNew(t *testing.T) { + track := NewTrackMPV() + require.Equal(t, "", track.GetControl()) +} + +func TestTrackMPVClone(t *testing.T) { + track := NewTrackMPV() + + clone := track.clone() + require.NotSame(t, track, clone) + require.Equal(t, track, clone) +} + +func TestTrackMPVMediaDescription(t *testing.T) { + track := NewTrackMPV() + + require.Equal(t, &psdp.MediaDescription{ + MediaName: psdp.MediaName{ + Media: "video", + Protos: []string{"RTP", "AVP"}, + Formats: []string{"32"}, + }, + Attributes: []psdp.Attribute{ + { + Key: "control", + Value: "", + }, + }, + }, track.MediaDescription()) +} diff --git a/track_test.go b/track_test.go index fb10187e..1e53ccc0 100644 --- a/track_test.go +++ b/track_test.go @@ -202,6 +202,17 @@ func TestTrackNewFromMediaDescription(t *testing.T) { }, &TrackJPEG{}, }, + { + "mpv", + &psdp.MediaDescription{ + MediaName: psdp.MediaName{ + Media: "video", + Protos: []string{"RTP", "AVP"}, + Formats: []string{"32"}, + }, + }, + &TrackMPV{}, + }, { "h264", &psdp.MediaDescription{