46 if (!strncmp(ptr,
"WEBVTT", 6) &&
47 (!ptr[6] || strchr(
"\n\r\t ", ptr[6])))
55 if (sscanf(
s,
"%u:%u:%u.%u", &hh, &mm, &
ss, &ms) == 4)
return (hh*3600LL + mm*60LL +
ss) * 1000LL + ms;
56 if (sscanf(
s,
"%u:%u.%u", &mm, &
ss, &ms) == 3)
return ( mm*60LL +
ss) * 1000LL + ms;
80 const char *p, *identifier, *settings;
81 int identifier_len, settings_len;
89 p = identifier = cue.str;
93 if (!strncmp(p,
"\xEF\xBB\xBFWEBVTT", 9) ||
94 !strncmp(p,
"WEBVTT", 6) ||
95 !strncmp(p,
"NOTE", 4))
100 for (
i = 0; p[
i] && p[
i] !=
'\n' && p[
i] !=
'\r';
i++) {
101 if (!strncmp(p +
i,
"-->", 3)) {
109 identifier_len = strcspn(p,
"\r\n");
120 if (!(p = strstr(p,
"-->")))
123 do p++;
while (*p ==
' ' || *p ==
'\t');
128 p += strcspn(p,
"\n\r\t ");
129 while (*p ==
'\t' || *p ==
' ')
132 settings_len = strcspn(p,
"\r\n");
147 sub->duration = ts_end - ts_start;
149 #define SET_SIDE_DATA(name, type) do { \
151 uint8_t *buf = av_packet_new_side_data(sub, type, name##_len); \
153 res = AVERROR(ENOMEM); \
156 memcpy(buf, name, name##_len); \
184 min_ts, ts, max_ts,
flags);
194 #define OFFSET(x) offsetof(WebVTTContext, x)
195 #define KIND_FLAGS AV_OPT_FLAG_SUBTITLE_PARAM|AV_OPT_FLAG_DECODING_PARAM
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)
int av_bprint_finalize(AVBPrint *buf, char **ret_str)
Finalize a print buffer.
#define AV_BPRINT_SIZE_UNLIMITED
#define flags(name, subs,...)
#define ss(width, name, subs,...)
static float sub(float src0, float src1)
static int read_header(FFV1Context *f)
@ 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 AVCodec *c)
Add a new stream to a media file.
const char * av_default_item_name(void *ptr)
Return the context name.
#define AV_NOPTS_VALUE
Undefined timestamp value.
#define LIBAVUTIL_VERSION_INT
common internal API header
#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.
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
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.
This structure contains the data a format has to probe a file.
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
AVCodecParameters * codecpar
Codec parameters associated with this stream.
int disposition
AV_DISPOSITION_* bit field.
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.
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.
AVPacket * ff_subtitles_queue_insert(FFDemuxSubtitlesQueue *q, const uint8_t *event, size_t len, int merge)
Insert a new subtitle event.