avformat/samidec: UTF-16 support
authorwm4 <nfxjfg@googlemail.com>
Tue, 2 Sep 2014 18:53:08 +0000 (20:53 +0200)
committerClément Bœsch <u@pkh.me>
Fri, 5 Sep 2014 21:13:07 +0000 (23:13 +0200)
ff_smil_extract_next_chunk() is still used by RealText.

libavformat/samidec.c
libavformat/subtitles.c
libavformat/subtitles.h

index 1a12eca..4dbf2cf 100644 (file)
@@ -38,11 +38,12 @@ typedef struct {
 
 static int sami_probe(AVProbeData *p)
 {
 
 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)
 }
 
 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;
     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);
 
     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);
 
     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;
         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;
 
         if (n == 0)
             break;
index bb526cd..6b59538 100644 (file)
@@ -274,20 +274,20 @@ void ff_subtitles_queue_clean(FFDemuxSubtitlesQueue *q)
     q->nb_subs = q->allocated_size = q->current_sub_idx = 0;
 }
 
     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?
 {
     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);
     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 == '>') {
         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;
 }
 
     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;
 const char *ff_smil_get_attr_ptr(const char *s, const char *attr)
 {
     int in_quotes = 0;
index cf8c408..67ddf4d 100644 (file)
@@ -146,6 +146,11 @@ void ff_subtitles_queue_clean(FFDemuxSubtitlesQueue *q);
  */
 int ff_smil_extract_next_chunk(AVIOContext *pb, AVBPrint *buf, char *c);
 
  */
 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.
  *
 /**
  * SMIL helper to point on the value of an attribute in the given tag.
  *