98 lines
1.7 KiB
Go
98 lines
1.7 KiB
Go
|
|
package atom
|
|
|
|
import (
|
|
"io"
|
|
)
|
|
|
|
type SampleSize struct {
|
|
Version int
|
|
Flags int
|
|
SampleSize int
|
|
Entries []int
|
|
}
|
|
|
|
func ReadSampleSize(r *io.LimitedReader) (res *SampleSize, err error) {
|
|
|
|
self := &SampleSize{}
|
|
if self.Version, err = ReadInt(r, 1); err != nil {
|
|
return
|
|
}
|
|
if self.Flags, err = ReadInt(r, 3); err != nil {
|
|
return
|
|
}
|
|
if self.SampleSize, err = ReadInt(r, 4); err != nil {
|
|
return
|
|
}
|
|
if self.SampleSize != 0 {
|
|
return
|
|
}
|
|
var count int
|
|
if count, err = ReadInt(r, 4); err != nil {
|
|
return
|
|
}
|
|
self.Entries = make([]int, count)
|
|
for i := 0; i < count; i++ {
|
|
if self.Entries[i], err = ReadInt(r, 4); err != nil {
|
|
return
|
|
}
|
|
}
|
|
res = self
|
|
return
|
|
}
|
|
func WriteSampleSize(w io.WriteSeeker, self *SampleSize) (err error) {
|
|
|
|
var aw *Writer
|
|
if aw, err = WriteAtomHeader(w, "stsz"); err != nil {
|
|
return
|
|
}
|
|
w = aw
|
|
if err = WriteInt(w, self.Version, 1); err != nil {
|
|
return
|
|
}
|
|
if err = WriteInt(w, self.Flags, 3); err != nil {
|
|
return
|
|
}
|
|
if err = WriteInt(w, self.SampleSize, 4); err != nil {
|
|
return
|
|
}
|
|
if self.SampleSize != 0 {
|
|
return
|
|
}
|
|
if err = WriteInt(w, len(self.Entries), 4); err != nil {
|
|
return
|
|
}
|
|
for _, elem := range self.Entries {
|
|
if err = WriteInt(w, elem, 4); err != nil {
|
|
return
|
|
}
|
|
}
|
|
if err = aw.Close(); err != nil {
|
|
return
|
|
}
|
|
return
|
|
}
|
|
func WalkSampleSize(w Walker, self *SampleSize) {
|
|
|
|
w.StartStruct("SampleSize")
|
|
w.Name("Version")
|
|
w.Int(self.Version)
|
|
w.Name("Flags")
|
|
w.Int(self.Flags)
|
|
w.Name("SampleSize")
|
|
w.Int(self.SampleSize)
|
|
for i, item := range self.Entries {
|
|
if w.FilterArrayItem("SampleSize", "Entries", i, len(self.Entries)) {
|
|
w.Name("Entries")
|
|
w.Int(item)
|
|
} else {
|
|
w.ArrayLeft(i, len(self.Entries))
|
|
break
|
|
}
|
|
}
|
|
w.EndStruct()
|
|
return
|
|
}
|
|
|
|
|