31 r->buf_pos =
r->buf_len = 0;
33 for (
i = 0;
i < 2;
i++)
35 if (strncmp(
"\xFF\xFE",
r->buf, 2) == 0) {
38 }
else if (strncmp(
"\xFE\xFF",
r->buf, 2) == 0) {
43 if (strncmp(
"\xEF\xBB\xBF",
r->buf, 3) == 0) {
50 "UTF16 is automatically converted to UTF8, do not specify a character encoding\n");
55 memset(&
r->buf_pb, 0,
sizeof(
r->buf_pb));
69 if (
r->buf_pos <
r->buf_len)
70 return r->buf[
r->buf_pos++];
83 return r->buf[
r->buf_pos++];
100 if (
r->buf_pos <
r->buf_len)
101 return r->buf[
r->buf_pos];
124 memcpy(
sub->data + old_len, event,
len);
145 memcpy(
sub->data, event,
len);
154 if (
s1->pts ==
s2->pts)
163 if (
s1->pos ==
s2->pos) {
164 if (
s1->pts ==
s2->pts)
166 return s1->pts >
s2->pts ? 1 : -1;
168 return s1->pos >
s2->pos ? 1 : -1;
176 const int last_id =
i - 1 - drop;
261 if (ts < 0 || ts >= q->
nb_subs)
273 for (
i = idx;
i > 0 && q->
subs[
i]->
pts > max_ts;
i--)
277 ts_selected = q->
subs[idx]->
pts;
278 if (ts_selected < min_ts || ts_selected > max_ts)
282 for (
i = idx - 1;
i >= 0;
i--) {
298 if (stream_index == -1)
327 end_chr = *
c ==
'<' ?
'>' :
'<';
332 }
while (*
c != end_chr && *
c);
333 if (end_chr ==
'>') {
343 const size_t len = strlen(attr);
349 in_quotes ^= *
s ==
'"';
355 return s +
len + 1 + (
s[
len + 1] ==
'"');
362 return c ==
'\r' ||
c ==
'\n';
367 char eol_buf[5], last_was_cr = 0;
368 int n = 0,
i = 0, nb_eol = 0;
384 nb_eol +=
c ==
'\n' || last_was_cr;
388 if (
i ==
sizeof(eol_buf) - 1)
390 last_was_cr =
c ==
'\r';
422 while (cur + 1 <
size) {
426 if (
c ==
'\r' ||
c ==
'\n')
static double val(void *priv, double ch)
simple assert() macros that are a bit more flexible than ISO C assert().
unsigned int avio_rb16(AVIOContext *s)
int avio_feof(AVIOContext *s)
Similar to feof() but also returns nonzero on read errors.
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
unsigned int avio_rl16(AVIOContext *s)
int avio_r8(AVIOContext *s)
int ffio_init_context(AVIOContext *s, unsigned char *buffer, int buffer_size, int write_flag, void *opaque, int(*read_packet)(void *opaque, uint8_t *buf, int buf_size), int(*write_packet)(void *opaque, uint8_t *buf, int buf_size), int64_t(*seek)(void *opaque, int64_t offset, int whence))
void av_bprintf(AVBPrint *buf, const char *fmt,...)
void av_bprint_chars(AVBPrint *buf, char c, unsigned n)
Append char c n times to a print buffer.
void av_bprint_clear(AVBPrint *buf)
Reset the string to "" but keep internal allocated data.
#define flags(name, subs,...)
#define GET_UTF16(val, GET_16BIT, ERROR)
Convert a UTF-16 character (2 or 4 bytes) to its 32-bit UCS-4 encoded form.
#define PUT_UTF8(val, tmp, PUT_BYTE)
Convert a 32-bit Unicode character to its UTF-8 encoded form (up to 4 bytes long).
#define FFDIFFSIGN(x, y)
Comparator.
static float sub(float src0, float src1)
void av_packet_free(AVPacket **pkt)
Free the packet, if the packet is reference counted, it will be unreferenced first.
int av_grow_packet(AVPacket *pkt, int grow_by)
Increase packet size, correctly zeroing padding.
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
AVPacket * av_packet_alloc(void)
Allocate an AVPacket and set its fields to default values.
int av_packet_ref(AVPacket *dst, const AVPacket *src)
Setup a new reference to the data described by a given packet.
int av_new_packet(AVPacket *pkt, int size)
Allocate the payload of a packet and initialize its fields with default values.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
#define AVERROR_EOF
End of file.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define AV_LOG_INFO
Standard information.
void * av_fast_realloc(void *ptr, unsigned int *size, size_t min_size)
Reallocate the given buffer if it is not large enough, otherwise do nothing.
static av_const int av_isspace(int c)
Locale-independent conversion of ASCII isspace.
int av_strncasecmp(const char *a, const char *b, size_t n)
Locale-independent case-insensitive compare.
static void merge(GetBitContext *gb, uint8_t *dst, uint8_t *src, int size)
Merge two consequent lists of equal size depending on bits read.
This structure stores compressed data.
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
int nb_subs
number of subtitles packets
AVPacket ** subs
array of subtitles packets
int allocated_size
allocated size for subs
int current_sub_idx
current position for the read packet callback
enum sub_sort sort
sort method to use when finalizing subtitles
int keep_duplicates
set to 1 to keep duplicated subtitle events
ptrdiff_t ff_subtitles_read_line(FFTextReader *tr, char *buf, size_t size)
Read a line of text.
int64_t ff_text_pos(FFTextReader *r)
Return the byte position of the next byte returned by ff_text_r8().
void ff_subtitles_read_chunk(AVIOContext *pb, AVBPrint *buf)
Same as ff_subtitles_read_text_chunk(), but read from an AVIOContext.
int ff_subtitles_queue_seek(FFDemuxSubtitlesQueue *q, AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
Update current_sub_idx to emulate a seek.
void ff_text_read(FFTextReader *r, char *buf, size_t size)
Read the given number of bytes (in UTF-8).
void ff_text_init_buf(FFTextReader *r, void *buf, size_t size)
Similar to ff_text_init_avio(), but sets it up to read from a bounded buffer.
static int cmp_pkt_sub_ts_pos(const void *a, const void *b)
int ff_text_eof(FFTextReader *r)
Return non-zero if EOF was reached.
static int is_eol(char c)
static void drop_dups(void *log_ctx, FFDemuxSubtitlesQueue *q)
static int search_sub_ts(const FFDemuxSubtitlesQueue *q, int64_t ts)
void ff_text_init_avio(void *s, FFTextReader *r, AVIOContext *pb)
Initialize the FFTextReader from the given AVIOContext.
int ff_text_r8(FFTextReader *r)
Return the next byte.
int ff_smil_extract_next_text_chunk(FFTextReader *tr, AVBPrint *buf, char *c)
SMIL helper to load next chunk ("<...>" or untagged content) in buf.
static int cmp_pkt_sub_pos_ts(const void *a, const void *b)
int ff_subtitles_queue_read_packet(FFDemuxSubtitlesQueue *q, AVPacket *pkt)
Generic read_packet() callback for subtitles demuxers using this queue system.
int ff_text_peek_r8(FFTextReader *r)
Like ff_text_r8(), but don't remove the byte from the buffer.
void ff_subtitles_queue_finalize(void *log_ctx, FFDemuxSubtitlesQueue *q)
Set missing durations, sort subtitles by PTS (and then byte position), and drop duplicated events.
void ff_subtitles_read_text_chunk(FFTextReader *tr, AVBPrint *buf)
Read a subtitles chunk from FFTextReader.
void ff_subtitles_queue_clean(FFDemuxSubtitlesQueue *q)
Remove and destroy all the subtitles packets.
const char * ff_smil_get_attr_ptr(const char *s, const char *attr)
SMIL helper to point on the value of an attribute in the given tag.
AVPacket * ff_subtitles_queue_insert(FFDemuxSubtitlesQueue *q, const uint8_t *event, size_t len, int merge)
Insert a new subtitle event.
@ SUB_SORT_TS_POS
sort by timestamps, then position