Files
monibuca/plugin/mp4/pkg/box/moof.go
2025-02-14 11:20:25 +08:00

86 lines
1.7 KiB
Go

package box
import (
"bytes"
"io"
)
// aligned(8) class MovieFragmentBox extends Box('moof'){
// }
type MovieFragmentBox struct {
BaseBox
MFHD *MovieFragmentHeaderBox
TRAFs []*TrackFragmentBox
}
type TrackFragmentBox struct {
BaseBox
TFHD *TrackFragmentHeaderBox
TFDT *TrackFragmentBaseMediaDecodeTimeBox
TRUN *TrackRunBox
}
func CreateTrackFragmentBox(tfhd *TrackFragmentHeaderBox, tfdt *TrackFragmentBaseMediaDecodeTimeBox, trun *TrackRunBox) *TrackFragmentBox {
return &TrackFragmentBox{
BaseBox: BaseBox{
typ: TypeTRAF,
size: uint32(BasicBoxLen + tfhd.size + trun.size + tfdt.size),
},
TFHD: tfhd,
TFDT: tfdt,
TRUN: trun,
}
}
func (box *MovieFragmentBox) WriteTo(w io.Writer) (n int64, err error) {
boxes := []IBox{box.MFHD}
for _, traf := range box.TRAFs {
boxes = append(boxes, traf)
}
return WriteTo(w, boxes...)
}
func (box *TrackFragmentBox) WriteTo(w io.Writer) (n int64, err error) {
return WriteTo(w, box.TFHD, box.TFDT, box.TRUN)
}
func (box *MovieFragmentBox) Unmarshal(buf []byte) (IBox, error) {
r := bytes.NewReader(buf)
for {
b, err := ReadFrom(r)
if err != nil {
break
}
switch b := b.(type) {
case *MovieFragmentHeaderBox:
box.MFHD = b
case *TrackFragmentBox:
box.TRAFs = append(box.TRAFs, b)
}
}
return box, nil
}
func (box *TrackFragmentBox) Unmarshal(buf []byte) (IBox, error) {
r := bytes.NewReader(buf)
for {
b, err := ReadFrom(r)
if err != nil {
break
}
switch b := b.(type) {
case *TrackFragmentHeaderBox:
box.TFHD = b
case *TrackRunBox:
box.TRUN = b
}
}
return box, nil
}
func init() {
RegisterBox[*MovieFragmentBox](TypeMOOF)
RegisterBox[*TrackFragmentBox](TypeTRAF)
}