Commit Diff


commit - 3faffc6a916cf7e63b45d795ef3c1d1be5441407
commit + abc6381f91d6b8e36cfafad15375034229a640b8
blob - 242e18c2a2144ff847b36e827ec131dcd5058876
blob + cf8fef00422e539a03046c44557fc8845df5e438
--- rtp/rtp.go
+++ rtp/rtp.go
@@ -134,6 +134,8 @@ const minHeaderLength = 12
 func Unmarshal(data []byte, p *Packet) error {
 	if len(data) < minHeaderLength {
 		return fmt.Errorf("need at least %d bytes, have %d", minHeaderLength, len(data))
+	} else if len(data) == minHeaderLength {
+		return ErrNoPayload
 	}
 
 	p.Header.Version = uint8(data[0] & 0b11000000)
@@ -153,10 +155,8 @@ func Unmarshal(data []byte, p *Packet) error {
 	p.Header.Timestamp = binary.BigEndian.Uint32(data[4:8])
 	p.Header.SyncSource = binary.BigEndian.Uint32(data[8:12])
 
-	if len(data) == minHeaderLength {
-		return ErrNoPayload
-	}
-	data = data[12:]
+	// throw away unmarshalled bytes
+	data = data[minHeaderLength:]
 
 	if hasExtension {
 		if len(data) < 4 {
@@ -194,6 +194,8 @@ func Unmarshal(data []byte, p *Packet) error {
 	return nil
 }
 
+const maxContribCount = 0x0f // max 4-bit integer
+
 func Marshal(p *Packet) ([]byte, error) {
 	if p.Header.Version > VersionRFC3550 {
 		return nil, fmt.Errorf("bad version %v", p.Header.Version)
@@ -206,7 +208,6 @@ func Marshal(p *Packet) ([]byte, error) {
 	if p.Header.Extension != nil {
 		buf[0] |= 0b00010000
 	}
-	maxContribCount := 0x0f // max 4-bit integer
 	if len(p.Header.ContribSource) > maxContribCount {
 		return nil, fmt.Errorf("contribution source count %d greater than max %d", len(p.Header.ContribSource), maxContribCount)
 	}
@@ -215,6 +216,7 @@ func Marshal(p *Packet) ([]byte, error) {
 	if p.Header.Marker {
 		buf[1] |= 0b10000000
 	}
+
 	if p.Header.Type > 0x7f {
 		return nil, fmt.Errorf("payload type %s (%d) greater than max %d", p.Header.Type, p.Header.Type, 0x7f)
 	}