Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mpc-hc/FFmpeg.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarton Balint <cus@passwd.hu>2015-02-06 03:37:53 +0300
committerMarton Balint <cus@passwd.hu>2015-10-12 01:07:38 +0300
commit4ce75387cdcbcef8afbaadc5b66232c25178c0c6 (patch)
tree1afdf8408856159d56450c157582dd166c8600d4 /ffplay.c
parent93866c2aa2514649622ae32b6cacaf62473a9e20 (diff)
ffplay: close streams and AVFormatContext in the main thread
To avoid race conditions. Signed-off-by: Marton Balint <cus@passwd.hu>
Diffstat (limited to 'ffplay.c')
-rw-r--r--ffplay.c28
1 files changed, 14 insertions, 14 deletions
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;