From decd3af941cfe166ca45cc9ed6143a4b3db1af42 Mon Sep 17 00:00:00 2001 From: Alexey Khit Date: Fri, 27 Jan 2023 17:05:01 +0300 Subject: [PATCH] Add OR to RTSP Server codecs filter --- cmd/rtsp/rtsp.go | 16 +++++++--------- pkg/streamer/media.go | 44 ++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 48 insertions(+), 12 deletions(-) diff --git a/cmd/rtsp/rtsp.go b/cmd/rtsp/rtsp.go index 4ae86b77..6b8f8a77 100644 --- a/cmd/rtsp/rtsp.go +++ b/cmd/rtsp/rtsp.go @@ -164,7 +164,13 @@ func tcpHandler(conn *rtsp.Conn) { conn.SessionName = app.UserAgent - initMedias(conn) + conn.Medias = streamer.ParseQuery(conn.URL.Query()) + if conn.Medias == nil { + conn.Medias = []*streamer.Media{ + {Kind: streamer.KindVideo, Direction: streamer.DirectionRecvonly}, + {Kind: streamer.KindAudio, Direction: streamer.DirectionRecvonly}, + } + } if err := stream.AddConsumer(conn); err != nil { log.Warn().Err(err).Str("stream", name).Msg("[rtsp]") @@ -261,12 +267,4 @@ func initMedias(conn *rtsp.Conn) { } } } - - // set default media candidates if query is empty - if conn.Medias == nil { - conn.Medias = []*streamer.Media{ - {Kind: streamer.KindVideo, Direction: streamer.DirectionRecvonly}, - {Kind: streamer.KindAudio, Direction: streamer.DirectionRecvonly}, - } - } } diff --git a/pkg/streamer/media.go b/pkg/streamer/media.go index 9d638649..c321ac44 100644 --- a/pkg/streamer/media.go +++ b/pkg/streamer/media.go @@ -33,7 +33,7 @@ const ( CodecAAC = "MPEG4-GENERIC" CodecOpus = "OPUS" // payloadType: 111 CodecG722 = "G722" - CodecMPA = "MPA" // payload: 14 + CodecMP3 = "MPA" // payload: 14, aka MPEG-1 Layer III CodecELD = "ELD" // AAC-ELD ) @@ -44,7 +44,7 @@ func GetKind(name string) string { switch name { case CodecH264, CodecH265, CodecVP8, CodecVP9, CodecAV1, CodecJPEG: return KindVideo - case CodecPCMU, CodecPCMA, CodecAAC, CodecOpus, CodecG722, CodecMPA, CodecELD: + case CodecPCMU, CodecPCMA, CodecAAC, CodecOpus, CodecG722, CodecMP3, CodecELD: return KindAudio } return "" @@ -286,7 +286,7 @@ func UnmarshalCodec(md *sdp.MediaDescription, payloadType string) *Codec { c.Name = CodecPCMA c.ClockRate = 8000 case "14": - c.Name = CodecMPA + c.Name = CodecMP3 c.ClockRate = 44100 case "26": c.Name = CodecJPEG @@ -299,6 +299,44 @@ func UnmarshalCodec(md *sdp.MediaDescription, payloadType string) *Codec { return c } +func ParseQuery(query map[string][]string) (medias []*Media) { + // set media candidates from query list + for key, values := range query { + switch key { + case KindVideo, KindAudio: + for _, value := range values { + media := &Media{Kind: key, Direction: DirectionRecvonly} + + for _, name := range strings.Split(value, ",") { + if name == "" { + continue + } + + name = strings.ToUpper(name) + + // check aliases + switch name { + case "COPY": + name = "" // pass empty codecs list + case "MJPEG": + name = CodecJPEG + case "AAC": + name = CodecAAC + case "MP3": + name = CodecMP3 + } + + media.Codecs = append(media.Codecs, &Codec{Name: name}) + } + + medias = append(medias, media) + } + } + } + + return +} + func atoi(s string) (i int) { i, _ = strconv.Atoi(s) return