}
}
-static void stream_close(VideoState *is)
+static void player_close(VideoState *is)
{
VideoPicture *vp;
int i;
static void do_exit(void)
{
if (cur_stream) {
- stream_close(cur_stream);
+ player_close(cur_stream);
cur_stream = NULL;
}
uninit_opts();
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;
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;
}
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;
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();