avformat/microdvd: Use \n instead of \0 to end file header
authorAndreas Rheinhardt <andreas.rheinhardt@gmail.com>
Thu, 12 Dec 2019 15:53:17 +0000 (16:53 +0100)
committerMichael Niedermayer <michael@niedermayer.cc>
Fri, 27 Dec 2019 11:38:08 +0000 (12:38 +0100)
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: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
Reviewed-by: Paul B Mahol <onemda@gmail.com>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
libavformat/microdvddec.c
libavformat/microdvdenc.c
tests/ref/fate/sub-microdvd-remux

index ca9086a..08e6fca 100644 (file)
@@ -117,10 +117,11 @@ static int microdvd_read_header(AVFormatContext *s)
                 continue;
             }
             if (!st->codecpar->extradata && sscanf(line, "{DEFAULT}{}%c", &c) == 1) {
-                st->codecpar->extradata = av_strdup(line + 11);
-                if (!st->codecpar->extradata)
-                    return AVERROR(ENOMEM);
-                st->codecpar->extradata_size = strlen(st->codecpar->extradata) + 1;
+                int ret, size = strlen(line + 11);
+                ret = ff_alloc_extradata(st->codecpar, size);
+                if (ret < 0)
+                    return ret;
+                memcpy(st->codecpar->extradata, line + 11, size);
                 continue;
             }
         }
index 04f475b..6639651 100644 (file)
@@ -36,6 +36,7 @@ static int microdvd_write_header(struct AVFormatContext *s)
     if (par->extradata && par->extradata_size > 0) {
         avio_write(s->pb, "{DEFAULT}{}", 11);
         avio_write(s->pb, par->extradata, par->extradata_size);
+        avio_w8(s->pb, '\n');
         avio_flush(s->pb);
     }
 
index a71da99..92ff233 100644 (file)
Binary files a/tests/ref/fate/sub-microdvd-remux and b/tests/ref/fate/sub-microdvd-remux differ