mirror of
https://github.com/AlexxIT/go2rtc.git
synced 2025-09-26 20:31:11 +08:00
92 lines
1.7 KiB
Go
92 lines
1.7 KiB
Go
package iso
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"math"
|
|
)
|
|
|
|
type Movie struct {
|
|
b []byte
|
|
start []int
|
|
}
|
|
|
|
func NewMovie(size int) *Movie {
|
|
return &Movie{b: make([]byte, 0, size)}
|
|
}
|
|
|
|
func (m *Movie) Bytes() []byte {
|
|
return m.b
|
|
}
|
|
|
|
func (m *Movie) StartAtom(name string) {
|
|
m.start = append(m.start, len(m.b))
|
|
m.b = append(m.b, 0, 0, 0, 0)
|
|
m.b = append(m.b, name...)
|
|
}
|
|
|
|
func (m *Movie) EndAtom() {
|
|
n := len(m.start) - 1
|
|
|
|
i := m.start[n]
|
|
size := uint32(len(m.b) - i)
|
|
binary.BigEndian.PutUint32(m.b[i:], size)
|
|
|
|
m.start = m.start[:n]
|
|
}
|
|
|
|
func (m *Movie) Write(b []byte) {
|
|
m.b = append(m.b, b...)
|
|
}
|
|
|
|
func (m *Movie) WriteBytes(b ...byte) {
|
|
m.b = append(m.b, b...)
|
|
}
|
|
|
|
func (m *Movie) WriteString(s string) {
|
|
m.b = append(m.b, s...)
|
|
}
|
|
|
|
func (m *Movie) Skip(n int) {
|
|
m.b = append(m.b, make([]byte, n)...)
|
|
}
|
|
|
|
func (m *Movie) WriteUint16(v uint16) {
|
|
m.b = append(m.b, byte(v>>8), byte(v))
|
|
}
|
|
|
|
func (m *Movie) WriteUint24(v uint32) {
|
|
m.b = append(m.b, byte(v>>16), byte(v>>8), byte(v))
|
|
}
|
|
|
|
func (m *Movie) WriteUint32(v uint32) {
|
|
m.b = append(m.b, byte(v>>24), byte(v>>16), byte(v>>8), byte(v))
|
|
}
|
|
|
|
func (m *Movie) WriteUint64(v uint64) {
|
|
m.b = append(m.b, byte(v>>56), byte(v>>48), byte(v>>40), byte(v>>32), byte(v>>24), byte(v>>16), byte(v>>8), byte(v))
|
|
}
|
|
|
|
func (m *Movie) WriteFloat16(f float64) {
|
|
i, f := math.Modf(f)
|
|
f *= 256
|
|
m.b = append(m.b, byte(i), byte(f))
|
|
}
|
|
|
|
func (m *Movie) WriteFloat32(f float64) {
|
|
i, f := math.Modf(f)
|
|
f *= 65536
|
|
m.b = append(m.b, byte(uint16(i)>>8), byte(i), byte(uint16(f)>>8), byte(f))
|
|
}
|
|
|
|
func (m *Movie) WriteMatrix() {
|
|
m.WriteUint32(0x00010000)
|
|
m.Skip(4)
|
|
m.Skip(4)
|
|
m.Skip(4)
|
|
m.WriteUint32(0x00010000)
|
|
m.Skip(4)
|
|
m.Skip(4)
|
|
m.Skip(4)
|
|
m.WriteUint32(0x40000000)
|
|
}
|