diff --git a/atom/otherStruct.go b/atom/otherStruct.go index c5507f9..53fe639 100644 --- a/atom/otherStruct.go +++ b/atom/otherStruct.go @@ -15,6 +15,18 @@ type AVCDecoderConfRecord struct { PictureParamSet [][]byte } +func WriteSampleByNALU(w io.Writer, nalu []byte) (size int, err error) { + if err = WriteInt(w, len(nalu), 4); err != nil { + return + } + size += 4 + if _, err = w.Write(nalu); err != nil { + return + } + size += len(nalu) + return +} + func CreateAVCDecoderConfRecord( SeqenceParamSet []byte, PictureParamSet []byte, diff --git a/writer.go b/writer.go index 1f6eff8..0c34481 100644 --- a/writer.go +++ b/writer.go @@ -57,13 +57,30 @@ func (self *SimpleH264Writer) prepare() (err error) { } func (self *SimpleH264Writer) WriteSample(sync bool, duration int, data []byte) (err error) { + return self.writeSample(func (w io.Writer, data []byte) (int, error) { + if _, err = self.mdatWriter.Write(data); err != nil { + return 0, err + } + return len(data), nil + }, sync, duration, data) +} + +func (self *SimpleH264Writer) WriteNALU(sync bool, duration int, data []byte) (err error) { + return self.writeSample(atom.WriteSampleByNALU, sync, duration, data) +} + +func (self *SimpleH264Writer) writeSample( + writeFunc func(io.Writer, []byte) (int,error), + sync bool, duration int, data []byte, +) (err error) { if self.mdatWriter == nil { if err = self.prepare(); err != nil { return } } - if _, err = self.mdatWriter.Write(data); err != nil { + var sampleSize int + if sampleSize, err = writeFunc(self.mdatWriter, data); err != nil { return } @@ -85,7 +102,7 @@ func (self *SimpleH264Writer) WriteSample(sync bool, duration int, data []byte) self.sampleIdx++ self.timeToSample.Count++ self.sampleToChunk.SamplesPerChunk++ - self.sample.SampleSize.Entries = append(self.sample.SampleSize.Entries, len(data)) + self.sample.SampleSize.Entries = append(self.sample.SampleSize.Entries, sampleSize) return }