From 5236977a6ad3a921f18fd63a7254d52bbb180f64 Mon Sep 17 00:00:00 2001 From: nareix Date: Wed, 13 Jul 2016 22:38:58 +0800 Subject: [PATCH] mp4 fix samplesize atom bug --- format/mp4/atom/samplesize.go | 97 +++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 format/mp4/atom/samplesize.go diff --git a/format/mp4/atom/samplesize.go b/format/mp4/atom/samplesize.go new file mode 100644 index 0000000..6d8905d --- /dev/null +++ b/format/mp4/atom/samplesize.go @@ -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 +} + +