movenc: Add an option for delaying writing the moov with empty_moov

Multimedia / Libav - Martin Storsjö [martin.st] - 2 January 2015 17:19 UTC

This delays writing the moov until the first fragment is written, or can be flushed by the caller explicitly when wanted. If the first sample in all streams is available at this point, we can write a proper editlist at this point, allowing streams to start at something else than dts=0. For AC3 and DNXHD, a packet is needed in order to write the moov header properly.

This isn't added to the normal behaviour for empty_moov, since the behaviour that ftyp+moov is written during avformat_write_header would be changed. Callers that split the output stream into header+segments (either by flushing manually, with the custom_frag flag set, or by just differentiating between data written during avformat_write_header and the rest) will need to be adjusted to take this option into use.

For handling streams that start at something else than dts=0, an alternative would be to use different kinds of heuristics for guessing the start dts (using AVCodecContext delay or has_b_frames together with the frame rate), but this is not reliable and doesn't necessarily work well with stream copy, and wouldn't work for getting the right initialization data for AC3 or DNXHD either.

847bf59 movenc: Add an option for delaying writing the moov with empty_moov
libavformat/movenc.c | 71 ++++++++++++++++++++++++++++++++++++++++---------
libavformat/movenc.h | 1 +
libavformat/version.h | 2 +-
3 files changed, 60 insertions(+), 14 deletions(-)

Upstream: git.libav.org


  • Share