From dc8b36746a9d5101ef6ce146473c65a8827c51b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20B=C5=93sch?= Date: Thu, 3 Jan 2013 07:45:29 +0100 Subject: [PATCH] lavf/webvtt: use ff_subtitles_read_chunk(). The FATE test is updated because the line breaks in the dialogue rectangles are now proper CRLF. --- libavformat/version.h | 2 +- libavformat/webvttdec.c | 40 ++++++++++----------------------------- tests/ref/fate/sub-webvtt | 2 +- 3 files changed, 12 insertions(+), 32 deletions(-) diff --git a/libavformat/version.h b/libavformat/version.h index f20354b580..890d8ef7e4 100644 --- a/libavformat/version.h +++ b/libavformat/version.h @@ -31,7 +31,7 @@ #define LIBAVFORMAT_VERSION_MAJOR 54 #define LIBAVFORMAT_VERSION_MINOR 59 -#define LIBAVFORMAT_VERSION_MICRO 101 +#define LIBAVFORMAT_VERSION_MICRO 102 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ LIBAVFORMAT_VERSION_MINOR, \ diff --git a/libavformat/webvttdec.c b/libavformat/webvttdec.c index 26c2a1ad4e..694a020b19 100644 --- a/libavformat/webvttdec.c +++ b/libavformat/webvttdec.c @@ -54,29 +54,6 @@ static int64_t read_ts(const char *s) return AV_NOPTS_VALUE; } -static int64_t extract_cue(AVBPrint *buf, AVIOContext *pb) -{ - int prev_chr_is_eol = 0; - int64_t pos = avio_tell(pb); - - av_bprint_clear(buf); - for (;;) { - char c = avio_r8(pb); - if (!c) - break; - if (c == '\r' || c == '\n') { - if (prev_chr_is_eol) - break; - prev_chr_is_eol = (c == '\n'); - } else - prev_chr_is_eol = 0; - if (c != '\r') - av_bprint_chars(buf, c, 1); - } - av_bprint_chars(buf, '\0', 1); - return pos; -} - static int webvtt_read_header(AVFormatContext *s) { WebVTTContext *webvtt = s->priv_data; @@ -94,17 +71,21 @@ static int webvtt_read_header(AVFormatContext *s) av_bprint_init(&cue, 0, AV_BPRINT_SIZE_UNLIMITED); for (;;) { - int i, len; - int64_t pos = extract_cue(&cue, s->pb); + int i; + int64_t pos; AVPacket *sub; - const char *p = cue.str; - const char *identifier = p; + const char *p, *identifier; //const char *settings = NULL; int64_t ts_start, ts_end; - if (!*p) // EOF + ff_subtitles_read_chunk(s->pb, &cue); + + if (!cue.len) break; + p = identifier = cue.str; + pos = avio_tell(s->pb); + /* ignore header chunk */ if (!strncmp(p, "\xEF\xBB\xBFWEBVTT", 9) || !strncmp(p, "WEBVTT", 6)) @@ -143,8 +124,7 @@ static int webvtt_read_header(AVFormatContext *s) p++; /* create packet */ - len = cue.str + cue.len - p - 1; - sub = ff_subtitles_queue_insert(&webvtt->q, p, len, 0); + sub = ff_subtitles_queue_insert(&webvtt->q, p, strlen(p), 0); if (!sub) { res = AVERROR(ENOMEM); goto end; diff --git a/tests/ref/fate/sub-webvtt b/tests/ref/fate/sub-webvtt index 2e32e55196..45cccde4f5 100644 --- a/tests/ref/fate/sub-webvtt +++ b/tests/ref/fate/sub-webvtt @@ -1 +1 @@ -5384a70c89ddca4b007fb7ffba95cffb +2cf38e2c99f8717f78a91a3f31197fb4