ffplay: close streams and AVFormatContext in the main thread

To avoid race conditions.

Signed-off-by: Marton Balint <cus@passwd.hu>
This commit is contained in:
Marton Balint 2015-02-06 01:37:53 +01:00
parent 93866c2aa2
commit 4ce75387cd

View File

@ -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;