| @@ -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){ | |||
| int flags = SDL_HWSURFACE|SDL_ASYNCBLIT|SDL_HWACCEL; | |||
| 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 | |||
| potential locking problems */ | |||
| static void alloc_picture(void *opaque) | |||