From 50f19e6653357cef73c88c78ac89f362d3c06196 Mon Sep 17 00:00:00 2001 From: aler9 <46489434+aler9@users.noreply.github.com> Date: Wed, 5 Jan 2022 11:54:03 +0100 Subject: [PATCH] fix transport header error with some Hikvision cameras fixes 'invalid transport header: encoding/hex: invalid byte: U+0020 ' ''. --- pkg/headers/transport.go | 11 +++++++++++ pkg/headers/transport_test.go | 22 ++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/pkg/headers/transport.go b/pkg/headers/transport.go index 1349583a..433de37f 100644 --- a/pkg/headers/transport.go +++ b/pkg/headers/transport.go @@ -184,6 +184,17 @@ func (h *Transport) Read(v base.HeaderValue) error { h.ServerPorts = ports case "ssrc": + // replace initial spaces + var b strings.Builder + b.Grow(len(v)) + i := 0 + for ; i < len(v) && v[i] == ' '; i++ { + b.WriteByte('0') + } + b.WriteString(v[i:]) + v = b.String() + + // add initial zeros if (len(v) % 2) != 0 { v = "0" + v } diff --git a/pkg/headers/transport_test.go b/pkg/headers/transport_test.go index 10a89076..bed23ee4 100644 --- a/pkg/headers/transport_test.go +++ b/pkg/headers/transport_test.go @@ -155,6 +155,28 @@ var casesTransport = []struct { }(), }, }, + { + "hikvision ssrc with initial spaces", + base.HeaderValue{`RTP/AVP/UDP;unicast;client_port=14186;server_port=8052;ssrc= 4317f;mode=play`}, + base.HeaderValue{`RTP/AVP;unicast;client_port=14186-14187;server_port=8052-8053;ssrc=0004317F;mode=play`}, + Transport{ + Protocol: TransportProtocolUDP, + Delivery: func() *TransportDelivery { + v := TransportDeliveryUnicast + return &v + }(), + Mode: func() *TransportMode { + v := TransportModePlay + return &v + }(), + ClientPorts: &[2]int{14186, 14187}, + ServerPorts: &[2]int{8052, 8053}, + SSRC: func() *uint32 { + v := uint32(0x04317f) + return &v + }(), + }, + }, } func TestTransportRead(t *testing.T) {