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:
parent
93866c2aa2
commit
4ce75387cd
28
ffplay.c
28
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)
|
static void stream_close(VideoState *is)
|
||||||
{
|
{
|
||||||
/* XXX: use a special url_shutdown call to abort parse cleanly */
|
/* XXX: use a special url_shutdown call to abort parse cleanly */
|
||||||
is->abort_request = 1;
|
is->abort_request = 1;
|
||||||
SDL_WaitThread(is->read_tid, NULL);
|
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->videoq);
|
||||||
packet_queue_destroy(&is->audioq);
|
packet_queue_destroy(&is->audioq);
|
||||||
packet_queue_destroy(&is->subtitleq);
|
packet_queue_destroy(&is->subtitleq);
|
||||||
@ -3111,24 +3124,11 @@ static int read_thread(void *arg)
|
|||||||
av_free_packet(pkt);
|
av_free_packet(pkt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* wait until the end */
|
|
||||||
while (!is->abort_request) {
|
|
||||||
SDL_Delay(100);
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
fail:
|
fail:
|
||||||
/* close each stream */
|
if (ic && !is->ic)
|
||||||
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) {
|
|
||||||
avformat_close_input(&ic);
|
avformat_close_input(&ic);
|
||||||
is->ic = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
SDL_Event event;
|
SDL_Event event;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user