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

64 lines
1.5 KiB
Go

package box
import (
"encoding/binary"
"io"
)
// Box Types: 'vmhd', 'smhd', 'hmhd', 'nmhd'
// Container: Media Information Box ('minf')
// Mandatory: Yes
// Quantity: Exactly one specific media header shall be present
// aligned(8) class VideoMediaHeaderBox
// extends FullBox('vmhd', version = 0, 1) {
// template unsigned int(16) graphicsmode = 0; // copy, see below template
// unsigned int(16)[3] opcolor = {0, 0, 0};
// }
type VideoMediaHeaderBox struct {
FullBox
Graphicsmode uint16
Opcolor [3]uint16
}
func CreateVideoMediaHeaderBox() *VideoMediaHeaderBox {
return &VideoMediaHeaderBox{
FullBox: FullBox{
BaseBox: BaseBox{
typ: TypeVMHD,
size: uint32(FullBoxLen + 8),
},
Version: 0,
Flags: [3]byte{0, 0, 1}, // Flags = 1
},
}
}
func (box *VideoMediaHeaderBox) WriteTo(w io.Writer) (n int64, err error) {
var tmp [8]byte
binary.BigEndian.PutUint16(tmp[0:], box.Graphicsmode)
binary.BigEndian.PutUint16(tmp[2:], box.Opcolor[0])
binary.BigEndian.PutUint16(tmp[4:], box.Opcolor[1])
binary.BigEndian.PutUint16(tmp[6:], box.Opcolor[2])
nn, err := w.Write(tmp[:])
n = int64(nn)
return
}
func (box *VideoMediaHeaderBox) Unmarshal(buf []byte) (IBox, error) {
if len(buf) < 8 {
return nil, io.ErrShortBuffer
}
box.Graphicsmode = binary.BigEndian.Uint16(buf[0:])
box.Opcolor[0] = binary.BigEndian.Uint16(buf[2:])
box.Opcolor[1] = binary.BigEndian.Uint16(buf[4:])
box.Opcolor[2] = binary.BigEndian.Uint16(buf[6:])
return box, nil
}
func init() {
RegisterBox[*VideoMediaHeaderBox](TypeVMHD)
}