Merge commit '35c6ce76b107225a19eb33aea38857d2405882af'
[ffmpeg.git] / libavformat / samidec.c
index 5f29364..948e1ed 100644 (file)
@@ -27,6 +27,7 @@
 #include "avformat.h"
 #include "internal.h"
 #include "subtitles.h"
+#include "libavcodec/internal.h"
 #include "libavutil/avstring.h"
 #include "libavutil/bprint.h"
 #include "libavutil/intreadwrite.h"
@@ -37,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)
@@ -51,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(s, &tr, s->pb);
 
     if (!st)
         return AVERROR(ENOMEM);
@@ -61,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 (!url_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;
@@ -91,13 +95,9 @@ static int sami_read_header(AVFormatContext *s)
         av_bprint_clear(&buf);
     }
 
-    st->codec->extradata_size = hdr_buf.len + 1;
-    av_bprint_finalize(&hdr_buf, (char **)&st->codec->extradata);
-    if (!st->codec->extradata) {
-        st->codec->extradata_size = 0;
-        res = AVERROR(ENOMEM);
+    res = avpriv_bprint_to_extradata(st->codec, &hdr_buf);
+    if (res < 0)
         goto end;
-    }
 
     ff_subtitles_queue_finalize(&sami->q);
 
@@ -112,6 +112,14 @@ static int sami_read_packet(AVFormatContext *s, AVPacket *pkt)
     return ff_subtitles_queue_read_packet(&sami->q, pkt);
 }
 
+static int sami_read_seek(AVFormatContext *s, int stream_index,
+                          int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
+{
+    SAMIContext *sami = s->priv_data;
+    return ff_subtitles_queue_seek(&sami->q, s, stream_index,
+                                   min_ts, ts, max_ts, flags);
+}
+
 static int sami_read_close(AVFormatContext *s)
 {
     SAMIContext *sami = s->priv_data;
@@ -126,7 +134,7 @@ AVInputFormat ff_sami_demuxer = {
     .read_probe     = sami_probe,
     .read_header    = sami_read_header,
     .read_packet    = sami_read_packet,
+    .read_seek2     = sami_read_seek,
     .read_close     = sami_read_close,
-    .flags          = AVFMT_GENERIC_INDEX,
     .extensions     = "smi,sami",
 };