Browse Source

ffplay: close streams and AVFormatContext in the main thread

To avoid race conditions.

Signed-off-by: Marton Balint <cus@passwd.hu>
tags/n3.0
Marton Balint 11 years ago
parent
commit
4ce75387cd
1 changed files with 14 additions and 14 deletions
  1. +14
    -14
      ffplay.c

+ 14
- 14
ffplay.c 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;


Loading…
Cancel
Save