|
|
|
@ -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; |
|
|
|
|