|
|
|
@@ -1826,19 +1826,22 @@ static int dash_close(AVFormatContext *s) |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
static int dash_seek(AVFormatContext *s, struct representation *pls, int64_t seek_pos_msec, int flags) |
|
|
|
static int dash_seek(AVFormatContext *s, struct representation *pls, int64_t seek_pos_msec, int flags, int dry_run) |
|
|
|
{ |
|
|
|
int ret = 0; |
|
|
|
int i = 0; |
|
|
|
int j = 0; |
|
|
|
int64_t duration = 0; |
|
|
|
|
|
|
|
av_log(pls->parent, AV_LOG_VERBOSE, "DASH seek pos[%"PRId64"ms], playlist %d\n", seek_pos_msec, pls->rep_idx); |
|
|
|
av_log(pls->parent, AV_LOG_VERBOSE, "DASH seek pos[%"PRId64"ms], playlist %d%s\n", |
|
|
|
seek_pos_msec, pls->rep_idx, dry_run ? " (dry)" : ""); |
|
|
|
|
|
|
|
// single fragment mode |
|
|
|
if (pls->n_fragments == 1) { |
|
|
|
pls->cur_timestamp = 0; |
|
|
|
pls->cur_seg_offset = 0; |
|
|
|
if (dry_run) |
|
|
|
return 0; |
|
|
|
ff_read_frame_flush(pls->ctx); |
|
|
|
return av_seek_frame(pls->ctx, -1, seek_pos_msec * 1000, flags); |
|
|
|
} |
|
|
|
@@ -1883,14 +1886,14 @@ set_seq_num: |
|
|
|
pls->cur_timestamp = 0; |
|
|
|
pls->cur_seg_offset = 0; |
|
|
|
pls->init_sec_buf_read_offset = 0; |
|
|
|
ret = reopen_demux_for_component(s, pls); |
|
|
|
ret = dry_run ? 0 : reopen_demux_for_component(s, pls); |
|
|
|
|
|
|
|
return ret; |
|
|
|
} |
|
|
|
|
|
|
|
static int dash_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags) |
|
|
|
{ |
|
|
|
int ret, i; |
|
|
|
int ret = 0, i; |
|
|
|
DASHContext *c = s->priv_data; |
|
|
|
int64_t seek_pos_msec = av_rescale_rnd(timestamp, 1000, |
|
|
|
s->streams[stream_index]->time_base.den, |
|
|
|
@@ -1899,16 +1902,14 @@ static int dash_read_seek(AVFormatContext *s, int stream_index, int64_t timestam |
|
|
|
if ((flags & AVSEEK_FLAG_BYTE) || c->is_live) |
|
|
|
return AVERROR(ENOSYS); |
|
|
|
|
|
|
|
ret = AVERROR_EOF; |
|
|
|
/* Seek in discarded streams with dry_run=1 to avoid reopening them */ |
|
|
|
for (i = 0; i < c->n_videos; i++) { |
|
|
|
if (c->videos[i]->stream_index == stream_index) { |
|
|
|
ret = dash_seek(s, c->videos[i], seek_pos_msec, flags); |
|
|
|
} |
|
|
|
if (!ret) |
|
|
|
ret = dash_seek(s, c->videos[i], seek_pos_msec, flags, !c->videos[i]->ctx); |
|
|
|
} |
|
|
|
for (i = 0; i < c->n_audios; i++) { |
|
|
|
if (c->audios[i]->stream_index == stream_index) { |
|
|
|
ret = dash_seek(s, c->audios[i], seek_pos_msec, flags); |
|
|
|
} |
|
|
|
if (!ret) |
|
|
|
ret = dash_seek(s, c->audios[i], seek_pos_msec, flags, !c->audios[i]->ctx); |
|
|
|
} |
|
|
|
|
|
|
|
return ret; |
|
|
|
|