From b18e1d72763cc67f7be5418b3be2471d7349afb0 Mon Sep 17 00:00:00 2001 From: Gabriele Alberti Date: Mon, 22 Feb 2021 13:20:15 +0100 Subject: [PATCH] Fix RTP extended header parsing As ext header length isn't always 1, the shift to find the beginning of the Opus packet must be adjusted dynamically. --- voice.go | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/voice.go b/voice.go index dbafd83..aedb879 100644 --- a/voice.go +++ b/voice.go @@ -831,9 +831,15 @@ func (v *VoiceConnection) opusReceiver(udpConn *net.UDPConn, close <-chan struct copy(nonce[:], recvbuf[0:12]) p.Opus, _ = secretbox.Open(nil, recvbuf[12:rlen], &nonce, &v.op4.SecretKey) - if len(p.Opus) > 8 && recvbuf[0] == 0x90 { - // Extension bit is set, first 8 bytes is the extended header - p.Opus = p.Opus[8:] + // extension bit set, and not a RTCP packet + if ((recvbuf[0] & 0x10) == 0x10) && ((recvbuf[1] & 0x80) == 0) { + // get extended header length + extlen := binary.BigEndian.Uint16(p.Opus[2:4]) + // 4 bytes (ext header header) + 4*extlen (ext header data) + shift := int(4 + 4*extlen) + if len(p.Opus) > shift { + p.Opus = p.Opus[shift:] + } } if c != nil {