From 0101ad961ccd62c5680361d5b44309c67a286820 Mon Sep 17 00:00:00 2001 From: aler9 <46489434+aler9@users.noreply.github.com> Date: Mon, 6 Jun 2022 12:51:33 +0200 Subject: [PATCH] add TrackJPEG --- track.go | 10 ++++++--- track_jpeg.go | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++ track_pcma.go | 3 +-- track_pcmu.go | 3 +-- track_test.go | 13 ++++++++++-- 5 files changed, 77 insertions(+), 9 deletions(-) create mode 100644 track_jpeg.go diff --git a/track.go b/track.go index 42e7e67a..9c135563 100644 --- a/track.go +++ b/track.go @@ -61,17 +61,21 @@ func newTrackFromMediaDescription(md *psdp.MediaDescription) (Track, error) { switch { case md.MediaName.Media == "video": - if rtpmapPart1 == "H264/90000" { + switch { + case len(md.MediaName.Formats) == 1 && md.MediaName.Formats[0] == "26": + return newTrackJPEGFromMediaDescription(control) + + case rtpmapPart1 == "H264/90000": return newTrackH264FromMediaDescription(control, payloadType, md) } case md.MediaName.Media == "audio": switch { case len(md.MediaName.Formats) == 1 && md.MediaName.Formats[0] == "0": - return newTrackPCMUFromMediaDescription(control, rtpmapPart1, md) + return newTrackPCMUFromMediaDescription(control, rtpmapPart1) case len(md.MediaName.Formats) == 1 && md.MediaName.Formats[0] == "8": - return newTrackPCMAFromMediaDescription(control, rtpmapPart1, md) + return newTrackPCMAFromMediaDescription(control, rtpmapPart1) case strings.HasPrefix(strings.ToLower(rtpmapPart1), "mpeg4-generic/"): return newTrackAACFromMediaDescription(control, payloadType, md) diff --git a/track_jpeg.go b/track_jpeg.go new file mode 100644 index 00000000..a59cea8c --- /dev/null +++ b/track_jpeg.go @@ -0,0 +1,57 @@ +package gortsplib //nolint:dupl + +import ( + psdp "github.com/pion/sdp/v3" +) + +// TrackJPEG is a JPEG track. +type TrackJPEG struct { + trackBase +} + +// NewTrackJPEG allocates a TrackJPEG. +func NewTrackJPEG() *TrackJPEG { + return &TrackJPEG{} +} + +func newTrackJPEGFromMediaDescription( + control string) (*TrackJPEG, error, +) { + return &TrackJPEG{ + trackBase: trackBase{ + control: control, + }, + }, nil +} + +// ClockRate returns the track clock rate. +func (t *TrackJPEG) ClockRate() int { + return 90000 +} + +func (t *TrackJPEG) clone() Track { + return &TrackJPEG{ + trackBase: t.trackBase, + } +} + +// MediaDescription returns the track media description in SDP format. +func (t *TrackJPEG) MediaDescription() *psdp.MediaDescription { + return &psdp.MediaDescription{ + MediaName: psdp.MediaName{ + Media: "audio", + Protos: []string{"RTP", "AVP"}, + Formats: []string{"26"}, + }, + Attributes: []psdp.Attribute{ + { + Key: "rtpmap", + Value: "26 JPEG/90000", + }, + { + Key: "control", + Value: t.control, + }, + }, + } +} diff --git a/track_pcma.go b/track_pcma.go index ba9fd48b..baee2ef2 100644 --- a/track_pcma.go +++ b/track_pcma.go @@ -19,8 +19,7 @@ func NewTrackPCMA() *TrackPCMA { func newTrackPCMAFromMediaDescription( control string, - rtpmapPart1 string, - md *psdp.MediaDescription) (*TrackPCMA, error, + rtpmapPart1 string) (*TrackPCMA, error, ) { tmp := strings.Split(rtpmapPart1, "/") if len(tmp) >= 3 && tmp[2] != "1" { diff --git a/track_pcmu.go b/track_pcmu.go index 421b6ab2..7e0c9d25 100644 --- a/track_pcmu.go +++ b/track_pcmu.go @@ -19,8 +19,7 @@ func NewTrackPCMU() *TrackPCMU { func newTrackPCMUFromMediaDescription( control string, - rtpmapPart1 string, - md *psdp.MediaDescription) (*TrackPCMU, error, + rtpmapPart1 string) (*TrackPCMU, error, ) { tmp := strings.Split(rtpmapPart1, "/") if len(tmp) >= 3 && tmp[2] != "1" { diff --git a/track_test.go b/track_test.go index 53d0cd50..1255f935 100644 --- a/track_test.go +++ b/track_test.go @@ -31,7 +31,6 @@ func TestTrackNewFromMediaDescription(t *testing.T) { &psdp.MediaDescription{ MediaName: psdp.MediaName{ Media: "audio", - Port: psdp.RangedPort{Value: 49170}, Protos: []string{"RTP", "AVP"}, Formats: []string{"0"}, }, @@ -192,6 +191,17 @@ func TestTrackNewFromMediaDescription(t *testing.T) { channelCount: 2, }, }, + { + "jpeg", + &psdp.MediaDescription{ + MediaName: psdp.MediaName{ + Media: "video", + Protos: []string{"RTP", "AVP"}, + Formats: []string{"26"}, + }, + }, + &TrackJPEG{}, + }, { "h264", &psdp.MediaDescription{ @@ -343,7 +353,6 @@ func TestTrackNewFromMediaDescription(t *testing.T) { &psdp.MediaDescription{ MediaName: psdp.MediaName{ Media: "video", - Port: psdp.RangedPort{Value: 0}, Protos: []string{"RTP", "AVP"}, Formats: []string{"98", "96"}, },