[FFmpeg-cvslog] nutdec: fix infinite resync loops
Andreas Cadhalpun
git at videolan.org
Tue Jun 2 00:50:01 CEST 2015
ffmpeg | branch: release/2.4 | Andreas Cadhalpun <Andreas.Cadhalpun at googlemail.com> | Wed May 20 00:06:05 2015 +0200| [936a5dd2c5c9141bcc02c4bd6749e26f1e4454b2] | committer: Michael Niedermayer
nutdec: fix infinite resync loops
nut->last_syncpoint_pos doesn't necessarily change between resync
attempts, so find_any_startcode can return the same startcode again.
Thus remember where the last resync happened and don't try to resync
before that.
This can't be done locally in nut_read_packet, because this wouldn't
prevent infinite resync loops, where after the resync a packet is
returned and while reading a following packet the resync happens again.
Reviewed-by: Michael Niedermayer <michaelni at gmx.at>
Signed-off-by: Andreas Cadhalpun <Andreas.Cadhalpun at googlemail.com>
(cherry picked from commit 37e679881d364b6da817d829d35869d657218ab3)
Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=936a5dd2c5c9141bcc02c4bd6749e26f1e4454b2
---
libavformat/nut.h | 1 +
libavformat/nutdec.c | 5 ++++-
2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/libavformat/nut.h b/libavformat/nut.h
index 943081c..0c678a5 100644
--- a/libavformat/nut.h
+++ b/libavformat/nut.h
@@ -102,6 +102,7 @@ typedef struct NUTContext {
unsigned int max_distance;
unsigned int time_base_count;
int64_t last_syncpoint_pos;
+ int64_t last_resync_pos;
int header_count;
AVRational *time_base;
struct AVTreeNode *syncpoints;
diff --git a/libavformat/nutdec.c b/libavformat/nutdec.c
index 488ae16..3fdbd72 100644
--- a/libavformat/nutdec.c
+++ b/libavformat/nutdec.c
@@ -1129,7 +1129,8 @@ static int nut_read_packet(AVFormatContext *s, AVPacket *pkt)
default:
resync:
av_log(s, AV_LOG_DEBUG, "syncing from %"PRId64"\n", pos);
- tmp = find_any_startcode(bc, nut->last_syncpoint_pos + 1);
+ tmp = find_any_startcode(bc, FFMAX(nut->last_syncpoint_pos, nut->last_resync_pos) + 1);
+ nut->last_resync_pos = avio_tell(bc);
if (tmp == 0)
return AVERROR_INVALIDDATA;
av_log(s, AV_LOG_DEBUG, "sync\n");
@@ -1230,6 +1231,8 @@ static int read_seek(AVFormatContext *s, int stream_index,
for (i = 0; i < s->nb_streams; i++)
nut->stream[i].skip_until_key_frame = 1;
+ nut->last_resync_pos = 0;
+
return 0;
}
More information about the ffmpeg-cvslog
mailing list