Commit 9bde6c6b authored by Andreas Rheinhardt's avatar Andreas Rheinhardt Committed by Michael Niedermayer

avformat/microdvd: Use \n instead of \0 to end file header

Up until now, the microdvd demuxer uses av_strdup() to allocate the
extradata from a string; its length is set to strlen() + 1, i.e.
including the \0 at the end. Upon remuxing, the muxer would simply copy
the extradata at the beginning, including the \0.

This commit changes this by not adding the \0 to the size of the
extradata; the muxer now delimits extradata by inserting a \n. This
required to change the subtitles-microdvd-remux FATE-test.

Furthermore, the extradata is now allocated with zeroed padding.

The microdvd decoder is not affected by this, as it didn't use the size
of the extradata at all, but treated it as a C-string.
Signed-off-by: 's avatarAndreas Rheinhardt <andreas.rheinhardt@gmail.com>
Reviewed-by: 's avatarPaul B Mahol <onemda@gmail.com>
Signed-off-by: 's avatarMichael Niedermayer <michael@niedermayer.cc>
parent b0d0d7e4
...@@ -117,10 +117,11 @@ static int microdvd_read_header(AVFormatContext *s) ...@@ -117,10 +117,11 @@ static int microdvd_read_header(AVFormatContext *s)
continue; continue;
} }
if (!st->codecpar->extradata && sscanf(line, "{DEFAULT}{}%c", &c) == 1) { if (!st->codecpar->extradata && sscanf(line, "{DEFAULT}{}%c", &c) == 1) {
st->codecpar->extradata = av_strdup(line + 11); int ret, size = strlen(line + 11);
if (!st->codecpar->extradata) ret = ff_alloc_extradata(st->codecpar, size);
return AVERROR(ENOMEM); if (ret < 0)
st->codecpar->extradata_size = strlen(st->codecpar->extradata) + 1; return ret;
memcpy(st->codecpar->extradata, line + 11, size);
continue; continue;
} }
} }
......
...@@ -36,6 +36,7 @@ static int microdvd_write_header(struct AVFormatContext *s) ...@@ -36,6 +36,7 @@ static int microdvd_write_header(struct AVFormatContext *s)
if (par->extradata && par->extradata_size > 0) { if (par->extradata && par->extradata_size > 0) {
avio_write(s->pb, "{DEFAULT}{}", 11); avio_write(s->pb, "{DEFAULT}{}", 11);
avio_write(s->pb, par->extradata, par->extradata_size); avio_write(s->pb, par->extradata, par->extradata_size);
avio_w8(s->pb, '\n');
avio_flush(s->pb); avio_flush(s->pb);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment