From 60596c32d1bf08fa03a0c8b33ad2c979299f0f05 Mon Sep 17 00:00:00 2001 From: aler9 <46489434+aler9@users.noreply.github.com> Date: Tue, 13 Dec 2022 19:02:01 +0100 Subject: [PATCH] fix parsing of H264 tracks with empty sprop-parameter-sets --- pkg/format/format_test.go | 24 ++++++++++++++++++++++++ pkg/format/h264.go | 24 +++++++++++------------- 2 files changed, 35 insertions(+), 13 deletions(-) diff --git a/pkg/format/format_test.go b/pkg/format/format_test.go index 3c5f8a2f..d2fca531 100644 --- a/pkg/format/format_test.go +++ b/pkg/format/format_test.go @@ -443,6 +443,30 @@ func TestNewFromMediaDescription(t *testing.T) { PacketizationMode: 1, }, }, + { + "h264 empty sprop-parameter-sets", + &psdp.MediaDescription{ + MediaName: psdp.MediaName{ + Media: "video", + Protos: []string{"RTP", "AVP"}, + Formats: []string{"96"}, + }, + Attributes: []psdp.Attribute{ + { + Key: "rtpmap", + Value: "96 H264/90000", + }, + { + Key: "fmtp", + Value: "96 packetization-mode=1; sprop-parameter-sets=", + }, + }, + }, + &H264{ + PayloadTyp: 96, + PacketizationMode: 1, + }, + }, { "video h265", &psdp.MediaDescription{ diff --git a/pkg/format/h264.go b/pkg/format/h264.go index 3868bbd5..a709bb0b 100644 --- a/pkg/format/h264.go +++ b/pkg/format/h264.go @@ -117,23 +117,21 @@ func (t *H264) unmarshal(payloadType uint8, clock string, codec string, rtpmap s switch tmp[0] { case "sprop-parameter-sets": tmp := strings.Split(tmp[1], ",") - if len(tmp) < 2 { - return fmt.Errorf("invalid sprop-parameter-sets (%v)", fmtp) - } + if len(tmp) >= 2 { + sps, err := base64.StdEncoding.DecodeString(tmp[0]) + if err != nil { + return fmt.Errorf("invalid sprop-parameter-sets (%v)", fmtp) + } - sps, err := base64.StdEncoding.DecodeString(tmp[0]) - if err != nil { - return fmt.Errorf("invalid sprop-parameter-sets (%v)", fmtp) - } + pps, err := base64.StdEncoding.DecodeString(tmp[1]) + if err != nil { + return fmt.Errorf("invalid sprop-parameter-sets (%v)", fmtp) + } - pps, err := base64.StdEncoding.DecodeString(tmp[1]) - if err != nil { - return fmt.Errorf("invalid sprop-parameter-sets (%v)", fmtp) + t.SPS = sps + t.PPS = pps } - t.SPS = sps - t.PPS = pps - case "packetization-mode": tmp, err := strconv.ParseInt(tmp[1], 10, 64) if err != nil {