int64_t file_start_time;
int64_t file_inpoint;
int64_t duration;
+ int64_t next_dts;
ConcatStream *streams;
int64_t inpoint;
int64_t outpoint;
proto = avio_find_protocol_name(filename);
proto_len = proto ? strlen(proto) : 0;
- if (!memcmp(filename, proto, proto_len) &&
+ if (proto && !memcmp(filename, proto, proto_len) &&
(filename[proto_len] == ':' || filename[proto_len] == ',')) {
url = filename;
filename = NULL;
file->url = url;
file->start_time = AV_NOPTS_VALUE;
file->duration = AV_NOPTS_VALUE;
+ file->next_dts = AV_NOPTS_VALUE;
file->inpoint = AV_NOPTS_VALUE;
file->outpoint = AV_NOPTS_VALUE;
if (!cat->avf)
return AVERROR(ENOMEM);
- cat->avf->flags |= avf->flags;
+ cat->avf->flags |= avf->flags & ~AVFMT_FLAG_CUSTOM_IO;
cat->avf->interrupt_callback = avf->interrupt_callback;
if ((ret = ff_copy_whiteblacklists(cat->avf, avf)) < 0)
ConcatContext *cat = avf->priv_data;
unsigned fileno = cat->cur_file - cat->files;
- if (cat->cur_file->duration == AV_NOPTS_VALUE)
- cat->cur_file->duration = cat->avf->duration - (cat->cur_file->file_inpoint - cat->cur_file->file_start_time);
+ if (cat->cur_file->duration == AV_NOPTS_VALUE) {
+ if (cat->avf->duration > 0 || cat->cur_file->next_dts == AV_NOPTS_VALUE) {
+ cat->cur_file->duration = cat->avf->duration;
+ } else {
+ cat->cur_file->duration = cat->cur_file->next_dts;
+ }
+ cat->cur_file->duration -= (cat->cur_file->file_inpoint - cat->cur_file->file_start_time);
+ }
if (++fileno >= cat->nb_files) {
cat->eof = 1;
memcpy(metadata, packed_metadata, metadata_len);
av_freep(&packed_metadata);
}
+
+ if (cat->cur_file->duration == AV_NOPTS_VALUE && st->cur_dts != AV_NOPTS_VALUE) {
+ int64_t next_dts = av_rescale_q(st->cur_dts, st->time_base, AV_TIME_BASE_Q);
+ if (cat->cur_file->next_dts == AV_NOPTS_VALUE || next_dts > cat->cur_file->next_dts) {
+ cat->cur_file->next_dts = next_dts;
+ }
+ }
+
return ret;
}