diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 51edce015241ae720b59587bbd0ab122f5249a38..610787d91ee1c71cd6e0a3aba925980008c0fc52 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, }; diff --git a/libavformat/version.h b/libavformat/version.h index 73fb7c119678fa6ec692f8043372bbc36f43e2eb..ac675ce953996e26166b8924885be9922a0fc17d 100644 --- a/libavformat/version.h +++ b/libavformat/version.h @@ -30,7 +30,7 @@ #include "libavutil/avutil.h" #define LIBAVFORMAT_VERSION_MAJOR 55 -#define LIBAVFORMAT_VERSION_MINOR 2 +#define LIBAVFORMAT_VERSION_MINOR 3 #define LIBAVFORMAT_VERSION_MICRO 0 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \