diff options
author | wm4 <nfxjfg@googlemail.com> | 2014-09-02 20:52:07 +0200 |
---|---|---|
committer | Clément Bœsch <u@pkh.me> | 2014-09-05 23:13:07 +0200 |
commit | d658ef18e3d1ebe63a64f404ac4646890ecf02c9 (patch) | |
tree | 914ba72abb4caa1ea91dd805493d3e7fa6b9339c /libavformat/subtitles.c | |
parent | 3e8426170ce005c111dfcae7982e18b647b7383f (diff) | |
download | ffmpeg-d658ef18e3d1ebe63a64f404ac4646890ecf02c9.tar.gz |
avformat/srtdec: UTF-16 support
Diffstat (limited to 'libavformat/subtitles.c')
-rw-r--r-- | libavformat/subtitles.c | 53 |
1 files changed, 51 insertions, 2 deletions
diff --git a/libavformat/subtitles.c b/libavformat/subtitles.c index cebd453965..bb526cd5e6 100644 --- a/libavformat/subtitles.c +++ b/libavformat/subtitles.c @@ -86,6 +86,25 @@ void ff_text_read(FFTextReader *r, char *buf, size_t size) *buf++ = ff_text_r8(r); } +int ff_text_eof(FFTextReader *r) +{ + return r->buf_pos >= r->buf_len && avio_feof(r->pb); +} + +int ff_text_peek_r8(FFTextReader *r) +{ + int c; + if (r->buf_pos < r->buf_len) + return r->buf[r->buf_pos]; + c = ff_text_r8(r); + if (!avio_feof(r->pb)) { + r->buf_pos = 0; + r->buf_len = 1; + r->buf[0] = c; + } + return c; +} + AVPacket *ff_subtitles_queue_insert(FFDemuxSubtitlesQueue *q, const uint8_t *event, int len, int merge) { @@ -303,7 +322,7 @@ static inline int is_eol(char c) return c == '\r' || c == '\n'; } -void ff_subtitles_read_chunk(AVIOContext *pb, AVBPrint *buf) +void ff_subtitles_read_text_chunk(FFTextReader *tr, AVBPrint *buf) { char eol_buf[5], last_was_cr = 0; int n = 0, i = 0, nb_eol = 0; @@ -311,7 +330,7 @@ void ff_subtitles_read_chunk(AVIOContext *pb, AVBPrint *buf) av_bprint_clear(buf); for (;;) { - char c = avio_r8(pb); + char c = ff_text_r8(tr); if (!c) break; @@ -344,3 +363,33 @@ void ff_subtitles_read_chunk(AVIOContext *pb, AVBPrint *buf) n++; } } + +void ff_subtitles_read_chunk(AVIOContext *pb, AVBPrint *buf) +{ + FFTextReader tr; + tr.buf_pos = tr.buf_len = 0; + tr.type = 0; + tr.pb = pb; + ff_subtitles_read_text_chunk(&tr, buf); +} + +ptrdiff_t ff_subtitles_read_line(FFTextReader *tr, char *buf, size_t size) +{ + size_t cur = 0; + if (!size) + return 0; + while (cur + 1 < size) { + unsigned char c = ff_text_r8(tr); + if (!c) + return ff_text_eof(tr) ? cur : AVERROR_INVALIDDATA; + if (c == '\r' || c == '\n') + break; + buf[cur++] = c; + buf[cur] = '\0'; + } + if (ff_text_peek_r8(tr) == '\r') + ff_text_r8(tr); + if (ff_text_peek_r8(tr) == '\n') + ff_text_r8(tr); + return cur; +} |