avplay: Move the stream setup in the main thread
authorLuca Barbato <lu_zero@gentoo.org>
Sat, 2 Jan 2016 11:19:27 +0000 (12:19 +0100)
committerLuca Barbato <lu_zero@gentoo.org>
Mon, 25 Jan 2016 08:10:34 +0000 (09:10 +0100)
And refactor the code in preparation of the following
patches.

Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
avplay.c

index 56ec731..0de5b93 100644 (file)
--- 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();