check max_pts_distance

Originally committed as revision 7100 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Michael Niedermayer 2006-11-16 11:03:40 +00:00
parent 0a3b575bc7
commit 06599638dd

View File

@ -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;