diff options
Diffstat (limited to 'libavformat')
-rw-r--r-- | libavformat/microdvddec.c | 23 | ||||
-rw-r--r-- | libavformat/version.h | 2 |
2 files changed, 19 insertions, 6 deletions
diff --git a/libavformat/microdvddec.c b/libavformat/microdvddec.c index 5d5b83fea8..96ffa3da07 100644 --- a/libavformat/microdvddec.c +++ b/libavformat/microdvddec.c @@ -83,18 +83,19 @@ static int microdvd_read_header(AVFormatContext *s) return AVERROR(ENOMEM); while (!url_feof(s->pb)) { + char *p = line; AVPacket *sub; int64_t pos = avio_tell(s->pb); int len = ff_get_line(s->pb, line, sizeof(line)); if (!len) break; - if (i < 3) { + line[strcspn(line, "\r\n")] = 0; + if (i++ < 3) { int frame; double fps; char c; - i++; if ((sscanf(line, "{%d}{}%6lf", &frame, &fps) == 2 || sscanf(line, "{%d}{%*d}%6lf", &frame, &fps) == 2) && frame <= 1 && fps > 3 && fps < 100) @@ -107,12 +108,24 @@ static int microdvd_read_header(AVFormatContext *s) continue; } } - sub = ff_subtitles_queue_insert(µdvd->q, line, len, 0); +#define SKIP_FRAME_ID \ + p = strchr(p, '}'); \ + if (!p) { \ + av_log(s, AV_LOG_WARNING, "Invalid event \"%s\"" \ + " at line %d\n", line, i); \ + continue; \ + } \ + p++ + SKIP_FRAME_ID; + SKIP_FRAME_ID; + if (!*p) + continue; + sub = ff_subtitles_queue_insert(µdvd->q, p, strlen(p), 0); if (!sub) return AVERROR(ENOMEM); sub->pos = pos; - sub->pts = get_pts(sub->data); - sub->duration = get_duration(sub->data); + sub->pts = get_pts(line); + sub->duration = get_duration(line); } ff_subtitles_queue_finalize(µdvd->q); avpriv_set_pts_info(st, 64, pts_info.den, pts_info.num); diff --git a/libavformat/version.h b/libavformat/version.h index 90d47d02d1..6fb42d84ed 100644 --- a/libavformat/version.h +++ b/libavformat/version.h @@ -30,7 +30,7 @@ #include "libavutil/avutil.h" #define LIBAVFORMAT_VERSION_MAJOR 54 -#define LIBAVFORMAT_VERSION_MINOR 56 +#define LIBAVFORMAT_VERSION_MINOR 57 #define LIBAVFORMAT_VERSION_MICRO 100 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ |