diff options
author | Paul B Mahol <onemda@gmail.com> | 2020-06-12 20:03:42 +0200 |
---|---|---|
committer | Paul B Mahol <onemda@gmail.com> | 2020-06-13 00:20:55 +0200 |
commit | 49d07642f30ea05f6098203e6cb6b85563b170f8 (patch) | |
tree | d04be545c857e7c91c7c8b8aa4e2833b231f72c2 /libavformat/sccdec.c | |
parent | fd54add89c4fed77a30ead2c08103be580881951 (diff) | |
download | ffmpeg-49d07642f30ea05f6098203e6cb6b85563b170f8.tar.gz |
avformat/sccdec: split line with multiple subs
Diffstat (limited to 'libavformat/sccdec.c')
-rw-r--r-- | libavformat/sccdec.c | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/libavformat/sccdec.c b/libavformat/sccdec.c index b9042b39ac..955e39f74c 100644 --- a/libavformat/sccdec.c +++ b/libavformat/sccdec.c @@ -120,18 +120,41 @@ try_again: for (i = 0; i < 4095; i += 3) { char *ptr = av_strtok(lline, " ", &saveptr); char c1, c2, c3, c4; + uint8_t o1, o2; if (!ptr) break; if (av_sscanf(ptr, "%c%c%c%c", &c1, &c2, &c3, &c4) != 4) break; + o1 = convert(c2) | (convert(c1) << 4); + o2 = convert(c4) | (convert(c3) << 4); lline = NULL; out[i+0] = 0xfc; - out[i+1] = convert(c2) | (convert(c1) << 4); - out[i+2] = convert(c4) | (convert(c3) << 4); + out[i+1] = o1; + out[i+2] = o2; + + if (o1 == 0x94 && o2 == 0x2f && saveptr && av_strcasecmp(saveptr, "942f")) { + int64_t duration; + + i += 3; + out[i] = 0; + duration = i * 11; + + sub = ff_subtitles_queue_insert(&scc->q, out, i, 0); + if (!sub) + return AVERROR(ENOMEM); + + current_pos += i; + sub->pos = current_pos; + sub->pts = ts_start; + sub->duration = duration; + ts_start += duration; + i = 0; + } } + out[i] = 0; sub = ff_subtitles_queue_insert(&scc->q, out, i, 0); |