diff --git a/track.go b/track.go index 228cb9c2..ec796b62 100644 --- a/track.go +++ b/track.go @@ -67,7 +67,7 @@ func newTrackFromMediaDescription(md *psdp.MediaDescription) (Track, error) { return newTrackJPEGFromMediaDescription(control) case md.MediaName.Formats[0] == "32": - return newTrackMPVFromMediaDescription(control) + return newTrackMpegVideoFromMediaDescription(control) case rtpmapPart1 == "H264/90000": return newTrackH264FromMediaDescription(control, payloadType, md) @@ -84,6 +84,9 @@ func newTrackFromMediaDescription(md *psdp.MediaDescription) (Track, error) { case md.MediaName.Formats[0] == "8": return newTrackPCMAFromMediaDescription(control, rtpmapPart1) + case md.MediaName.Formats[0] == "14": + return newTrackMpegAudioFromMediaDescription(control) + case strings.HasPrefix(strings.ToLower(rtpmapPart1), "mpeg4-generic/"): return newTrackAACFromMediaDescription(control, payloadType, md) diff --git a/track_mpegaudio.go b/track_mpegaudio.go new file mode 100644 index 00000000..4bca7f70 --- /dev/null +++ b/track_mpegaudio.go @@ -0,0 +1,53 @@ +package gortsplib //nolint:dupl + +import ( + psdp "github.com/pion/sdp/v3" +) + +// TrackMpegAudio is a MPEG-1 or MPEG-2 audio track. +type TrackMpegAudio struct { + trackBase +} + +// NewTrackMpegAudio allocates a TrackMpegAudio. +func NewTrackMpegAudio() *TrackMpegAudio { + return &TrackMpegAudio{} +} + +func newTrackMpegAudioFromMediaDescription( + control string) (*TrackMpegAudio, error, +) { + return &TrackMpegAudio{ + trackBase: trackBase{ + control: control, + }, + }, nil +} + +// ClockRate returns the track clock rate. +func (t *TrackMpegAudio) ClockRate() int { + return 90000 +} + +func (t *TrackMpegAudio) clone() Track { + return &TrackMpegAudio{ + trackBase: t.trackBase, + } +} + +// MediaDescription returns the track media description in SDP format. +func (t *TrackMpegAudio) MediaDescription() *psdp.MediaDescription { + return &psdp.MediaDescription{ + MediaName: psdp.MediaName{ + Media: "audio", + Protos: []string{"RTP", "AVP"}, + Formats: []string{"14"}, + }, + Attributes: []psdp.Attribute{ + { + Key: "control", + Value: t.control, + }, + }, + } +} diff --git a/track_mpegaudio_test.go b/track_mpegaudio_test.go new file mode 100644 index 00000000..0d739f62 --- /dev/null +++ b/track_mpegaudio_test.go @@ -0,0 +1,39 @@ +package gortsplib + +import ( + "testing" + + psdp "github.com/pion/sdp/v3" + "github.com/stretchr/testify/require" +) + +func TestTrackMpegAudioNew(t *testing.T) { + track := NewTrackMpegAudio() + require.Equal(t, "", track.GetControl()) +} + +func TestTrackMpegAudioClone(t *testing.T) { + track := NewTrackMpegAudio() + + clone := track.clone() + require.NotSame(t, track, clone) + require.Equal(t, track, clone) +} + +func TestTrackMpegAudioMediaDescription(t *testing.T) { + track := NewTrackMpegAudio() + + require.Equal(t, &psdp.MediaDescription{ + MediaName: psdp.MediaName{ + Media: "audio", + Protos: []string{"RTP", "AVP"}, + Formats: []string{"14"}, + }, + Attributes: []psdp.Attribute{ + { + Key: "control", + Value: "", + }, + }, + }, track.MediaDescription()) +} diff --git a/track_mpv.go b/track_mpegvideo.go similarity index 53% rename from track_mpv.go rename to track_mpegvideo.go index da1cfbd1..b5331e0d 100644 --- a/track_mpv.go +++ b/track_mpegvideo.go @@ -4,20 +4,20 @@ import ( psdp "github.com/pion/sdp/v3" ) -// TrackMPV is a MPEG-1 or MPEG-2 video track. -type TrackMPV struct { +// TrackMpegVideo is a MPEG-1 or MPEG-2 video track. +type TrackMpegVideo struct { trackBase } -// NewTrackMPV allocates a TrackMPV. -func NewTrackMPV() *TrackMPV { - return &TrackMPV{} +// NewTrackMpegVideo allocates a TrackMpegVideo. +func NewTrackMpegVideo() *TrackMpegVideo { + return &TrackMpegVideo{} } -func newTrackMPVFromMediaDescription( - control string) (*TrackMPV, error, +func newTrackMpegVideoFromMediaDescription( + control string) (*TrackMpegVideo, error, ) { - return &TrackMPV{ + return &TrackMpegVideo{ trackBase: trackBase{ control: control, }, @@ -25,18 +25,18 @@ func newTrackMPVFromMediaDescription( } // ClockRate returns the track clock rate. -func (t *TrackMPV) ClockRate() int { +func (t *TrackMpegVideo) ClockRate() int { return 90000 } -func (t *TrackMPV) clone() Track { - return &TrackMPV{ +func (t *TrackMpegVideo) clone() Track { + return &TrackMpegVideo{ trackBase: t.trackBase, } } // MediaDescription returns the track media description in SDP format. -func (t *TrackMPV) MediaDescription() *psdp.MediaDescription { +func (t *TrackMpegVideo) MediaDescription() *psdp.MediaDescription { return &psdp.MediaDescription{ MediaName: psdp.MediaName{ Media: "video", diff --git a/track_mpv_test.go b/track_mpegvideo_test.go similarity index 69% rename from track_mpv_test.go rename to track_mpegvideo_test.go index 68a0a6d4..a446173d 100644 --- a/track_mpv_test.go +++ b/track_mpegvideo_test.go @@ -7,21 +7,21 @@ import ( "github.com/stretchr/testify/require" ) -func TestTrackMPVNew(t *testing.T) { - track := NewTrackMPV() +func TestTrackMpegVideoNew(t *testing.T) { + track := NewTrackMpegVideo() require.Equal(t, "", track.GetControl()) } -func TestTrackMPVClone(t *testing.T) { - track := NewTrackMPV() +func TestTrackMpegVideoClone(t *testing.T) { + track := NewTrackMpegVideo() clone := track.clone() require.NotSame(t, track, clone) require.Equal(t, track, clone) } -func TestTrackMPVMediaDescription(t *testing.T) { - track := NewTrackMPV() +func TestTrackMpegVideoMediaDescription(t *testing.T) { + track := NewTrackMpegVideo() require.Equal(t, &psdp.MediaDescription{ MediaName: psdp.MediaName{ diff --git a/track_test.go b/track_test.go index 1e53ccc0..e9f41743 100644 --- a/track_test.go +++ b/track_test.go @@ -37,6 +37,17 @@ func TestTrackNewFromMediaDescription(t *testing.T) { }, &TrackPCMU{}, }, + { + "mpeg audio", + &psdp.MediaDescription{ + MediaName: psdp.MediaName{ + Media: "audio", + Protos: []string{"RTP", "AVP"}, + Formats: []string{"14"}, + }, + }, + &TrackMpegAudio{}, + }, { "aac", &psdp.MediaDescription{ @@ -203,7 +214,7 @@ func TestTrackNewFromMediaDescription(t *testing.T) { &TrackJPEG{}, }, { - "mpv", + "mpeg video", &psdp.MediaDescription{ MediaName: psdp.MediaName{ Media: "video", @@ -211,7 +222,7 @@ func TestTrackNewFromMediaDescription(t *testing.T) { Formats: []string{"32"}, }, }, - &TrackMPV{}, + &TrackMpegVideo{}, }, { "h264",