Hi! Matroska streaming currently consumes memory for cuepoints that are never used if the output stream is no seekable. This can lead to oom. Attached patch fixes ticket #4690.
Please comment, Carl Eugen
diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 3b525ad..f07851e 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -1047,9 +1047,11 @@ static int mkv_write_tracks(AVFormatContext *s) ebml_master tracks; int i, ret, default_stream_exists = 0; + if (s->pb->seekable) { ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_TRACKS, avio_tell(pb)); if (ret < 0) return ret; + } tracks = start_ebml_master(pb, MATROSKA_ID_TRACKS, 0); for (i = 0; i < s->nb_streams; i++) { @@ -1076,8 +1078,10 @@ static int mkv_write_chapters(AVFormatContext *s) if (!s->nb_chapters || mkv->wrote_chapters) return 0; + if (s->pb->seekable) { ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_CHAPTERS, avio_tell(pb)); if (ret < 0) return ret; + } chapters = start_ebml_master(pb, MATROSKA_ID_CHAPTERS , 0); editionentry = start_ebml_master(pb, MATROSKA_ID_EDITIONENTRY, 0); @@ -1160,8 +1164,10 @@ static int mkv_write_tag(AVFormatContext *s, AVDictionary *m, unsigned int eleme int ret; if (!tags->pos) { + if (s->pb->seekable) { ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_TAGS, avio_tell(s->pb)); if (ret < 0) return ret; + } *tags = start_ebml_master(s->pb, MATROSKA_ID_TAGS, 0); } @@ -1772,7 +1778,7 @@ static int mkv_write_packet_internal(AVFormatContext *s, AVPacket *pkt, int add_ if (codec->codec_type != AVMEDIA_TYPE_SUBTITLE) { mkv_write_block(s, pb, MATROSKA_ID_SIMPLEBLOCK, pkt, keyframe); - if (codec->codec_type == AVMEDIA_TYPE_VIDEO && keyframe || add_cue) { + if (s->pb->seekable && (codec->codec_type == AVMEDIA_TYPE_VIDEO && keyframe || add_cue)) { ret = mkv_add_cuepoint(mkv->cues, pkt->stream_index, dash_tracknum, ts, mkv->cluster_pos, relative_packet_pos, -1); if (ret < 0) return ret; } @@ -1792,11 +1798,13 @@ static int mkv_write_packet_internal(AVFormatContext *s, AVPacket *pkt, int add_ end_ebml_master(pb, blockgroup); } + if (s->pb->seekable) { ret = mkv_add_cuepoint(mkv->cues, pkt->stream_index, dash_tracknum, ts, mkv->cluster_pos, relative_packet_pos, duration); if (ret < 0) return ret; } + } mkv->duration = FFMAX(mkv->duration, ts + duration); return 0;
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel