diff options
author | Luca Barbato <lu_zero@gentoo.org> | 2016-01-02 12:19:27 +0100 |
---|---|---|
committer | Luca Barbato <lu_zero@gentoo.org> | 2016-01-25 09:10:34 +0100 |
commit | f22f9005943246613039d0e907b71b34afabedce (patch) | |
tree | 6e86b379f554c7e6a95bc0e47d0bfb01e627bb56 /avplay.c | |
parent | 81306fd4bdeb5c17d4db771e4fec684773b5790f (diff) | |
download | ffmpeg-f22f9005943246613039d0e907b71b34afabedce.tar.gz |
avplay: Move the stream setup in the main thread
And refactor the code in preparation of the following
patches.
Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
Diffstat (limited to 'avplay.c')
-rw-r--r-- | avplay.c | 65 |
1 files changed, 44 insertions, 21 deletions
@@ -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(); |