[FFmpeg-devel] [PATCH] fix trac ticket #7359
Nick Ryan
nick.paul.ryan at gmail.com
Wed Oct 24 15:50:15 EEST 2018
Signed-off-by: Nick Ryan <nick.paul.ryan at gmail.com>
---
libavformat/hls.c | 6 ++++--
libavformat/mov.c | 36 +++++++++++++++++++++++++++++++++---
2 files changed, 37 insertions(+), 5 deletions(-)
diff --git a/libavformat/hls.c b/libavformat/hls.c
index 8ad08baaed..99373d0f45 100644
--- a/libavformat/hls.c
+++ b/libavformat/hls.c
@@ -2107,8 +2107,10 @@ static int hls_read_packet(AVFormatContext *s, AVPacket *pkt)
ts_diff = av_rescale_rnd(pls->pkt.dts, AV_TIME_BASE,
tb.den, AV_ROUND_DOWN) -
pls->seek_timestamp;
- if (ts_diff >= 0 && (pls->seek_flags & AVSEEK_FLAG_ANY ||
- pls->pkt.flags & AV_PKT_FLAG_KEY)) {
+ /* If AVSEEK_FLAG_ANY, keep reading until ts_diff is greater than 0
+ * otherwise return the first keyframe encountered */
+ if ((ts_diff >= 0 && (pls->seek_flags & AVSEEK_FLAG_ANY)) ||
+ (!(pls->seek_flags & AVSEEK_FLAG_ANY) && (pls->pkt.flags & AV_PKT_FLAG_KEY))) {
pls->seek_timestamp = AV_NOPTS_VALUE;
break;
}
diff --git a/libavformat/mov.c b/libavformat/mov.c
index ec57a05803..b13c3143ef 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -7605,15 +7605,15 @@ static int mov_switch_root(AVFormatContext *s, int64_t target, int index)
if (index >= 0 && index < mov->frag_index.nb_items)
target = mov->frag_index.item[index].moof_offset;
- if (avio_seek(s->pb, target, SEEK_SET) != target) {
+ if (target >= 0 && avio_seek(s->pb, target, SEEK_SET) != target) {
av_log(mov->fc, AV_LOG_ERROR, "root atom offset 0x%"PRIx64": partial file\n", target);
return AVERROR_INVALIDDATA;
}
mov->next_root_atom = 0;
- if (index < 0 || index >= mov->frag_index.nb_items)
+ if ((index < 0 && target >= 0) || index >= mov->frag_index.nb_items)
index = search_frag_moof_offset(&mov->frag_index, target);
- if (index < mov->frag_index.nb_items) {
+ if (index >= 0 && index < mov->frag_index.nb_items) {
if (index + 1 < mov->frag_index.nb_items)
mov->next_root_atom = mov->frag_index.item[index + 1].moof_offset;
if (mov->frag_index.item[index].headers_read)
@@ -7664,8 +7664,38 @@ static int mov_read_packet(AVFormatContext *s, AVPacket *pkt)
AVStream *st = NULL;
int64_t current_index;
int ret;
+ int i;
mov->fc = s;
retry:
+ if (s->pb->pos == 0) {
+
+ // Discard current fragment index
+ if (mov->frag_index.allocated_size > 0) {
+ av_freep(&mov->frag_index.item);
+ mov->frag_index.nb_items = 0;
+ mov->frag_index.allocated_size = 0;
+ mov->frag_index.current = -1;
+ mov->frag_index.complete = 0;
+ }
+
+ for (i = 0; i < s->nb_streams; i++) {
+ AVStream *avst = s->streams[i];
+ MOVStreamContext *msc = avst->priv_data;
+
+ // Clear current sample
+ mov_current_sample_set(msc, 0);
+
+ // Discard current index entries
+ if (avst->index_entries_allocated_size > 0) {
+ av_freep(&avst->index_entries);
+ avst->index_entries_allocated_size = 0;
+ avst->nb_index_entries = 0;
+ }
+ }
+
+ if ((ret = mov_switch_root(s, -1, -1)) < 0)
+ return ret;
+ }
sample = mov_find_next_sample(s, &st);
if (!sample || (mov->next_root_atom && sample->pos > mov->next_root_atom)) {
if (!mov->next_root_atom)
--
2.17.1 (Apple Git-112)
More information about the ffmpeg-devel
mailing list