github.com/bluenviron/mediacommon@v1.9.3/pkg/formats/fmp4/mp4_writer.go (about) 1 package fmp4 2 3 import ( 4 "io" 5 6 "github.com/abema/go-mp4" 7 ) 8 9 type mp4Writer struct { 10 w *mp4.Writer 11 } 12 13 func newMP4Writer(w io.WriteSeeker) *mp4Writer { 14 return &mp4Writer{ 15 w: mp4.NewWriter(w), 16 } 17 } 18 19 func (w *mp4Writer) writeBoxStart(box mp4.IImmutableBox) (int, error) { 20 bi := &mp4.BoxInfo{ 21 Type: box.GetType(), 22 } 23 var err error 24 bi, err = w.w.StartBox(bi) 25 if err != nil { 26 return 0, err 27 } 28 29 _, err = mp4.Marshal(w.w, box, mp4.Context{}) 30 if err != nil { 31 return 0, err 32 } 33 34 return int(bi.Offset), nil 35 } 36 37 func (w *mp4Writer) writeBoxEnd() error { 38 _, err := w.w.EndBox() 39 return err 40 } 41 42 func (w *mp4Writer) writeBox(box mp4.IImmutableBox) (int, error) { 43 off, err := w.writeBoxStart(box) 44 if err != nil { 45 return 0, err 46 } 47 48 err = w.writeBoxEnd() 49 if err != nil { 50 return 0, err 51 } 52 53 return off, nil 54 } 55 56 func (w *mp4Writer) rewriteBox(off int, box mp4.IImmutableBox) error { 57 prevOff, err := w.w.Seek(0, io.SeekCurrent) 58 if err != nil { 59 return err 60 } 61 62 _, err = w.w.Seek(int64(off), io.SeekStart) 63 if err != nil { 64 return err 65 } 66 67 _, err = w.writeBoxStart(box) 68 if err != nil { 69 return err 70 } 71 72 err = w.writeBoxEnd() 73 if err != nil { 74 return err 75 } 76 77 _, err = w.w.Seek(prevOff, io.SeekStart) 78 if err != nil { 79 return err 80 } 81 82 return nil 83 }