mirror of
https://github.com/aler9/gortsplib
synced 2025-10-08 08:30:06 +08:00
101
pkg/headers/rtp_info.go
Normal file
101
pkg/headers/rtp_info.go
Normal file
@@ -0,0 +1,101 @@
|
||||
package headers
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/bluenviron/gortsplib/v4/pkg/base"
|
||||
)
|
||||
|
||||
// RTPInfoEntry is an entry of a RTP-Info header.
|
||||
type RTPInfoEntry struct {
|
||||
URL string
|
||||
SequenceNumber *uint16
|
||||
Timestamp *uint32
|
||||
}
|
||||
|
||||
// RTPInfo is a RTP-Info header.
|
||||
type RTPInfo []*RTPInfoEntry
|
||||
|
||||
// Unmarshal decodes a RTP-Info header.
|
||||
func (h *RTPInfo) Unmarshal(v base.HeaderValue) error {
|
||||
if len(v) == 0 {
|
||||
return fmt.Errorf("value not provided")
|
||||
}
|
||||
|
||||
if len(v) > 1 {
|
||||
return fmt.Errorf("value provided multiple times (%v)", v)
|
||||
}
|
||||
|
||||
for _, part := range strings.Split(v[0], ",") {
|
||||
e := &RTPInfoEntry{}
|
||||
|
||||
// remove leading spaces
|
||||
part = strings.TrimLeft(part, " ")
|
||||
|
||||
kvs, err := keyValParse(part, ';')
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
urlReceived := false
|
||||
|
||||
for k, v := range kvs {
|
||||
switch k {
|
||||
case "url":
|
||||
e.URL = v
|
||||
urlReceived = true
|
||||
|
||||
case "seq":
|
||||
vi, err := strconv.ParseUint(v, 10, 16)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
vi2 := uint16(vi)
|
||||
e.SequenceNumber = &vi2
|
||||
|
||||
case "rtptime":
|
||||
vi, err := strconv.ParseUint(v, 10, 32)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
vi2 := uint32(vi)
|
||||
e.Timestamp = &vi2
|
||||
|
||||
default:
|
||||
// ignore non-standard keys
|
||||
}
|
||||
}
|
||||
|
||||
if !urlReceived {
|
||||
return fmt.Errorf("URL is missing")
|
||||
}
|
||||
|
||||
*h = append(*h, e)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Marshal encodes a RTP-Info header.
|
||||
func (h RTPInfo) Marshal() base.HeaderValue {
|
||||
rets := make([]string, len(h))
|
||||
|
||||
for i, e := range h {
|
||||
var tmp []string
|
||||
tmp = append(tmp, "url="+e.URL)
|
||||
|
||||
if e.SequenceNumber != nil {
|
||||
tmp = append(tmp, "seq="+strconv.FormatUint(uint64(*e.SequenceNumber), 10))
|
||||
}
|
||||
|
||||
if e.Timestamp != nil {
|
||||
tmp = append(tmp, "rtptime="+strconv.FormatUint(uint64(*e.Timestamp), 10))
|
||||
}
|
||||
|
||||
rets[i] = strings.Join(tmp, ";")
|
||||
}
|
||||
|
||||
return base.HeaderValue{strings.Join(rets, ",")}
|
||||
}
|
Reference in New Issue
Block a user