[FFmpeg-devel] [PATCH 3/4] avformat/samidec: UTF-16 support
wm4
nfxjfg at googlemail.com
Tue Sep 2 20:56:11 CEST 2014
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 1a12eca..4dbf2cf 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, "<SAMI>", 6) ? AVPROBE_SCORE_MAX : 0;
+ return !strncmp(buf, "<SAMI>", 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 1641aae..b8b680e 100644
--- a/libavformat/subtitles.c
+++ b/libavformat/subtitles.c
@@ -272,20 +272,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 == '>') {
@@ -295,6 +295,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 d5b4a82..33dd0d0 100644
--- a/libavformat/subtitles.h
+++ b/libavformat/subtitles.h
@@ -143,6 +143,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.
*
* @param s SMIL tag ("<...>")
--
2.1.0
More information about the ffmpeg-devel
mailing list