From 06599638dd678c9939df0fd83ff693c43b25971d Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Thu, 16 Nov 2006 11:03:40 +0000 Subject: check max_pts_distance Originally committed as revision 7100 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavformat/nutdec.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) (limited to 'libavformat') diff --git a/libavformat/nutdec.c b/libavformat/nutdec.c index 32af334a15..7e0f8cd934 100644 --- a/libavformat/nutdec.c +++ b/libavformat/nutdec.c @@ -637,7 +637,7 @@ static int nut_read_header(AVFormatContext *s, AVFormatParameters *ap) return 0; } -static int decode_frame_header(NUTContext *nut, int *flags_ret, int64_t *pts, int *stream_id, int frame_code){ +static int decode_frame_header(NUTContext *nut, int64_t *pts, int *stream_id, int frame_code){ AVFormatContext *s= nut->avf; ByteIOContext *bc = &s->pb; StreamContext *stc; @@ -682,14 +682,13 @@ static int decode_frame_header(NUTContext *nut, int *flags_ret, int64_t *pts, in get_v(bc); if(flags&FLAG_CHECKSUM){ get_be32(bc); //FIXME check this - }else if(size > 2*nut->max_distance){ + }else if(size > 2*nut->max_distance || FFABS(stc->last_pts - *pts) > stc->max_pts_distance){ av_log(s, AV_LOG_ERROR, "frame size > 2max_distance and no checksum\n"); return -1; } - *flags_ret= flags; stc->last_pts= *pts; - stc->last_key_frame= flags&FLAG_KEY; //FIXME change to last flags + stc->last_flags= flags; return size; } @@ -697,29 +696,32 @@ static int decode_frame_header(NUTContext *nut, int *flags_ret, int64_t *pts, in static int decode_frame(NUTContext *nut, AVPacket *pkt, int frame_code){ AVFormatContext *s= nut->avf; ByteIOContext *bc = &s->pb; - int size, stream_id, flags, discard; + int size, stream_id, discard; int64_t pts, last_IP_pts; + StreamContext *stc; - size= decode_frame_header(nut, &flags, &pts, &stream_id, frame_code); + size= decode_frame_header(nut, &pts, &stream_id, frame_code); if(size < 0) return -1; - if (flags & FLAG_KEY) - nut->stream[stream_id].skip_until_key_frame=0; + stc= &nut->stream[stream_id]; + + if (stc->last_flags & FLAG_KEY) + stc->skip_until_key_frame=0; discard= s->streams[ stream_id ]->discard; last_IP_pts= s->streams[ stream_id ]->last_IP_pts; - if( (discard >= AVDISCARD_NONKEY && !(flags & FLAG_KEY)) + if( (discard >= AVDISCARD_NONKEY && !(stc->last_flags & FLAG_KEY)) ||(discard >= AVDISCARD_BIDIR && last_IP_pts != AV_NOPTS_VALUE && last_IP_pts > pts) || discard >= AVDISCARD_ALL - || nut->stream[stream_id].skip_until_key_frame){ + || stc->skip_until_key_frame){ url_fskip(bc, size); return 1; } av_get_packet(bc, pkt, size); pkt->stream_index = stream_id; - if (flags & FLAG_KEY) + if (stc->last_flags & FLAG_KEY) pkt->flags |= PKT_FLAG_KEY; pkt->pts = pts; -- cgit v1.2.3