diff options
Diffstat (limited to 'libavcodec/microdvddec.c')
-rw-r--r-- | libavcodec/microdvddec.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/libavcodec/microdvddec.c b/libavcodec/microdvddec.c index e08cc312c0..f3c640f932 100644 --- a/libavcodec/microdvddec.c +++ b/libavcodec/microdvddec.c @@ -260,6 +260,7 @@ static int microdvd_decode_frame(AVCodecContext *avctx, { AVSubtitle *sub = data; AVBPrint new_line; + char c; char *decoded_sub; char *line = avpkt->data; char *end = avpkt->data + avpkt->size; @@ -268,11 +269,16 @@ static int microdvd_decode_frame(AVCodecContext *avctx, if (avpkt->size <= 0) return avpkt->size; - av_bprint_init(&new_line, 0, 2048); + /* To be removed later */ + if (sscanf(line, "{%*d}{%*[0123456789]}%c", &c) == 1 && + line[avpkt->size - 1] == '\n') { + av_log(avctx, AV_LOG_ERROR, "AVPacket is not clean (contains timing " + "information and a trailing line break). You need to upgrade " + "your libavformat or sanitize your packet.\n"); + return AVERROR_INVALIDDATA; + } - // skip {frame_start}{frame_end} - line = strchr(line, '}'); if (!line) goto end; line++; - line = strchr(line, '}'); if (!line) goto end; line++; + av_bprint_init(&new_line, 0, 2048); // subtitle content while (line < end && *line) { @@ -294,8 +300,9 @@ static int microdvd_decode_frame(AVCodecContext *avctx, line++; } } + if (new_line.len) { + av_bprintf(&new_line, "\r\n"); -end: av_bprint_finalize(&new_line, &decoded_sub); if (*decoded_sub) { int64_t start = avpkt->pts; @@ -306,6 +313,7 @@ end: ff_ass_add_rect(sub, decoded_sub, ts_start, ts_duration, 0); } av_free(decoded_sub); + } *got_sub_ptr = sub->num_rects > 0; return avpkt->size; |