From bf248c49c38493fba50a72a7c7f683615e1b8fa4 Mon Sep 17 00:00:00 2001 From: Alexey Khit Date: Mon, 21 Aug 2023 15:34:53 +0300 Subject: [PATCH] Add support two channel PCM family audio #580 --- pkg/mp4/consumer.go | 7 ++++++- pkg/pcm/flac.go | 12 ++++-------- pkg/pcm/pcm.go | 4 ++++ 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/pkg/mp4/consumer.go b/pkg/mp4/consumer.go index 89c73cf7..8d0beef9 100644 --- a/pkg/mp4/consumer.go +++ b/pkg/mp4/consumer.go @@ -130,8 +130,13 @@ func (c *Consumer) AddTrack(media *core.Media, _ *core.Codec, track *core.Receiv } case core.CodecOpus, core.CodecMP3: // no changes case core.CodecPCMA, core.CodecPCMU, core.CodecPCM, core.CodecPCML: - handler.Handler = pcm.FLACEncoder(track.Codec, handler.Handler) codec.Name = core.CodecFLAC + if codec.Channels == 2 { + // hacky way for support two channels audio + codec.Channels = 1 + codec.ClockRate *= 2 + } + handler.Handler = pcm.FLACEncoder(track.Codec.Name, codec.ClockRate, handler.Handler) default: handler.Handler = nil diff --git a/pkg/pcm/flac.go b/pkg/pcm/flac.go index fdbe5190..808d4a75 100644 --- a/pkg/pcm/flac.go +++ b/pkg/pcm/flac.go @@ -48,13 +48,9 @@ func FLACHeader(magic bool, sampleRate uint32) []byte { var table8 *crc8.Table var table16 *crc16.Table -func FLACEncoder(codec *core.Codec, handler core.HandlerFunc) core.HandlerFunc { - if codec.Channels >= 2 { - return nil - } - +func FLACEncoder(codecName string, clockRate uint32, handler core.HandlerFunc) core.HandlerFunc { var sr byte - switch codec.ClockRate { + switch clockRate { case 8000: sr = 0b0100 case 16000: @@ -87,7 +83,7 @@ func FLACEncoder(codec *core.Codec, handler core.HandlerFunc) core.HandlerFunc { return func(packet *rtp.Packet) { samples := uint16(len(packet.Payload)) - if codec.Name == core.CodecPCM || codec.Name == core.CodecPCML { + if codecName == core.CodecPCM || codecName == core.CodecPCML { samples /= 2 } @@ -115,7 +111,7 @@ func FLACEncoder(codec *core.Codec, handler core.HandlerFunc) core.HandlerFunc { n += 1 // 3. Subframe - switch codec.Name { + switch codecName { case core.CodecPCMA: for _, b := range packet.Payload { s16 := PCMAtoPCM(b) diff --git a/pkg/pcm/pcm.go b/pkg/pcm/pcm.go index 920dfd1d..60062b62 100644 --- a/pkg/pcm/pcm.go +++ b/pkg/pcm/pcm.go @@ -11,6 +11,10 @@ import ( func ResampleToG711(codec *core.Codec, sampleRate uint32, handler core.HandlerFunc) core.HandlerFunc { n := float32(codec.ClockRate) / float32(sampleRate) + if codec.Channels == 2 { + n *= 2 // hacky way for support two channels audio + } + switch codec.Name { case core.CodecPCMA: return DownsampleByte(PCMAtoPCM, PCMtoPCMA, n, handler)