[FFmpeg-cvslog] avplay: Do not try to allocate new frames when the player is closing

Luca Barbato git at videolan.org
Mon Oct 30 19:18:03 EET 2017


ffmpeg | branch: master | Luca Barbato <lu_zero at gentoo.org> | Mon Apr 17 22:22:17 2017 +0000| [8c0cadd17e98547d84e82111550caca4fb40ff8d] | committer: Luca Barbato

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 at libav.org

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=8c0cadd17e98547d84e82111550caca4fb40ff8d
---

 avtools/avplay.c | 15 +++++++++++++--
 1 file 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);



More information about the ffmpeg-cvslog mailing list