summaryrefslogtreecommitdiff
path: root/libavformat/nutdec.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2006-11-16 11:03:40 +0000
committerMichael Niedermayer <michaelni@gmx.at>2006-11-16 11:03:40 +0000
commit06599638dd678c9939df0fd83ff693c43b25971d (patch)
treeed1b462074af236ef77c15b1ecb2856a609950ad /libavformat/nutdec.c
parent0a3b575bc7b474967f6fca53754f34b71ee172fb (diff)
check max_pts_distance
Originally committed as revision 7100 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/nutdec.c')
-rw-r--r--libavformat/nutdec.c24
1 files changed, 13 insertions, 11 deletions
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;