From 6d9d89bbe3ae0e90c8838412226d5aacbef922dc Mon Sep 17 00:00:00 2001 From: Alexey Khit Date: Wed, 3 May 2023 08:01:33 +0300 Subject: [PATCH] Fix support 2 way audio for Reolink Doorbell #331 --- pkg/pcm/helpers.go | 35 +++++++++++++++++++++++++++++++++++ pkg/rtsp/consumer.go | 7 +++++++ 2 files changed, 42 insertions(+) create mode 100644 pkg/pcm/helpers.go diff --git a/pkg/pcm/helpers.go b/pkg/pcm/helpers.go new file mode 100644 index 00000000..d873f7e3 --- /dev/null +++ b/pkg/pcm/helpers.go @@ -0,0 +1,35 @@ +package pcm + +import ( + "github.com/AlexxIT/go2rtc/pkg/core" + "github.com/pion/rtp" +) + +func RepackBackchannel(handler core.HandlerFunc) core.HandlerFunc { + var buf []byte + var seq uint16 + + return func(packet *rtp.Packet) { + buf = append(buf, packet.Payload...) + if len(buf) < 1024 { + return + } + + pkt := &rtp.Packet{ + Header: rtp.Header{ + Version: 2, + Marker: true, // should be true + PayloadType: packet.PayloadType, // will be owerwriten + SequenceNumber: seq, + Timestamp: 0, // should be always zero + SSRC: packet.SSRC, + }, + Payload: buf[:1024], + } + + handler(pkt) + + buf = buf[1024:] + seq++ + } +} diff --git a/pkg/rtsp/consumer.go b/pkg/rtsp/consumer.go index 38125147..663c8522 100644 --- a/pkg/rtsp/consumer.go +++ b/pkg/rtsp/consumer.go @@ -6,6 +6,7 @@ import ( "github.com/AlexxIT/go2rtc/pkg/h264" "github.com/AlexxIT/go2rtc/pkg/h265" "github.com/AlexxIT/go2rtc/pkg/mjpeg" + "github.com/AlexxIT/go2rtc/pkg/pcm" "github.com/pion/rtp" "time" ) @@ -60,6 +61,12 @@ func (c *Conn) AddTrack(media *core.Media, codec *core.Codec, track *core.Receiv sender := core.NewSender(media, codec) // important to send original codec for valid IsRTP check sender.Handler = c.packetWriter(track.Codec, channel, codec.PayloadType) + + // https://github.com/AlexxIT/go2rtc/issues/331 + if c.mode == core.ModeActiveProducer && track.Codec.Name == core.CodecPCMA { + sender.Handler = pcm.RepackBackchannel(sender.Handler) + } + sender.HandleRTP(track) c.senders = append(c.senders, sender)