73 lines
1.3 KiB
Go
73 lines
1.3 KiB
Go
// Package subgroup implements the subgroup stream.
|
|
package subgroup
|
|
|
|
import (
|
|
"io"
|
|
|
|
"github.com/bluenviron/mediamtx/internal/protocols/moq/varint"
|
|
)
|
|
|
|
// Header is the SUBGROUP_HEADER structure.
|
|
// spec:
|
|
// * draft-17, section 10.4.2
|
|
// * draft-18/19, section 11.4.2
|
|
type Header struct {
|
|
Properties bool
|
|
FirstObject bool
|
|
TrackAlias uint64
|
|
GroupID uint64
|
|
}
|
|
|
|
func (h *Header) read(r io.Reader) error {
|
|
var b [1]byte
|
|
_, err := r.Read(b[:])
|
|
if err != nil {
|
|
return err
|
|
}
|
|
h.Properties = (b[0] & 0x01) != 0
|
|
h.FirstObject = (b[0] & 0x40) != 0
|
|
|
|
var trackAlias varint.Varint
|
|
err = trackAlias.Read(r)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
h.TrackAlias = uint64(trackAlias)
|
|
|
|
var groupID varint.Varint
|
|
err = groupID.Read(r)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
h.GroupID = uint64(groupID)
|
|
|
|
return nil
|
|
}
|
|
|
|
func (h Header) marshalSize() int {
|
|
st := varint.Varint(0x30)
|
|
if h.Properties {
|
|
st |= 0x01
|
|
}
|
|
if h.FirstObject {
|
|
st |= 0x40
|
|
}
|
|
return st.MarshalSize() +
|
|
varint.Varint(h.TrackAlias).MarshalSize() +
|
|
varint.Varint(h.GroupID).MarshalSize()
|
|
}
|
|
|
|
func (h Header) marshalTo(buf []byte) int {
|
|
st := varint.Varint(0x30)
|
|
if h.Properties {
|
|
st |= 0x01
|
|
}
|
|
if h.FirstObject {
|
|
st |= 0x40
|
|
}
|
|
pos := st.MarshalTo(buf)
|
|
pos += varint.Varint(h.TrackAlias).MarshalTo(buf[pos:])
|
|
pos += varint.Varint(h.GroupID).MarshalTo(buf[pos:])
|
|
return pos
|
|
}
|