mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-01-24 13:56:33 +02:00
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>
This commit is contained in:
parent
59f595921e
commit
b886f5c2f1
@ -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,
|
||||
};
|
||||
|
@ -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, \
|
||||
|
Loading…
x
Reference in New Issue
Block a user