From 95b7fa1729b93bbb3f4fb85a5c0cb53cf970c3c7 Mon Sep 17 00:00:00 2001 From: Martin Storsjö Date: Thu, 29 May 2014 17:39:28 +0300 Subject: oggenc: Support flushing the muxer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This allows the caller to write all buffered data to disk, allowing the caller to know at what byte position in the file a certain packet starts (any packet written after the flush will be located after that byte position). Signed-off-by: Martin Storsjö --- libavformat/oggenc.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) (limited to 'libavformat/oggenc.c') diff --git a/libavformat/oggenc.c b/libavformat/oggenc.c index c30315a920..0d8e239e02 100644 --- a/libavformat/oggenc.c +++ b/libavformat/oggenc.c @@ -545,7 +545,7 @@ static int ogg_write_header(AVFormatContext *s) return 0; } -static int ogg_write_packet(AVFormatContext *s, AVPacket *pkt) +static int ogg_write_packet_internal(AVFormatContext *s, AVPacket *pkt) { AVStream *st = s->streams[pkt->stream_index]; OGGStreamContext *oggstream = st->priv_data; @@ -583,6 +583,23 @@ static int ogg_write_packet(AVFormatContext *s, AVPacket *pkt) return 0; } +static int ogg_write_packet(AVFormatContext *s, AVPacket *pkt) +{ + int i; + + if (pkt) + return ogg_write_packet_internal(s, pkt); + + for (i = 0; i < s->nb_streams; i++) { + OGGStreamContext *oggstream = s->streams[i]->priv_data; + if (oggstream->page.segments_count) + ogg_buffer_page(s, oggstream); + } + + ogg_write_pages(s, 2); + return 0; +} + static int ogg_write_trailer(AVFormatContext *s) { int i; @@ -623,6 +640,6 @@ AVOutputFormat ff_ogg_muxer = { .write_header = ogg_write_header, .write_packet = ogg_write_packet, .write_trailer = ogg_write_trailer, - .flags = AVFMT_TS_NEGATIVE, + .flags = AVFMT_TS_NEGATIVE | AVFMT_ALLOW_FLUSH, .priv_class = &ogg_muxer_class, }; -- cgit v1.2.3