@ -177,6 +177,8 @@ typedef struct VideoState {
int read_pause_return ;
AVFormatContext * ic ;
int realtime ;
int audio_finished ;
int video_finished ;
Clock audclk ;
Clock vidclk ;
@ -1673,6 +1675,9 @@ static int get_video_frame(VideoState *is, AVFrame *frame, AVPacket *pkt, int *s
if ( avcodec_decode_video2 ( is - > video_st - > codec , frame , & got_picture , pkt ) < 0 )
return 0 ;
if ( ! got_picture & & ! pkt - > data )
is - > video_finished = * serial ;
if ( got_picture ) {
int ret = 1 ;
double dpts = NAN ;
@ -2170,6 +2175,8 @@ static int audio_decode_frame(VideoState *is)
pkt_temp - > size - = len1 ;
if ( pkt_temp - > data & & pkt_temp - > size < = 0 | | ! pkt_temp - > data & & ! got_frame )
pkt_temp - > stream_index = - 1 ;
if ( ! pkt_temp - > data & & ! got_frame )
is - > audio_finished = is - > audio_pkt_temp_serial ;
if ( ! got_frame )
continue ;
@ -2899,6 +2906,16 @@ static int read_thread(void *arg)
SDL_UnlockMutex ( wait_mutex ) ;
continue ;
}
if ( ! is - > paused & &
( ! is - > audio_st | | is - > audio_finished = = is - > audioq . serial ) & &
( ! is - > video_st | | ( is - > video_finished = = is - > videoq . serial & & is - > pictq_size = = 0 ) ) ) {
if ( loop ! = 1 & & ( ! loop | | - - loop ) ) {
stream_seek ( is , start_time ! = AV_NOPTS_VALUE ? start_time : 0 , 0 , 0 ) ;
} else if ( autoexit ) {
ret = AVERROR_EOF ;
goto fail ;
}
}
if ( eof ) {
if ( is - > video_stream > = 0 ) {
av_init_packet ( pkt ) ;
@ -2915,14 +2932,6 @@ static int read_thread(void *arg)
packet_queue_put ( & is - > audioq , pkt ) ;
}
SDL_Delay ( 10 ) ;
if ( is - > audioq . size + is - > videoq . size + is - > subtitleq . size = = 0 ) {
if ( loop ! = 1 & & ( ! loop | | - - loop ) ) {
stream_seek ( is , start_time ! = AV_NOPTS_VALUE ? start_time : 0 , 0 , 0 ) ;
} else if ( autoexit ) {
ret = AVERROR_EOF ;
goto fail ;
}
}
eof = 0 ;
continue ;
}