From f22f9005943246613039d0e907b71b34afabedce Mon Sep 17 00:00:00 2001 From: Luca Barbato Date: Sat, 2 Jan 2016 12:19:27 +0100 Subject: avplay: Move the stream setup in the main thread And refactor the code in preparation of the following patches. Signed-off-by: Luca Barbato --- avplay.c | 65 +++++++++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 44 insertions(+), 21 deletions(-) (limited to 'avplay.c') diff --git a/avplay.c b/avplay.c index 56ec7316e5..0de5b93ea9 100644 --- a/avplay.c +++ b/avplay.c @@ -1204,7 +1204,7 @@ retry: } } -static void stream_close(VideoState *is) +static void player_close(VideoState *is) { VideoPicture *vp; int i; @@ -1235,7 +1235,7 @@ static void stream_close(VideoState *is) static void do_exit(void) { if (cur_stream) { - stream_close(cur_stream); + player_close(cur_stream); cur_stream = NULL; } uninit_opts(); @@ -2256,16 +2256,28 @@ static int decode_interrupt_cb(void *ctx) return global_video_state && global_video_state->abort_request; } -/* this thread gets the stream from the disk or the network */ -static int decode_thread(void *arg) +static void stream_close(VideoState *is) +{ + /* disable interrupting */ + global_video_state = 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); + if (is->ic) { + avformat_close_input(&is->ic); + } +} + +static int stream_setup(VideoState *is) { - VideoState *is = arg; AVFormatContext *ic = NULL; int err, i, ret; int st_index[AVMEDIA_TYPE_NB]; - AVPacket pkt1, *pkt = &pkt1; - int eof = 0; - int pkt_in_play_range = 0; AVDictionaryEntry *t; AVDictionary **opts; int orig_nb_streams; @@ -2385,6 +2397,23 @@ static int decode_thread(void *arg) goto fail; } + return 0; + +fail: + stream_close(is); + + return ret; +} + +/* this thread gets the stream from the disk or the network */ +static int decode_thread(void *arg) +{ + VideoState *is = arg; + AVPacket pkt1, *pkt = &pkt1; + AVFormatContext *ic = is->ic; + int pkt_in_play_range = 0; + int ret, eof = 0; + for (;;) { if (is->abort_request) break; @@ -2499,20 +2528,9 @@ static int decode_thread(void *arg) } ret = 0; - fail: - /* disable interrupting */ - global_video_state = 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); - if (is->ic) { - avformat_close_input(&is->ic); - } +fail: + stream_close(is); if (ret != 0) { SDL_Event event; @@ -2536,6 +2554,11 @@ static VideoState *stream_open(const char *filename, AVInputFormat *iformat) is->ytop = 0; is->xleft = 0; + if (stream_setup(is) < 0) { + av_free(is); + return NULL; + } + /* start video display */ is->pictq_mutex = SDL_CreateMutex(); is->pictq_cond = SDL_CreateCond(); -- cgit v1.2.3