From e12b22ae778342c83d879cc44e33d7aabeaa2b74 Mon Sep 17 00:00:00 2001 From: aler9 <46489434+aler9@users.noreply.github.com> Date: Tue, 8 Mar 2022 12:47:53 +0100 Subject: [PATCH] fix encoding of RTP packets with padding this fixes a SIGSEGV with GStreamer --- client.go | 6 +++++- client_publish_test.go | 2 +- client_read_test.go | 2 +- clientudpl.go | 4 ++++ examples/client-publish-aac/main.go | 2 +- examples/client-publish-h264/main.go | 2 +- examples/client-publish-options/main.go | 2 +- examples/client-publish-opus/main.go | 2 +- examples/client-publish-pause/main.go | 2 +- examples/client-read-aac/main.go | 2 +- examples/client-read-h264-convert-to-jpeg/main.go | 2 +- examples/client-read-h264-save-to-disk/main.go | 2 +- examples/client-read-h264/main.go | 2 +- examples/client-read-options/main.go | 2 +- examples/client-read-partial/main.go | 2 +- examples/client-read-pause/main.go | 2 +- examples/client-read-republish/main.go | 2 +- examples/client-read/main.go | 2 +- go.mod | 2 +- go.sum | 4 ++-- pkg/rtcpreceiver/rtcpreceiver.go | 2 +- pkg/rtcpreceiver/rtcpreceiver_test.go | 2 +- pkg/rtcpsender/rtcpsender.go | 2 +- pkg/rtcpsender/rtcpsender_test.go | 2 +- pkg/rtpaac/decoder.go | 2 +- pkg/rtpaac/encoder.go | 2 +- pkg/rtpaac/rtpaac_test.go | 2 +- pkg/rtph264/decoder.go | 2 +- pkg/rtph264/encoder.go | 2 +- pkg/rtph264/rtph264_test.go | 2 +- rtppacketmultibuffer.go | 2 +- server_publish_test.go | 2 +- server_read_test.go | 2 +- serverconn.go | 4 ++++ serverhandler.go | 2 +- serversession.go | 2 +- serverstream.go | 2 +- serverudpl.go | 4 ++++ 38 files changed, 52 insertions(+), 36 deletions(-) diff --git a/client.go b/client.go index 1f505426..43962c5d 100644 --- a/client.go +++ b/client.go @@ -22,7 +22,7 @@ import ( "time" "github.com/pion/rtcp" - "github.com/pion/rtp" + "github.com/pion/rtp/v2" "github.com/aler9/gortsplib/pkg/auth" "github.com/aler9/gortsplib/pkg/base" @@ -765,6 +765,10 @@ func (c *Client) runReader() { return } + // remove padding + pkt.Header.Padding = false + pkt.PaddingSize = 0 + c.tracks[trackID].rtcpReceiver.ProcessPacketRTP(now, pkt) c.OnPacketRTP(trackID, pkt) } else { diff --git a/client_publish_test.go b/client_publish_test.go index 469a4ec4..48ae10fd 100644 --- a/client_publish_test.go +++ b/client_publish_test.go @@ -10,7 +10,7 @@ import ( "time" "github.com/pion/rtcp" - "github.com/pion/rtp" + "github.com/pion/rtp/v2" "github.com/stretchr/testify/require" "github.com/aler9/gortsplib/pkg/base" diff --git a/client_read_test.go b/client_read_test.go index 47204274..74808f6c 100644 --- a/client_read_test.go +++ b/client_read_test.go @@ -12,7 +12,7 @@ import ( "time" "github.com/pion/rtcp" - "github.com/pion/rtp" + "github.com/pion/rtp/v2" "github.com/stretchr/testify/require" "golang.org/x/net/ipv4" diff --git a/clientudpl.go b/clientudpl.go index 4dabc332..9fb262da 100644 --- a/clientudpl.go +++ b/clientudpl.go @@ -183,6 +183,10 @@ func (u *clientUDPListener) processPlayRTP(now time.Time, payload []byte) { return } + // remove padding + pkt.Header.Padding = false + pkt.PaddingSize = 0 + u.c.tracks[u.trackID].rtcpReceiver.ProcessPacketRTP(now, pkt) u.c.OnPacketRTP(u.trackID, pkt) } diff --git a/examples/client-publish-aac/main.go b/examples/client-publish-aac/main.go index 8b3459fa..33089558 100644 --- a/examples/client-publish-aac/main.go +++ b/examples/client-publish-aac/main.go @@ -5,7 +5,7 @@ import ( "net" "github.com/aler9/gortsplib" - "github.com/pion/rtp" + "github.com/pion/rtp/v2" ) // This example shows how to diff --git a/examples/client-publish-h264/main.go b/examples/client-publish-h264/main.go index 4d4fb03a..01f7fcd9 100644 --- a/examples/client-publish-h264/main.go +++ b/examples/client-publish-h264/main.go @@ -6,7 +6,7 @@ import ( "github.com/aler9/gortsplib" "github.com/aler9/gortsplib/pkg/rtph264" - "github.com/pion/rtp" + "github.com/pion/rtp/v2" ) // This example shows how to diff --git a/examples/client-publish-options/main.go b/examples/client-publish-options/main.go index 7dcaaf15..e9bb8e09 100644 --- a/examples/client-publish-options/main.go +++ b/examples/client-publish-options/main.go @@ -7,7 +7,7 @@ import ( "github.com/aler9/gortsplib" "github.com/aler9/gortsplib/pkg/rtph264" - "github.com/pion/rtp" + "github.com/pion/rtp/v2" ) // This example shows how to diff --git a/examples/client-publish-opus/main.go b/examples/client-publish-opus/main.go index e3c81829..36ba16f7 100644 --- a/examples/client-publish-opus/main.go +++ b/examples/client-publish-opus/main.go @@ -5,7 +5,7 @@ import ( "net" "github.com/aler9/gortsplib" - "github.com/pion/rtp" + "github.com/pion/rtp/v2" ) // This example shows how to diff --git a/examples/client-publish-pause/main.go b/examples/client-publish-pause/main.go index 33962c97..867846c7 100644 --- a/examples/client-publish-pause/main.go +++ b/examples/client-publish-pause/main.go @@ -7,7 +7,7 @@ import ( "github.com/aler9/gortsplib" "github.com/aler9/gortsplib/pkg/rtph264" - "github.com/pion/rtp" + "github.com/pion/rtp/v2" ) // This example shows how to diff --git a/examples/client-read-aac/main.go b/examples/client-read-aac/main.go index 55d6415b..6655f20d 100644 --- a/examples/client-read-aac/main.go +++ b/examples/client-read-aac/main.go @@ -6,7 +6,7 @@ import ( "github.com/aler9/gortsplib" "github.com/aler9/gortsplib/pkg/base" "github.com/aler9/gortsplib/pkg/rtpaac" - "github.com/pion/rtp" + "github.com/pion/rtp/v2" ) // This example shows how to diff --git a/examples/client-read-h264-convert-to-jpeg/main.go b/examples/client-read-h264-convert-to-jpeg/main.go index e9737515..ec13c290 100644 --- a/examples/client-read-h264-convert-to-jpeg/main.go +++ b/examples/client-read-h264-convert-to-jpeg/main.go @@ -11,7 +11,7 @@ import ( "github.com/aler9/gortsplib" "github.com/aler9/gortsplib/pkg/base" "github.com/aler9/gortsplib/pkg/rtph264" - "github.com/pion/rtp" + "github.com/pion/rtp/v2" ) // This example shows how to diff --git a/examples/client-read-h264-save-to-disk/main.go b/examples/client-read-h264-save-to-disk/main.go index 0c67fb91..88e659ea 100644 --- a/examples/client-read-h264-save-to-disk/main.go +++ b/examples/client-read-h264-save-to-disk/main.go @@ -4,7 +4,7 @@ import ( "github.com/aler9/gortsplib" "github.com/aler9/gortsplib/pkg/base" "github.com/aler9/gortsplib/pkg/rtph264" - "github.com/pion/rtp" + "github.com/pion/rtp/v2" ) // This example shows how to diff --git a/examples/client-read-h264/main.go b/examples/client-read-h264/main.go index ff71c46a..9f0a7573 100644 --- a/examples/client-read-h264/main.go +++ b/examples/client-read-h264/main.go @@ -6,7 +6,7 @@ import ( "github.com/aler9/gortsplib" "github.com/aler9/gortsplib/pkg/base" "github.com/aler9/gortsplib/pkg/rtph264" - "github.com/pion/rtp" + "github.com/pion/rtp/v2" ) // This example shows how to diff --git a/examples/client-read-options/main.go b/examples/client-read-options/main.go index dfb59dde..f440853a 100644 --- a/examples/client-read-options/main.go +++ b/examples/client-read-options/main.go @@ -6,7 +6,7 @@ import ( "github.com/aler9/gortsplib" "github.com/pion/rtcp" - "github.com/pion/rtp" + "github.com/pion/rtp/v2" ) // This example shows how to diff --git a/examples/client-read-partial/main.go b/examples/client-read-partial/main.go index 67350bfb..da7312f9 100644 --- a/examples/client-read-partial/main.go +++ b/examples/client-read-partial/main.go @@ -6,7 +6,7 @@ import ( "github.com/aler9/gortsplib" "github.com/aler9/gortsplib/pkg/base" "github.com/pion/rtcp" - "github.com/pion/rtp" + "github.com/pion/rtp/v2" ) // This example shows how to diff --git a/examples/client-read-pause/main.go b/examples/client-read-pause/main.go index 29df792c..2c808bba 100644 --- a/examples/client-read-pause/main.go +++ b/examples/client-read-pause/main.go @@ -6,7 +6,7 @@ import ( "github.com/aler9/gortsplib" "github.com/pion/rtcp" - "github.com/pion/rtp" + "github.com/pion/rtp/v2" ) // This example shows how to diff --git a/examples/client-read-republish/main.go b/examples/client-read-republish/main.go index febff98c..815ea1c1 100644 --- a/examples/client-read-republish/main.go +++ b/examples/client-read-republish/main.go @@ -5,7 +5,7 @@ import ( "github.com/aler9/gortsplib" "github.com/aler9/gortsplib/pkg/base" - "github.com/pion/rtp" + "github.com/pion/rtp/v2" ) // This example shows how to diff --git a/examples/client-read/main.go b/examples/client-read/main.go index a852bdbe..97966aaa 100644 --- a/examples/client-read/main.go +++ b/examples/client-read/main.go @@ -5,7 +5,7 @@ import ( "github.com/aler9/gortsplib" "github.com/pion/rtcp" - "github.com/pion/rtp" + "github.com/pion/rtp/v2" ) // This example shows how to connect to a RTSP server diff --git a/go.mod b/go.mod index 543853cc..5c07b695 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/asticode/go-astits v1.10.0 github.com/icza/bitio v1.0.0 github.com/pion/rtcp v1.2.9 - github.com/pion/rtp v1.7.4 + github.com/pion/rtp/v2 v2.0.0-20220302185659-b3d10fc096b0 github.com/pion/sdp/v3 v3.0.2 github.com/stretchr/testify v1.7.0 golang.org/x/net v0.0.0-20210610132358-84b48f89b13b diff --git a/go.sum b/go.sum index cba2811c..6a0790d8 100644 --- a/go.sum +++ b/go.sum @@ -12,8 +12,8 @@ github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA= github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8= github.com/pion/rtcp v1.2.9 h1:1ujStwg++IOLIEoOiIQ2s+qBuJ1VN81KW+9pMPsif+U= github.com/pion/rtcp v1.2.9/go.mod h1:qVPhiCzAm4D/rxb6XzKeyZiQK69yJpbUDJSF7TgrqNo= -github.com/pion/rtp v1.7.4 h1:4dMbjb1SuynU5OpA3kz1zHK+u+eOCQjW3MAeVHf1ODA= -github.com/pion/rtp v1.7.4/go.mod h1:bDb5n+BFZxXx0Ea7E5qe+klMuqiBrP+w8XSjiWtCUko= +github.com/pion/rtp/v2 v2.0.0-20220302185659-b3d10fc096b0 h1:zyOGxHutZ6IhksQSMtwf3OFXB29W5R18yFQWOQJYWjU= +github.com/pion/rtp/v2 v2.0.0-20220302185659-b3d10fc096b0/go.mod h1:Vj+rrFbJCT3yxqE/VSwaOo9DQ2pMKGPxuE7hplGOlOs= github.com/pion/sdp/v3 v3.0.2 h1:UNnSPVaMM+Pdu/mR9UvAyyo6zkdYbKeuOooCwZvTl/g= github.com/pion/sdp/v3 v3.0.2/go.mod h1:bNiSknmJE0HYBprTHXKPQ3+JjacTv5uap92ueJZKsRk= github.com/pkg/profile v1.4.0/go.mod h1:NWz/XGvpEW1FyYQ7fCx4dqYBLlfTcE+A9FLAkNKqjFE= diff --git a/pkg/rtcpreceiver/rtcpreceiver.go b/pkg/rtcpreceiver/rtcpreceiver.go index d43c666f..3e204aa4 100644 --- a/pkg/rtcpreceiver/rtcpreceiver.go +++ b/pkg/rtcpreceiver/rtcpreceiver.go @@ -7,7 +7,7 @@ import ( "time" "github.com/pion/rtcp" - "github.com/pion/rtp" + "github.com/pion/rtp/v2" ) func randUint32() uint32 { diff --git a/pkg/rtcpreceiver/rtcpreceiver_test.go b/pkg/rtcpreceiver/rtcpreceiver_test.go index 0efc54ed..0304feb6 100644 --- a/pkg/rtcpreceiver/rtcpreceiver_test.go +++ b/pkg/rtcpreceiver/rtcpreceiver_test.go @@ -5,7 +5,7 @@ import ( "time" "github.com/pion/rtcp" - "github.com/pion/rtp" + "github.com/pion/rtp/v2" "github.com/stretchr/testify/require" ) diff --git a/pkg/rtcpsender/rtcpsender.go b/pkg/rtcpsender/rtcpsender.go index d1dc97b5..5cbcea41 100644 --- a/pkg/rtcpsender/rtcpsender.go +++ b/pkg/rtcpsender/rtcpsender.go @@ -6,7 +6,7 @@ import ( "time" "github.com/pion/rtcp" - "github.com/pion/rtp" + "github.com/pion/rtp/v2" ) // RTCPSender is a utility to generate RTCP sender reports. diff --git a/pkg/rtcpsender/rtcpsender_test.go b/pkg/rtcpsender/rtcpsender_test.go index 2394b5e0..7c41c9bc 100644 --- a/pkg/rtcpsender/rtcpsender_test.go +++ b/pkg/rtcpsender/rtcpsender_test.go @@ -5,7 +5,7 @@ import ( "time" "github.com/pion/rtcp" - "github.com/pion/rtp" + "github.com/pion/rtp/v2" "github.com/stretchr/testify/require" ) diff --git a/pkg/rtpaac/decoder.go b/pkg/rtpaac/decoder.go index 4d760c74..c76ce355 100644 --- a/pkg/rtpaac/decoder.go +++ b/pkg/rtpaac/decoder.go @@ -6,7 +6,7 @@ import ( "fmt" "time" - "github.com/pion/rtp" + "github.com/pion/rtp/v2" "github.com/aler9/gortsplib/pkg/rtptimedec" ) diff --git a/pkg/rtpaac/encoder.go b/pkg/rtpaac/encoder.go index db4fec23..eeb31840 100644 --- a/pkg/rtpaac/encoder.go +++ b/pkg/rtpaac/encoder.go @@ -5,7 +5,7 @@ import ( "encoding/binary" "time" - "github.com/pion/rtp" + "github.com/pion/rtp/v2" ) const ( diff --git a/pkg/rtpaac/rtpaac_test.go b/pkg/rtpaac/rtpaac_test.go index a5dc7c61..ef71d240 100644 --- a/pkg/rtpaac/rtpaac_test.go +++ b/pkg/rtpaac/rtpaac_test.go @@ -5,7 +5,7 @@ import ( "testing" "time" - "github.com/pion/rtp" + "github.com/pion/rtp/v2" "github.com/stretchr/testify/require" ) diff --git a/pkg/rtph264/decoder.go b/pkg/rtph264/decoder.go index b7db2281..4c2853b0 100644 --- a/pkg/rtph264/decoder.go +++ b/pkg/rtph264/decoder.go @@ -8,7 +8,7 @@ import ( "net" "time" - "github.com/pion/rtp" + "github.com/pion/rtp/v2" "github.com/aler9/gortsplib/pkg/h264" "github.com/aler9/gortsplib/pkg/rtptimedec" diff --git a/pkg/rtph264/encoder.go b/pkg/rtph264/encoder.go index 7dafb39c..9d2f74e3 100644 --- a/pkg/rtph264/encoder.go +++ b/pkg/rtph264/encoder.go @@ -5,7 +5,7 @@ import ( "encoding/binary" "time" - "github.com/pion/rtp" + "github.com/pion/rtp/v2" ) const ( diff --git a/pkg/rtph264/rtph264_test.go b/pkg/rtph264/rtph264_test.go index 45f9255b..16044061 100644 --- a/pkg/rtph264/rtph264_test.go +++ b/pkg/rtph264/rtph264_test.go @@ -6,7 +6,7 @@ import ( "testing" "time" - "github.com/pion/rtp" + "github.com/pion/rtp/v2" "github.com/stretchr/testify/require" ) diff --git a/rtppacketmultibuffer.go b/rtppacketmultibuffer.go index a36f2233..c2a70677 100644 --- a/rtppacketmultibuffer.go +++ b/rtppacketmultibuffer.go @@ -1,7 +1,7 @@ package gortsplib import ( - "github.com/pion/rtp" + "github.com/pion/rtp/v2" ) type rtpPacketMultiBuffer struct { diff --git a/server_publish_test.go b/server_publish_test.go index fb3095da..1271347d 100644 --- a/server_publish_test.go +++ b/server_publish_test.go @@ -9,7 +9,7 @@ import ( "time" "github.com/pion/rtcp" - "github.com/pion/rtp" + "github.com/pion/rtp/v2" psdp "github.com/pion/sdp/v3" "github.com/stretchr/testify/require" diff --git a/server_read_test.go b/server_read_test.go index 0f409a63..238779a7 100644 --- a/server_read_test.go +++ b/server_read_test.go @@ -10,7 +10,7 @@ import ( "testing" "time" - "github.com/pion/rtp" + "github.com/pion/rtp/v2" psdp "github.com/pion/sdp/v3" "github.com/stretchr/testify/require" "golang.org/x/net/ipv4" diff --git a/serverconn.go b/serverconn.go index ac0a258e..95866c4a 100644 --- a/serverconn.go +++ b/serverconn.go @@ -256,6 +256,10 @@ func (sc *ServerConn) readFuncTCP(readRequest chan readReq) error { return } + // remove padding + pkt.Header.Padding = false + pkt.PaddingSize = 0 + if h, ok := sc.s.Handler.(ServerHandlerOnPacketRTP); ok { h.OnPacketRTP(&ServerHandlerOnPacketRTPCtx{ Session: sc.session, diff --git a/serverhandler.go b/serverhandler.go index 2372d60e..bc7dcb1d 100644 --- a/serverhandler.go +++ b/serverhandler.go @@ -2,7 +2,7 @@ package gortsplib import ( "github.com/pion/rtcp" - "github.com/pion/rtp" + "github.com/pion/rtp/v2" "github.com/aler9/gortsplib/pkg/base" ) diff --git a/serversession.go b/serversession.go index e7bdc0b0..7aebe5b7 100644 --- a/serversession.go +++ b/serversession.go @@ -12,7 +12,7 @@ import ( "time" "github.com/pion/rtcp" - "github.com/pion/rtp" + "github.com/pion/rtp/v2" "github.com/aler9/gortsplib/pkg/base" "github.com/aler9/gortsplib/pkg/headers" diff --git a/serverstream.go b/serverstream.go index 9aae499e..0893e77c 100644 --- a/serverstream.go +++ b/serverstream.go @@ -6,7 +6,7 @@ import ( "time" "github.com/pion/rtcp" - "github.com/pion/rtp" + "github.com/pion/rtp/v2" "github.com/aler9/gortsplib/pkg/liberrors" ) diff --git a/serverudpl.go b/serverudpl.go index e7fbe7b7..06108d7b 100644 --- a/serverudpl.go +++ b/serverudpl.go @@ -203,6 +203,10 @@ func (u *serverUDPListener) processRTP(clientData *clientData, payload []byte) { return } + // remove padding + pkt.Header.Padding = false + pkt.PaddingSize = 0 + now := time.Now() atomic.StoreInt64(clientData.ss.udpLastFrameTime, now.Unix()) clientData.ss.announcedTracks[clientData.trackID].rtcpReceiver.ProcessPacketRTP(now, pkt)