mp4 fix samplesize atom bug

This commit is contained in:
nareix 2016-07-13 22:38:58 +08:00
parent 49340a40ec
commit 5236977a6a

View File

@ -0,0 +1,97 @@
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
}