43 const uint8_t *ptr = p->buf;
47 if (!strncmp(ptr,
"WEBVTT", 6) &&
48 (!ptr[6] || strchr(
"\n\r\t ", ptr[6])))
56 if (sscanf(
s,
"%u:%u:%u.%u", &hh, &mm, &
ss, &ms) == 4)
return (hh*3600LL + mm*60LL +
ss) * 1000LL + ms;
57 if (sscanf(
s,
"%u:%u.%u", &mm, &
ss, &ms) == 3)
return ( mm*60LL +
ss) * 1000LL + ms;
81 const char *p, *identifier, *settings;
82 size_t identifier_len, settings_len;
92 p = identifier = cue.str;
96 if (!strncmp(p,
"\xEF\xBB\xBFWEBVTT", 9) ||
97 !strncmp(p,
"WEBVTT", 6) ||
98 !strncmp(p,
"STYLE", 5) ||
99 !strncmp(p,
"REGION", 6) ||
100 !strncmp(p,
"NOTE", 4))
105 for (
i = 0; p[
i] && p[
i] !=
'\n' && p[
i] !=
'\r';
i++) {
106 if (!strncmp(p +
i,
"-->", 3)) {
114 identifier_len = strcspn(p,
"\r\n");
125 if (!(p = strstr(p,
"-->")))
128 do p++;
while (*p ==
' ' || *p ==
'\t');
133 p += strcspn(p,
"\n\r\t ");
134 while (*p ==
'\t' || *p ==
' ')
137 settings_len = strcspn(p,
"\r\n");
154#define SET_SIDE_DATA(name, type) do { \
156 uint8_t *buf = av_packet_new_side_data(sub, type, name##_len); \
158 res = AVERROR(ENOMEM); \
161 memcpy(buf, name, name##_len); \
187 min_ts, ts, max_ts,
flags);
197#define OFFSET(x) offsetof(WebVTTContext, x)
198#define KIND_FLAGS AV_OPT_FLAG_SUBTITLE_PARAM|AV_OPT_FLAG_DECODING_PARAM
210 .class_name =
"WebVTT demuxer",
219 .p.mime_type =
"text/vtt",
220 .p.extensions =
"vtt,webvtt",
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
static int read_packet(void *opaque, uint8_t *buf, int buf_size)
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
#define AV_BPRINT_SIZE_UNLIMITED
#define flags(name, subs,...)
#define i(width, name, range_min, range_max)
#define ss(width, name, subs,...)
static int read_probe(const AVProbeData *p)
#define FF_INFMT_FLAG_INIT_CLEANUP
For an FFInputFormat with this flag set read_close() needs to be called by the caller upon read_heade...
static int read_header(FFV1Context *f, RangeCoder *c)
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
@ AV_OPT_TYPE_INT
Underlying C type is int.
@ AV_PKT_DATA_WEBVTT_SETTINGS
The optional settings (rendering instructions) that immediately follow the timestamp specifier of a W...
@ AV_PKT_DATA_WEBVTT_IDENTIFIER
The optional first identifier line of a WebVTT cue.
AVStream * avformat_new_stream(AVFormatContext *s, const struct AVCodec *c)
Add a new stream to a media file.
int av_bprint_finalize(AVBPrint *buf, char **ret_str)
Finalize a print buffer.
const char * av_default_item_name(void *ptr)
Return the context name.
#define AV_NOPTS_VALUE
Undefined timestamp value.
#define LIBAVUTIL_VERSION_INT
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
static av_cold int read_close(AVFormatContext *ctx)
Describe the class of an AVClass context structure.
enum AVMediaType codec_type
General type of the encoded data.
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
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 pos
byte position in stream, -1 if unknown
This structure contains the data a format has to probe a file.
AVCodecParameters * codecpar
Codec parameters associated with this stream.
int disposition
Stream disposition - a combination of AV_DISPOSITION_* flags.
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.
AVPacket * ff_subtitles_queue_insert(FFDemuxSubtitlesQueue *q, const uint8_t *event, size_t len, int merge)
Insert a new subtitle event.
int ff_subtitles_read_chunk(AVIOContext *pb, AVBPrint *buf)
Same as ff_subtitles_read_text_chunk(), but read from an AVIOContext.
int ff_subtitles_queue_read_packet(FFDemuxSubtitlesQueue *q, AVPacket *pkt)
Generic read_packet() callback for subtitles demuxers using this queue system.
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_queue_clean(FFDemuxSubtitlesQueue *q)
Remove and destroy all the subtitles packets.