mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
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@gmx.at> Signed-off-by: Andreas Cadhalpun <Andreas.Cadhalpun@googlemail.com>
This commit is contained in:
parent
b6ca7bfc7c
commit
37e679881d
@ -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;
|
||||
|
@ -1126,7 +1126,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");
|
||||
@ -1227,6 +1228,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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user