summaryrefslogtreecommitdiff
path: root/libavformat/nutdec.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2006-11-16 10:20:29 +0000
committerMichael Niedermayer <michaelni@gmx.at>2006-11-16 10:20:29 +0000
commit0a3b575bc7b474967f6fca53754f34b71ee172fb (patch)
treead36aac8d6337813e652951f0ebbbb38ab5a42c1 /libavformat/nutdec.c
parentc873bc17bf6da4d82897033aa97cda3d9fe5683f (diff)
skip non keyframes after seeking between syncpoint and the first keyframe
Originally committed as revision 7099 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/nutdec.c')
-rw-r--r--libavformat/nutdec.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/libavformat/nutdec.c b/libavformat/nutdec.c
index 96538e5496..32af334a15 100644
--- a/libavformat/nutdec.c
+++ b/libavformat/nutdec.c
@@ -704,11 +704,15 @@ static int decode_frame(NUTContext *nut, AVPacket *pkt, int frame_code){
if(size < 0)
return -1;
+ if (flags & FLAG_KEY)
+ nut->stream[stream_id].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))
||(discard >= AVDISCARD_BIDIR && last_IP_pts != AV_NOPTS_VALUE && last_IP_pts > pts)
- || discard >= AVDISCARD_ALL){
+ || discard >= AVDISCARD_ALL
+ || nut->stream[stream_id].skip_until_key_frame){
url_fskip(bc, size);
return 1;
}
@@ -813,6 +817,7 @@ static int read_seek(AVFormatContext *s, int stream_index, int64_t pts, int flag
syncpoint_t nopts_sp= {.ts= AV_NOPTS_VALUE, .back_ptr= AV_NOPTS_VALUE};
syncpoint_t *sp, *next_node[2]= {&nopts_sp, &nopts_sp};
int64_t pos, pos2, ts;
+ int i;
if(st->index_entries){
int index= av_index_search_timestamp(st, pts, flags);
@@ -851,6 +856,9 @@ static int read_seek(AVFormatContext *s, int stream_index, int64_t pts, int flag
if(pos2 > pos || pos2 + 15 < pos){
av_log(NULL, AV_LOG_ERROR, "no syncpoint at backptr pos\n");
}
+ for(i=0; i<s->nb_streams; i++)
+ nut->stream[i].skip_until_key_frame=1;
+
return 0;
}