diff --git a/stream/rtp/encoder.go b/stream/rtp/encoder.go index e20be442..88bebc4f 100644 --- a/stream/rtp/encoder.go +++ b/stream/rtp/encoder.go @@ -40,7 +40,7 @@ const ( timestampFreq = 90000 // Hz mtsSize = 188 bufferSize = 1000 - sendLength = 7 * 188 + sendLen = 7 * 188 ) // Encoder implements io writer and provides functionality to wrap data into @@ -53,6 +53,7 @@ type Encoder struct { frameInterval time.Duration fps int buffer []byte + pktSpace [defPktLen]byte } // NewEncoder returns a new Encoder type given an io.Writer - the destination @@ -71,9 +72,9 @@ func NewEncoder(dst io.Writer, fps int) *Encoder { // so that multiple layers of packetization can occur. func (e *Encoder) Write(data []byte) (int, error) { e.buffer = append(e.buffer, data...) - for len(e.buffer) >= sendLength { - e.Encode(e.buffer[:sendLength]) - e.buffer = e.buffer[sendLength:] + for len(e.buffer) >= sendLen { + e.Encode(e.buffer[:sendLen]) + e.buffer = e.buffer[sendLen:] } return len(data), nil } @@ -93,7 +94,7 @@ func (e *Encoder) Encode(payload []byte) error { Payload: payload, Padding: no, } - _, err := e.dst.Write(pkt.Bytes()) + _, err := e.dst.Write(pkt.Bytes(e.pktSpace[:defPktLen])) if err != nil { return err } diff --git a/stream/rtp/rtp.go b/stream/rtp/rtp.go index 4e393679..5d6e0ace 100644 --- a/stream/rtp/rtp.go +++ b/stream/rtp/rtp.go @@ -33,7 +33,10 @@ for rtp-h264 and rtp standards. package rtp const ( - rtpVer = 2 + rtpVer = 2 + headLen = 3 * 4 + defPayloadLen = 7 * 188 + defPktLen = headLen + defPayloadLen ) // Pkt provides fields consistent with RFC3550 definition of an rtp packet @@ -53,7 +56,11 @@ type Pkt struct { } // Bytes provides a byte slice of the packet -func (p *Pkt) Bytes() []byte { +func (p *Pkt) Bytes(buf []byte) []byte { + if buf == nil || len(buf) != defPktLen { + buf = make([]byte, headLen, defPktLen) + } + buf = buf[:headLen] if p.V == 0 { p.V = rtpVer } @@ -74,9 +81,6 @@ func (p *Pkt) Bytes() []byte { panic("rtp: CC (CSRC count) not 0, but CSRC headers not yet supported.") } - const headSize = 3 * 4 // bytes - buf := make([]byte, headSize, headSize+len(p.Payload)+int(p.Padding)) - buf[0] = p.V<<6 | p.p<<5 | p.CC buf[1] = p.M<<7 | p.PT buf[2] = byte(p.SN >> 8) diff --git a/stream/rtp/rtp_test.go b/stream/rtp/rtp_test.go index 85b33590..17e3d5bf 100644 --- a/stream/rtp/rtp_test.go +++ b/stream/rtp/rtp_test.go @@ -65,7 +65,7 @@ var rtpTests = []struct { func TestRtpPktToByteSlice(t *testing.T) { for _, test := range rtpTests { - got := test.pkt.Bytes() + got := test.pkt.Bytes(nil) if !reflect.DeepEqual(got, test.want) { t.Errorf("unexpected error for test %v: got:%v want:%v", test.num, got, test.want)