mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
check max_pts_distance
Originally committed as revision 7100 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
0a3b575bc7
commit
06599638dd
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user