| @@ -856,6 +856,57 @@ static void video_audio_display(VideoState *s) | |||||
| } | } | ||||
| } | } | ||||
| static void stream_close(VideoState *is) | |||||
| { | |||||
| VideoPicture *vp; | |||||
| int i; | |||||
| /* XXX: use a special url_shutdown call to abort parse cleanly */ | |||||
| is->abort_request = 1; | |||||
| SDL_WaitThread(is->read_tid, NULL); | |||||
| SDL_WaitThread(is->refresh_tid, NULL); | |||||
| /* free all pictures */ | |||||
| for(i=0;i<VIDEO_PICTURE_QUEUE_SIZE; i++) { | |||||
| vp = &is->pictq[i]; | |||||
| #if CONFIG_AVFILTER | |||||
| if (vp->picref) { | |||||
| avfilter_unref_buffer(vp->picref); | |||||
| vp->picref = NULL; | |||||
| } | |||||
| #endif | |||||
| if (vp->bmp) { | |||||
| SDL_FreeYUVOverlay(vp->bmp); | |||||
| vp->bmp = NULL; | |||||
| } | |||||
| } | |||||
| SDL_DestroyMutex(is->pictq_mutex); | |||||
| SDL_DestroyCond(is->pictq_cond); | |||||
| SDL_DestroyMutex(is->subpq_mutex); | |||||
| SDL_DestroyCond(is->subpq_cond); | |||||
| #if !CONFIG_AVFILTER | |||||
| if (is->img_convert_ctx) | |||||
| sws_freeContext(is->img_convert_ctx); | |||||
| #endif | |||||
| av_free(is); | |||||
| } | |||||
| static void do_exit(void) | |||||
| { | |||||
| if (cur_stream) { | |||||
| stream_close(cur_stream); | |||||
| cur_stream = NULL; | |||||
| } | |||||
| uninit_opts(); | |||||
| #if CONFIG_AVFILTER | |||||
| avfilter_uninit(); | |||||
| #endif | |||||
| if (show_status) | |||||
| printf("\n"); | |||||
| SDL_Quit(); | |||||
| av_log(NULL, AV_LOG_QUIET, ""); | |||||
| exit(0); | |||||
| } | |||||
| static int video_open(VideoState *is){ | static int video_open(VideoState *is){ | ||||
| int flags = SDL_HWSURFACE|SDL_ASYNCBLIT|SDL_HWACCEL; | int flags = SDL_HWSURFACE|SDL_ASYNCBLIT|SDL_HWACCEL; | ||||
| int w,h; | int w,h; | ||||
| @@ -1204,57 +1255,6 @@ retry: | |||||
| } | } | ||||
| } | } | ||||
| static void stream_close(VideoState *is) | |||||
| { | |||||
| VideoPicture *vp; | |||||
| int i; | |||||
| /* XXX: use a special url_shutdown call to abort parse cleanly */ | |||||
| is->abort_request = 1; | |||||
| SDL_WaitThread(is->read_tid, NULL); | |||||
| SDL_WaitThread(is->refresh_tid, NULL); | |||||
| /* free all pictures */ | |||||
| for(i=0;i<VIDEO_PICTURE_QUEUE_SIZE; i++) { | |||||
| vp = &is->pictq[i]; | |||||
| #if CONFIG_AVFILTER | |||||
| if (vp->picref) { | |||||
| avfilter_unref_buffer(vp->picref); | |||||
| vp->picref = NULL; | |||||
| } | |||||
| #endif | |||||
| if (vp->bmp) { | |||||
| SDL_FreeYUVOverlay(vp->bmp); | |||||
| vp->bmp = NULL; | |||||
| } | |||||
| } | |||||
| SDL_DestroyMutex(is->pictq_mutex); | |||||
| SDL_DestroyCond(is->pictq_cond); | |||||
| SDL_DestroyMutex(is->subpq_mutex); | |||||
| SDL_DestroyCond(is->subpq_cond); | |||||
| #if !CONFIG_AVFILTER | |||||
| if (is->img_convert_ctx) | |||||
| sws_freeContext(is->img_convert_ctx); | |||||
| #endif | |||||
| av_free(is); | |||||
| } | |||||
| static void do_exit(void) | |||||
| { | |||||
| if (cur_stream) { | |||||
| stream_close(cur_stream); | |||||
| cur_stream = NULL; | |||||
| } | |||||
| uninit_opts(); | |||||
| #if CONFIG_AVFILTER | |||||
| avfilter_uninit(); | |||||
| #endif | |||||
| if (show_status) | |||||
| printf("\n"); | |||||
| SDL_Quit(); | |||||
| av_log(NULL, AV_LOG_QUIET, ""); | |||||
| exit(0); | |||||
| } | |||||
| /* allocate a picture (needs to do that in main thread to avoid | /* allocate a picture (needs to do that in main thread to avoid | ||||
| potential locking problems */ | potential locking problems */ | ||||
| static void alloc_picture(void *opaque) | static void alloc_picture(void *opaque) | ||||