summaryrefslogtreecommitdiff
path: root/avplay.c
diff options
context:
space:
mode:
authorLuca Barbato <lu_zero@gentoo.org>2016-01-02 12:19:27 +0100
committerLuca Barbato <lu_zero@gentoo.org>2016-01-25 09:10:34 +0100
commitf22f9005943246613039d0e907b71b34afabedce (patch)
tree6e86b379f554c7e6a95bc0e47d0bfb01e627bb56 /avplay.c
parent81306fd4bdeb5c17d4db771e4fec684773b5790f (diff)
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.c65
1 files changed, 44 insertions, 21 deletions
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();