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  }