mp4 fix samplesize atom bug
This commit is contained in:
parent
49340a40ec
commit
5236977a6a
97
format/mp4/atom/samplesize.go
Normal file
97
format/mp4/atom/samplesize.go
Normal 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
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user