diff options
author | Martin Storsjö <martin@martin.st> | 2013-08-19 11:33:14 +0400 |
---|---|---|
committer | Luca Barbato <lu_zero@gentoo.org> | 2013-08-20 00:47:07 +0400 |
commit | b886f5c2f1e71b3e60e4265c500158d392b4b9a4 (patch) | |
tree | c0cb4eb0e786220dcf116b86d9f8414f524ff66c /libavformat/matroskaenc.c | |
parent | 59f595921eb2b848a80a74aa81b6bb43038c9ebe (diff) |
mkv: Allow flushing the current cluster in progress
Allow emitting the current cluster that is being written before
starting a new one, simplifying how to figure out where clusters
are positioned in the output stream (for live streaming).
Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
Diffstat (limited to 'libavformat/matroskaenc.c')
-rw-r--r-- | libavformat/matroskaenc.c | 36 |
1 files changed, 30 insertions, 6 deletions
diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 51edce0152..610787d91e 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -1342,6 +1342,29 @@ static int mkv_write_packet(AVFormatContext *s, AVPacket *pkt) return ret; } +static int mkv_write_flush_packet(AVFormatContext *s, AVPacket *pkt) +{ + MatroskaMuxContext *mkv = s->priv_data; + AVIOContext *pb; + if (s->pb->seekable) + pb = s->pb; + else + pb = mkv->dyn_bc; + if (!pkt) { + if (mkv->cluster_pos) { + av_log(s, AV_LOG_DEBUG, "Flushing cluster at offset %" PRIu64 + " bytes\n", avio_tell(pb)); + end_ebml_master(pb, mkv->cluster); + mkv->cluster_pos = 0; + if (mkv->dyn_bc) + mkv_flush_dynbuf(s); + avio_flush(s->pb); + } + return 0; + } + return mkv_write_packet(s, pkt); +} + static int mkv_write_trailer(AVFormatContext *s) { MatroskaMuxContext *mkv = s->priv_data; @@ -1458,10 +1481,10 @@ AVOutputFormat ff_matroska_muxer = { .video_codec = CONFIG_LIBX264_ENCODER ? AV_CODEC_ID_H264 : AV_CODEC_ID_MPEG4, .write_header = mkv_write_header, - .write_packet = mkv_write_packet, + .write_packet = mkv_write_flush_packet, .write_trailer = mkv_write_trailer, .flags = AVFMT_GLOBALHEADER | AVFMT_VARIABLE_FPS | - AVFMT_TS_NONSTRICT, + AVFMT_TS_NONSTRICT | AVFMT_ALLOW_FLUSH, .codec_tag = (const AVCodecTag* const []){ ff_codec_bmp_tags, ff_codec_wav_tags, 0 }, @@ -1488,10 +1511,10 @@ AVOutputFormat ff_webm_muxer = { .audio_codec = AV_CODEC_ID_VORBIS, .video_codec = AV_CODEC_ID_VP8, .write_header = mkv_write_header, - .write_packet = mkv_write_packet, + .write_packet = mkv_write_flush_packet, .write_trailer = mkv_write_trailer, .flags = AVFMT_GLOBALHEADER | AVFMT_VARIABLE_FPS | - AVFMT_TS_NONSTRICT, + AVFMT_TS_NONSTRICT | AVFMT_ALLOW_FLUSH, .priv_class = &webm_class, }; #endif @@ -1513,9 +1536,10 @@ AVOutputFormat ff_matroska_audio_muxer = { AV_CODEC_ID_VORBIS : AV_CODEC_ID_AC3, .video_codec = AV_CODEC_ID_NONE, .write_header = mkv_write_header, - .write_packet = mkv_write_packet, + .write_packet = mkv_write_flush_packet, .write_trailer = mkv_write_trailer, - .flags = AVFMT_GLOBALHEADER | AVFMT_TS_NONSTRICT, + .flags = AVFMT_GLOBALHEADER | AVFMT_TS_NONSTRICT | + AVFMT_ALLOW_FLUSH, .codec_tag = (const AVCodecTag* const []){ ff_codec_wav_tags, 0 }, .priv_class = &mka_class, }; |