diff options
author | Luca Barbato <lu_zero@gentoo.org> | 2017-04-17 22:22:17 +0000 |
---|---|---|
committer | Luca Barbato <lu_zero@gentoo.org> | 2017-04-25 00:38:07 +0200 |
commit | 8c0cadd17e98547d84e82111550caca4fb40ff8d (patch) | |
tree | cffccda9ea3e3225a230e6b5b4da116ba8a1a2a0 /avtools | |
parent | 41262498ff89ef48e5ce4823b2fc2dc514a3eb0c (diff) |
avplay: Do not try to allocate new frames when the player is closing
The allocation event can trigger while the decoding thread is already
closing.
Bug-Id: 1052
CC: libav-stable@libav.org
Diffstat (limited to 'avtools')
-rw-r--r-- | avtools/avplay.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/avtools/avplay.c b/avtools/avplay.c index 26279e857d..b6dbc52cf7 100644 --- a/avtools/avplay.c +++ b/avtools/avplay.c @@ -213,6 +213,7 @@ typedef struct PlayerState { AVFilterContext *in_video_filter; // the first filter in the video chain AVFilterContext *out_video_filter; // the last filter in the video chain + SDL_mutex *video_filter_mutex; float skip_frames; float skip_frames_index; @@ -1201,6 +1202,7 @@ static void player_close(PlayerState *is) vp->bmp = NULL; } } + SDL_DestroyMutex(is->video_filter_mutex); SDL_DestroyMutex(is->pictq_mutex); SDL_DestroyCond(is->pictq_cond); SDL_DestroyMutex(is->subpq_mutex); @@ -1617,6 +1619,9 @@ static int video_thread(void *arg) stream_pause(player); } the_end: + SDL_LockMutex(is->video_filter_mutex); + is->out_video_filter = NULL; + SDL_UnlockMutex(is->video_filter_mutex); av_freep(&vfilters); avfilter_graph_free(&graph); av_packet_unref(&pkt); @@ -2552,6 +2557,8 @@ static int stream_open(PlayerState *is, return ret; } + is->video_filter_mutex = SDL_CreateMutex(); + /* start video display */ is->pictq_mutex = SDL_CreateMutex(); is->pictq_cond = SDL_CreateCond(); @@ -2827,8 +2834,12 @@ static void event_loop(void) do_exit(); break; case FF_ALLOC_EVENT: - video_open(event.user.data1); - alloc_picture(event.user.data1); + SDL_LockMutex(player->video_filter_mutex); + if (player->out_video_filter) { + video_open(event.user.data1); + alloc_picture(event.user.data1); + } + SDL_UnlockMutex(player->video_filter_mutex); break; case FF_REFRESH_EVENT: video_refresh_timer(event.user.data1); |