X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fvideo_output%2Fvideo_output.c;h=2d46908284fe053c8fb390ce2bad59d080e957c9;hb=218efb93081e39e66b44a78d728847e1a3679db1;hp=45a32ddb5b2de100f5aa9f6dd737087bba31422f;hpb=aeaf0da4ea02c39b49bc49493a8a6c2de3dec411;p=vlc diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c index 45a32ddb5b..2d46908284 100644 --- a/src/video_output/video_output.c +++ b/src/video_output/video_output.c @@ -33,7 +33,7 @@ # include "config.h" #endif -#include +#include #include /* free() */ #include @@ -198,7 +198,7 @@ vout_thread_t *__vout_Request( vlc_object_t *p_this, vout_thread_t *p_vout, { /* We are not interested in this format, close this vout */ vlc_object_release( p_vout ); - vout_Destroy( p_vout ); + vlc_object_release( p_vout ); p_vout = NULL; } else @@ -471,22 +471,6 @@ vout_thread_t * __vout_Create( vlc_object_t *p_parent, video_format_t *p_fmt ) return p_vout; } -/***************************************************************************** - * vout_Destroy: destroys a previously created video output - ***************************************************************************** - * Destroy a terminated thread. - * The function will request a destruction of the specified thread. If pi_error - * is NULL, it will return once the thread is destroyed. Else, it will be - * update using one of the THREAD_* constants. - *****************************************************************************/ -void vout_Destroy( vout_thread_t *p_vout ) -{ - /* XXX: should go in the destructor */ - var_Destroy( p_vout, "intf-change" ); - - vlc_object_release( p_vout ); -} - static void vout_Destructor( vlc_object_t * p_this ) { vout_thread_t *p_vout = (vout_thread_t *)p_this; @@ -509,10 +493,6 @@ static void vout_Destructor( vlc_object_t * p_this ) #ifndef __APPLE__ vout_thread_t *p_another_vout; - playlist_t *p_playlist = pl_Yield( p_this ); - if( !p_playlist ) - return; - /* This is a dirty hack mostly for Linux, where there is no way to get the * GUI back if you closed it while playing video. This is solved in * Mac OS X, where we have this novelty called menubar, that will always @@ -521,10 +501,9 @@ static void vout_Destructor( vlc_object_t * p_this ) p_another_vout = vlc_object_find( p_this->p_libvlc, VLC_OBJECT_VOUT, FIND_ANYWHERE ); if( p_another_vout == NULL ) - var_SetBool( p_playlist, "intf-show", true ); + var_SetBool( p_this->p_libvlc, "intf-show", true ); else vlc_object_release( p_another_vout ); - pl_Release( p_playlist ); #endif } @@ -535,6 +514,13 @@ static void vout_Destructor( vlc_object_t * p_this ) * initialization. It returns 0 on success. Note that the thread's flag are not * modified inside this function. *****************************************************************************/ +static picture_t *get_pic( filter_t *p_filter ) +{ + picture_t *p_pic = (picture_t *)p_filter->p_owner; + p_filter->p_owner = NULL; + return p_pic; +} + static int InitThread( vout_thread_t *p_vout ) { int i, i_aspect_x, i_aspect_y; @@ -676,17 +662,39 @@ static int InitThread( vout_thread_t *p_vout ) p_vout->b_direct = 0; /* Choose the best module */ - p_vout->chroma.p_module = module_Need( p_vout, "chroma", NULL, 0 ); - - if( p_vout->chroma.p_module == NULL ) + p_vout->p_chroma = vlc_object_create( p_vout, VLC_OBJECT_FILTER ); + filter_t *p_chroma = p_vout->p_chroma; + vlc_object_attach( p_chroma, p_vout ); + /* TODO: Set the fmt_in and fmt_out stuff here */ + p_chroma->fmt_in.video = p_vout->fmt_render; + p_chroma->fmt_out.video = p_vout->fmt_out; + + /* TODO: put in a function */ + p_chroma->fmt_out.video.i_rmask = p_vout->output.i_rmask; + p_chroma->fmt_out.video.i_gmask = p_vout->output.i_gmask; + p_chroma->fmt_out.video.i_bmask = p_vout->output.i_bmask; + p_chroma->fmt_out.video.i_rrshift = p_vout->output.i_rrshift; + p_chroma->fmt_out.video.i_lrshift = p_vout->output.i_lrshift; + p_chroma->fmt_out.video.i_rgshift = p_vout->output.i_rgshift; + p_chroma->fmt_out.video.i_lgshift = p_vout->output.i_lgshift; + p_chroma->fmt_out.video.i_rbshift = p_vout->output.i_rbshift; + p_chroma->fmt_out.video.i_lbshift = p_vout->output.i_lbshift; + msg_Err( p_vout, "HOLA! %4.4s", (char*)&p_chroma->fmt_in.video.i_chroma ); + msg_Err( p_vout, "HOLA! %4.4s", (char*)&p_chroma->fmt_out.video.i_chroma ); + p_chroma->p_module = module_Need( p_chroma, "video filter2", NULL, 0 ); + + if( p_chroma->p_module == NULL ) { msg_Err( p_vout, "no chroma module for %4.4s to %4.4s", (char*)&p_vout->render.i_chroma, (char*)&p_vout->output.i_chroma ); + vlc_object_detach( p_vout->p_chroma ); + p_vout->p_chroma = NULL; p_vout->pf_end( p_vout ); vlc_mutex_unlock( &p_vout->change_lock ); return VLC_EGENERIC; } + p_chroma->pf_vout_buffer_new = get_pic; msg_Dbg( p_vout, "indirect render, mapping " "render pictures 0-%i to system pictures %i-%i", @@ -1174,11 +1182,11 @@ static void RunThread( vout_thread_t *p_vout) } /* Need to reinitialise the chroma plugin */ - if( p_vout->chroma.p_module ) + if( p_vout->p_chroma->p_module ) { - if( p_vout->chroma.p_module->pf_deactivate ) - p_vout->chroma.p_module->pf_deactivate( VLC_OBJECT(p_vout) ); - p_vout->chroma.p_module->pf_activate( VLC_OBJECT(p_vout) ); + if( p_vout->p_chroma->p_module->pf_deactivate ) + p_vout->p_chroma->p_module->pf_deactivate( VLC_OBJECT(p_vout->p_chroma) ); + p_vout->p_chroma->p_module->pf_activate( VLC_OBJECT(p_vout->p_chroma) ); } } @@ -1193,7 +1201,8 @@ static void RunThread( vout_thread_t *p_vout) if( !p_vout->b_direct ) { - module_Unneed( p_vout, p_vout->chroma.p_module ); + module_Unneed( p_vout->p_chroma, p_vout->p_chroma->p_module ); + p_vout->p_chroma = NULL; } vlc_mutex_lock( &p_vout->picture_lock ); @@ -1266,7 +1275,8 @@ static void EndThread( vout_thread_t *p_vout ) if( !p_vout->b_direct ) { - module_Unneed( p_vout, p_vout->chroma.p_module ); + module_Unneed( p_vout->p_chroma, p_vout->p_chroma->p_module ); + p_vout->p_chroma->p_module = NULL; } /* Destroy all remaining pictures */