[FFmpeg-devel] [PATCH]lavf/matroskaenc: Do not unecessarily consume memory for cuepoints
Carl Eugen Hoyos
cehoyos at ag.or.at
Tue Jul 7 15:13:06 CEST 2015
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
-------------- next part --------------
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;
More information about the ffmpeg-devel
mailing list