From 231a514dd3d246b38d0bf2a400a1759902a6f051 Mon Sep 17 00:00:00 2001 From: wm4 Date: Tue, 2 Sep 2014 20:53:08 +0200 Subject: [PATCH] avformat/samidec: UTF-16 support ff_smil_extract_next_chunk() is still used by RealText. --- libavformat/samidec.c | 17 ++++++++++------- libavformat/subtitles.c | 15 ++++++++++++--- libavformat/subtitles.h | 5 +++++ 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/libavformat/samidec.c b/libavformat/samidec.c index 1a12ecad46..4dbf2cf945 100644 --- a/libavformat/samidec.c +++ b/libavformat/samidec.c @@ -38,11 +38,12 @@ typedef struct { static int sami_probe(AVProbeData *p) { - const unsigned char *ptr = p->buf; + char buf[6]; + FFTextReader tr; + ff_text_init_buf(&tr, p->buf, p->buf_size); + ff_text_read(&tr, buf, sizeof(buf)); - if (AV_RB24(ptr) == 0xEFBBBF) - ptr += 3; /* skip UTF-8 BOM */ - return !strncmp(ptr, "", 6) ? AVPROBE_SCORE_MAX : 0; + return !strncmp(buf, "", 6) ? AVPROBE_SCORE_MAX : 0; } static int sami_read_header(AVFormatContext *s) @@ -52,6 +53,8 @@ static int sami_read_header(AVFormatContext *s) AVBPrint buf, hdr_buf; char c = 0; int res = 0, got_first_sync_point = 0; + FFTextReader tr; + ff_text_init_avio(&tr, s->pb); if (!st) return AVERROR(ENOMEM); @@ -62,10 +65,10 @@ static int sami_read_header(AVFormatContext *s) av_bprint_init(&buf, 0, AV_BPRINT_SIZE_UNLIMITED); av_bprint_init(&hdr_buf, 0, AV_BPRINT_SIZE_UNLIMITED); - while (!avio_feof(s->pb)) { + while (!ff_text_eof(&tr)) { AVPacket *sub; - const int64_t pos = avio_tell(s->pb) - (c != 0); - int is_sync, n = ff_smil_extract_next_chunk(s->pb, &buf, &c); + const int64_t pos = ff_text_pos(&tr) - (c != 0); + int is_sync, n = ff_smil_extract_next_text_chunk(&tr, &buf, &c); if (n == 0) break; diff --git a/libavformat/subtitles.c b/libavformat/subtitles.c index bb526cd5e6..6b59538753 100644 --- a/libavformat/subtitles.c +++ b/libavformat/subtitles.c @@ -274,20 +274,20 @@ void ff_subtitles_queue_clean(FFDemuxSubtitlesQueue *q) q->nb_subs = q->allocated_size = q->current_sub_idx = 0; } -int ff_smil_extract_next_chunk(AVIOContext *pb, AVBPrint *buf, char *c) +int ff_smil_extract_next_text_chunk(FFTextReader *tr, AVBPrint *buf, char *c) { int i = 0; char end_chr; if (!*c) // cached char? - *c = avio_r8(pb); + *c = ff_text_r8(tr); if (!*c) return 0; end_chr = *c == '<' ? '>' : '<'; do { av_bprint_chars(buf, *c, 1); - *c = avio_r8(pb); + *c = ff_text_r8(tr); i++; } while (*c != end_chr && *c); if (end_chr == '>') { @@ -297,6 +297,15 @@ int ff_smil_extract_next_chunk(AVIOContext *pb, AVBPrint *buf, char *c) return i; } +int ff_smil_extract_next_chunk(AVIOContext *pb, AVBPrint *buf, char *c) +{ + FFTextReader tr; + tr.buf_pos = tr.buf_len = 0; + tr.type = 0; + tr.pb = pb; + return ff_smil_extract_next_text_chunk(&tr, buf, c); +} + const char *ff_smil_get_attr_ptr(const char *s, const char *attr) { int in_quotes = 0; diff --git a/libavformat/subtitles.h b/libavformat/subtitles.h index cf8c408486..67ddf4db26 100644 --- a/libavformat/subtitles.h +++ b/libavformat/subtitles.h @@ -146,6 +146,11 @@ void ff_subtitles_queue_clean(FFDemuxSubtitlesQueue *q); */ int ff_smil_extract_next_chunk(AVIOContext *pb, AVBPrint *buf, char *c); +/** + * As ff_smil_extract_next_chunk(), but with FFTextReader. + */ +int ff_smil_extract_next_text_chunk(FFTextReader *tr, AVBPrint *buf, char *c); + /** * SMIL helper to point on the value of an attribute in the given tag. *