diff --git a/ffplay.c b/ffplay.c index 79f430de5e..7f736641b3 100644 --- a/ffplay.c +++ b/ffplay.c @@ -1132,11 +1132,24 @@ static void video_audio_display(VideoState *s) } } +static void stream_component_close(VideoState *is, int stream_index); + static void stream_close(VideoState *is) { /* XXX: use a special url_shutdown call to abort parse cleanly */ is->abort_request = 1; SDL_WaitThread(is->read_tid, NULL); + + /* close each stream */ + if (is->audio_stream >= 0) + stream_component_close(is, is->audio_stream); + if (is->video_stream >= 0) + stream_component_close(is, is->video_stream); + if (is->subtitle_stream >= 0) + stream_component_close(is, is->subtitle_stream); + + avformat_close_input(&is->ic); + packet_queue_destroy(&is->videoq); packet_queue_destroy(&is->audioq); packet_queue_destroy(&is->subtitleq); @@ -3111,24 +3124,11 @@ static int read_thread(void *arg) av_free_packet(pkt); } } - /* wait until the end */ - while (!is->abort_request) { - SDL_Delay(100); - } ret = 0; fail: - /* close each stream */ - if (is->audio_stream >= 0) - stream_component_close(is, is->audio_stream); - if (is->video_stream >= 0) - stream_component_close(is, is->video_stream); - if (is->subtitle_stream >= 0) - stream_component_close(is, is->subtitle_stream); - if (ic) { + if (ic && !is->ic) avformat_close_input(&ic); - is->ic = NULL; - } if (ret != 0) { SDL_Event event;