1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-12-23 12:43:46 +02:00

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>
This commit is contained in:
Luca Barbato 2016-01-02 12:19:27 +01:00
parent 81306fd4bd
commit f22f900594

View File

@ -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();