mirror of
https://github.com/langhuihui/monibuca.git
synced 2025-12-24 13:48:04 +08:00
74 lines
1.5 KiB
Go
74 lines
1.5 KiB
Go
package box
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"io"
|
|
)
|
|
|
|
// aligned(8) class TimeToSampleBox extends FullBox('stts', version = 0, 0) {
|
|
// unsigned int(32) entry_count;
|
|
// int i;
|
|
// for (i=0; i < entry_count; i++) {
|
|
// unsigned int(32) sample_count;
|
|
// unsigned int(32) sample_delta;
|
|
// }
|
|
// }
|
|
|
|
type STTSBox struct {
|
|
FullBox
|
|
Entries []STTSEntry
|
|
}
|
|
|
|
func CreateSTTSBox(entries []STTSEntry) *STTSBox {
|
|
return &STTSBox{
|
|
FullBox: FullBox{
|
|
BaseBox: BaseBox{
|
|
|
|
typ: TypeSTTS,
|
|
size: uint32(FullBoxLen + 4 + len(entries)*8),
|
|
},
|
|
Version: 0,
|
|
Flags: [3]byte{0, 0, 0},
|
|
},
|
|
|
|
Entries: entries,
|
|
}
|
|
}
|
|
|
|
func (box *STTSBox) WriteTo(w io.Writer) (n int64, err error) {
|
|
buf := make([]byte, 4+len(box.Entries)*8)
|
|
// Write entry count
|
|
binary.BigEndian.PutUint32(buf[:4], uint32(len(box.Entries)))
|
|
|
|
// Write entries
|
|
for i, entry := range box.Entries {
|
|
binary.BigEndian.PutUint32(buf[4+i*8:], entry.SampleCount)
|
|
binary.BigEndian.PutUint32(buf[4+i*8+4:], entry.SampleDelta)
|
|
}
|
|
|
|
_, err = w.Write(buf)
|
|
return int64(len(buf)), err
|
|
}
|
|
|
|
func (box *STTSBox) Unmarshal(buf []byte) (IBox, error) {
|
|
entryCount := binary.BigEndian.Uint32(buf[:4])
|
|
box.Entries = make([]STTSEntry, entryCount)
|
|
|
|
if len(buf) < 4+int(entryCount)*8 {
|
|
return nil, io.ErrShortBuffer
|
|
}
|
|
|
|
idx := 4
|
|
for i := 0; i < int(entryCount); i++ {
|
|
box.Entries[i].SampleCount = binary.BigEndian.Uint32(buf[idx:])
|
|
idx += 4
|
|
box.Entries[i].SampleDelta = binary.BigEndian.Uint32(buf[idx:])
|
|
idx += 4
|
|
}
|
|
return box, nil
|
|
}
|
|
|
|
func init() {
|
|
RegisterBox[*STTSBox](TypeSTTS)
|
|
}
|