diff --git a/pkg/rtsp/client.go b/pkg/rtsp/client.go index 449dbf90..ae77800f 100644 --- a/pkg/rtsp/client.go +++ b/pkg/rtsp/client.go @@ -35,11 +35,11 @@ const ( type Mode byte const ( - ModeUnknown Mode = iota - ModeClientProducer + ModeUnknown Mode = iota + ModeClientProducer // conn act as RTSP client that receive data from RTSP server (ex. camera) ModeServerUnknown - ModeServerProducer - ModeServerConsumer + ModeServerProducer // conn act as RTSP server that reseive data from RTSP client (ex. ffmpeg output) + ModeServerConsumer // conn act as RTSP server that send data to RTSP client (ex. ffmpeg input) ) type State byte diff --git a/pkg/rtsp/consumer.go b/pkg/rtsp/consumer.go index 35ac5ade..e49db970 100644 --- a/pkg/rtsp/consumer.go +++ b/pkg/rtsp/consumer.go @@ -11,9 +11,9 @@ import ( ) func (c *Conn) AddTrack(media *streamer.Media, track *streamer.Track) *streamer.Track { - switch track.Direction { + switch c.mode { // send our track to RTSP consumer (ex. FFmpeg) - case streamer.DirectionSendonly: + case ModeServerConsumer: i := len(c.tracks) channelID := byte(i << 1) @@ -43,11 +43,21 @@ func (c *Conn) AddTrack(media *streamer.Media, track *streamer.Track) *streamer. return track - case streamer.DirectionRecvonly: - panic("not implemented") + // camera with backchannel support + case ModeClientProducer: + consCodec := media.MatchCodec(track.Codec) + consTrack := c.GetTrack(media, consCodec) + if consTrack == nil { + return nil + } + + return track.Bind(func(packet *rtp.Packet) error { + return consTrack.WriteRTP(packet) + }) } - panic("wrong direction") + println("WARNING: rtsp: AddTrack to wrong mode") + return nil } func (c *Conn) bindTrack(