42 while(p[offset] ==
' ' || p[offset] ==
'\t') {
45 if(p[offset] ==
'[' && p[offset + 1] >=
'a' && p[offset + 1] <=
'z') {
58 if(p[offset] ==
' ' || p[offset] ==
'\t') {
60 }
else if(p[offset] ==
'[') {
63 }
else if (p[offset] ==
']' && in_brackets) {
66 }
else if(in_brackets &&
67 (p[offset] ==
':' || p[offset] ==
'.' || p[offset] ==
'-' ||
68 (p[offset] >=
'0' && p[offset] <=
'9'))) {
82 while(p[offset] ==
' ' || p[offset] ==
'\t') {
85 if(p[offset] !=
'[') {
88 if(sscanf(p,
"[-%"SCNu64
":%"SCNu64
".%"SCNu64
"]", &mm, &ss, &cs) == 3) {
90 *start = -(int64_t) (mm*60000 + ss*1000 + cs*10);
91 }
else if(sscanf(p,
"[%"SCNu64
":%"SCNu64
".%"SCNu64
"]", &mm, &ss, &cs) == 3) {
92 *start = mm*60000 + ss*1000 + cs*10;
98 }
while(p[offset] && p[offset-1] !=
']');
126 if(!memcmp(p->
buf,
"\xef\xbb\xbf", 3)) {
129 while(p->
buf[offset] ==
'\n' || p->
buf[offset] ==
'\r') {
132 if(p->
buf[offset] !=
'[') {
137 if(!memcmp(p->
buf + offset,
"offset:", 7)) {
140 if(sscanf(p->
buf + offset,
"%"SCNd64
":%"SCNu64
".%"SCNu64
"]",
141 &mm, &ss, &cs) == 3) {
146 metadata_item->
native; metadata_item++) {
147 size_t metadata_item_len = strlen(metadata_item->
native);
148 if(p->
buf[offset + metadata_item_len] ==
':' &&
149 !memcmp(p->
buf + offset, metadata_item->
native, metadata_item_len)) {
175 if(header_offset >= 0) {
176 char *comma_offset = strchr(line.str,
':');
178 char *right_bracket_offset = strchr(line.str,
']');
179 if(!right_bracket_offset) {
183 *right_bracket_offset = *comma_offset =
'\0';
184 if(strcmp(line.str + 1,
"offset") ||
185 sscanf(comma_offset + 1,
"%"SCNd64, &lrc->
ts_offset) != 1) {
189 *right_bracket_offset =
']';
195 int64_t ts_stroffset = 0;
196 int64_t ts_stroffset_incr = 0;
197 int64_t ts_strlength =
count_ts(line.str);
199 while((ts_stroffset_incr =
read_ts(line.str + ts_stroffset,
201 ts_stroffset += ts_stroffset_incr;
203 line.len - ts_strlength, 0);
225 int64_t min_ts, int64_t ts, int64_t max_ts,
int flags)
229 min_ts, ts, max_ts, flags);
static int64_t count_ts(const char *p)
AVInputFormat ff_lrc_demuxer
int64_t pos
byte position in stream, -1 if unknown
void ff_subtitles_queue_clean(FFDemuxSubtitlesQueue *q)
Remove and destroy all the subtitles packets.
static int64_t read_ts(const char *p, int64_t *start)
int ff_subtitles_queue_read_packet(FFDemuxSubtitlesQueue *q, AVPacket *pkt)
Generic read_packet() callback for subtitles demuxers using this queue system.
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
static av_cold int read_close(AVFormatContext *ctx)
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
int duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
AVDictionary * metadata
Metadata that applies to the whole file.
static int lrc_read_close(AVFormatContext *s)
#define AV_BPRINT_SIZE_UNLIMITED
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
static int lrc_probe(AVProbeData *p)
static const uint8_t offset[127][2]
int avio_r8(AVIOContext *s)
AVCodecContext * codec
Codec context associated with this stream.
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
void ff_subtitles_queue_finalize(FFDemuxSubtitlesQueue *q)
Set missing durations and sort subtitles by PTS, and then byte position.
const AVMetadataConv ff_lrc_metadata_conv[]
static int read_header(FFV1Context *f)
static int read_packet(void *opaque, uint8_t *buf, int buf_size)
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.
enum AVMediaType codec_type
AVIOContext * pb
I/O context.
static int64_t find_header(const char *p)
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
static int64_t read_line(AVBPrint *buf, AVIOContext *pb)
static int lrc_read_header(AVFormatContext *s)
This structure contains the data a format has to probe a file.
void av_bprint_clear(AVBPrint *buf)
Reset the string to "" but keep internal allocated data.
static int lrc_read_packet(AVFormatContext *s, AVPacket *pkt)
void * priv_data
Format private data.
int avio_feof(AVIOContext *s)
feof() equivalent for AVIOContext.
AVPacket * ff_subtitles_queue_insert(FFDemuxSubtitlesQueue *q, const uint8_t *event, size_t len, int merge)
Insert a new subtitle event.
This structure stores compressed data.
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
#define AV_NOPTS_VALUE
Undefined timestamp value.
static int lrc_read_seek(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
void av_bprint_chars(AVBPrint *buf, char c, unsigned n)
Append char c n times to a print buffer.