Quoting Martin Storsjö (2016-05-17 11:16:56) > As long as caller only writes packets using av_interleaved_write_frame > with no manual flushing, this should allow us to always have accurate > durations at the end of fragments, since there should be at least > one queued packet in each stream (except for the stream where the > current packet is being written, but if the muxer itself does the > cutting of fragments, it also has info about the next packet for that > stream). > > --- > > This approach was earlier ok'd by Anton. > --- > libavformat/avformat.h | 4 ++++ > libavformat/internal.h | 10 ++++++++++ > libavformat/movenc.c | 22 ++++++++++++++++++++++ > libavformat/movenc.h | 1 + > libavformat/mux.c | 11 +++++++++++ > libavformat/version.h | 2 +- > 6 files changed, 49 insertions(+), 1 deletion(-) > > diff --git a/libavformat/avformat.h b/libavformat/avformat.h > index 7d026b6..fbdfba4 100644 > --- a/libavformat/avformat.h > +++ b/libavformat/avformat.h > @@ -1720,6 +1720,10 @@ int av_write_frame(AVFormatContext *s, AVPacket *pkt); > * increasing dts. Callers doing their own interleaving should call > * av_write_frame() instead of this function. > * > + * Using this function instead of av_write_frame() can give muxers advance > + * knowledge of future packets, improving e.g. the behaviour of the mp4 > + * muxer for VFR content in fragmenting mode. > + * > * @param s media file handle > * @param pkt The packet containing the data to be written. > * <br> > diff --git a/libavformat/internal.h b/libavformat/internal.h > index 4760ba8..b2a7362 100644 > --- a/libavformat/internal.h > +++ b/libavformat/internal.h > @@ -441,4 +441,14 @@ static inline int ff_rename(const char *oldpath, const > char *newpath) > */ > void ff_format_io_close(AVFormatContext *s, AVIOContext **pb); > > +/** > + * Find the next packet in the interleaving queue for the given stream. > + * The packet is not removed from the interleaving queue, but only > + * a pointer to it is returned. > + * > + * @return a pointer to the next packet, or NULL if no packet is queued > + * for this stream. > + */ > +AVPacket *ff_interleaved_peek(AVFormatContext *s, int stream);
Maybe make the return value const to make it clear that the caller is not supposed to mess with it? Otherwise looks good. -- Anton Khirnov _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
