From acbdb684610fea1a392b7780b529706a52eb7238 Mon Sep 17 00:00:00 2001 From: Laurent Aimar Date: Tue, 18 May 2010 21:48:48 +0200 Subject: [PATCH] Prepared for a better vout reuse. --- src/video_output/control.h | 4 ++ src/video_output/video_output.c | 87 +++++++++++++++------------------ 2 files changed, 44 insertions(+), 47 deletions(-) diff --git a/src/video_output/control.h b/src/video_output/control.h index 9198a7bdef..59202e1a3b 100644 --- a/src/video_output/control.h +++ b/src/video_output/control.h @@ -32,6 +32,7 @@ enum { VOUT_CONTROL_INIT, VOUT_CONTROL_CLEAN, + VOUT_CONTROL_REINIT, /* reinit */ #if 0 /* */ @@ -89,6 +90,9 @@ typedef struct { unsigned width; unsigned height; } window; + struct { + const video_format_t *fmt; + } reinit; } u; } vout_control_cmd_t; diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c index b32872c020..b4f48f710f 100644 --- a/src/video_output/video_output.c +++ b/src/video_output/video_output.c @@ -98,63 +98,38 @@ static int VoutValidateFormat(video_format_t *dst, * This function looks for a video output thread matching the current * properties. If not found, it spawns a new one. *****************************************************************************/ -vout_thread_t *(vout_Request)( vlc_object_t *p_this, vout_thread_t *p_vout, - const video_format_t *p_fmt ) +vout_thread_t *(vout_Request)( vlc_object_t *object, vout_thread_t *vout, + const video_format_t *fmt ) { - if( !p_fmt ) - { - /* Video output is no longer used. - * TODO: support for reusing video outputs with proper _thread-safe_ - * reference handling. */ - if( p_vout ) - vout_CloseAndRelease( p_vout ); + if (!fmt) { + if (vout) + vout_CloseAndRelease(vout); return NULL; } - /* If a video output was provided, lock it, otherwise look for one. */ - if( p_vout ) - { - vlc_object_hold( p_vout ); - } - - /* TODO: find a suitable unused video output */ - - /* If we now have a video output, check it has the right properties */ - if( p_vout ) - { - if( !video_format_IsSimilar( &p_vout->p->original, p_fmt ) ) - { - /* We are not interested in this format, close this vout */ - vout_CloseAndRelease( p_vout ); - vlc_object_release( p_vout ); - p_vout = NULL; - } - else - { - /* This video output is cool! Hijack it. */ - vlc_object_release( p_vout ); - } + /* If a vout is provided, try reusing it */ + if (vout) { + spu_Attach(vout->p->p_spu, VLC_OBJECT(vout), false); + vlc_object_detach(vout); - if( p_vout ) - { - msg_Dbg( p_this, "reusing provided vout" ); + vout_control_cmd_t cmd; + vout_control_cmd_Init(&cmd, VOUT_CONTROL_REINIT); + cmd.u.reinit.fmt = fmt; - spu_Attach( p_vout->p->p_spu, VLC_OBJECT(p_vout), false ); - vlc_object_detach( p_vout ); + vout_control_Push(&vout->p->control, &cmd); + vout_control_WaitEmpty(&vout->p->control); + if (!vout->p->dead) { + vlc_object_attach(vout, object); + spu_Attach(vout->p->p_spu, VLC_OBJECT(vout), true); - vlc_object_attach( p_vout, p_this ); - spu_Attach( p_vout->p->p_spu, VLC_OBJECT(p_vout), true ); + msg_Dbg(object, "reusing provided vout"); + return vout; } - } - - if( !p_vout ) - { - msg_Dbg( p_this, "no usable vout present, spawning one" ); + vout_CloseAndRelease(vout); - p_vout = vout_Create( p_this, p_fmt ); + msg_Warn(object, "cannot reuse provided vout"); } - - return p_vout; + return vout_Create(object, fmt); } /***************************************************************************** @@ -958,6 +933,18 @@ static void ThreadClean(vout_thread_t *vout) vout->p->dead = true; vout_control_Dead(&vout->p->control); } +static int ThreadReinit(vout_thread_t *vout, + const video_format_t *fmt) +{ + video_format_t original; + if (VoutValidateFormat(&original, fmt)) + return VLC_EGENERIC; + if (video_format_IsSimilar(&original, &vout->p->original)) + return VLC_SUCCESS; + + /* TODO */ + return VLC_EGENERIC; +} /***************************************************************************** * Thread: video output thread @@ -995,6 +982,12 @@ static void *Thread(void *object) case VOUT_CONTROL_CLEAN: ThreadClean(vout); return NULL; + case VOUT_CONTROL_REINIT: + if (ThreadReinit(vout, cmd.u.reinit.fmt)) { + ThreadClean(vout); + return NULL; + } + break; case VOUT_CONTROL_OSD_TITLE: ThreadDisplayOsdTitle(vout, cmd.u.string); break; -- 2.39.5