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