aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClément Bœsch <u@pkh.me>2014-09-26 07:29:22 +0200
committerClément Bœsch <u@pkh.me>2014-09-26 11:12:41 +0200
commit9ae83ece8a8e92d7e9b7a077eb10d324991f0453 (patch)
tree22ab28de621d3cd4b5b0acfbd4e7daccb77a835e
parent7dd2005e1ac3b86fc999dd40f888b82fb5e47e8d (diff)
downloadffmpeg-9ae83ece8a8e92d7e9b7a077eb10d324991f0453.tar.gz
avformat/srtdec: simpler and more lenient probing
Fixes Ticket #3935.
-rw-r--r--libavformat/srtdec.c27
1 files changed, 16 insertions, 11 deletions
diff --git a/libavformat/srtdec.c b/libavformat/srtdec.c
index f5f3933916..02d75f1bf1 100644
--- a/libavformat/srtdec.c
+++ b/libavformat/srtdec.c
@@ -31,23 +31,28 @@ typedef struct {
static int srt_probe(AVProbeData *p)
{
- int i, v, num = 0;
+ int v;
+ char buf[64], *pbuf;
FFTextReader tr;
ff_text_init_buf(&tr, p->buf, p->buf_size);
while (ff_text_peek_r8(&tr) == '\r' || ff_text_peek_r8(&tr) == '\n')
ff_text_r8(&tr);
- for (i=0; i<2; i++) {
- char buf[128];
- if (ff_subtitles_read_line(&tr, buf, sizeof(buf)) < 0)
- break;
- if ((num == i || num + 1 == i)
- && buf[0] >= '0' && buf[1] <= '9' && strstr(buf, " --> ")
- && sscanf(buf, "%*d:%*2d:%*2d%*1[,.]%*3d --> %*d:%*2d:%*2d%*1[,.]%3d", &v) == 1)
- return AVPROBE_SCORE_MAX;
- num = atoi(buf);
- }
+
+ /* Check if the first non-empty line is a number. We do not check what the
+ * number is because in practice it can be anything. */
+ if (ff_subtitles_read_line(&tr, buf, sizeof(buf)) < 0 ||
+ strtol(buf, &pbuf, 10) < 0 || *pbuf)
+ return 0;
+
+ /* Check if the next line matches a SRT timestamp */
+ if (ff_subtitles_read_line(&tr, buf, sizeof(buf)) < 0)
+ return 0;
+ if (buf[0] >= '0' && buf[1] <= '9' && strstr(buf, " --> ")
+ && sscanf(buf, "%*d:%*2d:%*2d%*1[,.]%*3d --> %*d:%*2d:%*2d%*1[,.]%3d", &v) == 1)
+ return AVPROBE_SCORE_MAX;
+
return 0;
}